From 1f65bde5838524b921e1bb339cbca3892c31ae55 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 28 Jan 2025 18:45:21 -0700 Subject: [PATCH 001/267] Move most ImGui-related files/code to an SohGui subfolder. (#4968) --- .../Enhancements/TimeDisplay/TimeDisplay.cpp | 2 +- soh/soh/Enhancements/audio/AudioEditor.cpp | 2 +- soh/soh/Enhancements/controls/InputViewer.cpp | 2 +- .../controls/SohInputEditorWindow.cpp | 2 +- .../cosmetics/CosmeticsEditor.cpp | 2 +- .../Enhancements/debugger/MessageViewer.cpp | 2 +- soh/soh/Enhancements/debugger/actorViewer.cpp | 2 +- soh/soh/Enhancements/debugger/colViewer.cpp | 2 +- .../Enhancements/debugger/debugSaveEditor.cpp | 8 +-- soh/soh/Enhancements/debugger/dlViewer.cpp | 6 +-- .../Enhancements/debugger/hookDebugger.cpp | 4 +- soh/soh/Enhancements/debugger/valueViewer.cpp | 2 +- soh/soh/Enhancements/gameplaystats.cpp | 2 +- soh/soh/Enhancements/presets.cpp | 2 +- .../Enhancements/randomizer/Plandomizer.cpp | 4 +- .../Enhancements/randomizer/hook_handlers.cpp | 2 +- soh/soh/Enhancements/randomizer/option.cpp | 2 +- soh/soh/Enhancements/randomizer/option.h | 2 +- .../Enhancements/randomizer/randomizer.cpp | 4 +- .../randomizer/randomizer_check_tracker.cpp | 2 +- .../randomizer_entrance_tracker.cpp | 2 +- .../randomizer/randomizer_item_tracker.cpp | 2 +- .../resolution-editor/ResolutionEditor.cpp | 2 +- .../Enhancements/timesplits/TimeSplits.cpp | 2 +- soh/soh/OTRGlobals.cpp | 4 +- soh/soh/SaveManager.cpp | 2 +- soh/soh/SohGui.hpp | 50 ------------------ soh/soh/{ => SohGui}/ImGuiUtils.cpp | 0 soh/soh/{ => SohGui}/ImGuiUtils.h | 2 +- soh/soh/{ => SohGui}/SohGui.cpp | 10 ++-- soh/soh/SohGui/SohGui.hpp | 50 ++++++++++++++++++ soh/soh/{ => SohGui}/SohMenuBar.cpp | 52 +++++++++---------- soh/soh/{ => SohGui}/SohMenuBar.h | 0 soh/soh/{ => SohGui}/SohModals.cpp | 2 +- soh/soh/{ => SohGui}/SohModals.h | 0 soh/soh/{ => SohGui}/UIWidgets.cpp | 0 soh/soh/{ => SohGui}/UIWidgets.hpp | 0 37 files changed, 118 insertions(+), 118 deletions(-) delete mode 100644 soh/soh/SohGui.hpp rename soh/soh/{ => SohGui}/ImGuiUtils.cpp (100%) rename soh/soh/{ => SohGui}/ImGuiUtils.h (97%) rename soh/soh/{ => SohGui}/SohGui.cpp (97%) create mode 100644 soh/soh/SohGui/SohGui.hpp rename soh/soh/{ => SohGui}/SohMenuBar.cpp (99%) rename soh/soh/{ => SohGui}/SohMenuBar.h (100%) rename soh/soh/{ => SohGui}/SohModals.cpp (98%) rename soh/soh/{ => SohGui}/SohModals.h (100%) rename soh/soh/{ => SohGui}/UIWidgets.cpp (100%) rename soh/soh/{ => SohGui}/UIWidgets.hpp (100%) diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index 09f037570..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" 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/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 7967c3d15..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__ diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 45e097df7..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" diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 3c10772f3..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" 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 5fedd54be..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 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/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/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index ddff16c7d..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 diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp index b72143247..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) { diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index 2a086d377..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" diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index cc9708789..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" diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index 84743cae6..5cf16ac26 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -2,7 +2,7 @@ #include "libultraship/bridge.h" #include #include -#include "soh/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" namespace Rando { Option Option::Bool(RandomizerSettingKey key_, std::string name_, std::vector options_, diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index a8ffe3511..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 diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 477c2f0da..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" diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index b6ef5752c..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" diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 0d7b1a731..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 diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 0b96c4ab2..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 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/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index b17f95b82..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" diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 9bc33593d..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" diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 188006181..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 diff --git a/soh/soh/SohGui.hpp b/soh/soh/SohGui.hpp deleted file mode 100644 index 526db64bf..000000000 --- a/soh/soh/SohGui.hpp +++ /dev/null @@ -1,50 +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 "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/ImGuiUtils.cpp b/soh/soh/SohGui/ImGuiUtils.cpp similarity index 100% rename from soh/soh/ImGuiUtils.cpp rename to soh/soh/SohGui/ImGuiUtils.cpp 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 97% rename from soh/soh/SohGui.cpp rename to soh/soh/SohGui/SohGui.cpp index f91f263c9..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" 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 99% rename from soh/soh/SohMenuBar.cpp rename to soh/soh/SohGui/SohMenuBar.cpp index 250106530..e5e52c71d 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -6,45 +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 "AboutWindow.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 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 100% rename from soh/soh/UIWidgets.cpp rename to soh/soh/SohGui/UIWidgets.cpp 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 From 7df9641297e8ac5965ed9bfd62dc98fae38d6a09 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 29 Jan 2025 10:12:42 -0500 Subject: [PATCH 002/267] Exclude locations fix (#4969) * Properly check for Excluded Location option. * Remove GetOption overloads, weren't working anyway --- soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp | 2 +- soh/soh/Enhancements/randomizer/context.cpp | 8 -------- soh/soh/Enhancements/randomizer/context.h | 2 -- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index a21dacaaf..d78f1ef90 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -159,7 +159,7 @@ static void WriteExcludedLocations() { for (size_t i = 1; i < Rando::Settings::GetInstance()->GetExcludeLocationsOptions().size(); i++) { for (const auto& location : Rando::Settings::GetInstance()->GetExcludeLocationsOptions()[i]) { - if (ctx->GetOption(location->GetKey()).Get() == RO_LOCATION_INCLUDE) { + if (ctx->GetLocationOption(static_cast(location->GetKey())).Get() == RO_LOCATION_INCLUDE) { continue; } diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 3e846c4b7..79a60cc70 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -438,14 +438,6 @@ OptionValue& Context::GetOption(const RandomizerSettingKey key) { return mOptions[key]; } -OptionValue& Context::GetOption(const RandomizerTrick key) { - return mTrickOptions[key]; -} - -OptionValue& Context::GetOption(const RandomizerCheck key) { - return itemLocationTable[key].GetExcludedOption(); -} - OptionValue& Context::GetTrickOption(const RandomizerTrick key) { return mTrickOptions[key]; } diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index 0fbb18748..cc71609eb 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -91,8 +91,6 @@ class Context { TrialInfo* GetTrial(TrialKey key) const; static Sprite* GetSeedTexture(uint8_t index); OptionValue& GetOption(RandomizerSettingKey key); - OptionValue& GetOption(RandomizerTrick key); - OptionValue& GetOption(RandomizerCheck key); OptionValue& GetTrickOption(RandomizerTrick key); OptionValue& GetLocationOption(RandomizerCheck key); From 1744f1fc1842cc1a440138f88849e0fde6048f8a Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 30 Jan 2025 02:37:17 -0700 Subject: [PATCH 003/267] Set Item Tracker Total Checks window to only scale text if Item Tracker window type is Floating. (#4963) Increase default width to account for window type title text. --- .../Enhancements/randomizer/randomizer_item_tracker.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index eb0b1aafd..b2343b000 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -921,7 +921,11 @@ void DrawTotalChecks() { uint16_t totalChecksGotten = CheckTracker::GetTotalChecksGotten(); ImGui::BeginGroup(); - ImGui::SetWindowFontScale(2.5); + if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) { + ImGui::SetWindowFontScale(2.5); + } else { + ImGui::SetWindowFontScale(1); + } ImGui::Text("Checks: %d/%d", totalChecksGotten, totalChecks); ImGui::EndGroup(); } @@ -1340,7 +1344,7 @@ void ItemTrackerWindow::DrawElement() { if (CVarGetInteger("gTrackers.ItemTracker.TotalChecks.DisplayType", SECTION_DISPLAY_MINIMAL_HIDDEN) == SECTION_DISPLAY_MINIMAL_SEPARATE) { - ImGui::SetNextWindowSize(ImVec2(400, 300), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(450, 300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Total Checks"); DrawTotalChecks(); EndFloatingWindows(); From 133825c1cde0400a0dba5108c2145682aa73c89c Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:41:03 -0800 Subject: [PATCH 004/267] update to latest LUS main (#4976) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index 5341b0172..e641b3777 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 5341b017254a186da3ffe6d681d4e293769f23f4 +Subproject commit e641b3777cbefb18a9cf4b95353d650b3a2abf65 From b62808dc2dae5e975eec6eb892dae41071a4e641 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sat, 1 Feb 2025 19:38:22 -0700 Subject: [PATCH 005/267] Prevent adding Gerudo Fortress Keyring when Keyrings are set to off. (#4981) --- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index ff41c204b..a2699cb65 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1153,7 +1153,7 @@ void GenerateItemPool() { ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); } else { //Only add key ring if 4 Fortress keys necessary - if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS)) { + if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_KEYRINGS)) { AddItemToMainPool(RG_GERUDO_FORTRESS_KEY_RING); //Add junk to make up for missing keys for (uint8_t i = 0; i < 3; i++) { @@ -1164,7 +1164,7 @@ void GenerateItemPool() { } } if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL)) { + if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && ctx->GetOption(RSK_KEYRINGS) ) { AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_KEY_RING); } else { AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_SMALL_KEY); From f4604673e02f223fbc5af5677d17a36eb44d9efd Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:11:56 -0800 Subject: [PATCH 006/267] clean up/fix mq dungeon and required trial parsing logic (#4979) --- soh/soh/Enhancements/randomizer/dungeon.cpp | 17 ++++++++--------- soh/soh/Enhancements/randomizer/trial.cpp | 14 +++++++------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index d83bc9251..423c8666e 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -1419,17 +1419,16 @@ std::array Dungeons::GetDungeonList() { size_t Dungeons::GetDungeonListSize() const { return dungeonList.size(); } + void Dungeons::ParseJson(nlohmann::json spoilerFileJson) { nlohmann::json mqDungeonsJson = spoilerFileJson["masterQuestDungeons"]; - for (auto it = mqDungeonsJson.begin(); it != mqDungeonsJson.end(); ++it) { - std::string dungeonName = it.value().get(); - for (auto& dungeon : dungeonList) { - if (dungeon.GetName() == dungeonName) { - dungeon.SetMQ(); - } else { - dungeon.ClearMQ(); - } + + for (auto& dungeon : dungeonList) { + dungeon.ClearMQ(); + + if (std::find(mqDungeonsJson.begin(), mqDungeonsJson.end(), dungeon.GetName()) != mqDungeonsJson.end()) { + dungeon.SetMQ(); } } } -} // namespace Rando \ No newline at end of file +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/trial.cpp b/soh/soh/Enhancements/randomizer/trial.cpp index 1110d37d8..a9b1f3fb3 100644 --- a/soh/soh/Enhancements/randomizer/trial.cpp +++ b/soh/soh/Enhancements/randomizer/trial.cpp @@ -71,13 +71,13 @@ size_t Trials::GetTrialListSize() const { void Trials::ParseJson(nlohmann::json spoilerFileJson) { nlohmann::json trialsJson = spoilerFileJson["requiredTrials"]; - for (auto it = trialsJson.begin(); it != trialsJson.end(); ++it) { - std::string trialName = it.value().get(); - for (auto& trial : mTrials) { - if (trial.GetName() == trialName) { + + for (auto& trial : mTrials) { + trial.SetAsSkipped(); + + for (auto nameInLang : trial.GetName().GetAllMessages()) { + if (std::find(trialsJson.begin(), trialsJson.end(), nameInLang) != trialsJson.end()) { trial.SetAsRequired(); - } else { - trial.SetAsSkipped(); } } } @@ -91,4 +91,4 @@ std::unordered_map Trials::GetAllTrialHintHeys( return output; } -} // namespace Rando \ No newline at end of file +} // namespace Rando From ac9b8c2e87db604e826eb22609ea41989c10fc73 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 1 Feb 2025 23:33:04 -0800 Subject: [PATCH 007/267] better soft reset (#4984) --- soh/include/variables.h | 1 + soh/soh/Enhancements/ResetGameplayFrames.cpp | 30 ++++++++++++++++++++ soh/soh/Enhancements/debugconsole.cpp | 9 +++--- soh/src/code/game.c | 4 +++ soh/src/code/graph.c | 19 ++++++------- soh/src/code/z_play.c | 5 ---- 6 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 soh/soh/Enhancements/ResetGameplayFrames.cpp diff --git a/soh/include/variables.h b/soh/include/variables.h index f5486f761..e3408eef6 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -247,6 +247,7 @@ extern "C" extern GfxPool gGfxPools[2]; // 0x24820 bytes extern u8* gAudioHeap; extern u8* gSystemHeap; + extern GameState* gGameState; #ifdef __cplusplus }; diff --git a/soh/soh/Enhancements/ResetGameplayFrames.cpp b/soh/soh/Enhancements/ResetGameplayFrames.cpp new file mode 100644 index 000000000..3b234dbe5 --- /dev/null +++ b/soh/soh/Enhancements/ResetGameplayFrames.cpp @@ -0,0 +1,30 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "functions.h" +#include "variables.h" +} + +void ResetGameplayFramesOnSoftReset() { + PlayState* play = (PlayState*)gGameState; + + if (gGameState->init == TitleSetup_Init) { + play->gameplayFrames = 0; + } +} + +void ResetGameplayFramesOnTitleScreenExit() { + PlayState* play = (PlayState*)gGameState; + + if (gSaveContext.fileNum == 0xFF) { + play->gameplayFrames = 0; + } +} + +void RegisterResetGameplayFrames() { + COND_HOOK(OnPlayDestroy, true, ResetGameplayFramesOnSoftReset); + COND_HOOK(OnPlayDestroy, true, ResetGameplayFramesOnTitleScreenExit); +} + +static RegisterShipInitFunc initFunc(RegisterResetGameplayFrames); diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 9ef0fe2ab..7037f9b0a 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -204,14 +204,13 @@ static bool SetPosHandler(std::shared_ptr Console, const std::vec } static bool ResetHandler(std::shared_ptr Console, std::vector args, std::string* output) { - if (gPlayState == nullptr) { - ERROR_MESSAGE("PlayState == nullptr"); + if (gGameState == nullptr) { + ERROR_MESSAGE("gGameState == nullptr"); return 1; } - gPlayState->gameplayFrames = 0; - SET_NEXT_GAMESTATE(&gPlayState->state, TitleSetup_Init, GameState); - gPlayState->state.running = false; + SET_NEXT_GAMESTATE(gGameState, TitleSetup_Init, GameState); + gGameState->running = false; GameInteractor::Instance->ExecuteHooks(gSaveContext.fileNum); return 0; } diff --git a/soh/src/code/game.c b/soh/src/code/game.c index d7524009b..7e1db9c17 100644 --- a/soh/src/code/game.c +++ b/soh/src/code/game.c @@ -14,6 +14,10 @@ ViMode sViMode; FaultClient sGameFaultClient; u16 sLastButtonPressed; +// #region SOH [General] Making gGameState available +GameState* gGameState; +// #endregion + // Forward declared, because this in a C++ header. int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, uint8_t resize); void gfx_texture_cache_clear(); diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index f691c2619..c55417d93 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -18,7 +18,6 @@ // SOH [Port] Game State management for our render loop static struct RunFrameContext { GraphicsContext gfxCtx; - GameState* gameState; GameStateOverlay* nextOvl; GameStateOverlay* ovl; int state; @@ -487,28 +486,28 @@ static void RunFrame() size = runFrameContext.ovl->instanceSize; osSyncPrintf("クラスサイズ=%dバイト\n", size); // "Class size = %d bytes" - runFrameContext.gameState = SYSTEM_ARENA_MALLOC_DEBUG(size); + gGameState = SYSTEM_ARENA_MALLOC_DEBUG(size); - if (!runFrameContext.gameState) + if (!gGameState) { osSyncPrintf("確保失敗\n"); // "Failure to secure" snprintf(faultMsg, sizeof(faultMsg), "CLASS SIZE= %d bytes", size); Fault_AddHungupAndCrashImpl("GAME CLASS MALLOC FAILED", faultMsg); } - GameState_Init(runFrameContext.gameState, runFrameContext.ovl->init, &runFrameContext.gfxCtx); + GameState_Init(gGameState, runFrameContext.ovl->init, &runFrameContext.gfxCtx); // Setup the normal skybox once before entering any game states to avoid the 0xabababab crash. // The crash is due to certain skyboxes not loading all the data they need from Skybox_Setup. if (!hasSetupSkybox) { - PlayState* play = (PlayState*)runFrameContext.gameState; + PlayState* play = (PlayState*)gGameState; Skybox_Setup(play, &play->skyboxCtx, SKYBOX_NORMAL_SKY); hasSetupSkybox = true; } uint64_t freq = GetFrequency(); - while (GameState_IsRunning(runFrameContext.gameState)) + while (GameState_IsRunning(gGameState)) { //uint64_t ticksA, ticksB; //ticksA = GetPerfCounter(); @@ -517,7 +516,7 @@ static void RunFrame() PadMgr_ThreadEntry(&gPadMgr); - Graph_Update(&runFrameContext.gfxCtx, runFrameContext.gameState); + Graph_Update(&runFrameContext.gfxCtx, gGameState); //ticksB = GetPerfCounter(); if (GfxDebuggerIsDebuggingRequested()) { @@ -535,9 +534,9 @@ static void RunFrame() nextFrame:; } - runFrameContext.nextOvl = Graph_GetNextGameState(runFrameContext.gameState); - GameState_Destroy(runFrameContext.gameState); - SYSTEM_ARENA_FREE_DEBUG(runFrameContext.gameState); + runFrameContext.nextOvl = Graph_GetNextGameState(gGameState); + GameState_Destroy(gGameState); + SYSTEM_ARENA_FREE_DEBUG(gGameState); Overlay_FreeGameState(runFrameContext.ovl); } Graph_Destroy(&runFrameContext.gfxCtx); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 2b4743417..8d35a33c4 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -205,11 +205,6 @@ void Play_Destroy(GameState* thisx) { GameInteractor_ExecuteOnPlayDestroy(); - // Only initialize the frame counter when exiting the title screen - if (gSaveContext.fileNum == 0xFF) { - play->gameplayFrames = 0; - } - play->state.gfxCtx->callback = NULL; play->state.gfxCtx->callbackParam = 0; From 33d7b173fa9c3a30b1ef20136fcc3de31ade35d3 Mon Sep 17 00:00:00 2001 From: Xeokn <74164454+Xeokn@users.noreply.github.com> Date: Mon, 3 Feb 2025 08:00:59 +1000 Subject: [PATCH 008/267] Additional Sail commands (#4970) * Additional Sail Commands. Adds "SpawnEnemyWithOffset" and "SpawnActor" to Sail Functions. * Small Corrections Indentation my beloved --- .../game-interactor/GameInteractionEffect.cpp | 24 +++++++++++++++++++ .../game-interactor/GameInteractionEffect.h | 8 +++++++ soh/soh/Network/Sail/Sail.cpp | 14 +++++++++++ 3 files changed, 46 insertions(+) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp index a0469d0c3..913496159 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp @@ -640,4 +640,28 @@ namespace GameInteractionEffect { void SlipperyFloor::_Remove() { GameInteractor::State::SlipperyFloorActive = 0; } + + // MARK: - SpawnEnemyWithOffset + GameInteractionEffectQueryResult SpawnEnemyWithOffset::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); + } + + void SpawnEnemyWithOffset::_Apply() { + GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); + } + + // MARK: - SpawnActor + GameInteractionEffectQueryResult SpawnActor::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); + } + + void SpawnActor::_Apply() { + GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); + } } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h index 5e28024b6..2a29022d5 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h @@ -262,6 +262,14 @@ namespace GameInteractionEffect { void _Apply() override; void _Remove() override; }; + class SpawnEnemyWithOffset: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + }; + class SpawnActor: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + }; } #endif /* __cplusplus */ diff --git a/soh/soh/Network/Sail/Sail.cpp b/soh/soh/Network/Sail/Sail.cpp index 1c27e1d72..f9ae7b313 100644 --- a/soh/soh/Network/Sail/Sail.cpp +++ b/soh/soh/Network/Sail/Sail.cpp @@ -320,6 +320,20 @@ GameInteractionEffectBase* Sail::EffectFromJson(nlohmann::json payload) { return new GameInteractionEffect::PlayerInvincibility(); } else if (name == "SlipperyFloor") { return new GameInteractionEffect::SlipperyFloor(); + } else if (name == "SpawnEnemyWithOffset") { + auto effect = new GameInteractionEffect::SpawnEnemyWithOffset(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + } + return effect; + } else if (name == "SpawnActor") { + auto effect = new GameInteractionEffect::SpawnActor(); + if (payload.contains("parameters")) { + effect->parameters[0] = payload["parameters"][0].get(); + effect->parameters[1] = payload["parameters"][1].get(); + } + return effect; } else { SPDLOG_INFO("[Sail] Unknown effect name: {}", name); return nullptr; From e5ddcce7f25b64bfdba385c5a282c83332d647e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Mon, 3 Feb 2025 09:46:59 +0000 Subject: [PATCH 009/267] use CanKillEnemy more (#4867) * use CanKillEnemy more reviewed instances of RG_KOKIRI_SWORD in logic * kokiri does not damage spikes * confirmed hammer works vs dodongos * 3 --- .../location_access/dungeons/dodongos_cavern.cpp | 8 ++++---- .../location_access/dungeons/fire_temple.cpp | 2 +- .../location_access/dungeons/forest_temple.cpp | 8 ++++---- .../dungeons/gerudo_training_ground.cpp | 15 ++++++--------- .../location_access/dungeons/spirit_temple.cpp | 14 +++++++------- .../location_access/dungeons/water_temple.cpp | 12 ++++++------ soh/soh/Enhancements/randomizer/logic.cpp | 5 ++++- soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 + 8 files changed, 33 insertions(+), 32 deletions(-) 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 189d1c867..d6798523b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -88,8 +88,8 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, true), }, { //Exits - Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives();});}), - Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives();});}), + Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), + Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), }); areaTable[RR_DODONGOS_CAVERN_DODONGO_ROOM] = Region("Dodongos Cavern Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { @@ -186,8 +186,8 @@ void RegionTable_Init_DodongosCavern() { }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives();});}), - Entrance(RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives();});}), + Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), + Entrance(RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), }); areaTable[RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Region("Dodongos Cavern Second Slingshot Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 65efe4cfe..429d84667 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -43,7 +43,7 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Region("Fire Temple Loop Enemies", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 8) || !logic->IsKeysanity;}), - Entrance(RR_FIRE_TEMPLE_LOOP_TILES, []{return Here(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER);});}), + Entrance(RR_FIRE_TEMPLE_LOOP_TILES, []{return Here(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return logic->CanKillEnemy(RE_TORCH_SLUG) && logic->CanKillEnemy(RE_FIRE_KEESE);});}), }); areaTable[RR_FIRE_TEMPLE_LOOP_TILES] = Region("Fire Temple Loop Tiles", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 241a82064..87f738b90 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -66,7 +66,7 @@ void RegionTable_Init_ForestTemple() { EventAccess(&logic->FairyPot, []{return true;}), }, { //Locations - LOCATION(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)), LOCATION(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, logic->CanBreakPots()), }, { @@ -214,15 +214,15 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_BOW_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_FOREST_TEMPLE_BOW_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3)), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, logic->CanBreakPots()), }, { //Exits - Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER);}), - Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER);}), + Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), + Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), }); areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Region("Forest Temple Blue Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index b2e09a8c2..f0b9de5c3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -19,16 +19,16 @@ void RegionTable_Init_GerudoTrainingGround() { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)), - LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->HasExplosives() && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))), + LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true)), + LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->CanKillEnemy(RE_BEAMOS) && logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true)), LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, true), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return true;}), - Entrance(RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM, []{return (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && (logic->CanUse(RG_HOOKSHOT) || ctx->GetTrickOption(RT_GTG_WITHOUT_HOOKSHOT));}), - Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->HasExplosives();});}), + Entrance(RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true) && (logic->CanUse(RG_HOOKSHOT) || ctx->GetTrickOption(RT_GTG_WITHOUT_HOOKSHOT));}), + Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return logic->CanKillEnemy(RE_BEAMOS) && logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true);});}), Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE, []{return true;}), }); @@ -92,7 +92,7 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM] = Region("Gerudo Training Ground Heavy Block Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, logic->CanJumpslashExceptHammer()), + LOCATION(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, logic->CanKillEnemy(RE_WOLFOS, ED_CLOSE, true, 4, true)), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER, []{return (ctx->GetTrickOption(RT_LENS_GTG) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->CanUse(RG_HOVER_BOOTS)));}), @@ -230,10 +230,7 @@ void RegionTable_Init_GerudoTrainingGround() { //Events EventAccess(&logic->MQGTGRightSideSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_HOVER_BOOTS);}), - }, { - //Locations - LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, logic->IsAdult && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))), - }, { + }, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS, []{return logic->CanUse(RG_FIRE_ARROWS);}), //the fire bubble here is a jerk if you are aiming for the nearest hook platform, you have to aim to the right hand side with hook to dodge it 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 8b8b4d465..3d8e26cd6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -31,13 +31,13 @@ void RegionTable_Init_SpiritTemple() { EventAccess(&logic->NutCrate, []{return true;}), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index ab206f6ef..318a5eb64 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -54,10 +54,10 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Region("Water Temple Map Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MAP_CHEST, (logic->CanUse(RG_MAGIC_SINGLE) && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MAP_CHEST, logic->CanKillEnemy(RE_SPIKE, ED_CLOSE, true, 3)), }, { //Exits - Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return (logic->CanUse(RG_MAGIC_SINGLE) && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return logic->CanKillEnemy(RE_SPIKE, ED_CLOSE, true, 3);}), }); areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Region("Water Temple Cracked Wall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { @@ -70,10 +70,10 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Region("Water Temple Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_TORCHES_CHEST, (logic->CanUse(RG_MAGIC_SINGLE) && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_TORCHES_CHEST, logic->CanKillEnemy(RE_SHELL_BLADE, ED_CLOSE, true, 3)), }, { //Exits - Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return (logic->CanUse(RG_MAGIC_SINGLE) && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return logic->CanKillEnemy(RE_SHELL_BLADE, ED_CLOSE, true, 3);}), }); areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Region("Water Temple North Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -238,8 +238,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_DARK_LINK_ROOM] = Region("Water Temple Dark Link Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, []{return logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD);}), - Entrance(RR_WATER_TEMPLE_LONGSHOT_ROOM, []{return logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD);}), + Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, []{return logic->CanKillEnemy(RE_DARK_LINK);}), + Entrance(RR_WATER_TEMPLE_LONGSHOT_ROOM, []{return logic->CanKillEnemy(RE_DARK_LINK);}), }); areaTable[RR_WATER_TEMPLE_LONGSHOT_ROOM] = Region("Water Temple Longshot Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 1ea19d3ad..fa9c8d8e5 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -527,7 +527,7 @@ namespace Rando { } return killed; case RE_DODONGO: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); case RE_LIZALFOS: return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); case RE_KEESE: @@ -637,6 +637,8 @@ namespace Rando { return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_BOW); case RE_FREEZARD: return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); + case RE_SHELL_BLADE: + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); case RE_SPIKE: return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); case RE_STINGER: @@ -794,6 +796,7 @@ namespace Rando { case RE_ARMOS: case RE_GREEN_BUBBLE: case RE_FREEZARD: + case RE_SHELL_BLADE: case RE_SPIKE: case RE_BIG_OCTO: case RE_GIBDO: diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 66128d50f..0561ce54d 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -5724,6 +5724,7 @@ typedef enum { RE_DINOLFOS, RE_TORCH_SLUG, RE_FREEZARD, + RE_SHELL_BLADE, RE_SPIKE, RE_WHITE_WOLFOS, RE_STINGER, From e7e02735b09ab2cfbd678e241b77d13461131dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Mon, 3 Feb 2025 09:57:35 +0000 Subject: [PATCH 010/267] rando: vanilla dungeon rewards (#4836) * rando: vanilla dungeon rewards * gift from rauru is dungeon location, not pocket * missing apostrophe in preset description * neither pocket nor gift should be listed in dungeonRewardLocations --- soh/soh/Enhancements/presets.h | 4 +-- .../Enhancements/randomizer/3drando/fill.cpp | 35 +++++++------------ .../Enhancements/randomizer/3drando/hints.cpp | 18 ++++++---- soh/soh/Enhancements/randomizer/context.cpp | 3 ++ .../Enhancements/randomizer/location_list.cpp | 4 +-- .../randomizer/option_descriptions.cpp | 1 + .../Enhancements/randomizer/randomizerTypes.h | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 2 +- 8 files changed, 33 insertions(+), 35 deletions(-) diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 31df92831..b7b7100b9 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -1403,7 +1403,7 @@ const std::map presetTypes = { "Spock Race", "Race preset used for the official Ship of Harkinian race on June 3rd 2023. The following settings are notable:\n" \ "- Rainbow Bridge is set to Greg\n" \ - "- Ganons Boss Key is 5 dungeon rewards\n" \ + "- Ganon's Boss Key is 5 dungeon rewards\n" \ "- Shopsanity and Scrubsanity enabled\n" \ "- All locations reachable is off\n", \ spockRacePresetEntries, @@ -1413,7 +1413,7 @@ const std::map presetTypes = { "No Logic Race preset used for official Ship of Harkinian No Logic races. The following settings are " "notable:\n" "- Rainbow Bridge is set to Greg\n" - "- Ganons Boss Key is 5 dungeon rewards\n" + "- Ganon's Boss Key is 5 dungeon rewards\n" "- Shopsanity and Scrubsanity enabled\n" "- All locations reachable is off\n", spockRaceNoLogicPresetEntries, diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 234bd6a8e..9c2bff044 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -900,7 +900,6 @@ static void AssumedFill(const std::vector& items, const std::vect //setting, or randomize one dungeon reward to Link's Pocket if that setting is on static void RandomizeDungeonRewards() { auto ctx = Rando::Context::GetInstance(); - std::array rDungeonRewardOverrides{}; //quest item bit mask of each stone/medallion for the savefile // static constexpr std::array bitMaskTable = { // 0x00040000, //Kokiri Emerald @@ -916,34 +915,24 @@ static void RandomizeDungeonRewards() { int baseOffset = Rando::StaticData::RetrieveItem(RG_KOKIRI_EMERALD).GetItemID(); //End of Dungeons includes Link's Pocket - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { //get stones and medallions std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) {return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD;}); - // If there are less than 9 dungeon rewards, prioritize the actual dungeons - // for placement instead of Link's Pocket - if (rewards.size() < 9) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - } - - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { //Place dungeon rewards in vanilla locations + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { // Place dungeon rewards in vanilla locations for (RandomizerCheck loc : Rando::StaticData::dungeonRewardLocations) { ctx->GetItemLocation(loc)->PlaceVanillaItem(); } - } else { //Randomize dungeon rewards with assumed fill - AssumedFill(rewards, Rando::StaticData::dungeonRewardLocations); - } - - for (size_t i = 0; i < Rando::StaticData::dungeonRewardLocations.size(); i++) { - const auto index = ctx->GetItemLocation(Rando::StaticData::dungeonRewardLocations[i])->GetPlacedItem().GetItemID() - baseOffset; - rDungeonRewardOverrides[i] = index; - - //set the player's dungeon reward on file creation instead of pushing it to them at the start. - //This is done mainly because players are already familiar with seeing their dungeon reward - //before opening up their file - // if (i == Rando::StaticData::dungeonRewardLocations.size()-1) { - // LinksPocketRewardBitMask = bitMaskTable[index]; - // } + ctx->GetItemLocation(RC_GIFT_FROM_RAURU)->PlaceVanillaItem(); + } else { // Randomize dungeon rewards with assumed fill + std::vector rewardLocations(Rando::StaticData::dungeonRewardLocations); + // If there are less than 9 dungeon rewards, prioritize actual dungeons for placement + if (rewards.size() < 9) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + } else { + rewardLocations.push_back(RC_LINKS_POCKET); + } + AssumedFill(rewards, rewardLocations); } } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_DUNGEON_REWARD)) { //get 1 stone/medallion diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 634c2ca56..b9e9f4688 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -698,8 +698,8 @@ void CreateChildAltarHint() { if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled()){ std::vector stoneLocs = {}; if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - //force marking the rewards as hinted if they are at the end of dungeons as they can be inffered - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)){ + //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {}); } else { stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {RC_ALTAR_HINT_CHILD}); @@ -707,7 +707,9 @@ void CreateChildAltarHint() { } std::vector stoneAreas = {}; for (auto loc : stoneLocs){ - stoneAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + if (loc != RC_UNKNOWN_CHECK) { + stoneAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } } ctx->AddHint(RH_ALTAR_CHILD, Hint(RH_ALTAR_CHILD, HINT_TYPE_ALTAR_CHILD, {}, stoneLocs, stoneAreas)); } @@ -718,9 +720,9 @@ void CreateAdultAltarHint() { if (!ctx->GetHint(RH_ALTAR_ADULT)->IsEnabled()){ std::vector medallionLocs = {}; if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - //force marking the rewards as hinted if they are at the end of dungeons as they can be inffered - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)){ - medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, + //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, {}); } else { medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, @@ -729,7 +731,9 @@ void CreateAdultAltarHint() { } std::vector medallionAreas = {}; for (auto loc : medallionLocs){ - medallionAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + if (loc != RC_UNKNOWN_CHECK) { + medallionAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } } ctx->AddHint(RH_ALTAR_ADULT, Hint(RH_ALTAR_ADULT, HINT_TYPE_ALTAR_ADULT, {}, medallionLocs, medallionAreas)); } diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 79a60cc70..cd4914aaf 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -214,6 +214,9 @@ void Context::ItemReset() { for (const RandomizerCheck il : StaticData::dungeonRewardLocations) { GetItemLocation(il)->ResetVariables(); } + + GetItemLocation(RC_GIFT_FROM_RAURU)->ResetVariables(); + GetItemLocation(RC_LINKS_POCKET)->ResetVariables(); } void Context::LocationReset() { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 54c1d8f81..1fe52b897 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -8,8 +8,8 @@ std::multimap, RandomizerCheck> Rando::StaticData::Che std::vector Rando::StaticData::dungeonRewardLocations = { // Bosses - RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, RC_PHANTOM_GANON, RC_VOLVAGIA, - RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, RC_LINKS_POCKET, + RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, + RC_PHANTOM_GANON, RC_VOLVAGIA, RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, }; using namespace Rando; diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 8abdd2634..a3184765f 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -451,6 +451,7 @@ void Settings::CreateOptionDescriptions() { "Shuffle fairy locations."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of Spiritual Stones and medallions.\n" + "Vanilla - Spiritual Stones and medallions will be given from their respective boss.\n" "\n" "End of dungeons - Spiritual Stones and medallions will be given as rewards " "for beating major dungeons. Link will always start with one stone or medallion.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 0561ce54d..dabfedac7 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -5388,6 +5388,7 @@ typedef enum { //Dungeon reward settings typedef enum { + RO_DUNGEON_REWARDS_VANILLA, RO_DUNGEON_REWARDS_END_OF_DUNGEON, RO_DUNGEON_REWARDS_ANY_DUNGEON, RO_DUNGEON_REWARDS_OVERWORLD, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 2ca325635..cf1acdd7f 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -170,7 +170,7 @@ void Settings::CreateOptions() { 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_SHUFFLE_DUNGEON_REWARDS, "Shuffle Dungeon Rewards", {"Vanilla", "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); From c7f335f23c3af94eea5a7af6602481dc088bebf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Mon, 3 Feb 2025 10:08:58 +0000 Subject: [PATCH 011/267] Prefer EVENTCHKINF constants to hex (#4965) Also remove unnecessary const qualifiers that flood warnings --- .../Enhancements/randomizer/location_list.cpp | 118 +++++++++--------- soh/soh/Enhancements/randomizer/option.cpp | 6 +- soh/soh/Enhancements/randomizer/option.h | 6 +- 3 files changed, 65 insertions(+), 65 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 1fe52b897..d35b54a73 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -177,8 +177,8 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_HF_SOUTHEAST_GROTTO_CHEST] = Location::Chest(RC_HF_SOUTHEAST_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22978, 0x02, "Southeast Grotto Chest", RHT_HF_SOUTHEAST_GROTTO_CHEST, RG_RED_RUPEE); locationTable[RC_HF_OPEN_GROTTO_CHEST] = Location::Chest(RC_HF_OPEN_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22947, 0x03, "Open Grotto Chest", RHT_HF_OPEN_GROTTO_CHEST, RG_BLUE_RUPEE); locationTable[RC_HF_NEAR_MARKET_GROTTO_CHEST] = Location::Chest(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_BOX, SCENE_GROTTOS, 22944, 0x00, "Near Market Grotto Chest", RHT_HF_NEAR_MARKET_GROTTO_CHEST, RG_BLUE_RUPEE); - locationTable[RC_HF_OCARINA_OF_TIME_ITEM] = Location::Base(RC_HF_OCARINA_OF_TIME_ITEM, RCQUEST_BOTH, RCTYPE_OCARINA, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Ocarina of Time Item", RHT_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, SpoilerCollectionCheck::EventChkInf(0x43)); - locationTable[RC_HF_TEKTITE_GROTTO_FREESTANDING_POH] = Location::Collectable(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_ITEM00, SCENE_GROTTOS, 262, 0x01, "Tektite Grotto Freestanding PoH", RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_HF_OCARINA_OF_TIME_ITEM] = Location::Base(RC_HF_OCARINA_OF_TIME_ITEM, RCQUEST_BOTH, RCTYPE_OCARINA, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Ocarina of Time Item", RHT_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_OBTAINED_OCARINA_OF_TIME)); + locationTable[RC_HF_TEKTITE_GROTTO_FREESTANDING_POH] = Location::Collectable(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, ACTOR_EN_ITEM00, SCENE_GROTTOS, 262, 0x01, "Tektite Grotto Freestanding PoH", RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_HF_DEKU_SCRUB_GROTTO] = Location::Base(RC_HF_DEKU_SCRUB_GROTTO, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_HYRULE_FIELD, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x02, 0xE6), "Deku Scrub Grotto", RHT_HF_DEKU_SCRUB_GROTTO, RG_PIECE_OF_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO), true, 10); // Lake Hylia locationTable[RC_LH_CHILD_FISHING] = Location::Base(RC_LH_CHILD_FISHING, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, "Child Fishing", RHT_LH_CHILD_FISHING, RG_PIECE_OF_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_CHILD_FISHING), true); @@ -186,34 +186,34 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_LH_HYRULE_LOACH] = Location::Base(RC_LH_HYRULE_LOACH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_FISHING_POND, 0x00, "Hyrule Loach Reward", RHT_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_CAUGHT_LOACH)); locationTable[RC_LH_LAB_DIVE] = Location::Base(RC_LH_LAB_DIVE, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, "Lab Dive", RHT_LH_LAB_DIVE, RG_PIECE_OF_HEART, SpoilerCollectionCheck::ItemGetInf(16), true); locationTable[RC_LH_TRADE_FROG] = Location::Base(RC_LH_TRADE_FROG, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, ACTOR_ID_MAX, SCENE_LAKESIDE_LABORATORY, 0x00, "Lab Trade Eyeball Frog", RHT_LH_TRADE_FROG, RG_EYEDROPS, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ADULT_TRADES_LH_TRADE_FROG), true); - locationTable[RC_LH_UNDERWATER_ITEM] = Location::Base(RC_LH_UNDERWATER_ITEM, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, "Underwater Item", RHT_LH_UNDERWATER_ITEM, RG_RUTOS_LETTER, SpoilerCollectionCheck::EventChkInf(0x31), true); + locationTable[RC_LH_UNDERWATER_ITEM] = Location::Base(RC_LH_UNDERWATER_ITEM, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, "Underwater Item", RHT_LH_UNDERWATER_ITEM, RG_RUTOS_LETTER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER), true); locationTable[RC_LH_SUN] = Location::Base(RC_LH_SUN, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_LAKE_HYLIA, 0x00, "Sun", RHT_LH_SUN, RG_FIRE_ARROWS, SpoilerCollectionCheck::Chest(0x57, 0x1F), true); - locationTable[RC_LH_FREESTANDING_POH] = Location::Collectable(RC_LH_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 7686, 0x1E, "Freestanding PoH", RHT_LH_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_LH_FREESTANDING_POH] = Location::Collectable(RC_LH_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 7686, 0x1E, "Freestanding PoH", RHT_LH_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_LH_DEKU_SCRUB_GROTTO_LEFT] = Location::Base(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xEF), "Deku Scrub Grotto Left", RHT_LH_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT), false, 20); locationTable[RC_LH_DEKU_SCRUB_GROTTO_RIGHT] = Location::Base(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xEF), "Deku Scrub Grotto Right", RHT_LH_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT), false, 40); locationTable[RC_LH_DEKU_SCRUB_GROTTO_CENTER] = Location::Base(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LAKE_HYLIA, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xEF), "Deku Scrub Grotto Center", RHT_LH_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER), false, 40); // Gerudo Valley locationTable[RC_GV_CHEST] = Location::Chest(RC_GV_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GERUDO_VALLEY, 23200, 0x00, "Chest", RHT_GV_CHEST, RG_PURPLE_RUPEE); locationTable[RC_GV_TRADE_SAW] = Location::Base(RC_GV_TRADE_SAW, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, ACTOR_ID_MAX, SCENE_GERUDO_VALLEY, 0x00, "Trade Saw", RHT_GV_TRADE_SAW, RG_BROKEN_SWORD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ADULT_TRADES_GV_TRADE_SAW), true); - locationTable[RC_GV_WATERFALL_FREESTANDING_POH] = Location::Collectable(RC_GV_WATERFALL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 262, 0x01, "Waterfall Freestanding PoH", RHT_GV_WATERFALL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_GV_CRATE_FREESTANDING_POH] = Location::Collectable(RC_GV_CRATE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 518, 0x02, "Crate Freestanding PoH", RHT_GV_CRATE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_GV_WATERFALL_FREESTANDING_POH] = Location::Collectable(RC_GV_WATERFALL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 262, 0x01, "Waterfall Freestanding PoH", RHT_GV_WATERFALL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_GV_CRATE_FREESTANDING_POH] = Location::Collectable(RC_GV_CRATE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GERUDO_VALLEY, 518, 0x02, "Crate Freestanding PoH", RHT_GV_CRATE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_GV_DEKU_SCRUB_GROTTO_REAR] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xF0), "Deku Scrub Grotto Rear", RHT_GV_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_40, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR), false, 40); locationTable[RC_GV_DEKU_SCRUB_GROTTO_FRONT] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xF0), "Deku Scrub Grotto Front", RHT_GV_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT), false, 40); // Gerudo Fortress - locationTable[RC_GF_CHEST] = Location::Chest(RC_GF_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, 0x00, "Chest", RHT_GF_CHEST, RG_PIECE_OF_HEART, true); + locationTable[RC_GF_CHEST] = Location::Chest(RC_GF_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, 0x00, "Chest", RHT_GF_CHEST, RG_PIECE_OF_HEART, true); locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "GF HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "GF HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); // RandoTodo: Do we replace these with the RC_HIDEOUT keys or keep these? locationTable[RC_GF_GERUDO_MEMBERSHIP_CARD] = Location::Base(RC_GF_GERUDO_MEMBERSHIP_CARD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "GF Gerudo Membership Card", RHT_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS), true); - locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "GF North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "GF North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "GF South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "GF South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "GF North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "GF North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "GF South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "GF South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); // Haunted Wasteland locationTable[RC_WASTELAND_CHEST] = Location::Chest(RC_WASTELAND_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, 0x00, "Chest", RHT_WASTELAND_CHEST, RG_PURPLE_RUPEE); locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, "Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BUY_BOMBCHUS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN), false, 200); // Desert Colossus - locationTable[RC_COLOSSUS_FREESTANDING_POH] = Location::Collectable(RC_COLOSSUS_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DESERT_COLOSSUS, 3334, 0x0D, "Freestanding PoH", RHT_COLOSSUS_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_COLOSSUS_FREESTANDING_POH] = Location::Collectable(RC_COLOSSUS_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DESERT_COLOSSUS, 3334, 0x0D, "Freestanding PoH", RHT_COLOSSUS_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = Location::Base(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xFD), "Deku Scrub Grotto Rear", RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_40, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR), false, 40); locationTable[RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = Location::Base(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DESERT_COLOSSUS, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xFD), "Deku Scrub Grotto Front", RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT), false, 40); // Market @@ -234,8 +234,8 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_MARKET_TREASURE_CHEST_GAME_KEY_4] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_KEY_4, RCQUEST_BOTH, RCTYPE_CHEST_GAME, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, "Chest Game Fourth Room Key", RHT_MARKET_TREASURE_CHEST_GAME_KEY_4, RG_TREASURE_GAME_SMALL_KEY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4)); locationTable[RC_MARKET_TREASURE_CHEST_GAME_KEY_5] = Location::Chest(RC_MARKET_TREASURE_CHEST_GAME_KEY_5, RCQUEST_BOTH, RCTYPE_CHEST_GAME, ACTOR_EN_BOX, SCENE_TREASURE_BOX_SHOP, 0x00, "Chest Game Fifth Room Key", RHT_MARKET_TREASURE_CHEST_GAME_KEY_5, RG_TREASURE_GAME_SMALL_KEY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5)); // Hyrule Castle - locationTable[RC_HC_MALON_EGG] = Location::Base(RC_HC_MALON_EGG, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_HYRULE_CASTLE, 0x00, "Malon Egg", RHT_HC_MALON_EGG, RG_WEIRD_EGG, SpoilerCollectionCheck::EventChkInf(0x12), true); - locationTable[RC_HC_ZELDAS_LETTER] = Location::Base(RC_HC_ZELDAS_LETTER, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_CASTLE_COURTYARD_ZELDA, 0x00, "Zeldas Letter", RHT_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER, SpoilerCollectionCheck::EventChkInf(0x40), true); + locationTable[RC_HC_MALON_EGG] = Location::Base(RC_HC_MALON_EGG, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_HYRULE_CASTLE, 0x00, "Malon Egg", RHT_HC_MALON_EGG, RG_WEIRD_EGG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG), true); + locationTable[RC_HC_ZELDAS_LETTER] = Location::Base(RC_HC_ZELDAS_LETTER, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_CASTLE_COURTYARD_ZELDA, 0x00, "Zeldas Letter", RHT_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER), true); // Kakariko locationTable[RC_KAK_REDEAD_GROTTO_CHEST] = Location::Chest(RC_KAK_REDEAD_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_BOX, SCENE_GROTTOS, 31434, 0x0A, "Redead Grotto Chest", RHT_KAK_REDEAD_GROTTO_CHEST, RG_HUGE_RUPEE); locationTable[RC_KAK_OPEN_GROTTO_CHEST] = Location::Chest(RC_KAK_OPEN_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_BOX, SCENE_GROTTOS, 22984, 0x08, "Open Grotto Chest", RHT_KAK_OPEN_GROTTO_CHEST, RG_RED_RUPEE); @@ -252,23 +252,23 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_KAK_ANJU_AS_ADULT] = Location::Base(RC_KAK_ANJU_AS_ADULT, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Anju as Adult", RHT_KAK_ANJU_AS_ADULT, RG_CLAIM_CHECK, SpoilerCollectionCheck::ItemGetInf(44), true); locationTable[RC_KAK_ANJU_AS_CHILD] = Location::Base(RC_KAK_ANJU_AS_CHILD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Anju as Child", RHT_KAK_ANJU_AS_CHILD, RG_EMPTY_BOTTLE, SpoilerCollectionCheck::ItemGetInf(12), true); locationTable[RC_KAK_TRADE_POCKET_CUCCO] = Location::Base(RC_KAK_TRADE_POCKET_CUCCO, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Trade Pocket Cucco", RHT_KAK_TRADE_POCKET_CUCCO, RG_COJIRO, SpoilerCollectionCheck::ItemGetInf(46), true); - locationTable[RC_KAK_IMPAS_HOUSE_FREESTANDING_POH] = Location::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_IMPAS_HOUSE, 262, 0x01, "Impas House Freestanding PoH", RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_KAK_WINDMILL_FREESTANDING_POH] = Location::Collectable(RC_KAK_WINDMILL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 262, 0x01, "Windmill Freestanding PoH", RHT_KAK_WINDMILL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_KAK_IMPAS_HOUSE_FREESTANDING_POH] = Location::Collectable(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_IMPAS_HOUSE, 262, 0x01, "Impas House Freestanding PoH", RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_KAK_WINDMILL_FREESTANDING_POH] = Location::Collectable(RC_KAK_WINDMILL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 262, 0x01, "Windmill Freestanding PoH", RHT_KAK_WINDMILL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); // Graveyard locationTable[RC_GRAVEYARD_SHIELD_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 21824, 0x00, "Shield Grave Chest", RHT_GRAVEYARD_SHIELD_GRAVE_CHEST, RG_HYLIAN_SHIELD); - locationTable[RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_REDEAD_GRAVE, -22592, 0x00, "Heart Piece Grave Chest", RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RG_PIECE_OF_HEART, true); + locationTable[RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = Location::Chest(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_REDEAD_GRAVE, -22592, 0x00, "Heart Piece Grave Chest", RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RG_PIECE_OF_HEART, true); locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = Location::Chest(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_ROYAL_FAMILYS_TOMB, -32736, 0x00, "Composers Grave Chest", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RG_BOMBS_5); - locationTable[RC_GRAVEYARD_HOOKSHOT_CHEST] = Location::Chest(RC_GRAVEYARD_HOOKSHOT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 4352, 0x00, "Hookshot Chest", RHT_GRAVEYARD_HOOKSHOT_CHEST, RG_PROGRESSIVE_HOOKSHOT, true); - locationTable[RC_GRAVEYARD_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 1030, 0x04, "Freestanding PoH", RHT_GRAVEYARD_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1798, 0x07, "Dampe Race Freestanding PoH", RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = Location::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 6406, 0x19, "Dampe Gravedigging Tour", RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RG_PIECE_OF_HEART, true); + locationTable[RC_GRAVEYARD_HOOKSHOT_CHEST] = Location::Chest(RC_GRAVEYARD_HOOKSHOT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_BOX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 4352, 0x00, "Hookshot Chest", RHT_GRAVEYARD_HOOKSHOT_CHEST, RG_PROGRESSIVE_HOOKSHOT, true); + locationTable[RC_GRAVEYARD_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 1030, 0x04, "Freestanding PoH", RHT_GRAVEYARD_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 1798, 0x07, "Dampe Race Freestanding PoH", RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = Location::Collectable(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GRAVEYARD, 6406, 0x19, "Dampe Gravedigging Tour", RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RG_PIECE_OF_HEART, true); // Death Mountain locationTable[RC_DMT_CHEST] = Location::Chest(RC_DMT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEATH_MOUNTAIN_TRAIL, 23201, 0x01, "Chest", RHT_DMT_CHEST, RG_PURPLE_RUPEE); locationTable[RC_DMT_STORMS_GROTTO_CHEST] = Location::Chest(RC_DMT_STORMS_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_BOX, SCENE_GROTTOS, 23255, 0x17, "Storms Grotto Chest", RHT_DMT_STORMS_GROTTO_CHEST, RG_HUGE_RUPEE); locationTable[RC_DMT_TRADE_BROKEN_SWORD] = Location::Base(RC_DMT_TRADE_BROKEN_SWORD, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, "Trade Broken Sword", RHT_DMT_TRADE_BROKEN_SWORD, RG_PRESCRIPTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD), true); locationTable[RC_DMT_TRADE_EYEDROPS] = Location::Base(RC_DMT_TRADE_EYEDROPS, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, "Trade Eyedrops", RHT_DMT_TRADE_EYEDROPS, RG_CLAIM_CHECK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS), true); locationTable[RC_DMT_TRADE_CLAIM_CHECK] = Location::Base(RC_DMT_TRADE_CLAIM_CHECK, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_TRAIL, 0x00, "Trade Claim Check", RHT_DMT_TRADE_CLAIM_CHECK, RG_BIGGORON_SWORD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ADULT_TRADES_DMT_TRADE_CLAIM_CHECK), true); - locationTable[RC_DMT_FREESTANDING_POH] = Location::Collectable(RC_DMT_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 7686, 0x1E, "Freestanding PoH", RHT_DMT_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_DMT_FREESTANDING_POH] = Location::Collectable(RC_DMT_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 7686, 0x1E, "Freestanding PoH", RHT_DMT_FREESTANDING_POH, RG_PIECE_OF_HEART, true); // Goron City locationTable[RC_GC_MAZE_LEFT_CHEST] = Location::Chest(RC_GC_MAZE_LEFT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GORON_CITY, 23232, 0x00, "Maze Left Chest", RHT_GC_MAZE_LEFT_CHEST, RG_HUGE_RUPEE); locationTable[RC_GC_MAZE_RIGHT_CHEST] = Location::Chest(RC_GC_MAZE_RIGHT_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GORON_CITY, 23201, 0x01, "Maze Right Chest", RHT_GC_MAZE_RIGHT_CHEST, RG_PURPLE_RUPEE); @@ -276,15 +276,15 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GC_ROLLING_GORON_AS_CHILD] = Location::Base(RC_GC_ROLLING_GORON_AS_CHILD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, "Rolling Goron as Child", RHT_GC_ROLLING_GORON_AS_CHILD, RG_PROGRESSIVE_BOMB_BAG, SpoilerCollectionCheck::InfTable(INFTABLE_11E), true); locationTable[RC_GC_ROLLING_GORON_AS_ADULT] = Location::Base(RC_GC_ROLLING_GORON_AS_ADULT, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, "Rolling Goron as Adult", RHT_GC_ROLLING_GORON_AS_ADULT, RG_GORON_TUNIC, SpoilerCollectionCheck::InfTable(INFTABLE_GORON_CITY_DOORS_UNLOCKED), true); locationTable[RC_GC_DARUNIAS_JOY] = Location::Base(RC_GC_DARUNIAS_JOY, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, "Darunias Joy", RHT_GC_DARUNIAS_JOY, RG_PROGRESSIVE_STRENGTH, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DARUNIAS_JOY), true); - locationTable[RC_GC_POT_FREESTANDING_POH] = Location::Collectable(RC_GC_POT_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GORON_CITY, 7942, 0x1F, "Pot Freestanding PoH", RHT_GC_POT_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_GC_POT_FREESTANDING_POH] = Location::Collectable(RC_GC_POT_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_GORON_CITY, 7942, 0x1F, "Pot Freestanding PoH", RHT_GC_POT_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_GC_DEKU_SCRUB_GROTTO_LEFT] = Location::Base(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xFB), "Deku Scrub Grotto Left", RHT_GC_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT), false, 20); locationTable[RC_GC_DEKU_SCRUB_GROTTO_RIGHT] = Location::Base(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xFB), "Deku Scrub Grotto Right", RHT_GC_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT), false, 40); locationTable[RC_GC_DEKU_SCRUB_GROTTO_CENTER] = Location::Base(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GORON_CITY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xFB), "Deku Scrub Grotto Center", RHT_GC_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER), false, 70); locationTable[RC_GC_MEDIGORON] = Location::Base(RC_GC_MEDIGORON, RCQUEST_BOTH, RCTYPE_MERCHANT, ACTOR_ID_MAX, SCENE_GORON_CITY, 0x00, "Medigoron", RHT_GC_MEDIGORON, RG_GIANTS_KNIFE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_MEDIGORON), false, 200); // Death Mountain Crater locationTable[RC_DMC_UPPER_GROTTO_CHEST] = Location::Chest(RC_DMC_UPPER_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_BOX, SCENE_GROTTOS, 23802, 0x1A, "Upper Grotto Chest", RHT_DMC_UPPER_GROTTO_CHEST, RG_BOMBS_20); - locationTable[RC_DMC_WALL_FREESTANDING_POH] = Location::Collectable(RC_DMC_WALL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 518, 0x02, "Wall Freestanding PoH", RHT_DMC_WALL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_DMC_VOLCANO_FREESTANDING_POH] = Location::Collectable(RC_DMC_VOLCANO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 2054, 0x08, "Volcano Freestanding PoH", RHT_DMC_WALL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_DMC_WALL_FREESTANDING_POH] = Location::Collectable(RC_DMC_WALL_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 518, 0x02, "Wall Freestanding PoH", RHT_DMC_WALL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_DMC_VOLCANO_FREESTANDING_POH] = Location::Collectable(RC_DMC_VOLCANO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 2054, 0x08, "Volcano Freestanding PoH", RHT_DMC_WALL_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_DMC_DEKU_SCRUB] = Location::Base(RC_DMC_DEKU_SCRUB, RCQUEST_BOTH, RCTYPE_SCRUB, ACTOR_EN_DNS, SCENE_DEATH_MOUNTAIN_CRATER, 0x05, "Deku Scrub", RHT_DMC_DEKU_SCRUB, RG_BUY_BOMBS_535, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB), false, 40); locationTable[RC_DMC_DEKU_SCRUB_GROTTO_LEFT] = Location::Base(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xF9), "Deku Scrub Grotto Left", RHT_DMC_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT), false, 20); locationTable[RC_DMC_DEKU_SCRUB_GROTTO_RIGHT] = Location::Base(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xF9), "Deku Scrub Grotto Right", RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT), false, 40); @@ -292,44 +292,44 @@ void Rando::StaticData::InitLocationTable() { // // Zoras River locationTable[RC_ZR_OPEN_GROTTO_CHEST] = Location::Chest(RC_ZR_OPEN_GROTTO_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, ACTOR_EN_BOX, SCENE_GROTTOS, 22985, 0x09, "Open Grotto Chest", RHT_ZR_OPEN_GROTTO_CHEST, RG_RED_RUPEE); locationTable[RC_ZR_MAGIC_BEAN_SALESMAN] = Location::Base(RC_ZR_MAGIC_BEAN_SALESMAN, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_ZORAS_RIVER, 0x00, "Magic Bean Salesman", RHT_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN), true, 60); - locationTable[RC_ZR_FROGS_ZELDAS_LULLABY] = Location::Base(RC_ZR_FROGS_ZELDAS_LULLABY, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Zelda's Lullaby", RHT_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(0xD1)); - locationTable[RC_ZR_FROGS_EPONAS_SONG] = Location::Base(RC_ZR_FROGS_EPONAS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Epona's Song", RHT_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(0xD2)); - locationTable[RC_ZR_FROGS_SARIAS_SONG] = Location::Base(RC_ZR_FROGS_SARIAS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Saria's Song", RHT_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(0xD4)); - locationTable[RC_ZR_FROGS_SUNS_SONG] = Location::Base(RC_ZR_FROGS_SUNS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Sun's Song", RHT_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(0xD3)); - locationTable[RC_ZR_FROGS_SONG_OF_TIME] = Location::Base(RC_ZR_FROGS_SONG_OF_TIME, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Song of Time", RHT_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(0xD5)); - locationTable[RC_ZR_FROGS_IN_THE_RAIN] = Location::Base(RC_ZR_FROGS_IN_THE_RAIN, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs in the Rain", RHT_ZR_FROGS_IN_THE_RAIN, RG_PIECE_OF_HEART, SpoilerCollectionCheck::EventChkInf(0xD6), true); - locationTable[RC_ZR_FROGS_OCARINA_GAME] = Location::Base(RC_ZR_FROGS_OCARINA_GAME, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Ocarina Game", RHT_ZR_FROGS_OCARINA_GAME, RG_PIECE_OF_HEART, SpoilerCollectionCheck::EventChkInf(0xD0), true); - locationTable[RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = Location::Collectable(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 1030, 0x04, "Near Open Grotto Freestanding PoH", RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_ZR_NEAR_DOMAIN_FREESTANDING_POH] = Location::Collectable(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 2822, 0x0B, "Near Domain Freestanding PoH", RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_ZR_FROGS_ZELDAS_LULLABY] = Location::Base(RC_ZR_FROGS_ZELDAS_LULLABY, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Zelda's Lullaby", RHT_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_ZL)); + locationTable[RC_ZR_FROGS_EPONAS_SONG] = Location::Base(RC_ZR_FROGS_EPONAS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Epona's Song", RHT_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_EPONA)); + locationTable[RC_ZR_FROGS_SARIAS_SONG] = Location::Base(RC_ZR_FROGS_SARIAS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Saria's Song", RHT_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_SARIA)); + locationTable[RC_ZR_FROGS_SUNS_SONG] = Location::Base(RC_ZR_FROGS_SUNS_SONG, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Sun's Song", RHT_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_SUNS)); + locationTable[RC_ZR_FROGS_SONG_OF_TIME] = Location::Base(RC_ZR_FROGS_SONG_OF_TIME, RCQUEST_BOTH, RCTYPE_FROG_SONG, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Song of Time", RHT_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_SOT)); + locationTable[RC_ZR_FROGS_IN_THE_RAIN] = Location::Base(RC_ZR_FROGS_IN_THE_RAIN, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs in the Rain", RHT_ZR_FROGS_IN_THE_RAIN, RG_PIECE_OF_HEART, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_STORMS), true); + locationTable[RC_ZR_FROGS_OCARINA_GAME] = Location::Base(RC_ZR_FROGS_OCARINA_GAME, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_FR, SCENE_ZORAS_RIVER, 0x00, "Frogs Ocarina Game", RHT_ZR_FROGS_OCARINA_GAME, RG_PIECE_OF_HEART, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SONGS_FOR_FROGS_CHOIR), true); + locationTable[RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = Location::Collectable(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 1030, 0x04, "Near Open Grotto Freestanding PoH", RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_ZR_NEAR_DOMAIN_FREESTANDING_POH] = Location::Collectable(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 2822, 0x0B, "Near Domain Freestanding PoH", RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_ZR_DEKU_SCRUB_GROTTO_REAR] = Location::Base(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_ZORAS_RIVER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x07, 0xEB), "Deku Scrub Grotto Rear", RHT_ZR_DEKU_SCRUB_GROTTO_REAR, RG_BUY_RED_POTION_40, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR), false, 40); locationTable[RC_ZR_DEKU_SCRUB_GROTTO_FRONT] = Location::Base(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_ZORAS_RIVER, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xEB), "Deku Scrub Grotto Front", RHT_ZR_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT), false, 40); // Zoras Domain - locationTable[RC_ZD_CHEST] = Location::Chest(RC_ZD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_ZORAS_DOMAIN, -18496, 0x00, "Chest", RHT_ZD_CHEST, RG_PIECE_OF_HEART, true); - locationTable[RC_ZD_DIVING_MINIGAME] = Location::Base(RC_ZD_DIVING_MINIGAME, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, "Diving Minigame", RHT_ZD_DIVING_MINIGAME, RG_PROGRESSIVE_SCALE, SpoilerCollectionCheck::EventChkInf(0x38), true); + locationTable[RC_ZD_CHEST] = Location::Chest(RC_ZD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_ZORAS_DOMAIN, -18496, 0x00, "Chest", RHT_ZD_CHEST, RG_PIECE_OF_HEART, true); + locationTable[RC_ZD_DIVING_MINIGAME] = Location::Base(RC_ZD_DIVING_MINIGAME, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, "Diving Minigame", RHT_ZD_DIVING_MINIGAME, RG_PROGRESSIVE_SCALE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_OBTAINED_SILVER_SCALE), true); locationTable[RC_ZD_KING_ZORA_THAWED] = Location::Base(RC_ZD_KING_ZORA_THAWED, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, "King Zora Thawed", RHT_ZD_KING_ZORA_THAWED, RG_ZORA_TUNIC, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KING_ZORA_THAWED), true); locationTable[RC_ZD_TRADE_PRESCRIPTION] = Location::Base(RC_ZD_TRADE_PRESCRIPTION, RCQUEST_BOTH, RCTYPE_ADULT_TRADE, ACTOR_ID_MAX, SCENE_ZORAS_DOMAIN, 0x00, "Trade Prescription", RHT_ZD_TRADE_PRESCRIPTION, RG_EYEBALL_FROG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION), true); // Zora's Fountain - locationTable[RC_ZF_ICEBERG_FREESTANDING_POH] = Location::Collectable(RC_ZF_ICEBERG_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 262, 0x01, "Iceberg Freestanding PoH", RHT_ZF_ICEBERG_FREESTANDING_POH, RG_PIECE_OF_HEART, true); - locationTable[RC_ZF_BOTTOM_FREESTANDING_POH] = Location::Collectable(RC_ZF_BOTTOM_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 5126, 0x14, "Bottom Freestanding PoH", RHT_ZF_BOTTOM_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_ZF_ICEBERG_FREESTANDING_POH] = Location::Collectable(RC_ZF_ICEBERG_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 262, 0x01, "Iceberg Freestanding PoH", RHT_ZF_ICEBERG_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_ZF_BOTTOM_FREESTANDING_POH] = Location::Collectable(RC_ZF_BOTTOM_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 5126, 0x14, "Bottom Freestanding PoH", RHT_ZF_BOTTOM_FREESTANDING_POH, RG_PIECE_OF_HEART, true); // Lon Lon Ranch locationTable[RC_LLR_TALONS_CHICKENS] = Location::Base(RC_LLR_TALONS_CHICKENS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_LON_LON_BUILDINGS, 0x00, "Talons Chickens", RHT_LLR_TALONS_CHICKENS, RG_BOTTLE_WITH_MILK, SpoilerCollectionCheck::ItemGetInf(2), true); - locationTable[RC_LLR_FREESTANDING_POH] = Location::Collectable(RC_LLR_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_LON_LON_BUILDINGS, 262, 0x01, "Freestanding PoH", RHT_LLR_FREESTANDING_POH, RG_PIECE_OF_HEART, true); + locationTable[RC_LLR_FREESTANDING_POH] = Location::Collectable(RC_LLR_FREESTANDING_POH, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_ITEM00, SCENE_LON_LON_BUILDINGS, 262, 0x01, "Freestanding PoH", RHT_LLR_FREESTANDING_POH, RG_PIECE_OF_HEART, true); locationTable[RC_LLR_DEKU_SCRUB_GROTTO_LEFT] = Location::Base(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x00, 0xFC), "Deku Scrub Grotto Left", RHT_LLR_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT), false, 20); locationTable[RC_LLR_DEKU_SCRUB_GROTTO_RIGHT] = Location::Base(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x05, 0xFC), "Deku Scrub Grotto Right", RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT), false, 40); locationTable[RC_LLR_DEKU_SCRUB_GROTTO_CENTER] = Location::Base(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_LON_LON_RANCH, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x03, 0xFC), "Deku Scrub Grotto Center", RHT_LLR_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER), false, 40); // Dungeons // Deku Tree Vanilla - locationTable[RC_DEKU_TREE_MAP_CHEST] = Location::Chest(RC_DEKU_TREE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, 0x03, "Map Chest", RHT_DEKU_TREE_MAP_CHEST, RG_DEKU_TREE_MAP, true); - locationTable[RC_DEKU_TREE_COMPASS_CHEST] = Location::Chest(RC_DEKU_TREE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_COMPASS, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2050, 0x02, "Compass Chest", RHT_DEKU_TREE_COMPASS_CHEST, RG_DEKU_TREE_COMPASS, true); + locationTable[RC_DEKU_TREE_MAP_CHEST] = Location::Chest(RC_DEKU_TREE_MAP_CHEST, RCQUEST_VANILLA, RCTYPE_MAP, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, 0x03, "Map Chest", RHT_DEKU_TREE_MAP_CHEST, RG_DEKU_TREE_MAP, true); + locationTable[RC_DEKU_TREE_COMPASS_CHEST] = Location::Chest(RC_DEKU_TREE_COMPASS_CHEST, RCQUEST_VANILLA, RCTYPE_COMPASS, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2050, 0x02, "Compass Chest", RHT_DEKU_TREE_COMPASS_CHEST, RG_DEKU_TREE_COMPASS, true); locationTable[RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = Location::Chest(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22790, 0x06, "Compass Room Side Chest", RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RG_RECOVERY_HEART); locationTable[RC_DEKU_TREE_BASEMENT_CHEST] = Location::Chest(RC_DEKU_TREE_BASEMENT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22788, 0x04, "Basement Chest", RHT_DEKU_TREE_BASEMENT_CHEST, RG_RECOVERY_HEART); - locationTable[RC_DEKU_TREE_SLINGSHOT_CHEST] = Location::Chest(RC_DEKU_TREE_SLINGSHOT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 161, 0x01, "Slingshot Chest", RHT_DEKU_TREE_SLINGSHOT_CHEST, RG_PROGRESSIVE_SLINGSHOT, true); + locationTable[RC_DEKU_TREE_SLINGSHOT_CHEST] = Location::Chest(RC_DEKU_TREE_SLINGSHOT_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 161, 0x01, "Slingshot Chest", RHT_DEKU_TREE_SLINGSHOT_CHEST, RG_PROGRESSIVE_SLINGSHOT, true); locationTable[RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = Location::Chest(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCQUEST_VANILLA, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22789, 0x05, "Slingshot Room Side Chest", RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RG_RECOVERY_HEART); // Deku Tree MQ - locationTable[RC_DEKU_TREE_MQ_MAP_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, 0x03, "MQ Map Chest", RHT_DEKU_TREE_MQ_MAP_CHEST, RG_DEKU_TREE_MAP, true); - locationTable[RC_DEKU_TREE_MQ_COMPASS_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_COMPASS, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2049, 0x01, "MQ Compass Chest", RHT_DEKU_TREE_MQ_COMPASS_CHEST, RG_DEKU_TREE_COMPASS, true); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 4262, 0x06, "MQ Slingshot Chest", RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST, RG_PROGRESSIVE_SLINGSHOT, true); + locationTable[RC_DEKU_TREE_MQ_MAP_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_MAP_CHEST, RCQUEST_MQ, RCTYPE_MAP, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2083, 0x03, "MQ Map Chest", RHT_DEKU_TREE_MQ_MAP_CHEST, RG_DEKU_TREE_MAP, true); + locationTable[RC_DEKU_TREE_MQ_COMPASS_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCQUEST_MQ, RCTYPE_COMPASS, ACTOR_EN_BOX, SCENE_DEKU_TREE, 2049, 0x01, "MQ Compass Chest", RHT_DEKU_TREE_MQ_COMPASS_CHEST, RG_DEKU_TREE_COMPASS, true); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 4262, 0x06, "MQ Slingshot Chest", RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST, RG_PROGRESSIVE_SLINGSHOT, true); locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, -31454, 0x02, "MQ Slingshot Room Back Chest", RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RG_DEKU_SHIELD); locationTable[RC_DEKU_TREE_MQ_BASEMENT_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, -31452, 0x04, "MQ Basement Chest", RHT_DEKU_TREE_MQ_BASEMENT_CHEST, RG_DEKU_SHIELD); locationTable[RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = Location::Chest(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCQUEST_MQ, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_DEKU_TREE, 22789, 0x05, "MQ Before Spinning Log Chest", RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RG_RECOVERY_HEART); @@ -701,7 +701,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FIRE_TEMPLE_GS_BOULDER_MAZE] = Location::GSToken(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCQUEST_VANILLA, SCENE_FIRE_TEMPLE, 9220, 0x04, "GS Boulder Maze", RHT_FIRE_TEMPLE_GS_BOULDER_MAZE); locationTable[RC_FIRE_TEMPLE_GS_SCARECROW_TOP] = Location::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCQUEST_VANILLA, SCENE_FIRE_TEMPLE, 9224, 0x08, "GS Scarecrow Top", RHT_FIRE_TEMPLE_GS_SCARECROW_TOP); locationTable[RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = Location::GSToken(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCQUEST_VANILLA, SCENE_FIRE_TEMPLE, 9232, 0x10, "GS Scarecrow Climb", RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB); - locationTable[RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE, RCQUEST_MQ, SCENE_FIRE_TEMPLE, 9218, 0x02, "MQ GS Above Fire Wall Maze", RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE); + locationTable[RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE, RCQUEST_MQ, SCENE_FIRE_TEMPLE, 9218, 0x02, "MQ GS Above Fire Wall Maze", RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE); locationTable[RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCQUEST_MQ, SCENE_FIRE_TEMPLE, 9224, 0x08, "MQ GS Fire Wall Maze Center", RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER); locationTable[RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCQUEST_MQ, SCENE_FIRE_TEMPLE, 9217, 0x01, "MQ GS Big Lava Room Open Door", RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR); locationTable[RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = Location::GSToken(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCQUEST_MQ, SCENE_FIRE_TEMPLE, 9232, 0x10, "MQ GS Fire Wall Maze Side Room", RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM); @@ -835,7 +835,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_TWINROVA] = Location::Base(RC_TWINROVA, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, ACTOR_DOOR_WARP1, SCENE_SPIRIT_TEMPLE_BOSS, 0x00, "Twinrova", "Twinrova", RHT_TWINROVA, RG_SPIRIT_MEDALLION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE), true); locationTable[RC_BONGO_BONGO] = Location::Base(RC_BONGO_BONGO, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, ACTOR_DOOR_WARP1, SCENE_SHADOW_TEMPLE_BOSS, 0x00, "Bongo Bongo", "Bongo Bongo", RHT_BONGO_BONGO, RG_SHADOW_MEDALLION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE), true); locationTable[RC_GANON] = Location::Base(RC_GANON, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, ACTOR_DOOR_WARP1, SCENE_GANON_BOSS, 0x00, "Ganon", "Ganon", RHT_NONE, RG_TRIFORCE); - locationTable[RC_GIFT_FROM_RAURU] = Location::Base(RC_GIFT_FROM_RAURU, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Gift from Rauru", "Gift from Rauru", RHT_GIFT_FROM_RAURU, RG_LIGHT_MEDALLION, SpoilerCollectionCheck::EventChkInf(0xC9), true); + locationTable[RC_GIFT_FROM_RAURU] = Location::Base(RC_GIFT_FROM_RAURU, RCQUEST_BOTH, RCTYPE_DUNGEON_REWARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Gift from Rauru", "Gift from Rauru", RHT_GIFT_FROM_RAURU, RG_LIGHT_MEDALLION, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_TIME_TRAVELED_TO_ADULT), true); // Heart Containers locationTable[RC_DEKU_TREE_QUEEN_GOHMA_HEART] = Location::Base(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, ACTOR_ITEM_B_HEART, SCENE_DEKU_TREE_BOSS, 0x00, "Queen Gohma Heart Container", RHT_DEKU_TREE_QUEEN_GOHMA_HEART, RG_HEART_CONTAINER, SpoilerCollectionCheck::Collectable(0x11, 0x1F), true); @@ -848,9 +848,9 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SHADOW_TEMPLE_BONGO_BONGO_HEART] = Location::Base(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCQUEST_BOTH, RCTYPE_BOSS_HEART_OR_OTHER_REWARD, ACTOR_ITEM_B_HEART, SCENE_SHADOW_TEMPLE_BOSS, 0x00, "Bongo Bongo Heart Container", RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART, RG_HEART_CONTAINER, SpoilerCollectionCheck::Collectable(0x18, 0x1F), true); // Cutscenes - locationTable[RC_TOT_MASTER_SWORD] = Location::Base(RC_TOT_MASTER_SWORD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "ToT Master Sword", RHT_TOT_MASTER_SWORD, RG_MASTER_SWORD, SpoilerCollectionCheck::EventChkInf(0x45), true); - locationTable[RC_TOT_LIGHT_ARROWS_CUTSCENE] = Location::Base(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "ToT Light Arrow Cutscene", RHT_TOT_LIGHT_ARROWS_CUTSCENE, RG_LIGHT_ARROWS, SpoilerCollectionCheck::EventChkInf(0xC4), true); - locationTable[RC_LW_GIFT_FROM_SARIA] = Location::Base(RC_LW_GIFT_FROM_SARIA, RCQUEST_BOTH, RCTYPE_OCARINA, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, "Gift From Saria", RHT_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, SpoilerCollectionCheck::EventChkInf(0xC1), true); + locationTable[RC_TOT_MASTER_SWORD] = Location::Base(RC_TOT_MASTER_SWORD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "ToT Master Sword", RHT_TOT_MASTER_SWORD, RG_MASTER_SWORD, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL), true); + locationTable[RC_TOT_LIGHT_ARROWS_CUTSCENE] = Location::Base(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "ToT Light Arrow Cutscene", RHT_TOT_LIGHT_ARROWS_CUTSCENE, RG_LIGHT_ARROWS, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS), true); + locationTable[RC_LW_GIFT_FROM_SARIA] = Location::Base(RC_LW_GIFT_FROM_SARIA, RCQUEST_BOTH, RCTYPE_OCARINA, ACTOR_ID_MAX, SCENE_LOST_WOODS, 0x00, "Gift From Saria", RHT_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE), true); locationTable[RC_ZF_GREAT_FAIRY_REWARD] = Location::Base(RC_ZF_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 1, "Great Fairy Reward", RHT_ZF_GREAT_FAIRY_REWARD, RG_FARORES_WIND, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_GREAT_FAIRY_REWARD), true); locationTable[RC_HC_GREAT_FAIRY_REWARD] = Location::Base(RC_HC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 2, "Great Fairy Reward", RHT_HC_GREAT_FAIRY_REWARD, RG_DINS_FIRE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GREAT_FAIRY_REWARD), true); locationTable[RC_COLOSSUS_GREAT_FAIRY_REWARD] = Location::Base(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, 3, "Great Fairy Reward", RHT_COLOSSUS_GREAT_FAIRY_REWARD, RG_NAYRUS_LOVE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD), true); @@ -859,17 +859,17 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_OGC_GREAT_FAIRY_REWARD] = Location::Base(RC_OGC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, "OGC Great Fairy Reward", "OGC Great Fairy Reward", RHT_OGC_GREAT_FAIRY_REWARD, RG_DOUBLE_DEFENSE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_GREAT_FAIRY_REWARD), true); // Songs - locationTable[RC_SHEIK_IN_FOREST] = Location::Base(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, SpoilerCollectionCheck::EventChkInf(0x50), true); - locationTable[RC_SHEIK_IN_CRATER] = Location::Base(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_CRATER, 0x00, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, SpoilerCollectionCheck::EventChkInf(0x51), true); - locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Base(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, SpoilerCollectionCheck::EventChkInf(0x52), true); - locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Base(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, SpoilerCollectionCheck::EventChkInf(0xAC), true); - locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Base(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, SpoilerCollectionCheck::EventChkInf(0xAA), true); - locationTable[RC_SHEIK_AT_TEMPLE] = Location::Base(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, SpoilerCollectionCheck::EventChkInf(0x55), true); - locationTable[RC_SONG_FROM_IMPA] = Location::Base(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, SpoilerCollectionCheck::EventChkInf(0x59), true); + locationTable[RC_SHEIK_IN_FOREST] = Location::Base(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_MINUET_OF_FOREST), true); + locationTable[RC_SHEIK_IN_CRATER] = Location::Base(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_CRATER, 0x00, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_BOLERO_OF_FIRE), true); + locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Base(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER), true); + locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Base(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT), true); + locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Base(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL), true); + locationTable[RC_SHEIK_AT_TEMPLE] = Location::Base(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT), true); + locationTable[RC_SONG_FROM_IMPA] = Location::Base(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY), true); locationTable[RC_SONG_FROM_MALON] = Location::Base(RC_SONG_FROM_MALON, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_LON_LON_RANCH, 0x00, "Song from Malon", "Song from Malon", RHT_SONG_FROM_MALON, RG_EPONAS_SONG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LEARNED_EPONA_SONG), true); - locationTable[RC_SONG_FROM_SARIA] = Location::Base(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, SpoilerCollectionCheck::EventChkInf(0x57), true); + locationTable[RC_SONG_FROM_SARIA] = Location::Base(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SARIAS_SONG), true); locationTable[RC_SONG_FROM_ROYAL_FAMILYS_TOMB] = Location::Base(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ROYAL_FAMILYS_TOMB, 0x00, "Song from Composers Grave", "Song from Composers Grave", RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SUNS_SONG), true); - locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Base(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, SpoilerCollectionCheck::EventChkInf(0xA9), true); + locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Base(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_TIME), true); locationTable[RC_SONG_FROM_WINDMILL] = Location::Base(RC_SONG_FROM_WINDMILL, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x00, "Song from Windmill", "Song from Windmill", RHT_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_STORMS), true); //Beehives diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index 5cf16ac26..e032d1a2d 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -48,7 +48,7 @@ size_t Option::GetOptionCount() const { return options.size(); } -const RandomizerSettingKey Option::GetKey() const { +RandomizerSettingKey Option::GetKey() const { return static_cast(key); } @@ -355,7 +355,7 @@ 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 { +RandomizerCheck LocationOption::GetKey() const { return static_cast(key); } @@ -368,7 +368,7 @@ TrickOption TrickOption::LogicTrick(RandomizerTrick key_, RandomizerCheckQuest q return {key_, quest_, area_, std::move(tags_), name_, std::move(description_)}; } -const RandomizerTrick TrickOption::GetKey() const { +RandomizerTrick TrickOption::GetKey() const { return static_cast(key); } diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index 1ff68c852..d2291463b 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -195,7 +195,7 @@ class Option { * * @return const RandomizerSettingKey */ - const RandomizerSettingKey GetKey() const; + RandomizerSettingKey GetKey() const; /** * @brief Get the name of the Option. @@ -366,7 +366,7 @@ class LocationOption : public Option { public: LocationOption() = default; LocationOption(RandomizerCheck key_, const std::string& name_); - const RandomizerCheck GetKey() const; + RandomizerCheck GetKey() const; }; class TrickOption : public Option { @@ -385,7 +385,7 @@ public: */ static TrickOption LogicTrick(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); - const RandomizerTrick GetKey() const; + RandomizerTrick GetKey() const; /** * @brief Retrieve the quest type this trick is relevant for. From 8ae8770db8f1c3548e1b2da26c5da72a40c32d33 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:58:49 -0800 Subject: [PATCH 012/267] pull in `startMode` docs (#4988) --- soh/include/z64player.h | 23 +++++ .../actors/ovl_player_actor/z_player.c | 91 ++++++++++--------- 2 files changed, 69 insertions(+), 45 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 6f00eb3ef..a00d86557 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -7,6 +7,29 @@ struct Player; +// Determines behavior when spawning. See `PlayerStartMode`. +#define PLAYER_GET_START_MODE(thisx) (thisx->params & 0xF00) >> 8 + +typedef enum PlayerStartMode { + /* 0 */ PLAYER_START_MODE_NOTHING, // Update is empty and draw function is NULL, nothing occurs. Useful in cutscenes, for example. + /* 1 */ PLAYER_START_MODE_TIME_TRAVEL, // Arriving from time travel. Automatically adjusts by age. + /* 2 */ PLAYER_START_MODE_BLUE_WARP, // Arriving from a blue warp. + /* 3 */ PLAYER_START_MODE_DOOR, // Unused. Use a door immediately if one is nearby. If no door is in usable range, a softlock occurs. + /* 4 */ PLAYER_START_MODE_GROTTO, // Arriving from a grotto, launched upward from the ground. + /* 5 */ PLAYER_START_MODE_WARP_SONG, // Arriving from a warp song. + /* 6 */ PLAYER_START_MODE_FARORES_WIND, // Arriving from a Farores Wind warp. + /* 7 */ PLAYER_START_MODE_KNOCKED_OVER, // Knocked over on the ground and flashing red. + /* 8 */ PLAYER_START_MODE_UNUSED_8, // Unused, behaves the same as PLAYER_START_MODE_MOVE_FORWARD_SLOW. + /* 9 */ PLAYER_START_MODE_UNUSED_9, // Unused, behaves the same as PLAYER_START_MODE_MOVE_FORWARD_SLOW. + /* 10 */ PLAYER_START_MODE_UNUSED_10, // Unused, behaves the same as PLAYER_START_MODE_MOVE_FORWARD_SLOW. + /* 11 */ PLAYER_START_MODE_UNUSED_11, // Unused, behaves the same as PLAYER_START_MODE_MOVE_FORWARD_SLOW. + /* 12 */ PLAYER_START_MODE_UNUSED_12, // Unused, behaves the same as PLAYER_START_MODE_MOVE_FORWARD_SLOW. + /* 13 */ PLAYER_START_MODE_IDLE, // Idle standing still, or swim if in water. + /* 14 */ PLAYER_START_MODE_MOVE_FORWARD_SLOW, // Take a few steps forward at a slow speed (2.0f), or swim if in water. + /* 15 */ PLAYER_START_MODE_MOVE_FORWARD, // Take a few steps forward, using the speed from the last exit (gSaveContext.entranceSpeed), or swim if in water. + /* 16 */ PLAYER_START_MODE_MAX // Note: By default, this param has 4 bits allocated. The max value is 16. +} PlayerStartMode; + typedef enum PlayerSword { /* 0 */ PLAYER_SWORD_NONE, /* 1 */ PLAYER_SWORD_KOKIRI, 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 762814076..34bee2f6f 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -157,17 +157,17 @@ s32 func_80835C08(Player* this, PlayState* play); void Player_UseItem(PlayState* play, Player* this, s32 item); void func_80839F90(Player* this, PlayState* play); s32 func_8083C61C(PlayState* play, Player* this); -void func_8083CA20(PlayState* play, Player* this); -void func_8083CA54(PlayState* play, Player* this); -void func_8083CA9C(PlayState* play, Player* this); -void func_80846648(PlayState* play, Player* this); -void func_80846660(PlayState* play, Player* this); -void func_808467D4(PlayState* play, Player* this); -void func_808468A8(PlayState* play, Player* this); -void func_808468E8(PlayState* play, Player* this); -void func_80846978(PlayState* play, Player* this); -void func_808469BC(PlayState* play, Player* this); -void func_80846A68(PlayState* play, Player* this); +void Player_StartMode_Idle(PlayState* play, Player* this); +void Player_StartMode_MoveForwardSlow(PlayState* play, Player* this); +void Player_StartMode_MoveForward(PlayState* play, Player* this); +void Player_StartMode_Nothing(PlayState* play, Player* this); +void Player_StartMode_BlueWarp(PlayState* play, Player* this); +void Player_StartMode_TimeTravel(PlayState* play, Player* this); +void Player_StartMode_Door(PlayState* play, Player* this); +void Player_StartMode_Grotto(PlayState* play, Player* this); +void Player_StartMode_KnockedOver(PlayState* play, Player* this); +void Player_StartMode_WarpSong(PlayState* play, Player* this); +void Player_StartMode_FaroresWind(PlayState* play, Player* this); void Player_UpdateCommon(Player* this, PlayState* play, Input* input); void func_8084FF7C(Player* this); void Player_UpdateBunnyEars(Player* this); @@ -6618,13 +6618,13 @@ s32 func_8083C910(PlayState* play, Player* this, f32 arg2) { return 1; } -void func_8083CA20(PlayState* play, Player* this) { +void Player_StartMode_Idle(PlayState* play, Player* this) { if (func_8083C910(play, this, 180.0f)) { this->av2.actionVar2 = -20; } } -void func_8083CA54(PlayState* play, Player* this) { +void Player_StartMode_MoveForwardSlow(PlayState* play, Player* this) { this->linearVelocity = 2.0f; gSaveContext.entranceSpeed = 2.0f; if (func_8083C910(play, this, 120.0f)) { @@ -6632,7 +6632,7 @@ void func_8083CA54(PlayState* play, Player* this) { } } -void func_8083CA9C(PlayState* play, Player* this) { +void Player_StartMode_MoveForward(PlayState* play, Player* this) { if (gSaveContext.entranceSpeed < 0.1f) { gSaveContext.entranceSpeed = 0.1f; } @@ -10614,12 +10614,12 @@ static ColliderQuadInit D_808546A0 = { void func_8084663C(Actor* thisx, PlayState* play) { } -void func_80846648(PlayState* play, Player* this) { +void Player_StartMode_Nothing(PlayState* play, Player* this) { this->actor.update = func_8084663C; this->actor.draw = NULL; } -void func_80846660(PlayState* play, Player* this) { +void Player_StartMode_BlueWarp(PlayState* play, Player* this) { Player_SetupAction(play, this, Player_Action_8084F710, 0); if ((play->sceneNum == SCENE_LAKE_HYLIA) && (gSaveContext.sceneSetupIndex >= 4)) { this->av1.actionVar1 = 1; @@ -10652,7 +10652,7 @@ void func_80846720(PlayState* play, Player* this, s32 arg2) { static Vec3f D_808546F4 = { -1.0f, 69.0f, 20.0f }; -void func_808467D4(PlayState* play, Player* this) { +void Player_StartMode_TimeTravel(PlayState* play, Player* this) { Player_SetupAction(play, this, Player_Action_8084E9AC, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; Math_Vec3f_Copy(&this->actor.world.pos, &D_808546F4); @@ -10666,12 +10666,12 @@ void func_808467D4(PlayState* play, Player* this) { this->av2.actionVar2 = 20; } -void func_808468A8(PlayState* play, Player* this) { +void Player_StartMode_Door(PlayState* play, Player* this) { Player_SetupAction(play, this, Player_Action_8084F9A0, 0); Player_StartAnimMovement(play, this, 0x9B); } -void func_808468E8(PlayState* play, Player* this) { +void Player_StartMode_Grotto(PlayState* play, Player* this) { func_808389E8(this, &gPlayerAnim_link_normal_jump, 12.0f, play); Player_SetupAction(play, this, Player_Action_8084F9C0, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; @@ -10679,11 +10679,11 @@ void func_808468E8(PlayState* play, Player* this) { OnePointCutscene_Init(play, 5110, 40, &this->actor, MAIN_CAM); } -void func_80846978(PlayState* play, Player* this) { +void Player_StartMode_KnockedOver(PlayState* play, Player* this) { func_80837C0C(play, this, PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE, 2.0f, 2.0f, this->actor.shape.rot.y + 0x8000, 0); } -void func_808469BC(PlayState* play, Player* this) { +void Player_StartMode_WarpSong(PlayState* play, Player* this) { Player_SetupAction(play, this, Player_Action_8084F698, 0); this->actor.draw = NULL; this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; @@ -10696,7 +10696,7 @@ Actor* Player_SpawnMagicSpell(PlayState* play, Player* this, s32 spell) { this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0, true); } -void func_80846A68(PlayState* play, Player* this) { +void Player_StartMode_FaroresWind(PlayState* play, Player* this) { this->actor.draw = NULL; Player_SetupAction(play, this, Player_Action_8085076C, 0); this->stateFlags1 |= PLAYER_STATE1_IN_CUTSCENE; @@ -10743,23 +10743,23 @@ void Player_InitCommon(Player* this, PlayState* play, FlexSkeletonHeader* skelHe this->ivanDamageMultiplier = 1; } -static void (*D_80854738[])(PlayState* play, Player* this) = { - /* 0x0 */ func_80846648, - /* 0x1 */ func_808467D4, // From time travel - /* 0x2 */ func_80846660, - /* 0x3 */ func_808468A8, - /* 0x4 */ func_808468E8, - /* 0x5 */ func_808469BC, - /* 0x6 */ func_80846A68, - /* 0x7 */ func_80846978, - /* 0x8 */ func_8083CA54, - /* 0x9 */ func_8083CA54, - /* 0xA */ func_8083CA54, - /* 0xB */ func_8083CA54, - /* 0xC */ func_8083CA54, - /* 0xD */ func_8083CA20, - /* 0xE */ func_8083CA54, - /* 0xF */ func_8083CA9C, +static void (*sStartModeFuncs[PLAYER_START_MODE_MAX])(PlayState* play, Player* this) = { + Player_StartMode_Nothing, // PLAYER_START_MODE_NOTHING + Player_StartMode_TimeTravel, // PLAYER_START_MODE_TIME_TRAVEL + Player_StartMode_BlueWarp, // PLAYER_START_MODE_BLUE_WARP + Player_StartMode_Door, // PLAYER_START_MODE_DOOR + Player_StartMode_Grotto, // PLAYER_START_MODE_GROTTO + Player_StartMode_WarpSong, // PLAYER_START_MODE_WARP_SONG + Player_StartMode_FaroresWind, // PLAYER_START_MODE_FARORES_WIND + Player_StartMode_KnockedOver, // PLAYER_START_MODE_KNOCKED_OVER + Player_StartMode_MoveForwardSlow, // PLAYER_START_MODE_UNUSED_8 + Player_StartMode_MoveForwardSlow, // PLAYER_START_MODE_UNUSED_9 + Player_StartMode_MoveForwardSlow, // PLAYER_START_MODE_UNUSED_10 + Player_StartMode_MoveForwardSlow, // PLAYER_START_MODE_UNUSED_11 + Player_StartMode_MoveForwardSlow, // PLAYER_START_MODE_UNUSED_12 + Player_StartMode_Idle, // PLAYER_START_MODE_IDLE + Player_StartMode_MoveForwardSlow, // PLAYER_START_MODE_MOVE_FORWARD_SLOW + Player_StartMode_MoveForward, // PLAYER_START_MODE_MOVE_FORWARD }; static Vec3f D_80854778 = { 0.0f, 50.0f, 0.0f }; @@ -10769,7 +10769,7 @@ void Player_Init(Actor* thisx, PlayState* play2) { PlayState* play = play2; SceneTableEntry* scene = play->loadedScene; u32 titleFileSize; - s32 initMode; + s32 startMode; s32 respawnFlag; s32 respawnMode; @@ -10858,16 +10858,17 @@ void Player_Init(Actor* thisx, PlayState* play2) { gSaveContext.infTable[26] |= gBitFlags[play->sceneNum]; } - initMode = (thisx->params & 0xF00) >> 8; - if ((initMode == 5) || (initMode == 6)) { + startMode = PLAYER_GET_START_MODE(thisx); + + if ((startMode == PLAYER_START_MODE_WARP_SONG) || (startMode == PLAYER_START_MODE_FARORES_WIND)) { if (gSaveContext.cutsceneIndex >= 0xFFF0) { - initMode = 13; + startMode = PLAYER_START_MODE_IDLE; } } - D_80854738[initMode](play, this); + sStartModeFuncs[startMode](play, this); - if (initMode != 0) { + if (startMode != PLAYER_START_MODE_NOTHING) { if ((gSaveContext.gameMode == 0) || (gSaveContext.gameMode == 3)) { this->naviActor = Player_SpawnFairy(play, this, &thisx->world.pos, &D_80854778, FAIRY_NAVI); if (gSaveContext.dogParams != 0) { From 11e07a8f9d82ff10f5654b1d7b2125870e957040 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:44:02 -0800 Subject: [PATCH 013/267] rework assignable tunic/boots to use shipinit and hooks (#4978) * don't put away items when equipping tunics/boots * vb * don't need that return * ok i guess i'm going down the rabbit hole * more rabbit hole * shipinit and more hooks * clean up * use fewer params, add a missing condition * make the loops make sense --- .../Enhancements/AssignableTunicsAndBoots.cpp | 114 ++++++++++++++++++ .../game-interactor/GameInteractor.h | 5 + .../actors/ovl_player_actor/z_player.c | 50 +------- 3 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 soh/soh/Enhancements/AssignableTunicsAndBoots.cpp diff --git a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp new file mode 100644 index 000000000..a7e210b95 --- /dev/null +++ b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp @@ -0,0 +1,114 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "macros.h" +#include "variables.h" + +extern s32 Player_GetItemOnButton(PlayState*, s32); +extern void Inventory_ChangeEquipment(s16, u16); +extern void Player_SetEquipmentData(PlayState*, Player*); +extern void func_808328EC(Player*, u16); +extern PlayState* gPlayState; +} + +static u16 sItemButtons[] = { BTN_B, BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; + +void UseTunicBoots(Player* player, PlayState* play, Input* input) { + // Boots and tunics equip despite state + if ( + player->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD) || + player->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING + ) { + return; + } + + s32 item = ITEM_NONE; + for (s32 i = 0; i < ARRAY_COUNT(sItemButtons); i++) { + if (CHECK_BTN_ALL(input->press.button, sItemButtons[i])) { + item = Player_GetItemOnButton(play, i); + break; + } + } + + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { + if (item >= ITEM_BOOTS_KOKIRI) { + u16 bootsValue = item - ITEM_BOOTS_KOKIRI + 1; + if (CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == bootsValue) { + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); + } else { + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, bootsValue); + } + Player_SetEquipmentData(play, player); + func_808328EC(player, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS : NA_SE_PL_CHANGE_ARMS); + } else { + u16 tunicValue = item - ITEM_TUNIC_KOKIRI + 1; + if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == tunicValue) { + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); + } else { + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, tunicValue); + } + Player_SetEquipmentData(play, player); + func_808328EC(player, NA_SE_PL_CHANGE_ARMS); + } + } +} + +void ClearAssignedTunicsBoots(int32_t unused = 0) { + for (int32_t buttonIndex = 0; buttonIndex < 8; buttonIndex++) { + int32_t item = gSaveContext.equips.buttonItems[buttonIndex]; + + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { + gSaveContext.equips.buttonItems[buttonIndex] = ITEM_NONE; + } + } +} + +#define CVAR_TUNICBOOTS_NAME CVAR_ENHANCEMENT("AssignableTunicsAndBoots") +#define CVAR_TUNICBOOTS_DEFAULT 0 +#define CVAR_TUNICBOOTS_VALUE CVarGetInteger(CVAR_TUNICBOOTS_NAME, CVAR_TUNICBOOTS_DEFAULT) + +void RegisterAssignableTunicsBoots() { + // make sure we don't change our held/equipped item when changing tunics/boots + COND_VB_SHOULD(VB_CHANGE_HELD_ITEM_AND_USE_ITEM, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { + int32_t item = va_arg(args, int32_t); + + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { + *should = false; + } + }); + + // make sure we don't crash because tunics/boots don't have assoicated item actions + COND_VB_SHOULD(VB_ITEM_ACTION_BE_NONE, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { + int32_t item = va_arg(args, int32_t); + + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { + *should = true; + } + }); + + // do something when the player presses a button to use the tunics/boots + COND_VB_SHOULD(VB_EXECUTE_PLAYER_ACTION_FUNC, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { + // if the vanilla condition doesn't want us to run the actionFunc, don't do any of this + if (!*should) { + return; + } + + Input* input = va_arg(args, Input*); + Player* player = GET_PLAYER(gPlayState); + + *should = false; + player->actionFunc(player, gPlayState); + UseTunicBoots(player, gPlayState, input); + }); + + // clear out assigned tunics/boots when the enhancement is toggled off + if (GameInteractor::IsSaveLoaded(true) && CVAR_TUNICBOOTS_VALUE == CVAR_TUNICBOOTS_DEFAULT) { + ClearAssignedTunicsBoots(); + } + + // clear out assigned tunics/boots when loading a save with enhancement turned off + COND_HOOK(OnLoadGame, CVAR_TUNICBOOTS_VALUE == CVAR_TUNICBOOTS_DEFAULT, ClearAssignedTunicsBoots); +} + +static RegisterShipInitFunc initFunc(RegisterAssignableTunicsBoots, { CVAR_TUNICBOOTS_NAME }); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 936a4be99..889ba7f1c 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -532,6 +532,11 @@ typedef enum { VB_SPAWN_SONG_FAIRY, // Opt: *EnGs VB_SPAWN_GOSSIP_STONE_FAIRY, + + /*** Equippable tunics and boots ***/ + VB_CHANGE_HELD_ITEM_AND_USE_ITEM, + VB_ITEM_ACTION_BE_NONE, + VB_EXECUTE_PLAYER_ACTION_FUNC, } GIVanillaBehavior; #ifdef __cplusplus 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 34bee2f6f..77b4a7e27 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2244,16 +2244,12 @@ void Player_InitItemActionWithAnim(PlayState* play, Player* this, s8 itemAction) } s8 Player_ItemToItemAction(s32 item) { - if (item >= ITEM_NONE_FE) { + if (GameInteractor_Should(VB_ITEM_ACTION_BE_NONE, item >= ITEM_NONE_FE, item)) { return PLAYER_IA_NONE; } else if (item == ITEM_LAST_USED) { return PLAYER_IA_SWORD_CS; } else if (item == ITEM_FISHING_POLE) { return PLAYER_IA_FISHING_POLE; - // #region SOH [Enhancement] Added to prevent crashes with assignable equipment - } else if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { - return PLAYER_IA_NONE; - // #endregion } else { return sItemActions[item]; } @@ -2572,7 +2568,7 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { if ((item < ITEM_NONE_FE) && (Player_ItemToItemAction(item) == this->heldItemAction)) { sHeldItemButtonIsHeldDown = true; } - } else { + } else if (GameInteractor_Should(VB_CHANGE_HELD_ITEM_AND_USE_ITEM, true, item)) { this->heldItemButton = i; Player_UseItem(play, this, item); } @@ -11883,45 +11879,6 @@ static Vec3f D_80854814 = { 0.0f, 0.0f, 200.0f }; static f32 sWaterConveyorSpeeds[] = { 2.0f, 4.0f, 7.0f }; static f32 sFloorConveyorSpeeds[] = { 0.5f, 1.0f, 3.0f }; -void Player_UseTunicBoots(Player* this, PlayState* play) { - // Boots and tunics equip despite state - if ( - this->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD) || - this->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING - ) { - return; - } - - s32 i; - for (i = 0; i < ARRAY_COUNT(sItemButtons); i++) { - if (CHECK_BTN_ALL(sControlInput->press.button, sItemButtons[i])) { - break; - } - } - s32 item = Player_GetItemOnButton(play, i); - if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { - if (item >= ITEM_BOOTS_KOKIRI) { - u16 bootsValue = item - ITEM_BOOTS_KOKIRI + 1; - if (CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == bootsValue) { - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); - } else { - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, bootsValue); - } - Player_SetEquipmentData(play, this); - func_808328EC(this, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS : NA_SE_PL_CHANGE_ARMS); - } else { - u16 tunicValue = item - ITEM_TUNIC_KOKIRI + 1; - if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == tunicValue) { - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); - } else { - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, tunicValue); - } - Player_SetEquipmentData(play, this); - func_808328EC(this, NA_SE_PL_CHANGE_ARMS); - } - } -} - void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { s32 pad; @@ -12218,9 +12175,8 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { sUseHeldItem = sHeldItemButtonIsHeldDown = 0; sSavedCurrentMask = this->currentMask; - if (!(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC)) { + if (GameInteractor_Should(VB_EXECUTE_PLAYER_ACTION_FUNC, !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC), input)) { this->actionFunc(this, play); - Player_UseTunicBoots(this, play); } Player_UpdateCamAndSeqModes(play, this); From 40f2e16842b0179649334dc961fbfb60b52ff66c Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 4 Feb 2025 04:48:41 -0500 Subject: [PATCH 014/267] Macos game mode support (#4993) * Remove macos startup script and rework cpack bundling --------- Co-authored-by: Lars-Christian Selland * Add helper for creating mods folder --------- Co-authored-by: Lars-Christian Selland --------- Co-authored-by: Lars-Christian Selland --- CMake/Packaging-2.cmake | 1 - CMakeLists.txt | 5 ++++- soh/CMakeLists.txt | 4 ++-- soh/macosx/Info.plist.in | 5 +++++ soh/macosx/soh-macos.sh.in | 19 ------------------- soh/soh/OTRGlobals.cpp | 21 +++++++++++++++++++++ 6 files changed, 32 insertions(+), 23 deletions(-) delete mode 100755 soh/macosx/soh-macos.sh.in diff --git a/CMake/Packaging-2.cmake b/CMake/Packaging-2.cmake index 38fcc59f3..a29635eac 100644 --- a/CMake/Packaging-2.cmake +++ b/CMake/Packaging-2.cmake @@ -24,6 +24,5 @@ if (CPACK_GENERATOR MATCHES "Bundle") set(CPACK_BUNDLE_NAME "soh") set(CPACK_BUNDLE_PLIST "macosx/Info.plist") set(CPACK_BUNDLE_ICON "macosx/soh.icns") - set(CPACK_BUNDLE_STARTUP_COMMAND "macosx/soh-macos.sh") set(CPACK_BUNDLE_APPLE_CERT_APP "-") endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bdaf1de9..edbe5b44b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,9 +272,12 @@ install(DIRECTORY ${CMAKE_BINARY_DIR}/assets PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE} ) +# Rename the installed soh binary to drop the macos suffix +INSTALL(CODE "FILE(RENAME \${CMAKE_INSTALL_PREFIX}/../MacOS/soh-macos \${CMAKE_INSTALL_PREFIX}/../MacOS/soh)") + install(CODE " include(BundleUtilities) - fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/soh-macos\" \"\" \"${dirs}\") + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/../MacOS/soh\" \"\" \"${dirs}\") ") endif() diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 8218588e4..b4ee6ed7f 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -702,7 +702,7 @@ else() ) endif() -if(NOT CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") +if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|NintendoSwitch|CafeOS") INSTALL(TARGETS soh DESTINATION . COMPONENT ship) endif() @@ -720,7 +720,7 @@ execute_process(COMMAND ${CURL} -sSfL https://raw.githubusercontent.com/gabomdq/ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/macosx/Info.plist.in ${CMAKE_BINARY_DIR}/macosx/Info.plist @ONLY) -configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/macosx/soh-macos.sh.in ${CMAKE_BINARY_DIR}/macosx/soh-macos.sh @ONLY) +INSTALL(TARGETS soh DESTINATION ../MacOS COMPONENT ship) INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION ../MacOS COMPONENT ship) INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.otr DESTINATION ../Resources COMPONENT ship) elseif(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "NintendoSwitch|CafeOS") diff --git a/soh/macosx/Info.plist.in b/soh/macosx/Info.plist.in index 61316a18f..350c857f6 100644 --- a/soh/macosx/Info.plist.in +++ b/soh/macosx/Info.plist.in @@ -33,6 +33,11 @@ public.app-category.games LSMinimumSystemVersion 10.15 + LSEnvironment + + SHIP_HOME + ~/Library/Application Support/com.shipofharkinian.soh + LSArchitecturePriority arm64 diff --git a/soh/macosx/soh-macos.sh.in b/soh/macosx/soh-macos.sh.in deleted file mode 100755 index b90bd22e1..000000000 --- a/soh/macosx/soh-macos.sh.in +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -SNAME="$(dirname $0)" -export SHIP_HOME="$HOME/Library/Application Support/com.shipofharkinian.soh" -export SNAME -export RESPATH="${SNAME%/MacOS*}/Resources" -export LIBPATH="${SNAME%/MacOS*}/Frameworks" -export DYLD_FALLBACK_LIBRARY_PATH="$LIBPATH" - -if [ ! -e "$SHIP_HOME" ]; then mkdir "$SHIP_HOME"; fi - -if [ ! -e "$SHIP_HOME"/mods ]; then - mkdir -p "$SHIP_HOME"/mods - touch "$SHIP_HOME"/mods/custom_otr_files_go_here.txt -fi - -"$RESPATH"/soh-macos - -exit diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index c19b186db..d128c0eba 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1038,6 +1038,23 @@ bool PathTestCleanup(FILE* tfile) { return true; } +void CheckAndCreateModFolder() { + try { + std::string modsPath = Ship::Context::LocateFileAcrossAppDirs("mods", appShortName); + if (!std::filesystem::exists(modsPath)) { + // Create mods folder relative to app dir + modsPath = Ship::Context::GetPathRelativeToAppDirectory("mods", appShortName); + std::string filePath = modsPath + "/custom_mod_files_go_here.txt"; + if (std::filesystem::create_directories(modsPath)) { + std::ofstream(filePath).close(); + } + } + } catch (std::filesystem::filesystem_error const& ex) { + // Couldn't make the folder, continue silently + return; + } +} + extern "C" void InitOTR() { #ifdef __SWITCH__ @@ -1083,6 +1100,10 @@ extern "C" void InitOTR() { } #endif +#if not defined(__SWITCH__) && not defined(__WIIU__) + CheckAndCreateModFolder(); +#endif + CheckSoHOTRVersion(Ship::Context::GetPathRelativeToAppBundle("soh.otr")); if (!std::filesystem::exists(Ship::Context::LocateFileAcrossAppDirs("oot-mq.otr", appShortName)) && From e44877cca87b17a23b6018cf9bf9321e77e066e7 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:49:31 -0800 Subject: [PATCH 015/267] implement RemoveSpinAttackDarkness using shipinit and custom update func (#4987) Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> --- .../Enhancements/RemoveSpinAttackDarkness.cpp | 36 +++++++++++++++++++ soh/soh/SohGui/SohMenuBar.cpp | 2 ++ 2 files changed, 38 insertions(+) create mode 100644 soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp diff --git a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp new file mode 100644 index 000000000..20beb193a --- /dev/null +++ b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp @@ -0,0 +1,36 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.h" +} + +void Custom_EnMThunder_Update(Actor* thisx, PlayState* play) { + EnMThunder* enMThunder = (EnMThunder*)thisx; + f32 blueRadius; + s32 redGreen; + + enMThunder->actionFunc(enMThunder, play); + // don't call this part, it's what makes the spin attack darkness happen + // func_80A9F314(play, this->unk_1BC); + blueRadius = enMThunder->unk_1AC; + redGreen = (u32)(blueRadius * 255.0f) & 0xFF; + Lights_PointNoGlowSetInfo(&enMThunder->lightInfo, enMThunder->actor.world.pos.x, enMThunder->actor.world.pos.y, + enMThunder->actor.world.pos.z, redGreen, redGreen, (u32)(blueRadius * 100.0f), + (s32)(blueRadius * 800.0f)); +} + +void OnEnMThunderInitReplaceUpdateWithCustom(void* thunder) { + EnMThunder* enMThunder = (EnMThunder*)thunder; + enMThunder->actor.update = Custom_EnMThunder_Update; +} + +#define CVAR_REMOVESPINATTACKDARKNESS_NAME CVAR_ENHANCEMENT("RemoveSpinAttackDarkness") +#define CVAR_REMOVESPINATTACKDARKNESS_DEFAULT 0 +#define CVAR_REMOVESPINATTACKDARKNESS_VALUE CVarGetInteger(CVAR_REMOVESPINATTACKDARKNESS_NAME, CVAR_REMOVESPINATTACKDARKNESS_DEFAULT) + +void RegisterCustomEnMThunderUpdate() { + COND_ID_HOOK(OnActorInit, ACTOR_EN_M_THUNDER, CVAR_REMOVESPINATTACKDARKNESS_VALUE != CVAR_REMOVESPINATTACKDARKNESS_DEFAULT, OnEnMThunderInitReplaceUpdateWithCustom); +} + +static RegisterShipInitFunc initFunc(RegisterCustomEnMThunderUpdate, { CVAR_REMOVESPINATTACKDARKNESS_NAME }); diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index e5e52c71d..f1c86bc69 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -1460,6 +1460,8 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Shows what items you have collected in the file select screen, like in N64 randomizer"); UIWidgets::PaddedEnhancementCheckbox("Better ammo rendering in pause menu", CVAR_ENHANCEMENT("BetterAmmoRendering"), true, false); UIWidgets::Tooltip("Ammo counts in the pause menu will work correctly regardless of the position of items in the inventory"); + UIWidgets::PaddedEnhancementCheckbox("Remove spin attack darkness", CVAR_ENHANCEMENT("RemoveSpinAttackDarkness"), true, false); + UIWidgets::Tooltip("Remove the darkness that appears when charging a spin attack"); ImGui::EndMenu(); } From 811ffa5e98a4833153f4b897379d11be8c8e75e7 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Tue, 4 Feb 2025 02:32:44 -0800 Subject: [PATCH 016/267] fix rainbow all (#4991) --- soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 0bdd3d10d..c07abd646 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -1969,6 +1969,7 @@ void CosmeticsEditorWindow::DrawElement() { ) ) { CVarSetInteger(cosmeticOption.rainbowCvar, 1); + CVarSetInteger(cosmeticOption.changedCvar, 1); } } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); From b2cb3ff87d0cfbe0e5bcd85cf16e4130d89a7aae Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 4 Feb 2025 15:08:28 +0100 Subject: [PATCH 017/267] Unlock locked interior doors with overworld keys enabled (#4948) * Update LockOverworldDoors.cpp * Remove key logic from interiors * Fix entrances, this time while awake --- .../randomizer/LockOverworldDoors.cpp | 26 +------------------ .../location_access/overworld/graveyard.cpp | 4 +-- .../location_access/overworld/kakariko.cpp | 14 +++++----- .../location_access/overworld/lake_hylia.cpp | 6 ++--- .../overworld/lon_lon_ranch.cpp | 8 +++--- .../location_access/overworld/market.cpp | 14 +++++----- 6 files changed, 24 insertions(+), 48 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp index b8b8f4731..96bb9823c 100644 --- a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -16,7 +16,6 @@ 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 }, @@ -25,22 +24,16 @@ std::map lookupTable = { {{ 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 @@ -51,35 +44,23 @@ std::map lookupTable = { {{ 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) { @@ -88,12 +69,7 @@ static void OnDoorInit(void* actorRef) { 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; - } + 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) { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 727431b1f..87a2e3b48 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -104,7 +104,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_DAMPE_HINT, logic->IsAdult), }, { //Exits - Entrance(RR_THE_GRAVEYARD, []{return logic->CanOpenOverworldDoor(RG_DAMPES_HUT_KEY);}), + Entrance(RR_THE_GRAVEYARD, []{return true;}), }); areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", "Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { @@ -120,4 +120,4 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_GY_SHADOW_FIRE_ARROWS) && logic->IsAdult && logic->CanUse(RG_FIRE_ARROWS));}), }); -} \ No newline at end of file +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 8fe55c45f..aff90914e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -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 logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}), + Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_SKULLTULA_HOUSE_KEY);}), + Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_IMPAS_HOUSE_KEY);}), + Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}), + Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}), + Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}), + Entrance(RR_KAK_BACKYARD, []{return true;}), }); areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", "Kak Redead Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -239,4 +239,4 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->DrainWell;}), Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, []{return logic->IsChild || (logic->DrainWell && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}), }); -} \ No newline at end of file +} 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 8833441e9..447d039d2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -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 logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}), + Entrance(RR_LAKE_HYLIA, []{return true;}), }); // 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 logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), + Entrance(RR_LH_FISHING_ISLAND, []{return true;}), }); areaTable[RR_LH_GROTTO] = Region("LH Grotto", "LH Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -128,4 +128,4 @@ void RegionTable_Init_LakeHylia() { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); -} \ No newline at end of file +} 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 fa1d7451e..283150415 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 @@ -39,7 +39,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_TALONS_HOUSE_POT_3, logic->CanBreakPots()), }, { //Exits - Entrance(RR_LON_LON_RANCH, []{return logic->CanOpenOverworldDoor(RG_TALONS_HOUSE_KEY);}), + Entrance(RR_LON_LON_RANCH, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_STABLES_KEY);}), + Entrance(RR_LON_LON_RANCH, []{return true;}), }); 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 logic->CanOpenOverworldDoor(RG_BACK_TOWER_KEY);}), + Entrance(RR_LON_LON_RANCH, []{return true;}), }); areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", "LLR Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -71,4 +71,4 @@ void RegionTable_Init_LonLonRanch() { //Exits Entrance(RR_LON_LON_RANCH, []{return true;}), }); -} \ No newline at end of file +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index e0ef67aa5..0b010c8a7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -98,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 logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), + Entrance(RR_MARKET_ENTRANCE, []{return true;}), }); areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -133,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 logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}), + Entrance(RR_THE_MARKET, []{return true;}), }); areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, { @@ -145,7 +145,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, logic->CouldPlayBowling && logic->BombchusEnabled()), }, { //Exits - Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_BOMBCHU_BOWLING_KEY);}), + Entrance(RR_THE_MARKET, []{return true;}), }); areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -179,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 logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}), + Entrance(RR_THE_MARKET, []{return true;}), }); areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -202,7 +202,7 @@ void RegionTable_Init_Market() { LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), }, { //Exits - Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_RICHARDS_HOUSE_KEY);}), + Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", "Market Man in Green House", {}, NO_DAY_NIGHT_CYCLE, {}, { @@ -212,6 +212,6 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_3, logic->CanBreakPots()), }, { //Exits - Entrance(RR_MARKET_BACK_ALLEY, []{return logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), + Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); -} \ No newline at end of file +} From 3cd4851474ae7d28bb0de627ac51b884c83965fb Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 4 Feb 2025 18:03:35 -0500 Subject: [PATCH 018/267] Defer scene DList resource loading to in-game and support alt pathing (#4986) * Defer scene dlist resource loading to in-game and support alt pathing * feedback --- .../importer/scenecommand/SetMeshFactory.cpp | 137 +++++++++++------- 1 file changed, 82 insertions(+), 55 deletions(-) diff --git a/soh/soh/resource/importer/scenecommand/SetMeshFactory.cpp b/soh/soh/resource/importer/scenecommand/SetMeshFactory.cpp index cdca68f34..b53a36b85 100644 --- a/soh/soh/resource/importer/scenecommand/SetMeshFactory.cpp +++ b/soh/soh/resource/importer/scenecommand/SetMeshFactory.cpp @@ -36,30 +36,38 @@ SetMeshFactory::ReadResource(std::shared_ptr initData, s for (int32_t i = 0; i < polyNum; i++) { if (setMesh->meshHeader.base.type == 0) { PolygonDlist dlist; + dlist.opa = nullptr; + dlist.xlu = nullptr; int32_t polyType = reader->ReadInt8(); // Unused std::string meshOpa = reader->ReadString(); std::string meshXlu = reader->ReadString(); - auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str()); - auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str()); - dlist.opa = meshOpa != "" ? (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr) : 0; - dlist.xlu = meshXlu != "" ? (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr) : 0; + // Enables alt-toggling support by setting maintained c_str references to DList resource after pushing to vector the first + // Defers resource loading later in game when the scene is drawn + if (meshOpa != "") { + meshOpa = "__OTR__" + meshOpa; + setMesh->opaPaths.push_back(meshOpa); + dlist.opa = (Gfx*)setMesh->opaPaths.back().c_str(); + } + if (meshXlu != "") { + meshXlu = "__OTR__" + meshXlu; + setMesh->xluPaths.push_back(meshXlu); + dlist.xlu = (Gfx*)setMesh->xluPaths.back().c_str(); + } - setMesh->opaPaths.push_back(meshOpa); - setMesh->xluPaths.push_back(meshXlu); setMesh->dlists.push_back(dlist); } else if (setMesh->meshHeader.base.type == 1) { PolygonDlist pType; + pType.opa = nullptr; + pType.xlu = nullptr; setMesh->meshHeader.polygon1.format = reader->ReadUByte(); - std::string imgOpa = reader->ReadString(); - std::string imgXlu = reader->ReadString(); - auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(imgOpa.c_str()); - auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(imgXlu.c_str()); - pType.opa = imgOpa != "" ? (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr) : 0; - pType.xlu = imgXlu != "" ? (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr) : 0; + // These strings are the same that are read and used below. Not sure why they get exported twice from the exporter. + // We read and ignore these to advance the reader. + reader->ReadString(); + reader->ReadString(); int32_t bgImageCount = reader->ReadUInt32(); setMesh->images.reserve(bgImageCount); @@ -104,17 +112,24 @@ SetMeshFactory::ReadResource(std::shared_ptr initData, s std::string meshOpa = reader->ReadString(); std::string meshXlu = reader->ReadString(); - opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str()); - xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str()); - pType.opa = meshOpa != "" ? (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr) : 0; - pType.xlu = meshXlu != "" ? (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr) : 0; + // Use long-lived maintained c_str references + if (meshOpa != "") { + meshOpa = "__OTR__" + meshOpa; + setMesh->opaPaths.push_back(meshOpa); + pType.opa = (Gfx*)setMesh->opaPaths.back().c_str(); + } + if (meshXlu != "") { + meshXlu = "__OTR__" + meshXlu; + setMesh->xluPaths.push_back(meshXlu); + pType.xlu = (Gfx*)setMesh->xluPaths.back().c_str(); + } - setMesh->opaPaths.push_back(meshOpa); - setMesh->xluPaths.push_back(meshXlu); setMesh->dlists.push_back(pType); } else if (setMesh->meshHeader.base.type == 2) { PolygonDlist2 dlist; - + dlist.opa = nullptr; + dlist.xlu = nullptr; + int32_t polyType = reader->ReadInt8(); // Unused dlist.pos.x = reader->ReadInt16(); dlist.pos.y = reader->ReadInt16(); @@ -124,13 +139,18 @@ SetMeshFactory::ReadResource(std::shared_ptr initData, s std::string meshOpa = reader->ReadString(); std::string meshXlu = reader->ReadString(); - auto opaRes = meshOpa != "" ? Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str()) : nullptr; - auto xluRes = meshXlu != "" ? Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str()) : nullptr; - dlist.opa = (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr); - dlist.xlu = (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr); + // Use long-lived maintained c_str references + if (meshOpa != "") { + meshOpa = "__OTR__" + meshOpa; + setMesh->opaPaths.push_back(meshOpa); + dlist.opa = (Gfx*)setMesh->opaPaths.back().c_str(); + } + if (meshXlu != "") { + meshXlu = "__OTR__" + meshXlu; + setMesh->xluPaths.push_back(meshXlu); + dlist.xlu = (Gfx*)setMesh->xluPaths.back().c_str(); + } - setMesh->opaPaths.push_back(meshOpa); - setMesh->xluPaths.push_back(meshXlu); setMesh->dlists2.push_back(dlist); } else { SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", setMesh->meshHeader.base.type); @@ -194,38 +214,33 @@ std::shared_ptr SetMeshFactoryXML::ReadResource(std::shared_ptr if (setMesh->meshHeader.base.type == 0) { PolygonDlist dlist; + dlist.opa = nullptr; + dlist.xlu = nullptr; int32_t polyType = child->IntAttribute("PolyType"); // Unused std::string meshOpa = child->Attribute("MeshOpa"); std::string meshXlu = child->Attribute("MeshXlu"); + + // Enables alt-toggling support by setting maintained c_str references to DList resource after pushing to vector the first + // Defers resource loading later in game when the scene is drawn if (meshOpa != "") { - auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str()); - dlist.opa = (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr); - } else { - dlist.opa = 0; + meshOpa = "__OTR__" + meshOpa; + setMesh->opaPaths.push_back(meshOpa); + dlist.opa = (Gfx*)setMesh->opaPaths.back().c_str(); } - if (meshXlu != "") { - auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str()); - dlist.xlu = (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr); - } else { - dlist.xlu = 0; + meshXlu = "__OTR__" + meshXlu; + setMesh->xluPaths.push_back(meshXlu); + dlist.xlu = (Gfx*)setMesh->xluPaths.back().c_str(); } - setMesh->opaPaths.push_back(meshOpa); - setMesh->xluPaths.push_back(meshXlu); setMesh->dlists.push_back(dlist); } else if (setMesh->meshHeader.base.type == 1) { PolygonDlist pType; + pType.opa = nullptr; + pType.xlu = nullptr; setMesh->meshHeader.polygon1.format = child->IntAttribute("Format"); - std::string imgOpa = child->Attribute("ImgOpa"); - std::string imgXlu = child->Attribute("ImgXlu"); - - auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(imgOpa.c_str()); - auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(imgXlu.c_str()); - pType.opa = imgOpa != "" ? (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr) : 0; - pType.xlu = imgXlu != "" ? (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr) : 0; int32_t bgImageCount = child->IntAttribute("BgImageCount"); setMesh->images.reserve(bgImageCount); @@ -279,16 +294,23 @@ std::shared_ptr SetMeshFactoryXML::ReadResource(std::shared_ptr std::string meshOpa = child->Attribute("MeshOpa"); std::string meshXlu = child->Attribute("MeshXlu"); - opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str()); - xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str()); - pType.opa = meshOpa != "" ? (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr) : 0; - pType.xlu = meshXlu != "" ? (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr) : 0; + // Use long-lived maintained c_str references + if (meshOpa != "") { + meshOpa = "__OTR__" + meshOpa; + setMesh->opaPaths.push_back(meshOpa); + pType.opa = (Gfx*)setMesh->opaPaths.back().c_str(); + } + if (meshXlu != "") { + meshXlu = "__OTR__" + meshXlu; + setMesh->xluPaths.push_back(meshXlu); + pType.xlu = (Gfx*)setMesh->xluPaths.back().c_str(); + } - setMesh->opaPaths.push_back(meshOpa); - setMesh->xluPaths.push_back(meshXlu); setMesh->dlists.push_back(pType); } else if (setMesh->meshHeader.base.type == 2) { PolygonDlist2 dlist; + dlist.opa = nullptr; + dlist.xlu = nullptr; int32_t polyType = child->IntAttribute("PolyType"); // Unused dlist.pos.x = child->IntAttribute("PosX"); @@ -299,13 +321,18 @@ std::shared_ptr SetMeshFactoryXML::ReadResource(std::shared_ptr std::string meshOpa = child->Attribute("MeshOpa"); std::string meshXlu = child->Attribute("MeshXlu"); - auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str()); - auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str()); - dlist.opa = meshOpa != "" ? (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr) : 0; - dlist.xlu = meshXlu != "" ? (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr) : 0; + // Use long-lived maintained c_str references + if (meshOpa != "") { + meshOpa = "__OTR__" + meshOpa; + setMesh->opaPaths.push_back(meshOpa); + dlist.opa = (Gfx*)setMesh->opaPaths.back().c_str(); + } + if (meshXlu != "") { + meshXlu = "__OTR__" + meshXlu; + setMesh->xluPaths.push_back(meshXlu); + dlist.xlu = (Gfx*)setMesh->xluPaths.back().c_str(); + } - setMesh->opaPaths.push_back(meshOpa); - setMesh->xluPaths.push_back(meshXlu); setMesh->dlists2.push_back(dlist); } else { SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", setMesh->meshHeader.base.type); From 4044ab34c302ff101f3b439f41c93b1c92ed9dbb Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 5 Feb 2025 16:11:48 -0700 Subject: [PATCH 019/267] Add Fortress and Colossus entrance groups to the entrance tracker data, and adjusted the check tracker accordingly (for autoscroll). (#5001) --- .../randomizer/randomizer_check_tracker.cpp | 4 +- .../randomizer_entrance_tracker.cpp | 54 ++++++++++--------- .../randomizer/randomizer_entrance_tracker.h | 2 + 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 51abc0db1..0b5178621 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -381,7 +381,9 @@ RandomizerCheckArea AreaFromEntranceGroup[] = { RCAREA_LON_LON_RANCH, RCAREA_LAKE_HYLIA, RCAREA_GERUDO_VALLEY, + RCAREA_GERUDO_FORTRESS, RCAREA_WASTELAND, + RCAREA_DESERT_COLOSSUS, RCAREA_MARKET, RCAREA_HYRULE_CASTLE, }; @@ -394,8 +396,6 @@ RandomizerCheckArea GetCheckArea() { if (ent != nullptr && !IsAreaScene(scene) && ent->type != ENTRANCE_TYPE_DUNGEON) { if (ent->source == "Desert Colossus" || ent->destination == "Desert Colossus") { area = RCAREA_DESERT_COLOSSUS; - } else if (ent->source == "Gerudo Fortress" || ent->destination == "Gerudo Fortress") { - area = RCAREA_GERUDO_FORTRESS; } else { area = AreaFromEntranceGroup[ent->dstGroup]; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 78de199d7..4c3cb971e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -56,7 +56,9 @@ static std::string spoilerEntranceGroupNames[] = { "Lon Lon Ranch", "Lake Hylia", "Gerudo Valley", + "Gerudo Fortress", "Haunted Wasteland", + "Desert Colossus", "Market", "Hyrule Castle", }; @@ -310,35 +312,35 @@ const EntranceData entranceData[] = { { 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 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 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 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"}, + { 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_FORTRESS, ENTRANCE_TYPE_OVERWORLD, ""}, + { 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 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_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"}, + { 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_FORTRESS, ENTRANCE_GROUP_GERUDO_VALLEY, ENTRANCE_TYPE_OVERWORLD, ""}, + { 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_FORTRESS, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_OVERWORLD, ""}, + { 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_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, "", 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_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON, "gtg", 1}, + { 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_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_GROTTO, ""}, + { 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_FORTRESS, ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_TYPE_DUNGEON, "gtg"}, // The Wasteland - { 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_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_FORTRESS, ENTRANCE_TYPE_OVERWORLD, "hw,gf"}, { 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 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 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 Blue Warp", "Spirit Temple Blue Warp", ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_GROUP_HAUNTED_WASTELAND, ENTRANCE_TYPE_ONE_WAY, "bw", 1}, + { 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_DESERT_COLOSSUS, 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 Entry", "Colossus Great Fairy Fountain", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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 Entry", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_TYPE_DUNGEON, "", 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_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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"}, diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h index 6e6a35ed6..ef217b7f0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h @@ -25,7 +25,9 @@ typedef enum { ENTRANCE_GROUP_LON_LON_RANCH, ENTRANCE_GROUP_LAKE_HYLIA, ENTRANCE_GROUP_GERUDO_VALLEY, + ENTRANCE_GROUP_GERUDO_FORTRESS, ENTRANCE_GROUP_HAUNTED_WASTELAND, + ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_MARKET, ENTRANCE_GROUP_HYRULE_CASTLE, SPOILER_ENTRANCE_GROUP_COUNT, From eafe7f0b04f58560dc857d97cf7bc3a0ab5531f9 Mon Sep 17 00:00:00 2001 From: Archez Date: Thu, 6 Feb 2025 10:33:41 -0500 Subject: [PATCH 020/267] Fix save warping in links house with entrance rando (#5009) * Fix save warping in links house with entrance rando * account for interrior shuffle all --- soh/soh/Enhancements/randomizer/randomizer_entrance.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 14d630005..fdb1f6809 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -393,8 +393,11 @@ void Entrance_SetSavewarpEntrance(void) { gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieve's Hideout spawn 0 - } else if (scene == SCENE_LINKS_HOUSE) { - gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_LINKS_HOUSE_CHILD_SPAWN); + } else if (scene == SCENE_LINKS_HOUSE && + Randomizer_GetSettingValue(RSK_SHUFFLE_INTERIOR_ENTRANCES) != RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) { + // Save warping in Link's house keeps the player there if Link's house not shuffled, + // otherwise fallback to regular spawns + gSaveContext.entranceIndex = ENTR_LINKS_HOUSE_CHILD_SPAWN; } else if (CVarGetInteger(CVAR_ENHANCEMENT("RememberSaveLocation"), 0) && scene != SCENE_FAIRYS_FOUNTAIN && scene != SCENE_GROTTOS && gSaveContext.entranceIndex != ENTR_LOAD_OPENING) { // Use the saved entrance value with remember save location, except when in grottos/fairy fountains or if From f2a3ac1740dfb1c4c0f9c7ef738992ee21656ff2 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 6 Feb 2025 17:40:38 -0500 Subject: [PATCH 021/267] Fix enabledTricks getting incorrectly logged. (#5012) --- soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index d78f1ef90..da4c3eb43 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -187,7 +187,7 @@ static void WriteEnabledTricks() { auto ctx = Rando::Context::GetInstance(); for (const auto& setting : Rando::Settings::GetInstance()->GetOptionGroup(RSG_TRICKS).GetOptions()) { - if (ctx->GetOption(setting->GetKey()).IsNot(RO_GENERIC_ON)) { + if (ctx->GetTrickOption(static_cast(setting->GetKey())).IsNot(RO_GENERIC_ON)) { continue; } jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); From ca0617b035923e001acf0f6583e720e36dca1174 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Thu, 6 Feb 2025 18:47:06 -0800 Subject: [PATCH 022/267] add some documentation to `RegisterShipInitFunc` (#4995) --- soh/soh/ShipInit.hpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/soh/soh/ShipInit.hpp b/soh/soh/ShipInit.hpp index b7612eb06..b5351cdc0 100644 --- a/soh/soh/ShipInit.hpp +++ b/soh/soh/ShipInit.hpp @@ -26,6 +26,37 @@ struct ShipInit { } }; +/** + * @brief Register a function to execute on boot and (optionally) in other situations + * + * @param initFunc The function to execute + * @param updatePaths Strings to specify additional situations in which to execute the function + * + * ### Examples: + * + * #### Execute function `bar` on boot + * + * ```cpp + * static RegisterShipInitFunc foo(bar); + * ``` + * + * #### Execute function `bar` on boot and when the CVar `baz` might have changed + * + * ```cpp + * static RegisterShipInitFunc foo(bar, { "baz" }); + * ``` + * + * #### Execute function `bar` on boot and when `IS_RANDO` might have changed + * + * ```cpp + * static RegisterShipInitFunc foo(bar, { "IS_RANDO" }); + * ``` + * + * ### Additional Information: + * + * To get a better sense of when your function will be executed + * you can look for `ShipInit::Init` calls throughout the codebase + */ struct RegisterShipInitFunc { RegisterShipInitFunc(std::function initFunc, const std::set& updatePaths = {}) { auto& shipInitFuncs = ShipInit::GetAll(); From 2400ad1d6869487046da4411db780702b094eaa1 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 6 Feb 2025 22:30:23 -0500 Subject: [PATCH 023/267] Start splitting Location List into ShipInit functions (#5011) * Move fairy checks to separate file * Moves pot locations to ShipInit function * Move Freestanding locations to a ShipInit function * Remove some extra newlines that were pasted in * Move fish locations to ShipInit function * Remove ON_BOOT, as it's not really necessary * Fix weird spacing --- .../randomizer/ShuffleFairies.cpp | 227 +++- .../Enhancements/randomizer/ShuffleFairies.h | 2 +- .../randomizer/ShuffleFreestanding.cpp | 235 ++++ .../Enhancements/randomizer/ShufflePots.cpp | 553 +++++++++ .../Enhancements/randomizer/fishsanity.cpp | 55 + .../Enhancements/randomizer/location_list.cpp | 1068 +---------------- soh/soh/Enhancements/randomizer/static_data.h | 5 + soh/soh/OTRGlobals.cpp | 4 +- 8 files changed, 1083 insertions(+), 1066 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index f9cd16c4d..c2416c95a 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -7,6 +7,7 @@ #include "src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h" #include "../../OTRGlobals.h" #include "../../cvar_prefixes.h" +#include "static_data.h" #define FAIRY_FLAG_TIMED (1 << 8) @@ -179,4 +180,228 @@ void ShuffleFairies_UnregisterHooks() { GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); onVanillaBehaviorHook = 0; -} \ No newline at end of file +} + +void Rando::StaticData::RegisterFairyLocations() { + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", "SFM Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", "SFM Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", "SFM Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, "Grotto Fairy 4", "SFM Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, "Grotto Fairy 5", "SFM Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, "Grotto Fairy 6", "SFM Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, "Grotto Fairy 7", "SFM Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, "Grotto Fairy 8", "SFM Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, "Grotto Fairy 1", "ZR Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, "Grotto Fairy 2", "ZR Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, "Grotto Fairy 3", "ZR Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, "Grotto Fairy 4", "ZR Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, "Grotto Fairy 5", "ZR Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, "Grotto Fairy 6", "ZR Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, "Grotto Fairy 7", "ZR Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, "Grotto Fairy 8", "ZR Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, "Grotto Fairy 1", "HF Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, "Grotto Fairy 2", "HF Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, "Grotto Fairy 3", "HF Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, "Grotto Fairy 4", "HF Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, "Grotto Fairy 5", "HF Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, "Grotto Fairy 6", "HF Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, "Grotto Fairy 7", "HF Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, "Grotto Fairy 8", "HF Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, "Grotto Fairy 1", "ZD Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, "Grotto Fairy 2", "ZD Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, "Grotto Fairy 3", "ZD Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, "Grotto Fairy 4", "ZD Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, "Grotto Fairy 5", "ZD Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, "Grotto Fairy 6", "ZD Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, "Grotto Fairy 7", "ZD Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, "Grotto Fairy 8", "ZD Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, "Grotto Fairy 1", "GF Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, "Grotto Fairy 2", "GF Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, "Grotto Fairy 3", "GF Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, "Grotto Fairy 4", "GF Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, "Grotto Fairy 5", "GF Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, "Grotto Fairy 6", "GF Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, "Grotto Fairy 7", "GF Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, "Grotto Fairy 8", "GF Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8)); + + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, "Shield Grave Fairy 1", "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, "Shield Grave Fairy 2", "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, "Shield Grave Fairy 3", "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, "Shield Grave Fairy 4", "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, "Shield Grave Fairy 5", "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, "Shield Grave Fairy 6", "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, "Shield Grave Fairy 7", "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, "Shield Grave Fairy 8", "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "Scrubs Fairy 1", "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "Scrubs Fairy 2", "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "Scrubs Fairy 3", "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "Scrubs Fairy 4", "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "Scrubs Fairy 5", "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "Scrubs Fairy 6", "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "Scrubs Fairy 7", "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "Scrubs Fairy 8", "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "MQ Scrubs Fairy 1", "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "MQ Scrubs Fairy 2", "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "MQ Scrubs Fairy 3", "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "MQ Scrubs Fairy 4", "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "MQ Scrubs Fairy 5", "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "MQ Scrubs Fairy 6", "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "MQ Scrubs Fairy 7", "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "MQ Scrubs Fairy 8", "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, "Oasis Fairy 1", "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_1)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, "Oasis Fairy 2", "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_2)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, "Oasis Fairy 3", "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_3)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, "Oasis Fairy 4", "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_4)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, "Oasis Fairy 5", "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_5)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, "Oasis Fairy 6", "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_6)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, "Oasis Fairy 7", "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_7)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, "Oasis Fairy 8", "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_8)); + + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, "Bean Sprout Fairy 1", "ZR Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, "Bean Sprout Fairy 2", "ZR Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, "Bean Sprout Fairy 3", "ZR Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, "Bean Sprout Fairy 1", "KF Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, "Bean Sprout Fairy 2", "KF Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, "Bean Sprout Fairy 3", "KF Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, "Bean Sprout Near Bridge Fairy 1", "LW Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, "Bean Sprout Near Bridge Fairy 2", "LW Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, "Bean Sprout Near Bridge Fairy 3", "LW Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, "Bean Sprout Near Theatre Fairy 1", "LW Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, "Bean Sprout Near Theatre Fairy 2", "LW Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, "Bean Sprout Near Theatre Fairy 3", "LW Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, "Bean Sprout Fairy 1", "LH Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, "Bean Sprout Fairy 2", "LH Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, "Bean Sprout Fairy 3", "LH Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, "Bean Sprout Fairy 1", "GV Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, "Bean Sprout Fairy 2", "GV Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, "Bean Sprout Fairy 3", "GV Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, "Bean Sprout Fairy 1", "Col Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, "Bean Sprout Fairy 2", "Col Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, "Bean Sprout Fairy 3", "Col Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, "Bean Sprout Fairy 1", "GY Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, "Bean Sprout Fairy 2", "GY Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, "Bean Sprout Fairy 3", "GY Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, "Bean Sprout Fairy 1", "DMC Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, "Bean Sprout Fairy 2", "DMC Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, "Bean Sprout Fairy 3", "DMC Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, "Bean Sprout Fairy 1", "DMT Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, "Bean Sprout Fairy 2", "DMT Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, "Bean Sprout Fairy 3", "DMT Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3)); + + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), "ToT Left Gossip Stone Fairy", "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), "ToT Left Gossip Stone Big Fairy", "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), "ToT Left Center Gossip Stone Fairy", "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), "ToT Left Center Gossip Stone Big Fairy", "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), "ToT Right Center Gossip Stone Fairy", "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), "ToT Right Center Gossip Stone Big Fairy", "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), "ToT Right Gossip Stone Fairy", "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), "ToT Right Gossip Stone Big Fairy", "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), "Gossip Stone Fairy", "DMC Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), "Gossip Stone Big Fairy", "DMC Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), "Gossip Stone Fairy", "DMT Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), "Gossip Stone Big Fairy", "DMT Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), "Gossip Stone Fairy", "Col Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY)); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), "Gossip Stone Big Fairy", "Col Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), "Gossip Stone Fairy", "DC Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY)); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), "Gossip Stone Big Fairy", "DC Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), "MQ Gossip Stone Fairy", "DC MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY)); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), "MQ Gossip Stone Big Fairy", "DC MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), "Gossip Stone Fairy", "GV Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY)); + locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), "Gossip Stone Big Fairy", "GV Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), "Maze Gossip Stone Fairy", "GC Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY)); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), "Maze Gossip Stone Big Fairy", "GC Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), "Medigoron Gossip Stone Fairy", "GC Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY)); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), "Medigoron Gossip Stone Big Fairy", "GC Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), "Gossip Stone Fairy", "GY Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY)); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), "Gossip Stone Big Fairy", "GY Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), "Malon Gossip Stone Fairy", "HC Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), "Malon Gossip Stone Big Fairy", "HC Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), "Rock Wall Gossip Stone Fairy", "HC Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), "Rock Wall Gossip Stone Big Fairy", "HC Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), "Storms Grotto Gossip Stone Fairy", "HC Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), "Storms Grotto Gossip Stone Big Fairy", "HC Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), "Deku Tree Left Gossip Stone Fairy", "KF Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), "Deku Tree Left Gossip Stone Big Fairy", "KF Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), "Deku Tree Right Gossip Stone Fairy", "KF Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), "Deku Tree Right Gossip Stone Big Fairy", "KF Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), "Gossip Stone Fairy", "KF Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), "Gossip Stone Big Fairy", "KF Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), "Storms Gossip Stone Fairy", "KF Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), "Storms Gossip Stone Big Fairy", "KF Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), "Lab Gossip Stone Fairy", "LH Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), "Lab Gossip Stone Big Fairy", "LH Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), "Southeast Gossip Stone Fairy", "LH Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), "Southeast Gossip Stone Big Fairy", "LH Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), "Southwest Gossip Stone Fairy", "LH Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), "Southwest Gossip Stone Big Fairy", "LH Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), "Gossip Stone Fairy", "LW Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY)); + locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), "Gossip Stone Big Fairy", "LW Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), "Maze Lower Gossip Stone Fairy", "SFM Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), "Maze Lower Gossip Stone Big Fairy", "SFM Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), "Maze Upper Gossip Stone Fairy", "SFM Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), "Maze Upper Gossip Stone Big Fairy", "SFM Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), "Saria Gossip Stone Fairy", "SFM Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), "Saria Gossip Stone Big Fairy", "SFM Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), "Gossip Stone Fairy", "ZD Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), "Gossip Stone Big Fairy", "ZD Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), "Fairy Gossip Stone Fairy", "ZF Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), "Fairy Gossip Stone Big Fairy", "ZF Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), "Jabu Gossip Stone Fairy", "ZF Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), "Jabu Gossip Stone Big Fairy", "ZF Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), "Near Grottos Gossip Stone Fairy", "ZR Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), "Near Grottos Gossip Stone Big Fairy", "ZR Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), "Near Domain Gossip Stone Fairy", "ZR Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), "Near Domain Gossip Stone Big Fairy", "ZR Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), "Cow Grotto Gossip Stone Fairy", "HF Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), "Cow Grotto Gossip Stone Big Fairy", "HF Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), "Near Market Gossip Stone Fairy", "HF Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), "Near Market Gossip Stone Big Fairy", "HF Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), "Southeast Gossip Stone Fairy", "HF Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), "Southeast Gossip Stone Big Fairy", "HF Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), "Open Grotto Gossip Stone Fairy", "HF Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), "Open Grotto Gossip Stone Big Fairy", "HF Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), "Open Grotto Gossip Stone Fairy", "Kak Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), "Open Grotto Gossip Stone Big Fairy", "Kak Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), "Open Grotto Gossip Stone Fairy", "ZR Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), "Open Grotto Gossip Stone Big Fairy", "ZR Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), "Near Shortcuts Gossip Stone Fairy", "LW Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), "Near Shortcuts Gossip Stone Big Fairy", "LW Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), "Storms Grotto Gossip Stone Fairy", "DMT Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), "Storms Grotto Gossip Stone Big Fairy", "DMT Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), "Upper Grotto Gossip Stone Fairy", "DMC Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), "Upper Grotto Gossip Stone Big Fairy", "DMC Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + + locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), "Island Sun's Song Fairy", "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_SUN_FAIRY)); + 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)); + locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), "Beamos Song of Storms Fairy", "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), "Pit Room Song of Storms Fairy", "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "Wind Hint Sun's Song Fairy", "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), "Basement Sun's Song Fairy", "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY)); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), "Entrance Song of Storms Fairy", "Ice Cavern Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY)); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_GERUDO_TRAINING_GROUND,SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), "Entrance Song of Storms Fairy", "GTG Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), "Spirit Trial Beamos Sun's Song Fairy", "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY)); + + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), "MQ Lower Loop Stalfos Room Sun's Song Fairy", "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY)); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), "MQ Before Dark Link Pilar Sun's Song Fairy", "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), "MQ Before Dark Link Left Song of Storms Fairy", "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), "MQ Before Dark Link Right Sun's Song Fairy", "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY)); + locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "MQ Dinalfos Room Sun's Song Fairy", "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), "MQ Beamos Song of Storms Fairy", "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), "MQ Pit Room Song of Storms Fairy", "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); +} + +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.h b/soh/soh/Enhancements/randomizer/ShuffleFairies.h index f10537ae1..9fcd9ba52 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.h +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.h @@ -10,4 +10,4 @@ typedef struct FairyIdentity { } FairyIdentity; void ShuffleFairies_RegisterHooks(); -void ShuffleFairies_UnregisterHooks(); +void ShuffleFairies_UnregisterHooks(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index 7bf67b55d..c35cab107 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -43,3 +43,238 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh *should = false; } } + +void Rando::StaticData::RegisterFreestandingLocations() { + locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2)); + locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1009, 1556), "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_1)); + locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(2, -45), "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BRIDGE_RUPEE)); + locationTable[RC_KF_BEHIND_MIDOS_RUPEE] = Location::Collectable(RC_KF_BEHIND_MIDOS_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-364, -783), "Behind Mido's House Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEHIND_MIDOS_RUPEE)); + locationTable[RC_KF_SARIAS_ROOF_WEST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_WEST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(451, 810), "Saria's Roof West Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_ROOF_WEST_HEART)); + locationTable[RC_KF_SARIAS_ROOF_EAST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_EAST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(567, 819), "Saria's Roof East Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_ROOF_EAST_HEART)); + locationTable[RC_KF_SARIAS_ROOF_NORTH_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_NORTH_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(509, 725), "Saria's Roof North Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_ROOF_NORTH_HEART)); + locationTable[RC_KF_SOUTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-537, 194), "South Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE)); + locationTable[RC_KF_NORTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(35, -418), "North Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_WEST_RUPEE)); + locationTable[RC_KF_NORTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(107, -418), "North Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_EAST_RUPEE)); + locationTable[RC_KF_SOUTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-459, 181), "South Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE)); + locationTable[RC_KF_SARIAS_TOP_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(45, -52), "Saria's House Top Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_LEFT_HEART)); + locationTable[RC_KF_SARIAS_TOP_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(46, 56), "Saria's House Top Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_RIGHT_HEART)); + locationTable[RC_KF_SARIAS_BOTTOM_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(-46, -51), "Saria's House Bottom Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART)); + locationTable[RC_KF_SARIAS_BOTTOM_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(-46, 57), "Saria's House Bottom Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART)); + + locationTable[RC_KF_BEAN_RUPEE_1] = Location::Collectable(RC_KF_BEAN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -528), "Bean Platform Rupee 1", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_1)); + locationTable[RC_KF_BEAN_RUPEE_2] = Location::Collectable(RC_KF_BEAN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -567), "Bean Platform Rupee 2", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_2)); + locationTable[RC_KF_BEAN_RUPEE_3] = Location::Collectable(RC_KF_BEAN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -588), "Bean Platform Rupee 3", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_3)); + locationTable[RC_KF_BEAN_RUPEE_4] = Location::Collectable(RC_KF_BEAN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -567), "Bean Platform Rupee 4", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_4)); + locationTable[RC_KF_BEAN_RUPEE_5] = Location::Collectable(RC_KF_BEAN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -528), "Bean Platform Rupee 5", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_5)); + locationTable[RC_KF_BEAN_RUPEE_6] = Location::Collectable(RC_KF_BEAN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -508), "Bean Platform Rupee 6", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_6)); + locationTable[RC_KF_BEAN_RED_RUPEE] = Location::Collectable(RC_KF_BEAN_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -548), "Bean Platform Red Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RED_RUPEE)); + + locationTable[RC_LW_BOULDER_RUPEE] = Location::Collectable(RC_LW_BOULDER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1720, -2510), "Boulder Rupee", RHT_LOST_WOODS_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BOULDER_RUPEE)); + locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2215, -850), "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1)); + locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2164, -850), "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2)); + locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2113, -850), "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3)); + locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2061, -853), "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4)); + locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2194, -895), "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5)); + locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2156, -937), "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6)); + locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2193, -813), "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7)); + locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2153, -779), "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8)); + + locationTable[RC_LH_FRONT_RUPEE] = Location::Collectable(RC_LH_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-940, 3968), "Underwater Front Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FRONT_RUPEE)); + locationTable[RC_LH_MIDDLE_RUPEE] = Location::Collectable(RC_LH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-868, 4090), "Underwater Middle Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_MIDDLE_RUPEE)); + locationTable[RC_LH_BACK_RUPEE] = Location::Collectable(RC_LH_BACK_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-861, 4212), "Underwater Back Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BACK_RUPEE)); + locationTable[RC_LH_LAB_FRONT_RUPEE] = Location::Collectable(RC_LH_LAB_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(68, -207), "Lab Front Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_FRONT_RUPEE)); + locationTable[RC_LH_LAB_LEFT_RUPEE] = Location::Collectable(RC_LH_LAB_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(-52, -32), "Lab Left Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_LEFT_RUPEE)); + locationTable[RC_LH_LAB_RIGHT_RUPEE] = Location::Collectable(RC_LH_LAB_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(-169, -124), "Lab Right Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_RIGHT_RUPEE)); + + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_1] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(385, -2766), "Dampe's Grave Rupee 1", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_2] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(528, -3216), "Dampe's Grave Rupee 2", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_3] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(753, -4828), "Dampe's Grave Rupee 3", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_4] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(570, -5599), "Dampe's Grave Rupee 4", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_5] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(1461, -5736), "Dampe's Grave Rupee 5", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_6] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2376, -4647), "Dampe's Grave Rupee 6", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_7] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2573, -3758), "Dampe's Grave Rupee 7", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7)); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_8] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(1511, -3118), "Dampe's Grave Rupee 8", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8)); + + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-42, 880), "Octorok Grotto Front Left Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(58, 803), "Octorok Grotto Back Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(90, 910), "Octorok Grotto Front Right Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-68, 959), "Octorok Grotto Front Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(132, 961), "Octorok Grotto Front Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-38, 768), "Octorok Grotto Back Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 784), "Octorok Grotto Back Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE)); + locationTable[RC_GV_OCTOROK_GROTTO_RED_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(32, 852), "Octorok Grotto Red Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE)); + + locationTable[RC_DMT_RED_RUPEE] = Location::Collectable(RC_DMT_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-625, -55), "Red Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_RED_RUPEE)); + locationTable[RC_DMT_BLUE_RUPEE] = Location::Collectable(RC_DMT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1060, -51), "Blue Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BLUE_RUPEE)); + locationTable[RC_DMT_COW_GROTTO_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2287, -412), "Cow Grotto Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_LEFT_HEART)); + locationTable[RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2371, -532), "Cow Grotto Middle Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART)); + locationTable[RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2449, -534), "Cow Grotto Middle Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART)); + locationTable[RC_DMT_COW_GROTTO_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2569, -432), "Cow Grotto Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RIGHT_HEART)); + locationTable[RC_DMT_COW_GROTTO_RUPEE_1] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -100), "Cow Grotto Rupee 1", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_1)); + locationTable[RC_DMT_COW_GROTTO_RUPEE_2] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -139), "Cow Grotto Rupee 2", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_2)); + locationTable[RC_DMT_COW_GROTTO_RUPEE_3] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -160), "Cow Grotto Rupee 3", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_3)); + locationTable[RC_DMT_COW_GROTTO_RUPEE_4] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -139), "Cow Grotto Rupee 4", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_4)); + locationTable[RC_DMT_COW_GROTTO_RUPEE_5] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -100), "Cow Grotto Rupee 5", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_5)); + locationTable[RC_DMT_COW_GROTTO_RUPEE_6] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -80), "Cow Grotto Rupee 6", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_6)); + locationTable[RC_DMT_COW_GROTTO_RED_RUPEE] = Location::Collectable(RC_DMT_COW_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -120), "Cow Grotto Red Rupee", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RED_RUPEE)); + + locationTable[RC_DMC_NEAR_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_NEAR_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(675, -718), "Near Warp Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE)); + locationTable[RC_DMC_MIDDLE_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1117, -185), "Middle Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE)); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1117, -248), "Middle Platform Blue Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1)); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1116, -128), "Middle Platform Blue Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2)); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1159, -162), "Middle Platform Blue Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3)); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1158, -227), "Middle Platform Blue Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4)); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1078, -226), "Middle Platform Blue Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5)); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1078, -164), "Middle Platform Blue Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6)); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 454), "Distant Platform Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1)); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 415), "Distant Platform Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2)); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 395), "Distant Platform Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3)); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 415), "Distant Platform Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4)); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 454), "Distant Platform Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5)); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 475), "Distant Platform Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6)); + locationTable[RC_DMC_DISTANT_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 435), "Distant Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE)); + + locationTable[RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4216, -1464), "Beneath Domain Red Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE)); + locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4171, -1436), "Beneath Domain Red Middle Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE)); + locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4171, -1376), "Beneath Domain Red Middle Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE)); + locationTable[RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4224, -1339), "Beneath Domain Red Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE)); + + locationTable[RC_ZF_BOTTOM_NORTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(68, -166), "Bottom North Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(172, -35), "Bottom Northeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(137, 130), "Bottom Southeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-76, 172), "Bottom South Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-207, 47), "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-173, -132), "Bottom Northwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(242, -576), "Bottom North Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(540, -124), "Bottom Northeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(397, 318), "Bottom Southeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-166, 428), "Bottom South Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-574, 163), "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-464, -389), "Bottom Northwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(353, -934), "Bottom North Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(1032, -254), "Bottom Northeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(603, 466), "Bottom Southeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-227, 696), "Bottom South Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE)); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-847, 206), "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE)); + locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-857, -654), "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE)); + + locationTable[RC_DEKU_TREE_LOBBY_LOWER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-25, -81), "Lobby Lower Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART)); + locationTable[RC_DEKU_TREE_LOBBY_UPPER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_UPPER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(87, -16), "Lobby Upper Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-885, -185), "Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-820, -76), "Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-354, -206), "Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART)); + + locationTable[RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4266, -1575), "Lower Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART)); + locationTable[RC_DODONGOS_CAVERN_BLADE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2039, -317), "Blade Room Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART)); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3553, -1962), "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART)); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3580, -2004), "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART)); + + locationTable[RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1124, -2855), "West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART)); + locationTable[RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1165, -2788), "West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART)); + locationTable[RC_FOREST_TEMPLE_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(307, -1734), "Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART)); + locationTable[RC_FOREST_TEMPLE_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(251, -1735), "Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART)); + + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3476, -359), "Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART)); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3476, -295), "Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART)); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3526, -339), "Fire Pillar Room Back Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART)); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1753, -136), "East Central Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART)); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1813, -37), "East Central Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART)); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1783, -91), "East Central Room Middle Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART)); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(862, -169), "Fire Wall Chase East Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART)); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(603, -190), "Fire Wall Chase West Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART)); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1381, -1120), "Fire Wall Chase Exit Platform Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART)); + + locationTable[RC_WATER_TEMPLE_RIVER_HEART_1] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2781, -2515), "River Heart 1", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_1)); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_2] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2528, -2727), "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_2)); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_3] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2436, -3348), "River Heart 3", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_3)); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_4] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_4, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2021, -2937), "River Heart 4", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_4)); + + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5676, 1565), "Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART)); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5695, 1589), "Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART)); + locationTable[RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3971, -1716), "Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART)); + locationTable[RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3970, -1560), "Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART)); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3471, -884), "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART)); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3473, -927), "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART)); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3164, -646), "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART)); + + locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(708, 227), "Adult Climb Left Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART)); + locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(661, 227), "Adult Climb Right Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART)); + + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-67, -748), "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE)); + 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_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)); + + locationTable[RC_ICE_CAVERN_LOBBY_RUPEE] = Location::Collectable(RC_ICE_CAVERN_LOBBY_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-105, 854), "Lobby Rupee", RHT_ICE_CAVERN_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_RUPEE)); + locationTable[RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1171, -2258), "Map Room Left Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART)); + locationTable[RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1212, -2213), "Map Room Middle Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART)); + locationTable[RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1166, -2173), "Map Room Right Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART)); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1699, -697), "Sliding Block Room Rupee 1", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1)); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1648, -715), "Sliding Block Room Rupee 2", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2)); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1648, -677), "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3)); + + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1486, 204), "Beamos South Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART)); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1858, -183), "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART)); + + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1855, -3953), "Shadow Trial Heart 1", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1844, -4038), "Shadow Trial Heart 2", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1827, -4106), "Shadow Trial Heart 3", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1636, -3069), "Fire Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-517, 592), "Spirit Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART)); + + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1128, 1571), "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART)); + locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-594, 840), "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-22, -88), "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1165, 325), "MQ Slingshot Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-885, -185), "MQ Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-820, -76), "MQ Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-354, -206), "MQ Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART)); + + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4266, -1575), "MQ Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1955, -596), "MQ Torch Room Invisible Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART)); + + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-390, -1695), "MQ Lift Room Underwater Rupee 1", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-487, -1701), "MQ Lift Room Underwater Rupee 2", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-549, -1709), "MQ Lift Room Underwater Rupee 3", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-217, -1620), "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-206, -1797), "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2)); + + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1124, -2855), "MQ West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART)); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1157, -2798), "MQ West Courtyard Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART)); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1184, -2744), "MQ West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART)); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(115, -1755), "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART)); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(15, -1755), "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART)); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(215, -1755), "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART)); + + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3476, -331), "MQ Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3502, 320), "MQ Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3307, 180), "MQ Fire Pillar Room Lower Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART)); + + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5676, 1565), "MQ Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART)); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5695, 1589), "MQ Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART)); + locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3971, -1716), "MQ Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART)); + locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3970, -1560), "MQ Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3471, -884), "MQ After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3473, -927), "MQ After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3164, -646), "MQ After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART)); + + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -535), "MQ Child Early Left Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-976, -535), "MQ Child Early Right Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART)); + + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-1945, -863), "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-83, -350), "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-83, -274), "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-2143, -621), "MQ Coffin Room Middle Left Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1083, -1174), "MQ Basement Hallway Front Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1044, -1223), "MQ Basement Hallway Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1114, -1223), "MQ Basement Hallway Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART)); + + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1743, -528), "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2506, -1096), "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2655, -549), "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART)); +} + +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 5b70b424e..91e44a55e 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -96,3 +96,556 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va va_end(args); } + +void Rando::StaticData::RegisterPotLocations() { + // Overworld Pots + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", "KF Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); + locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", "KF Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); + locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", "KF Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", "KF Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", "KF Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); + locationTable[RC_GF_BREAK_ROOM_POT_1] = Location::Pot(RC_GF_BREAK_ROOM_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Pot 1", "GF Break Room Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_1)); + locationTable[RC_GF_BREAK_ROOM_POT_2] = Location::Pot(RC_GF_BREAK_ROOM_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Pot 2", "GF Break Room Pot 2", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_2)); + locationTable[RC_GF_KITCHEN_POT_1] = Location::Pot(RC_GF_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", "GF Kitchen Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_1)); + locationTable[RC_GF_KITCHEN_POT_2] = Location::Pot(RC_GF_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", "GF Kitchen Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_2)); + locationTable[RC_GF_NORTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "North F1 Carpenter Pot 1", "GF North F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1)); + locationTable[RC_GF_NORTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "North F1 Carpenter Pot 2", "GF North F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2)); + locationTable[RC_GF_NORTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "North F1 Carpenter Pot 3", "GF North F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3)); + locationTable[RC_GF_NORTH_F2_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "North F2 Carpenter Pot 1", "GF North F2 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1)); + locationTable[RC_GF_NORTH_F2_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "North F2 Carpenter Pot 2", "GF North F2 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "South F1 Carpenter Pot 1", "GF South F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "South F1 Carpenter Pot 2", "GF South F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "South F1 Carpenter Pot 3", "GF South F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "South F1 Carpenter Cell Pot 1", "GF South F1 Carpenter Cell Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "South F1 Carpenter Cell Pot 2", "GF South F1 Carpenter Cell Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "South F1 Carpenter Cell Pot 3", "GF South F1 Carpenter Cell Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "South F1 Carpenter Cell Pot 4", "GF South F1 Carpenter Cell Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4)); + locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", "Wasteland Near GS Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); + locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", "Wasteland Near GS Pot 2", RHT_POT_GERUDO_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); + locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", "Wasteland Near GS Pot 3", RHT_POT_GERUDO_FORTRESS, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); + locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", "Wasteland Near GS Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", "MK Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", "MK Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", "MK Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", "MK Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", "MK Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", "MK Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", "MK Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", "MK Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", "MK Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", "MK Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", "MK Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", "MK Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", "MK Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", "MK Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", "MK Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", "MK Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", "MK Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", "MK Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", "MK Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", "MK Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", "MK Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", "MK Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", "MK Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", "MK Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", "MK Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", "MK Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", "MK Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", "MK Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", "MK Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", "MK Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", "MK Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", "MK Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", "MK Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", "MK Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", "MK Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", "MK Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", "MK Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", "MK Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", "MK Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", "MK Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", "MK Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", "MK Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", "MK Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", "MK Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", "MK Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", "MK Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", "MK Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", "MK Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", "MK Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", "MK Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", "MK Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", "MK Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", "MK Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", "MK Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", "MK Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", "MK Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", "MK Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", "MK Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", "Kak Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", "Kak Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", "Kak Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", "Kak Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", "Kak Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", "Kak Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", "Kak Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", "Kak Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", "Kak Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", "Kak Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", "Kak Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", "GY Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); + locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", "GY Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", "GY Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); + locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", "GY Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); + locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", "GY Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); + locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", "GY Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", "GC Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", "GC Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", "GC Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", "GC Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", "GC Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); + locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", "GC Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); + locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", "GC Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); + locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", "GC Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); + locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", "GC Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", "DMC Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); + locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", "DMC Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", "DMC Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); + locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", "DMC Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", "ZD Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); + locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", "ZD Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); + locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", "ZD Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); + locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", "ZD Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", "ZD Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", "ZF Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", "ZF Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", "ZF Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", "ZF Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); + locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", "ZF Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); + locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", "ZF Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", "ZF Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); + locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", "LLR Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); + locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", "LLR Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); + locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", "LLR Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); + locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", "LLR Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); + locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", "LLR Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); + locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", "LLR Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); + locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", "LLR Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); + locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", "LLR Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); + locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", "LLR Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); + locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", "LLR Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); + locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", "HF Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); + locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", "HF Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", "HC Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); + locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", "HC Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", "HC Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); + locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", "HC Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); + + // Dungeon Pots + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", "Dodongos Cavern Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", "Dodongos Cavern Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", "Dodongos Cavern Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", "Dodongos Cavern Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", "Dodongos Cavern Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", "Dodongos Cavern Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", "Dodongos Cavern Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", "Dodongos Cavern Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", "Dodongos Cavern Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", "Dodongos Cavern Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", "Dodongos Cavern Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", "Dodongos Cavern Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", "Dodongos Cavern Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", "Dodongos Cavern Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", "Dodongos Cavern Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", "Dodongos Cavern Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", "Dodongos Cavern Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", "Dodongos Cavern Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", "Dodongos Cavern Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", "Dodongos Cavern Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", "Dodongos Cavern Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", "Dodongos Cavern Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", "Dodongos Cavern Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", "Dodongos Cavern Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", "Dodongos Cavern Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", "Dodongos Cavern Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", "Dodongos Cavern Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", "Dodongos Cavern Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", "Jabu Jabus Belly Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", "Jabu Jabus Belly Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", "Jabu Jabus Belly Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", "Jabu Jabus Belly Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", "Jabu Jabus Belly Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", "Jabu Jabus Belly Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", "Jabu Jabus Belly Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", "Jabu Jabus Belly Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", "Jabu Jabus Belly Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", "Jabu Jabus Belly Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", "Jabu Jabus Belly Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", "Jabu Jabus Belly Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", "Jabu Jabus Belly Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", "Jabu Jabus Belly Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", "Jabu Jabus Belly Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", "Jabu Jabus Belly Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", "Jabu Jabus Belly Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", "Forest Temple Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", "Forest Temple Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", "Forest Temple Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", "Forest Temple Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", "Forest Temple Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", "Forest Temple Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", "Forest Temple Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", "Forest Temple Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", "Forest Temple Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", "Forest Temple Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", "Forest Temple Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", "Forest Temple Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", "Forest Temple Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", "Forest Temple Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", "Forest Temple Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", "Forest Temple Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", "Forest Temple Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", "Forest Temple Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", "Forest Temple Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", "Fire Temple Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", "Fire Temple Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", "Fire Temple Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", "Fire Temple Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", "Fire Temple Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", "Fire Temple Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", "Fire Temple Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", "Fire Temple Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", "Fire Temple Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", "Fire Temple Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", "Fire Temple Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", "Fire Temple Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", "Fire Temple Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", "Fire Temple Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", "Fire Temple Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", "Water Temple Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", "Water Temple Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", "Water Temple Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", "Water Temple Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", "Water Temple Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", "Water Temple Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", "Water Temple Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", "Water Temple Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", "Water Temple Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", "Water Temple Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", "Water Temple Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", "Water Temple Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", "Water Temple Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", "Water Temple Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", "Water Temple Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", "Water Temple Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", "Water Temple Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", "Water Temple River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", "Water Temple River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", "Water Temple Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", "Water Temple Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", "Water Temple Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", "Water Temple Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); + locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", "Shadow Temple Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", "Shadow Temple Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", "Shadow Temple Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", "Shadow Temple Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", "Shadow Temple Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", "Shadow Temple Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", "Shadow Temple Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", "Shadow Temple Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", "Shadow Temple Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", "Shadow Temple Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", "Shadow Temple Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", "Shadow Temple Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", "Shadow Temple After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", "Shadow Temple After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); + locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", "Shadow Temple Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", "Shadow Temple Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", "Shadow Temple Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", "Shadow Temple After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", "Shadow Temple After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", "Shadow Temple After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", "Shadow Temple After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", "Spirit Temple Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", "Spirit Temple Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", "Spirit Temple Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", "Spirit Temple Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", "Spirit Temple Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", "Spirit Temple Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", "Spirit Temple Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", "Spirit Temple After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", "Spirit Temple After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", "Spirit Temple Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", "Spirit Temple Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", "Spirit Temple Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", "Spirit Temple Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", "Spirit Temple Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", "Spirit Temple Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); + locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", "Spirit Temple Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", "Ganons Castle Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", "Ganons Castle Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", "Ganons Castle Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", "Ganons Castle Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", "Ganons Castle Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", "Ganons Castle Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", "Ganons Castle Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", "Ganons Castle Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", "Ganons Castle Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", "Ganons Castle Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", "Ganons Castle Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", "Ganons Castle Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", "Ganons Castle Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", "Ganons Castle Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", "Ganons Castle Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", "Ganons Castle Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", "Ganons Castle Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", "Ganons Castle Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", "Ganons Castle Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", "Ganons Castle Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", "Ganons Castle Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", "Ganons Castle Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", "Ganons Castle Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", "Ganons Castle Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", "Ganons Castle Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", "Ganons Castle Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", "Ganons Castle Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", "Ganons Castle Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", "Ganons Castle Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", "Ganons Castle Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", "Ganons Castle Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", "Ganons Castle Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", "Ganons Castle Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", "Ganons Castle Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", "Bottom Of The Well Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", "Bottom Of The Well Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", "Bottom Of The Well Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", "Bottom Of The Well Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", "Bottom Of The Well Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", "Bottom Of The Well Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", "Bottom Of The Well Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", "Bottom Of The Well Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", "Bottom Of The Well Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", "Bottom Of The Well Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", "Bottom Of The Well Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", "Bottom Of The Well Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", "Bottom Of The Well Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", "Bottom Of The Well Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", "Bottom Of The Well Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", "Bottom Of The Well Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", "Bottom Of The Well Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", "Bottom Of The Well Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", "Bottom Of The Well Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); + locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", "Ice Cavern Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); + locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", "Ice Cavern Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", "Ice Cavern Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", "Ice Cavern Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", "Ice Cavern Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", "Ice Cavern Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", "Ice Cavern Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); + locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", "Ice Cavern Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); + + // MQ Dungeon Pots + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", "Dodongos Cavern MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", "Dodongos Cavern MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", "Dodongos Cavern MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", "Dodongos Cavern MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", "Dodongos Cavern MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", "Dodongos Cavern MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", "Dodongos Cavern MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", "Dodongos Cavern MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", "Dodongos Cavern MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", "Dodongos Cavern MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", "Dodongos Cavern MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", "Dodongos Cavern MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", "Dodongos Cavern MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", "Dodongos Cavern MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", "Dodongos Cavern MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", "Dodongos Cavern MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", "Dodongos Cavern MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", "Dodongos Cavern MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", "Dodongos Cavern MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", "Dodongos Cavern MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", "Dodongos Cavern MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", "Dodongos Cavern MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", "Dodongos Cavern MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", "Dodongos Cavern MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", "Dodongos Cavern MQ Armos SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", "Dodongos Cavern MQ Armos SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", "Dodongos Cavern MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", "Dodongos Cavern MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", "Dodongos Cavern MQ Armos NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", "Dodongos Cavern MQ Armos NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", "Jabu Jabus Belly MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", "Jabu Jabus Belly MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", "Jabu Jabus Belly MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", "Jabu Jabus Belly MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", "Jabu Jabus Belly MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", "Jabu Jabus Belly MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", "Jabu Jabus Belly MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", "Jabu Jabus Belly MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", "Jabu Jabus Belly MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", "Forest Temple MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", "Forest Temple MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", "Forest Temple MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", "Forest Temple MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", "Forest Temple MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", "Forest Temple MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", "Forest Temple MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", "Forest Temple MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", "Forest Temple MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", "Forest Temple MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", "Forest Temple MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", "Forest Temple MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", "Forest Temple MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", "Forest Temple MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", "Forest Temple MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", "Forest Temple MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", "Forest Temple MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", "Forest Temple MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", "Forest Temple MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", "Forest Temple MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", "Forest Temple MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", "Ganons Castle MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", "Ganons Castle MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", "Ganons Castle MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", "Ganons Castle MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", "Ganons Castle MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", "Ganons Castle MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", "Ganons Castle MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", "Ganons Castle MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", "Ganons Castle MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", "Ganons Castle MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", "Ganons Castle MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", "Ganons Castle MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", "Shadow Temple MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", "Shadow Temple MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", "Shadow Temple MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", "Shadow Temple MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", "Shadow Temple MQ Stone Umbrella Lower West Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", "Shadow Temple MQ Stone Umbrella Lower East Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", "Shadow Temple MQ Stone Umbrella Upper South Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", "Shadow Temple MQ Stone Umbrella Upper North Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", "Shadow Temple MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", "Shadow Temple MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", "Shadow Temple MQ Before Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", "Shadow Temple MQ Before Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", "Shadow Temple MQ After Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", "Shadow Temple MQ After Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", "Shadow Temple MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", "Shadow Temple MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", "Shadow Temple MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", "Bottom Of The Well MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", "Bottom Of The Well MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", "Bottom Of The Well MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", "Bottom Of The Well MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", "Bottom Of The Well MQ East Inner Room Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", "Bottom Of The Well MQ East Inner Room Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", "Bottom Of The Well MQ East Inner Room Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", "Fire Temple MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", "Fire Temple MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", "Fire Temple MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", "Fire Temple MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", "Fire Temple MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", "Fire Temple MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", "Fire Temple MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", "Fire Temple MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", "Fire Temple MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", "Fire Temple MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", "Fire Temple MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", "Fire Temple MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", "Fire Temple MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", "Fire Temple MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", "Fire Temple MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", "Fire Temple MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", "Fire Temple MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", "Fire Temple MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", "Fire Temple MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", "Fire Temple MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", "Fire Temple MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", "Fire Temple MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", "Fire Temple MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", "Fire Temple MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", "Fire Temple MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", "Fire Temple MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", "Fire Temple MQ South Fire Maze West Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", "Fire Temple MQ South Fire Maze East Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); + locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", "Ice Cavern MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", "Ice Cavern MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", "Ice Cavern MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", "Ice Cavern MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", "Ice Cavern MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", "Ice Cavern MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", "Ice Cavern MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", "Ice Cavern MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", "Ice Cavern MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", "Ice Cavern MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", "Ice Cavern MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", "Spirit Temple MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", "Spirit Temple MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", "Spirit Temple MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", "Spirit Temple MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", "Spirit Temple MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", "Spirit Temple MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", "Spirit Temple MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", "Spirit Temple MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", "Spirit Temple MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", "Spirit Temple MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", "Spirit Temple MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", "Spirit Temple MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", "Spirit Temple MQ Statue 2F Center East Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", "Spirit Temple MQ Statue Room 3F East Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", "Spirit Temple MQ Statue Room 3F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", "Spirit Temple MQ Statue 2F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", "Spirit Temple MQ Statue 2F Eastmost Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", "Spirit Temple MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", "Spirit Temple MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", "Spirit Temple MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", "Spirit Temple MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", "Spirit Temple MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", "Spirit Temple MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", "Spirit Temple MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", "Spirit Temple MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", "Spirit Temple MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", "Spirit Temple MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", "Spirit Temple MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", "Spirit Temple MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", "Water Temple MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", "Water Temple MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", "Water Temple MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", "Water Temple MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", "Water Temple MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", "Water Temple MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", "Water Temple MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", "Water Temple MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", "Water Temple MQ Lizalfos Hallway West Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", "Water Temple MQ Lizalfos Hallway South Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", "Water Temple MQ Lizalfos Hallway SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", "Water Temple MQ Lizalfos Cage North Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", "Water Temple MQ Lizalfos Cage South Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", "Water Temple MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", "Water Temple MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", "Water Temple MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", "Water Temple MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", "Water Temple MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", "Water Temple MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", "Water Temple MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", "Water Temple MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", "Water Temple MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", "Water Temple MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", "Water Temple MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", "Water Temple MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", "Water Temple MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", "Water Temple MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", "Water Temple MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", "Water Temple MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", "Water Temple MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", "Water Temple MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", "Gerudo Training Ground MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", "Gerudo Training Ground MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", "Gerudo Training Ground MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", "Gerudo Training Ground MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); +} + +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index 2769faf31..b44e21fc1 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -576,3 +576,58 @@ extern "C" { CLOSE_DISPS(play->state.gfxCtx); } } + +void Rando::StaticData::RegisterFishLocations() { + // Fishing Pond + locationTable[RC_LH_CHILD_FISH_1] = Location::Fish(RC_LH_CHILD_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_CHILD_FISH_1, "Child Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_2] = Location::Fish(RC_LH_CHILD_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_CHILD_FISH_2, "Child Pond Fish 2", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_3] = Location::Fish(RC_LH_CHILD_FISH_3, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 102, RAND_INF_CHILD_FISH_3, "Child Pond Fish 3", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_4] = Location::Fish(RC_LH_CHILD_FISH_4, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 103, RAND_INF_CHILD_FISH_4, "Child Pond Fish 4", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_5] = Location::Fish(RC_LH_CHILD_FISH_5, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 104, RAND_INF_CHILD_FISH_5, "Child Pond Fish 5", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_6] = Location::Fish(RC_LH_CHILD_FISH_6, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 105, RAND_INF_CHILD_FISH_6, "Child Pond Fish 6", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_7] = Location::Fish(RC_LH_CHILD_FISH_7, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 106, RAND_INF_CHILD_FISH_7, "Child Pond Fish 7", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_8] = Location::Fish(RC_LH_CHILD_FISH_8, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 107, RAND_INF_CHILD_FISH_8, "Child Pond Fish 8", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_9] = Location::Fish(RC_LH_CHILD_FISH_9, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 108, RAND_INF_CHILD_FISH_9, "Child Pond Fish 9", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_10] = Location::Fish(RC_LH_CHILD_FISH_10, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 109, RAND_INF_CHILD_FISH_10, "Child Pond Fish 10", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_11] = Location::Fish(RC_LH_CHILD_FISH_11, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 110, RAND_INF_CHILD_FISH_11, "Child Pond Fish 11", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_12] = Location::Fish(RC_LH_CHILD_FISH_12, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 111, RAND_INF_CHILD_FISH_12, "Child Pond Fish 12", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_13] = Location::Fish(RC_LH_CHILD_FISH_13, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 112, RAND_INF_CHILD_FISH_13, "Child Pond Fish 13", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_14] = Location::Fish(RC_LH_CHILD_FISH_14, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 113, RAND_INF_CHILD_FISH_14, "Child Pond Fish 14", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_FISH_15] = Location::Fish(RC_LH_CHILD_FISH_15, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 114, RAND_INF_CHILD_FISH_15, "Child Pond Fish 15", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_CHILD_LOACH_1] = Location::Fish(RC_LH_CHILD_LOACH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 115, RAND_INF_CHILD_LOACH_1, "Child Pond Loach 1", RHT_LH_HYRULE_LOACH, RG_NONE); + locationTable[RC_LH_CHILD_LOACH_2] = Location::Fish(RC_LH_CHILD_LOACH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 116, RAND_INF_CHILD_LOACH_2, "Child Pond Loach 2", RHT_LH_HYRULE_LOACH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_1] = Location::Fish(RC_LH_ADULT_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_ADULT_FISH_1, "Adult Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_2] = Location::Fish(RC_LH_ADULT_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_ADULT_FISH_2, "Adult Pond Fish 2", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_3] = Location::Fish(RC_LH_ADULT_FISH_3, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 102, RAND_INF_ADULT_FISH_3, "Adult Pond Fish 3", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_4] = Location::Fish(RC_LH_ADULT_FISH_4, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 103, RAND_INF_ADULT_FISH_4, "Adult Pond Fish 4", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_5] = Location::Fish(RC_LH_ADULT_FISH_5, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 104, RAND_INF_ADULT_FISH_5, "Adult Pond Fish 5", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_6] = Location::Fish(RC_LH_ADULT_FISH_6, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 105, RAND_INF_ADULT_FISH_6, "Adult Pond Fish 6", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_7] = Location::Fish(RC_LH_ADULT_FISH_7, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 106, RAND_INF_ADULT_FISH_7, "Adult Pond Fish 7", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_8] = Location::Fish(RC_LH_ADULT_FISH_8, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 107, RAND_INF_ADULT_FISH_8, "Adult Pond Fish 8", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_9] = Location::Fish(RC_LH_ADULT_FISH_9, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 108, RAND_INF_ADULT_FISH_9, "Adult Pond Fish 9", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_10] = Location::Fish(RC_LH_ADULT_FISH_10, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 109, RAND_INF_ADULT_FISH_10, "Adult Pond Fish 10", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_11] = Location::Fish(RC_LH_ADULT_FISH_11, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 110, RAND_INF_ADULT_FISH_11, "Adult Pond Fish 11", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_12] = Location::Fish(RC_LH_ADULT_FISH_12, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 111, RAND_INF_ADULT_FISH_12, "Adult Pond Fish 12", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_13] = Location::Fish(RC_LH_ADULT_FISH_13, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 112, RAND_INF_ADULT_FISH_13, "Adult Pond Fish 13", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_14] = Location::Fish(RC_LH_ADULT_FISH_14, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 113, RAND_INF_ADULT_FISH_14, "Adult Pond Fish 14", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_FISH_15] = Location::Fish(RC_LH_ADULT_FISH_15, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 114, RAND_INF_ADULT_FISH_15, "Adult Pond Fish 15", RHT_LH_POND_FISH, RG_NONE); + locationTable[RC_LH_ADULT_LOACH] = Location::Fish(RC_LH_ADULT_LOACH, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 115, RAND_INF_ADULT_LOACH, "Adult Pond Loach", RHT_LH_HYRULE_LOACH, RG_NONE); + // Grotto fish + locationTable[RC_KF_STORMS_GROTTO_FISH] = Location::GrottoFish(RC_KF_STORMS_GROTTO_FISH, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, 0x12C, RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, "Storms Grotto Fish", RHT_KF_STORMS_GROTTO_FISH); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_FISH] = Location::GrottoFish(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, RCQUEST_BOTH, RCAREA_LOST_WOODS, 0x114, RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, "Near Shortcuts Grotto Fish", RHT_LW_NEAR_SHORTCUTS_GROTTO_FISH); + locationTable[RC_HF_SOUTHEAST_GROTTO_FISH] = Location::GrottoFish(RC_HF_SOUTHEAST_GROTTO_FISH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, 0x122, RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, "Southeast Grotto Fish", RHT_HF_SOUTHEAST_GROTTO_FISH); + locationTable[RC_HF_OPEN_GROTTO_FISH] = Location::GrottoFish(RC_HF_OPEN_GROTTO_FISH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, 0x103, RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, "Open Grotto Fish", RHT_HF_OPEN_GROTTO_FISH); + locationTable[RC_HF_NEAR_MARKET_GROTTO_FISH] = Location::GrottoFish(RC_HF_NEAR_MARKET_GROTTO_FISH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, 0x100, RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, "Near Market Grotto Fish", RHT_HF_NEAR_MARKET_GROTTO_FISH); + locationTable[RC_KAK_OPEN_GROTTO_FISH] = Location::GrottoFish(RC_KAK_OPEN_GROTTO_FISH, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, 0x128, RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, "Open Grotto Fish", RHT_KAK_OPEN_GROTTO_FISH); + locationTable[RC_DMT_STORMS_GROTTO_FISH] = Location::GrottoFish(RC_DMT_STORMS_GROTTO_FISH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, 0x157, RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, "Storms Grotto Fish", RHT_DMT_STORMS_GROTTO_FISH); + locationTable[RC_DMC_UPPER_GROTTO_FISH] = Location::GrottoFish(RC_DMC_UPPER_GROTTO_FISH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, 0x17A, RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, "Upper Grotto Fish", RHT_DMC_UPPER_GROTTO_FISH); + locationTable[RC_ZR_OPEN_GROTTO_FISH] = Location::GrottoFish(RC_ZR_OPEN_GROTTO_FISH, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, 0x129, RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, "Open Grotto Fish", RHT_ZR_OPEN_GROTTO_FISH); + // Zora's Domain fish + locationTable[RC_ZD_FISH_1] = Location::Fish(RC_ZD_FISH_1, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 0, RAND_INF_ZD_FISH_1, "Fish 1", RHT_ZD_FISH, RG_FISH); + locationTable[RC_ZD_FISH_2] = Location::Fish(RC_ZD_FISH_2, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 1, RAND_INF_ZD_FISH_2, "Fish 2", RHT_ZD_FISH, RG_FISH); + locationTable[RC_ZD_FISH_3] = Location::Fish(RC_ZD_FISH_3, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 2, RAND_INF_ZD_FISH_3, "Fish 3", RHT_ZD_FISH, RG_FISH); + locationTable[RC_ZD_FISH_4] = Location::Fish(RC_ZD_FISH_4, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, RAND_INF_ZD_FISH_4, "Fish 4", RHT_ZD_FISH, RG_FISH); + locationTable[RC_ZD_FISH_5] = Location::Fish(RC_ZD_FISH_5, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, RAND_INF_ZD_FISH_5, "Fish 5", RHT_ZD_FISH, RG_FISH); +} + +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFishLocations); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index d35b54a73..f005391d7 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -998,1068 +998,6 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GC_SHOP_ITEM_7] = Location::Base(RC_GC_SHOP_ITEM_7, RCQUEST_BOTH, RCTYPE_SHOP, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x06, "Shop Item 7", RHT_GC_SHOP_ITEM_7, RG_BUY_RED_POTION_40, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7), false, 40); locationTable[RC_GC_SHOP_ITEM_8] = Location::Base(RC_GC_SHOP_ITEM_8, RCQUEST_BOTH, RCTYPE_SHOP, ACTOR_EN_GIRLA, SCENE_GORON_SHOP, 0x07, "Shop Item 8", RHT_GC_SHOP_ITEM_8, RG_BUY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8), false, 10); - /* +--------------+ - | FISHSANITY | - +--------------+ */ - - // Fishing Pond - locationTable[RC_LH_CHILD_FISH_1] = Location::Fish(RC_LH_CHILD_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_CHILD_FISH_1, "Child Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_2] = Location::Fish(RC_LH_CHILD_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_CHILD_FISH_2, "Child Pond Fish 2", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_3] = Location::Fish(RC_LH_CHILD_FISH_3, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 102, RAND_INF_CHILD_FISH_3, "Child Pond Fish 3", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_4] = Location::Fish(RC_LH_CHILD_FISH_4, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 103, RAND_INF_CHILD_FISH_4, "Child Pond Fish 4", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_5] = Location::Fish(RC_LH_CHILD_FISH_5, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 104, RAND_INF_CHILD_FISH_5, "Child Pond Fish 5", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_6] = Location::Fish(RC_LH_CHILD_FISH_6, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 105, RAND_INF_CHILD_FISH_6, "Child Pond Fish 6", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_7] = Location::Fish(RC_LH_CHILD_FISH_7, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 106, RAND_INF_CHILD_FISH_7, "Child Pond Fish 7", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_8] = Location::Fish(RC_LH_CHILD_FISH_8, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 107, RAND_INF_CHILD_FISH_8, "Child Pond Fish 8", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_9] = Location::Fish(RC_LH_CHILD_FISH_9, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 108, RAND_INF_CHILD_FISH_9, "Child Pond Fish 9", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_10] = Location::Fish(RC_LH_CHILD_FISH_10, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 109, RAND_INF_CHILD_FISH_10, "Child Pond Fish 10", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_11] = Location::Fish(RC_LH_CHILD_FISH_11, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 110, RAND_INF_CHILD_FISH_11, "Child Pond Fish 11", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_12] = Location::Fish(RC_LH_CHILD_FISH_12, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 111, RAND_INF_CHILD_FISH_12, "Child Pond Fish 12", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_13] = Location::Fish(RC_LH_CHILD_FISH_13, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 112, RAND_INF_CHILD_FISH_13, "Child Pond Fish 13", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_14] = Location::Fish(RC_LH_CHILD_FISH_14, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 113, RAND_INF_CHILD_FISH_14, "Child Pond Fish 14", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_FISH_15] = Location::Fish(RC_LH_CHILD_FISH_15, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 114, RAND_INF_CHILD_FISH_15, "Child Pond Fish 15", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_CHILD_LOACH_1] = Location::Fish(RC_LH_CHILD_LOACH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 115, RAND_INF_CHILD_LOACH_1, "Child Pond Loach 1", RHT_LH_HYRULE_LOACH, RG_NONE); - locationTable[RC_LH_CHILD_LOACH_2] = Location::Fish(RC_LH_CHILD_LOACH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 116, RAND_INF_CHILD_LOACH_2, "Child Pond Loach 2", RHT_LH_HYRULE_LOACH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_1] = Location::Fish(RC_LH_ADULT_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_ADULT_FISH_1, "Adult Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_2] = Location::Fish(RC_LH_ADULT_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_ADULT_FISH_2, "Adult Pond Fish 2", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_3] = Location::Fish(RC_LH_ADULT_FISH_3, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 102, RAND_INF_ADULT_FISH_3, "Adult Pond Fish 3", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_4] = Location::Fish(RC_LH_ADULT_FISH_4, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 103, RAND_INF_ADULT_FISH_4, "Adult Pond Fish 4", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_5] = Location::Fish(RC_LH_ADULT_FISH_5, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 104, RAND_INF_ADULT_FISH_5, "Adult Pond Fish 5", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_6] = Location::Fish(RC_LH_ADULT_FISH_6, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 105, RAND_INF_ADULT_FISH_6, "Adult Pond Fish 6", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_7] = Location::Fish(RC_LH_ADULT_FISH_7, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 106, RAND_INF_ADULT_FISH_7, "Adult Pond Fish 7", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_8] = Location::Fish(RC_LH_ADULT_FISH_8, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 107, RAND_INF_ADULT_FISH_8, "Adult Pond Fish 8", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_9] = Location::Fish(RC_LH_ADULT_FISH_9, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 108, RAND_INF_ADULT_FISH_9, "Adult Pond Fish 9", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_10] = Location::Fish(RC_LH_ADULT_FISH_10, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 109, RAND_INF_ADULT_FISH_10, "Adult Pond Fish 10", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_11] = Location::Fish(RC_LH_ADULT_FISH_11, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 110, RAND_INF_ADULT_FISH_11, "Adult Pond Fish 11", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_12] = Location::Fish(RC_LH_ADULT_FISH_12, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 111, RAND_INF_ADULT_FISH_12, "Adult Pond Fish 12", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_13] = Location::Fish(RC_LH_ADULT_FISH_13, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 112, RAND_INF_ADULT_FISH_13, "Adult Pond Fish 13", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_14] = Location::Fish(RC_LH_ADULT_FISH_14, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 113, RAND_INF_ADULT_FISH_14, "Adult Pond Fish 14", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_FISH_15] = Location::Fish(RC_LH_ADULT_FISH_15, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 114, RAND_INF_ADULT_FISH_15, "Adult Pond Fish 15", RHT_LH_POND_FISH, RG_NONE); - locationTable[RC_LH_ADULT_LOACH] = Location::Fish(RC_LH_ADULT_LOACH, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 115, RAND_INF_ADULT_LOACH, "Adult Pond Loach", RHT_LH_HYRULE_LOACH, RG_NONE); - // Grotto fish - locationTable[RC_KF_STORMS_GROTTO_FISH] = Location::GrottoFish(RC_KF_STORMS_GROTTO_FISH, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, 0x12C, RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, "Storms Grotto Fish", RHT_KF_STORMS_GROTTO_FISH); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_FISH] = Location::GrottoFish(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, RCQUEST_BOTH, RCAREA_LOST_WOODS, 0x114, RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, "Near Shortcuts Grotto Fish", RHT_LW_NEAR_SHORTCUTS_GROTTO_FISH); - locationTable[RC_HF_SOUTHEAST_GROTTO_FISH] = Location::GrottoFish(RC_HF_SOUTHEAST_GROTTO_FISH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, 0x122, RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, "Southeast Grotto Fish", RHT_HF_SOUTHEAST_GROTTO_FISH); - locationTable[RC_HF_OPEN_GROTTO_FISH] = Location::GrottoFish(RC_HF_OPEN_GROTTO_FISH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, 0x103, RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, "Open Grotto Fish", RHT_HF_OPEN_GROTTO_FISH); - locationTable[RC_HF_NEAR_MARKET_GROTTO_FISH] = Location::GrottoFish(RC_HF_NEAR_MARKET_GROTTO_FISH, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, 0x100, RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, "Near Market Grotto Fish", RHT_HF_NEAR_MARKET_GROTTO_FISH); - locationTable[RC_KAK_OPEN_GROTTO_FISH] = Location::GrottoFish(RC_KAK_OPEN_GROTTO_FISH, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, 0x128, RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, "Open Grotto Fish", RHT_KAK_OPEN_GROTTO_FISH); - locationTable[RC_DMT_STORMS_GROTTO_FISH] = Location::GrottoFish(RC_DMT_STORMS_GROTTO_FISH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, 0x157, RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, "Storms Grotto Fish", RHT_DMT_STORMS_GROTTO_FISH); - locationTable[RC_DMC_UPPER_GROTTO_FISH] = Location::GrottoFish(RC_DMC_UPPER_GROTTO_FISH, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, 0x17A, RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, "Upper Grotto Fish", RHT_DMC_UPPER_GROTTO_FISH); - locationTable[RC_ZR_OPEN_GROTTO_FISH] = Location::GrottoFish(RC_ZR_OPEN_GROTTO_FISH, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, 0x129, RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, "Open Grotto Fish", RHT_ZR_OPEN_GROTTO_FISH); - // Zora's Domain fish - locationTable[RC_ZD_FISH_1] = Location::Fish(RC_ZD_FISH_1, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 0, RAND_INF_ZD_FISH_1, "Fish 1", RHT_ZD_FISH, RG_FISH); - locationTable[RC_ZD_FISH_2] = Location::Fish(RC_ZD_FISH_2, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 1, RAND_INF_ZD_FISH_2, "Fish 2", RHT_ZD_FISH, RG_FISH); - locationTable[RC_ZD_FISH_3] = Location::Fish(RC_ZD_FISH_3, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 2, RAND_INF_ZD_FISH_3, "Fish 3", RHT_ZD_FISH, RG_FISH); - locationTable[RC_ZD_FISH_4] = Location::Fish(RC_ZD_FISH_4, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, RAND_INF_ZD_FISH_4, "Fish 4", RHT_ZD_FISH, RG_FISH); - locationTable[RC_ZD_FISH_5] = Location::Fish(RC_ZD_FISH_5, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, RAND_INF_ZD_FISH_5, "Fish 5", RHT_ZD_FISH, RG_FISH); - - - /* +----------------+ - | SHUFFLE POTS | - +----------------+ */ - - // Overworld Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", "KF Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); - locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", "KF Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); - locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", "KF Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", "KF Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", "KF Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); - locationTable[RC_GF_BREAK_ROOM_POT_1] = Location::Pot(RC_GF_BREAK_ROOM_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Pot 1", "GF Break Room Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_1)); - locationTable[RC_GF_BREAK_ROOM_POT_2] = Location::Pot(RC_GF_BREAK_ROOM_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Pot 2", "GF Break Room Pot 2", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_2)); - locationTable[RC_GF_KITCHEN_POT_1] = Location::Pot(RC_GF_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", "GF Kitchen Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_1)); - locationTable[RC_GF_KITCHEN_POT_2] = Location::Pot(RC_GF_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", "GF Kitchen Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "North F1 Carpenter Pot 1", "GF North F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "North F1 Carpenter Pot 2", "GF North F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "North F1 Carpenter Pot 3", "GF North F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "North F2 Carpenter Pot 1", "GF North F2 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "North F2 Carpenter Pot 2", "GF North F2 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "South F1 Carpenter Pot 1", "GF South F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "South F1 Carpenter Pot 2", "GF South F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "South F1 Carpenter Pot 3", "GF South F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "South F1 Carpenter Cell Pot 1", "GF South F1 Carpenter Cell Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "South F1 Carpenter Cell Pot 2", "GF South F1 Carpenter Cell Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "South F1 Carpenter Cell Pot 3", "GF South F1 Carpenter Cell Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "South F1 Carpenter Cell Pot 4", "GF South F1 Carpenter Cell Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4)); - locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", "Wasteland Near GS Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); - locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", "Wasteland Near GS Pot 2", RHT_POT_GERUDO_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); - locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", "Wasteland Near GS Pot 3", RHT_POT_GERUDO_FORTRESS, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); - locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", "Wasteland Near GS Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", "MK Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", "MK Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", "MK Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", "MK Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", "MK Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", "MK Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", "MK Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", "MK Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", "MK Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", "MK Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", "MK Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", "MK Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", "MK Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", "MK Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", "MK Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", "MK Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", "MK Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", "MK Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", "MK Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", "MK Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", "MK Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", "MK Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", "MK Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", "MK Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", "MK Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", "MK Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", "MK Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", "MK Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", "MK Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", "MK Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", "MK Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", "MK Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", "MK Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", "MK Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", "MK Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", "MK Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", "MK Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", "MK Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", "MK Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", "MK Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", "MK Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", "MK Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", "MK Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", "MK Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", "MK Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", "MK Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", "MK Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", "MK Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", "MK Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", "MK Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", "MK Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", "MK Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", "MK Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", "MK Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", "MK Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", "MK Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", "MK Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", "MK Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", "Kak Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", "Kak Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", "Kak Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", "Kak Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", "Kak Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", "Kak Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", "Kak Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", "Kak Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", "Kak Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", "Kak Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", "Kak Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", "GY Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); - locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", "GY Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", "GY Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); - locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", "GY Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); - locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", "GY Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); - locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", "GY Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", "GC Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", "GC Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", "GC Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", "GC Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", "GC Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); - locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", "GC Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); - locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", "GC Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); - locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", "GC Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); - locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", "GC Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", "DMC Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); - locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", "DMC Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", "DMC Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); - locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", "DMC Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", "ZD Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); - locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", "ZD Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); - locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", "ZD Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); - locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", "ZD Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", "ZD Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", "ZF Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", "ZF Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", "ZF Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", "ZF Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); - locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", "ZF Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); - locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", "ZF Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", "ZF Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); - locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", "LLR Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); - locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", "LLR Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); - locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", "LLR Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); - locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", "LLR Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); - locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", "LLR Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); - locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", "LLR Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); - locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", "LLR Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); - locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", "LLR Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); - locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", "LLR Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); - locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", "LLR Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); - locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", "HF Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); - locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", "HF Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", "HC Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); - locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", "HC Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", "HC Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); - locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", "HC Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); - - // Dungeon Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", "Dodongos Cavern Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", "Dodongos Cavern Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", "Dodongos Cavern Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", "Dodongos Cavern Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", "Dodongos Cavern Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", "Dodongos Cavern Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", "Dodongos Cavern Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", "Dodongos Cavern Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", "Dodongos Cavern Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", "Dodongos Cavern Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", "Dodongos Cavern Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", "Dodongos Cavern Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", "Dodongos Cavern Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", "Dodongos Cavern Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", "Dodongos Cavern Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", "Dodongos Cavern Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", "Dodongos Cavern Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", "Dodongos Cavern Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", "Dodongos Cavern Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", "Dodongos Cavern Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", "Dodongos Cavern Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", "Dodongos Cavern Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", "Dodongos Cavern Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", "Dodongos Cavern Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", "Dodongos Cavern Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", "Dodongos Cavern Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", "Dodongos Cavern Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", "Dodongos Cavern Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", "Jabu Jabus Belly Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", "Jabu Jabus Belly Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", "Jabu Jabus Belly Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", "Jabu Jabus Belly Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", "Jabu Jabus Belly Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", "Jabu Jabus Belly Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", "Jabu Jabus Belly Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", "Jabu Jabus Belly Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", "Jabu Jabus Belly Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", "Jabu Jabus Belly Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", "Jabu Jabus Belly Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", "Jabu Jabus Belly Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", "Jabu Jabus Belly Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", "Jabu Jabus Belly Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", "Jabu Jabus Belly Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", "Jabu Jabus Belly Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", "Jabu Jabus Belly Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", "Forest Temple Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", "Forest Temple Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", "Forest Temple Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", "Forest Temple Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", "Forest Temple Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", "Forest Temple Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", "Forest Temple Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", "Forest Temple Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", "Forest Temple Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", "Forest Temple Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", "Forest Temple Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", "Forest Temple Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", "Forest Temple Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", "Forest Temple Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", "Forest Temple Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", "Forest Temple Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", "Forest Temple Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", "Forest Temple Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", "Forest Temple Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", "Fire Temple Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", "Fire Temple Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", "Fire Temple Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", "Fire Temple Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", "Fire Temple Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", "Fire Temple Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", "Fire Temple Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", "Fire Temple Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", "Fire Temple Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", "Fire Temple Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", "Fire Temple Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", "Fire Temple Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", "Fire Temple Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", "Fire Temple Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", "Fire Temple Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", "Water Temple Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", "Water Temple Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", "Water Temple Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", "Water Temple Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", "Water Temple Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", "Water Temple Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", "Water Temple Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", "Water Temple Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", "Water Temple Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", "Water Temple Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", "Water Temple Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", "Water Temple Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", "Water Temple Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", "Water Temple Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", "Water Temple Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", "Water Temple Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", "Water Temple Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", "Water Temple River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", "Water Temple River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", "Water Temple Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", "Water Temple Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", "Water Temple Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", "Water Temple Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); - locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", "Shadow Temple Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", "Shadow Temple Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", "Shadow Temple Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", "Shadow Temple Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", "Shadow Temple Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", "Shadow Temple Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", "Shadow Temple Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", "Shadow Temple Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", "Shadow Temple Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", "Shadow Temple Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", "Shadow Temple Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", "Shadow Temple Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", "Shadow Temple After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", "Shadow Temple After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); - locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", "Shadow Temple Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", "Shadow Temple Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", "Shadow Temple Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", "Shadow Temple After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", "Shadow Temple After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", "Shadow Temple After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", "Shadow Temple After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", "Spirit Temple Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", "Spirit Temple Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", "Spirit Temple Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", "Spirit Temple Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", "Spirit Temple Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", "Spirit Temple Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", "Spirit Temple Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", "Spirit Temple After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", "Spirit Temple After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", "Spirit Temple Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", "Spirit Temple Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", "Spirit Temple Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", "Spirit Temple Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", "Spirit Temple Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", "Spirit Temple Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); - locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", "Spirit Temple Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", "Ganons Castle Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", "Ganons Castle Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", "Ganons Castle Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", "Ganons Castle Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", "Ganons Castle Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", "Ganons Castle Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", "Ganons Castle Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", "Ganons Castle Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", "Ganons Castle Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", "Ganons Castle Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", "Ganons Castle Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", "Ganons Castle Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", "Ganons Castle Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", "Ganons Castle Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", "Ganons Castle Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", "Ganons Castle Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", "Ganons Castle Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", "Ganons Castle Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", "Ganons Castle Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", "Ganons Castle Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", "Ganons Castle Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", "Ganons Castle Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", "Ganons Castle Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", "Ganons Castle Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", "Ganons Castle Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", "Ganons Castle Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", "Ganons Castle Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", "Ganons Castle Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", "Ganons Castle Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", "Ganons Castle Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", "Ganons Castle Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", "Ganons Castle Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", "Ganons Castle Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", "Ganons Castle Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", "Bottom Of The Well Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", "Bottom Of The Well Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", "Bottom Of The Well Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", "Bottom Of The Well Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", "Bottom Of The Well Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", "Bottom Of The Well Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", "Bottom Of The Well Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", "Bottom Of The Well Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", "Bottom Of The Well Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", "Bottom Of The Well Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", "Bottom Of The Well Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", "Bottom Of The Well Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", "Bottom Of The Well Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", "Bottom Of The Well Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", "Bottom Of The Well Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", "Bottom Of The Well Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", "Bottom Of The Well Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", "Bottom Of The Well Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", "Bottom Of The Well Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); - locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", "Ice Cavern Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); - locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", "Ice Cavern Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", "Ice Cavern Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", "Ice Cavern Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", "Ice Cavern Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", "Ice Cavern Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", "Ice Cavern Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); - locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", "Ice Cavern Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); - - // MQ Dungeon Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", "Dodongos Cavern MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", "Dodongos Cavern MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", "Dodongos Cavern MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", "Dodongos Cavern MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", "Dodongos Cavern MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", "Dodongos Cavern MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", "Dodongos Cavern MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", "Dodongos Cavern MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", "Dodongos Cavern MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", "Dodongos Cavern MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", "Dodongos Cavern MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", "Dodongos Cavern MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", "Dodongos Cavern MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", "Dodongos Cavern MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", "Dodongos Cavern MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", "Dodongos Cavern MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", "Dodongos Cavern MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", "Dodongos Cavern MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", "Dodongos Cavern MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", "Dodongos Cavern MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", "Dodongos Cavern MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", "Dodongos Cavern MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", "Dodongos Cavern MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", "Dodongos Cavern MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", "Dodongos Cavern MQ Armos SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", "Dodongos Cavern MQ Armos SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", "Dodongos Cavern MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", "Dodongos Cavern MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", "Dodongos Cavern MQ Armos NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", "Dodongos Cavern MQ Armos NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", "Jabu Jabus Belly MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", "Jabu Jabus Belly MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", "Jabu Jabus Belly MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", "Jabu Jabus Belly MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", "Jabu Jabus Belly MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", "Jabu Jabus Belly MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", "Jabu Jabus Belly MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", "Jabu Jabus Belly MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", "Jabu Jabus Belly MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", "Forest Temple MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", "Forest Temple MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", "Forest Temple MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", "Forest Temple MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", "Forest Temple MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", "Forest Temple MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", "Forest Temple MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", "Forest Temple MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", "Forest Temple MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", "Forest Temple MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", "Forest Temple MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", "Forest Temple MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", "Forest Temple MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", "Forest Temple MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", "Forest Temple MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", "Forest Temple MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", "Forest Temple MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", "Forest Temple MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", "Forest Temple MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", "Forest Temple MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", "Forest Temple MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", "Ganons Castle MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", "Ganons Castle MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", "Ganons Castle MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", "Ganons Castle MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", "Ganons Castle MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", "Ganons Castle MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", "Ganons Castle MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", "Ganons Castle MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", "Ganons Castle MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", "Ganons Castle MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", "Ganons Castle MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", "Ganons Castle MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", "Shadow Temple MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", "Shadow Temple MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", "Shadow Temple MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", "Shadow Temple MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", "Shadow Temple MQ Stone Umbrella Lower West Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", "Shadow Temple MQ Stone Umbrella Lower East Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", "Shadow Temple MQ Stone Umbrella Upper South Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", "Shadow Temple MQ Stone Umbrella Upper North Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", "Shadow Temple MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", "Shadow Temple MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", "Shadow Temple MQ Before Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", "Shadow Temple MQ Before Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", "Shadow Temple MQ After Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", "Shadow Temple MQ After Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", "Shadow Temple MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", "Shadow Temple MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", "Shadow Temple MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", "Bottom Of The Well MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", "Bottom Of The Well MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", "Bottom Of The Well MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", "Bottom Of The Well MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", "Bottom Of The Well MQ East Inner Room Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", "Bottom Of The Well MQ East Inner Room Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", "Bottom Of The Well MQ East Inner Room Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", "Fire Temple MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", "Fire Temple MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", "Fire Temple MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", "Fire Temple MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", "Fire Temple MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", "Fire Temple MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", "Fire Temple MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", "Fire Temple MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", "Fire Temple MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", "Fire Temple MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", "Fire Temple MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", "Fire Temple MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", "Fire Temple MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", "Fire Temple MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", "Fire Temple MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", "Fire Temple MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", "Fire Temple MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", "Fire Temple MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", "Fire Temple MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", "Fire Temple MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", "Fire Temple MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", "Fire Temple MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", "Fire Temple MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", "Fire Temple MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", "Fire Temple MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", "Fire Temple MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", "Fire Temple MQ South Fire Maze West Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", "Fire Temple MQ South Fire Maze East Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); - locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", "Ice Cavern MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", "Ice Cavern MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", "Ice Cavern MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", "Ice Cavern MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", "Ice Cavern MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", "Ice Cavern MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", "Ice Cavern MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", "Ice Cavern MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", "Ice Cavern MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", "Ice Cavern MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", "Ice Cavern MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", "Spirit Temple MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", "Spirit Temple MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", "Spirit Temple MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", "Spirit Temple MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", "Spirit Temple MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", "Spirit Temple MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", "Spirit Temple MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", "Spirit Temple MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", "Spirit Temple MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", "Spirit Temple MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", "Spirit Temple MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", "Spirit Temple MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", "Spirit Temple MQ Statue 2F Center East Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", "Spirit Temple MQ Statue Room 3F East Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", "Spirit Temple MQ Statue Room 3F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", "Spirit Temple MQ Statue 2F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", "Spirit Temple MQ Statue 2F Eastmost Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", "Spirit Temple MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", "Spirit Temple MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", "Spirit Temple MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", "Spirit Temple MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", "Spirit Temple MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", "Spirit Temple MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", "Spirit Temple MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", "Spirit Temple MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", "Spirit Temple MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", "Spirit Temple MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", "Spirit Temple MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", "Spirit Temple MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", "Water Temple MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", "Water Temple MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", "Water Temple MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", "Water Temple MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", "Water Temple MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", "Water Temple MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", "Water Temple MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", "Water Temple MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", "Water Temple MQ Lizalfos Hallway West Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", "Water Temple MQ Lizalfos Hallway South Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", "Water Temple MQ Lizalfos Hallway SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", "Water Temple MQ Lizalfos Cage North Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", "Water Temple MQ Lizalfos Cage South Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", "Water Temple MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", "Water Temple MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", "Water Temple MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", "Water Temple MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", "Water Temple MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", "Water Temple MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", "Water Temple MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", "Water Temple MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", "Water Temple MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", "Water Temple MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", "Water Temple MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", "Water Temple MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", "Water Temple MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", "Water Temple MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", "Water Temple MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", "Water Temple MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", "Water Temple MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", "Water Temple MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", "Gerudo Training Ground MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", "Gerudo Training Ground MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", "Gerudo Training Ground MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", "Gerudo Training Ground MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); - - // Fairies - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", "SFM Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", "SFM Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", "SFM Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, "Grotto Fairy 4", "SFM Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, "Grotto Fairy 5", "SFM Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, "Grotto Fairy 6", "SFM Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, "Grotto Fairy 7", "SFM Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, "Grotto Fairy 8", "SFM Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, "Grotto Fairy 1", "ZR Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, "Grotto Fairy 2", "ZR Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, "Grotto Fairy 3", "ZR Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, "Grotto Fairy 4", "ZR Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, "Grotto Fairy 5", "ZR Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, "Grotto Fairy 6", "ZR Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, "Grotto Fairy 7", "ZR Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, "Grotto Fairy 8", "ZR Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, "Grotto Fairy 1", "HF Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, "Grotto Fairy 2", "HF Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, "Grotto Fairy 3", "HF Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, "Grotto Fairy 4", "HF Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, "Grotto Fairy 5", "HF Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, "Grotto Fairy 6", "HF Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, "Grotto Fairy 7", "HF Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, "Grotto Fairy 8", "HF Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, "Grotto Fairy 1", "ZD Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, "Grotto Fairy 2", "ZD Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, "Grotto Fairy 3", "ZD Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, "Grotto Fairy 4", "ZD Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, "Grotto Fairy 5", "ZD Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, "Grotto Fairy 6", "ZD Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, "Grotto Fairy 7", "ZD Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, "Grotto Fairy 8", "ZD Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, "Grotto Fairy 1", "GF Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, "Grotto Fairy 2", "GF Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, "Grotto Fairy 3", "GF Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, "Grotto Fairy 4", "GF Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, "Grotto Fairy 5", "GF Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, "Grotto Fairy 6", "GF Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, "Grotto Fairy 7", "GF Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, "Grotto Fairy 8", "GF Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8)); - - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, "Shield Grave Fairy 1", "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, "Shield Grave Fairy 2", "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, "Shield Grave Fairy 3", "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, "Shield Grave Fairy 4", "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, "Shield Grave Fairy 5", "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, "Shield Grave Fairy 6", "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, "Shield Grave Fairy 7", "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, "Shield Grave Fairy 8", "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "Scrubs Fairy 1", "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "Scrubs Fairy 2", "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "Scrubs Fairy 3", "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "Scrubs Fairy 4", "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "Scrubs Fairy 5", "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "Scrubs Fairy 6", "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "Scrubs Fairy 7", "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "Scrubs Fairy 8", "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "MQ Scrubs Fairy 1", "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "MQ Scrubs Fairy 2", "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "MQ Scrubs Fairy 3", "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "MQ Scrubs Fairy 4", "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "MQ Scrubs Fairy 5", "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "MQ Scrubs Fairy 6", "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "MQ Scrubs Fairy 7", "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "MQ Scrubs Fairy 8", "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, "Oasis Fairy 1", "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_1)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, "Oasis Fairy 2", "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_2)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, "Oasis Fairy 3", "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_3)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, "Oasis Fairy 4", "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_4)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, "Oasis Fairy 5", "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_5)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, "Oasis Fairy 6", "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_6)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, "Oasis Fairy 7", "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_7)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, "Oasis Fairy 8", "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_8)); - - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, "Bean Sprout Fairy 1", "ZR Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, "Bean Sprout Fairy 2", "ZR Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, "Bean Sprout Fairy 3", "ZR Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, "Bean Sprout Fairy 1", "KF Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, "Bean Sprout Fairy 2", "KF Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, "Bean Sprout Fairy 3", "KF Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, "Bean Sprout Near Bridge Fairy 1", "LW Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, "Bean Sprout Near Bridge Fairy 2", "LW Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, "Bean Sprout Near Bridge Fairy 3", "LW Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, "Bean Sprout Near Theatre Fairy 1", "LW Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, "Bean Sprout Near Theatre Fairy 2", "LW Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, "Bean Sprout Near Theatre Fairy 3", "LW Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, "Bean Sprout Fairy 1", "LH Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, "Bean Sprout Fairy 2", "LH Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, "Bean Sprout Fairy 3", "LH Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, "Bean Sprout Fairy 1", "GV Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, "Bean Sprout Fairy 2", "GV Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, "Bean Sprout Fairy 3", "GV Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, "Bean Sprout Fairy 1", "Col Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, "Bean Sprout Fairy 2", "Col Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, "Bean Sprout Fairy 3", "Col Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, "Bean Sprout Fairy 1", "GY Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, "Bean Sprout Fairy 2", "GY Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, "Bean Sprout Fairy 3", "GY Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, "Bean Sprout Fairy 1", "DMC Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, "Bean Sprout Fairy 2", "DMC Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, "Bean Sprout Fairy 3", "DMC Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, "Bean Sprout Fairy 1", "DMT Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, "Bean Sprout Fairy 2", "DMT Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, "Bean Sprout Fairy 3", "DMT Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3)); - - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), "ToT Left Gossip Stone Fairy", "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), "ToT Left Gossip Stone Big Fairy", "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), "ToT Left Center Gossip Stone Fairy", "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), "ToT Left Center Gossip Stone Big Fairy", "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), "ToT Right Center Gossip Stone Fairy", "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), "ToT Right Center Gossip Stone Big Fairy", "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), "ToT Right Gossip Stone Fairy", "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), "ToT Right Gossip Stone Big Fairy", "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), "Gossip Stone Fairy", "DMC Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), "Gossip Stone Big Fairy", "DMC Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), "Gossip Stone Fairy", "DMT Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), "Gossip Stone Big Fairy", "DMT Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), "Gossip Stone Fairy", "Col Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY)); - locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), "Gossip Stone Big Fairy", "Col Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), "Gossip Stone Fairy", "DC Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY)); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), "Gossip Stone Big Fairy", "DC Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), "MQ Gossip Stone Fairy", "DC MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY)); - locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), "MQ Gossip Stone Big Fairy", "DC MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), "Gossip Stone Fairy", "GV Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY)); - locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), "Gossip Stone Big Fairy", "GV Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), "Maze Gossip Stone Fairy", "GC Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY)); - locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), "Maze Gossip Stone Big Fairy", "GC Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), "Medigoron Gossip Stone Fairy", "GC Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY)); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), "Medigoron Gossip Stone Big Fairy", "GC Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), "Gossip Stone Fairy", "GY Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY)); - locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), "Gossip Stone Big Fairy", "GY Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), "Malon Gossip Stone Fairy", "HC Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), "Malon Gossip Stone Big Fairy", "HC Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), "Rock Wall Gossip Stone Fairy", "HC Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), "Rock Wall Gossip Stone Big Fairy", "HC Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), "Storms Grotto Gossip Stone Fairy", "HC Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), "Storms Grotto Gossip Stone Big Fairy", "HC Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), "Deku Tree Left Gossip Stone Fairy", "KF Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), "Deku Tree Left Gossip Stone Big Fairy", "KF Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), "Deku Tree Right Gossip Stone Fairy", "KF Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), "Deku Tree Right Gossip Stone Big Fairy", "KF Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), "Gossip Stone Fairy", "KF Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), "Gossip Stone Big Fairy", "KF Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), "Storms Gossip Stone Fairy", "KF Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), "Storms Gossip Stone Big Fairy", "KF Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), "Lab Gossip Stone Fairy", "LH Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), "Lab Gossip Stone Big Fairy", "LH Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), "Southeast Gossip Stone Fairy", "LH Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), "Southeast Gossip Stone Big Fairy", "LH Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), "Southwest Gossip Stone Fairy", "LH Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), "Southwest Gossip Stone Big Fairy", "LH Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), "Gossip Stone Fairy", "LW Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY)); - locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), "Gossip Stone Big Fairy", "LW Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), "Maze Lower Gossip Stone Fairy", "SFM Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), "Maze Lower Gossip Stone Big Fairy", "SFM Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), "Maze Upper Gossip Stone Fairy", "SFM Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), "Maze Upper Gossip Stone Big Fairy", "SFM Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), "Saria Gossip Stone Fairy", "SFM Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), "Saria Gossip Stone Big Fairy", "SFM Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), "Gossip Stone Fairy", "ZD Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), "Gossip Stone Big Fairy", "ZD Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), "Fairy Gossip Stone Fairy", "ZF Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), "Fairy Gossip Stone Big Fairy", "ZF Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), "Jabu Gossip Stone Fairy", "ZF Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), "Jabu Gossip Stone Big Fairy", "ZF Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), "Near Grottos Gossip Stone Fairy", "ZR Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), "Near Grottos Gossip Stone Big Fairy", "ZR Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), "Near Domain Gossip Stone Fairy", "ZR Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), "Near Domain Gossip Stone Big Fairy", "ZR Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), "Cow Grotto Gossip Stone Fairy", "HF Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), "Cow Grotto Gossip Stone Big Fairy", "HF Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), "Near Market Gossip Stone Fairy", "HF Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), "Near Market Gossip Stone Big Fairy", "HF Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), "Southeast Gossip Stone Fairy", "HF Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), "Southeast Gossip Stone Big Fairy", "HF Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), "Open Grotto Gossip Stone Fairy", "HF Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), "Open Grotto Gossip Stone Big Fairy", "HF Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), "Open Grotto Gossip Stone Fairy", "Kak Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), "Open Grotto Gossip Stone Big Fairy", "Kak Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), "Open Grotto Gossip Stone Fairy", "ZR Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), "Open Grotto Gossip Stone Big Fairy", "ZR Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), "Near Shortcuts Gossip Stone Fairy", "LW Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), "Near Shortcuts Gossip Stone Big Fairy", "LW Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), "Storms Grotto Gossip Stone Fairy", "DMT Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), "Storms Grotto Gossip Stone Big Fairy", "DMT Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), "Upper Grotto Gossip Stone Fairy", "DMC Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), "Upper Grotto Gossip Stone Big Fairy", "DMC Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - - locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), "Island Sun's Song Fairy", "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_SUN_FAIRY)); - 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)); - locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), "Beamos Song of Storms Fairy", "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), "Pit Room Song of Storms Fairy", "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "Wind Hint Sun's Song Fairy", "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), "Basement Sun's Song Fairy", "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY)); - locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), "Entrance Song of Storms Fairy", "Ice Cavern Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY)); - locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_GERUDO_TRAINING_GROUND,SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), "Entrance Song of Storms Fairy", "GTG Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), "Spirit Trial Beamos Sun's Song Fairy", "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY)); - - locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), "MQ Lower Loop Stalfos Room Sun's Song Fairy", "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY)); - locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), "MQ Before Dark Link Pilar Sun's Song Fairy", "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), "MQ Before Dark Link Left Song of Storms Fairy", "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), "MQ Before Dark Link Right Sun's Song Fairy", "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY)); - locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "MQ Dinalfos Room Sun's Song Fairy", "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), "MQ Beamos Song of Storms Fairy", "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), "MQ Pit Room Song of Storms Fairy", "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); - - // Freestanding Hearts and Rupees - locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2)); - locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1009, 1556), "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_1)); - locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(2, -45), "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BRIDGE_RUPEE)); - locationTable[RC_KF_BEHIND_MIDOS_RUPEE] = Location::Collectable(RC_KF_BEHIND_MIDOS_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-364, -783), "Behind Mido's House Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEHIND_MIDOS_RUPEE)); - locationTable[RC_KF_SARIAS_ROOF_WEST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_WEST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(451, 810), "Saria's Roof West Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_ROOF_WEST_HEART)); - locationTable[RC_KF_SARIAS_ROOF_EAST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_EAST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(567, 819), "Saria's Roof East Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_ROOF_EAST_HEART)); - locationTable[RC_KF_SARIAS_ROOF_NORTH_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_NORTH_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(509, 725), "Saria's Roof North Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_ROOF_NORTH_HEART)); - locationTable[RC_KF_SOUTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-537, 194), "South Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE)); - locationTable[RC_KF_NORTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(35, -418), "North Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_WEST_RUPEE)); - locationTable[RC_KF_NORTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(107, -418), "North Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_EAST_RUPEE)); - locationTable[RC_KF_SOUTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-459, 181), "South Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE)); - locationTable[RC_KF_SARIAS_TOP_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(45, -52), "Saria's House Top Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_LEFT_HEART)); - locationTable[RC_KF_SARIAS_TOP_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(46, 56), "Saria's House Top Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_RIGHT_HEART)); - locationTable[RC_KF_SARIAS_BOTTOM_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(-46, -51), "Saria's House Bottom Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART)); - locationTable[RC_KF_SARIAS_BOTTOM_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, TWO_ACTOR_PARAMS(-46, 57), "Saria's House Bottom Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART)); - - locationTable[RC_KF_BEAN_RUPEE_1] = Location::Collectable(RC_KF_BEAN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -528), "Bean Platform Rupee 1", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_1)); - locationTable[RC_KF_BEAN_RUPEE_2] = Location::Collectable(RC_KF_BEAN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -567), "Bean Platform Rupee 2", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_2)); - locationTable[RC_KF_BEAN_RUPEE_3] = Location::Collectable(RC_KF_BEAN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -588), "Bean Platform Rupee 3", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_3)); - locationTable[RC_KF_BEAN_RUPEE_4] = Location::Collectable(RC_KF_BEAN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -567), "Bean Platform Rupee 4", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_4)); - locationTable[RC_KF_BEAN_RUPEE_5] = Location::Collectable(RC_KF_BEAN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -528), "Bean Platform Rupee 5", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_5)); - locationTable[RC_KF_BEAN_RUPEE_6] = Location::Collectable(RC_KF_BEAN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -508), "Bean Platform Rupee 6", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_6)); - locationTable[RC_KF_BEAN_RED_RUPEE] = Location::Collectable(RC_KF_BEAN_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -548), "Bean Platform Red Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RED_RUPEE)); - - locationTable[RC_LW_BOULDER_RUPEE] = Location::Collectable(RC_LW_BOULDER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1720, -2510), "Boulder Rupee", RHT_LOST_WOODS_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BOULDER_RUPEE)); - locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2215, -850), "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1)); - locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2164, -850), "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2)); - locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2113, -850), "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3)); - locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2061, -853), "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4)); - locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2194, -895), "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5)); - locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2156, -937), "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6)); - locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2193, -813), "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7)); - locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(2153, -779), "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8)); - - locationTable[RC_LH_FRONT_RUPEE] = Location::Collectable(RC_LH_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-940, 3968), "Underwater Front Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FRONT_RUPEE)); - locationTable[RC_LH_MIDDLE_RUPEE] = Location::Collectable(RC_LH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-868, 4090), "Underwater Middle Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_MIDDLE_RUPEE)); - locationTable[RC_LH_BACK_RUPEE] = Location::Collectable(RC_LH_BACK_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-861, 4212), "Underwater Back Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BACK_RUPEE)); - locationTable[RC_LH_LAB_FRONT_RUPEE] = Location::Collectable(RC_LH_LAB_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(68, -207), "Lab Front Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_FRONT_RUPEE)); - locationTable[RC_LH_LAB_LEFT_RUPEE] = Location::Collectable(RC_LH_LAB_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(-52, -32), "Lab Left Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_LEFT_RUPEE)); - locationTable[RC_LH_LAB_RIGHT_RUPEE] = Location::Collectable(RC_LH_LAB_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(-169, -124), "Lab Right Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_RIGHT_RUPEE)); - - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_1] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(385, -2766), "Dampe's Grave Rupee 1", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_2] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(528, -3216), "Dampe's Grave Rupee 2", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_3] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(753, -4828), "Dampe's Grave Rupee 3", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_4] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(570, -5599), "Dampe's Grave Rupee 4", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_5] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(1461, -5736), "Dampe's Grave Rupee 5", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_6] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2376, -4647), "Dampe's Grave Rupee 6", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_7] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(2573, -3758), "Dampe's Grave Rupee 7", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7)); - locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_8] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(1511, -3118), "Dampe's Grave Rupee 8", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8)); - - locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-42, 880), "Octorok Grotto Front Left Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(58, 803), "Octorok Grotto Back Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(90, 910), "Octorok Grotto Front Right Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-68, 959), "Octorok Grotto Front Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(132, 961), "Octorok Grotto Front Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-38, 768), "Octorok Grotto Back Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(121, 784), "Octorok Grotto Back Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE)); - locationTable[RC_GV_OCTOROK_GROTTO_RED_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(32, 852), "Octorok Grotto Red Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE)); - - locationTable[RC_DMT_RED_RUPEE] = Location::Collectable(RC_DMT_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-625, -55), "Red Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_RED_RUPEE)); - locationTable[RC_DMT_BLUE_RUPEE] = Location::Collectable(RC_DMT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(-1060, -51), "Blue Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BLUE_RUPEE)); - locationTable[RC_DMT_COW_GROTTO_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2287, -412), "Cow Grotto Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_LEFT_HEART)); - locationTable[RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2371, -532), "Cow Grotto Middle Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART)); - locationTable[RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2449, -534), "Cow Grotto Middle Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART)); - locationTable[RC_DMT_COW_GROTTO_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2569, -432), "Cow Grotto Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RIGHT_HEART)); - locationTable[RC_DMT_COW_GROTTO_RUPEE_1] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -100), "Cow Grotto Rupee 1", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_1)); - locationTable[RC_DMT_COW_GROTTO_RUPEE_2] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -139), "Cow Grotto Rupee 2", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_2)); - locationTable[RC_DMT_COW_GROTTO_RUPEE_3] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -160), "Cow Grotto Rupee 3", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_3)); - locationTable[RC_DMT_COW_GROTTO_RUPEE_4] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -139), "Cow Grotto Rupee 4", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_4)); - locationTable[RC_DMT_COW_GROTTO_RUPEE_5] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -100), "Cow Grotto Rupee 5", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_5)); - locationTable[RC_DMT_COW_GROTTO_RUPEE_6] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -80), "Cow Grotto Rupee 6", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_6)); - locationTable[RC_DMT_COW_GROTTO_RED_RUPEE] = Location::Collectable(RC_DMT_COW_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -120), "Cow Grotto Red Rupee", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RED_RUPEE)); - - locationTable[RC_DMC_NEAR_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_NEAR_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(675, -718), "Near Warp Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE)); - locationTable[RC_DMC_MIDDLE_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1117, -185), "Middle Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE)); - locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1117, -248), "Middle Platform Blue Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1)); - locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1116, -128), "Middle Platform Blue Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2)); - locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1159, -162), "Middle Platform Blue Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3)); - locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1158, -227), "Middle Platform Blue Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4)); - locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1078, -226), "Middle Platform Blue Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5)); - locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1078, -164), "Middle Platform Blue Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6)); - locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 454), "Distant Platform Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1)); - locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 415), "Distant Platform Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2)); - locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 395), "Distant Platform Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3)); - locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 415), "Distant Platform Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4)); - locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 454), "Distant Platform Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5)); - locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 475), "Distant Platform Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6)); - locationTable[RC_DMC_DISTANT_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 435), "Distant Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE)); - - locationTable[RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4216, -1464), "Beneath Domain Red Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE)); - locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4171, -1436), "Beneath Domain Red Middle Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE)); - locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4171, -1376), "Beneath Domain Red Middle Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE)); - locationTable[RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(4224, -1339), "Beneath Domain Red Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE)); - - locationTable[RC_ZF_BOTTOM_NORTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(68, -166), "Bottom North Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(172, -35), "Bottom Northeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(137, 130), "Bottom Southeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-76, 172), "Bottom South Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-207, 47), "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-173, -132), "Bottom Northwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(242, -576), "Bottom North Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(540, -124), "Bottom Northeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(397, 318), "Bottom Southeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-166, 428), "Bottom South Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-574, 163), "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-464, -389), "Bottom Northwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(353, -934), "Bottom North Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(1032, -254), "Bottom Northeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(603, 466), "Bottom Southeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-227, 696), "Bottom South Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE)); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-847, 206), "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE)); - locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-857, -654), "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE)); - - locationTable[RC_DEKU_TREE_LOBBY_LOWER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-25, -81), "Lobby Lower Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART)); - locationTable[RC_DEKU_TREE_LOBBY_UPPER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_UPPER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(87, -16), "Lobby Upper Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART)); - locationTable[RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-885, -185), "Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART)); - locationTable[RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-820, -76), "Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART)); - locationTable[RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-354, -206), "Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART)); - - locationTable[RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4266, -1575), "Lower Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART)); - locationTable[RC_DODONGOS_CAVERN_BLADE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2039, -317), "Blade Room Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART)); - locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3553, -1962), "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART)); - locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3580, -2004), "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART)); - - locationTable[RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1124, -2855), "West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART)); - locationTable[RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1165, -2788), "West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART)); - locationTable[RC_FOREST_TEMPLE_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(307, -1734), "Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART)); - locationTable[RC_FOREST_TEMPLE_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(251, -1735), "Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART)); - - locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3476, -359), "Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART)); - locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3476, -295), "Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART)); - locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3526, -339), "Fire Pillar Room Back Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART)); - locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1753, -136), "East Central Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART)); - locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1813, -37), "East Central Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART)); - locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1783, -91), "East Central Room Middle Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART)); - locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(862, -169), "Fire Wall Chase East Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART)); - locationTable[RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(603, -190), "Fire Wall Chase West Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART)); - locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1381, -1120), "Fire Wall Chase Exit Platform Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART)); - - locationTable[RC_WATER_TEMPLE_RIVER_HEART_1] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2781, -2515), "River Heart 1", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_1)); - locationTable[RC_WATER_TEMPLE_RIVER_HEART_2] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2528, -2727), "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_2)); - locationTable[RC_WATER_TEMPLE_RIVER_HEART_3] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2436, -3348), "River Heart 3", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_3)); - locationTable[RC_WATER_TEMPLE_RIVER_HEART_4] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_4, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2021, -2937), "River Heart 4", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_4)); - - locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5676, 1565), "Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART)); - locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5695, 1589), "Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART)); - locationTable[RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3971, -1716), "Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART)); - locationTable[RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3970, -1560), "Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART)); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3471, -884), "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART)); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3473, -927), "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART)); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3164, -646), "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART)); - - locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(708, 227), "Adult Climb Left Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART)); - locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(661, 227), "Adult Climb Right Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART)); - - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-67, -748), "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE)); - 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_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)); - - locationTable[RC_ICE_CAVERN_LOBBY_RUPEE] = Location::Collectable(RC_ICE_CAVERN_LOBBY_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-105, 854), "Lobby Rupee", RHT_ICE_CAVERN_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_RUPEE)); - locationTable[RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1171, -2258), "Map Room Left Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART)); - locationTable[RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1212, -2213), "Map Room Middle Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART)); - locationTable[RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1166, -2173), "Map Room Right Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART)); - locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1699, -697), "Sliding Block Room Rupee 1", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1)); - locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1648, -715), "Sliding Block Room Rupee 2", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2)); - locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1648, -677), "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3)); - - locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1486, 204), "Beamos South Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART)); - locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1858, -183), "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART)); - - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1855, -3953), "Shadow Trial Heart 1", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1844, -4038), "Shadow Trial Heart 2", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1827, -4106), "Shadow Trial Heart 3", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1636, -3069), "Fire Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-517, 592), "Spirit Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART)); - - locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1128, 1571), "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART)); - locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-594, 840), "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-22, -88), "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1165, 325), "MQ Slingshot Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-885, -185), "MQ Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-820, -76), "MQ Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-354, -206), "MQ Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART)); - - locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4266, -1575), "MQ Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1955, -596), "MQ Torch Room Invisible Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART)); - - locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-390, -1695), "MQ Lift Room Underwater Rupee 1", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-487, -1701), "MQ Lift Room Underwater Rupee 2", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-549, -1709), "MQ Lift Room Underwater Rupee 3", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-217, -1620), "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-206, -1797), "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2)); - - locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1124, -2855), "MQ West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART)); - locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1157, -2798), "MQ West Courtyard Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART)); - locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-1184, -2744), "MQ West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART)); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(115, -1755), "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART)); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(15, -1755), "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART)); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(215, -1755), "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART)); - - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3476, -331), "MQ Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3502, 320), "MQ Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(3307, 180), "MQ Fire Pillar Room Lower Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART)); - - locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5676, 1565), "MQ Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART)); - locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5695, 1589), "MQ Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART)); - locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3971, -1716), "MQ Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART)); - locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3970, -1560), "MQ Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3471, -884), "MQ After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3473, -927), "MQ After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-3164, -646), "MQ After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART)); - - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -535), "MQ Child Early Left Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-976, -535), "MQ Child Early Right Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART)); - - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-1945, -863), "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-83, -350), "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-83, -274), "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-2143, -621), "MQ Coffin Room Middle Left Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1083, -1174), "MQ Basement Hallway Front Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1044, -1223), "MQ Basement Hallway Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1114, -1223), "MQ Basement Hallway Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART)); - - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1743, -528), "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2506, -1096), "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2655, -549), "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART)); - // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, SCENE_DEATH_MOUNTAIN_CRATER, 14341, "Gossip Stone"); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, "Gossip Stone"); @@ -2121,10 +1059,14 @@ void Rando::StaticData::InitLocationTable() { // // Init locationNameToEnum locationNameToEnum["Invalid Location"] = RC_UNKNOWN_CHECK; locationNameToEnum["Link's Pocket"] = RC_LINKS_POCKET; +} +void Rando::StaticData::InitHashMaps() { for (auto& location : locationTable) { locationNameToEnum[location.GetName()] = location.GetRandomizerCheck(); - CheckFromActorMultimap.emplace(std::make_tuple((int16_t)location.GetActorID(), (int16_t)location.GetScene(), location.GetActorParams()), location.GetRandomizerCheck()); + CheckFromActorMultimap.emplace( + std::make_tuple((int16_t)location.GetActorID(), (int16_t)location.GetScene(), location.GetActorParams()), + location.GetRandomizerCheck()); } } diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 4a516d72f..852fe3841 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -48,6 +48,11 @@ class StaticData { static std::vector GetOverworldFishLocations(); static std::vector GetOverworldPotLocations(); static std::vector GetOverworldFairyLocations(); + static void RegisterFishLocations(); + static void RegisterFairyLocations(); + static void RegisterPotLocations(); + static void RegisterFreestandingLocations(); + static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; static std::vector oldVerHintOrder; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index d128c0eba..bca2693e5 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -393,7 +393,6 @@ OTRGlobals::OTRGlobals() { 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(); Rando::Settings::GetInstance()->CreateOptions(); gRandomizer = std::make_shared(); @@ -1166,6 +1165,9 @@ extern "C" void InitOTR() { SohGui::SetupGuiElements(); ShipInit::InitAll(); + + Rando::StaticData::InitHashMaps(); + OTRGlobals::Instance->gRandoContext->AddExcludedOptions(); AudioCollection::Instance = new AudioCollection(); ActorDB::Instance = new ActorDB(); #ifdef __APPLE__ From 8f3711f008003f9e67f5c01556c74a81da5098e4 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 8 Feb 2025 19:08:52 +0100 Subject: [PATCH 024/267] simplify pause menu link (#5013) --- soh/soh/Enhancements/presets.h | 11 - soh/soh/SohGui/SohMenuBar.cpp | 47 +---- soh/soh/config/ConfigMigrators.h | 4 - soh/src/code/z_kaleido_setup.c | 4 +- soh/src/code/z_player_lib.c | 190 ++---------------- .../ovl_kaleido_scope/z_kaleido_equipment.c | 46 +---- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 2 +- 7 files changed, 21 insertions(+), 283 deletions(-) diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index b7b7100b9..a0b7e6c24 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -153,8 +153,6 @@ const std::vector enhancementsCvars = { CVAR_ENHANCEMENT("InstantScarecrow"), CVAR_ENHANCEMENT("BlueFireArrows"), CVAR_ENHANCEMENT("SunlightArrows"), - CVAR_ENHANCEMENT("PauseLiveLinkRotation"), - CVAR_ENHANCEMENT("PauseLiveLink"), CVAR_ENHANCEMENT("MinFrameCount"), CVAR_ENHANCEMENT("NewDrops"), CVAR_ENHANCEMENT("DisableBlackBars"), @@ -240,7 +238,6 @@ const std::vector enhancementsCvars = { CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), CVAR_Z_FIGHTING_MODE, CVAR_ENHANCEMENT("AuthenticLogo"), - CVAR_ENHANCEMENT("PauseLiveLinkRotationSpeed"), CVAR_ENHANCEMENT("BowReticle"), CVAR_ENHANCEMENT("BoomerangFirstPerson"), CVAR_ENHANCEMENT("BoomerangReticle"), @@ -617,9 +614,6 @@ const std::vector vanillaPlusPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - // Pause link animation (0 to 16) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseLiveLink"), 1), - // Dynamic Wallet Icon PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), // Always show dungeon entrances @@ -692,9 +686,6 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - // Pause link animation (0 to 16) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseLiveLink"), 1), - // Dynamic Wallet Icon PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), // Always show dungeon entrances @@ -951,8 +942,6 @@ const std::vector randomizerPresetEntries = { // Color Temple of Time's Medallions PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToTMedallionsColors"), 1), - // Pause link animation (0 to 16) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseLiveLink"), 16), // Frames to wait PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinFrameCount"), 200), diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index f1c86bc69..0c974f599 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -1335,52 +1335,7 @@ void DrawEnhancementsMenu() { UIWidgets::Spacer(0); - if (ImGui::BeginMenu("Animated Link in Pause Menu")) { - ImGui::Text("Rotation"); - UIWidgets::EnhancementRadioButton("Disabled", CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 0); - UIWidgets::EnhancementRadioButton("Rotate Link with D-pad", CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 1); - UIWidgets::Tooltip("Allow you to rotate Link on the Equipment menu with the D-pad\nUse D-pad Up or D-pad Down to reset Link's rotation"); - UIWidgets::EnhancementRadioButton("Rotate Link with C-buttons", CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 2); - UIWidgets::Tooltip("Allow you to rotate Link on the Equipment menu with the C-buttons\nUse C-Up or C-Down to reset Link's rotation"); - UIWidgets::EnhancementRadioButton("Rotate Link with Right Stick", CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 3); - UIWidgets::Tooltip("Allow you to rotate Link on the Equipment menu with the Right Stick\nYou can zoom in by pointing up and reset Link's rotation by pointing down"); - if (CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 0) != 0) { - UIWidgets::EnhancementSliderInt("Rotation Speed: %d", "##MinRotationSpeed", CVAR_ENHANCEMENT("PauseLiveLinkRotationSpeed"), 1, 20, "", 1); - } - UIWidgets::PaddedSeparator(); - ImGui::Text("Static loop"); - UIWidgets::EnhancementRadioButton("Disabled", CVAR_ENHANCEMENT("PauseLiveLink"), 0); - UIWidgets::EnhancementRadioButton("Idle (standing)", CVAR_ENHANCEMENT("PauseLiveLink"), 1); - UIWidgets::EnhancementRadioButton("Idle (look around)", CVAR_ENHANCEMENT("PauseLiveLink"), 2); - UIWidgets::EnhancementRadioButton("Idle (belt)", CVAR_ENHANCEMENT("PauseLiveLink"), 3); - UIWidgets::EnhancementRadioButton("Idle (shield)", CVAR_ENHANCEMENT("PauseLiveLink"), 4); - UIWidgets::EnhancementRadioButton("Idle (test sword)", CVAR_ENHANCEMENT("PauseLiveLink"), 5); - UIWidgets::EnhancementRadioButton("Idle (yawn)", CVAR_ENHANCEMENT("PauseLiveLink"), 6); - UIWidgets::EnhancementRadioButton("Battle Stance", CVAR_ENHANCEMENT("PauseLiveLink"), 7); - UIWidgets::EnhancementRadioButton("Walking (no shield)", CVAR_ENHANCEMENT("PauseLiveLink"), 8); - UIWidgets::EnhancementRadioButton("Walking (holding shield)", CVAR_ENHANCEMENT("PauseLiveLink"), 9); - UIWidgets::EnhancementRadioButton("Running (no shield)", CVAR_ENHANCEMENT("PauseLiveLink"), 10); - UIWidgets::EnhancementRadioButton("Running (holding shield)", CVAR_ENHANCEMENT("PauseLiveLink"), 11); - UIWidgets::EnhancementRadioButton("Hand on hip", CVAR_ENHANCEMENT("PauseLiveLink"), 12); - UIWidgets::EnhancementRadioButton("Spin attack charge", CVAR_ENHANCEMENT("PauseLiveLink"), 13); - UIWidgets::EnhancementRadioButton("Look at hand", CVAR_ENHANCEMENT("PauseLiveLink"), 14); - UIWidgets::PaddedSeparator(); - ImGui::Text("Randomize"); - UIWidgets::EnhancementRadioButton("Random", CVAR_ENHANCEMENT("PauseLiveLink"), 15); - UIWidgets::Tooltip("Randomize the animation played each time you open the menu"); - UIWidgets::EnhancementRadioButton("Random cycle", CVAR_ENHANCEMENT("PauseLiveLink"), 16); - UIWidgets::Tooltip("Randomize the animation played on the menu after a certain time"); - UIWidgets::EnhancementRadioButton("Random cycle (Idle)", CVAR_ENHANCEMENT("PauseLiveLink"), 17); - UIWidgets::Tooltip("Randomize the animation played on the menu after a certain time (Idle animations only)"); - if (CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLink"), 0) >= 16) { - UIWidgets::EnhancementSliderInt("Frame to wait: %d", "##MinFrameCount", CVAR_ENHANCEMENT("MinFrameCount"), 1, 1000, "", 0); - } - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - + UIWidgets::PaddedEnhancementCheckbox("Animated Link in Pause Menu", CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), false, false); UIWidgets::PaddedEnhancementCheckbox("Disable LOD", CVAR_ENHANCEMENT("DisableLOD"), true, false); UIWidgets::Tooltip( "Turns off the Level of Detail setting, making models use their higher-poly variants at any distance"); diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index 48e1e708b..ea5f1cf70 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -30,7 +30,6 @@ namespace SOH { { MigrationAction::Rename, "gPrevTime", "gGeneral.PrevTime" }, { MigrationAction::Rename, "gSwitchTimeline", "gGeneral.SwitchTimeline" }, { MigrationAction::Rename, "gSpoilerLog", "gGeneral.SpoilerLog" }, - { MigrationAction::Rename, "gPauseTriforce", "gGeneral.PauseTriforce" }, { MigrationAction::Rename, "gRestoreQPA", "gGeneral.RestoreQPA" }, { MigrationAction::Rename, "gFixIceTrapWithBunnyHood", "gGeneral.FixIceTrapWithBunnyHood" }, { MigrationAction::Rename, "gBetterDebugWarpScreenCurrentScene", "gGeneral.BetterDebugWarpScreenCurrentScene" }, @@ -284,9 +283,6 @@ namespace SOH { { MigrationAction::Rename, "gOcarinaGameRoundTwoNotes", "gEnhancements.OcarinaGameRoundTwoNotes" }, { MigrationAction::Rename, "gOcarinaGameStartingNotes", "gEnhancements.OcarinaGameStartingNotes" }, { MigrationAction::Rename, "gOcarinaUnlimitedFailTime", "gEnhancements.OcarinaUnlimitedFailTime" }, - { MigrationAction::Rename, "gPauseLiveLink", "gEnhancements.PauseLiveLink" }, - { MigrationAction::Rename, "gPauseLiveLinkRotation", "gEnhancements.PauseLiveLinkRotation" }, - { MigrationAction::Rename, "gPauseLiveLinkRotationSpeed", "gEnhancements.PauseLiveLinkRotationSpeed" }, { MigrationAction::Rename, "gPauseWarp", "gEnhancements.PauseWarp" }, { MigrationAction::Rename, "gPermanentHeartLoss", "gEnhancements.PermanentHeartLoss" }, { MigrationAction::Rename, "gQuickBongoKill", "gEnhancements.QuickBongoKill" }, diff --git a/soh/src/code/z_kaleido_setup.c b/soh/src/code/z_kaleido_setup.c index 45992279d..c6b5205ef 100644 --- a/soh/src/code/z_kaleido_setup.c +++ b/soh/src/code/z_kaleido_setup.c @@ -27,9 +27,9 @@ void KaleidoSetup_Update(PlayState* play) { gSaveContext.unk_13EE = gSaveContext.unk_13EA; if (CHECK_BTN_ALL(input->cur.button, BTN_L)) - CVarSetInteger(CVAR_GENERAL("PauseTriforce"), 1); + CVarSetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 1); else - CVarSetInteger(CVAR_GENERAL("PauseTriforce"), 0); + CVarSetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0); WREG(16) = -175; diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 33a8c5bb5..af6062723 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -2101,9 +2101,6 @@ s32 Player_OverrideLimbDrawPause(PlayState* play, s32 limbIndex, Gfx** dList, Ve type = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_SHEATH]; if ((type == PLAYER_MODELTYPE_SHEATH_18) || (type == PLAYER_MODELTYPE_SHEATH_19)) { dListOffset = playerSwordAndShield[1] * ptrSize; - } else if (type == PLAYER_MODELTYPE_SHEATH_16 && CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLink"), 0)) { - //if (playerSwordAndShield[0] == 1) - //dListOffset = 4; } } else if (limbIndex == PLAYER_LIMB_WAIST) { type = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_WAIST]; @@ -2211,8 +2208,8 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, playerSwordAndShield[0] = sword; playerSwordAndShield[1] = shield; - Matrix_SetTranslateRotateYXZ(pos->x - ((CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLink"), 0) && LINK_AGE_IN_YEARS == YEARS_ADULT) ? 25 : 0), - pos->y - (CVarGetInteger(CVAR_GENERAL("PauseTriforce"), 0) ? 16 : 0), pos->z, rot); + Matrix_SetTranslateRotateYXZ(pos->x - ((CVarGetInteger(CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), 0) && LINK_AGE_IN_YEARS == YEARS_ADULT) ? 25 : 0), + pos->y - (CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0) ? 16 : 0), pos->z, rot); Matrix_Scale(scale * (mirrorWorldActive ? -1 : 1), scale, scale, MTXMODE_APPLY); gSPSegment(POLY_OPA_DISP++, 0x04, gameplayKeep); @@ -2231,7 +2228,7 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, Player_DrawImpl(play, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount, 0, tunic, boots, 0, Player_OverrideLimbDrawPause, NULL, &playerSwordAndShield); - if (CVarGetInteger(CVAR_GENERAL("PauseTriforce"), 0)) { + if (CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0)) { Matrix_SetTranslateRotateYXZ(pos->x - (LINK_AGE_IN_YEARS == YEARS_ADULT ? 25 : 0), pos->y + 280 + (LINK_AGE_IN_YEARS == YEARS_ADULT ? 48 : 0), pos->z, rot); @@ -2255,11 +2252,6 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, CLOSE_DISPS(play->state.gfxCtx); } -uintptr_t SelectedAnim = 0; // Current Animaiton on the menu -s16 EquipedStance; // Link's current mode (Two handed, One handed...) -s16 FrameCountSinceLastAnim = 0; // Time since last animation -s16 MinFrameCount; // Frame to wait before checking if we need to change the animation - void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f* pos, Vec3s* rot, f32 scale, s32 sword, s32 tunic, s32 shield, s32 boots) { Input* p1Input = &play->state.input[0]; @@ -2269,35 +2261,19 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f* Vec3s* srcTable; s32 i; bool canswitchrnd = false; - s16 SelectedMode = CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLink"), 0); - MinFrameCount = CVarGetInteger(CVAR_ENHANCEMENT("MinFrameCount"), 200); gSegments[4] = VIRTUAL_TO_PHYSICAL(segment + 0x3800); gSegments[6] = VIRTUAL_TO_PHYSICAL(segment + 0x8800); - uintptr_t* PauseMenuAnimSet[15][4] = { - { 0, 0, 0, 0 }, // 0 = none - // IDLE // Two Handed // No shield // Kid Hylian Shield - { gPlayerAnim_link_normal_wait, gPlayerAnim_link_fighter_wait_long, gPlayerAnim_link_normal_wait_free, gPlayerAnim_link_normal_wait_free }, // Idle - { gPlayerAnim_link_normal_waitF_typeA_20f, gPlayerAnim_link_normal_waitF_typeA_20f, gPlayerAnim_link_normal_waitF_typeA_20f, gPlayerAnim_link_normal_waitF_typeA_20f }, // Idle look around - { gPlayerAnim_link_waitF_itemA_20f, gPlayerAnim_link_waitF_itemA_20f, gPlayerAnim_link_waitF_itemA_20f, gPlayerAnim_link_waitF_itemA_20f }, // Idle Belt - { gPlayerAnim_link_wait_itemC_20f, gPlayerAnim_link_wait_itemC_20f, gPlayerAnim_link_wait_itemC_20f, gPlayerAnim_link_wait_itemC_20f }, // Idle shield adjust - { gPlayerAnim_link_wait_itemD1_20f, gPlayerAnim_link_wait_itemD2_20f, gPlayerAnim_link_wait_itemD1_20f, gPlayerAnim_link_wait_itemD1_20f }, // Idle test sword - { gPlayerAnim_link_waitF_typeD_20f, gPlayerAnim_link_waitF_typeD_20f, gPlayerAnim_link_waitF_typeD_20f, gPlayerAnim_link_waitF_typeD_20f }, // Idle yawn - { gPlayerAnim_link_anchor_waitR, gPlayerAnim_link_fighter_waitR_long, gPlayerAnim_link_anchor_waitR, gPlayerAnim_link_anchor_waitR }, // Battle Stance - { gPlayerAnim_link_normal_walk_free, gPlayerAnim_link_fighter_walk_long, gPlayerAnim_link_normal_walk_free, gPlayerAnim_link_normal_walk_free }, // Walking (No shield) - { gPlayerAnim_link_normal_walk, gPlayerAnim_link_fighter_walk_long, gPlayerAnim_link_normal_walk, gPlayerAnim_link_normal_walk }, // Walking (Holding shield) - { gPlayerAnim_link_normal_run, gPlayerAnim_link_fighter_run_long, gPlayerAnim_link_normal_run, gPlayerAnim_link_normal_run }, // Running (No shield) - { gPlayerAnim_link_normal_run_free, gPlayerAnim_link_fighter_run_long, gPlayerAnim_link_normal_run_free, gPlayerAnim_link_normal_run_free }, // Running (Holding shield) - { gPlayerAnim_link_normal_talk_free_wait, gPlayerAnim_link_normal_talk_free_wait, gPlayerAnim_link_normal_talk_free_wait, gPlayerAnim_link_normal_talk_free_wait }, // Hand on hip - { gPlayerAnim_link_fighter_power_kiru_wait, gPlayerAnim_link_fighter_Lpower_kiru_wait, gPlayerAnim_link_fighter_power_kiru_wait, gPlayerAnim_link_fighter_power_kiru_wait }, // Spin Charge - { gPlayerAnim_link_demo_look_hand_wait, gPlayerAnim_link_demo_look_hand_wait, gPlayerAnim_link_demo_look_hand_wait, gPlayerAnim_link_demo_look_hand_wait }, // Look at hand + uintptr_t* PauseMenuAnimSet[4] = { + // IDLE // Two Handed // No shield // Kid Hylian Shield + gPlayerAnim_link_normal_wait, gPlayerAnim_link_fighter_wait_long, gPlayerAnim_link_normal_wait_free, gPlayerAnim_link_normal_wait_free }; - s16 AnimArraySize = ARRAY_COUNT(PauseMenuAnimSet); - if (CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLink"), 0) || CVarGetInteger(CVAR_GENERAL("PauseTriforce"), 0)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), 0) || CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0)) { uintptr_t anim = 0; // Initialise anim + s16 EquipedStance; if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) >= EQUIP_VALUE_SWORD_BIGGORON) { EquipedStance = 1; } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SWORD_NONE) { @@ -2308,159 +2284,17 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f* // Link is idle so revert to 0 EquipedStance = 0; } - if (SelectedMode == 16) { - // Apply Random function - s16 SwitchAtFrame = 0; - s16 CurAnimDuration = 0; - if (FrameCountSinceLastAnim == 0) { - // When opening Kaleido this will be passed one time - SelectedAnim = rand() % (AnimArraySize - 0); - if (SelectedAnim == 0) { - // prevent loading 0 that would result to a crash. - SelectedAnim = 1; - } - } else if (FrameCountSinceLastAnim >= 1) { - SwitchAtFrame = Animation_GetLastFrame(PauseMenuAnimSet[SelectedAnim][EquipedStance]); - CurAnimDuration = Animation_GetLastFrame(PauseMenuAnimSet[SelectedAnim][EquipedStance]); - if (SwitchAtFrame < MinFrameCount) { - // Animation frame count is lower than minimal wait time then we wait for another round. - // This will be looped to always add current animation time if that still lower than minimum time - while (SwitchAtFrame < MinFrameCount) { - SwitchAtFrame = SwitchAtFrame + CurAnimDuration; - } - } else if (CurAnimDuration >= MinFrameCount) { - // Since we have more (or same) animation time than min duration we set the wait time to animation - // time. - SwitchAtFrame = CurAnimDuration; - } - if (FrameCountSinceLastAnim >= SwitchAtFrame) { - SelectedAnim = rand() % (AnimArraySize - 0); - if (SelectedAnim == 0) { - // prevent loading 0 that would result to a crash. - SelectedAnim = 1; - } - FrameCountSinceLastAnim = 1; - } - anim = PauseMenuAnimSet[SelectedAnim][EquipedStance]; - } - FrameCountSinceLastAnim++; - } else if (SelectedMode == 17) { - // Apply Random function - s16 SwitchAtFrame = 0; - s16 CurAnimDuration = 0; - s16 LastAnim; - if (FrameCountSinceLastAnim == 0) { - // When opening Kaleido this will be passed one time - SelectedAnim = (rand() % (6 - 1 + 1)) + 1; - if (SelectedAnim == 0) { - // prevent loading 0 that would result to a crash. - SelectedAnim = 1; - } - } else if (FrameCountSinceLastAnim >= 1) { - SwitchAtFrame = Animation_GetLastFrame(PauseMenuAnimSet[SelectedAnim][EquipedStance]); - CurAnimDuration = Animation_GetLastFrame(PauseMenuAnimSet[SelectedAnim][EquipedStance]); - if (SwitchAtFrame < MinFrameCount) { - // Animation frame count is lower than minimal wait time then we wait for another round. - // This will be looped to always add current animation time if that still lower than minimum time - while (SwitchAtFrame < MinFrameCount) { - SwitchAtFrame = SwitchAtFrame + CurAnimDuration; - } - } else if (CurAnimDuration >= MinFrameCount) { - // Since we have more (or same) animation time than min duration we set the wait time to animation - // time. - SwitchAtFrame = CurAnimDuration; - } - if (FrameCountSinceLastAnim >= SwitchAtFrame) { - LastAnim = SelectedAnim; - if (LastAnim==1) { - if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_NONE)) { // if the player has a sword and shield equipped - if ((LINK_AGE_IN_YEARS == YEARS_ADULT) || (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU)) { // if he's an adult or a kid with the deku shield - SelectedAnim = (rand() % (6 - 2 + 1)) + 2; // select any 5 animations that aren't the default standing anim - } else { //else if he's a child with a shield that isn't the deku shield - s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations - if (randval==4) { //if its the shield anim - SelectedAnim==6; // set to yawn anim - } else { - SelectedAnim=randval; - } - } - } else if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_NONE)) { // if the player has a sword equipped but no shield - s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations - if (randval==4) { //if its the shield anim - SelectedAnim==6; // set to yawn anim - } else { - SelectedAnim=randval; - } - } else if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_NONE)) { //if the player has a shield equipped but no sword - if ((LINK_AGE_IN_YEARS == YEARS_ADULT) || (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU)) {// if he's an adult or a kid with the deku shield - s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations - if (randval==5) { //if its the sword anim - SelectedAnim==6; // set to yawn anim - } else { - SelectedAnim=randval; - } - } else { - s16 randval = (rand() % (4 - 2 + 1)) + 2; // 3 animations - if (randval==4) { //if its the shield anim - SelectedAnim==6; // set to yawn anim - } else { - SelectedAnim=randval; - } - } - } else if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_NONE)) { // if the player has no sword or shield equipped - s16 randval = (rand() % (4 - 2 + 1)) + 2; // 3 animations - if (randval==4) { //if its the shield anim - SelectedAnim==6; // set to yawn anim - } else { - SelectedAnim=randval; - } - } - } else { - SelectedAnim = 1; - } - if (SelectedAnim == 0) { - // prevent loading 0 that would result to a crash. Also makes sure default idle is every other anim - SelectedAnim = 1; - } - FrameCountSinceLastAnim = 1; - } - anim = PauseMenuAnimSet[SelectedAnim][EquipedStance]; - } - FrameCountSinceLastAnim++; - } else if (SelectedMode == 15) { - // When opening Kaleido this will be passed one time - if (FrameCountSinceLastAnim < 1) { - SelectedAnim = rand() % (AnimArraySize - 0); - FrameCountSinceLastAnim++; - if (SelectedAnim == 0) { - // prevent loading 0 that would result to a crash. - SelectedAnim = 1; - } - FrameCountSinceLastAnim = 1; - } - if (CHECK_BTN_ALL(p1Input->press.button, BTN_B) || CHECK_BTN_ALL(p1Input->press.button, BTN_START)) { - FrameCountSinceLastAnim = 0; - } - anim = PauseMenuAnimSet[SelectedAnim][EquipedStance]; - } else if (SelectedMode < 16) { - // Not random so we place our CVar as SelectedAnim - SelectedAnim = SelectedMode; - anim = PauseMenuAnimSet[SelectedAnim][EquipedStance]; - } - anim = PauseMenuAnimSet[SelectedAnim][EquipedStance]; - - //anim = gPlayerAnim_link_wait_itemD2_20f; // Use for biggoron sword? - - if (CVarGetInteger(CVAR_GENERAL("PauseTriforce"), 0)) { + if (!CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0)) { + anim = PauseMenuAnimSet[EquipedStance]; + } else { anim = gPlayerAnim_link_magic_kaze2; sword = 0; shield = 0; } if (skelAnime->animation != anim) { - LinkAnimation_Change(play, skelAnime, anim, 1.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_LOOP, - -6.0f); + LinkAnimation_Change(play, skelAnime, anim, 1.0f, 0.0f, Animation_GetLastFrame(anim), ANIMMODE_LOOP, -6.0f); } LinkAnimation_Update(play, skelAnime); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index bef08b08a..5fd8aa2b5 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -125,26 +125,18 @@ void KaleidoScope_DrawAButton(PlayState* play, Vtx* vtx, int16_t xTranslate, int CLOSE_DISPS(play->state.gfxCtx); } -Vec3s link_kaleido_rot = { 0, 32300, 0 }; // Default rotation link face us. - void KaleidoScope_DrawPlayerWork(PlayState* play) { PauseContext* pauseCtx = &play->pauseCtx; Vec3f pos; - //Vec3s rot; // Removed for not having it use din the function + Vec3s rot; f32 scale; - Input* input = &play->state.input[0]; - s16 RotationSpeed = 150 * CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLinkRotationSpeed"), 0); - u8 AllowStickRotation = (CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 0) == 3) ? true : false; - u8 AllowCRotation = (CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 0) == 2) ? true : false; - u8 AllowDPadRotation = (CVarGetInteger(CVAR_ENHANCEMENT("PauseLiveLinkRotation"), 0) == 1) ? true : false; - if (LINK_AGE_IN_YEARS == YEARS_CHILD) { pos.x = 2.0f; pos.y = -130.0f; pos.z = -150.0f; scale = 0.046f; - } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_MASTER && !CVarGetInteger(CVAR_GENERAL("PauseTriforce"), 0)) { + } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_MASTER && !CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0)) { pos.x = 25.0f; pos.y = -228.0f; pos.z = 60.0f; @@ -156,38 +148,10 @@ void KaleidoScope_DrawPlayerWork(PlayState* play) { scale = 0.047f; } - link_kaleido_rot.x = link_kaleido_rot.z = 0; - - if ((AllowDPadRotation && CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) || // rotate - (AllowCRotation && CHECK_BTN_ALL(input->cur.button, BTN_CLEFT))) { - link_kaleido_rot.y = link_kaleido_rot.y - RotationSpeed; - } else if ((AllowDPadRotation && CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) || - (AllowCRotation && CHECK_BTN_ALL(input->cur.button, BTN_CRIGHT))) { - link_kaleido_rot.y = link_kaleido_rot.y + RotationSpeed; - } else if (AllowStickRotation && input->cur.right_stick_x * 10.0f != 0) { - link_kaleido_rot.y = link_kaleido_rot.y + (input->cur.right_stick_x * 10.0f * (((f32)RotationSpeed) / 600.0f)); - } - - if ((AllowDPadRotation && CHECK_BTN_ALL(input->press.button, BTN_DUP)) || // reset rotation - (AllowDPadRotation && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { - link_kaleido_rot.y = 32300; - } else if ((AllowCRotation && CHECK_BTN_ALL(input->press.button, BTN_CUP)) || - (AllowCRotation && CHECK_BTN_ALL(input->press.button, BTN_CDOWN))) { - link_kaleido_rot.y = 32300; - } else if (AllowStickRotation && input->cur.right_stick_y * 10.0f < -1200) { - link_kaleido_rot.y = 32300; - } - - if (AllowStickRotation && input->cur.right_stick_y * 10.0f > 0) { // Zoom in - scale = scale + input->cur.right_stick_y * 10.0f * .00005f; - pos.y = pos.y - input->cur.right_stick_y * 10.0f * 0.25f; - } - - - link_kaleido_rot.x = 0; - gsSPSetFB(play->state.gfxCtx->polyOpa.p++, gPauseLinkFrameBuffer); - Player_DrawPause(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &link_kaleido_rot, scale, + rot.y = 32300; + rot.x = rot.z = 0; + Player_DrawPause(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &rot, scale, SWORD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD)), TUNIC_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)), SHIELD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD)), 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 e76576f85..97ac28ca4 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 @@ -4550,7 +4550,7 @@ void KaleidoScope_Update(PlayState* play) R_UPDATE_RATE = 3; R_PAUSE_MENU_MODE = 0; - CVarSetInteger(CVAR_GENERAL("PauseTriforce"), 0); + CVarSetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0); func_800981B8(&play->objectCtx); func_800418D0(&play->colCtx, play); From 14a14bb7efa3538231b5128812beab0d3c289c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Sat, 8 Feb 2025 18:09:18 +0000 Subject: [PATCH 025/267] DC logic: more mud walls (#5019) A few mud walls in DC logic still used SmashOrBlast, preventing alternative blue fire trick logic --- .../dungeons/dodongos_cavern.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 d6798523b..e961a5c08 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -35,7 +35,7 @@ void RegionTable_Init_DodongosCavern() { //Exits Entrance(RR_DODONGOS_CAVERN_BEGINNING, []{return true;}), Entrance(RR_DODONGOS_CAVERN_LOBBY_SWITCH, []{return logic->IsAdult;}), - Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return HasAccessTo(RR_DODONGOS_CAVERN_LOBBY_SWITCH);}), Entrance(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return HasAccessTo(RR_DODONGOS_CAVERN_FAR_BRIDGE);}), Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, []{return Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->HasExplosives();});}), @@ -61,7 +61,7 @@ void RegionTable_Init_DodongosCavern() { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), //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_SE_ROOM, []{return Here(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return logic->CanBreakMudWalls() || logic->CanAttack() || (logic->TakeDamage() && logic->CanShield());});}), Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, []{return true;}), }); @@ -102,7 +102,7 @@ void RegionTable_Init_DodongosCavern() { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY_SWITCH, []{return logic->HasFireSourceWithTorch();}), Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); areaTable[RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Region("Dodongos Cavern Near Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { @@ -117,7 +117,7 @@ void RegionTable_Init_DodongosCavern() { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), - Entrance(RR_DODONGOS_CAVERN_COMPASS_ROOM, []{return Here(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_COMPASS_ROOM, []{return Here(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); areaTable[RR_DODONGOS_CAVERN_STAIRS_UPPER] = Region("Dodongos Cavern Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { @@ -154,8 +154,8 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), }, { //Exits - Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->BlastOrSmash() || (ctx->GetTrickOption(RT_DC_SCRUB_ROOM) && logic->HasItem(RG_GORONS_BRACELET));});}), - Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBreakMudWalls() || (ctx->GetTrickOption(RT_DC_SCRUB_ROOM) && logic->HasItem(RG_GORONS_BRACELET));});}), + Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return (logic->IsAdult && ctx->GetTrickOption(RT_DC_JUMP)) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}), }); @@ -214,7 +214,7 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_FAR_BRIDGE] = Region("Dodongos Cavern Far Bridge", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->BlastOrSmash();})), + LOCATION(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->CanBreakMudWalls();})), }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), @@ -227,7 +227,7 @@ void RegionTable_Init_DodongosCavern() { }, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return logic->BlastOrSmash();});}), + Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return logic->CanBreakMudWalls();});}), Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}), }); @@ -250,7 +250,7 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_BEGINNING] = Region("Dodongos Cavern MQ Beginning", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); areaTable[RR_DODONGOS_CAVERN_MQ_LOBBY] = Region("Dodongos Cavern MQ Lobby", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { From 6abf30aa2f9fa5dee9710eda6479a592aeceed57 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 8 Feb 2025 10:12:13 -0800 Subject: [PATCH 026/267] document vb shoulds (#5004) --- .../game-interactor/GameInteractor.h | 477 +---- .../vanilla-behavior/GIVanillaBehavior.h | 1851 +++++++++++++++++ 2 files changed, 1852 insertions(+), 476 deletions(-) create mode 100644 soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 889ba7f1c..8c6be086f 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -5,6 +5,7 @@ #include "libultraship/libultraship.h" #include "GameInteractionEffect.h" +#include "vanilla-behavior/GIVanillaBehavior.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" #include @@ -63,482 +64,6 @@ typedef enum { /* */ GI_TP_DEST_PRELUDE = ENTR_TEMPLE_OF_TIME_WARP_PAD, } GITeleportDestinations; -typedef enum { - // Vanilla condition: gSaveContext.showTitleCard - VB_SHOW_TITLE_CARD, - // Opt: *EnWonderTalk2 - VB_WONDER_TALK, - // Opt: *ElfMsg - VB_NAVI_TALK, - // Vanilla condition: INFTABLE_GREETED_BY_SARIA - VB_NOT_BE_GREETED_BY_SARIA, - // Opt: *EnMd - VB_MIDO_SPAWN, - // Opt: *EnMd - // Vanilla condition: EnMd->interactInfo.talkState == NPC_TALK_STATE_ACTION - // Note: When overriding this, ensure you're not in the intro cutscene as Mido's path has not been loaded - VB_MOVE_MIDO_IN_KOKIRI_FOREST, - // Opt: *EnMd - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) - VB_MIDO_CONSIDER_DEKU_TREE_DEAD, - // Opt: *ObjDekujr - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) - VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, - // Opt: *EnKo - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) - VB_OPEN_KOKIRI_FOREST, - // Opt: *EnOwl - // Vanilla condition: EnOwl->actor.xzDistToPlayer < targetDist - VB_OWL_INTERACTION, - // Vanilla condition: EVENTCHKINF_TALON_RETURNED_FROM_CASTLE - VB_MALON_RETURN_FROM_CASTLE, - // Vanilla condition: CUR_UPG_VALUE(UPG_STRENGTH) <= 0 - VB_BE_ELIGIBLE_FOR_DARUNIAS_JOY_REWARD, - /* Vanilla condition: - ``` - LINK_IS_ADULT && - (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TEMPLE_OF_TIME) && - CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && - CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && - !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS); - ``` - */ - VB_BE_ELIGIBLE_FOR_LIGHT_ARROWS, - // Vanilla condition: !CHECK_QUEST_ITEM(QUEST_SONG_SARIA) - VB_BE_ELIGIBLE_FOR_SARIAS_SONG, - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_SONG_EPONA) - VB_MALON_ALREADY_TAUGHT_EPONAS_SONG, - // Vanilla condition: CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) - VB_BE_ELIGIBLE_FOR_SERENADE_OF_WATER, - // Vanilla condition: (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT - VB_SHIEK_PREPARE_TO_GIVE_SERENADE_OF_WATER, - // Vanilla condition: !EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT and EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP - VB_BE_ELIGIBLE_FOR_PRELUDE_OF_LIGHT, - VB_BE_ELIGIBLE_FOR_RAINBOW_BRIDGE, - /* Vanilla Condition: - ``` - LINK_IS_ADULT && - gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && - Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && - Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) && - Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) && - !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL); - ``` - */ - VB_BE_ELIGIBLE_FOR_NOCTURNE_OF_SHADOW, - // Opt: *EnGo2 - VB_GORON_LINK_BE_SCARED, - // Vanilla condition: CUR_CAPACITY(UPG_BOMB_BAG) >= 20 && this->waypoint > 7 && this->waypoint < 12 - VB_BE_ELIGIBLE_FOR_CHILD_ROLLING_GORON_REWARD, - // Vanilla condition: !CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) - VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE, - // Opt: *EnMs - // Vanilla condition: gSaveContext.rupees >= sPrices[BEANS_BOUGHT] - VB_BE_ELIGIBLE_FOR_MAGIC_BEANS_PURCHASE, - // Opt: *EnItem00 - // Vanilla condition: Flags_GetCollectible(play, this->collectibleFlag) - VB_ITEM00_DESPAWN, - // Opt: *ItemBHeart - // Vanilla condition: Flags_GetCollectible(play, 0x1F) - VB_ITEM_B_HEART_DESPAWN, - // Opt: *EnTk - // Vanilla condition: gSaveContext.dayTime <= 0xC000 || gSaveContext.dayTime >= 0xE000 || LINK_IS_ADULT || play->sceneNum != SCENE_GRAVEYARD - VB_DAMPE_IN_GRAVEYARD_DESPAWN, - // Opt: *EnTk - // Vanilla condition: this->validDigHere == 1 - VB_BE_VALID_GRAVEDIGGING_SPOT, - // Opt: *EnTk - // Vanilla condition: this->currentReward == 3 - VB_BE_DAMPE_GRAVEDIGGING_GRAND_PRIZE, - // Opt: *EnTk - // Vanilla condition: !Flags_GetItemGetInf(ITEMGETINF_1C) - VB_DAMPE_GRAVEDIGGING_GRAND_PRIZE_BE_HEART_PIECE, - // Opt: *EnShopnuts - /* Vanilla Condition: - ``` - ((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, - // Opt: *EnCow - // Vanilla condition: play->sceneNum == SCENE_LINKS_HOUSE && (!LINK_IS_ADULT || !Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE)) - VB_DESPAWN_HORSE_RACE_COW, - // Opt: *EnHs - // Vanilla condition: Flags_GetItemGetInf(ITEMGETINF_30) - VB_DESPAWN_GROG, - // Opt: *EnKo - // Vanilla condition: (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_ODD_POTION) ? true : false; - VB_SPAWN_LW_FADO, - // Opt: *EnMk - VB_PLAY_EYEDROP_CREATION_ANIM, - // Opt: *EnDs - VB_PLAY_ODD_POTION_ANIM, - // Opt: *EnMk - // Vanilla condition: INV_CONTENT(ITEM_ODD_MUSHROOM) == ITEM_EYEDROPS - VB_USE_EYEDROP_DIALOGUE, - // Opt: *EnMk - // Vanilla condition: Flags_GetItemGetInf(ITEMGETINF_30) - VB_OFFER_BLUE_POTION, - VB_GRANNY_SAY_INSUFFICIENT_RUPEES, - VB_GRANNY_TAKE_MONEY, - // Vanilla condition: Inventory_HasEmptyBottle() == 0 - VB_NEED_BOTTLE_FOR_GRANNYS_ITEM, - // Opt: *EnNiwLady - VB_SET_CUCCO_COUNT, - // Opt: *EnKz - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE) - VB_KING_ZORA_THANK_CHILD, - // Opt: *EnKz - // Vanilla condition: this->actor.textId == 0x401A - VB_BE_ABLE_TO_EXCHANGE_RUTOS_LETTER, - // Opt: *EnKz - // Vanilla condition: Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED) - VB_KING_ZORA_BE_MOVED, - // Opt: *EnKz, - // Vanilla condition: CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA) - VB_KING_ZORA_TUNIC_CHECK, - // Vanilla condition: gSaveState.bgsFlag - VB_BIGGORON_CONSIDER_TRADE_COMPLETE, - // Vanilla condition: gSaveState.bgsFlag - VB_BIGGORON_CONSIDER_SWORD_COLLECTED, - // Vanilla condition: Environment_GetBgsDayCount() >= 3 - VB_BIGGORON_CONSIDER_SWORD_FORGED, - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) - VB_GORONS_CONSIDER_FIRE_TEMPLE_FINISHED, - // Vanilla condition: CHECK_QUEST_ITEM(QUEST_GORON_RUBY) - VB_GORONS_CONSIDER_DODONGOS_CAVERN_FINISHED, - // Opt: *uint16_t - // Vanilla condition: false - VB_OVERRIDE_LINK_THE_GORON_DIALOGUE, - // Vanilla condition: CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON) - VB_GORONS_CONSIDER_TUNIC_COLLECTED, - // Opt: *EnSyatekiMan - // Vanilla condition: (this->getItemId == GI_QUIVER_40) || (this->getItemId == GI_QUIVER_50) - VB_BE_ELIGIBLE_FOR_ADULT_SHOOTING_GAME_REWARD, - // Opt: *EnOkarinaTag - // Vanilla condition: !Flags_GetEventChkInf(EVENTCHKINF_OPENED_THE_DOOR_OF_TIME) - VB_BE_ELIGIBLE_TO_OPEN_DOT, - // Opt: *BgDyYoseizo - // Vanilla condition: see soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c - VB_BE_ELIGIBLE_FOR_GREAT_FAIRY_REWARD, - // Vanilla condition: see CheckCarpentersFreed in z_en_ge1 and z_en_ge2 - VB_GERUDOS_BE_FRIENDLY, - // Vanilla condition: switch - VB_GTG_GATE_BE_OPEN, - // Opt: *s16 (item id) - /* Vanilla condition: - In one case: - ``` - true - ``` - In the other case: - ``` - (i == ITEM_STICK) || - (i == ITEM_NUT) || - (i == ITEM_BOMB) || - (i == ITEM_BOW) || - ( - (i >= ITEM_BOW_ARROW_FIRE) && - (i <= ITEM_BOW_ARROW_LIGHT) - ) || - (i == ITEM_SLINGSHOT) || - (i == ITEM_BOMBCHU) || - (i == ITEM_BEAN) - ``` - */ - VB_DRAW_AMMO_COUNT, - // Opt: *ObjTsubo - VB_POT_SETUP_DRAW, - VB_POT_DROP_ITEM, - // Opt: *ActorDoorShutter - VB_LOCK_BOSS_DOOR, - // Vanilla condition: true - VB_HAVE_OCARINA_NOTE_D4, - // Vanilla condition: true - VB_HAVE_OCARINA_NOTE_D5, - // Vanilla condition: true - VB_HAVE_OCARINA_NOTE_F4, - // Vanilla condition: true - VB_HAVE_OCARINA_NOTE_B4, - // Vanilla condition: true - VB_HAVE_OCARINA_NOTE_A4, - // Vanilla condition: false - VB_SKIP_SCARECROWS_SONG, - // Vanilla condition: true - VB_RENDER_RUPEE_COUNTER, - // Vanilla condition: true - VB_RENDER_KEY_COUNTER, - // Vanilla condition: true - VB_SPAWN_HEART_CONTAINER, - // Vanilla condition: true - VB_BE_ABLE_TO_OPEN_DOORS, - // Vanilla condition: true - VB_REVERT_SPOILING_ITEMS, - // Vanilla condition: Flags_GetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP) || BREG(2) - VB_BE_ABLE_TO_PLAY_BOMBCHU_BOWLING, - // Vanilla condition: true - VB_BE_ABLE_TO_SAVE, - // Vanilla condition: true - VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, - // Vanilla condition: true - 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 - VB_BLUE_WARP_APPLY_ENTRANCE_AND_CUTSCENE, - // Vanilla condition: SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2 - // Opt: int (original next entrance index) - VB_SET_VOIDOUT_FROM_SURFACE, - // Vanilla condition: this->collider.base.acFlags & 2 - VB_BG_BREAKWALL_BREAK, - // Vanilla condition: true - VB_GANON_HEAL_BEFORE_FIGHT, - VB_FREEZE_LINK_FOR_BLOCK_THROW, - VB_MOVE_THROWN_ACTOR, - // 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 ***/ - - VB_PLAY_TRANSITION_CS, - VB_PLAY_GORON_FREE_CS, - VB_PLAY_FIRE_ARROW_CS, - // Vanilla condition: INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE - VB_SPAWN_FIRE_ARROW, - // Opt: s32 entranceIndex - VB_ALLOW_ENTRANCE_CS_FOR_EITHER_AGE, - // Opt: s32 flag/EventChkInf, s32 entranceIndex - VB_PLAY_ENTRANCE_CS, - // Opt: *cutsceneId - VB_PLAY_ONEPOINT_CS, - // Opt: *actor - VB_PLAY_ONEPOINT_ACTOR_CS, - // Opt: *BgTreemouth - VB_PLAY_DEKU_TREE_INTRO_CS, - // Vanilla condition: !EventChkInf except for spirit & shadow temple which are !medallion, and Jabu which always is true - VB_PLAY_BLUE_WARP_CS, - VB_PLAY_DARUNIAS_JOY_CS, - VB_PLAY_SHIEK_BLOCK_MASTER_SWORD_CS, - // Vanilla condition: !EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL - VB_PLAY_PULL_MASTER_SWORD_CS, - VB_PLAY_DROP_FISH_FOR_JABU_CS, - // Opt: *EnKz - VB_PLAY_MWEEP_CS, - // Vanilla condition: player->getItemId == GI_GAUNTLETS_SILVER - VB_PLAY_NABOORU_CAPTURED_CS, - VB_PLAY_ZELDAS_LULLABY_CS, - // Opt: *EnSa - VB_PLAY_SARIAS_SONG_CS, - VB_PLAY_PRELUDE_OF_LIGHT_CS, - VB_PLAY_MINUET_OF_FOREST_CS, - VB_PLAY_BOLERO_OF_FIRE_CS, - VB_PLAY_SERENADE_OF_WATER_CS, - VB_PLAY_EYEDROPS_CS, - // Opt: *EnOkarinaTag - VB_PLAY_DRAIN_WELL_CS, - // Opt: *EnOkarinaTag - // Vanilla condition: !CHECK_QUEST_ITEM(QUEST_SONG_SUN) - VB_PLAY_SUNS_SONG_CS, - // Opt: *EnOkarinaTag - VB_PLAY_ROYAL_FAMILY_TOMB_CS, - VB_PLAY_ROYAL_FAMILY_TOMB_EXPLODE, - // Opt: *EnOkarinaTag - VB_PLAY_DOOR_OF_TIME_CS, - VB_PLAY_RAINBOW_BRIDGE_CS, - // Opt: *EnBox - VB_PLAY_SLOW_CHEST_CS, - //*Opt f32 sFishOnHandLength - // Vanilla condition: (s16)sFishingRecordLength < (s16)sFishOnHandLength - VB_SHOULD_CHECK_FOR_FISHING_RECORD, - //*Opt f32 sFishOnHandLength - // Vanilla condition is implied from previous code that could be bypassed by above hook - VB_SHOULD_SET_FISHING_RECORD, - //*Opt *s32 getItemId - VB_SHOULD_GIVE_VANILLA_FISHING_PRIZE, - VB_GIVE_RANDO_FISHING_PRIZE, - VB_PLAY_THROW_ANIMATION, - VB_INFLICT_VOID_DAMAGE, - // Vanilla condition: Close enough & various cutscene checks - // Opt: *EnRu1 - VB_PLAY_CHILD_RUTO_INTRO, - // Vanilla condition: !INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE && in the big okto room - // Opt: *EnRu1 - VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, - // Vanilla condition: Landed on the platform in the big okto room - // Opt: *EnRu1 - VB_RUTO_RUN_TO_SAPPHIRE, - // Vanilla condition: !Flags_GetInfTable(INFTABLE_145) - // Opt: *EnRu1 - VB_RUTO_BE_CONSIDERED_NOT_KIDNAPPED, - - - /*** Give Items ***/ - - VB_SHORT_CIRCUIT_GIVE_ITEM_PROCESS, - VB_FREEZE_ON_SKULL_TOKEN, - // Opt: *EnBox - VB_GIVE_ITEM_FROM_CHEST, - // Opt: ItemID - VB_GIVE_ITEM_FROM_BLUE_WARP, - // Opt: *EnItem00 - VB_GIVE_ITEM_FROM_ITEM_00, - // Opt: *EnSi - VB_GIVE_ITEM_SKULL_TOKEN, - // Opt: *EnCow - VB_GIVE_ITEM_FROM_COW, - // Opt: *EnDns - VB_GIVE_ITEM_FROM_BUSINESS_SCRUB, - // Opt: *EnMk - VB_GIVE_ITEM_FROM_LAB_DIVE, - // Opt: *EnDs - VB_GIVE_ITEM_FROM_GRANNYS_SHOP, - // Opt: *EnNiwLady - VB_GIVE_ITEM_FROM_ANJU_AS_CHILD, - // Opt: *EnNiwLady - VB_GIVE_ITEM_FROM_ANJU_AS_ADULT, - // Opt: *EnGo2 - VB_GIVE_ITEM_FROM_GORON, - // Opt: *EnGb - VB_GIVE_ITEM_FROM_POE_COLLECTOR, - // Opt: *EnJs - VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN, - VB_GIVE_ITEM_FROM_CARPET_SALESMAN, - VB_GIVE_BOMBCHUS_FROM_CARPET_SALESMAN, - // Opt: *EnGm - VB_CHECK_RANDO_PRICE_OF_MEDIGORON, - VB_GIVE_ITEM_FROM_MEDIGORON, - // Opt: *EnMs - VB_GIVE_ITEM_FROM_MAGIC_BEAN_SALESMAN, - // Opt: *EnSkj - VB_GIVE_ITEM_FROM_OCARINA_MEMORY_GAME, - // Opt: *EnSkj - VB_GIVE_ITEM_FROM_SKULL_KID_SARIAS_SONG, - VB_GIVE_ITEM_FROM_MAN_ON_ROOF, - // Opt: *EnSyatekiMan - VB_GIVE_ITEM_FROM_SHOOTING_GALLERY, - // Opt: *EnExItem - VB_GIVE_ITEM_FROM_TARGET_IN_WOODS, - // Opt: *EnTa - VB_GIVE_ITEM_FROM_TALONS_CHICKENS, - // Opt: *EnDivingGame - VB_GIVE_ITEM_FROM_DIVING_MINIGAME, - // Opt: *EnGe1 - VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY, - // Opt: *EnSth - VB_GIVE_ITEM_FROM_SKULLTULA_REWARD, - // Opt: *EnHy - VB_GIVE_ITEM_FROM_LOST_DOG, - // Opt: *EnBomBowlPit - VB_GIVE_ITEM_FROM_BOMBCHU_BOWLING, - - VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD, - - VB_GIVE_ITEM_FAIRY_OCARINA, - VB_GIVE_ITEM_WEIRD_EGG, - VB_GIVE_ITEM_LIGHT_ARROW, - VB_GIVE_ITEM_STRENGTH_1, - VB_GIVE_ITEM_ZELDAS_LETTER, - VB_GIVE_ITEM_MASTER_SWORD, - VB_GIVE_ITEM_OCARINA_OF_TIME, - VB_GIVE_ITEM_KOKIRI_EMERALD, - VB_GIVE_ITEM_GORON_RUBY, - VB_GIVE_ITEM_ZORA_SAPPHIRE, - VB_GIVE_ITEM_LIGHT_MEDALLION, - VB_GIVE_ITEM_FOREST_MEDALLION, - VB_GIVE_ITEM_FIRE_MEDALLION, - VB_GIVE_ITEM_WATER_MEDALLION, - VB_GIVE_ITEM_SPIRIT_MEDALLION, - VB_GIVE_ITEM_SHADOW_MEDALLION, - - /*** Give Songs ***/ - - VB_GIVE_ITEM_ZELDAS_LULLABY, - VB_GIVE_ITEM_SARIAS_SONG, - VB_GIVE_ITEM_EPONAS_SONG, - VB_GIVE_ITEM_SUNS_SONG, - VB_GIVE_ITEM_SONG_OF_TIME, - VB_GIVE_ITEM_SONG_OF_STORMS, - VB_GIVE_ITEM_MINUET_OF_FOREST, - VB_GIVE_ITEM_BOLERO_OF_FIRE, - VB_GIVE_ITEM_SERENADE_OF_WATER, - VB_GIVE_ITEM_REQUIEM_OF_SPIRIT, - VB_GIVE_ITEM_NOCTURNE_OF_SHADOW, - VB_GIVE_ITEM_PRELUDE_OF_LIGHT, - - /*** Adult Trade ***/ - // Opt: *EnNiwLady - VB_TRADE_POCKET_CUCCO, - // Opt: *EnHs - VB_TRADE_COJIRO, - // Opt: *EnDs - VB_TRADE_ODD_MUSHROOM, - // Opt: *EnKo - VB_TRADE_ODD_POTION, - // Opt: *EnToryo - VB_TRADE_SAW, - // Opt: *EnKz, - VB_ADULT_KING_ZORA_ITEM_GIVE, - // Opt: *EnMk - VB_TRADE_FROG, - - VB_TRADE_TIMER_ODD_MUSHROOM, - VB_TRADE_TIMER_FROG, - VB_TRADE_TIMER_EYEDROPS, - - /*** Fixes ***/ - // Vanilla condition: false - VB_FIX_SAW_SOFTLOCK, - - /*** Cheats? ***/ - VB_DEKU_STICK_BE_ON_FIRE, - VB_DEKU_STICK_BREAK, - VB_DEKU_STICK_BURN_DOWN, - VB_DEKU_STICK_BURN_OUT, - VB_DEKU_UPDATE_BURNING_DEKU_STICK, - - /*** Quick Boss Deaths ***/ - // Vanilla condition: true; Opt: *BossGanondrof - VB_PHANTOM_GANON_DEATH_SCENE, - // Opt: *EnIk - VB_NABOORU_KNUCKLE_DEATH_SCENE, - - /*** Fishsanity ***/ - // Vanilla condition: Actor is ACTOR_EN_ELF, ACTOR_EN_FISH, ACTOR_EN_ICE_HONO, or ACTOR_EN_INSECT - // Opt: *Actor - VB_BOTTLE_ACTOR, - - /*** Shuffle Fairies ***/ - // Opt: *EnElf - VB_SPAWN_FOUNTAIN_FAIRIES, - VB_FAIRY_HEAL, - // Opt: *ObjBean - VB_SPAWN_BEAN_STALK_FAIRIES, - // Opt: *ShotSun - VB_SPAWN_SONG_FAIRY, - // Opt: *EnGs - VB_SPAWN_GOSSIP_STONE_FAIRY, - - /*** Equippable tunics and boots ***/ - VB_CHANGE_HELD_ITEM_AND_USE_ITEM, - VB_ITEM_ACTION_BE_NONE, - VB_EXECUTE_PLAYER_ACTION_FUNC, -} GIVanillaBehavior; - #ifdef __cplusplus extern "C" { #endif diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h new file mode 100644 index 000000000..4974baf5b --- /dev/null +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -0,0 +1,1851 @@ +typedef enum { + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnKz` + VB_ADULT_KING_ZORA_ITEM_GIVE, + + // #### `result` + // ```c + // requiredAge == 2 + // ``` + // #### `args` + // - `int32_t` (entrance index) (promoted from `uint16_t` by va_arg) + VB_ALLOW_ENTRANCE_CS_FOR_EITHER_AGE, + + // #### `result` + // ```c + // this->actor.textId == 0x401A + // ``` + // #### `args` + // - `*EnKz` + VB_BE_ABLE_TO_EXCHANGE_RUTOS_LETTER, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_BE_ABLE_TO_OPEN_DOORS, + + // #### `result` + // ```c + // (Flags_GetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP)) || BREG(2) + // ``` + // #### `args` + // - None + VB_BE_ABLE_TO_PLAY_BOMBCHU_BOWLING, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_BE_ABLE_TO_SAVE, + + // #### `result` + // ```c + // this->currentReward == 3 + // ``` + // #### `args` + // - `*EnTk` + VB_BE_DAMPE_GRAVEDIGGING_GRAND_PRIZE, + + // #### `result` + // ```c + // (this->getItemId == GI_QUIVER_40) || (this->getItemId == GI_QUIVER_50) + // ``` + // #### `args` + // - `*EnSyatekiMan` + VB_BE_ELIGIBLE_FOR_ADULT_SHOOTING_GAME_REWARD, + + // #### `result` + // ```c + // CUR_CAPACITY(UPG_BOMB_BAG) >= 20 + // ``` + // #### `args` + // - `*EnGo2` + VB_BE_ELIGIBLE_FOR_CHILD_ROLLING_GORON_REWARD, + + // #### `result` + // ```c + // CUR_UPG_VALUE(UPG_STRENGTH) <= 0 + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_DARUNIAS_JOY_REWARD, + + // #### `result` + // ```c + // !CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE, + + // #### `result` + // See `isEligible` logic in + // ```c + // BgDyYoseizo_CheckMagicAcquired() + // ``` + // #### `args` + // - `*BgDyYoseizo` + VB_BE_ELIGIBLE_FOR_GREAT_FAIRY_REWARD, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && + // CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && + // LINK_IS_ADULT && + // !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && + // (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TEMPLE_OF_TIME) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_LIGHT_ARROWS, + + // #### `result` + // ```c + // gSaveContext.rupees >= sPrices[BEANS_BOUGHT] + // ``` + // #### `args` + // - `*EnMs` + VB_BE_ELIGIBLE_FOR_MAGIC_BEANS_PURCHASE, + + // #### `result` + // ```c + // (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE) && + // LINK_IS_ADULT && + // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) && + // !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_NOCTURNE_OF_SHADOW, + + // #### `result` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_PRELUDE_OF_LIGHT, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && + // CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && + // (INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT) && + // CheckPlayerPosition(player, play) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_RAINBOW_BRIDGE, + + // #### `result` + // ```c + // !CHECK_QUEST_ITEM(QUEST_SONG_SARIA) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_SARIAS_SONG, + + // #### `result` + // ```c + // CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) + // ``` + // #### `args` + // - None + VB_BE_ELIGIBLE_FOR_SERENADE_OF_WATER, + + // #### `result` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_OPENED_THE_DOOR_OF_TIME) + // ``` + // #### `args` + // - `*EnOkarinaTag` + VB_BE_ELIGIBLE_TO_OPEN_DOT, + + // #### `result` + // ```c + // this->validDigHere == 1 + // ``` + // #### `args` + // - `*EnTk` + VB_BE_VALID_GRAVEDIGGING_SPOT, + + // #### `result` + // ```c + // this->collider.base.acFlags & 2 || blueFireArrowHit + // ``` + // #### `args` + // - None + VB_BG_BREAKWALL_BREAK, + + // #### `result` + // ```c + // gSaveContext.bgsFlag + // ``` + // #### `args` + // - None + VB_BIGGORON_CONSIDER_SWORD_COLLECTED, + + // #### `result` + // ```c + // Environment_GetBgsDayCount() >= 3 + // ``` + // #### `args` + // - None + VB_BIGGORON_CONSIDER_SWORD_FORGED, + + // #### `result` + // ```c + // gSaveContext.bgsFlag + // ``` + // #### `args` + // - None + VB_BIGGORON_CONSIDER_TRADE_COMPLETE, + + // # UNUSED + VB_BLUE_WARP_APPLY_ENTRANCE_AND_CUTSCENE, + + // #### `result` + // Actor is ACTOR_EN_ELF, ACTOR_EN_FISH, ACTOR_EN_ICE_HONO, or ACTOR_EN_INSECT + // ```c + // i < ARRAY_COUNT(sBottleCatchInfo) + // ``` + // #### `args` + // - `*Actor` (interactRangeActor) + VB_BOTTLE_ACTOR, + + // #### `result` + // ```c + // ((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))) + // ``` + // #### `args` + // - `*EnShopnuts` + VB_BUSINESS_SCRUB_DESPAWN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (item) + VB_CHANGE_HELD_ITEM_AND_USE_ITEM, + + // #### `result` + // ```c + // gSaveContext.rupees < 200 + // ``` + // #### `args` + // - `*EnJs` + VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN, + + // #### `result` + // ```c + // gSaveContext.rupees < 200 + // ``` + // #### `args` + // - `*EnGm` + VB_CHECK_RANDO_PRICE_OF_MEDIGORON, + + // #### `result` + // ```c + // CHECK_BTN_ALL(input->press.button, BTN_START) + // ``` + // #### `args` + // - None + VB_CLOSE_PAUSE_MENU, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDoor` + VB_CONSUME_SMALL_KEY, + + // #### `result` + // ```c + // !Flags_GetItemGetInf(ITEMGETINF_1C) + // ``` + // #### `args` + // - `*EnTk` + VB_DAMPE_GRAVEDIGGING_GRAND_PRIZE_BE_HEART_PIECE, + + // #### `result` + // ```c + // gSaveContext.dayTime <= 0xC000 || gSaveContext.dayTime >= 0xE000 || LINK_IS_ADULT || play->sceneNum != SCENE_GRAVEYARD + // ``` + // #### `args` + // - `*EnTk` + VB_DAMPE_IN_GRAVEYARD_DESPAWN, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) + // ``` + // #### `args` + // - `*ObjDekujr` + VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, + + // #### `result` + // ```c + // this->unk_860 != 0 + // ``` + // #### `args` + // - None + VB_DEKU_STICK_BE_ON_FIRE, + + // #### `result` + // ```c + // AMMO(ITEM_STICK) != 0 + // ``` + // #### `args` + // - None + VB_DEKU_STICK_BREAK, + + // #### `result` + // ```c + // this->unk_860 < 20 + // ``` + // #### `args` + // - None + VB_DEKU_STICK_BURN_DOWN, + + // #### `result` + // ##### In `Player_UpdateBurningDekuStick` + // ```c + // this->unk_85C == 0.0f + // ``` + // ##### Also in `Player_UpdateBurningDekuStick` + // ```c + // DECR(this->unk_860) == 0; + // ``` + // #### `args` + // - None + VB_DEKU_STICK_BURN_OUT, + + // # UNUSED + VB_DEKU_UPDATE_BURNING_DEKU_STICK, + + // #### `result` + // ```c + // Flags_GetItemGetInf(ITEMGETINF_30) + // ``` + // #### `args` + // - `*EnHs` + VB_DESPAWN_GROG, + + // #### `result` + // ```c + // play->sceneNum == SCENE_LINKS_HOUSE && (!LINK_IS_ADULT || !Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) + // ``` + // #### `args` + // - `*EnCow` + VB_DESPAWN_HORSE_RACE_COW, + + // #### `result` + // ```c + // !Flags_GetSwitch(play, this->actor.params & 0x3F) + // ``` + // #### `args` + // - `*EnDoor` + VB_DOOR_BE_LOCKED, + + // #### `result` + // ```c + // ((doorActor->params >> 7) & 7) == 3 + // ``` + // #### `args` + // - `*Actor` + VB_DOOR_PLAY_SCENE_TRANSITION, + + // #### `result` + // In `Interface_DrawAmmoCount`: + // ```c + // (i == ITEM_STICK) || + // (i == ITEM_NUT) || + // (i == ITEM_BOMB) || + // (i == ITEM_BOW) || + // ( + // (i >= ITEM_BOW_ARROW_FIRE) && + // (i <= ITEM_BOW_ARROW_LIGHT) + // ) || + // (i == ITEM_SLINGSHOT) || + // (i == ITEM_BOMBCHU) || + // (i == ITEM_BEAN) + // ``` + // In `KaleidoScope_DrawAmmoCount`: + // ```c + // true + // ``` + // #### `args` + // - `*int16_t` (item id) + VB_DRAW_AMMO_COUNT, + + // #### `result` + // ```c + // !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC) + // ``` + // #### `args` + // - `*Input` + VB_EXECUTE_PLAYER_ACTION_FUNC, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnElf` + VB_FAIRY_HEAL, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - None + VB_FIX_SAW_SOFTLOCK, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*BgHeavyBlock` + VB_FREEZE_LINK_FOR_BLOCK_THROW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_FREEZE_ON_SKULL_TOKEN, + + // #### `result` + // ```c + // this->reward == GI_NONE + // ``` + // #### `args` + // - `*EnFr` + VB_FROGS_GO_TO_IDLE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GANON_HEAL_BEFORE_FIGHT, + + // #### `result` + // See logic in + // ```c + // EnGe1_CheckCarpentersFreed() + // ``` + // and + // ```c + // EnGe2_CheckCarpentersFreed() + // ``` + // #### `args` + // - None + VB_GERUDOS_BE_FRIENDLY, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnJs` + VB_GIVE_BOMBCHUS_FROM_CARPET_SALESMAN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_BOLERO_OF_FIRE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_EPONAS_SONG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_FAIRY_OCARINA, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_FIRE_MEDALLION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_FOREST_MEDALLION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnNiwLady` + VB_GIVE_ITEM_FROM_ANJU_AS_ADULT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnNiwLady` + VB_GIVE_ITEM_FROM_ANJU_AS_CHILD, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (ItemID) + VB_GIVE_ITEM_FROM_BLUE_WARP, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnBomBowlPit` + VB_GIVE_ITEM_FROM_BOMBCHU_BOWLING, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDns` + VB_GIVE_ITEM_FROM_BUSINESS_SCRUB, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*EnJs` + VB_GIVE_ITEM_FROM_CARPET_SALESMAN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnBox` + VB_GIVE_ITEM_FROM_CHEST, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnCow` + VB_GIVE_ITEM_FROM_COW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` (EnDivingGame - &this->actor) + VB_GIVE_ITEM_FROM_DIVING_MINIGAME, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // ##### In `EnGo2_GetItem` + // - `*EnGo2` + // ##### Everywhere else + // - None + VB_GIVE_ITEM_FROM_GORON, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDs` + VB_GIVE_ITEM_FROM_GRANNYS_SHOP, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGe1` + VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnItem00` + VB_GIVE_ITEM_FROM_ITEM_00, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnMk` + VB_GIVE_ITEM_FROM_LAB_DIVE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnHy` + VB_GIVE_ITEM_FROM_LOST_DOG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnMs` + VB_GIVE_ITEM_FROM_MAGIC_BEAN_SALESMAN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_FROM_MAN_ON_ROOF, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGm` + VB_GIVE_ITEM_FROM_MEDIGORON, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnSkj` + VB_GIVE_ITEM_FROM_OCARINA_MEMORY_GAME, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGb` + VB_GIVE_ITEM_FROM_POE_COLLECTOR, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnSyatekiMan` + VB_GIVE_ITEM_FROM_SHOOTING_GALLERY, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnSkj` + VB_GIVE_ITEM_FROM_SKULL_KID_SARIAS_SONG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnSth` + VB_GIVE_ITEM_FROM_SKULLTULA_REWARD, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` (EnTa - &this->actor) + VB_GIVE_ITEM_FROM_TALONS_CHICKENS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` (EnExItem - &this->actor) + VB_GIVE_ITEM_FROM_TARGET_IN_WOODS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD, + + // # UNUSED + VB_GIVE_ITEM_GORON_RUBY, + + // # UNUSED + VB_GIVE_ITEM_KOKIRI_EMERALD, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_LIGHT_ARROW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_LIGHT_MEDALLION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_MASTER_SWORD, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_MINUET_OF_FOREST, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_NOCTURNE_OF_SHADOW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_OCARINA_OF_TIME, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_PRELUDE_OF_LIGHT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_REQUIEM_OF_SPIRIT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SARIAS_SONG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SERENADE_OF_WATER, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SHADOW_MEDALLION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnSi` + VB_GIVE_ITEM_SKULL_TOKEN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SONG_OF_STORMS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SONG_OF_TIME, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SPIRIT_MEDALLION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_STRENGTH_1, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_SUNS_SONG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_WATER_MEDALLION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_WEIRD_EGG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_ZELDAS_LETTER, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_GIVE_ITEM_ZELDAS_LULLABY, + + // # UNUSED + VB_GIVE_ITEM_ZORA_SAPPHIRE, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*VBFishingData` + VB_GIVE_RANDO_FISHING_PRIZE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGo2` + VB_GORON_LINK_BE_SCARED, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_GORON_RUBY) + // ``` + // #### `args` + // - None + VB_GORONS_CONSIDER_DODONGOS_CAVERN_FINISHED, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) + // ``` + // #### `args` + // - None + VB_GORONS_CONSIDER_FIRE_TEMPLE_FINISHED, + + // #### `result` + // ```c + // CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON) + // ``` + // #### `args` + // - None + VB_GORONS_CONSIDER_TUNIC_COLLECTED, + + // #### `result` + // ```c + // gSaveContext.rupees < 100 + // ``` + // #### `args` + // - `NULL` + VB_GRANNY_SAY_INSUFFICIENT_RUPEES, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDs` + VB_GRANNY_TAKE_MONEY, + + // #### `result` + // ```c + // Flags_GetSwitch(play, this->dyna.actor.params & 0x3F) + // ``` + // #### `args` + // - None + VB_GTG_GATE_BE_OPEN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_HAVE_OCARINA_NOTE_A4, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_HAVE_OCARINA_NOTE_B4, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_HAVE_OCARINA_NOTE_D4, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_HAVE_OCARINA_NOTE_D5, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_HAVE_OCARINA_NOTE_F4, + + // #### `result` + // ```c + // var >= gSaveContext.health && gSaveContext.health > 0 + // ``` + // #### `args` + // - None + VB_HEALTH_METER_BE_CRITICAL, + + // #### `result` + // ```c + // (respawnFlag == 1) || (respawnFlag == -1) + // ``` + // #### `args` + // - `int32_t` (respawnFlag) + VB_INFLICT_VOID_DAMAGE, + + // #### `result` + // ```c + // item >= ITEM_NONE_FE + // ``` + // #### `args` + // - `int32_t` (item) + VB_ITEM_ACTION_BE_NONE, + + // #### `result` + // ```c + // Flags_GetCollectible(play, 0x1F) + // ``` + // #### `args` + // - `*ItemBHeart` + VB_ITEM_B_HEART_DESPAWN, + + // #### `result` + // ```c + // Flags_GetCollectible(play, this->collectibleFlag) + // ``` + // #### `args` + // - `*EnItem00` + VB_ITEM00_DESPAWN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_KALEIDO_UNPAUSE_CLOSE, + + // #### `result` + // ```c + // Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED) + // ``` + // #### `args` + // - `*EnKz` + VB_KING_ZORA_BE_MOVED, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE) + // ``` + // #### `args` + // - `*EnKz` + VB_KING_ZORA_THANK_CHILD, + + // #### `result` + // ```c + // CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA) + // ``` + // #### `args` + // - `*EnKz` + VB_KING_ZORA_TUNIC_CHECK, + + // #### `result` + // ```c + // !Flags_GetSwitch(play, this->dyna.actor.params & 0x3F) + // ``` + // #### `args` + // - `*DoorShutter` + VB_LOCK_BOSS_DOOR, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_SONG_EPONA) + // ``` + // #### `args` + // - None + VB_MALON_ALREADY_TAUGHT_EPONAS_SONG, + + // #### `result` + // ```c + // Flags_GetEventChkInf(EVENTCHKINF_TALON_RETURNED_FROM_CASTLE) + // ``` + // #### `args` + // - None + VB_MALON_RETURN_FROM_CASTLE, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) + // ``` + // #### `args` + // - `*EnMd` + VB_MIDO_CONSIDER_DEKU_TREE_DEAD, + + // #### `result` + // ```c + // EnMd_ShouldSpawn(this, play) + // ``` + // #### `args` + // - `*EnMd` + VB_MIDO_SPAWN, + + // #### `result` + // ```c + // this->interactInfo.talkState == NPC_TALK_STATE_ACTION + // ``` + // #### `args` + // - `*EnMd` + // + // ### Note: + // When overriding this, ensure you're not in the intro cutscene as Mido's path has not been loaded + VB_MOVE_MIDO_IN_KOKIRI_FOREST, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_MOVE_THROWN_ACTOR, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnIk` + VB_NABOORU_KNUCKLE_DEATH_SCENE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ElfMsg` + VB_NAVI_TALK, + + // #### `result` + // ```c + // Inventory_HasEmptyBottle() == 0 + // ``` + // #### `args` + // - None + VB_NEED_BOTTLE_FOR_GRANNYS_ITEM, + + // #### `result` + // ```c + // Flags_GetInfTable(INFTABLE_GREETED_BY_SARIA) + // ``` + // #### `args` + // - None + VB_NOT_BE_GREETED_BY_SARIA, + + // #### `result` + // ```c + // gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] <= 0 + // ``` + // #### `args` + // - `*EnDoor` + VB_NOT_HAVE_SMALL_KEY, + + // #### `result` + // ```c + // Flags_GetItemGetInf(ITEMGETINF_30) + // ``` + // #### `args` + // - `*EnDs` + VB_OFFER_BLUE_POTION, + + // #### `result` + // ```c + // CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) + // ``` + // #### `args` + // - `*EnKo` + VB_OPEN_KOKIRI_FOREST, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*uint16_t` (overrideTextId) + VB_OVERRIDE_LINK_THE_GORON_DIALOGUE, + + // #### `result` + // ```c + // this->actor.xzDistToPlayer < targetDist + // ``` + // #### `args` + // - `*EnOwl` + VB_OWL_INTERACTION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*BossGanondrof` + VB_PHANTOM_GANON_DEATH_SCENE, + + // #### `result` + // ##### In `DoorWarp1_ChildWarpOut` - `SCENE_DODONGOS_CAVERN_BOSS` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_USED_DODONGOS_CAVERN_BLUE_WARP) + // ``` + // ##### In `DoorWarp1_ChildWarpOut` - `SCENE_DEKU_TREE_BOSS` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD) + // ``` + // ##### In `DoorWarp1_RutoWarpOut` + // ```c + // true + // ``` + // ##### In `DoorWarp1_AdultWarpOut` - `SCENE_FOREST_TEMPLE_BOSS` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) + // ``` + // ##### In `DoorWarp1_AdultWarpOut` - `SCENE_FIRE_TEMPLE_BOSS` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) + // ``` + // ##### In `DoorWarp1_AdultWarpOut` - `SCENE_WATER_TEMPLE_BOSS` + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) + // ``` + // ##### In `DoorWarp1_AdultWarpOut` - `SCENE_SPIRIT_TEMPLE_BOSS` + // ```c + // !CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) + // ``` + // ##### In `DoorWarp1_AdultWarpOut` - `SCENE_SHADOW_TEMPLE_BOSS` + // ```c + // !CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) + // ``` + // #### `args` + // - `int32_t` (EVENTCHKINF / RAND_INF_DUNGEONS_DONE) + VB_PLAY_BLUE_WARP_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_BOLERO_OF_FIRE_CS, + + // #### `result` + // Close enough & various cutscene checks + // ```c + // (func_80AEC5FC(this, play)) && (!Play_InCsMode(play)) && + // (!(player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER))) && + // (player->actor.bgCheckFlags & 1) + // ``` + // #### `args` + // - `*EnRu1` + VB_PLAY_CHILD_RUTO_INTRO, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_DARUNIAS_JOY_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*BgTreemouth` + VB_PLAY_DEKU_TREE_INTRO_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnOkarinaTag` + VB_PLAY_DOOR_OF_TIME_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnOkarinaTag` + VB_PLAY_DRAIN_WELL_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_DROP_FISH_FOR_JABU_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // ##### In `z_demo.c`: + // - `int32_t` (entranceCutscene->flag) (promoted from `uint8_t` by va_arg) + // - `int32_t` (entranceCutscene->entrance) (promoted from `uint16_t` by va_arg) + // ##### In `z_bg_breakwall.c` and `z_bg_toki_swd.c`: + // - `int32_t` (EVENTCHKINF) + // - `int32_t` (gSaveContext.entranceIndex) + VB_PLAY_ENTRANCE_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // ##### When called from `z_en_ds.c` + // - `*EnDs` + // ##### When called from `z_en_mk.c` + // - `*EnMk` + VB_PLAY_EYEDROP_CREATION_ANIM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_EYEDROPS_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_FIRE_ARROW_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_GORON_FREE_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_MINUET_OF_FOREST_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_MWEEP_CS, + + // #### `result` + // ```c + // this->getItemId == GI_GAUNTLETS_SILVER + // ``` + // #### `args` + // - None + VB_PLAY_NABOORU_CAPTURED_CS, + + // # UNUSED + VB_PLAY_ODD_POTION_ANIM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_PLAY_ONEPOINT_ACTOR_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*int16_t` (cutscene id) + VB_PLAY_ONEPOINT_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_PRELUDE_OF_LIGHT_CS, + + // #### `result` + // ##### In `z_demo.c` - `Cutscene_Command_Terminator` (setting `shouldSkipCommand`) + // ```c + // true + // ``` + // ##### In `z_demo.c` - `Cutscene_Command_Terminator` (inside if block and switch) + // ```c + // !Flags_GetEventChkInf(EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL) + // ``` + // #### `args` + // - None + VB_PLAY_PULL_MASTER_SWORD_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_RAINBOW_BRIDGE_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnOkarinaTag` + VB_PLAY_ROYAL_FAMILY_TOMB_CS, + + // #### `result` + // ```c + // play->csCtx.state != 0 && play->csCtx.npcActions[3] != NULL && play->csCtx.npcActions[3]->action == 2 + // ``` + // #### `args` + // - `*BgSpot02Objects` + VB_PLAY_ROYAL_FAMILY_TOMB_EXPLODE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnSa` + VB_PLAY_SARIAS_SONG_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_SERENADE_OF_WATER_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_SHIEK_BLOCK_MASTER_SWORD_CS, + + // #### `result` + // ```c + // (giEntry.itemId != ITEM_NONE) && (giEntry.gi >= 0) && (Item_CheckObtainability(giEntry.itemId) == ITEM_NONE) + // ``` + // #### `args` + // - `*EnBox` + VB_PLAY_SLOW_CHEST_CS, + + // #### `result` + // ```c + // !CHECK_QUEST_ITEM(QUEST_SONG_SUN) + // ``` + // #### `args` + // - `*EnOkarinaTag` + VB_PLAY_SUNS_SONG_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*LinkAnimationHeader` + VB_PLAY_THROW_ANIMATION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_PLAY_TRANSITION_CS, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*DemoIm` + VB_PLAY_ZELDAS_LULLABY_CS, + + // #### `result` + // ```c + // (dropParams >= ITEM00_RUPEE_GREEN) && (dropParams <= ITEM00_BOMBS_SPECIAL) + // ``` + // #### `args` + // - `*ObjTsubo` + VB_POT_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjTsubo` + VB_POT_SETUP_DRAW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_RENDER_KEY_COUNTER, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_RENDER_RUPEE_COUNTER, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `**Gfx` (`&POLY_KAL_DISP`) + VB_RENDER_YES_ON_CONTINUE_PROMPT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_REVERT_SPOILING_ITEMS, + + // #### `result` + // ```c + // !Flags_GetInfTable(INFTABLE_145) + // ``` + // #### `args` + // - `*EnRu1` + VB_RUTO_BE_CONSIDERED_NOT_KIDNAPPED, + + // #### `result` + // Landed on the platform in the big okto room + // ```c + // dynaPolyActor != NULL && dynaPolyActor->actor.id == ACTOR_BG_BDAN_OBJECTS && + // dynaPolyActor->actor.params == 0 && !Player_InCsMode(play) && play->msgCtx.msgLength == 0 + // ``` + // #### `args` + // - `*EnRu1` + // - `*DynaPolyActor` + VB_RUTO_RUN_TO_SAPPHIRE, + + // #### `result` + // in the big okto room and flag + // ```c + // !Flags_GetInfTable(INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE) && (func_80AEB124(play) != 0) + // ``` + // #### `args` + // - `*EnRu1` + VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnNiwLady` + VB_SET_CUCCO_COUNT, + + // #### `result` + // ```c + // SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2 + // ``` + // #### `args` + // - `*int16_t` - original next entrance index (`play->setupExitList[exitIndex - 1]`) + VB_SET_VOIDOUT_FROM_SURFACE, + + // #### `result` + // ```c + // (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT + // ``` + // #### `args` + // - None + VB_SHIEK_PREPARE_TO_GIVE_SERENADE_OF_WATER, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - None + VB_SHORT_CIRCUIT_GIVE_ITEM_PROCESS, + + // #### `result` + // ```c + // (s16)sFishingRecordLength < (s16)sFishOnHandLength + // ``` + // #### `args` + // - `*f32` (sFishOnHandLength) + VB_SHOULD_CHECK_FOR_FISHING_RECORD, + + // #### `result` + // ##### In `Fishing_HandleOwnerDialog` - `LINK_AGE_CHILD` + // ```c + // (sFishingRecordLength >= 50.0f) && !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_CHILD) + // ``` + // ##### In `Fishing_HandleOwnerDialog` - `!LINK_AGE_CHILD` + // ```c + // (sFishingRecordLength >= 60.0f) && !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_ADULT) + // ``` + // #### `args` + // - `*VBFishingData` + VB_SHOULD_GIVE_VANILLA_FISHING_PRIZE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*VBFishingData` + VB_SHOULD_SET_FISHING_RECORD, + + // #### `result` + // ```c + // gSaveContext.showTitleCard + // ``` + // #### `args` + // - None + VB_SHOW_TITLE_CARD, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - None + VB_SKIP_SCARECROWS_SONG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjBean` + VB_SPAWN_BEAN_STALK_FAIRIES, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // ##### In `z_boss_dodongo.c`: + // - `*BossDodongo` + // + // ##### In `z_boss_fd2.c` + // - `*BossFd2` + // + // ##### In `z_boss_ganondrof.c`: + // - `*BossGanondrof` + // + // ##### In `z_boss_goma.c`: + // - `*BossGoma` + // + // ##### In `z_boss_mo.c`: + // - `*BossMo` + // + // ##### In `z_boss_sst.c`: + // - `*BossSst` + // + // ##### In `z_boss_tw.c`: + // - `*BossTw` + // + // ##### In `z_boss_va.c`: + // - `*BossVa` + VB_SPAWN_BLUE_WARP, + + // #### `result` + // ```c + // INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE + // ``` + // #### `args` + // - None + VB_SPAWN_FIRE_ARROW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnElf` + VB_SPAWN_FOUNTAIN_FAIRIES, + + // #### `result` + // ```c + // this->unk_19D & 1 + // ``` + // #### `args` + // - `*EnGs` + VB_SPAWN_GOSSIP_STONE_FAIRY, + + // #### `result` + // ##### In `BossFd_Fly` (`case BOSSFD_SKULL_BURN`) + // ```c + // this->timers[0] == 7 + // ``` + // ##### Everywhere else + // ```c + // true + // ``` + // #### `args` + // - None + VB_SPAWN_HEART_CONTAINER, + + // #### `result` + // ```c + // (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_ODD_POTION) ? true : false + // ``` + // #### `args` + // - `*EnKo` + VB_SPAWN_LW_FADO, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ShotSun` + VB_SPAWN_SONG_FAIRY, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnHs` + VB_TRADE_COJIRO, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnMk` + VB_TRADE_FROG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDs` + VB_TRADE_ODD_MUSHROOM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnKo` + VB_TRADE_ODD_POTION, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnNiwLady` + VB_TRADE_POCKET_CUCCO, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnToryo` + VB_TRADE_SAW, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnMk` + VB_TRADE_TIMER_EYEDROPS, + + // #### `result` + // ```c + // INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_FROG) + // ``` + // #### `args` + // - None + VB_TRADE_TIMER_FROG, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - None + VB_TRADE_TIMER_ODD_MUSHROOM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*PauseContext` + VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, + + // #### `result` + // ```c + // INV_CONTENT(ITEM_ODD_MUSHROOM) == ITEM_EYEDROPS + // ``` + // #### `args` + // - `*EnMk` + VB_USE_EYEDROP_DIALOGUE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnWonderTalk2` + VB_WONDER_TALK, +} GIVanillaBehavior; From c11887edcd3d50d2854c14792ec1743800fc4666 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 8 Feb 2025 22:06:31 -0800 Subject: [PATCH 027/267] bump lus (#5026) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index e641b3777..74f1c35cd 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit e641b3777cbefb18a9cf4b95353d650b3a2abf65 +Subproject commit 74f1c35cd3bfa4f9e746c85234b8cb716c592a54 From 8ce5c46531f54ffc51d043f3e9b6b9ec11e12014 Mon Sep 17 00:00:00 2001 From: Spodi Date: Sun, 9 Feb 2025 07:07:02 +0100 Subject: [PATCH 028/267] Remove "Jitter Fix" option (#5020) This was just confusing for users. --- soh/soh/OTRGlobals.cpp | 3 --- soh/soh/SohGui/SohMenuBar.cpp | 10 ---------- 2 files changed, 13 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index bca2693e5..6b5afb0c3 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1438,9 +1438,6 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { wnd->SetTargetFps(fps); } - int threshold = CVarGetInteger(CVAR_SETTING("ExtraLatencyThreshold"), 80); - wnd->SetMaximumFrameLatency(threshold > 0 && target_fps >= threshold ? 2 : 1); - // When the gfx debugger is active, only run with the final mtx if (GfxDebuggerIsDebugging()) { mtx_replacements.clear(); diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index 0c974f599..bd39b2563 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -478,16 +478,6 @@ void DrawSettingsMenu() { } UIWidgets::Tooltip("Matches interpolation value to the game window's current refresh rate."); - if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { - UIWidgets::PaddedEnhancementSliderInt(CVarGetInteger(CVAR_SETTING("ExtraLatencyThreshold"), 80) == 0 ? "Jitter fix: Off" : "Jitter fix: >= %d FPS", - "##ExtraLatencyThreshold", CVAR_SETTING("ExtraLatencyThreshold"), 0, 360, "", 80, true, true, false); - UIWidgets::Tooltip( - "(For DirectX backend only)\n\n" - "When Interpolation FPS (Frame Rate) setting is at least this threshold, add one frame of delay (e.g. 16.6 ms for 60 FPS) in order to avoid jitter." - "This setting allows the CPU to work on one frame while GPU works on the previous frame.\n" - "This setting should be used when your computer is too slow to do CPU + GPU work in time."); - } - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); ImGui::Text("ImGui Menu Scale"); From 0177690b5430d98defc38ac0e272d78c5a6c1b47 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 9 Feb 2025 09:34:02 +0100 Subject: [PATCH 029/267] Remove potion values (#5021) --- soh/soh/Enhancements/mods.cpp | 25 ---- soh/soh/Enhancements/presets.h | 23 ---- .../randomizer/ShuffleFairies.cpp | 2 +- soh/soh/SohGui/SohMenuBar.cpp | 89 ------------- soh/soh/config/ConfigMigrators.h | 23 ---- .../actors/ovl_player_actor/z_player.c | 125 +++--------------- 6 files changed, 18 insertions(+), 269 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index c5b59eac7..bbfcf1052 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1161,30 +1161,6 @@ void RegisterCustomSkeletons() { }); } -#define FAIRY_FLAG_BIG (1 << 9) - - -void RegisterFairyCustomization() { - REGISTER_VB_SHOULD(VB_FAIRY_HEAL, { - EnElf* enElf = va_arg(args, EnElf*); - // Don't trigger if fairy is shuffled - if (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) || enElf->sohFairyIdentity.randomizerInf == RAND_INF_MAX) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(enElf->fairyFlags & FAIRY_FLAG_BIG)) - { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) - { - Health_ChangeBy(gPlayState, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); - } - else - { - Health_ChangeBy(gPlayState, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); - } - *should = false; - } - } - }); -} - void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); @@ -1217,6 +1193,5 @@ void InitMods() { RegisterHurtContainerModeHandler(); RegisterPauseMenuHooks(); RandoKaleido_RegisterHooks(); - RegisterFairyCustomization(); RegisterCustomSkeletons(); } diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index a0b7e6c24..d61ff6ade 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -105,29 +105,6 @@ const std::vector enhancementsCvars = { CVAR_ENHANCEMENT("GoronPot"), CVAR_ENHANCEMENT("FullHealthSpawn"), CVAR_ENHANCEMENT("DampeWin"), - CVAR_ENHANCEMENT("RedPotionEffect"), - CVAR_ENHANCEMENT("RedPotionHealth"), - CVAR_ENHANCEMENT("RedPercentRestore"), - CVAR_ENHANCEMENT("GreenPotionEffect"), - CVAR_ENHANCEMENT("GreenPotionMana"), - CVAR_ENHANCEMENT("GreenPercentRestore"), - CVAR_ENHANCEMENT("BluePotionEffects"), - CVAR_ENHANCEMENT("BluePotionHealth"), - CVAR_ENHANCEMENT("BlueHealthPercentRestore"), - CVAR_ENHANCEMENT("BluePotionMana"), - CVAR_ENHANCEMENT("BlueManaPercentRestore"), - CVAR_ENHANCEMENT("MilkEffect"), - CVAR_ENHANCEMENT("MilkHealth"), - CVAR_ENHANCEMENT("MilkPercentRestore"), - CVAR_ENHANCEMENT("SeparateHalfMilkEffect"), - CVAR_ENHANCEMENT("HalfMilkHealth"), - CVAR_ENHANCEMENT("HalfMilkPercentRestore"), - CVAR_ENHANCEMENT("FairyEffect"), - CVAR_ENHANCEMENT("FairyHealth"), - CVAR_ENHANCEMENT("FairyPercentRestore"), - CVAR_ENHANCEMENT("FairyReviveEffect"), - CVAR_ENHANCEMENT("FairyReviveHealth"), - CVAR_ENHANCEMENT("FairyRevivePercentRestore"), CVAR_ENHANCEMENT("CustomizeFishing"), CVAR_ENHANCEMENT("InstantFishing"), CVAR_ENHANCEMENT("GuaranteeFishingBite"), diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index c2416c95a..c8f044bd8 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -83,7 +83,7 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_end(args); - // Grant item when picking up fairy. If randomized, disable healing effect. + // Grant item when picking up fairy. if (id == VB_FAIRY_HEAL) { EnElf* enElf = (EnElf*)(actor); if (enElf->sohFairyIdentity.randomizerInf && enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index bd39b2563..e6337dae6 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -926,95 +926,6 @@ void DrawEnhancementsMenu() { if (ImGui::BeginMenu("Difficulty Options")) { - if (ImGui::BeginMenu("Potion Values")) - { - UIWidgets::EnhancementCheckbox("Change Red Potion Effect", CVAR_ENHANCEMENT("RedPotionEffect")); - UIWidgets::Tooltip("Enable the following changes to the amount of health restored by Red Potions"); - bool disabledRedPotion = !CVarGetInteger(CVAR_ENHANCEMENT("RedPotionEffect"), 0); - static const char* disabledTooltipRedPotion = "This option is disabled because \"Change Red Potion Effect\" is turned off"; - UIWidgets::EnhancementSliderInt("Red Potion Health: %d", "##REDPOTIONHEALTH", CVAR_ENHANCEMENT("RedPotionHealth"), 1, 100, "", 0, true, disabledRedPotion, disabledTooltipRedPotion); - UIWidgets::Tooltip("Changes the amount of health restored by Red Potions"); - UIWidgets::EnhancementCheckbox("Red Potion Percent Restore", CVAR_ENHANCEMENT("RedPercentRestore"), disabledRedPotion, disabledTooltipRedPotion); - UIWidgets::Tooltip("Toggles from Red Potions restoring a fixed amount of health to a percent of the player's current max health"); - - ImGui::Separator(); - - UIWidgets::EnhancementCheckbox("Change Green Potion Effect", CVAR_ENHANCEMENT("GreenPotionEffect")); - UIWidgets::Tooltip("Enable the following changes to the amount of mana restored by Green Potions"); - bool disabledGreenPotion = !CVarGetInteger(CVAR_ENHANCEMENT("GreenPotionEffect"), 0); - static const char* disabledTooltipGreenPotion = "This option is disabled because \"Change Green Potion Effect\" is turned off"; - UIWidgets::EnhancementSliderInt("Green Potion Mana: %d", "##GREENPOTIONMANA", CVAR_ENHANCEMENT("GreenPotionMana"), 1, 100, "", 0, true, disabledGreenPotion, disabledTooltipGreenPotion); - UIWidgets::Tooltip("Changes the amount of mana restored by Green Potions, base max mana is 48, max upgraded mana is 96"); - UIWidgets::EnhancementCheckbox("Green Potion Percent Restore", CVAR_ENHANCEMENT("GreenPercentRestore"), disabledGreenPotion, disabledTooltipGreenPotion); - UIWidgets::Tooltip("Toggles from Green Potions restoring a fixed amount of mana to a percent of the player's current max mana"); - - ImGui::Separator(); - - UIWidgets::EnhancementCheckbox("Change Blue Potion Effects", CVAR_ENHANCEMENT("BluePotionEffects")); - UIWidgets::Tooltip("Enable the following changes to the amount of health and mana restored by Blue Potions"); - bool disabledBluePotion = !CVarGetInteger(CVAR_ENHANCEMENT("BluePotionEffects"), 0); - static const char* disabledTooltipBluePotion = "This option is disabled because \"Change Blue Potion Effects\" is turned off"; - UIWidgets::EnhancementSliderInt("Blue Potion Health: %d", "##BLUEPOTIONHEALTH", CVAR_ENHANCEMENT("BluePotionHealth"), 1, 100, "", 0, true, disabledBluePotion, disabledTooltipBluePotion); - UIWidgets::Tooltip("Changes the amount of health restored by Blue Potions"); - UIWidgets::EnhancementCheckbox("Blue Potion Health Percent Restore", CVAR_ENHANCEMENT("BlueHealthPercentRestore"), disabledBluePotion, disabledTooltipBluePotion); - UIWidgets::Tooltip("Toggles from Blue Potions restoring a fixed amount of health to a percent of the player's current max health"); - - ImGui::Separator(); - - UIWidgets::EnhancementSliderInt("Blue Potion Mana: %d", "##BLUEPOTIONMANA", CVAR_ENHANCEMENT("BluePotionMana"), 1, 100, "", 0, true, disabledBluePotion, disabledTooltipBluePotion); - UIWidgets::Tooltip("Changes the amount of mana restored by Blue Potions, base max mana is 48, max upgraded mana is 96"); - UIWidgets::EnhancementCheckbox("Blue Potion Mana Percent Restore", CVAR_ENHANCEMENT("BlueManaPercentRestore"), disabledBluePotion, disabledTooltipBluePotion); - UIWidgets::Tooltip("Toggles from Blue Potions restoring a fixed amount of mana to a percent of the player's current max mana"); - - ImGui::Separator(); - - UIWidgets::EnhancementCheckbox("Change Milk Effect", CVAR_ENHANCEMENT("MilkEffect")); - UIWidgets::Tooltip("Enable the following changes to the amount of health restored by Milk"); - bool disabledMilk = !CVarGetInteger(CVAR_ENHANCEMENT("MilkEffect"), 0); - static const char* disabledTooltipMilk = "This option is disabled because \"Change Milk Effect\" is turned off"; - UIWidgets::EnhancementSliderInt("Milk Health: %d", "##MILKHEALTH", CVAR_ENHANCEMENT("MilkHealth"), 1, 100, "", 0, true, disabledMilk, disabledTooltipMilk); - UIWidgets::Tooltip("Changes the amount of health restored by Milk"); - UIWidgets::EnhancementCheckbox("Milk Percent Restore", CVAR_ENHANCEMENT("MilkPercentRestore"), disabledMilk, disabledTooltipMilk); - UIWidgets::Tooltip("Toggles from Milk restoring a fixed amount of health to a percent of the player's current max health"); - - ImGui::Separator(); - - UIWidgets::EnhancementCheckbox("Separate Half Milk Effect", CVAR_ENHANCEMENT("SeparateHalfMilkEffect"), disabledMilk, disabledTooltipMilk); - UIWidgets::Tooltip("Enable the following changes to the amount of health restored by Half Milk\nIf this is disabled, Half Milk will behave the same as Full Milk."); - bool disabledHalfMilk = disabledMilk || !CVarGetInteger(CVAR_ENHANCEMENT("SeparateHalfMilkEffect"), 0); - static const char* disabledTooltipHalfMilk = "This option is disabled because \"Separate Half Milk Effect\" is turned off"; - UIWidgets::EnhancementSliderInt("Half Milk Health: %d", "##HALFMILKHEALTH", CVAR_ENHANCEMENT("HalfMilkHealth"), 1, 100, "", 0, true, disabledHalfMilk, disabledTooltipHalfMilk); - UIWidgets::Tooltip("Changes the amount of health restored by Half Milk"); - UIWidgets::EnhancementCheckbox("Half Milk Percent Restore", CVAR_ENHANCEMENT("HalfMilkPercentRestore"), disabledHalfMilk, disabledTooltipHalfMilk); - UIWidgets::Tooltip("Toggles from Half Milk restoring a fixed amount of health to a percent of the player's current max health"); - - ImGui::Separator(); - - UIWidgets::EnhancementCheckbox("Change Fairy Effect", CVAR_ENHANCEMENT("FairyEffect")); - UIWidgets::Tooltip("Enable the following changes to the amount of health restored by Fairies"); - bool disabledFairy = !CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0); - static const char* disabledTooltipFairy = "This option is disabled because \"Change Fairy Effect\" is turned off"; - UIWidgets::EnhancementSliderInt("Fairy: %d", "##FAIRYHEALTH", CVAR_ENHANCEMENT("FairyHealth"), 1, 100, "", 0, true, disabledFairy, disabledTooltipFairy); - UIWidgets::Tooltip("Changes the amount of health restored by Fairies"); - UIWidgets::EnhancementCheckbox("Fairy Percent Restore", CVAR_ENHANCEMENT("FairyPercentRestore"), disabledFairy, disabledTooltipFairy); - UIWidgets::Tooltip("Toggles from Fairies restoring a fixed amount of health to a percent of the player's current max health"); - - ImGui::Separator(); - - UIWidgets::EnhancementCheckbox("Change Fairy Revive Effect", CVAR_ENHANCEMENT("FairyReviveEffect")); - UIWidgets::Tooltip("Enable the following changes to the amount of health restored by Fairy Revivals"); - bool disabledFairyRevive = !CVarGetInteger(CVAR_ENHANCEMENT("FairyReviveEffect"), 0); - static const char* disabledTooltipFairyRevive = "This option is disabled because \"Change Fairy Revive Effect\" is turned off"; - UIWidgets::EnhancementSliderInt("Fairy Revival: %d", "##FAIRYREVIVEHEALTH", CVAR_ENHANCEMENT("FairyReviveHealth"), 1, 100, "", 0, true, disabledFairyRevive, disabledTooltipFairyRevive); - UIWidgets::Tooltip("Changes the amount of health restored by Fairy Revivals"); - UIWidgets::EnhancementCheckbox("Fairy Revive Percent Restore", CVAR_ENHANCEMENT("FairyRevivePercentRestore"), disabledFairyRevive, disabledTooltipFairyRevive); - UIWidgets::Tooltip("Toggles from Fairy Revivals restoring a fixed amount of health to a percent of the player's current max health"); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - if (ImGui::BeginMenu("Shooting Gallery")) { UIWidgets::EnhancementCheckbox("Customize Behavior", CVAR_ENHANCEMENT("CustomizeShootingGallery")); UIWidgets::Tooltip("Turn on/off changes to the shooting gallery behavior"); diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index ea5f1cf70..3a566f493 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -149,11 +149,6 @@ namespace SOH { { MigrationAction::Rename, "gBetterFW", "gEnhancements.BetterFarore" }, { MigrationAction::Rename, "gBetterOwl", "gEnhancements.BetterOwl" }, { MigrationAction::Rename, "gBlueFireArrows", "gEnhancements.BlueFireArrows" }, - { MigrationAction::Rename, "gBlueHealthPercentRestore", "gEnhancements.BlueHealthPercentRestore" }, - { MigrationAction::Rename, "gBlueManaPercentRestore", "gEnhancements.BlueManaPercentRestore" }, - { MigrationAction::Rename, "gBluePotionEffects", "gEnhancements.BluePotionEffects" }, - { MigrationAction::Rename, "gBluePotionHealth", "gEnhancements.BluePotionHealth" }, - { MigrationAction::Rename, "gBluePotionMana", "gEnhancements.BluePotionMana" }, { MigrationAction::Rename, "gBombchuBowlingAmmunition", "gEnhancements.BombchuBowlingAmmo" }, { MigrationAction::Rename, "gBombchuBowlingNoBigCucco", "gEnhancements.BombchuBowlingNoBigCucco" }, { MigrationAction::Rename, "gBombchuBowlingNoSmallCucco", "gEnhancements.BombchuBowlingNoSmallCucco" }, @@ -205,12 +200,6 @@ namespace SOH { { MigrationAction::Rename, "gEnemySpawnsOverWaterboxes", "gEnhancements.EnemySpawnsOverWaterboxes" }, { MigrationAction::Rename, "gEquipmentCanBeRemoved", "gEnhancements.EquipmentCanBeRemoved" }, { MigrationAction::Rename, "gFPSGauntlets", "gEnhancements.FirstPersonGauntlets" }, - { MigrationAction::Rename, "gFairyEffect", "gEnhancements.FairyEffect" }, - { MigrationAction::Rename, "gFairyHealth", "gEnhancements.FairyHealth" }, - { MigrationAction::Rename, "gFairyPercentRestore", "gEnhancements.FairyPercentRestore" }, - { MigrationAction::Rename, "gFairyReviveEffect", "gEnhancements.FairyReviveEffect" }, - { MigrationAction::Rename, "gFairyReviveHealth", "gEnhancements.FairyReviveHealth" }, - { MigrationAction::Rename, "gFairyRevivePercentRestore", "gEnhancements.FairyRevivePercentRestore" }, { MigrationAction::Rename, "gFallDamageMul", "gEnhancements.FallDamageMult" }, { MigrationAction::Rename, "gFastBoomerang", "gEnhancements.FastBoomerang" }, { MigrationAction::Rename, "gFastChests", "gEnhancements.FastChests" }, @@ -235,14 +224,9 @@ namespace SOH { { MigrationAction::Rename, "gGerudoWarriorClothingFix", "gEnhancements.GerudoWarriorClothingFix" }, { MigrationAction::Rename, "gGoronPot", "gEnhancements.GoronPot" }, { MigrationAction::Rename, "gGravediggingTourFix", "gEnhancements.GravediggingTourFix" }, - { MigrationAction::Rename, "gGreenPercentRestore", "gEnhancements.GreenPercentRestore" }, - { MigrationAction::Rename, "gGreenPotionEffect", "gEnhancements.GreenPotionEffect" }, - { MigrationAction::Rename, "gGreenPotionMana", "gEnhancements.GreenPotionMana" }, { MigrationAction::Rename, "gGsCutscene", "gEnhancements.GSCutscene" }, { MigrationAction::Rename, "gGuaranteeFishingBite", "gEnhancements.GuaranteeFishingBite" }, { MigrationAction::Rename, "gGuardVision", "gEnhancements.GuardVision" }, - { MigrationAction::Rename, "gHalfMilkHealth", "gEnhancements.HalfMilkHealth" }, - { MigrationAction::Rename, "gHalfMilkPercentRestore", "gEnhancements.HalfMilkPercentRestore" }, { MigrationAction::Rename, "gHideBunnyHood", "gEnhancements.HideBunnyHood" }, { MigrationAction::Rename, "gHookshotableReticle", "gEnhancements.HookshotableReticle" }, { MigrationAction::Rename, "gHoverFishing", "gEnhancements.HoverFishing" }, @@ -259,9 +243,6 @@ namespace SOH { { MigrationAction::Rename, "gMMBunnyHood", "gEnhancements.MMBunnyHood" }, { MigrationAction::Rename, "gMarketSneak", "gEnhancements.MarketSneak" }, { MigrationAction::Rename, "gMaskSelect", "gEnhancements.MaskSelect" }, - { MigrationAction::Rename, "gMilkEffect", "gEnhancements.MilkEffect" }, - { MigrationAction::Rename, "gMilkHealth", "gEnhancements.MilkHealth" }, - { MigrationAction::Rename, "gMilkPercentRestore", "gEnhancements.MilkPercentRestore" }, { MigrationAction::Rename, "gMinFrameCount", "gEnhancements.MinFrameCount" }, { MigrationAction::Rename, "gMinimalUI", "gEnhancements.MinimalUI" }, { MigrationAction::Rename, "gMirroredWorldMode", "gEnhancements.MirroredWorldMode" }, @@ -291,16 +272,12 @@ namespace SOH { { MigrationAction::Rename, "gRandomizedEnemies", "gEnhancements.RandomizedEnemies" }, { MigrationAction::Rename, "gRandomizedEnemySizes", "gEnhancements.RandomizedEnemySizes" }, { MigrationAction::Rename, "gRedGanonBlood", "gEnhancements.RedGanonBlood" }, - { MigrationAction::Rename, "gRedPercentRestore", "gEnhancements.RedPercentRestore" }, - { MigrationAction::Rename, "gRedPotionEffect", "gEnhancements.RedPotionEffect" }, - { MigrationAction::Rename, "gRedPotionHealth", "gEnhancements.RedPotionHealth" }, { MigrationAction::Rename, "gRememberSaveLocation", "gEnhancements.RememberSaveLocation" }, { MigrationAction::Rename, "gRemoveExplosiveLimit", "gEnhancements.RemoveExplosiveLimit" }, { MigrationAction::Rename, "gRestoreRBAValues", "gEnhancements.RestoreRBAValues" }, { MigrationAction::Rename, "gRupeeDash", "gEnhancements.RupeeDash" }, { MigrationAction::Rename, "gSceneSpecificDirtPathFix", "gEnhancements.SceneSpecificDirtPathFix" }, { MigrationAction::Rename, "gSeparateArrows", "gEnhancements.SeparateArrows" }, - { MigrationAction::Rename, "gSeparateHalfMilkEffect", "gEnhancements.SeparateHalfMilkEffect" }, { MigrationAction::Rename, "gShadowTag", "gEnhancements.ShadowTag" }, { MigrationAction::Rename, "gShowDoorLocksOnBothSides", "gEnhancements.ShowDoorLocksOnBothSides" }, { MigrationAction::Rename, "gSilverRupeeJingleExtend", "gEnhancements.SilverRupeeJingleExtend" }, 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 77b4a7e27..8141a8942 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -9468,16 +9468,7 @@ void func_80843AE8(PlayState* play, Player* this) { LinkAnimation_Change(play, &this->skelAnime, &gPlayerAnim_link_derth_rebirth, 1.0f, 99.0f, Animation_GetLastFrame(&gPlayerAnim_link_derth_rebirth), ANIMMODE_ONCE, 0.0f); } - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyReviveEffect"), 0)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyRevivePercentRestore"), 0)) { - gSaveContext.healthAccumulator = - (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyReviveHealth"), 100) / 100 + 15) / 16 * 16; - } else { - gSaveContext.healthAccumulator = CVarGetInteger(CVAR_ENHANCEMENT("FairyReviveHealth"), 20) * 16; - } - } else { - gSaveContext.healthAccumulator = 0x140; - } + gSaveContext.healthAccumulator = 0x140; this->av2.actionVar2 = -1; } } else if (gSaveContext.healthAccumulator == 0) { @@ -14481,13 +14472,13 @@ void Player_Action_8084E9AC(Player* this, PlayState* play) { } } -static u8 D_808549FC[] = { - 0x01, 0x03, 0x02, 0x04, 0x04, -}; - void Player_Action_8084EAC0(Player* this, PlayState* play) { if (LinkAnimation_Update(play, &this->skelAnime)) { if (this->av2.actionVar2 == 0) { + static u8 D_808549FC[] = { + 0x01, 0x03, 0x02, 0x04, 0x04, + }; + if (this->itemAction == PLAYER_IA_BOTTLE_POE) { s32 rand = Rand_S16Offset(-1, 3); @@ -14507,98 +14498,25 @@ void Player_Action_8084EAC0(Player* this, PlayState* play) { } else { s32 sp28 = D_808549FC[this->itemAction - PLAYER_IA_BOTTLE_POTION_RED]; - if (CVarGetInteger(CVAR_ENHANCEMENT("RedPotionEffect"), 0) && this->itemAction == PLAYER_IA_BOTTLE_POTION_RED) { - if (CVarGetInteger(CVAR_ENHANCEMENT("RedPercentRestore"), 0)) { - gSaveContext.healthAccumulator = - (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("RedPotionHealth"), 100) / 100 + 15) / 16 * 16; - } else { - gSaveContext.healthAccumulator = CVarGetInteger(CVAR_ENHANCEMENT("RedPotionHealth"), 20) * 16; - } - } else if (CVarGetInteger(CVAR_ENHANCEMENT("BluePotionEffects"), 0) && - this->itemAction == PLAYER_IA_BOTTLE_POTION_BLUE) { - if (CVarGetInteger(CVAR_ENHANCEMENT("BlueHealthPercentRestore"), 0)) { - gSaveContext.healthAccumulator = - (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("BluePotionHealth"), 100) / 100 + 15) / 16 * 16; - } else { - gSaveContext.healthAccumulator = CVarGetInteger(CVAR_ENHANCEMENT("BluePotionHealth"), 20) * 16; - } + if (sp28 & 1) { + gSaveContext.healthAccumulator = 0x140; + } - if (CVarGetInteger(CVAR_ENHANCEMENT("BlueManaPercentRestore"), 0)) { - if (gSaveContext.magicState != MAGIC_STATE_ADD) { - Magic_Fill(play); - } + if (sp28 & 2) { + Magic_Fill(play); + } - Magic_RequestChange(play, - (gSaveContext.magicLevel * 48 * CVarGetInteger(CVAR_ENHANCEMENT("BluePotionMana"), 100) / 100 + 15) / - 16 * 16, - MAGIC_ADD); - } else { - if (gSaveContext.magicState != MAGIC_STATE_ADD) { - Magic_Fill(play); - } - - Magic_RequestChange(play, CVarGetInteger(CVAR_ENHANCEMENT("BluePotionMana"), 100), MAGIC_ADD); - ; - } - } else if (CVarGetInteger(CVAR_ENHANCEMENT("GreenPotionEffect"), 0) && - this->itemAction == PLAYER_IA_BOTTLE_POTION_GREEN) { - if (CVarGetInteger(CVAR_ENHANCEMENT("GreenPercentRestore"), 0)) { - if (gSaveContext.magicState != MAGIC_STATE_ADD) { - Magic_Fill(play); - } - - Magic_RequestChange(play, - (gSaveContext.magicLevel * 48 * CVarGetInteger(CVAR_ENHANCEMENT("GreenPotionMana"), 100) / 100 + 15) / - 16 * 16, - MAGIC_ADD); - } else { - if (gSaveContext.magicState != MAGIC_STATE_ADD) { - Magic_Fill(play); - } - - Magic_RequestChange(play, CVarGetInteger(CVAR_ENHANCEMENT("GreenPotionMana"), 100), MAGIC_ADD); - ; - } - } else if (CVarGetInteger(CVAR_ENHANCEMENT("MilkEffect"), 0) && (this->itemAction == PLAYER_IA_BOTTLE_MILK_FULL || - this->itemAction == PLAYER_IA_BOTTLE_MILK_HALF)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("MilkPercentRestore"), 0)) { - gSaveContext.healthAccumulator = - (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("MilkHealth"), 100) / 100 + 15) / 16 * 16; - } else { - gSaveContext.healthAccumulator = CVarGetInteger(CVAR_ENHANCEMENT("MilkHealth"), 5) * 16; - } - if (CVarGetInteger(CVAR_ENHANCEMENT("SeparateHalfMilkEffect"), 0) && - this->itemAction == PLAYER_IA_BOTTLE_MILK_HALF) { - if (CVarGetInteger(CVAR_ENHANCEMENT("HalfMilkPercentRestore"), 0)) { - gSaveContext.healthAccumulator = - (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("HalfMilkHealth"), 100) / 100 + 15) / 16 * - 16; - } else { - gSaveContext.healthAccumulator = CVarGetInteger(CVAR_ENHANCEMENT("HalfMilkHealth"), 5) * 16; - } - } - } else { - if (sp28 & 1) { - gSaveContext.healthAccumulator = 0x140; - } - - if (sp28 & 2) { - Magic_Fill(play); - } - - if (sp28 & 4) { - gSaveContext.healthAccumulator = 0x50; - } + if (sp28 & 4) { + gSaveContext.healthAccumulator = 0x50; } } Player_AnimPlayLoopAdjusted(play, this, &gPlayerAnim_link_bottle_drink_demo_wait); this->av2.actionVar2 = 1; - return; + } else { + func_8083C0E8(this, play); + func_8005B1A4(Play_GetCamera(play, 0)); } - - func_8083C0E8(this, play); - func_8005B1A4(Play_GetCamera(play, 0)); } else if (this->av2.actionVar2 == 1) { if ((gSaveContext.healthAccumulator == 0) && (gSaveContext.magicState != MAGIC_STATE_FILL)) { Player_AnimChangeOnceMorphAdjusted(play, this, &gPlayerAnim_link_bottle_drink_demo_end); @@ -14724,16 +14642,7 @@ void Player_Action_8084EED8(Player* this, PlayState* play) { Player_PlaySfx(this, NA_SE_EV_BOTTLE_CAP_OPEN); Player_PlaySfx(this, NA_SE_EV_FIATY_HEAL - SFX_FLAG); } else if (LinkAnimation_OnFrame(&this->skelAnime, 47.0f)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) { - gSaveContext.healthAccumulator = - (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16; - } else { - gSaveContext.healthAccumulator = CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16; - } - } else { - gSaveContext.healthAccumulator = 0x140; - } + gSaveContext.healthAccumulator = 0x140; } } From 29cecd8502d3a5d7a60c41dd5a9ccec616017bef Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sun, 9 Feb 2025 08:49:56 -0800 Subject: [PATCH 030/267] fix dark link softlock (#5027) --- soh/soh/Enhancements/AssignableTunicsAndBoots.cpp | 13 +++++++++++-- .../vanilla-behavior/GIVanillaBehavior.h | 1 + soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp index a7e210b95..3a52312c9 100644 --- a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp +++ b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp @@ -94,10 +94,19 @@ void RegisterAssignableTunicsBoots() { return; } - Input* input = va_arg(args, Input*); - Player* player = GET_PLAYER(gPlayState); + Player* player = va_arg(args, Player*); + + // if we're not dealing with the actual player, we're probably + // dealing with dark link, don't do any tunics/boots stuff, just + // run the vanilla action func + if (player->actor.id != ACTOR_PLAYER) { + return; + } *should = false; + + Input* input = va_arg(args, Input*); + player->actionFunc(player, gPlayState); UseTunicBoots(player, gPlayState, input); }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 4974baf5b..56679f976 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -398,6 +398,7 @@ typedef enum { // !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC) // ``` // #### `args` + // - `*Player` // - `*Input` VB_EXECUTE_PLAYER_ACTION_FUNC, 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 8141a8942..3db05d94e 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -12166,7 +12166,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { sUseHeldItem = sHeldItemButtonIsHeldDown = 0; sSavedCurrentMask = this->currentMask; - if (GameInteractor_Should(VB_EXECUTE_PLAYER_ACTION_FUNC, !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC), input)) { + if (GameInteractor_Should(VB_EXECUTE_PLAYER_ACTION_FUNC, !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC), this, input)) { this->actionFunc(this, play); } From a7f837014f0fc7eb8e4ec75dca49efad34fa9c99 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sun, 9 Feb 2025 09:58:27 -0800 Subject: [PATCH 031/267] fix dark link not getting hit when stunned (#5028) in https://github.com/HarbourMasters/Shipwright/pull/3280 both `0x00400000` and `0x04000000` were replaced with `PLAYER_STATE1_SHIELDING`. `0x00400000` is `PLAYER_STATE1_SHIELDING`, but `0x04000000` is `PLAYER_STATE1_DAMAGED` this fixes the spots in `z_en_torch2` where we had `PLAYER_STATE1_SHIELDING` where it should have been `PLAYER_STATE1_DAMAGED` --- soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 0b6f16c59..378e93bb6 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 @@ -608,7 +608,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { sDeathFlag = false; } if ((this->invincibilityTimer == 0) && (this->actor.colChkInfo.health != 0) && - (this->cylinder.base.acFlags & AC_HIT) && !(this->stateFlags1 & PLAYER_STATE1_SHIELDING) && + (this->cylinder.base.acFlags & AC_HIT) && !(this->stateFlags1 & PLAYER_STATE1_DAMAGED) && !(this->meleeWeaponQuads[0].base.atFlags & AT_HIT) && !(this->meleeWeaponQuads[1].base.atFlags & AT_HIT)) { if (!Actor_ApplyDamage(&this->actor)) { @@ -660,7 +660,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { this->stateFlags3 &= ~PLAYER_STATE3_PAUSE_ACTION_FUNC; } else { this->stateFlags3 |= PLAYER_STATE3_PAUSE_ACTION_FUNC; - this->stateFlags1 &= ~PLAYER_STATE1_SHIELDING; + this->stateFlags1 &= ~PLAYER_STATE1_DAMAGED; this->invincibilityTimer = 0; input->press.stick_x = input->press.stick_y = 0; /*! @bug From ac72ebaaa331000e84293f53d84c94774538ea82 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 11 Feb 2025 08:56:48 -0600 Subject: [PATCH 032/267] Fix issue with pause buffer input window not applying correctly to closing save prompt state and move code around to be in order of operations (#4975) --- .../Restorations/PauseBufferInputs.cpp | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp index 4604c00ca..373d481ef 100644 --- a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp +++ b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp @@ -25,20 +25,22 @@ static u16 pauseInputs = 0; #define PAUSE_STATE_OFF 0 #define PAUSE_STATE_OPENING_1 2 #define PAUSE_STATE_UNPAUSE_SETUP 18 +#define PAUSE_STATE_SAVEPROMPT 7 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 + // STEP #3: If the user opts to include held inputs in the buffer window, store the currnently held inputs, minus + // the held inputs when the pause menu was opened. This only applies to the first frame of the buffer window if (CVAR_INCLUDE_VALUE && inputBufferTimer == 0) { pauseInputs |= input->cur.button & ~prePauseInputs; prePauseInputs = 0; } + // STEP #4: Store all inputs that were pressed during the buffer window + pauseInputs |= input->press.button; + // Wait a specified number of frames before continuing the unpause inputBufferTimer++; if (inputBufferTimer < CVAR_BUFFER_VALUE) { @@ -54,10 +56,21 @@ void RegisterPauseBufferInputs() { 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; + // STEP #1: 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; + } + // STEP #2: The unpause process has begun, so let's reset the input buffer timer + if (pauseCtx->state == PAUSE_STATE_UNPAUSE_SETUP || ( + pauseCtx->state == PAUSE_STATE_SAVEPROMPT && (pauseCtx->unk_1EC == 2 || pauseCtx->unk_1EC == 5) + )) { + inputBufferTimer = 0; + } + + // STEP #5: 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) { // If the user opts into easy frame advance, remove START input if (CVAR_FRAME_ADVANCE_VALUE) { pauseInputs &= ~BTN_START; @@ -65,17 +78,10 @@ void RegisterPauseBufferInputs() { // 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; + // Reset the used variables 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; + inputBufferTimer = 0; } }); } From f5fa0f4e00c010afa99b7ba074d3463fa8bae695 Mon Sep 17 00:00:00 2001 From: Sarge-117 <108380086+Sarge-117@users.noreply.github.com> Date: Tue, 11 Feb 2025 13:18:16 -0800 Subject: [PATCH 033/267] fix typo (#5036) --- soh/soh/Enhancements/randomizer/3drando/hint_list.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index fd1f5ae4d..3081d4863 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -2393,7 +2393,7 @@ void StaticData::HintTable_Init() { /*french*/ "J'admire ce que tu as fait à l'Île Koholint... Toi et moi, nous devrions faire équipe!")); // /*spanish*/Después de lo que le hiciste a la Isla Koholint, ¿cómo te atreves a llamarme malvado? - hintTextTable[RHT_GANON_JOKE10] = HintText(CustomMessage("Today, let's begin down&'The Hero is Defeated' timeline.", + hintTextTable[RHT_GANON_JOKE11] = HintText(CustomMessage("Today, let's begin down&'The Hero is Defeated' timeline.", /*german*/ "", /*french*/ "Si tu me vaincs, Hyrule sera englouti... mais si tu meurs, on aura A Link to the Past, le meilleur opus " "de la série!")); From 46c6d2f5261f78a22365549494db1cfef2625164 Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 11 Feb 2025 16:36:12 -0500 Subject: [PATCH 034/267] Restore pause link drawing behavior to use the work buffer (#5038) --- soh/src/code/z_player_lib.c | 44 ++++++++++++------- .../ovl_kaleido_scope/z_kaleido_equipment.c | 9 +++- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index af6062723..dd15a4932 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -2141,12 +2141,11 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, // Note: the viewport x and y values are overwritten below, before usage static Vp viewport = { (PAUSE_EQUIP_PLAYER_WIDTH / 2) << 2, (PAUSE_EQUIP_PLAYER_HEIGHT / 2) << 2, G_MAXZ / 2, 0, (PAUSE_EQUIP_PLAYER_WIDTH / 2) << 2, (PAUSE_EQUIP_PLAYER_HEIGHT / 2) << 2, G_MAXZ / 2, 0 }; - static Lights1 lights1 = gdSPDefLights1(80, 80, 80, 255, 255, 255, 84, 84, 172); + static Lights1 lights1 = gdSPDefLights1(80, 80, 80, 255, 255, 255, 84, 84, -84); static Vec3f lightDir = { 89.8f, 0.0f, 89.8f }; u8 playerSwordAndShield[2]; Gfx* opaRef; Gfx* xluRef; - Gfx* kalRef; u16 perspNorm; Mtx* perspMtx = Graph_Alloc(play->state.gfxCtx, sizeof(Mtx)); Mtx* lookAtMtx = Graph_Alloc(play->state.gfxCtx, sizeof(Mtx)); @@ -2155,8 +2154,18 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, OPEN_DISPS(play->state.gfxCtx); + opaRef = POLY_OPA_DISP; + POLY_OPA_DISP++; + + xluRef = POLY_XLU_DISP; + POLY_XLU_DISP++; + + gSPDisplayList(WORK_DISP++, POLY_OPA_DISP); + gSPDisplayList(WORK_DISP++, POLY_XLU_DISP); + if (mirrorWorldActive) { gSPSetExtraGeometryMode(POLY_OPA_DISP++, G_EX_INVERT_CULLING); + gSPSetExtraGeometryMode(POLY_XLU_DISP++, G_EX_INVERT_CULLING); } gSPSegment(POLY_OPA_DISP++, 0x00, NULL); @@ -2170,7 +2179,14 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_FILL | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2); - gSPLoadGeometryMode(POLY_OPA_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH); + + // Also matches if some of the previous graphics commands are moved inside this block too. Possible macro? + if (1) { + s32 pad[2]; + + gSPLoadGeometryMode(POLY_OPA_DISP++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH); + } + gDPSetScissor(POLY_OPA_DISP++, G_SC_NON_INTERLACE, 0, 0, width, height); gSPClipRatio(POLY_OPA_DISP++, FRUSTRATIO_1); @@ -2192,8 +2208,8 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, gDPSetDepthImage(POLY_OPA_DISP++, depthFrameBuffer); - viewport.vp.vscale[0] = viewport.vp.vtrans[0] = width * 2; - viewport.vp.vscale[1] = viewport.vp.vtrans[1] = height * 2; + viewport.vp.vscale[0] = viewport.vp.vtrans[0] = width * ((1 << 2) / 2); + viewport.vp.vscale[1] = viewport.vp.vtrans[1] = height * ((1 << 2) / 2); gSPViewport(POLY_OPA_DISP++, &viewport); guPerspective(perspMtx, &perspNorm, fovy, (f32)width / (f32)height, 10.0f, 4000.0f, 1.0f); @@ -2226,28 +2242,26 @@ void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, gSPSegment(POLY_OPA_DISP++, 0x0C, gCullBackDList); Player_DrawImpl(play, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount, 0, tunic, boots, 0, - Player_OverrideLimbDrawPause, NULL, &playerSwordAndShield); - - if (CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0)) { + Player_OverrideLimbDrawPause, NULL, &playerSwordAndShield); + if (CVarGetInteger(CVAR_GENERAL("PauseMenuAnimatedLinkTriforce"), 0)) { Matrix_SetTranslateRotateYXZ(pos->x - (LINK_AGE_IN_YEARS == YEARS_ADULT ? 25 : 0), pos->y + 280 + (LINK_AGE_IN_YEARS == YEARS_ADULT ? 48 : 0), pos->z, rot); Matrix_Scale(scale * (mirrorWorldActive ? -1 : 1), scale * 1, scale * 1, MTXMODE_APPLY); - Gfx* ohNo = POLY_XLU_DISP; - POLY_XLU_DISP = POLY_OPA_DISP; - Pause_DrawTriforceSpot(play, 1); - - POLY_OPA_DISP = POLY_XLU_DISP; - POLY_XLU_DISP = ohNo; } if (mirrorWorldActive) { gSPClearExtraGeometryMode(POLY_OPA_DISP++, G_EX_INVERT_CULLING); + gSPClearExtraGeometryMode(POLY_XLU_DISP++, G_EX_INVERT_CULLING); } - POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP++); + gSPEndDisplayList(POLY_OPA_DISP++); + gSPEndDisplayList(POLY_XLU_DISP++); + + gSPBranchList(opaRef, POLY_OPA_DISP); + gSPBranchList(xluRef, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 5fd8aa2b5..5ed5bdbaa 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -148,7 +148,10 @@ void KaleidoScope_DrawPlayerWork(PlayState* play) { scale = 0.047f; } - gsSPSetFB(play->state.gfxCtx->polyOpa.p++, gPauseLinkFrameBuffer); + // SOH [Port] Draw the pause Link on a separate framebuffer starting in the work buffer + OPEN_DISPS(play->state.gfxCtx); + gsSPSetFB(WORK_DISP++, gPauseLinkFrameBuffer); + rot.y = 32300; rot.x = rot.z = 0; Player_DrawPause(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &rot, scale, @@ -156,7 +159,9 @@ void KaleidoScope_DrawPlayerWork(PlayState* play) { TUNIC_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)), SHIELD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD)), BOOTS_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS))); - gsSPResetFB(play->state.gfxCtx->polyOpa.p++); + + gsSPResetFB(WORK_DISP++); + CLOSE_DISPS(play->state.gfxCtx); } void KaleidoScope_DrawEquipment(PlayState* play) { From 37fd39c7b500b7742d8e4a0f3df80053760a4fed Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Wed, 12 Feb 2025 06:32:40 -0800 Subject: [PATCH 035/267] shipinit dont show master sword (#4989) * Initial Commit * Added full functionality for both Hylian and Mirror * Included Format * Removed Format * Pedestal Cutscene * Much Less OnGameUpdating * Fix function call * use enums * move animation skip to vb should * move taking out master sword to put in pedestal check into vb should * move the rest of it over * extra newline was bugging me * update on `"IS_RANDO"` and use `COND`s * make new "uncategorized" section for VB enum * move shoulds to new file * move vb rsk checks into conds --------- Co-authored-by: Patrick12115 Co-authored-by: Malkierian --- .../Enhancements/cosmetics/NoMasterSword.cpp | 113 ++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 16 +++ .../actors/ovl_player_actor/z_player.c | 6 +- 3 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 soh/soh/Enhancements/cosmetics/NoMasterSword.cpp diff --git a/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp b/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp new file mode 100644 index 000000000..4d4b26715 --- /dev/null +++ b/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp @@ -0,0 +1,113 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "soh/OTRGlobals.h" +#include "soh/ResourceManagerHelpers.h" +#include "objects/object_link_boy/object_link_boy.h" + +extern "C" { +#include "functions.h" +#include "macros.h" +#include "variables.h" + +extern PlayState* gPlayState; +extern void Player_StartMode_Idle(PlayState*, Player*); +extern u8 Randomizer_GetSettingValue(RandomizerSettingKey); +} + +void UpdateNoMSPatch() { + // Condition for patching + bool shouldPatch = (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER && + gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS && + gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE && + (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE || + (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)))); + + if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) && shouldPatch) { + // Patching if conditions are met + for (int i = 43; i <= 46; i++) { + std::string patchName = "adultNoMS." + std::to_string(1) + "." + std::to_string(i); + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, patchName.c_str(), i, gsDPNoOp()); + } + for (int i = 62; i <= 150; i++) { + std::string patchName = "adultNoMS." + std::to_string(2) + "." + std::to_string(i); + ResourceMgr_PatchGfxByName(gLinkAdultMirrorShieldSwordAndSheathNearDL, patchName.c_str(), i, gsDPNoOp()); + } + for (int i = 61; i <= 118; i++) { + std::string patchName = "adultNoMS." + std::to_string(3) + "." + std::to_string(i); + ResourceMgr_PatchGfxByName(gLinkAdultMirrorShieldSwordAndSheathFarDL, patchName.c_str(), i, gsDPNoOp()); + } + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathNearDL, "adultNoMSHylianShield1", 75, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, "adultNoMSHylianShield2", 71, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathNearDL, "adultNoMasterSword1", 2, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathFarDL, "adultNoMasterSword2", 2, gsSPEndDisplayList()); + } else { + // Unpatching if conditions are not met + for (int i = 43; i <= 46; i++) { + std::string patchName = "adultNoMS." + std::to_string(1) + "." + std::to_string(i); + ResourceMgr_UnpatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, patchName.c_str()); + } + for (int i = 62; i <= 150; i++) { + std::string patchName = "adultNoMS." + std::to_string(2) + "." + std::to_string(i); + ResourceMgr_UnpatchGfxByName(gLinkAdultMirrorShieldSwordAndSheathNearDL, patchName.c_str()); + } + for (int i = 61; i <= 118; i++) { + std::string patchName = "adultNoMS." + std::to_string(3) + "." + std::to_string(i); + ResourceMgr_UnpatchGfxByName(gLinkAdultMirrorShieldSwordAndSheathFarDL, patchName.c_str()); + } + ResourceMgr_UnpatchGfxByName(gLinkAdultHylianShieldSwordAndSheathNearDL, "adultNoMSHylianShield1"); + ResourceMgr_UnpatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, "adultNoMSHylianShield2"); + ResourceMgr_UnpatchGfxByName(gLinkAdultMasterSwordAndSheathNearDL, "adultNoMasterSword1"); + ResourceMgr_UnpatchGfxByName(gLinkAdultMasterSwordAndSheathFarDL, "adultNoMasterSword2"); + } +} + +// copied from z_player (right above Player_StartMode_TimeTravel) +static Vec3f D_808546F4 = { -1.0f, 69.0f, 20.0f }; + +#define MASTER_SWORD_SHUFFLED (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) != 0) + +void RegisterNoMasterSword() { + // don't show link taking out master sword to put in pedestal when we don't have a master sword + COND_VB_SHOULD(VB_SHOW_MASTER_SWORD_TO_PLACE_IN_PEDESTAL, IS_RANDO && MASTER_SWORD_SHUFFLED, { + // if the vanilla condition is false respect it + if (!*should) { + return; + } + + if (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { + *should = false; + } + }); + + // skip post pedestal animation when we don't have a master sword + COND_VB_SHOULD(VB_EXECUTE_PLAYER_STARTMODE_FUNC, IS_RANDO && MASTER_SWORD_SHUFFLED, { + int32_t startMode = va_arg(args, int32_t); + Player* player = GET_PLAYER(gPlayState); + + if (startMode == PLAYER_START_MODE_TIME_TRAVEL && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { + // don't run the vanilla startMode func + *should = false; + + // position link correctly + Math_Vec3f_Copy(&player->actor.world.pos, &D_808546F4); + player->yaw = player->actor.shape.rot.y = -0x8000; + + // execute the idle startMode func + Player_StartMode_Idle(gPlayState, player); + } + }); + + COND_HOOK(OnPlayerUpdate, IS_RANDO, []{ + static uint16_t lastItemOnB = gSaveContext.equips.buttonItems[0]; + if (lastItemOnB != gSaveContext.equips.buttonItems[0]) { + UpdateNoMSPatch(); + lastItemOnB = gSaveContext.equips.buttonItems[0]; + } + }); + + COND_HOOK(OnSceneSpawnActors, IS_RANDO, UpdateNoMSPatch); +} + +static RegisterShipInitFunc initFunc(RegisterNoMasterSword, { "IS_RANDO" }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 56679f976..e1457db4a 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -402,6 +402,14 @@ typedef enum { // - `*Input` VB_EXECUTE_PLAYER_ACTION_FUNC, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (startMode) + VB_EXECUTE_PLAYER_STARTMODE_FUNC, + // #### `result` // ```c // true @@ -1647,6 +1655,14 @@ typedef enum { // - `*VBFishingData` VB_SHOULD_SET_FISHING_RECORD, + // #### `result` + // ```c + // (interactedActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT + // ``` + // #### `args` + // - None + VB_SHOW_MASTER_SWORD_TO_PLACE_IN_PEDESTAL, + // #### `result` // ```c // gSaveContext.showTitleCard 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 3db05d94e..d8475c75d 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -7381,7 +7381,7 @@ s32 Player_ActionHandler_2(Player* this, PlayState* play) { } if ((this->heldActor == NULL) || Player_HoldsHookshot(this)) { - if ((interactedActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT) { + if (GameInteractor_Should(VB_SHOW_MASTER_SWORD_TO_PLACE_IN_PEDESTAL, (interactedActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT)) { s32 sp24 = this->itemAction; this->itemAction = PLAYER_IA_NONE; @@ -10853,7 +10853,9 @@ void Player_Init(Actor* thisx, PlayState* play2) { } } - sStartModeFuncs[startMode](play, this); + if (GameInteractor_Should(VB_EXECUTE_PLAYER_STARTMODE_FUNC, true, startMode)) { + sStartModeFuncs[startMode](play, this); + } if (startMode != PLAYER_START_MODE_NOTHING) { if ((gSaveContext.gameMode == 0) || (gSaveContext.gameMode == 3)) { From 126c3b532fccd5be62094614fb80ea5c274dd788 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:21:43 -0500 Subject: [PATCH 036/267] fix loop order + reorder case for clarity (#5044) --- .../Enhancements/randomizer/hook_handlers.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index e323e810a..a9e1947fd 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1467,6 +1467,18 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } + case VB_HAVE_OCARINA_NOTE_A4: { + if (!Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT)) { + *should = false; + } + break; + } + case VB_HAVE_OCARINA_NOTE_B4: { + if (!Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT)) { + *should = false; + } + break; + } case VB_HAVE_OCARINA_NOTE_D4: { if (!Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A)) { *should = false; @@ -1485,21 +1497,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } - case VB_HAVE_OCARINA_NOTE_B4: { - if (!Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT)) { - *should = false; - } - break; - } - case VB_HAVE_OCARINA_NOTE_A4: { - if (!Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT)) { - *should = false; - } - break; - } case VB_SKIP_SCARECROWS_SONG: { int ocarinaButtonCount = 0; - for (int i = VB_HAVE_OCARINA_NOTE_D4; i <= VB_HAVE_OCARINA_NOTE_A4; i++) { + for (int i = VB_HAVE_OCARINA_NOTE_A4; i <= VB_HAVE_OCARINA_NOTE_F4; i++) { if (GameInteractor_Should((GIVanillaBehavior)i, true)) { ocarinaButtonCount++; } From 499a23e9a3cef42e7630955bece51843398ae786 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:22:00 -0500 Subject: [PATCH 037/267] restore night lock + remove interior lock (#5048) --- soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp index 96bb9823c..33e264bd4 100644 --- a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -32,8 +32,8 @@ std::map lookupTable = { {{ 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_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 From 297a056dfff2cf7bd31693d21d691c63bc0cbd54 Mon Sep 17 00:00:00 2001 From: Miles Acquaviva Date: Wed, 12 Feb 2025 15:28:17 -0500 Subject: [PATCH 038/267] Created and implemented PosType enum (#5046) * Created and implemented PosType enum * fixed formatting --------- Co-authored-by: link5669 --- mods/custom_mod_files_go_here.txt | 0 .../cosmetics/CosmeticsEditor.cpp | 64 +- .../Enhancements/cosmetics/cosmeticsTypes.h | 9 + soh/src/code/z_actor.c | 65 +- soh/src/code/z_lifemeter.c | 113 +-- soh/src/code/z_map_exp.c | 91 +-- soh/src/code/z_map_mark.c | 25 +- soh/src/code/z_parameter.c | 703 +++++++++--------- .../actors/ovl_player_actor/z_player.c | 11 +- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 42 +- 10 files changed, 570 insertions(+), 553 deletions(-) create mode 100644 mods/custom_mod_files_go_here.txt diff --git a/mods/custom_mod_files_go_here.txt b/mods/custom_mod_files_go_here.txt new file mode 100644 index 000000000..e69de29bb diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index c07abd646..16fb2bed4 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -196,7 +196,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Link.Hair", "Hair", COSMETICS_GROUP_LINK, ColorRGBA8(255, 173, 27, 255), false, true, true), COSMETIC_OPTION("Link.Linen", "Linen", COSMETICS_GROUP_LINK, ColorRGBA8(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("Link.Boots", "Boots", COSMETICS_GROUP_LINK, ColorRGBA8( 93, 44, 18, 255), false, true, true), - + COSMETIC_OPTION("MirrorShield.Body", "Body", COSMETICS_GROUP_MIRRORSHIELD, ColorRGBA8(215, 0, 0, 255), false, true, false), COSMETIC_OPTION("MirrorShield.Mirror", "Mirror", COSMETICS_GROUP_MIRRORSHIELD, ColorRGBA8(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("MirrorShield.Emblem", "Emblem", COSMETICS_GROUP_MIRRORSHIELD, ColorRGBA8(205, 225, 255, 255), false, true, true), @@ -214,7 +214,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Gloves.SilverGauntlets", "Silver Gauntlets", COSMETICS_GROUP_GLOVES, ColorRGBA8(255, 255, 255, 255), false, true, false), COSMETIC_OPTION("Gloves.GoldenGauntlets", "Golden Gauntlets", COSMETICS_GROUP_GLOVES, ColorRGBA8(254, 207, 15, 255), false, true, false), COSMETIC_OPTION("Gloves.GauntletsGem", "Gauntlets Gem", COSMETICS_GROUP_GLOVES, ColorRGBA8(255, 60, 100, 255), false, true, true), - + COSMETIC_OPTION("Equipment.BoomerangBody", "Boomerang Body", COSMETICS_GROUP_EQUIPMENT, ColorRGBA8(160, 100, 0, 255), false, true, false), COSMETIC_OPTION("Equipment.BoomerangGem", "Boomerang Gem", COSMETICS_GROUP_EQUIPMENT, ColorRGBA8(255, 50, 150, 255), false, true, true), /* Todo (Cosmetics): Broken, need a better way to grayscale @@ -288,7 +288,7 @@ static std::map cosmeticOptions = { //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), @@ -329,7 +329,7 @@ static std::map cosmeticOptions = { MESSAGE_COSMETIC_OPTION("Yellow.Wooden", "Message Yellow (Wooden) Color", 255, 255, 30), MESSAGE_COSMETIC_OPTION("Black", "Message Black Color", 0, 0, 0), - #undef MESSAGE_COSMETIC_OPTION +#undef MESSAGE_COSMETIC_OPTION 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), @@ -345,7 +345,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Kaleido.MapSelDunB", "Map Dungeon Color B", COSMETICS_GROUP_KALEIDO, ColorRGBA8(140, 60, 60, 255), false, true, true), 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, 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), @@ -355,14 +355,14 @@ static std::map cosmeticOptions = { 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, 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, 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), COSMETIC_OPTION("Title.N64LogoRed", "N64 Red", COSMETICS_GROUP_TITLE, ColorRGBA8(150, 0, 0, 255), false, true, true), @@ -375,7 +375,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Title.FireSecondary", "Title Fire Secondary", COSMETICS_GROUP_TITLE, ColorRGBA8(255, 100, 0, 255), false, true, true), */ COSMETIC_OPTION("Title.Copyright", "Copyright Text", COSMETICS_GROUP_TITLE, ColorRGBA8(255, 255, 255, 255), true, true, false), - + COSMETIC_OPTION("Arrows.NormalPrimary", "Normal Primary", COSMETICS_GROUP_ARROWS, ColorRGBA8( 0, 150, 0, 0), false, true, false), COSMETIC_OPTION("Arrows.NormalSecondary", "Normal Secondary", COSMETICS_GROUP_ARROWS, ColorRGBA8(255, 255, 170, 255), false, true, true), COSMETIC_OPTION("Arrows.FirePrimary", "Fire Primary", COSMETICS_GROUP_ARROWS, ColorRGBA8(255, 200, 0, 0), false, true, false), @@ -384,14 +384,14 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Arrows.IceSecondary", "Ice Secondary", COSMETICS_GROUP_ARROWS, ColorRGBA8(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("Arrows.LightPrimary", "Light Primary", COSMETICS_GROUP_ARROWS, ColorRGBA8(255, 255, 0, 255), false, true, false), COSMETIC_OPTION("Arrows.LightSecondary", "Light Secondary", COSMETICS_GROUP_ARROWS, ColorRGBA8(255, 255, 170, 0), false, true, true), - + COSMETIC_OPTION("Magic.DinsPrimary", "Din's Primary", COSMETICS_GROUP_MAGIC, ColorRGBA8(255, 200, 0, 255), false, true, false), COSMETIC_OPTION("Magic.DinsSecondary", "Din's Secondary", COSMETICS_GROUP_MAGIC, ColorRGBA8(255, 0, 0, 255), false, true, true), COSMETIC_OPTION("Magic.FaroresPrimary", "Farore's Primary", COSMETICS_GROUP_MAGIC, ColorRGBA8(255, 255, 0, 255), false, true, false), COSMETIC_OPTION("Magic.FaroresSecondary", "Farore's Secondary", COSMETICS_GROUP_MAGIC, ColorRGBA8(100, 200, 0, 255), false, true, true), COSMETIC_OPTION("Magic.NayrusPrimary", "Nayru's Primary", COSMETICS_GROUP_MAGIC, ColorRGBA8(170, 255, 255, 255), false, true, false), COSMETIC_OPTION("Magic.NayrusSecondary", "Nayru's Secondary", COSMETICS_GROUP_MAGIC, ColorRGBA8( 0, 100, 255, 255), false, true, true), - + COSMETIC_OPTION("SpinAttack.Level1Primary", "Level 1 Primary", COSMETICS_GROUP_SPIN_ATTACK, ColorRGBA8(170, 255, 255, 255), false, true, true), COSMETIC_OPTION("SpinAttack.Level1Secondary", "Level 1 Secondary", COSMETICS_GROUP_SPIN_ATTACK, ColorRGBA8( 0, 100, 255, 255), false, true, false), COSMETIC_OPTION("SpinAttack.Level2Primary", "Level 2 Primary", COSMETICS_GROUP_SPIN_ATTACK, ColorRGBA8(255, 255, 170, 255), false, true, true), @@ -419,7 +419,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("Navi.EnemySecondary", "Enemy Secondary", COSMETICS_GROUP_NAVI, ColorRGBA8(200, 155, 0, 0), false, true, true), COSMETIC_OPTION("Navi.PropsPrimary", "Props Primary", COSMETICS_GROUP_NAVI, ColorRGBA8( 0, 255, 0, 255), false, true, false), COSMETIC_OPTION("Navi.PropsSecondary", "Props Secondary", COSMETICS_GROUP_NAVI, ColorRGBA8( 0, 255, 0, 0), false, true, true), - + COSMETIC_OPTION("Ivan.IdlePrimary", "Ivan Idle Primary", COSMETICS_GROUP_IVAN, ColorRGBA8(255, 255, 255, 255), false, true, false), COSMETIC_OPTION("Ivan.IdleSecondary", "Ivan Idle Secondary", COSMETICS_GROUP_IVAN, ColorRGBA8( 0, 255, 0, 255), false, true, true), @@ -493,11 +493,11 @@ void SetMarginAll(const char* ButtonName, bool SetActivated) { for (auto cvarName : MarginCvarList) { std::string cvarPosType = std::string(cvarName).append(".PosType"); std::string cvarNameMargins = std::string(cvarName).append(".UseMargins"); - if (CVarGetInteger(cvarPosType.c_str(),0) <= 2 && SetActivated) { //Our element is not Hidden or Non anchor + if (CVarGetInteger(cvarPosType.c_str(),0) <= ANCHOR_RIGHT && SetActivated) { //Our element is not Hidden or Non anchor for (int i = 0; i < arrayLengthNonMargin; i++) { - if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) == 0)) { //Our element is both in original position and do not have anchor by default so we skip it. + if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) == ORIGINAL_LOCATION)) { //Our element is both in original position and do not have anchor by default so we skip it. CVarSetInteger(cvarNameMargins.c_str(), false); //force set off - } else if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) != 0)) { //Our element is not in original position regarless it has no anchor by default since player made it anchored we can toggle margins + } else if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) != ORIGINAL_LOCATION)) { //Our element is not in original position regarless it has no anchor by default since player made it anchored we can toggle margins CVarSetInteger(cvarNameMargins.c_str(), SetActivated); } else if (strcmp(cvarName, MarginCvarNonAnchor[i]) != 0) { //Our elements has an anchor by default so regarless of it's position right now that okay to toggle margins. CVarSetInteger(cvarNameMargins.c_str(), SetActivated); @@ -548,7 +548,7 @@ void CosmeticsUpdateTick() { CVarSetColor(cosmeticOption.cvar, newColor); } // If we don't want the rainbow color on items to be synced, offset the index for each item in the loop. - // Technically this would work if you replaced "60" with 1 but the hue would be so close it's + // Technically this would work if you replaced "60" with 1 but the hue would be so close it's // indistinguishable, 60 gives us a big enough gap to notice the difference. if (!CVarGetInteger(CVAR_COSMETIC("RainbowSync"), 0)) { index += static_cast(60 * rainbowSpeed); @@ -561,7 +561,7 @@ void CosmeticsUpdateTick() { } } -/* +/* This is called every time a color is changed in the UI, and every frame to update colors that have rainbow mode enabled The columns/arguments for PATCH_GFX are as follows: 1. Display List: This should be a valid display list pointer, if you have errors listing one here make sure to include the appropriate header file up top @@ -577,7 +577,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { PATCH_GFX(sInnerCylinderDL, "Magic_FaroresPrimary1", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(sOuterCylinderDL, "Magic_FaroresPrimary2", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } - + static CosmeticOption& magicFaroresSecondary = cosmeticOptions.at("Magic.FaroresSecondary"); if (manualChange || CVarGetInteger(magicFaroresSecondary.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(magicFaroresSecondary.cvar, magicFaroresSecondary.defaultColor); @@ -610,7 +610,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair2", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair3", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair4", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - + if (manualChange) { PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair5", linkHair.changedCvar, 46, gsSPGrayscale(true)); PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair6", linkHair.changedCvar, 54, gsSPGrayscale(false)); @@ -873,7 +873,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt10", swordsBiggoronHilt.changedCvar, 38, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt11", swordsBiggoronHilt.changedCvar, 118, gsSPGrayscale(false)); } - } + } */ static CosmeticOption& glovesGoronBracelet = cosmeticOptions.at("Gloves.GoronBracelet"); if (manualChange || CVarGetInteger(glovesGoronBracelet.rainbowCvar, 0)) { @@ -1015,7 +1015,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHandle5", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHandle6", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } - + static CosmeticOption& equipmentHookshotChain = cosmeticOptions.at("Equipment.HookshotChain"); if (manualChange || CVarGetInteger(equipmentHookshotChain.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentHookshotChain.cvar, equipmentHookshotChain.defaultColor); @@ -1070,7 +1070,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee2", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee3", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee4", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); - + // Greg Bridge if (Randomizer_GetSettingValue(RSK_RAINBOW_BRIDGE) == RO_BRIDGE_GREG) { ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_StartGrayscale", 2, gsSPGrayscale(true)); @@ -1215,8 +1215,8 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { extern "C" Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id) { return Color_RGBA8 { (uint8_t)(cosmeticOptions[id].defaultColor.r * 255.0f), - (uint8_t)(cosmeticOptions[id].defaultColor.g * 255.0f), - (uint8_t)(cosmeticOptions[id].defaultColor.b * 255.0f), + (uint8_t)(cosmeticOptions[id].defaultColor.g * 255.0f), + (uint8_t)(cosmeticOptions[id].defaultColor.b * 255.0f), (uint8_t)(cosmeticOptions[id].defaultColor.a * 255.0f) }; } @@ -1380,9 +1380,9 @@ void Draw_Placements(){ DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.VisualSoA")); s16 Min_X_VSOA = 0; s16 Max_X_VSOA = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - if(CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 2){ + if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_RIGHT){ Max_X_VSOA = 290; - } else if(CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 4){ + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == HIDDEN){ Min_X_VSOA = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } DrawPositionSlider(CVAR_COSMETIC("HUD.VisualSoA"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_VSOA, Max_X_VSOA); @@ -1406,9 +1406,9 @@ void Draw_Placements(){ DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.Dpad")); s16 Min_X_Dpad = 0; s16 Max_X_Dpad = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - if(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 2){ + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_RIGHT) { Max_X_Dpad = 290; - } else if(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 4){ + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == HIDDEN) { Min_X_Dpad = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } DrawPositionSlider(CVAR_COSMETIC("HUD.Dpad"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_Dpad, Max_X_Dpad); @@ -1486,7 +1486,7 @@ void DrawSillyTab() { UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); if (UIWidgets::EnhancementCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"))) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + 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."); @@ -1873,7 +1873,7 @@ void CosmeticsEditorWindow::ApplyDungeonKeyColors() { 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); @@ -1885,7 +1885,7 @@ void CosmeticsEditorWindow::ApplyDungeonKeyColors() { 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); @@ -1958,7 +1958,7 @@ void CosmeticsEditorWindow::DrawElement() { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - + if (ImGui::Button("Rainbow All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if ( diff --git a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h index 14f06552d..7fc454117 100644 --- a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h +++ b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h @@ -8,3 +8,12 @@ typedef enum { ENEMYHEALTH_ANCHOR_TOP, ENEMYHEALTH_ANCHOR_BOTTOM, } EnemyHealthBarAnchorType; + +typedef enum { + ORIGINAL_LOCATION, + ANCHOR_LEFT, + ANCHOR_RIGHT, + ANCHOR_NONE, + HIDDEN, + ANCHOR_TO_LIFE_METER +} PosType; diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 5a5dc328e..6d5f9b3b6 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -8,6 +8,7 @@ #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "objects/object_bdoor/object_bdoor.h" #include "soh/frame_interpolation.h" +#include "soh/Enhancements/cosmetics/cosmeticsTypes.h" #include "soh/Enhancements/enemyrandomizer.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" @@ -365,7 +366,7 @@ void func_8002BF60(TargetContext* targetCtx, Actor* actor, s32 actorCategory, Pl } else { sNaviColorList[ACTORCAT_PLAYER].outer = defaultIdleSecondaryColor; } - + if (CVarGetInteger(CVAR_COSMETIC("Navi.NPCPrimary.Changed"), 0)) { sNaviColorList[ACTORCAT_NPC].inner = CVarGetColor(CVAR_COSMETIC("Navi.NPCPrimary.Value"), defaultNPCPrimaryColor); } else { @@ -625,7 +626,7 @@ void func_8002C7BC(TargetContext* targetCtx, Player* player, Actor* actorArg, Pl } lockOnSfxId = CHECK_FLAG_ALL(actorArg->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE) ? NA_SE_SY_LOCK_ON - : NA_SE_SY_LOCK_ON_HUMAN; + : NA_SE_SY_LOCK_ON_HUMAN; Sfx_PlaySfxCentered(lockOnSfxId); } @@ -834,7 +835,7 @@ void func_8002CDE4(PlayState* play, TitleCardContext* titleCtx) { void TitleCard_InitBossName(PlayState* play, TitleCardContext* titleCtx, void* texture, s16 x, s16 y, u8 width, u8 height, s16 hasTranslation) { static char newName[512]; - + if (gSaveContext.language != LANGUAGE_ENG) { size_t length = strlen(texture); strcpy(newName, texture); @@ -864,7 +865,7 @@ void TitleCard_InitBossName(PlayState* play, TitleCardContext* titleCtx, void* t void TitleCard_InitPlaceName(PlayState* play, TitleCardContext* titleCtx, void* texture, s32 x, s32 y, s32 width, s32 height, s32 delay) { SceneTableEntry* loadedScene = play->loadedScene; - // size_t size = loadedScene->titleFile.vromEnd - loadedScene->titleFile.vromStart; + // size_t size = loadedScene->titleFile.vromEnd - loadedScene->titleFile.vromStart; switch (play->sceneNum) { case SCENE_DEKU_TREE: texture = gDekuTreeTitleCardENGTex; @@ -1093,7 +1094,7 @@ void TitleCard_Update(PlayState* play, TitleCardContext* titleCtx) { if (titleCtx->durationTimer == 80) { GameInteractor_ExecuteOnPresentTitleCard(); } - + if (DECR(titleCtx->durationTimer) == 0) { Math_StepToS(&titleCtx->alpha, 0, 30); Math_StepToS(&titleCtx->intensityR, 0, 70); @@ -1127,15 +1128,15 @@ void TitleCard_Draw(PlayState* play, TitleCardContext* titleCtx) { s16 TitleCard_PosY = titleCtx->y; if (TitleCard_PosType_Checker != 0) { TitleCard_PosY = TitleCard_PosY_Modifier; - if (TitleCard_PosType_Checker == 1) {//Anchor Left - if (TitleCard_Margin_Checker != 0) {TitleCard_MarginX = CVarGetInteger(CVAR_COSMETIC("HUD.Margin.L"), 0)*-1;}; - TitleCard_PosX = OTRGetDimensionFromLeftEdge(TitleCard_PosX_Modifier+TitleCard_MarginX)-11; - } else if (TitleCard_PosType_Checker == 2) {//Anchor Right + if (TitleCard_PosType_Checker == ANCHOR_LEFT) { + if (TitleCard_Margin_Checker != 0) {TitleCard_MarginX = CVarGetInteger(CVAR_COSMETIC("HUD.Margin.L"), 0) * -1;}; + TitleCard_PosX = OTRGetDimensionFromLeftEdge(TitleCard_PosX_Modifier + TitleCard_MarginX) - 11; + } else if (TitleCard_PosType_Checker == ANCHOR_RIGHT) { if (TitleCard_Margin_Checker != 0) {TitleCard_MarginX = CVarGetInteger(CVAR_COSMETIC("HUD.Margin.R"), 0);}; - TitleCard_PosX = OTRGetDimensionFromRightEdge(TitleCard_PosX_Modifier+TitleCard_MarginX); - } else if (TitleCard_PosType_Checker == 3) {//Anchor None + TitleCard_PosX = OTRGetDimensionFromRightEdge(TitleCard_PosX_Modifier + TitleCard_MarginX); + } else if (TitleCard_PosType_Checker == ANCHOR_NONE) { TitleCard_PosX = TitleCard_PosX_Modifier; - } else if (TitleCard_PosType_Checker == 4) {//Hidden + } else if (TitleCard_PosType_Checker == HIDDEN) { TitleCard_PosX = -9999; } } @@ -1156,7 +1157,7 @@ void TitleCard_Draw(PlayState* play, TitleCardContext* titleCtx) { width, height, 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); gSPWideTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4), - G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); height = titleCtx->height - height; @@ -1987,7 +1988,7 @@ u32 Actor_HasParent(Actor* actor, PlayState* play) { * Uses the given `GetItemEntry` to prepare the player to receive an item via the animation * where Link holds an item over his head. This function does not require an actor for giving * the player an item, instead setting the player as their own interactRangeActor and getItemDirection. - * + * * \param play the Global Context * \param getItemEntry the GetItemEntry for the item you want the player to receive. * \return true if the player can receive an item, false if not. @@ -1995,12 +1996,12 @@ u32 Actor_HasParent(Actor* actor, PlayState* play) { s32 GiveItemEntryWithoutActor(PlayState* play, GetItemEntry getItemEntry) { Player* player = GET_PLAYER(play); - if (!(player->stateFlags1 & + if (!(player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER)) && - Player_GetExplosiveHeld(player) < 0) { - if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) || - (IS_RANDO && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) || + Player_GetExplosiveHeld(player) < 0) { + if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) || + (IS_RANDO && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) || (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { if ((getItemEntry.getItemId != GI_NONE)) { player->getItemEntry = getItemEntry; @@ -2034,14 +2035,14 @@ s32 GiveItemEntryWithoutActor(PlayState* play, GetItemEntry getItemEntry) { s32 GiveItemEntryFromActor(Actor* actor, PlayState* play, GetItemEntry getItemEntry, f32 xzRange, f32 yRange) { Player* player = GET_PLAYER(play); - if (!(player->stateFlags1 & + if (!(player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER)) && - Player_GetExplosiveHeld(player) < 0) { - if ((((player->heldActor != NULL) || (actor == player->talkActor)) && - ((!IS_RANDO && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || - (IS_RANDO && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || - (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { + Player_GetExplosiveHeld(player) < 0) { + if ((((player->heldActor != NULL) || (actor == player->talkActor)) && + ((!IS_RANDO && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || + (IS_RANDO && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || + (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; s32 absYawDiff = ABS(yawDiff); @@ -2078,11 +2079,11 @@ s32 GiveItemEntryFromActorWithFixedRange(Actor* actor, PlayState* play, GetItemE s32 Actor_OfferGetItem(Actor* actor, PlayState* play, s32 getItemId, f32 xzRange, f32 yRange) { Player* player = GET_PLAYER(play); - if (!(player->stateFlags1 & + if (!(player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER)) && - Player_GetExplosiveHeld(player) < 0) { - if ((((player->heldActor != NULL) || (actor == player->talkActor)) && + Player_GetExplosiveHeld(player) < 0) { + if ((((player->heldActor != NULL) || (actor == player->talkActor)) && ((!IS_RANDO && ((getItemId > GI_NONE) && (getItemId < GI_MAX))) || (IS_RANDO && ((getItemId > RG_NONE) && (getItemId < RG_MAX))))) || (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { @@ -2153,7 +2154,7 @@ s32 Actor_IsMounted(PlayState* play, Actor* horse) { u32 Actor_SetRideActor(PlayState* play, Actor* horse, s32 mountSide) { Player* player = GET_PLAYER(play); - if (!(player->stateFlags1 & + if (!(player->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER))) { player->rideActor = horse; @@ -2203,7 +2204,7 @@ void Player_PlaySfx(Actor* actor, u16 sfxId) { Audio_PlaySoundGeneral(sfxId, &actor->projectedPos, 4, &gSfxDefaultFreqAndVolScale , &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } else { freqMultiplier = CVarGetFloat(CVAR_AUDIO("LinkVoiceFreqMultiplier"), 1.0); - if (freqMultiplier <= 0) { + if (freqMultiplier <= 0) { freqMultiplier = 1; } // Authentic behavior uses D_801333E0 for both freqScale and a4 @@ -2802,7 +2803,7 @@ void Actor_DrawLensOverlay(GraphicsContext* gfxCtx) { gSPWideTextureRectangle(POLY_XLU_DISP++, 0, 0, w, SCREEN_HEIGHT << 2, G_TX_RENDERTILE, LENS_MASK_OFFSET_S << 5, LENS_MASK_OFFSET_T << 5, (1 << 10) * (SCREEN_WIDTH - 2 * LENS_MASK_OFFSET_S) / SCREEN_WIDTH, - (1 << 10) * (SCREEN_HEIGHT - 2 * LENS_MASK_OFFSET_T) / SCREEN_HEIGHT); + (1 << 10) * (SCREEN_HEIGHT - 2 * LENS_MASK_OFFSET_T) / SCREEN_HEIGHT); gDPPipeSync(POLY_XLU_DISP++); CLOSE_DISPS(gfxCtx); } @@ -3422,7 +3423,7 @@ void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) { Actor* Actor_SpawnEntry(ActorContext* actorCtx, ActorEntry* actorEntry, PlayState* play) { gMapLoading = 1; Actor* ret = Actor_Spawn(actorCtx, play, actorEntry->id, actorEntry->pos.x, actorEntry->pos.y, actorEntry->pos.z, - actorEntry->rot.x, actorEntry->rot.y, actorEntry->rot.z, actorEntry->params, true); + actorEntry->rot.x, actorEntry->rot.y, actorEntry->rot.z, actorEntry->params, true); gMapLoading = 0; return ret; @@ -4803,7 +4804,7 @@ Actor* func_800358DC(Actor* actor, Vec3f* spawnPos, Vec3s* spawnRot, f32* arg3, spawnedEnPart = (EnPart*)Actor_SpawnAsChild(&play->actorCtx, actor, play, ACTOR_EN_PART, spawnPos->x, spawnPos->y, - spawnPos->z, spawnRot->x, spawnRot->y, actor->objBankIndex, params); + spawnPos->z, spawnRot->x, spawnRot->y, actor->objBankIndex, params); if (spawnedEnPart != NULL) { spawnedEnPart->actor.scale = actor->scale; spawnedEnPart->actor.speedXZ = arg3[0]; diff --git a/soh/src/code/z_lifemeter.c b/soh/src/code/z_lifemeter.c index 5f09e6b3f..726e8d44d 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/cosmetics/cosmeticsTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" s16 Top_LM_Margin = 0; @@ -343,15 +344,17 @@ s16 getHealthMeterXOffset() { else X_Margins = 0; - if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 1) {//Anchor Left - return OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins+70.0f); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 2) {//Anchor Right + if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != ORIGINAL_LOCATION) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == ANCHOR_LEFT) { + return OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins + + 70.0f); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == ANCHOR_RIGHT) { X_Margins = Right_LM_Margin; - return OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins+70.0f); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 3) {//Anchor None - return CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+70.0f;; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 4) {//Hidden + return OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins + + 70.0f); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == ANCHOR_NONE) { + return CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0) + 70.0f; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == HIDDEN) { return -9999; } } else { @@ -366,8 +369,8 @@ s16 getHealthMeterYOffset() { else Y_Margins = 0; - f32 HeartsScale = 0.7f; - if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != 0) { + f32 HeartsScale = 0.7f; + if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != ORIGINAL_LOCATION) { HeartsScale = CVarGetFloat(CVAR_COSMETIC("HUD.HeartsCount.Scale"), 0.7f); return CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosY"), 0)+Y_Margins+(HeartsScale*15); } else { @@ -398,8 +401,8 @@ void HealthMeter_Draw(PlayState* play) { s32 curCombineModeSet = 0; u8* curBgImgLoaded = NULL; s32 ddHeartCountMinusOne = gSaveContext.isDoubleDefenseAcquired ? totalHeartCount - 1 : -1; - f32 HeartsScale = 0.7f; - if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != 0) { + f32 HeartsScale = 0.7f; + if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != ORIGINAL_LOCATION) { HeartsScale = CVarGetFloat(CVAR_COSMETIC("HUD.HeartsCount.Scale"), 0.7f); } static u32 epoch = 0; @@ -412,41 +415,41 @@ void HealthMeter_Draw(PlayState* play) { } curColorSet = -1; -/* - s16 X_Margins; - s16 Y_Margins; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Hearts.UseMargins"), 0) != 0) { - X_Margins = Left_LM_Margin; - Y_Margins = (Top_LM_Margin*-1); - } else { - X_Margins = 0; - Y_Margins = 0; - } - s16 PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins; - s16 PosY_original = 0.0f+Y_Margins; - if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != 0) { - offsetY = CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosY"), 0)+Y_Margins+(HeartsScale*15); - if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 1) {//Anchor Left - offsetX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins+70.0f); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 2) {//Anchor Right - X_Margins = Right_LM_Margin; - offsetX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins+70.0f); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 3) {//Anchor None - offsetX = CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+70.0f; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == 4) {//Hidden - offsetX = -9999; + /* + s16 X_Margins; + s16 Y_Margins; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Hearts.UseMargins"), 0) != 0) { + X_Margins = Left_LM_Margin; + Y_Margins = (Top_LM_Margin*-1); + } else { + X_Margins = 0; + Y_Margins = 0; } - } else { - offsetY = PosY_original; - offsetX = PosX_original; - } -*/ + s16 PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins; + s16 PosY_original = 0.0f+Y_Margins; + if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) != ORIGINAL_LOCATION) { + offsetY = CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosY"), 0)+Y_Margins+(HeartsScale*15); + if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == ANCHOR_LEFT) { + offsetX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins+70.0f); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == ANCHOR_RIGHT) { + X_Margins = Right_LM_Margin; + offsetX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+X_Margins+70.0f); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == ANCHOR_NONE) { + offsetX = CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosX"), 0)+70.0f; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.HeartsCount.PosType"), 0) == HIDDEN) { + offsetX = -9999; + } + } else { + offsetY = PosY_original; + offsetX = PosX_original; + } + */ offsetX = PosX_anchor = getHealthMeterXOffset(); offsetY = getHealthMeterYOffset(); for (i = 0; i < totalHeartCount; i++) { FrameInterpolation_RecordOpenChild("HealthMeter Heart", i); - + if ((ddHeartCountMinusOne < 0) || (i > ddHeartCountMinusOne)) { if (i < fullHeartCount) { if (curColorSet != 0) { @@ -574,7 +577,7 @@ void HealthMeter_Draw(PlayState* play) { (s32)((temp2 + temp1) * 4), (s32)((temp3 + temp1) * 4), G_TX_RENDERTILE, 0, 0, (s32)temp4, (s32)temp4);*/ Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); - Matrix_SetTranslateScaleMtx2(matrix, + Matrix_SetTranslateScaleMtx2(matrix, HeartsScale, //Scale X HeartsScale, //Scale Y HeartsScale, //Scale Z @@ -603,22 +606,22 @@ void HealthMeter_Draw(PlayState* play) { { Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); - + if (CVarGetInteger(CVAR_ENHANCEMENT("NoHUDHeartAnimation"), 0)) { Matrix_SetTranslateScaleMtx2(matrix, - HeartsScale, // Scale X - HeartsScale, // Scale Y - HeartsScale, // Scale Z - -130 + offsetX, // Pos X - (-94 + offsetY) * -1, // Pos Y - 0.0f); + HeartsScale, // Scale X + HeartsScale, // Scale Y + HeartsScale, // Scale Z + -130 + offsetX, // Pos X + (-94 + offsetY) * -1, // Pos Y + 0.0f); } else { Matrix_SetTranslateScaleMtx2(matrix, HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), - HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), - HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), - -130 + offsetX, // Pos X - (-94 + offsetY) * -1, // Pos Y - 0.0f); + HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + -130 + offsetX, // Pos X + (-94 + offsetY) * -1, // Pos Y + 0.0f); } gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD); @@ -633,7 +636,7 @@ void HealthMeter_Draw(PlayState* play) { offsetX = PosX_anchor; offsetY += 10.0f; } - + FrameInterpolation_RecordCloseChild(); } diff --git a/soh/src/code/z_map_exp.c b/soh/src/code/z_map_exp.c index be358f075..49af7a654 100644 --- a/soh/src/code/z_map_exp.c +++ b/soh/src/code/z_map_exp.c @@ -6,6 +6,7 @@ #include "textures/map_grand_static/map_grand_static.h" #include #include "soh/OTRGlobals.h" +#include "soh/Enhancements/cosmetics/cosmeticsTypes.h" MapData* gMapData; @@ -414,7 +415,7 @@ void Map_InitData(PlayState* play, s16 room) { osSyncPrintf(VT_RST); sEntranceIconMapIndex = extendedMapIndex; //DmaMgr_SendRequest1(interfaceCtx->mapSegment, - //(uintptr_t)_map_grand_staticSegmentRomStart + gMapData->owMinimapTexOffset[extendedMapIndex], + //(uintptr_t)_map_grand_staticSegmentRomStart + gMapData->owMinimapTexOffset[extendedMapIndex], //gMapData->owMinimapTexSize[mapIndex], __FILE__, __LINE__); if (sEntranceIconMapIndex < 24) { @@ -448,8 +449,8 @@ void Map_InitData(PlayState* play, s16 room) { mapIndex, VREG(30)); osSyncPrintf(VT_RST); //DmaMgr_SendRequest1(play->interfaceCtx.mapSegment, - //(uintptr_t)_map_i_staticSegmentRomStart + - //((gMapData->dgnMinimapTexIndexOffset[mapIndex] + room) * 0xFF0), + //(uintptr_t)_map_i_staticSegmentRomStart + + //((gMapData->dgnMinimapTexIndexOffset[mapIndex] + room) * 0xFF0), //0xFF0, __FILE__, __LINE__); play->interfaceCtx.mapSegment[0] = ResourceGetDataByName( @@ -617,7 +618,7 @@ void Minimap_DrawCompassIcons(PlayState* play) { s16 X_Margins_Minimap; s16 Y_Margins_Minimap; if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 0) {X_Margins_Minimap = Right_MM_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_Minimap = Right_MM_Margin;}; Y_Margins_Minimap = Bottom_MM_Margin; } else { X_Margins_Minimap = 0; @@ -657,18 +658,18 @@ void Minimap_DrawCompassIcons(PlayState* play) { tempZ /= R_COMPASS_SCALE_Y; s16 tempXOffset = R_COMPASS_OFFSET_X + (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? mirrorOffset : 0); - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromLeftEdge((tempXOffset + (X_Margins_Minimap*10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10)) / 10.0f), + OTRGetDimensionFromLeftEdge((tempXOffset + (X_Margins_Minimap*10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10)) /10.0f), (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; Matrix_Translate( OTRGetDimensionFromRightEdge((tempXOffset + (X_Margins_Minimap*10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10)) / 10.0f), (R_COMPASS_OFFSET_Y +((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { Matrix_Translate( (tempXOffset + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10) / 10.0f), (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); @@ -691,18 +692,18 @@ void Minimap_DrawCompassIcons(PlayState* play) { tempZ = sPlayerInitialPosZ; tempX /= R_COMPASS_SCALE_X * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? -1 : 1); tempZ /= R_COMPASS_SCALE_Y; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromLeftEdge((tempXOffset + (X_Margins_Minimap*10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10)) / 10.0f), - (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) {//Anchor Right + OTRGetDimensionFromLeftEdge((tempXOffset + (X_Margins_Minimap * 10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0) * 10)) / 10.0f), + (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0) * 10) * -1)) /10.0f, 0.0f, MTXMODE_NEW); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromRightEdge((tempXOffset + (X_Margins_Minimap*10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10)) / 10.0f), - (R_COMPASS_OFFSET_Y +((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) {//Anchor None + OTRGetDimensionFromRightEdge((tempXOffset + (X_Margins_Minimap*10) + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0) * 10)) / 10.0f), + (R_COMPASS_OFFSET_Y +((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0) * 10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { Matrix_Translate( (tempXOffset + tempX + (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)*10) / 10.0f), (R_COMPASS_OFFSET_Y - tempZ + ((CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); @@ -744,7 +745,7 @@ void Minimap_Draw(PlayState* play) { s16 X_Margins_Minimap; s16 Y_Margins_Minimap; if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 0) {X_Margins_Minimap = Right_MM_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_Minimap = Right_MM_Margin;}; Y_Margins_Minimap = Bottom_MM_Margin; } else { X_Margins_Minimap = 0; @@ -762,7 +763,7 @@ void Minimap_Draw(PlayState* play) { case SCENE_SHADOW_TEMPLE: case SCENE_BOTTOM_OF_THE_WELL: case SCENE_ICE_CAVERN: - if (!R_MINIMAP_DISABLED && CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 4) { // Not Hidden + if (!R_MINIMAP_DISABLED && CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != HIDDEN) { Gfx_SetupDL_39Overlay(play->state.gfxCtx); gDPSetCombineLERP(OVERLAY_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0); @@ -777,15 +778,15 @@ void Minimap_Draw(PlayState* play) { s16 dgnMiniMapX = OTRGetRectDimensionFromRightEdge(R_DGN_MINIMAP_X + X_Margins_Minimap); s16 dgnMiniMapY = R_DGN_MINIMAP_Y + Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { - dgnMiniMapY = R_DGN_MINIMAP_Y+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)+Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { + dgnMiniMapY = R_DGN_MINIMAP_Y + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)+Y_Margins_Minimap; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; - dgnMiniMapX = OTRGetDimensionFromLeftEdge(R_DGN_MINIMAP_X+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+X_Margins_Minimap); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) {//Anchor Right + dgnMiniMapX = OTRGetDimensionFromLeftEdge(R_DGN_MINIMAP_X + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+X_Margins_Minimap); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; - dgnMiniMapX = OTRGetDimensionFromRightEdge(R_DGN_MINIMAP_X+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+X_Margins_Minimap); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) {//Anchor None + dgnMiniMapX = OTRGetDimensionFromRightEdge(R_DGN_MINIMAP_X + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0) +X_Margins_Minimap); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { dgnMiniMapX = CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0); } } @@ -797,8 +798,8 @@ void Minimap_Draw(PlayState* play) { } gSPWideTextureRectangle(OVERLAY_DISP++, dgnMiniMapX << 2, dgnMiniMapY << 2, - (dgnMiniMapX + 96) << 2, (dgnMiniMapY + 85) << 2, G_TX_RENDERTILE, - sValue, 0, 1 << 10, 1 << 10); + (dgnMiniMapX + 96) << 2, (dgnMiniMapY + 85) << 2, G_TX_RENDERTILE, + sValue, 0, 1 << 10, 1 << 10); } if (CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, mapIndex)) { @@ -854,15 +855,15 @@ void Minimap_Draw(PlayState* play) { s16 oWMiniMapX = OTRGetRectDimensionFromRightEdge(R_OW_MINIMAP_X + X_Margins_Minimap); s16 oWMiniMapY = R_OW_MINIMAP_Y + Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { oWMiniMapY = R_OW_MINIMAP_Y+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)+Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; oWMiniMapX = OTRGetDimensionFromLeftEdge(R_OW_MINIMAP_X+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+X_Margins_Minimap); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; - oWMiniMapX = OTRGetDimensionFromRightEdge(R_OW_MINIMAP_X+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+X_Margins_Minimap); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) {//Anchor None + oWMiniMapX = OTRGetDimensionFromRightEdge(R_OW_MINIMAP_X + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0) +X_Margins_Minimap); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { oWMiniMapX = CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0); } } @@ -874,7 +875,7 @@ void Minimap_Draw(PlayState* play) { } gSPWideTextureRectangle(OVERLAY_DISP++, oWMiniMapX << 2, oWMiniMapY << 2, - (oWMiniMapX + gMapData->owMinimapWidth[mapIndex]) << 2, + (oWMiniMapX + gMapData->owMinimapWidth[mapIndex]) << 2, (oWMiniMapY + gMapData->owMinimapHeight[mapIndex]) << 2, G_TX_RENDERTILE, sValue, 0, 1 << 10, 1 << 10); @@ -902,15 +903,15 @@ void Minimap_Draw(PlayState* play) { s16 entranceX = OTRGetRectDimensionFromRightEdge(newX + X_Margins_Minimap); s16 entranceY = newY + Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { entranceY = newY + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0) + Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) { // Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; entranceX = OTRGetRectDimensionFromLeftEdge(newX + X_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) { // Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; entranceX = OTRGetRectDimensionFromRightEdge(newX + X_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) { // Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { entranceX = newX + X_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0); } } @@ -925,8 +926,8 @@ void Minimap_Draw(PlayState* play) { //! @bug UB: sEntranceIconMapIndex can be up to 23 and is accessing owEntranceFlag which is size 20 if ((gMapData->owEntranceFlag[sEntranceIconMapIndex] == 0xFFFF) || ((gMapData->owEntranceFlag[sEntranceIconMapIndex] != 0xFFFF) && - ((gSaveContext.infTable[26] & gBitFlags[gMapData->owEntranceFlag[mapIndex]]) || - CVarGetInteger(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 0)))) { + ((gSaveContext.infTable[26] & gBitFlags[gMapData->owEntranceFlag[mapIndex]]) || + CVarGetInteger(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 0)))) { gDPLoadTextureBlock(OVERLAY_DISP++, gMapDungeonEntranceIconTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, iconSize, iconSize, 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); @@ -938,22 +939,22 @@ void Minimap_Draw(PlayState* play) { s16 origX = CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? 256 : 270; s16 entranceX = OTRGetRectDimensionFromRightEdge(origX + X_Margins_Minimap); s16 entranceY = 154 + Y_Margins_Minimap; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { entranceY = 154 + Y_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0); - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; entranceX = OTRGetRectDimensionFromLeftEdge(origX + X_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; entranceX = OTRGetRectDimensionFromRightEdge(origX + X_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { entranceX = origX + X_Margins_Minimap + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0); } } // Ice Cavern entrance icon if ((play->sceneNum == SCENE_ZORAS_FOUNTAIN) && ((gSaveContext.infTable[26] & gBitFlags[9]) || - CVarGetInteger(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 0))) { + CVarGetInteger(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 0))) { gDPLoadTextureBlock(OVERLAY_DISP++, gMapDungeonEntranceIconTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, iconSize, iconSize, 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); diff --git a/soh/src/code/z_map_mark.c b/soh/src/code/z_map_mark.c index 1831b8fdd..65e1bd1b1 100644 --- a/soh/src/code/z_map_mark.c +++ b/soh/src/code/z_map_mark.c @@ -3,6 +3,7 @@ #include "textures/parameter_static/parameter_static.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/cosmetics/cosmeticsTypes.h" typedef struct { /* 0x00 */ void* texture; @@ -72,9 +73,9 @@ void MapMark_Init(PlayState* play) { } //sLoadedMarkDataTable = gMapMarkDataTableVanilla; //sLoadedMarkDataTable = (void*)(uintptr_t)( - //(overlay->vramTable != NULL) - //? (void*)((uintptr_t)overlay->vramTable - ((intptr_t)overlay->vramStart - (intptr_t)overlay->loadedRamAddr)) - //: NULL); + //(overlay->vramTable != NULL) + //? (void*)((uintptr_t)overlay->vramTable - ((intptr_t)overlay->vramStart - (intptr_t)overlay->loadedRamAddr)) + //: NULL); } void MapMark_ClearPointers(PlayState* play) { @@ -106,7 +107,7 @@ void MapMark_DrawForDungeon(PlayState* play) { OPEN_DISPS(play->state.gfxCtx); while (true) { - if (mapMarkIconData->markType == MAP_MARK_NONE) { + if (mapMarkIconData->markType == MAP_MARK_NONE) { break; } @@ -123,7 +124,7 @@ void MapMark_DrawForDungeon(PlayState* play) { s32 X_Margins_Minimap_ic; s32 Y_Margins_Minimap_ic; if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 0) {X_Margins_Minimap_ic = Right_MC_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_Minimap_ic = Right_MC_Margin;}; Y_Margins_Minimap_ic = Bottom_MC_Margin; } else { X_Margins_Minimap_ic = 0; @@ -148,9 +149,9 @@ void MapMark_DrawForDungeon(PlayState* play) { //Minimap chest / boss icon const s32 PosX_Minimap_ori = GREG(94) + OTRGetRectDimensionFromRightEdge(markPointX+X_Margins_Minimap_ic) + 204; const s32 PosY_Minimap_ori = GREG(95) + markPoint->y + Y_Margins_Minimap_ic + 140; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != 0) { - rectTop = (markPoint->y + Y_Margins_Minimap_ic + 140 + CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)); - if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) != ORIGINAL_LOCATION) { + rectTop = (markPoint->y + Y_Margins_Minimap_ic + 140+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosY"), 0)); + if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap_ic = Left_MC_Margin;}; if (play->sceneNum == SCENE_DEKU_TREE || play->sceneNum == SCENE_DODONGOS_CAVERN || play->sceneNum == SCENE_JABU_JABU || play->sceneNum == SCENE_FOREST_TEMPLE || play->sceneNum == SCENE_FIRE_TEMPLE || play->sceneNum == SCENE_WATER_TEMPLE || @@ -160,12 +161,12 @@ void MapMark_DrawForDungeon(PlayState* play) { } else { rectLeft = OTRGetRectDimensionFromLeftEdge(markPointX+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+204+X_Margins_Minimap_ic); } - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.UseMargins"), 0) != 0) {X_Margins_Minimap_ic = Right_MC_Margin;}; - rectLeft = OTRGetRectDimensionFromRightEdge(markPointX+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+204+X_Margins_Minimap_ic); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 3) {//Anchor None + rectLeft = OTRGetRectDimensionFromRightEdge(markPointX+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0) + 204 +X_Margins_Minimap_ic); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == ANCHOR_NONE) { rectLeft = markPointX+CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosX"), 0)+204+X_Margins_Minimap_ic; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Minimap.PosType"), 0) == HIDDEN) { rectLeft = -9999; } } else { diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 39c6e111d..a696292ef 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -838,7 +838,7 @@ void func_80083108(PlayState* play) { // Check for the player being swordless in rando (no item on B and swordless flag set) // Child is always assumed due to not finding kokiri sword yet. Adult is only checked with MS shuffle on. u8 randoIsSwordless = IS_RANDO && (LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) && - gSaveContext.equips.buttonItems[0] == ITEM_NONE && Flags_GetInfTable(INFTABLE_SWORDLESS); + gSaveContext.equips.buttonItems[0] == ITEM_NONE && Flags_GetInfTable(INFTABLE_SWORDLESS); u8 randoWasSwordlessBefore = IS_RANDO && gSaveContext.buttonStatus[0] == SWORDLESS_STATUS; u8 randoCanTrackSwordless = randoIsSwordless && !randoWasSwordlessBefore; @@ -912,7 +912,7 @@ void func_80083108(PlayState* play) { Interface_ChangeAlpha(12); } } - // Don't hide the HUD in the Chamber of Sages when in Boss Rush. + // Don't hide the HUD in the Chamber of Sages when in Boss Rush. } else if (play->sceneNum == SCENE_CHAMBER_OF_THE_SAGES && !IS_BOSS_RUSH) { Interface_ChangeAlpha(1); } else if (play->sceneNum == SCENE_FISHING_POND) { @@ -964,8 +964,8 @@ void func_80083108(PlayState* play) { } else if (msgCtx->msgMode == MSGMODE_NONE) { if (GameInteractor_PacifistModeActive()) { gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = - gSaveContext.buttonStatus[3] = gSaveContext.buttonStatus[5] = gSaveContext.buttonStatus[6] = - gSaveContext.buttonStatus[7] = gSaveContext.buttonStatus[8] = BTN_DISABLED; + gSaveContext.buttonStatus[3] = gSaveContext.buttonStatus[5] = gSaveContext.buttonStatus[6] = + gSaveContext.buttonStatus[7] = gSaveContext.buttonStatus[8] = BTN_DISABLED; } else if ((Player_GetEnvironmentalHazard(play) >= 2) && (Player_GetEnvironmentalHazard(play) < 5)) { if (gSaveContext.buttonStatus[0] != BTN_DISABLED) { sp28 = 1; @@ -1178,7 +1178,7 @@ void func_80083108(PlayState* play) { && (gSaveContext.equips.buttonItems[i] <= ITEM_MASK_TRUTH)) { gSaveContext.buttonStatus[BUTTON_STATUS_INDEX(i)] = BTN_ENABLED; } else if ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && - (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK)) { + (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK)) { if (gSaveContext.buttonStatus[BUTTON_STATUS_INDEX(i)] == BTN_ENABLED) { sp28 = 1; } @@ -1422,7 +1422,7 @@ Gfx* Gfx_TextureIA8(Gfx* displayListHead, void* texture, s16 textureWidth, s16 t G_TX_NOLOD); gSPWideTextureRectangle(displayListHead++, rectLeft << 2, rectTop << 2, (rectLeft + rectWidth) << 2, - (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); + (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); return displayListHead; } @@ -1434,7 +1434,7 @@ Gfx* Gfx_TextureI8(Gfx* displayListHead, void* texture, s16 textureWidth, s16 te G_TX_NOLOD); gSPWideTextureRectangle(displayListHead++, rectLeft << 2, rectTop << 2, (rectLeft + rectWidth) << 2, - (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); + (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); return displayListHead; } @@ -1483,13 +1483,13 @@ void Rando_Inventory_SwapAgeEquipment(void) { gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4)) | - (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | - (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | - (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); + (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | + (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); // In Master Sword Shuffle we want to override the equip of the master sword from the vanilla code // First check we have the Master sword in our inventory, and if not, then unequip - if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); gSaveContext.equips.buttonItems[0] = ITEM_NONE; @@ -1524,7 +1524,7 @@ void Rando_Inventory_SwapAgeEquipment(void) { } // In Master Sword Shuffle we want to set the swordless flag if no item is on the B button - if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && gSaveContext.equips.buttonItems[0] == ITEM_NONE) { Flags_SetInfTable(INFTABLE_SWORDLESS); } @@ -1648,9 +1648,9 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4)) | - (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | - (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | - (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); + (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | + (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); // Set the dpad to nothing gSaveContext.equips.buttonItems[4] = ITEM_NONE; gSaveContext.equips.buttonItems[5] = ITEM_NONE; @@ -1881,14 +1881,14 @@ u8 Return_Item(u8 itemID, ModIndex modId, ItemID returnItem) { /** * @brief Adds the given item to Link's inventory. - * + * * NOTE: This function has been edited to be safe to use with a NULL play. * If you need to add to this function, be sure you check if the play is not * NULL before doing any operations requiring it. - * - * @param play - * @param item - * @return u8 + * + * @param play + * @param item + * @return u8 */ u8 Item_Give(PlayState* play, u8 item) { //prevents getting sticks without the bag in case something got missed @@ -1987,7 +1987,7 @@ u8 Item_Give(PlayState* play, u8 item) { if (item == ITEM_SWORD_BGS) { gSaveContext.swordHealth = 8; - if (ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD) == + if (ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD) == ((1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER) | (1 << EQUIP_INV_SWORD_BIGGORON) | (1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE))) { @@ -2000,7 +2000,7 @@ u8 Item_Give(PlayState* play, u8 item) { } } } - + } else if (item == ITEM_SWORD_MASTER) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); @@ -2495,7 +2495,7 @@ u8 Item_CheckObtainability(u8 item) { return ITEM_NONE; } } - + if ((item >= ITEM_SONG_MINUET) && (item <= ITEM_SONG_STORMS)) { return ITEM_NONE; } else if ((item >= ITEM_MEDALLION_FOREST) && (item <= ITEM_MEDALLION_LIGHT)) { @@ -2759,8 +2759,8 @@ bool Inventory_HatchPocketCucco(PlayState* play) { return Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO); } - if (!PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_POCKET_EGG)) { - return 0; + if (!PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_POCKET_EGG)) { + return 0; } gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG); @@ -2798,7 +2798,7 @@ void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 l } doAction = newName[loadOffset]; } - + char* segment = interfaceCtx->doActionSegment[loadOffset]; interfaceCtx->doActionSegment[loadOffset] = action != DO_ACTION_NONE ? doAction : gEmptyTexture; gSegments[7] = interfaceCtx->doActionSegment[loadOffset]; @@ -2865,7 +2865,7 @@ void Interface_LoadActionLabelB(PlayState* play, u16 action) { } interfaceCtx->unk_1FC = action; - + char* segment = interfaceCtx->doActionSegment[1]; interfaceCtx->doActionSegment[1] = action != DO_ACTION_NONE ? doAction : gEmptyTexture; osRecvMesg(&interfaceCtx->loadQueue, NULL, OS_MESG_BLOCK); @@ -2890,7 +2890,7 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange) { if (healthChange < 0) { gSaveContext.health = 0; } - + return 0; } @@ -2961,7 +2961,7 @@ void Rupees_ChangeBy(s16 rupeeChange) { void GameplayStats_UpdateAmmoUsed(s16 item, s16 ammoUsed) { - switch (item) { + switch (item) { case ITEM_STICK: gSaveContext.ship.stats.count[COUNT_AMMO_USED_STICK] += ammoUsed; break; @@ -3457,34 +3457,34 @@ void Interface_DrawMagicBar(PlayState* play) { s16 PosX_MidEnd; s16 rMagicFillX; s32 lineLength = CVarGetInteger(CVAR_COSMETIC("HUD.Hearts.LineLength"), 10); - if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) != ORIGINAL_LOCATION) { magicBarY = CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosY"), 0)+Y_Margins; - if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.UseMargins"), 0) != 0) {X_Margins = Left_HUD_Margin;}; PosX_Start = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins); rMagicBarX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins); PosX_MidEnd = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins+8); rMagicFillX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins+8); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.UseMargins"), 0) != 0) {X_Margins = Right_HUD_Margin;}; PosX_Start = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins); rMagicBarX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins); PosX_MidEnd = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins+8); rMagicFillX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins+8); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == ANCHOR_NONE) { PosX_Start = CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins; rMagicBarX = CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins; PosX_MidEnd = CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins+8; rMagicFillX = CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0)+X_Margins+8; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == 4) {//hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == HIDDEN) { PosX_Start = -9999; rMagicBarX = -9999; PosX_MidEnd = -9999; rMagicFillX = -9999; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == 5) {//Anchor To life meter + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosType"), 0) == ANCHOR_TO_LIFE_METER) { magicBarY = R_MAGIC_BAR_SMALL_Y-2 + - magicDrop*(lineLength == 0 ? 0 : (gSaveContext.healthCapacity-1)/(0x10*lineLength)) + - CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosY"), 0) + getHealthMeterYOffset(); + magicDrop*(lineLength == 0 ? 0 : (gSaveContext.healthCapacity-1)/(0x10*lineLength)) + + CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosY"), 0) + getHealthMeterYOffset(); s16 xPushover = CVarGetInteger(CVAR_COSMETIC("HUD.MagicBar.PosX"), 0) + getHealthMeterXOffset() + R_MAGIC_BAR_X-1; PosX_Start = xPushover; rMagicBarX = xPushover; @@ -3534,8 +3534,8 @@ void Interface_DrawMagicBar(PlayState* play) { G_TX_NOLOD, G_TX_NOLOD); gSPWideTextureRectangle(OVERLAY_DISP++, rMagicFillX << 2, (magicBarY + 3) << 2, - (rMagicFillX + gSaveContext.magic) << 2, (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, - 0, 1 << 10, 1 << 10); + (rMagicFillX + gSaveContext.magic) << 2, (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, + 0, 1 << 10, 1 << 10); // Fill the rest of the bar with the normal magic color gDPPipeSync(OVERLAY_DISP++); @@ -3565,8 +3565,8 @@ void Interface_DrawMagicBar(PlayState* play) { G_TX_NOLOD, G_TX_NOLOD); gSPWideTextureRectangle(OVERLAY_DISP++, rMagicFillX << 2, (magicBarY + 3) << 2, - (rMagicFillX + gSaveContext.magic) << 2, (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, - 0, 1 << 10, 1 << 10); + (rMagicFillX + gSaveContext.magic) << 2, (magicBarY + 10) << 2, G_TX_RENDERTILE, 0, + 0, 1 << 10, 1 << 10); } } @@ -3844,12 +3844,12 @@ void Interface_DrawItemButtons(PlayState* play) { s16 Y_Margins_BtnB; s16 BBtn_Size = 32; int BBtnScaled = BBtn_Size * 0.95f; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != ORIGINAL_LOCATION) { BBtnScaled = BBtn_Size * CVarGetFloat(CVAR_COSMETIC("HUD.BButton.Scale"), 0.95f); } int BBtn_factor = (1 << 10) * BBtn_Size / BBtnScaled; if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_BtnB = Right_HUD_Margin;}; Y_Margins_BtnB = (Top_HUD_Margin*-1); } else { X_Margins_BtnB = 0; @@ -3859,18 +3859,18 @@ void Interface_DrawItemButtons(PlayState* play) { s16 PosY_BtnB_ori = R_ITEM_BTN_Y(0)+Y_Margins_BtnB; s16 PosX_BtnB; s16 PosY_BtnB; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != 0) { - PosY_BtnB = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0)+Y_Margins_BtnB; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != ORIGINAL_LOCATION) { + PosY_BtnB = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0) + Y_Margins_BtnB; + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB = Left_HUD_Margin;}; - PosX_BtnB = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 2) {//Anchor Right + PosX_BtnB = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) + X_Margins_BtnB); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB = Right_HUD_Margin;}; - PosX_BtnB = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 3) {//Anchor None + PosX_BtnB = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) + X_Margins_BtnB); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_NONE) { PosX_BtnB = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 4) {//Hidden - PosX_BtnB = -9999; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == HIDDEN) { + PosX_BtnB = -9999; } } else { PosY_BtnB = PosY_BtnB_ori; @@ -3880,7 +3880,7 @@ void Interface_DrawItemButtons(PlayState* play) { s16 X_Margins_StartBtn; s16 Y_Margins_StartBtn; if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == ORIGINAL_LOCATION) { X_Margins_StartBtn = Right_HUD_Margin; }; Y_Margins_StartBtn = Top_HUD_Margin*-1; @@ -3891,7 +3891,7 @@ void Interface_DrawItemButtons(PlayState* play) { s16 StartBtn_Icon_H = 32; s16 StartBtn_Icon_W = 32; float Start_BTN_Scale = 0.75f; - if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) != ORIGINAL_LOCATION) { Start_BTN_Scale = CVarGetFloat(CVAR_COSMETIC("HUD.StartButton.Scale"), 0.75f); } int StartBTN_H_Scaled = StartBtn_Icon_H * Start_BTN_Scale; @@ -3904,18 +3904,18 @@ void Interface_DrawItemButtons(PlayState* play) { s16 StartBTN_Label_H = DO_ACTION_TEX_HEIGHT(); s16 PosX_StartBtn; s16 PosY_StartBtn; - if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) != 0) { - PosY_StartBtn = CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosY"), 0)-(Start_BTN_Scale*13)+Y_Margins_StartBtn; - if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) != ORIGINAL_LOCATION) { + PosY_StartBtn = CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosY"), 0) - (Start_BTN_Scale*13)+Y_Margins_StartBtn; + if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.UseMargins"), 0) != 0) {X_Margins_StartBtn = Left_HUD_Margin;}; - PosX_StartBtn = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosX"), 0)-(Start_BTN_Scale*13)+X_Margins_StartBtn); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == 2) {//Anchor Right + PosX_StartBtn = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosX"), 0)-(Start_BTN_Scale * 13) + X_Margins_StartBtn); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.UseMargins"), 0) != 0) {X_Margins_StartBtn = Right_HUD_Margin;}; - PosX_StartBtn = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosX"), 0)-(Start_BTN_Scale*13)+X_Margins_StartBtn); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == 3) {//Anchor None + PosX_StartBtn = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosX"), 0)-(Start_BTN_Scale * 13) + X_Margins_StartBtn); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == ANCHOR_NONE) { PosX_StartBtn = CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == 4) {//Hidden - PosX_StartBtn = -9999; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.StartButton.PosType"), 0) == HIDDEN) { + PosX_StartBtn = -9999; } } else { StartBTN_H_Scaled = StartBtn_Icon_H * 0.75f; @@ -3935,29 +3935,29 @@ void Interface_DrawItemButtons(PlayState* play) { s16 Y_Margins_CU; s16 Y_Margins_CD; if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CL = Right_HUD_Margin;}; Y_Margins_CL = (Top_HUD_Margin*-1); } else { X_Margins_CL = 0; Y_Margins_CL = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; - Y_Margins_CR = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CR = Right_HUD_Margin;}; + Y_Margins_CR = (Top_HUD_Margin * -1); } else { X_Margins_CR = 0; Y_Margins_CR = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == 0) {X_Margins_CU = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CU = Right_HUD_Margin;}; Y_Margins_CU = (Top_HUD_Margin*-1); } else { X_Margins_CU = 0; Y_Margins_CU = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; - Y_Margins_CD = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CD = Right_HUD_Margin;}; + Y_Margins_CD = (Top_HUD_Margin * -1); } else { X_Margins_CD = 0; Y_Margins_CD = 0; @@ -3976,21 +3976,21 @@ void Interface_DrawItemButtons(PlayState* play) { s16 C_Left_BTN_Size = 32; float CLeftScale = CVarGetFloat(CVAR_COSMETIC("HUD.CLeftButton.Scale"), 0.87f); int CLeftScaled = C_Left_BTN_Size * 0.87f; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != ORIGINAL_LOCATION) { CLeftScaled = C_Left_BTN_Size * CLeftScale; } int CLeft_factor = (1 << 10) * C_Left_BTN_Size / CLeftScaled; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != 0) { - C_Left_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0)+Y_Margins_CL; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != ORIGINAL_LOCATION) { + C_Left_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0) + Y_Margins_CL; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - C_Left_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 2) {//Anchor Right + C_Left_BTN_Pos[0] =OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + X_Margins_CL); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - C_Left_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 3) {//Anchor None + C_Left_BTN_Pos[0] =OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + X_Margins_CL); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_NONE) { C_Left_BTN_Pos[0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == HIDDEN) { C_Left_BTN_Pos[0] = -9999; } } else { @@ -4001,21 +4001,21 @@ void Interface_DrawItemButtons(PlayState* play) { s16 C_Right_BTN_Size = 32; float CRightScale = CVarGetFloat(CVAR_COSMETIC("HUD.CRightButton.Scale"), 0.87f); int CRightScaled = C_Right_BTN_Size * 0.87f; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != ORIGINAL_LOCATION) { CRightScaled = C_Right_BTN_Size * CRightScale; } int CRight_factor = (1 << 10) * C_Right_BTN_Size / CRightScaled; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != 0) { - C_Right_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0)+Y_Margins_CR; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != ORIGINAL_LOCATION) { + C_Right_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0) + Y_Margins_CR; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - C_Right_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 2) {//Anchor Right + C_Right_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + X_Margins_CR); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - C_Right_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 3) {//Anchor None + C_Right_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + X_Margins_CR); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_NONE) { C_Right_BTN_Pos[0] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == HIDDEN) { C_Right_BTN_Pos[0] = -9999; } } else { @@ -4026,21 +4026,21 @@ void Interface_DrawItemButtons(PlayState* play) { s16 C_Up_BTN_Size = 32; int CUpScaled = C_Up_BTN_Size * 0.5f; float CUpScale = CVarGetFloat(CVAR_COSMETIC("HUD.CUpButton.Scale"), 0.5f); - if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) != ORIGINAL_LOCATION) { CUpScaled = C_Up_BTN_Size * CUpScale; } int CUp_factor = (1 << 10) * C_Up_BTN_Size / CUpScaled; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) != 0) { - C_Up_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosY"), 0)+Y_Margins_CU; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) != ORIGINAL_LOCATION) { + C_Up_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosY"), 0) + Y_Margins_CU; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.UseMargins"), 0) != 0) {X_Margins_CU = Left_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosX"), 0)+X_Margins_CU); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == 2) {//Anchor Right + C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosX"), 0) + X_Margins_CU); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.UseMargins"), 0) != 0) {X_Margins_CU = Right_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosX"), 0)+X_Margins_CU); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == 3) {//Anchor None + C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosX"), 0) + X_Margins_CU); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == ANCHOR_NONE) { C_Up_BTN_Pos[0] = CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.PosType"), 0) == HIDDEN) { C_Up_BTN_Pos[0] = -9999; } } else { @@ -4050,23 +4050,23 @@ void Interface_DrawItemButtons(PlayState* play) { //C Button down s16 C_Down_BTN_Size = 32; float CDownScale = CVarGetFloat(CVAR_COSMETIC("HUD.CDownButton.Scale"), 0.87f); - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ORIGINAL_LOCATION) { CDownScale = 0.87f; } int CDownScaled = C_Down_BTN_Size * CDownScale; int CDown_factor = (1 << 10) * C_Down_BTN_Size / CDownScaled; int PositionAdjustment = CDownScaled/2; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != 0) { - C_Down_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0)+Y_Margins_CD; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != ORIGINAL_LOCATION) { + C_Down_BTN_Pos[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0) + Y_Margins_CD; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 2) {//Anchor Right + C_Down_BTN_Pos[0] = (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + X_Margins_CD); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 3) {//Anchor None + C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + X_Margins_CD); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_NONE) { C_Down_BTN_Pos[0] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == HIDDEN) { C_Down_BTN_Pos[0] = -9999; } } else { @@ -4089,21 +4089,21 @@ void Interface_DrawItemButtons(PlayState* play) { gDPPipeSync(OVERLAY_DISP++); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, interfaceCtx->cLeftAlpha); gSPWideTextureRectangle(OVERLAY_DISP++, C_Left_BTN_Pos[0] << 2, C_Left_BTN_Pos[1] << 2, - (C_Left_BTN_Pos[0] + R_ITEM_BTN_WIDTH(1)) << 2, + (C_Left_BTN_Pos[0] + R_ITEM_BTN_WIDTH(1)) << 2, (C_Left_BTN_Pos[1] + R_ITEM_BTN_WIDTH(1)) << 2, G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(1) << 1, R_ITEM_BTN_DD(1) << 1); // C-Down Button Color & Texture gDPSetPrimColor(OVERLAY_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, interfaceCtx->cDownAlpha); gSPWideTextureRectangle(OVERLAY_DISP++, C_Down_BTN_Pos[0] << 2, C_Down_BTN_Pos[1] << 2, - (C_Down_BTN_Pos[0] + R_ITEM_BTN_WIDTH(2)) << 2, + (C_Down_BTN_Pos[0] + R_ITEM_BTN_WIDTH(2)) << 2, (C_Down_BTN_Pos[1] + R_ITEM_BTN_WIDTH(2)) << 2, G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(2) << 1, R_ITEM_BTN_DD(2) << 1); // C-Right Button Color & Texture gDPSetPrimColor(OVERLAY_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, interfaceCtx->cRightAlpha); gSPWideTextureRectangle(OVERLAY_DISP++, C_Right_BTN_Pos[0] << 2, C_Right_BTN_Pos[1] << 2, - (C_Right_BTN_Pos[0] + R_ITEM_BTN_WIDTH(3)) << 2, + (C_Right_BTN_Pos[0] + R_ITEM_BTN_WIDTH(3)) << 2, (C_Right_BTN_Pos[1] + R_ITEM_BTN_WIDTH(3)) << 2, G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(3) << 1, R_ITEM_BTN_DD(3) << 1); @@ -4114,8 +4114,8 @@ void Interface_DrawItemButtons(PlayState* play) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, startButtonColor.r, startButtonColor.g, startButtonColor.b, interfaceCtx->startAlpha); gSPWideTextureRectangle(OVERLAY_DISP++, PosX_StartBtn << 2, PosY_StartBtn << 2, - (PosX_StartBtn + StartBTN_W_Scaled) << 2, (PosY_StartBtn + StartBTN_H_Scaled) << 2, - G_TX_RENDERTILE, 0, 0, StartBTN_W_factor, StartBTN_H_factor); + (PosX_StartBtn + StartBTN_W_Scaled) << 2, (PosY_StartBtn + StartBTN_H_Scaled) << 2, + G_TX_RENDERTILE, 0, 0, StartBTN_W_factor, StartBTN_H_factor); gDPPipeSync(OVERLAY_DISP++); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->startAlpha); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); @@ -4129,7 +4129,7 @@ void Interface_DrawItemButtons(PlayState* play) { gDPPipeSync(OVERLAY_DISP++); gSPSetGeometryMode(OVERLAY_DISP++, G_CULL_BACK); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, - PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->startAlpha); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); Matrix_Translate(PosX_StartBtn-160+((Start_BTN_Scale+Start_BTN_Scale/3)*11.5f), (PosY_StartBtn-120+((Start_BTN_Scale+Start_BTN_Scale/3)*11.5f)) * -1, 1.0f, MTXMODE_NEW); @@ -4195,22 +4195,22 @@ void Interface_DrawItemButtons(PlayState* play) { s16 Y_Margins_CR; s16 Y_Margins_CD; if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; - Y_Margins_CL = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CL = Right_HUD_Margin;}; + Y_Margins_CL = (Top_HUD_Margin * -1); } else { X_Margins_CL = 0; Y_Margins_CL = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; - Y_Margins_CR = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CR = Right_HUD_Margin;}; + Y_Margins_CR = (Top_HUD_Margin * -1); } else { X_Margins_CR = 0; Y_Margins_CR = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; - Y_Margins_CD = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CD = Right_HUD_Margin;}; + Y_Margins_CD = (Top_HUD_Margin * -1); } else { X_Margins_CD = 0; Y_Margins_CD = 0; @@ -4226,18 +4226,18 @@ void Interface_DrawItemButtons(PlayState* play) { { R_ITEM_ICON_X(3)+X_Margins_CR, R_ITEM_ICON_Y(3)+Y_Margins_CR }, }; s16 ItemIconPos[3][2]; //(X,Y) - //C button Left - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != 0) { - ItemIconPos[0][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0)+Y_Margins_CL; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 1) {//Anchor Left + // C button Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[0][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0) + Y_Margins_CL; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + X_Margins_CL); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + X_Margins_CL); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[0][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == HIDDEN) { ItemIconPos[0][0] = -9999; } } else { @@ -4245,17 +4245,17 @@ void Interface_DrawItemButtons(PlayState* play) { ItemIconPos[0][1] = ItemIconPos_ori[0][1]; } //C Button down - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != 0) { - ItemIconPos[1][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0)+Y_Margins_CD; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[1][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0) + Y_Margins_CD; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + X_Margins_CD); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + X_Margins_CD); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[1][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == HIDDEN) { ItemIconPos[1][0] = -9999; } } else { @@ -4263,17 +4263,17 @@ void Interface_DrawItemButtons(PlayState* play) { ItemIconPos[1][1] = ItemIconPos_ori[1][1]; } //C button Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != 0) { - ItemIconPos[2][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0)+Y_Margins_CR; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[2][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0) + Y_Margins_CR; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + X_Margins_CR); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + X_Margins_CR); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[2][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == HIDDEN) { ItemIconPos[2][0] = -9999; } } else { @@ -4324,36 +4324,36 @@ void Interface_DrawItemIconTexture(PlayState* play, void* texture, s16 button) { s16 X_Margins_DPad_Items; s16 Y_Margins_DPad_Items; if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; - Y_Margins_BtnB = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_BtnB = Right_HUD_Margin;}; + Y_Margins_BtnB = (Top_HUD_Margin * -1); } else { X_Margins_BtnB = 0; Y_Margins_BtnB = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; - Y_Margins_CL = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CL = Right_HUD_Margin;}; + Y_Margins_CL = (Top_HUD_Margin * -1); } else { X_Margins_CL = 0; Y_Margins_CL = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; - Y_Margins_CR = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CR = Right_HUD_Margin;}; + Y_Margins_CR = (Top_HUD_Margin * -1); } else { X_Margins_CR = 0; Y_Margins_CR = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; - Y_Margins_CD = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CD = Right_HUD_Margin;}; + Y_Margins_CD = (Top_HUD_Margin * -1); } else { X_Margins_CD = 0; Y_Margins_CD = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; - Y_Margins_DPad_Items = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_DPad_Items = Right_HUD_Margin;}; + Y_Margins_DPad_Items = (Top_HUD_Margin * -1); } else { X_Margins_DPad_Items = 0; Y_Margins_DPad_Items = 0; @@ -4385,30 +4385,30 @@ void Interface_DrawItemIconTexture(PlayState* play, void* texture, s16 button) { {23, 8},//Right }; //(X,Y) Used with custom position to place it properly. s16 ItemIconPos[8][2]; //(X,Y) - //DPadItems - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != 0) { - ItemIconPos[4][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up - ItemIconPos[5][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down - ItemIconPos[6][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left - ItemIconPos[7][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[3][1];//Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 1) {//Anchor Left + // DPadItems + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[4][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0) + Y_Margins_DPad_Items + DPad_ItemsOffset[0][1]; // Up + ItemIconPos[5][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0) + Y_Margins_DPad_Items + DPad_ItemsOffset[1][1]; // Down + ItemIconPos[6][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0) + Y_Margins_DPad_Items + DPad_ItemsOffset[2][1]; // Left + ItemIconPos[7][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0) + Y_Margins_DPad_Items + DPad_ItemsOffset[3][1]; // Right + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_DPad_Items = Left_HUD_Margin;}; - ItemIconPos[4][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); - ItemIconPos[5][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); - ItemIconPos[6][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); - ItemIconPos[7][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[4][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[0][0]); + ItemIconPos[5][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[1][0]); + ItemIconPos[6][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[2][0]); + ItemIconPos[7][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[3][0]); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; - ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); - ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); - ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); - ItemIconPos[7][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 3) {//Anchor None + ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[0][0]); + ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[1][0]); + ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[2][0]); + ItemIconPos[7][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[3][0]); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[4][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[0][0]; ItemIconPos[5][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[1][0]; ItemIconPos[6][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[2][0]; ItemIconPos[7][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[3][0]; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == HIDDEN) { ItemIconPos[4][0] = -9999; ItemIconPos[5][0] = -9999; ItemIconPos[6][0] = -9999; @@ -4424,36 +4424,36 @@ void Interface_DrawItemIconTexture(PlayState* play, void* texture, s16 button) { ItemIconPos[6][1] = ItemIconPos_ori[6][1]; ItemIconPos[7][1] = ItemIconPos_ori[7][1]; } - //B Button - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != 0) { - ItemIconPos[0][1] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0)+Y_Margins_BtnB; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 1) {//Anchor Left + // B Button + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[0][1] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0) + Y_Margins_BtnB; + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB = Left_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) + X_Margins_BtnB); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB = Right_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) + X_Margins_BtnB); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[0][0] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 4) {//Hidden - ItemIconPos[0][0] = -9999; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == HIDDEN) { + ItemIconPos[0][0] = -9999; } } else { ItemIconPos[0][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); ItemIconPos[0][1] = ItemIconPos_ori[0][1]; } - //C button Left - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != 0) { - ItemIconPos[1][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0)+Y_Margins_CL; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 1) {//Anchor Left + // C button Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[1][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0) + Y_Margins_CL; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + X_Margins_CL); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + X_Margins_CL); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[1][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == HIDDEN) { ItemIconPos[1][0] = -9999; } } else { @@ -4461,17 +4461,17 @@ void Interface_DrawItemIconTexture(PlayState* play, void* texture, s16 button) { ItemIconPos[1][1] = ItemIconPos_ori[1][1]; } //C Button down - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != 0) { - ItemIconPos[2][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0)+Y_Margins_CD; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[2][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0) + Y_Margins_CD; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + X_Margins_CD); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + X_Margins_CD); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[2][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == HIDDEN) { ItemIconPos[2][0] = -9999; } } else { @@ -4479,17 +4479,17 @@ void Interface_DrawItemIconTexture(PlayState* play, void* texture, s16 button) { ItemIconPos[2][1] = ItemIconPos_ori[2][1]; } //C button Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != 0) { - ItemIconPos[3][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0)+Y_Margins_CR; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[3][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0) + Y_Margins_CR; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + X_Margins_CR); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 3) {//Anchor None + ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + X_Margins_CR); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_NONE) { ItemIconPos[3][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == HIDDEN) { ItemIconPos[3][0] = -9999; } } else { @@ -4501,9 +4501,9 @@ void Interface_DrawItemIconTexture(PlayState* play, void* texture, s16 button) { G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSPWideTextureRectangle(OVERLAY_DISP++, ItemIconPos[button][0] << 2, ItemIconPos[button][1] << 2, - (ItemIconPos[button][0] + gItemIconWidth[button]) << 2, - (ItemIconPos[button][1] + gItemIconWidth[button]) << 2, G_TX_RENDERTILE, 0, 0, - gItemIconDD[button] << 1, gItemIconDD[button] << 1); + (ItemIconPos[button][0] + gItemIconWidth[button]) << 2, + (ItemIconPos[button][1] + gItemIconWidth[button]) << 2, G_TX_RENDERTILE, 0, 0, + gItemIconDD[button] << 1, gItemIconDD[button] << 1); CLOSE_DISPS(play->state.gfxCtx); } @@ -4533,36 +4533,36 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { s16 X_Margins_DPad_Items; s16 Y_Margins_DPad_Items; if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; - Y_Margins_BtnB = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_BtnB = Right_HUD_Margin;}; + Y_Margins_BtnB = (Top_HUD_Margin * -1); } else { X_Margins_BtnB = 0; Y_Margins_BtnB = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; - Y_Margins_CL = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CL = Right_HUD_Margin;}; + Y_Margins_CL = (Top_HUD_Margin * -1); } else { X_Margins_CL = 0; Y_Margins_CL = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; - Y_Margins_CR = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CR = Right_HUD_Margin;}; + Y_Margins_CR = (Top_HUD_Margin * -1); } else { X_Margins_CR = 0; Y_Margins_CR = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; - Y_Margins_CD = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CD = Right_HUD_Margin;}; + Y_Margins_CD = (Top_HUD_Margin * -1); } else { X_Margins_CD = 0; Y_Margins_CD = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; - Y_Margins_DPad_Items = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_DPad_Items = Right_HUD_Margin;}; + Y_Margins_DPad_Items = (Top_HUD_Margin * -1); } else { X_Margins_DPad_Items = 0; Y_Margins_DPad_Items = 0; @@ -4585,29 +4585,29 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { {23,19},//Right }; //(X,Y) Used with custom position to place it properly. //DPadItems - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != ORIGINAL_LOCATION) { ItemIconPos[4][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up ItemIconPos[5][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down ItemIconPos[6][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left ItemIconPos[7][1] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[3][1];//Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_DPad_Items = Left_HUD_Margin;}; - ItemIconPos[4][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); - ItemIconPos[5][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); - ItemIconPos[6][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); - ItemIconPos[7][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[4][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) +X_Margins_DPad_Items + DPad_ItemsOffset[0][0]); + ItemIconPos[5][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) +X_Margins_DPad_Items + DPad_ItemsOffset[1][0]); + ItemIconPos[6][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) +X_Margins_DPad_Items + DPad_ItemsOffset[2][0]); + ItemIconPos[7][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) +X_Margins_DPad_Items + DPad_ItemsOffset[3][0]); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; - ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); - ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); - ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); - ItemIconPos[7][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 3) {//Anchor None - ItemIconPos[4][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[0][0]; - ItemIconPos[5][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[1][0]; - ItemIconPos[6][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[2][0]; - ItemIconPos[7][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[3][0]; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 4) {//Hidden + ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[0][0]); + ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[1][0]); + ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[2][0]); + ItemIconPos[7][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items + DPad_ItemsOffset[3][0]); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_NONE) { + ItemIconPos[4][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) + DPad_ItemsOffset[0][0]; + ItemIconPos[5][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) + DPad_ItemsOffset[1][0]; + ItemIconPos[6][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) + DPad_ItemsOffset[2][0]; + ItemIconPos[7][0] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0) + DPad_ItemsOffset[3][0]; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == HIDDEN) { ItemIconPos[4][0] = -9999; ItemIconPos[5][0] = -9999; ItemIconPos[6][0] = -9999; @@ -4626,35 +4626,35 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { //B Button s16 PosX_adjust = 1; s16 PosY_adjust = 17; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != 0) { - ItemIconPos[0][1] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0)+Y_Margins_BtnB+PosY_adjust; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[0][1] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0) + Y_Margins_BtnB + PosY_adjust; + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB = Left_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB = Right_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 3) {//Anchor None - ItemIconPos[0][0] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+PosX_adjust; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 4) {//Hidden - ItemIconPos[0][0] = -9999; + ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_NONE) { + ItemIconPos[0][0] = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) + PosX_adjust; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == HIDDEN) { + ItemIconPos[0][0] = -9999; } } else { ItemIconPos[0][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); ItemIconPos[0][1] = ItemIconPos_ori[0][1]; } //C button Left - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != 0) { - ItemIconPos[1][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0)+Y_Margins_CL+PosY_adjust; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[1][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0) + Y_Margins_CL + PosY_adjust; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 3) {//Anchor None - ItemIconPos[1][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+PosX_adjust; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 4) {//Hidden + ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_NONE) { + ItemIconPos[1][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0) + PosX_adjust; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == HIDDEN) { ItemIconPos[1][0] = -9999; } } else { @@ -4662,17 +4662,17 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { ItemIconPos[1][1] = ItemIconPos_ori[1][1]; } //C Button down - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != 0) { - ItemIconPos[2][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0)+Y_Margins_CD+PosY_adjust; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[2][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0) + Y_Margins_CD + PosY_adjust; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 3) {//Anchor None - ItemIconPos[2][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+PosX_adjust; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 4) {//Hidden + ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_NONE) { + ItemIconPos[2][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0) + PosX_adjust; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == HIDDEN) { ItemIconPos[2][0] = -9999; } } else { @@ -4680,17 +4680,17 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { ItemIconPos[2][1] = ItemIconPos_ori[2][1]; } //C button Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != 0) { - ItemIconPos[3][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0)+Y_Margins_CR+PosY_adjust; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != ORIGINAL_LOCATION) { + ItemIconPos[3][1] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0) + Y_Margins_CR + PosY_adjust; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 2) {//Anchor Right + ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) +X_Margins_CR + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 3) {//Anchor None - ItemIconPos[3][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+PosX_adjust; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 4) {//Hidden + ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) +X_Margins_CR + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_NONE) { + ItemIconPos[3][0] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0) + PosX_adjust; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == HIDDEN) { ItemIconPos[3][0] = -9999; } } else { @@ -5038,25 +5038,25 @@ void Interface_Draw(PlayState* play) { s16 X_Margins_RC; s16 Y_Margins_RC; if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == 0) {X_Margins_RC = Left_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_RC = Left_HUD_Margin;}; Y_Margins_RC = Bottom_HUD_Margin; } else { X_Margins_RC = 0; Y_Margins_RC = 0; } - s16 PosX_RC_ori = OTRGetRectDimensionFromLeftEdge(26+X_Margins_RC); + s16 PosX_RC_ori = OTRGetRectDimensionFromLeftEdge(26 + X_Margins_RC); s16 PosY_RC_ori = 206+Y_Margins_RC; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) != 0) { - PosY_RC = CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosY"), 0)+Y_Margins_RC; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) != ORIGINAL_LOCATION) { + PosY_RC = CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosY"), 0) + Y_Margins_RC; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.UseMargins"), 0) != 0) {X_Margins_RC = Left_HUD_Margin;}; PosX_RC = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosX"), 0)+X_Margins_RC); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.UseMargins"), 0) != 0) {X_Margins_RC = Right_HUD_Margin;}; PosX_RC = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosX"), 0)+X_Margins_RC); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == ANCHOR_NONE) { PosX_RC = CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Rupees.PosType"), 0) == HIDDEN) { PosX_RC = -9999; } } else { @@ -5087,7 +5087,7 @@ void Interface_Draw(PlayState* play) { s16 X_Margins_SKC; s16 Y_Margins_SKC; if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == 0) {X_Margins_SKC = Left_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_SKC = Left_HUD_Margin;}; Y_Margins_SKC = Bottom_HUD_Margin; } else { X_Margins_SKC = 0; @@ -5097,17 +5097,18 @@ void Interface_Draw(PlayState* play) { s16 PosY_SKC_ori = 190+Y_Margins_SKC; s16 PosX_SKC; s16 PosY_SKC; - if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) != 0) { - PosY_SKC = CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosY"), 0)+Y_Margins_SKC; - if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) != ORIGINAL_LOCATION) { + PosY_SKC = CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosY"), 0) + Y_Margins_SKC; + if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.UseMargins"), 0) != 0) {X_Margins_SKC = Left_HUD_Margin;}; - PosX_SKC = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosX"), 0)+X_Margins_SKC); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == 2) {//Anchor Right + PosX_SKC = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosX"), 0) + X_Margins_SKC); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.UseMargins"), 0) != 0) {X_Margins_SKC = Right_HUD_Margin;}; - PosX_SKC = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosX"), 0)+X_Margins_SKC); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == 3) {//Anchor None + PosX_SKC = OTRGetDimensionFromRightEdge( + CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosX"), 0) + X_Margins_SKC); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == ANCHOR_NONE) { PosX_SKC = CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.SmallKey.PosType"), 0) == HIDDEN) { PosX_SKC = -9999; } } else { @@ -5126,7 +5127,7 @@ void Interface_Draw(PlayState* play) { gDPPipeSync(OVERLAY_DISP++); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha); gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, - TEXEL0, 0, PRIMITIVE, 0); + TEXEL0, 0, PRIMITIVE, 0); interfaceCtx->counterDigits[2] = 0; interfaceCtx->counterDigits[3] = gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex]; @@ -5264,29 +5265,29 @@ void Interface_Draw(PlayState* play) { PosY_adjust = 6; PosX_adjust = -10; } - + s16 BbtnPosX; s16 BbtnPosY; s16 X_Margins_BtnB_label; s16 Y_Margins_BtnB_label; if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 0) {X_Margins_BtnB_label = Right_HUD_Margin;}; - Y_Margins_BtnB_label = (Top_HUD_Margin*-1); + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_BtnB_label = Right_HUD_Margin;}; + Y_Margins_BtnB_label = (Top_HUD_Margin * -1); } else { X_Margins_BtnB_label = 0; Y_Margins_BtnB_label = 0; } - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != 0) { - BbtnPosY = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0)+Y_Margins_BtnB_label+PosY_adjust; - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) != ORIGINAL_LOCATION) { + BbtnPosY = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosY"), 0) + Y_Margins_BtnB_label + PosY_adjust; + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB_label = Left_HUD_Margin;}; - BbtnPosX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB_label+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 2) {//Anchor Right + BbtnPosX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB_label + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) {X_Margins_BtnB_label = Right_HUD_Margin;}; - BbtnPosX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+X_Margins_BtnB_label+PosX_adjust); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 3) {//Anchor None - BbtnPosX = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0)+PosX_adjust; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 4) {//Hidden + BbtnPosX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) +X_Margins_BtnB_label + PosX_adjust); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ANCHOR_NONE) { + BbtnPosX = CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosX"), 0) + PosX_adjust; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == HIDDEN) { BbtnPosX = -9999; } } else { @@ -5360,23 +5361,23 @@ void Interface_Draw(PlayState* play) { s16 X_Margins_Dpad; s16 Y_Margins_Dpad; if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 0) {X_Margins_Dpad = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_Dpad = Right_HUD_Margin;}; Y_Margins_Dpad = (Top_HUD_Margin*-1); } else { Y_Margins_Dpad = 0; X_Margins_Dpad = 0; } - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != 0) { - DpadPosY = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_Dpad; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != ORIGINAL_LOCATION) { + DpadPosY = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0) + Y_Margins_Dpad; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_Dpad = Left_HUD_Margin;}; DpadPosX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_Dpad); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_Dpad = Right_HUD_Margin;}; DpadPosX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_Dpad); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_NONE) { DpadPosX = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == HIDDEN) { DpadPosX = -9999; } } else { @@ -5460,21 +5461,21 @@ void Interface_Draw(PlayState* play) { s16 PosY_BtnA; s16 rAIconX; s16 rAIconY; - if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) != ORIGINAL_LOCATION) { PosY_BtnA = CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosY"), 0)+Y_Margins_BtnA; rAIconY = 98.0f - PosY_BtnA; - if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.UseMargins"), 0) != 0) {X_Margins_BtnA = Left_HUD_Margin;}; - PosX_BtnA = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0)+X_Margins_BtnA); - rAIconX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0)+X_Margins_BtnA); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == 2) {//Anchor Right + PosX_BtnA = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0) + X_Margins_BtnA); + rAIconX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0) + X_Margins_BtnA); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.UseMargins"), 0) != 0) {X_Margins_BtnA = Right_HUD_Margin;}; - PosX_BtnA = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0)+X_Margins_BtnA); - rAIconX= OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0)+X_Margins_BtnA); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == 3) {//Anchor None + PosX_BtnA = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0) + X_Margins_BtnA); + rAIconX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0) + X_Margins_BtnA); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == ANCHOR_NONE) { PosX_BtnA = CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0); rAIconX = CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.PosType"), 0) == HIDDEN) { PosX_BtnA = -9999; rAIconX = -9999; } @@ -5578,17 +5579,17 @@ void Interface_Draw(PlayState* play) { s16 CarrotsPosX = ZREG(14); s16 CarrotsPosY = ZREG(15); s16 CarrotsMargins_X = 0; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) != ORIGINAL_LOCATION) { CarrotsPosY = CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosY"), 0); - if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.UseMargins"), 0) != 0) {CarrotsMargins_X = Left_HUD_Margin;}; - CarrotsPosX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosX"), 0)+CarrotsMargins_X); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == 2) {//Anchor Right + CarrotsPosX = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosX"), 0) + CarrotsMargins_X); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.UseMargins"), 0) != 0) {CarrotsMargins_X = Right_HUD_Margin;}; - CarrotsPosX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosX"), 0)+CarrotsMargins_X); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == 3) {//Anchor None + CarrotsPosX = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosX"), 0) + CarrotsMargins_X); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == ANCHOR_NONE) { CarrotsPosX = CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Carrots.PosType"), 0) == HIDDEN) { CarrotsPosX = -9999; } } @@ -5601,31 +5602,31 @@ void Interface_Draw(PlayState* play) { } gSPWideTextureRectangle(OVERLAY_DISP++, svar5 << 2, CarrotsPosY << 2, (svar5 + 16) << 2, - (CarrotsPosY + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + (CarrotsPosY + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } } } else { // Score for the Horseback Archery s32 X_Margins_Archery; if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == 0) {X_Margins_Archery = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_Archery = Right_HUD_Margin;}; } else { X_Margins_Archery = 0; } s16 ArcheryPos_Y = ZREG(15); s16 ArcheryPos_X = OTRGetRectDimensionFromRightEdge(WREG(32)+X_Margins_Archery); - if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) != ORIGINAL_LOCATION) { ArcheryPos_Y = CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosY"), 0); - if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.UseMargins"), 0) != 0) {X_Margins_Archery = Left_HUD_Margin;}; - ArcheryPos_X = OTRGetRectDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosX"), 0)+X_Margins_Archery); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == 2) {//Anchor Right + ArcheryPos_X = OTRGetRectDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosX"), 0) + X_Margins_Archery); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.UseMargins"), 0) != 0) {X_Margins_Archery = Right_HUD_Margin;}; - ArcheryPos_X = OTRGetRectDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosX"), 0)+X_Margins_Archery); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == 3) {//Anchor None - ArcheryPos_X = CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosX"), 0)+204+X_Margins_Archery; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == 4) {//Hidden + ArcheryPos_X = OTRGetRectDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosX"), 0) + X_Margins_Archery); + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == ANCHOR_NONE) { + ArcheryPos_X = CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosX"), 0) + 204 + X_Margins_Archery; + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.ArcheryScore.PosType"), 0) == HIDDEN) { ArcheryPos_X = -9999; } } @@ -5651,7 +5652,7 @@ void Interface_Draw(PlayState* play) { if (sHBAScoreDigits[svar1] != 0 || (svar2 != 0) || (svar1 >= 3)) { OVERLAY_DISP = Gfx_TextureI8( OVERLAY_DISP, digitTextures[sHBAScoreDigits[svar1]], 8, 16, ArcheryPos_X, - (ArcheryPos_Y - 2), digitWidth[0], VREG(42), VREG(43) << 1, VREG(43) << 1); + (ArcheryPos_Y - 2), digitWidth[0], VREG(42), VREG(43) << 1, VREG(43) << 1); ArcheryPos_X += 9; svar2++; } @@ -6048,25 +6049,25 @@ void Interface_Draw(PlayState* play) { gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); s32 X_Margins_Timer; if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == 0) {X_Margins_Timer = Left_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_Timer = Left_HUD_Margin;}; } else { X_Margins_Timer = 0; } svar5 = OTRGetRectDimensionFromLeftEdge(gSaveContext.timerX[svar6]+X_Margins_Timer); svar2 = gSaveContext.timerY[svar6]; - if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) != ORIGINAL_LOCATION) { svar2 = (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosY"), 0)); - if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.UseMargins"), 0) != 0) {X_Margins_Timer = Left_HUD_Margin;}; svar5 = OTRGetRectDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosX"), 0)+X_Margins_Timer); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.UseMargins"), 0) != 0) {X_Margins_Timer = Right_HUD_Margin;}; svar5 = OTRGetRectDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosX"), 0)+X_Margins_Timer); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == ANCHOR_NONE) { svar5 = CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosX"), 0)+204+X_Margins_Timer; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == 4) {//Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Timers.PosType"), 0) == HIDDEN) { svar5 = -9999; - } + } } OVERLAY_DISP = @@ -6094,7 +6095,7 @@ void Interface_Draw(PlayState* play) { for (svar1 = 0; svar1 < 5; svar1++) { // clang-format off //svar5 = svar5 + 8; - //svar5 = OTRGetRectDimensionFromLeftEdge(gSaveContext.timerX[svar6]); + //svar5 = OTRGetRectDimensionFromLeftEdge(gSaveContext.timerX[svar6]); OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, digitTextures[timerDigits[svar1]], 8, 16, svar5 + timerDigitLeftPos[svar1], svar2, digitWidth[svar1], VREG(42), VREG(43) << 1, @@ -6127,27 +6128,27 @@ void Interface_DrawTotalGameplayTimer(PlayState* play) { s32 X_Margins_Timer = 0; if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == ORIGINAL_LOCATION) { X_Margins_Timer = Left_HUD_Margin; }; } s32 rectLeftOri = OTRGetRectDimensionFromLeftEdge(24 + X_Margins_Timer); s32 rectTopOri = 73; - if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) != ORIGINAL_LOCATION) { rectTopOri = (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosY"), 0)); - if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == 1) { // Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.UseMargins"), 0) != 0) { X_Margins_Timer = Left_HUD_Margin; }; rectLeftOri = OTRGetRectDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosX"), 0) + X_Margins_Timer); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == 2) { // Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.UseMargins"), 0) != 0) { X_Margins_Timer = Right_HUD_Margin; }; rectLeftOri = OTRGetRectDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosX"), 0) + X_Margins_Timer); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == 3) { // Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == ANCHOR_NONE) { rectLeftOri = CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosX"), 0) + 204 + X_Margins_Timer; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == 4) { // Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.PosType"), 0) == HIDDEN) { rectLeftOri = -9999; } } @@ -6238,7 +6239,7 @@ void Interface_Update(PlayState* play) { Left_HUD_Margin = CVarGetInteger(CVAR_COSMETIC("HUD.Margin.L"), 0); Right_HUD_Margin = CVarGetInteger(CVAR_COSMETIC("HUD.Margin.R"), 0); Bottom_HUD_Margin = CVarGetInteger(CVAR_COSMETIC("HUD.Margin.B"), 0); - + GameInteractor_ExecuteOnInterfaceUpdate(); if (CHECK_BTN_ALL(debugInput->press.button, BTN_DLEFT)) { 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 d8475c75d..f939d5030 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -26,6 +26,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include +#include "soh/Enhancements/cosmetics/cosmeticsTypes.h" #include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/Enhancements/randomizer/randomizer_grotto.h" @@ -11700,7 +11701,7 @@ void Player_DetectRumbleSecrets(Player* this) { s16 X_Margins_VSOA; s16 Y_Margins_VSOA; if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ORIGINAL_LOCATION) { X_Margins_VSOA = Left_Margins; }; Y_Margins_VSOA = Top_Margins; @@ -11714,19 +11715,19 @@ void Player_DetectRumbleSecrets(Player* this) { s16 PosY_VSOA; if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) != 0) { PosY_VSOA = CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosY"), 0) + Y_Margins_VSOA; - if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 1) { // Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.UseMargins"), 0) != 0) { X_Margins_VSOA = Left_Margins; }; PosX_VSOA = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosX"), 0) + X_Margins_VSOA); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 2) { // Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.UseMargins"), 0) != 0) { X_Margins_VSOA = Right_Margins; }; PosX_VSOA = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosX"), 0) + X_Margins_VSOA); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 3) { // Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_NONE) { PosX_VSOA = CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosX"), 0); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == 4) { // Hidden + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == HIDDEN) { PosX_VSOA = -9999; } } else { diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 91051f5f3..b0843b5ee 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -883,35 +883,35 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { s16 X_Margins_DPad_Items; s16 Y_Margins_DPad_Items; if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.BButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_BtnB = Right_HUD_Margin;}; Y_Margins_BtnB = (Top_HUD_Margin*-1); } else { X_Margins_BtnB = 0; Y_Margins_BtnB = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CL = Right_HUD_Margin;}; Y_Margins_CL = (Top_HUD_Margin*-1); } else { X_Margins_CL = 0; Y_Margins_CL = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CR = Right_HUD_Margin;}; Y_Margins_CR = (Top_HUD_Margin*-1); } else { X_Margins_CR = 0; Y_Margins_CR = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_CD = Right_HUD_Margin;}; Y_Margins_CD = (Top_HUD_Margin*-1); } else { X_Margins_CD = 0; Y_Margins_CD = 0; } if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) { - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ORIGINAL_LOCATION) {X_Margins_DPad_Items = Right_HUD_Margin;}; Y_Margins_DPad_Items = (Top_HUD_Margin*-1); } else { X_Margins_DPad_Items = 0; @@ -934,24 +934,24 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { }; //(X,Y) Used with custom position to place it properly. //DPadItems - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) != ORIGINAL_LOCATION) { sCButtonPosY[3] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up sCButtonPosY[4] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down sCButtonPosY[5] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left sCButtonPosY[6] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosY"), 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[3][1];//Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_DPad_Items = Left_HUD_Margin;}; sCButtonPosX[3] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); sCButtonPosX[4] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); sCButtonPosX[5] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); sCButtonPosX[6] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.UseMargins"), 0) != 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; sCButtonPosX[3] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); sCButtonPosX[4] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); sCButtonPosX[5] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); sCButtonPosX[6] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == ANCHOR_NONE) { sCButtonPosX[3] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[0][0]; sCButtonPosX[4] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[1][0]; sCButtonPosX[5] = CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosX"), 0)+DPad_ItemsOffset[2][0]; @@ -968,15 +968,15 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { sCButtonPosY[6] = ItemIconPos_ori[6][1]; } //C button Left - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) != ORIGINAL_LOCATION) { sCButtonPosY[0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosY"), 0)+Y_Margins_CL; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; sCButtonPosX[0] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.UseMargins"), 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; sCButtonPosX[0] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0)+X_Margins_CL); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0) == ANCHOR_NONE) { sCButtonPosX[0] = CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.PosX"), 0); } } else { @@ -984,15 +984,15 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { sCButtonPosY[0] = ItemIconPos_ori[0][1]; } //C Button down - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) != ORIGINAL_LOCATION) { sCButtonPosY[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosY"), 0)+Y_Margins_CD; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; sCButtonPosX[1] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.UseMargins"), 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; sCButtonPosX[1] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0)+X_Margins_CD); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosType"), 0) == ANCHOR_NONE) { sCButtonPosX[1] = CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.PosX"), 0); } } else { @@ -1000,15 +1000,15 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { sCButtonPosY[1] = ItemIconPos_ori[1][1]; } //C button Right - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != 0) { + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) != ORIGINAL_LOCATION) { sCButtonPosY[2] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosY"), 0)+Y_Margins_CR; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 1) {//Anchor Left + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_LEFT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; sCButtonPosX[2] = OTRGetDimensionFromLeftEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 2) {//Anchor Right + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_RIGHT) { if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.UseMargins"), 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; sCButtonPosX[2] = OTRGetDimensionFromRightEdge(CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0)+X_Margins_CR); - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == 3) {//Anchor None + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosType"), 0) == ANCHOR_NONE) { sCButtonPosX[2] = CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.PosX"), 0); } } else { From 135c2e8217f9bc28223b1d62bff764e7705862b2 Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 12 Feb 2025 15:30:06 -0500 Subject: [PATCH 039/267] Remove POLY_KAL and restore POLY_OPA for kaleido (#5041) --- soh/include/functions.h | 2 - soh/include/macros.h | 4 - soh/include/z64.h | 3 - .../vanilla-behavior/GIVanillaBehavior.h | 2 +- soh/soh/Enhancements/kaleido.cpp | 4 +- soh/src/code/graph.c | 5 +- soh/src/code/z_play.c | 1 - soh/src/code/z_rcp.c | 20 -- soh/src/code/z_view.c | 8 - .../ovl_kaleido_scope/z_kaleido_collect.c | 150 ++++---- .../misc/ovl_kaleido_scope/z_kaleido_debug.c | 46 +-- .../ovl_kaleido_scope/z_kaleido_equipment.c | 100 +++--- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 92 ++--- .../ovl_kaleido_scope/z_kaleido_map_PAL.c | 210 +++++------ .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 336 +++++++++--------- .../misc/ovl_kaleido_scope/z_lmap_mark.c | 16 +- 16 files changed, 479 insertions(+), 520 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index 64d7026e1..8f902c5a8 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -1213,12 +1213,10 @@ Gfx* Gfx_SetupDL_66(Gfx* gfx); Gfx* func_800947AC(Gfx* gfx); void Gfx_SetupDL_42Opa(GraphicsContext* gfxCtx); void Gfx_SetupDL_42Overlay(GraphicsContext* gfxCtx); -void Gfx_SetupDL_42Kal(GraphicsContext* gfxCtx); void Gfx_SetupDL_27Xlu(GraphicsContext* gfxCtx); void Gfx_SetupDL_60NoCDXlu(GraphicsContext* gfxCtx); void Gfx_SetupDL_61Xlu(GraphicsContext* gfxCtx); void Gfx_SetupDL_56Ptr(Gfx** gfxp); -void Gfx_SetupDL_39Kal(GraphicsContext* gfxp); Gfx* Gfx_BranchTexScroll(Gfx** gfxp, u32 x, u32 y, s32 width, s32 height); Gfx* func_80094E78(GraphicsContext* gfxCtx, u32 x, u32 y); Gfx* Gfx_TexScroll(GraphicsContext* gfxCtx, u32 x, u32 y, s32 width, s32 height); diff --git a/soh/include/macros.h b/soh/include/macros.h index acff90f19..302e3755d 100644 --- a/soh/include/macros.h +++ b/soh/include/macros.h @@ -192,10 +192,6 @@ extern GraphicsContext* __gfxCtx; #define WORK_DISP __gfxCtx->work.p #define POLY_OPA_DISP __gfxCtx->polyOpa.p #define POLY_XLU_DISP __gfxCtx->polyXlu.p -// #region SOH [General] -// Upstream TODO: Document reasoning for these only existing in SoH -#define POLY_KAL_DISP __gfxCtx->polyKal.p -// #endregion #define OVERLAY_DISP __gfxCtx->overlay.p // __gfxCtx shouldn't be used directly. diff --git a/soh/include/z64.h b/soh/include/z64.h index 7cd99372d..882d3dd9a 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -97,7 +97,6 @@ typedef struct { /* 0x00000 */ u16 headMagic; // GFXPOOL_HEAD_MAGIC /* 0x00008 */ Gfx polyOpaBuffer[0x2FC0]; /* 0x0BF08 */ Gfx polyXluBuffer[0x1000]; - /* 0x0BF08 */ Gfx polyKalBuffer[0x1000]; /* 0x0FF08 */ Gfx overlayBuffer[0x800]; /* 0x11F08 */ Gfx workBuffer[0x100]; /* 0x11308 */ Gfx unusedBuffer[0x40]; @@ -144,7 +143,6 @@ typedef struct OSScTask { typedef struct GraphicsContext { /* 0x0000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0" /* 0x0004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1" - /* 0xXXX */ Gfx* polyKalBuffer; // Pointer to "Rome" /* 0x0008 */ char unk_008[0x08]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3" /* 0x0010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4" /* 0x0014 */ u32 unk_014; @@ -163,7 +161,6 @@ typedef struct GraphicsContext { /* 0x02A8 */ TwoHeadGfxArena overlay; // "Zelda 4" /* 0x02B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0" /* 0x02C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1" - /* 0x0XXX */ TwoHeadGfxArena polyKal; // When in Rome... /* 0x02D8 */ u32 gfxPoolIdx; /* 0x02DC */ u16* curFrameBuffer; /* 0x02E0 */ char unk_2E0[0x04]; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index e1457db4a..96453dff8 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1555,7 +1555,7 @@ typedef enum { // true // ``` // #### `args` - // - `**Gfx` (`&POLY_KAL_DISP`) + // - `**Gfx` (`&POLY_OPA_DISP`) VB_RENDER_YES_ON_CONTINUE_PROMPT, // #### `result` diff --git a/soh/soh/Enhancements/kaleido.cpp b/soh/soh/Enhancements/kaleido.cpp index 8d578168c..4cddeef43 100644 --- a/soh/soh/Enhancements/kaleido.cpp +++ b/soh/soh/Enhancements/kaleido.cpp @@ -242,7 +242,7 @@ namespace Rando { } mEntryDl.push_back(gsSPEndDisplayList()); - gSPDisplayList(POLY_KAL_DISP++, mEntryDl.data()); + gSPDisplayList(POLY_OPA_DISP++, mEntryDl.data()); CLOSE_DISPS(play->state.gfxCtx); } @@ -466,4 +466,4 @@ namespace Rando { void RandoKaleido_RegisterHooks() { GameInteractor::Instance->RegisterGameHook(RandoKaleido_UpdateMiscCollectibles); -} \ No newline at end of file +} diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index c55417d93..06d84aa3b 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -112,13 +112,11 @@ void Graph_InitTHGA(GraphicsContext* gfxCtx) { pool->tailMagic = GFXPOOL_TAIL_MAGIC; THGA_Ct(&gfxCtx->polyOpa, pool->polyOpaBuffer, sizeof(pool->polyOpaBuffer)); THGA_Ct(&gfxCtx->polyXlu, pool->polyXluBuffer, sizeof(pool->polyXluBuffer)); - THGA_Ct(&gfxCtx->polyKal, pool->polyKalBuffer, sizeof(pool->polyKalBuffer)); THGA_Ct(&gfxCtx->overlay, pool->overlayBuffer, sizeof(pool->overlayBuffer)); THGA_Ct(&gfxCtx->work, pool->workBuffer, sizeof(pool->workBuffer)); gfxCtx->polyOpaBuffer = pool->polyOpaBuffer; gfxCtx->polyXluBuffer = pool->polyXluBuffer; - gfxCtx->polyKalBuffer = pool->polyKalBuffer; gfxCtx->overlayBuffer = pool->overlayBuffer; gfxCtx->workBuffer = pool->workBuffer; @@ -335,8 +333,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { gSPBranchList(WORK_DISP++, gfxCtx->polyOpaBuffer); gSPBranchList(POLY_OPA_DISP++, gfxCtx->polyXluBuffer); - gSPBranchList(POLY_XLU_DISP++, gfxCtx->polyKalBuffer); - gSPBranchList(POLY_KAL_DISP++, gfxCtx->overlayBuffer); + gSPBranchList(POLY_XLU_DISP++, gfxCtx->overlayBuffer); gDPPipeSync(OVERLAY_DISP++); gDPFullSync(OVERLAY_DISP++); gSPEndDisplayList(OVERLAY_DISP++); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 8d35a33c4..0b6db75b1 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -1365,7 +1365,6 @@ void Play_Draw(PlayState* play) { if ((HREG(80) != 10) || (HREG(82) != 0)) { POLY_OPA_DISP = Play_SetFog(play, POLY_OPA_DISP); POLY_XLU_DISP = Play_SetFog(play, POLY_XLU_DISP); - POLY_KAL_DISP = Play_SetFog(play, POLY_KAL_DISP); func_800AA460(&play->view, play->view.fovy, play->view.zNear, play->lightCtx.fogFar); func_800AAA50(&play->view, 15); diff --git a/soh/src/code/z_rcp.c b/soh/src/code/z_rcp.c index 767772949..22e2fe2be 100644 --- a/soh/src/code/z_rcp.c +++ b/soh/src/code/z_rcp.c @@ -1187,14 +1187,6 @@ void Gfx_SetupDL_39Opa(GraphicsContext* gfxCtx) { CLOSE_DISPS(gfxCtx); } -void Gfx_SetupDL_39Kal(GraphicsContext* gfxCtx) { - OPEN_DISPS(gfxCtx); - - POLY_KAL_DISP = Gfx_SetupDL_39(POLY_KAL_DISP); - - CLOSE_DISPS(gfxCtx); -} - void Gfx_SetupDL_39Overlay(GraphicsContext* gfxCtx) { OPEN_DISPS(gfxCtx); @@ -1298,14 +1290,6 @@ void Gfx_SetupDL_42Opa(GraphicsContext* gfxCtx) { CLOSE_DISPS(gfxCtx); } -void Gfx_SetupDL_42Kal(GraphicsContext* gfxCtx) { - OPEN_DISPS(gfxCtx); - - gSPDisplayList(POLY_KAL_DISP++, sSetupDL[SETUPDL_42]); - - CLOSE_DISPS(gfxCtx); -} - void Gfx_SetupDL_42Overlay(GraphicsContext* gfxCtx) { OPEN_DISPS(gfxCtx); @@ -1469,26 +1453,22 @@ void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) { // Set up the RDP render state for rectangles in FILL mode gSPDisplayList(POLY_OPA_DISP++, sFillSetupDL); gSPDisplayList(POLY_XLU_DISP++, sFillSetupDL); - gSPDisplayList(POLY_KAL_DISP++, sFillSetupDL); gSPDisplayList(OVERLAY_DISP++, sFillSetupDL); // Set the scissor region to the full screen gDPSetScissor(POLY_OPA_DISP++, G_SC_NON_INTERLACE, 0, 0, gScreenWidth, gScreenHeight); gDPSetScissor(POLY_XLU_DISP++, G_SC_NON_INTERLACE, 0, 0, gScreenWidth, gScreenHeight); - gDPSetScissor(POLY_KAL_DISP++, G_SC_NON_INTERLACE, 0, 0, gScreenWidth, gScreenHeight); gDPSetScissor(OVERLAY_DISP++, G_SC_NON_INTERLACE, 0, 0, gScreenWidth, gScreenHeight); // Set up the framebuffer, primitives will be drawn here gDPSetColorImage(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gScreenWidth, gfxCtx->curFrameBuffer); gDPSetColorImage(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gScreenWidth, gfxCtx->curFrameBuffer); gDPSetColorImage(POLY_XLU_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gScreenWidth, gfxCtx->curFrameBuffer); - gDPSetColorImage(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gScreenWidth, gfxCtx->curFrameBuffer); gDPSetColorImage(OVERLAY_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gScreenWidth, gfxCtx->curFrameBuffer); // Set up the z-buffer gDPSetDepthImage(POLY_OPA_DISP++, gZBuffer); gDPSetDepthImage(POLY_XLU_DISP++, gZBuffer); - gDPSetDepthImage(POLY_KAL_DISP++, gZBuffer); gDPSetDepthImage(OVERLAY_DISP++, gZBuffer); if ((R_PAUSE_MENU_MODE < 2) && (gTrnsnUnkState < 2)) { diff --git a/soh/src/code/z_view.c b/soh/src/code/z_view.c index 2c18466f2..5799c23a8 100644 --- a/soh/src/code/z_view.c +++ b/soh/src/code/z_view.c @@ -188,8 +188,6 @@ void func_800AA550(View* view) { gDPSetScissor(POLY_OPA_DISP++, G_SC_NON_INTERLACE, ulx, uly, lrx, lry); gDPPipeSync(POLY_XLU_DISP++); gDPSetScissor(POLY_XLU_DISP++, G_SC_NON_INTERLACE, ulx, uly, lrx, lry); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetScissor(POLY_KAL_DISP++, G_SC_NON_INTERLACE, ulx, uly, lrx, lry); CLOSE_DISPS(gfxCtx); } @@ -312,7 +310,6 @@ s32 func_800AAA9C(View* view) { gSPViewport(POLY_OPA_DISP++, vp); gSPViewport(POLY_XLU_DISP++, vp); - gSPViewport(POLY_KAL_DISP++, vp); projection = Graph_Alloc(gfxCtx, sizeof(Mtx)); projectionFlipped = Graph_Alloc(gfxCtx, sizeof(Mtx)); @@ -451,8 +448,6 @@ s32 func_800AAA9C(View* view) { gSPMatrix(POLY_OPA_DISP++, projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPPerspNormalize(POLY_XLU_DISP++, view->normal); gSPMatrix(POLY_XLU_DISP++, projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPPerspNormalize(POLY_KAL_DISP++, view->normal); - gSPMatrix(POLY_KAL_DISP++, projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); Matrix_MtxFToMtx(viewingF.mf, viewing); @@ -478,7 +473,6 @@ s32 func_800AAA9C(View* view) { } gSPMatrix(POLY_OPA_DISP++, viewing, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); gSPMatrix(POLY_XLU_DISP++, viewing, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - gSPMatrix(POLY_KAL_DISP++, viewing, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); FrameInterpolation_RecordCloseChild(); CLOSE_DISPS(gfxCtx); @@ -502,7 +496,6 @@ s32 func_800AB0A8(View* view) { gSPViewport(POLY_OPA_DISP++, vp); gSPViewport(POLY_XLU_DISP++, vp); - gSPViewport(POLY_KAL_DISP++, vp); gSPViewport(OVERLAY_DISP++, vp); projection = Graph_Alloc(gfxCtx, sizeof(Mtx)); @@ -516,7 +509,6 @@ s32 func_800AB0A8(View* view) { gSPMatrix(POLY_OPA_DISP++, projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPMatrix(POLY_XLU_DISP++, projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(POLY_KAL_DISP++, projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); CLOSE_DISPS(gfxCtx); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c index e4f2e65ef..e7b04ed22 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c @@ -339,9 +339,9 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); D_8082A0FC--; @@ -377,10 +377,10 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { } if (CHECK_QUEST_ITEM(sp218)) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, D_8082A0D8[sp218], D_8082A0E4[sp218], D_8082A0F0[sp218], 0); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, D_8082A0D8[sp218], D_8082A0E4[sp218], D_8082A0F0[sp218], 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); KaleidoScope_DrawQuadTextureRGBA32(gfxCtx, gItemIcons[ITEM_MEDALLION_FOREST + sp218], 24, 24, 0); } @@ -393,11 +393,11 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); - gDPLoadTextureBlock(POLY_KAL_DISP++, gSongNoteTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 0, G_TX_NOMIRROR | G_TX_WRAP, + gDPLoadTextureBlock(POLY_OPA_DISP++, gSongNoteTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 24, 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); for (sp218 = 0; sp218 < QUEST_KOKIRI_EMERALD - QUEST_SONG_MINUET; sp218++, sp21A += 4) { @@ -416,31 +416,31 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->questVtx[sp21A + 2].v.ob[1] - 4; } - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_8082A164[sp218], D_8082A17C[sp218], D_8082A194[sp218], + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_8082A164[sp218], D_8082A17C[sp218], D_8082A194[sp218], pauseCtx->alpha); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); for (sp218 = 0; sp218 < 3; sp218++, sp21A += 4) { if (CHECK_QUEST_ITEM(sp218 + 0x12)) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); KaleidoScope_DrawQuadTextureRGBA32(gfxCtx, gItemIcons[ITEM_KOKIRI_EMERALD + sp218], 24, 24, 0); } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); for (sp218 = 0; sp218 < 3; sp218++, sp21A += 4) { if (CHECK_QUEST_ITEM(sp218 + 0x15)) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); KaleidoScope_DrawQuadTextureRGBA32(gfxCtx, gItemIcons[ITEM_STONE_OF_AGONY + sp218], 24, 24, 0); } } @@ -482,28 +482,28 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { } if ((gSaveContext.inventory.questItems >> 0x1C) != 0) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); if ((pauseCtx->state == 4) || (pauseCtx->state == 0x12)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_8082A070[0][0], D_8082A070[0][1], D_8082A070[0][2], + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_8082A070[0][0], D_8082A070[0][1], D_8082A070[0][2], pauseCtx->alpha); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_8082A104, D_8082A108, D_8082A10C, D_8082A110); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_8082A104, D_8082A108, D_8082A10C, D_8082A110); } - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 255); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8( - POLY_KAL_DISP, gItemIcons[0x79 + (((gSaveContext.inventory.questItems & 0xF0000000) & 0xF0000000) >> 0x1C)], + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( + POLY_OPA_DISP, gItemIcons[0x79 + (((gSaveContext.inventory.questItems & 0xF0000000) & 0xF0000000) >> 0x1C)], 48, 48, 0); } if (pauseCtx->state == 6) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); sp21A += 4; if ((pauseCtx->cursorSpecialPos == 0) && (sp216 >= 6) && (sp216 < 0x12)) { @@ -544,33 +544,33 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->questVtx[sp21A + 2].v.ob[1] = pauseCtx->questVtx[sp21A + 3].v.ob[1] = pauseCtx->questVtx[sp21A + 0].v.ob[1] - 12; - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); s16 Notes_alpha = D_8082A150[sp218]; if (D_8082A124[sp218] == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, Notes_alpha); } else { if (D_8082A124[sp218] == OCARINA_NOTE_D5) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_B4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_A4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, Notes_alpha); } else if (D_8082A124[sp218] == OCARINA_NOTE_F4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, Notes_alpha); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, Notes_alpha); } } - gDPSetEnvColor(POLY_KAL_DISP++, 10, 10, 10, 0); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gDPSetEnvColor(POLY_OPA_DISP++, 10, 10, 10, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, D_8082A130[D_8082A124[sp218]], G_IM_FMT_IA, G_IM_SIZ_8b, 16, + gDPLoadTextureBlock(POLY_OPA_DISP++, D_8082A130[D_8082A124[sp218]], G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 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); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } } } else if (((pauseCtx->unk_1E4 >= 4) && (pauseCtx->unk_1E4 <= 6)) || (pauseCtx->unk_1E4 == 8)) { @@ -584,38 +584,38 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->questVtx[sp21A + 2].v.ob[1] = pauseCtx->questVtx[sp21A + 3].v.ob[1] = pauseCtx->questVtx[sp21A + 0].v.ob[1] - 12; - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); if (pauseCtx->unk_1E4 == 8) { s16 Notes_alpha = 200; if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, Notes_alpha); } else { if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_D5) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_B4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_A4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_F4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, Notes_alpha); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, Notes_alpha); } } } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 150, 150, 150, 150); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 150, 150, 150); } - gDPSetEnvColor(POLY_KAL_DISP++, 10, 10, 10, 0); + gDPSetEnvColor(POLY_OPA_DISP++, 10, 10, 10, 0); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, D_8082A130[gOcarinaSongNotes[sp224].notesIdx[phi_s3]], G_IM_FMT_IA, + gDPLoadTextureBlock(POLY_OPA_DISP++, D_8082A130[gOcarinaSongNotes[sp224].notesIdx[phi_s3]], G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 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); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } if (pauseCtx->unk_1E4 != 8) { @@ -651,34 +651,34 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->questVtx[sp21A + 2].v.ob[1] = pauseCtx->questVtx[sp21A + 3].v.ob[1] = pauseCtx->questVtx[sp21A + 0].v.ob[1] - 12; - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); s16 Notes_alpha = D_8082A150[phi_s3]; if (D_8082A124[phi_s3] == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, Notes_alpha); } else { if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_D5) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_B4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_A4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, Notes_alpha); } else if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == OCARINA_NOTE_F4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, Notes_alpha); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, Notes_alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, Notes_alpha); } } - gDPSetEnvColor(POLY_KAL_DISP++, 10, 10, 10, 0); + gDPSetEnvColor(POLY_OPA_DISP++, 10, 10, 10, 0); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, D_8082A130[D_8082A124[phi_s3]], G_IM_FMT_IA, G_IM_SIZ_8b, 16, + gDPLoadTextureBlock(POLY_OPA_DISP++, D_8082A130[D_8082A124[phi_s3]], G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 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); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } if (pauseCtx->unk_1E4 == 4) { @@ -700,10 +700,10 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { } if (CHECK_QUEST_ITEM(QUEST_SKULL_TOKEN)) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); sp208[0] = sp208[1] = 0; sp208[2] = gSaveContext.inventory.gsTokens; @@ -718,25 +718,25 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { sp208[2] -= 10; } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->questVtx[164], 24, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[164], 24, 0); for (phi_s3 = 0, sp218 = 0, sp21A = 0; phi_s3 < 2; phi_s3++) { if (phi_s3 == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 0, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, pauseCtx->alpha); } else if (gSaveContext.inventory.gsTokens == 100) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 200, 50, 50, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 200, 50, 50, pauseCtx->alpha); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); } phi_s0 = 0; for (sp21A = 0; sp21A < 3; sp21A++, sp218 += 4) { if ((sp21A >= 2) || (sp208[sp21A] != 0) || (phi_s0 != 0)) { - gDPLoadTextureBlock(POLY_KAL_DISP++, digitTextures[sp208[sp21A]], G_IM_FMT_I, + gDPLoadTextureBlock(POLY_OPA_DISP++, digitTextures[sp208[sp21A]], G_IM_FMT_I, G_IM_SIZ_8b, 8, 16, 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); - gSP1Quadrangle(POLY_KAL_DISP++, sp218, sp218 + 2, sp218 + 3, sp218 + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, sp218, sp218 + 2, sp218 + 3, sp218 + 1, 0); phi_s0 = 1; } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_debug.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_debug.c index d2050bc80..d715c2211 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_debug.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_debug.c @@ -84,10 +84,10 @@ extern const char* digitTextures[]; void KaleidoScope_DrawDigit(PlayState* play, s32 digit, s32 rectLeft, s32 rectTop) { OPEN_DISPS(play->state.gfxCtx); - gDPLoadTextureBlock(POLY_KAL_DISP++, digitTextures[digit], G_IM_FMT_I, G_IM_SIZ_8b, 8, 16, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, digitTextures[digit], G_IM_FMT_I, G_IM_SIZ_8b, 8, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(POLY_KAL_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + 8) << 2, (rectTop + 16) << 2, + gSPTextureRectangle(POLY_OPA_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + 8) << 2, (rectTop + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); CLOSE_DISPS(play->state.gfxCtx); @@ -115,17 +115,17 @@ void KaleidoScope_DrawDebugEditor(PlayState* play) { pauseCtx->stickRelX = input->rel.stick_x; pauseCtx->stickRelY = input->rel.stick_y; - Gfx_SetupDL_39Kal(play->state.gfxCtx); + Gfx_SetupDL_39Opa(play->state.gfxCtx); - gDPSetRenderMode(POLY_KAL_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 0, 220); - gDPFillRectangle(POLY_KAL_DISP++, 24, 12, 298, 228); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, 220); + gDPFillRectangle(POLY_OPA_DISP++, 24, 12, 298, 228); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); - gfxRef = POLY_KAL_DISP; + gfxRef = POLY_OPA_DISP; gfx = Graph_GfxPlusOne(gfxRef); gSPDisplayList(OVERLAY_DISP++, gfx); @@ -133,17 +133,17 @@ void KaleidoScope_DrawDebugEditor(PlayState* play) { gSPEndDisplayList(gfx++); Graph_BranchDlist(gfxRef, gfx); - POLY_KAL_DISP = gfx; + POLY_OPA_DISP = gfx; - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 0, 0, 255); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 0, 0, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); // Current Health Quarter (X / 4) KaleidoScope_DrawDigit(play, (gSaveContext.health % 0x10) / 4, 194, 15); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); // Rupees spD8[0] = spD8[1] = spD8[2] = 0; @@ -622,19 +622,19 @@ void KaleidoScope_DrawDebugEditor(PlayState* play) { } // Draws a highlight on the selected section - gDPPipeSync(POLY_KAL_DISP++); - gDPSetRenderMode(POLY_KAL_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 200, 120); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 200, 120); if (curSection == 0) { - gDPFillRectangle(POLY_KAL_DISP++, sSectionPositions[curSection][0], sSectionPositions[curSection][1], + gDPFillRectangle(POLY_OPA_DISP++, sSectionPositions[curSection][0], sSectionPositions[curSection][1], sSectionPositions[curSection][0] + 45, sSectionPositions[curSection][1] + 16); } else if ((curSection >= 0x1B) || (curSection == 0x5B)) { - gDPFillRectangle(POLY_KAL_DISP++, sSectionPositions[curSection][0] - 2, sSectionPositions[curSection][1], + gDPFillRectangle(POLY_OPA_DISP++, sSectionPositions[curSection][0] - 2, sSectionPositions[curSection][1], sSectionPositions[curSection][0] + 14, sSectionPositions[curSection][1] + 16); } else { - gDPFillRectangle(POLY_KAL_DISP++, sSectionPositions[curSection][0] - 4, sSectionPositions[curSection][1], + gDPFillRectangle(POLY_OPA_DISP++, sSectionPositions[curSection][0] - 4, sSectionPositions[curSection][1], sSectionPositions[curSection][0] + 24, sSectionPositions[curSection][1] + 16); } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c index 5ed5bdbaa..9fa91cbdf 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c @@ -42,10 +42,10 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u OPEN_DISPS(play->state.gfxCtx); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_POINT); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); curTexture = source; remainingSize = width * height * 2; @@ -58,7 +58,7 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u vtxIndex = 80; - gDPSetTileCustom(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, textureHeight, 0, G_TX_NOMIRROR | G_TX_CLAMP, + gDPSetTileCustom(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, textureHeight, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); remainingSize -= textureSize; @@ -70,15 +70,15 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u pauseCtx->equipVtx[vtxIndex + 3].v.ob[1] -= 80; for (i = 0; i < textureCount; i++) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->equipVtx[vtxIndex], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->equipVtx[vtxIndex], 4, 0); - gDPSetTextureImage(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, curTexture); + gDPSetTextureImage(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, curTexture); - gDPLoadSync(POLY_KAL_DISP++); - gDPLoadTile(POLY_KAL_DISP++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2); + gDPLoadSync(POLY_OPA_DISP++); + gDPLoadTile(POLY_OPA_DISP++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2); - gDPSetTextureImageFB(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, gPauseLinkFrameBuffer); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gDPSetTextureImageFB(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, gPauseLinkFrameBuffer); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); curTexture += textureSize; @@ -87,7 +87,7 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u textureHeight = remainingSize / (s32)(width * 2); remainingSize -= textureSize; - gDPSetTileCustom(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, textureHeight, 0, + gDPSetTileCustom(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, textureHeight, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); } @@ -107,7 +107,7 @@ void KaleidoScope_DrawAButton(PlayState* play, Vtx* vtx, int16_t xTranslate, int Matrix_Push(); Matrix_Translate(xTranslate, yTranslate, 0, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); Color_RGB8 aButtonColor = { 0, 100, 255 }; if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) { aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor); @@ -115,13 +115,13 @@ void KaleidoScope_DrawAButton(PlayState* play, Vtx* vtx, int16_t xTranslate, int aButtonColor = (Color_RGB8){ 0, 255, 100 }; } - gSPVertex(POLY_KAL_DISP++, vtx, 4, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, pauseCtx->alpha); - gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, + gSPVertex(POLY_OPA_DISP++, vtx, 4, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, pauseCtx->alpha); + gDPLoadTextureBlock(POLY_OPA_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); Matrix_Pop(); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); CLOSE_DISPS(play->state.gfxCtx); } @@ -188,16 +188,16 @@ void KaleidoScope_DrawEquipment(PlayState* play) { OPEN_DISPS(play->state.gfxCtx); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, ZREG(39), ZREG(40), ZREG(41), pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, ZREG(43), ZREG(44), ZREG(45), 0); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, ZREG(39), ZREG(40), ZREG(41), pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, ZREG(43), ZREG(44), ZREG(45), 0); for (i = 0, j = 64; i < 4; i++, j += 4) { if (CUR_EQUIP_VALUE(i) != 0) { - gDPPipeSync(POLY_KAL_DISP++); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->equipVtx[j], 4, 0); + gDPPipeSync(POLY_OPA_DISP++); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->equipVtx[j], 4, 0); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, gEquippedItemOutlineTex, 32, 32, 0); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0); } } @@ -720,11 +720,11 @@ void KaleidoScope_DrawEquipment(PlayState* play) { Gfx_SetupDL_42Opa(play->state.gfxCtx); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); for (rowStart = 0, j = 0, temp = 0, i = 0; i < 4; i++, rowStart += 4, j += 16) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->equipVtx[j], 16, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->equipVtx[j], 16, 0); bool drawGreyItems = !CVarGetInteger(CVAR_CHEAT("TimelessEquipment"), 0); if (LINK_AGE_IN_YEARS == YEARS_CHILD) { point = CUR_UPG_VALUE(sChildUpgrades[i]); @@ -735,20 +735,20 @@ void KaleidoScope_DrawEquipment(PlayState* play) { ((sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_SILVER || (sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1) == ITEM_GAUNTLETS_GOLD)) || (CVarGetInteger(CVAR_ENHANCEMENT("ToggleStrength"), 0) && CVarGetInteger(CVAR_ENHANCEMENT("StrengthDisabled"), 0) && sChildUpgrades[i] == UPG_STRENGTH)) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); + gSPGrayscale(POLY_OPA_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[sChildUpgradeItemBases[i] + point - 1], 32, 32, 0); - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } } else { if ((i == 0) && (CUR_UPG_VALUE(sAdultUpgrades[i]) == 0)) { // If the player doesn't have the bow, load the current slingshot ammo upgrade instead. if (drawGreyItems) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); // Grey Out Slingshot Bullet Bags - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); // Grey Out Slingshot Bullet Bags + gSPGrayscale(POLY_OPA_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[sChildUpgradeItemBases[i] + CUR_UPG_VALUE(sChildUpgrades[i]) - 1], 32, 32, 0); - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } else if (CUR_UPG_VALUE(sAdultUpgrades[i]) != 0) { // Grey Out the Goron Bracelet when Not Randomized and Toggle Strength Option is off // Grey Out Strength Upgrades when Disabled and the Toggle Strength Option is on @@ -756,11 +756,11 @@ void KaleidoScope_DrawEquipment(PlayState* play) { (((sAdultUpgradeItemBases[i] + CUR_UPG_VALUE(sAdultUpgrades[i]) - 1) == ITEM_BRACELET && !(IS_RANDO) && !CVarGetInteger(CVAR_ENHANCEMENT("ToggleStrength"), 0)))) || (CVarGetInteger(CVAR_ENHANCEMENT("ToggleStrength"), 0) && CVarGetInteger(CVAR_ENHANCEMENT("StrengthDisabled"), 0) && sAdultUpgrades[i] == UPG_STRENGTH)) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); + gSPGrayscale(POLY_OPA_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[sAdultUpgradeItemBases[i] + CUR_UPG_VALUE(sAdultUpgrades[i]) - 1], 32, 32, 0); - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } } // Draw inventory screen icons @@ -769,8 +769,8 @@ void KaleidoScope_DrawEquipment(PlayState* play) { int itemId = ITEM_SWORD_KOKIRI + temp; bool age_restricted = !CHECK_AGE_REQ_ITEM(itemId); if (age_restricted) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); + gSPGrayscale(POLY_OPA_DISP++, true); } if (((u32)i == 0) && (k == 2) && (gSaveContext.bgsFlag != 0)) { KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIconSwordBiggoronTex, 32, 32, point); @@ -779,7 +779,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) { } else if (gBitFlags[bit] & gSaveContext.inventory.equipment) { KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[itemId], 32, 32, point); } - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } } @@ -808,19 +808,19 @@ void KaleidoScope_DrawEquipment(PlayState* play) { //KaleidoScope_ProcessPlayerPreRender(play); } - // gSPInvalidateTexCache(POLY_KAL_DISP++, 0); - gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItemSegment); - //gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItem24Segment); - gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->nameSegment); + // gSPInvalidateTexCache(POLY_OPA_DISP++, 0); + gSPInvalidateTexCache(POLY_OPA_DISP++, pauseCtx->iconItemSegment); + //gSPInvalidateTexCache(POLY_OPA_DISP++, pauseCtx->iconItem24Segment); + gSPInvalidateTexCache(POLY_OPA_DISP++, pauseCtx->nameSegment); - //gSPSegment(POLY_KAL_DISP++, 0x07, pauseCtx->playerSegment); - gSPSegment(POLY_KAL_DISP++, 0x08, pauseCtx->iconItemSegment); - gSPSegment(POLY_KAL_DISP++, 0x09, pauseCtx->iconItem24Segment); - gSPSegment(POLY_KAL_DISP++, 0x0A, pauseCtx->nameSegment); - gSPSegment(POLY_KAL_DISP++, 0x0B, play->interfaceCtx.mapSegment); - //gSPSegment(POLY_KAL_DISP++, 0x0C, pauseCtx->iconItemAltSegment); + //gSPSegment(POLY_OPA_DISP++, 0x07, pauseCtx->playerSegment); + gSPSegment(POLY_OPA_DISP++, 0x08, pauseCtx->iconItemSegment); + gSPSegment(POLY_OPA_DISP++, 0x09, pauseCtx->iconItem24Segment); + gSPSegment(POLY_OPA_DISP++, 0x0A, pauseCtx->nameSegment); + gSPSegment(POLY_OPA_DISP++, 0x0B, play->interfaceCtx.mapSegment); + //gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment); - Gfx_SetupDL_42Kal(play->state.gfxCtx); + Gfx_SetupDL_42Opa(play->state.gfxCtx); KaleidoScope_DrawEquipmentImage(play, pauseCtx->playerSegment, PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT); if (gUpgradeMasks[0]) {} diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index b0843b5ee..6e8a42803 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -52,22 +52,22 @@ void KaleidoScope_DrawAmmoCount(PauseContext* pauseCtx, GraphicsContext* gfxCtx, ammo = AMMO(item); - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); if (!CHECK_AGE_REQ_SLOT(SLOT(item))) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 100, 100, 100, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 100, 100, pauseCtx->alpha); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); if (ammo == 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 130, 130, 130, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 130, 130, 130, pauseCtx->alpha); } else if ((item == ITEM_BOMB && AMMO(item) == CUR_CAPACITY(UPG_BOMB_BAG)) || (item == ITEM_BOW && AMMO(item) == CUR_CAPACITY(UPG_QUIVER)) || (item == ITEM_SLINGSHOT && AMMO(item) == CUR_CAPACITY(UPG_BULLET_BAG)) || (item == ITEM_STICK && AMMO(item) == CUR_CAPACITY(UPG_STICKS)) || (item == ITEM_NUT && AMMO(item) == CUR_CAPACITY(UPG_NUTS)) || (item == ITEM_BOMBCHU && ammo == 50) || (item == ITEM_BEAN && ammo == 15)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 120, 255, 0, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 255, 0, pauseCtx->alpha); } } @@ -75,25 +75,25 @@ void KaleidoScope_DrawAmmoCount(PauseContext* pauseCtx, GraphicsContext* gfxCtx, ammo -= 10; } - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); if (i != 0) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->itemVtx[((CVarGetInteger(CVAR_ENHANCEMENT("BetterAmmoRendering"), 0) ? sAllAmmoVtxOffset[slot] : sAmmoVtxOffset[slot]) + 31) * 4], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[((CVarGetInteger(CVAR_ENHANCEMENT("BetterAmmoRendering"), 0) ? sAllAmmoVtxOffset[slot] : sAmmoVtxOffset[slot]) + 31) * 4], 4, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, ((u8*)_gAmmoDigit0Tex[i]), G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, ((u8*)_gAmmoDigit0Tex[i]), G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 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); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->itemVtx[((CVarGetInteger(CVAR_ENHANCEMENT("BetterAmmoRendering"), 0) ? sAllAmmoVtxOffset[slot] : sAmmoVtxOffset[slot]) + 32) * 4], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[((CVarGetInteger(CVAR_ENHANCEMENT("BetterAmmoRendering"), 0) ? sAllAmmoVtxOffset[slot] : sAmmoVtxOffset[slot]) + 32) * 4], 4, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, ((u8*)_gAmmoDigit0Tex[ammo]), G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, ((u8*)_gAmmoDigit0Tex[ammo]), G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 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); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); CLOSE_DISPS(gfxCtx); } @@ -195,7 +195,7 @@ void KaleidoScope_DrawItemCycleExtras(PlayState* play, u8 slot, u8 canCycle, u8 Matrix_Scale(finalScale, finalScale, 1.0f, MTXMODE_APPLY); } - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); // Render A button indicator when hovered and not cycling if (!isCycling && sSlotCycleActiveAnimTimer[slot] == 0 && pauseCtx->cursorSlot[PAUSE_ITEM] == slot && @@ -207,48 +207,48 @@ void KaleidoScope_DrawItemCycleExtras(PlayState* play, u8 slot, u8 canCycle, u8 aButtonColor = (Color_RGB8){ 0, 255, 100 }; } - gSPVertex(POLY_KAL_DISP++, sCycleAButtonVtx, 4, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, pauseCtx->alpha); - gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, + gSPVertex(POLY_OPA_DISP++, sCycleAButtonVtx, 4, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, pauseCtx->alpha); + gDPLoadTextureBlock(POLY_OPA_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } // Render a dark circle behind the extra items when cycling if (isCycling) { - gSPVertex(POLY_KAL_DISP++, sCycleCircleVtx, 8, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 0, pauseCtx->alpha * (1.0f - animScale)); - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, gPausePromptCursorTex, G_IM_FMT_I, 48, 48, 0, + gSPVertex(POLY_OPA_DISP++, sCycleCircleVtx, 8, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, pauseCtx->alpha * (1.0f - animScale)); + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gPausePromptCursorTex, G_IM_FMT_I, 48, 48, 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); if (showLeftItem) { - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } if (showRightItem) { - gSP1Quadrangle(POLY_KAL_DISP++, 4, 6, 7, 5, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0); } } // Render left and right items - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gSPVertex(POLY_KAL_DISP++, sCycleExtraItemVtx, 8, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gSPVertex(POLY_OPA_DISP++, sCycleExtraItemVtx, 8, 0); if (showLeftItem) { if (!CHECK_AGE_REQ_ITEM(leftItem)) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); + gSPGrayscale(POLY_OPA_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[leftItem], 32, 32, 0); - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } if (showRightItem) { if (!CHECK_AGE_REQ_ITEM(rightItem)) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); + gSPGrayscale(POLY_OPA_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[rightItem], 32, 32, 4); - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } Matrix_Pop(); @@ -431,7 +431,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { Gfx_SetupDL_42Opa(play->state.gfxCtx); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); pauseCtx->cursorColorSet = 0; pauseCtx->nameColorSet = 0; @@ -714,29 +714,29 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); for (i = 0, j = 24 * 4; i < ARRAY_COUNT(gSaveContext.equips.cButtonSlots); i++, j += 4) { if ((gSaveContext.equips.buttonItems[i + 1] != ITEM_NONE) && !((gSaveContext.equips.buttonItems[i + 1] >= ITEM_SHIELD_DEKU) && (gSaveContext.equips.buttonItems[i + 1] <= ITEM_BOOTS_HOVER))) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->itemVtx[j], 4, 0); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, gEquippedItemOutlineTex, 32, 32, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[j], 4, 0); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0); } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); for (i = j = 0; i < 24; i++, j += 4) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); if (gSaveContext.inventory.items[i] != ITEM_NONE) { if ((pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_ITEM) && (pauseCtx->cursorSpecialPos == 0)) { if (CHECK_AGE_REQ_SLOT(i)) { if ((sEquipState == 2) && (i == 3)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, magicArrowEffectsR[pauseCtx->equipTargetItem - 0xBF], + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, magicArrowEffectsR[pauseCtx->equipTargetItem - 0xBF], magicArrowEffectsG[pauseCtx->equipTargetItem - 0xBF], magicArrowEffectsB[pauseCtx->equipTargetItem - 0xBF], pauseCtx->alpha); @@ -767,16 +767,16 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { } } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->itemVtx[j + 0], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[j + 0], 4, 0); int itemId = gSaveContext.inventory.items[i]; bool not_acquired = !CHECK_AGE_REQ_ITEM(itemId); if (not_acquired) { - gDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255); - gSPGrayscale(POLY_KAL_DISP++, true); + gDPSetGrayscaleColor(POLY_OPA_DISP++, 109, 109, 109, 255); + gSPGrayscale(POLY_OPA_DISP++, true); } KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gItemIcons[itemId], 32, 32, 0); - gSPGrayscale(POLY_KAL_DISP++, false); + gSPGrayscale(POLY_OPA_DISP++, false); } } @@ -784,8 +784,8 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { KaleidoScope_DrawCursor(play, PAUSE_ITEM); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); u8 gBetterAmmoRendering = CVarGetInteger(CVAR_ENHANCEMENT("BetterAmmoRendering"), 0); @@ -1188,4 +1188,4 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { pauseCtx->equipAnimAlpha = 255; } } -} \ No newline at end of file +} diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c index 0730f6b12..3c37b565f 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c @@ -220,80 +220,80 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[68], 16, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[68], 16, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, dungeonTitleTexs[gSaveContext.mapIndex+(10*gSaveContext.language)], G_IM_FMT_IA, G_IM_SIZ_8b, 96, 16, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, dungeonTitleTexs[gSaveContext.mapIndex+(10*gSaveContext.language)], G_IM_FMT_IA, G_IM_SIZ_8b, 96, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); for (i = 0, j = 4; i < 3; i++, j += 4) { if (CHECK_DUNGEON_ITEM(i, gSaveContext.mapIndex)) { - gDPLoadTextureBlock(POLY_KAL_DISP++, dungeonItemTexs[i], G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 24, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, dungeonItemTexs[i], G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 24, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 200, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 200, pauseCtx->alpha); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[84], 32, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[84], 32, 0); for (i = j = 0; i < 8; i++, j += 4) { if ((gSaveContext.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) || CHECK_DUNGEON_ITEM(DUNGEON_MAP, gSaveContext.mapIndex)) { if (i != (pauseCtx->dungeonMapSlot - 3)) { - gDPLoadTextureBlock(POLY_KAL_DISP++, floorIconTexs[gMapData->floorID[interfaceCtx->unk_25A][i]], + gDPLoadTextureBlock(POLY_OPA_DISP++, floorIconTexs[gMapData->floorID[interfaceCtx->unk_25A][i]], G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } } } j = (pauseCtx->dungeonMapSlot - 3) * 4; - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 150, 150, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 150, 255, pauseCtx->alpha); - gDPLoadTextureBlock(POLY_KAL_DISP++, + gDPLoadTextureBlock(POLY_OPA_DISP++, floorIconTexs[gMapData->floorID[interfaceCtx->unk_25A][pauseCtx->dungeonMapSlot - 3]], G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); pauseCtx->mapPageVtx[124].v.ob[0] = pauseCtx->mapPageVtx[126].v.ob[0] = pauseCtx->mapPageVtx[124].v.ob[0] + 2; pauseCtx->mapPageVtx[125].v.ob[0] = pauseCtx->mapPageVtx[127].v.ob[0] = pauseCtx->mapPageVtx[124].v.ob[0] + 19; pauseCtx->mapPageVtx[124].v.ob[1] = pauseCtx->mapPageVtx[125].v.ob[1] = pauseCtx->mapPageVtx[124].v.ob[1] - 2; pauseCtx->mapPageVtx[126].v.ob[1] = pauseCtx->mapPageVtx[127].v.ob[1] = pauseCtx->mapPageVtx[124].v.ob[1] - 19; - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[116], 12, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[116], 12, 0); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); pauseCtx->mapPageVtx[116].v.ob[1] = pauseCtx->mapPageVtx[117].v.ob[1] = pauseCtx->offsetY - (VREG(30) * 14) + 49; pauseCtx->mapPageVtx[118].v.ob[1] = pauseCtx->mapPageVtx[119].v.ob[1] = pauseCtx->mapPageVtx[116].v.ob[1] - 16; - gDPLoadTextureBlock(POLY_KAL_DISP++, gDungeonMapLinkHeadTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, gDungeonMapLinkHeadTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); if (CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, gSaveContext.mapIndex) && (gMapData->skullFloorIconY[gSaveContext.mapIndex] != -99)) { @@ -301,14 +301,14 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { gMapData->skullFloorIconY[gSaveContext.mapIndex] + pauseCtx->offsetY; pauseCtx->mapPageVtx[122].v.ob[1] = pauseCtx->mapPageVtx[123].v.ob[1] = pauseCtx->mapPageVtx[120].v.ob[1] - 16; - gDPLoadTextureBlock(POLY_KAL_DISP++, gDungeonMapSkullTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, gDungeonMapSkullTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 4, 6, 7, 5, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0); } - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); if (GET_GS_FLAGS(gSaveContext.mapIndex) == gAreaGsFlags[gSaveContext.mapIndex]) { KaleidoScope_DrawQuadTextureRGBA32(gfxCtx, gQuestIconGoldSkulltulaTex, 24, 24, 8); @@ -339,13 +339,13 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_POINT); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); // Use a unique palette address per frame so the renderer/shader can cache all variations - gDPLoadTLUT_pal16(POLY_KAL_DISP++, 0, interfaceCtx->mapPalettesPulse[palettePulseIdx]); - gDPSetTextureLUT(POLY_KAL_DISP++, G_TT_RGBA16); + gDPLoadTLUT_pal16(POLY_OPA_DISP++, 0, interfaceCtx->mapPalettesPulse[palettePulseIdx]); + gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16); u8 mirroredWorld = CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0); u8 mirrorMode = mirroredWorld ? G_TX_MIRROR : G_TX_NOMIRROR; @@ -356,31 +356,31 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { } } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[60], 8, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 8, 0); - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, interfaceCtx->mapSegmentName[0], G_IM_FMT_CI, MAP_48x85_TEX_WIDTH, + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, interfaceCtx->mapSegmentName[0], G_IM_FMT_CI, MAP_48x85_TEX_WIDTH, MAP_48x85_TEX_HEIGHT, 0, G_TX_WRAP | mirrorMode, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); // Swap vertices to render left half on the right and vice-versa if (mirroredWorld) { - gSP1Quadrangle(POLY_KAL_DISP++, 4, 6, 7, 5, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0); } else { - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, interfaceCtx->mapSegmentName[1], G_IM_FMT_CI, MAP_48x85_TEX_WIDTH, + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, interfaceCtx->mapSegmentName[1], G_IM_FMT_CI, MAP_48x85_TEX_WIDTH, MAP_48x85_TEX_HEIGHT, 0, G_TX_WRAP | mirrorMode, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); if (mirroredWorld) { - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } else { - gSP1Quadrangle(POLY_KAL_DISP++, 4, 6, 7, 5, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_BILERP); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); CLOSE_DISPS(gfxCtx); } @@ -546,55 +546,55 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { // Use matrix scaling to flip the entire overworld map for mirror world if (mirroredWorld) { // Invert culling to counter act the matrix flip - gSPSetExtraGeometryMode(POLY_KAL_DISP++, G_EX_INVERT_CULLING); + gSPSetExtraGeometryMode(POLY_OPA_DISP++, G_EX_INVERT_CULLING); Matrix_Push(); Matrix_Scale(-1.0f, 1.0f, 1.0f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); Matrix_Pop(); } - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); if (HREG(15) == 0) { - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_POINT); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT); - gDPLoadTLUT_pal256(POLY_KAL_DISP++, gWorldMapImageTLUT); - gDPSetTextureLUT(POLY_KAL_DISP++, G_TT_RGBA16); + gDPLoadTLUT_pal256(POLY_OPA_DISP++, gWorldMapImageTLUT); + gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[188], 32, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[188], 32, 0); for (j = t = i = 0; i < 8; i++, t++, j += 4) { - gDPLoadMultiTile(POLY_KAL_DISP++, gWorldMapImageTex, 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 216, 128, 0, t * 9, 216 - 1, + gDPLoadMultiTile(POLY_OPA_DISP++, gWorldMapImageTex, 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 216, 128, 0, t * 9, 216 - 1, (t + 1) * 9 - 1, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gDPSetTileSize(POLY_KAL_DISP++, G_TX_RENDERTILE, 0, 0, (216 - 1) << G_TEXTURE_IMAGE_FRAC, (9 - 1) << G_TEXTURE_IMAGE_FRAC); + gDPSetTileSize(POLY_OPA_DISP++, G_TX_RENDERTILE, 0, 0, (216 - 1) << G_TEXTURE_IMAGE_FRAC, (9 - 1) << G_TEXTURE_IMAGE_FRAC); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[220], 28, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[220], 28, 0); for (j = i = 0; i < 6; i++, t++, j += 4) { - gDPLoadMultiTile(POLY_KAL_DISP++, gWorldMapImageTex, 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 216, 128, + gDPLoadMultiTile(POLY_OPA_DISP++, gWorldMapImageTex, 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 216, 128, 0, t * 9, 216 - 1, (t + 1) * 9 - 1, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gDPSetTileSize(POLY_KAL_DISP++, G_TX_RENDERTILE, 0, 0, (216 - 1) << G_TEXTURE_IMAGE_FRAC, + gDPSetTileSize(POLY_OPA_DISP++, G_TX_RENDERTILE, 0, 0, (216 - 1) << G_TEXTURE_IMAGE_FRAC, (9 - 1) << G_TEXTURE_IMAGE_FRAC); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } - gDPLoadMultiTile(POLY_KAL_DISP++, gWorldMapImageTex, 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 216, 128, 0, + gDPLoadMultiTile(POLY_OPA_DISP++, gWorldMapImageTex, 0, G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 216, 128, 0, t * 9, 216 - 1, (t * 9 + 2) - 1, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gDPSetTileSize(POLY_KAL_DISP++, G_TX_RENDERTILE, 0, 0, (216 - 1) << G_TEXTURE_IMAGE_FRAC, + gDPSetTileSize(POLY_OPA_DISP++, G_TX_RENDERTILE, 0, 0, (216 - 1) << G_TEXTURE_IMAGE_FRAC, (2 - 1) << G_TEXTURE_IMAGE_FRAC); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } else if (HREG(15) == 1) { - Gfx* gfx = POLY_KAL_DISP; + Gfx* gfx = POLY_OPA_DISP; gSPLoadUcodeL(gfx++, ucode_s2dex); @@ -603,7 +603,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { gSPLoadUcode(gfx++, SysUcode_GetUCode()); - POLY_KAL_DISP = gfx; + POLY_OPA_DISP = gfx; } if (HREG(15) == 2) { @@ -613,33 +613,33 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { } if (ZREG(38) == 0) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_BILERP); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); Gfx_SetupDL_42Opa(gfxCtx); - gDPSetCombineLERP(POLY_KAL_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, + gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 235, 235, 235, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 235, 235, 235, pauseCtx->alpha); for (k = 0; k < 15; k += 8) { - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[60 + k * 4], 32, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60 + k * 4], 32, 0); for (j = i = 0; i < 8; i++, j += 4) { if (!(gSaveContext.worldMapAreaData & gBitFlags[cloudFlagNums[k + i]])) { - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, cloudTexs[k + i], G_IM_FMT_I, D_8082AAEC[k + i], + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, cloudTexs[k + i], G_IM_FMT_I, D_8082AAEC[k + i], D_8082AB2C[k + i], 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } } } } if (gSaveContext.worldMapArea < 22) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_POINT); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_POINT); pauseCtx->mapPageVtx[172].v.ob[0] = pauseCtx->mapPageVtx[174].v.ob[0] = areaBoxPosX[((void)0, gSaveContext.worldMapArea)]; @@ -659,20 +659,20 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->mapPageVtx[174].v.tc[1] = pauseCtx->mapPageVtx[175].v.tc[1] = areaBoxHeights[((void)0, gSaveContext.worldMapArea)] << 5; - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[172], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[172], 4, 0); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 100, 255, 255, pauseCtx->alpha); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 255, 255, pauseCtx->alpha); - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, areaBoxTexs[((void)0, (gSaveContext.worldMapArea))], G_IM_FMT_IA, + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, areaBoxTexs[((void)0, (gSaveContext.worldMapArea))], G_IM_FMT_IA, areaBoxWidths[((void)0, (gSaveContext.worldMapArea))], areaBoxHeights[((void)0, (gSaveContext.worldMapArea))], 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_BILERP); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); } stepR = ABS(pointPulsePrimColor[0] - pointPrimColors[pointPulseStage][0]) / pointPulseTimer; @@ -727,29 +727,29 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { Gfx_SetupDL_42Opa(gfxCtx); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPLoadTextureBlock(POLY_KAL_DISP++, gWorldMapDotTex, G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, G_TX_WRAP | G_TX_NOMIRROR, + gDPLoadTextureBlock(POLY_OPA_DISP++, gWorldMapDotTex, G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); for (j = t = i = 0; i < 12; i++, t++, j += 4) { if (pauseCtx->worldMapPoints[i] != 0) { - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); if (pauseCtx->worldMapPoints[i] == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, pointPrimColors[0][0], pointPrimColors[0][1], + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, pointPrimColors[0][0], pointPrimColors[0][1], pointPrimColors[0][2], pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, pointEnvColors[0][0], pointEnvColors[0][1], pointEnvColors[0][2], 0); + gDPSetEnvColor(POLY_OPA_DISP++, pointEnvColors[0][0], pointEnvColors[0][1], pointEnvColors[0][2], 0); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, pointPulsePrimColor[0], pointPulsePrimColor[1], + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, pointPulsePrimColor[0], pointPulsePrimColor[1], pointPulsePrimColor[2], pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, pointPulseEnvColor[0], pointPulseEnvColor[1], pointPulseEnvColor[2], 0); + gDPSetEnvColor(POLY_OPA_DISP++, pointPulseEnvColor[0], pointPulseEnvColor[1], pointPulseEnvColor[2], 0); } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[124 + i * 4], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[124 + i * 4], 4, 0); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } } @@ -768,47 +768,47 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { } } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[176], 16, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[176], 16, 0); if (pauseCtx->tradeQuestLocation != 0xFF) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, pointPulsePrimColor[0], 0, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, pointPulsePrimColor[0], 0, pauseCtx->alpha); - gDPLoadTextureBlock(POLY_KAL_DISP++, gWorldMapArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, gWorldMapArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } if (gSaveContext.worldMapArea < 22) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 150, 255, 255, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 255, 255, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, pauseCtx->nameSegment + 0x400, 80, 32, 4); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, pauseCtx->nameSegment + 0x400, 80, 32, 4); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 0, pauseCtx->alpha); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, pauseCtx->alpha); - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, currentPosTitleTexs[gSaveContext.language], G_IM_FMT_I, 64, 8, 0, + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, currentPosTitleTexs[gSaveContext.language], G_IM_FMT_I, 64, 8, 0, G_TX_WRAP | mirrorMode, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 8, 10, 11, 9, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0); - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); if (mirroredWorld) { // Revert the inversion - gSPClearExtraGeometryMode(POLY_KAL_DISP++, G_EX_INVERT_CULLING); + gSPClearExtraGeometryMode(POLY_OPA_DISP++, G_EX_INVERT_CULLING); } CLOSE_DISPS(gfxCtx); 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 97ac28ca4..f6dab7003 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 @@ -997,10 +997,10 @@ void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, u16 specialPos) { void KaleidoScope_DrawQuadTextureRGBA32(GraphicsContext* gfxCtx, void* texture, u16 width, u16 height, u16 point) { OPEN_DISPS(gfxCtx); - gDPLoadTextureBlock(POLY_KAL_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, + gDPLoadTextureBlock(POLY_OPA_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 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); - gSP1Quadrangle(POLY_KAL_DISP++, point, point + 2, point + 3, point + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0); CLOSE_DISPS(gfxCtx); } @@ -1147,25 +1147,25 @@ void KaleidoScope_DrawCursor(PlayState* play, u16 pageIndex) { s16 i; s16 j; - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, sCursorColors[pauseCtx->cursorColorSet >> 2].r, + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorColors[pauseCtx->cursorColorSet >> 2].r, sCursorColors[pauseCtx->cursorColorSet >> 2].g, sCursorColors[pauseCtx->cursorColorSet >> 2].b, 255); - gDPSetEnvColor(POLY_KAL_DISP++, D_8082AB8C, D_8082AB90, D_8082AB94, 255); - gSPVertex(POLY_KAL_DISP++, pauseCtx->cursorVtx, 16, 0); + gDPSetEnvColor(POLY_OPA_DISP++, D_8082AB8C, D_8082AB90, D_8082AB94, 255); + gSPVertex(POLY_OPA_DISP++, pauseCtx->cursorVtx, 16, 0); for (i = j = 0; i < 4; i++, j += 4) { - gDPLoadTextureBlock_4b(POLY_KAL_DISP++, sCursorTexs[i], G_IM_FMT_IA, 16, 16, 0, + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, sCursorTexs[i], G_IM_FMT_IA, 16, 16, 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); - gSP1Quadrangle(POLY_KAL_DISP++, j, j + 2, j + 3, j + 1, 0); + gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0); } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); } CLOSE_DISPS(play->state.gfxCtx); @@ -1381,78 +1381,78 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateX(-pauseCtx->unk_1F4 / 100.0f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->itemPageVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sSelectItemTexs[gSaveContext.language]); KaleidoScope_DrawItemSelect(play); } if (pauseCtx->pageIndex != PAUSE_EQUIP) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); Matrix_Translate(-(f32)WREG(3) / 100.0f, (f32)WREG(2) / 100.0f, 0.0f, MTXMODE_NEW); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateZ(pauseCtx->unk_1F8 / 100.0f, MTXMODE_APPLY); Matrix_RotateY(1.57f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->equipPageVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->equipPageVtx, sEquipmentTexs[gSaveContext.language]); KaleidoScope_DrawEquipment(play); } if (pauseCtx->pageIndex != PAUSE_QUEST) { - gDPPipeSync(POLY_KAL_DISP++); - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_BILERP); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); Matrix_Translate(0.0f, (f32)WREG(2) / 100.0f, (f32)WREG(3) / 100.0f, MTXMODE_NEW); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateX(pauseCtx->unk_200 / 100.0f, MTXMODE_APPLY); Matrix_RotateY(3.14f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (pauseCtx->randoQuestMode) { - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->saveVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->saveVtx, sSaveTexs[gSaveContext.language]); RandoKaleido_DrawMiscCollectibles(play); } else { - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->questPageVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestStatusTexs[gSaveContext.language]); KaleidoScope_DrawQuestStatus(play, gfxCtx); } } if (pauseCtx->pageIndex != PAUSE_MAP) { - gDPPipeSync(POLY_KAL_DISP++); + gDPPipeSync(POLY_OPA_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); Matrix_Translate((f32)WREG(3) / 100.0f, (f32)WREG(2) / 100.0f, 0.0f, MTXMODE_NEW); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateZ(-pauseCtx->unk_1FC / 100.0f, MTXMODE_APPLY); Matrix_RotateY(-1.57f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - POLY_KAL_DISP = - KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->mapPageVtx, sMapTexs[gSaveContext.language]); + POLY_OPA_DISP = + KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapTexs[gSaveContext.language]); if (sInDungeonScene) { KaleidoScope_DrawDungeonMap(play, gfxCtx); Gfx_SetupDL_42Opa(gfxCtx); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, gSaveContext.mapIndex)) { PauseMapMark_Draw(play); @@ -1462,8 +1462,8 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); switch (pauseCtx->pageIndex) { case PAUSE_ITEM: @@ -1471,10 +1471,10 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateX(-pauseCtx->unk_1F4 / 100.0f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->itemPageVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sSelectItemTexs[gSaveContext.language]); KaleidoScope_DrawItemSelect(play); @@ -1486,17 +1486,17 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { Matrix_RotateZ(-pauseCtx->unk_1FC / 100.0f, MTXMODE_APPLY); Matrix_RotateY(-1.57f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - POLY_KAL_DISP = - KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->mapPageVtx, sMapTexs[gSaveContext.language]); + POLY_OPA_DISP = + KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapTexs[gSaveContext.language]); if (sInDungeonScene) { KaleidoScope_DrawDungeonMap(play, gfxCtx); Gfx_SetupDL_42Opa(gfxCtx); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); if (pauseCtx->cursorSpecialPos == 0) { KaleidoScope_DrawCursor(play, PAUSE_MAP); @@ -1511,22 +1511,22 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { break; case PAUSE_QUEST: - gDPSetTextureFilter(POLY_KAL_DISP++, G_TF_BILERP); + gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP); Matrix_Translate(0.0f, (f32)WREG(2) / 100.0f, (f32)WREG(3) / 100.0f, MTXMODE_NEW); Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY); Matrix_RotateX(pauseCtx->unk_200 / 100.0f, MTXMODE_APPLY); Matrix_RotateY(3.14f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (pauseCtx->randoQuestMode) { - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->saveVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->saveVtx, sSaveTexs[gSaveContext.language]); RandoKaleido_DrawMiscCollectibles(play); } else { - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->questPageVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestStatusTexs[gSaveContext.language]); KaleidoScope_DrawQuestStatus(play, gfxCtx); } @@ -1542,10 +1542,10 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { Matrix_RotateZ(pauseCtx->unk_1F8 / 100.0f, MTXMODE_APPLY); Matrix_RotateY(1.57f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->equipPageVtx, + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->equipPageVtx, sEquipmentTexs[gSaveContext.language]); KaleidoScope_DrawEquipment(play); @@ -1562,7 +1562,7 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { if ((pauseCtx->state == 7) || ((pauseCtx->state >= 8) && (pauseCtx->state < 0x12))) { KaleidoScope_UpdatePrompt(play); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); if (!pauseCtx->pageIndex) { // pageIndex == PAUSE_ITEM pauseCtx->unk_1F4 = pauseCtx->unk_204 + 314.0f; @@ -1593,81 +1593,81 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) { Matrix_RotateY(1.57f, MTXMODE_APPLY); } - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if ((pauseCtx->state >= 8) && (pauseCtx->state <= 0x11)) { - POLY_KAL_DISP = KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->saveVtx, sGameOverTexs); + POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->saveVtx, sGameOverTexs); } else { - POLY_KAL_DISP = - KaleidoScope_DrawPageSections(POLY_KAL_DISP, pauseCtx->saveVtx, sSaveTexs[gSaveContext.language]); + POLY_OPA_DISP = + KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->saveVtx, sSaveTexs[gSaveContext.language]); } - gSPVertex(POLY_KAL_DISP++, &pauseCtx->saveVtx[60], 32, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->saveVtx[60], 32, 0); if (((pauseCtx->state == 7) && (pauseCtx->unk_1EC < 4)) || (pauseCtx->state == 0xE)) { - POLY_KAL_DISP = - KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sSavePromptTexs[gSaveContext.language], 152, 16, 0); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sSavePromptTexs[gSaveContext.language], 152, 16, 0); - gDPSetCombineLERP(POLY_KAL_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, + gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, VREG(61)); //Save prompt cursor colour + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, VREG(61)); //Save prompt cursor colour if (pauseCtx->promptChoice == 0) { - gSPDisplayList(POLY_KAL_DISP++, gPromptCursorLeftDL); + gSPDisplayList(POLY_OPA_DISP++, gPromptCursorLeftDL); } else { - gSPDisplayList(POLY_KAL_DISP++, gPromptCursorRightDL); + gSPDisplayList(POLY_OPA_DISP++, gPromptCursorRightDL); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - POLY_KAL_DISP = - KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sPromptChoiceTexs[gSaveContext.language][0], 48, 16, 12); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sPromptChoiceTexs[gSaveContext.language][0], 48, 16, 12); - POLY_KAL_DISP = - KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sPromptChoiceTexs[gSaveContext.language][1], 48, 16, 16); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sPromptChoiceTexs[gSaveContext.language][1], 48, 16, 16); } else if (((pauseCtx->state == 7 && pauseCtx->unk_1EC >= 4) || pauseCtx->state == 0xF) && !CVarGetInteger(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 0)) { - POLY_KAL_DISP = - KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sSaveConfirmationTexs[gSaveContext.language], 152, 16, 0); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sSaveConfirmationTexs[gSaveContext.language], 152, 16, 0); } else if ((pauseCtx->state != 7) || (pauseCtx->unk_1EC < 4)) { if ((pauseCtx->state != 0xF) && ((pauseCtx->state == 0x10) || (pauseCtx->state == 0x11))) { - POLY_KAL_DISP = - KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sContinuePromptTexs[gSaveContext.language], 152, 16, 0); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sContinuePromptTexs[gSaveContext.language], 152, 16, 0); - gDPSetCombineLERP(POLY_KAL_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, + gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, VREG(61)); //Continue prompt cursor colour + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, VREG(61)); //Continue prompt cursor colour if (pauseCtx->promptChoice == 0) { - gSPDisplayList(POLY_KAL_DISP++, gPromptCursorLeftDL); + gSPDisplayList(POLY_OPA_DISP++, gPromptCursorLeftDL); } else { - gSPDisplayList(POLY_KAL_DISP++, gPromptCursorRightDL); + gSPDisplayList(POLY_OPA_DISP++, gPromptCursorRightDL); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA, G_CC_MODULATEIA); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - if (GameInteractor_Should(VB_RENDER_YES_ON_CONTINUE_PROMPT, true, &POLY_KAL_DISP)) { - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8( - POLY_KAL_DISP, sPromptChoiceTexs[gSaveContext.language][0], 48, 16, 12); + if (GameInteractor_Should(VB_RENDER_YES_ON_CONTINUE_PROMPT, true, &POLY_OPA_DISP)) { + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( + POLY_OPA_DISP, sPromptChoiceTexs[gSaveContext.language][0], 48, 16, 12); } - POLY_KAL_DISP = - KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sPromptChoiceTexs[gSaveContext.language][1], 48, 16, 16); + POLY_OPA_DISP = + KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sPromptChoiceTexs[gSaveContext.language][1], 48, 16, 16); } } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); if ((pauseCtx->state != 0x10) && (pauseCtx->state != 0x11)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 0, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 0, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); } } @@ -1882,49 +1882,49 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] = pauseCtx->infoPanelVtx[15].v.tc[1] = 0x400; - gDPSetCombineMode(POLY_KAL_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW); Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); const Color_RGBA8 namePanelColor = CVarGetColor(CVAR_COSMETIC("Kaleido.NamePanel.Value"), (Color_RGBA8){90,100,130,255}); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, namePanelColor.r, namePanelColor.g, namePanelColor.b, namePanelColor.a); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, namePanelColor.r, namePanelColor.g, namePanelColor.b, namePanelColor.a); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0); - gSPDisplayList(POLY_KAL_DISP++, gItemNamePanelDL); + gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL); if (CVarGetInteger(CVAR_ENHANCEMENT("FixMenuLR"), 0) == 0) { // Restore the misplace gDPSetPrimColor - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 90, 100, 130, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 90, 100, 130, 255); } if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->unk_1E4 == 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); } else { if (CVarGetInteger(CVAR_ENHANCEMENT("FixMenuLR"), 0) != 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 210, 255, 255); } } - gSPDisplayList(POLY_KAL_DISP++, gLButtonIconDL); + gSPDisplayList(POLY_OPA_DISP++, gLButtonIconDL); if (CVarGetInteger(CVAR_ENHANCEMENT("FixMenuLR"), 0) == 0) { //Restore the misplace gDPSetPrimColor - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 210, 255, 255); } if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->unk_1E4 == 0)) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6); } else { if (CVarGetInteger(CVAR_ENHANCEMENT("FixMenuLR"), 0) != 0) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 210, 255, 255); } } - gSPDisplayList(POLY_KAL_DISP++, gRButtonIconDL); + gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL); if (pauseCtx->cursorSpecialPos != 0) { j = (pauseCtx->cursorSpecialPos * 4) - 32; @@ -1941,10 +1941,10 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 0x200; - gDPPipeSync(POLY_KAL_DISP++); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetEnvColor(POLY_KAL_DISP++, 20, 30, 40, 0); + gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0); if ((pauseCtx->state == 6) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) && (pauseCtx->nameDisplayTimer < WREG(89)) && (!pauseCtx->unk_1E4 || (pauseCtx->unk_1E4 == 2) || ((pauseCtx->unk_1E4 >= 4) && (pauseCtx->unk_1E4 <= 7)) || @@ -1959,15 +1959,15 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x1000; - gSPVertex(POLY_KAL_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0); if (pauseCtx->nameColorSet == 1) { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 70, 70, 70, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255); } else { - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); } - POLY_KAL_DISP = KaleidoScope_QuadTextureIA4(POLY_KAL_DISP, pauseCtx->nameSegment, 128, 16, 0); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA4(POLY_OPA_DISP, pauseCtx->nameSegment, 128, 16, 0); } if (pauseCtx->pageIndex == PAUSE_MAP && CVarGetInteger(CVAR_DEVELOPER_TOOLS("SkulltulaDebugEnabled"), 0) != 0) { @@ -1999,13 +1999,13 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[25].v.tc[0] = pauseCtx->infoPanelVtx[27].v.tc[0] = 0x300; - gDPPipeSync(POLY_KAL_DISP++); - gSPVertex(POLY_KAL_DISP++, &pauseCtx->infoPanelVtx[24], 4, 0); + gDPPipeSync(POLY_OPA_DISP++); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[24], 4, 0); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); KaleidoScope_DrawQuadTextureRGBA32(play->state.gfxCtx, gQuestIconGoldSkulltulaTex, 24, 24, 0); } @@ -2018,7 +2018,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[22].v.tc[1] = pauseCtx->infoPanelVtx[23].v.tc[1] = 0x200; - gSPVertex(POLY_KAL_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0); + gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0); if (pauseCtx->state == 7) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = WREG(61 + gSaveContext.language); @@ -2036,15 +2036,15 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = D_8082ADE0[gSaveContext.language] << 5; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, 255); - //gSPDisplayList(POLY_KAL_DISP++, gAButtonIconDL);//This is changed to load the texture only so we can prim color it. - gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, 255); + //gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);//This is changed to load the texture only so we can prim color it. + gDPLoadTextureBlock(POLY_OPA_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sToDecideTextures[gSaveContext.language], + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sToDecideTextures[gSaveContext.language], D_8082ADE0[gSaveContext.language], 16, 4); } else if (pauseCtx->cursorSpecialPos != 0) { if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0)) { @@ -2055,15 +2055,15 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 0x1000; - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 200, 0, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 200, 0, 255); if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8( - POLY_KAL_DISP, D_8082AD78[pauseCtx->pageIndex][gSaveContext.language], 128, 16, 0); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( + POLY_OPA_DISP, D_8082AD78[pauseCtx->pageIndex][gSaveContext.language], 128, 16, 0); } else { - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8( - POLY_KAL_DISP, D_8082ADA8[pauseCtx->pageIndex][gSaveContext.language], 128, 16, 0); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8( + POLY_OPA_DISP, D_8082ADA8[pauseCtx->pageIndex][gSaveContext.language], 128, 16, 0); } } } else { @@ -2106,25 +2106,25 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { int width_crop = icon_w_crop * 1.0f; //Adjust Width with scale int height_factor = (1 << 10) * icon_h / height; int width_factor = (1 << 10) * icon_w / width; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cButtonsColor.r, cButtonsColor.g, cButtonsColor.b, 255); for (s16 i=0; i < 3; i++) { if (i == 0) { icon_x_offset = width_crop*3-3; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, 255); } else if (i == 1) { icon_x_offset = width_crop*2-3; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, 255); } else if (i == 2) { icon_x_offset = width_crop; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, 255); } - gDPLoadTextureBlock(POLY_KAL_DISP++, gCBtnSymbolsTex, G_IM_FMT_IA, G_IM_SIZ_8b, icon_w, icon_h, 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); - //gSPScisTextureRectangle(POLY_KAL_DISP++,PosX << 2, PosY << 2, (PosX + icon_x_offset) << 2, (PosY + height) << 2, G_TX_RENDERTILE, 0, 0, width_factor, height_factor); - gSPWideTextureRectangle(POLY_KAL_DISP++, PosX << 2, PosY << 2, (PosX + icon_x_offset) << 2, (PosY + height) << 2, G_TX_WRAP, 0, 0, width_factor, height_factor); + gDPLoadTextureBlock(POLY_OPA_DISP++, gCBtnSymbolsTex, G_IM_FMT_IA, G_IM_SIZ_8b, icon_w, icon_h, 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); + //gSPScisTextureRectangle(POLY_OPA_DISP++,PosX << 2, PosY << 2, (PosX + icon_x_offset) << 2, (PosY + height) << 2, G_TX_RENDERTILE, 0, 0, width_factor, height_factor); + gSPWideTextureRectangle(POLY_OPA_DISP++, PosX << 2, PosY << 2, (PosX + icon_x_offset) << 2, (PosY + height) << 2, G_TX_WRAP, 0, 0, width_factor, height_factor); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sToEquipTextures[gSaveContext.language], + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sToEquipTextures[gSaveContext.language], D_8082ADD8[gSaveContext.language], 16, 4); } else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) { @@ -2153,15 +2153,15 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = D_8082ADE8[gSaveContext.language] << 5; - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, 255); - //gSPDisplayList(POLY_KAL_DISP++, gAButtonIconDL); - gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, 255); + //gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); + gDPLoadTextureBlock(POLY_OPA_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sPlayMelodyTextures[gSaveContext.language], + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sPlayMelodyTextures[gSaveContext.language], D_8082ADE8[gSaveContext.language], 16, 4); } } else if (pauseCtx->pageIndex == PAUSE_EQUIP) { @@ -2186,15 +2186,15 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { return; } - //gSPDisplayList(POLY_KAL_DISP++, gAButtonIconDL); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, 255); - gDPLoadTextureBlock(POLY_KAL_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); - gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0); + //gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, aButtonColor.r, aButtonColor.g, aButtonColor.b, 255); + gDPLoadTextureBlock(POLY_OPA_DISP++, gABtnSymbolTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); - POLY_KAL_DISP = KaleidoScope_QuadTextureIA8(POLY_KAL_DISP, sToEquipTextures[gSaveContext.language], + POLY_OPA_DISP = KaleidoScope_QuadTextureIA8(POLY_OPA_DISP, sToEquipTextures[gSaveContext.language], D_8082ADD8[gSaveContext.language], 16, 4); } } @@ -3188,39 +3188,39 @@ void KaleidoScope_DrawGameOver(PlayState* play) { Gfx_SetupDL_39Opa(gfxCtx); - gDPSetCycleType(POLY_KAL_DISP++, G_CYC_2CYCLE); - gDPSetRenderMode(POLY_KAL_DISP++, G_RM_PASS, G_RM_XLU_SURF2); - gDPSetCombineLERP(POLY_KAL_DISP++, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, + gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2); + gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 80, D_8082AB8C, D_8082AB90, D_8082AB94, D_8082AB98); - gDPSetEnvColor(POLY_KAL_DISP++, D_8082AB9C, D_8082ABA0, D_8082ABA4, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 80, D_8082AB8C, D_8082AB90, D_8082AB94, D_8082AB98); + gDPSetEnvColor(POLY_OPA_DISP++, D_8082AB9C, D_8082ABA0, D_8082ABA4, 255); VREG(89) -= 2; - gDPLoadMultiBlock(POLY_KAL_DISP++, gGameOverP1Tex, 0, 0, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, + gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverP1Tex, 0, 0, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gDPLoadMultiBlock(POLY_KAL_DISP++, gGameOverMaskTex, 256, 1, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, + gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverMaskTex, 256, 1, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, 5, G_TX_NOLOD, G_TX_NOLOD); - gDPSetTileSize(POLY_KAL_DISP++, 1, 0, VREG(89) & 0x7F, 252, (VREG(89) & 0x7F) + 0x7C); + gDPSetTileSize(POLY_OPA_DISP++, 1, 0, VREG(89) & 0x7F, 252, (VREG(89) & 0x7F) + 0x7C); - gSPTextureRectangle(POLY_KAL_DISP++, VREG(87) << 2, VREG(88) << 2, (VREG(87) + 64) << 2, (VREG(88) + 32) << 2, + gSPTextureRectangle(POLY_OPA_DISP++, VREG(87) << 2, VREG(88) << 2, (VREG(87) + 64) << 2, (VREG(88) + 32) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - gDPLoadMultiBlock(POLY_KAL_DISP++, gGameOverP2Tex, 0, 0, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, + gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverP2Tex, 0, 0, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(POLY_KAL_DISP++, (VREG(87) + 64) << 2, VREG(88) << 2, (VREG(87) + 128) << 2, + gSPTextureRectangle(POLY_OPA_DISP++, (VREG(87) + 64) << 2, VREG(88) << 2, (VREG(87) + 128) << 2, (VREG(88) + 32) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - gDPLoadMultiBlock(POLY_KAL_DISP++, gGameOverP3Tex, 0, 0, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, + gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverP3Tex, 0, 0, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(POLY_KAL_DISP++, (VREG(87) + 128) << 2, VREG(88) << 2, (VREG(87) + 192) << 2, + gSPTextureRectangle(POLY_OPA_DISP++, (VREG(87) + 128) << 2, VREG(88) << 2, (VREG(87) + 192) << 2, (VREG(88) + 32) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); CLOSE_DISPS(gfxCtx); @@ -3236,24 +3236,24 @@ void KaleidoScope_Draw(PlayState* play) { pauseCtx->stickRelX = input->rel.stick_x; pauseCtx->stickRelY = input->rel.stick_y; - //gSPSegment(POLY_KAL_DISP++, 0x02, interfaceCtx->parameterSegment); - gSPSegment(POLY_KAL_DISP++, 0x07, pauseCtx->playerSegment); - //gSPSegment(POLY_KAL_DISP++, 0x08, pauseCtx->iconItemSegment); - //gSPSegment(POLY_KAL_DISP++, 0x09, pauseCtx->iconItem24Segment); - gSPSegment(POLY_KAL_DISP++, 0x0A, pauseCtx->nameSegment); - //gSPSegment(POLY_KAL_DISP++, 0x0C, pauseCtx->iconItemAltSegment); - //gSPSegment(POLY_KAL_DISP++, 0x0D, pauseCtx->iconItemLangSegment); + //gSPSegment(POLY_OPA_DISP++, 0x02, interfaceCtx->parameterSegment); + gSPSegment(POLY_OPA_DISP++, 0x07, pauseCtx->playerSegment); + //gSPSegment(POLY_OPA_DISP++, 0x08, pauseCtx->iconItemSegment); + //gSPSegment(POLY_OPA_DISP++, 0x09, pauseCtx->iconItem24Segment); + gSPSegment(POLY_OPA_DISP++, 0x0A, pauseCtx->nameSegment); + //gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment); + //gSPSegment(POLY_OPA_DISP++, 0x0D, pauseCtx->iconItemLangSegment); if (pauseCtx->debugState == 0) { KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z); - Gfx_SetupDL_42Kal(play->state.gfxCtx); + Gfx_SetupDL_42Opa(play->state.gfxCtx); KaleidoScope_InitVertices(play, play->state.gfxCtx); KaleidoScope_DrawPages(play, play->state.gfxCtx); - Gfx_SetupDL_42Kal(play->state.gfxCtx); - gDPSetCombineLERP(POLY_KAL_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + Gfx_SetupDL_42Opa(play->state.gfxCtx); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f); diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_lmap_mark.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_lmap_mark.c index d4b3da6a9..15df2d77e 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_lmap_mark.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_lmap_mark.c @@ -90,9 +90,9 @@ void PauseMapMark_DrawForDungeon(PlayState* play) { Matrix_Translate(-36.0f, 21.0f, 0.0f, MTXMODE_APPLY); } - gDPPipeSync(POLY_KAL_DISP++); - gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255); - gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 255); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); markPoint = &mapMarkData->points[0]; for (i = 0; i < mapMarkData->count; i++) { @@ -125,8 +125,8 @@ void PauseMapMark_DrawForDungeon(PlayState* play) { if (display) { markInfo = &sMapMarkInfoTable[mapMarkData->markType]; - gDPPipeSync(POLY_KAL_DISP++); - gDPLoadTextureBlock(POLY_KAL_DISP++, markInfo->texture, markInfo->imageFormat, G_IM_SIZ_MARK, + gDPPipeSync(POLY_OPA_DISP++); + gDPLoadTextureBlock(POLY_OPA_DISP++, markInfo->texture, markInfo->imageFormat, G_IM_SIZ_MARK, markInfo->textureWidth, markInfo->textureHeight, 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); @@ -136,12 +136,12 @@ void PauseMapMark_DrawForDungeon(PlayState* play) { Matrix_Push(); Matrix_Translate(GREG(92) + markPoint->x + mirrorOffset, GREG(93) + markPoint->y, 0.0f, MTXMODE_APPLY); Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); - gSPMatrix(POLY_KAL_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); Matrix_Pop(); - gSPVertex(POLY_KAL_DISP++, mapMarkData->vtx, mapMarkData->vtxCount, 0); - gSP1Quadrangle(POLY_KAL_DISP++, 1, 3, 2, 0, 0); + gSPVertex(POLY_OPA_DISP++, mapMarkData->vtx, mapMarkData->vtxCount, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 1, 3, 2, 0, 0); } markPoint++; From 266792599ed3a30ede2111ab9621100b42e8dd53 Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 12 Feb 2025 15:32:28 -0500 Subject: [PATCH 040/267] Add hilite setup calls around all custom GI draws (#5043) --- soh/soh/Enhancements/randomizer/ShuffleFairies.cpp | 4 +++- soh/soh/Enhancements/randomizer/fishsanity.cpp | 2 ++ soh/soh/Enhancements/randomizer/hook_handlers.cpp | 5 +++++ soh/src/code/z_en_item00.c | 6 ++++++ soh/src/overlays/actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.c | 3 +++ soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c | 3 +++ soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c | 3 +++ 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index c8f044bd8..d771c58f3 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -18,6 +18,8 @@ void ShuffleFairies_DrawRandomizedItem(EnElf* enElf, PlayState* play) { } Matrix_Push(); Matrix_Scale(37.5, 37.5, 37.5, MTXMODE_APPLY); + func_8002EBCC(&enElf->actor, play, 0); + func_8002ED80(&enElf->actor, play, 0); EnItem00_CustomItemsParticles(&enElf->actor, play, randoGetItem); GetItemEntry_Draw(play, randoGetItem); Matrix_Pop(); @@ -404,4 +406,4 @@ void Rando::StaticData::RegisterFairyLocations() { locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); \ No newline at end of file +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index b44e21fc1..f07546de9 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -548,6 +548,8 @@ extern "C" { Matrix_Push(); Matrix_Scale(30.0, 30.0, 30.0, MTXMODE_APPLY); + func_8002EBCC(actor, play, 0); + func_8002ED80(actor, play, 0); EnItem00_CustomItemsParticles(actor, play, randoItem); GetItemEntry_Draw(play, randoItem); diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index a9e1947fd..cba64059a 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -381,6 +381,7 @@ void EnExItem_DrawRandomizedItem(EnExItem* enExItem, PlayState* play) { if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoGetItem = GET_ITEM_MYSTERY; } + func_8002EBCC(&enExItem->actor, play, 0); func_8002ED80(&enExItem->actor, play, 0); EnItem00_CustomItemsParticles(&enExItem->actor, play, randoGetItem); GetItemEntry_Draw(play, randoGetItem); @@ -412,6 +413,8 @@ void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play) { enItem00->actor.params != ITEM00_SOH_GIVE_ITEM_ENTRY) { randoItem = GET_ITEM_MYSTERY; } + func_8002EBCC(&enItem00->actor, play, 0); + func_8002ED80(&enItem00->actor, play, 0); EnItem00_CustomItemsParticles(&enItem00->actor, play, randoItem); GetItemEntry_Draw(play, randoItem); } @@ -421,6 +424,8 @@ void ItemBHeart_DrawRandomizedItem(ItemBHeart* itemBHeart, PlayState* play) { if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoItem = GET_ITEM_MYSTERY; } + func_8002EBCC(&itemBHeart->actor, play, 0); + func_8002ED80(&itemBHeart->actor, play, 0); EnItem00_CustomItemsParticles(&itemBHeart->actor, play, randoItem); GetItemEntry_Draw(play, randoItem); } diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index ecdf89316..9a9c60bfa 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -997,6 +997,12 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) { EnItem00* this = (EnItem00*)thisx; f32 mtxScale; + // Setup Hilites for 3D drops + if (CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0)) { + func_8002EBCC(&this->actor, play, 0); + func_8002ED80(&this->actor, play, 0); + } + if (!(this->unk_156 & this->unk_158)) { switch (this->actor.params) { case ITEM00_RUPEE_GREEN: 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 a97d67612..6e6413651 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 @@ -389,6 +389,9 @@ void EnExRuppy_Draw(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); if (CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0)) { + func_8002EBCC(&this->actor, play, 0); + func_8002ED80(&this->actor, play, 0); + // purple/gold rupees need less scaling f32 mtxScale = this->colorIdx >= 3 ? 17.5f : 25.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); 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 c38b83560..15a5ba19e 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 @@ -481,6 +481,9 @@ void EnGSwitch_DrawRupee(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); if (CVarGetInteger(CVAR_ENHANCEMENT("NewDrops"), 0)) { + func_8002EBCC(&this->actor, play, 0); + func_8002ED80(&this->actor, play, 0); + // purple/gold/silver rupees need less scaling f32 mtxScale = this->colorIdx >= 3 ? 17.5f : 25.0f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); 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 611fbab18..f66201e55 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 @@ -1428,6 +1428,9 @@ void EnGirlA_Draw(Actor* thisx, PlayState* play) { } if (this->actor.params == SI_RANDOMIZED_ITEM) { + // Set all hilites for randomized items + func_80A3C498(&this->actor, play, 0); + ShopItemIdentity shopItemIdentity = Randomizer_IdentifyShopItem(play->sceneNum, this->randoSlotIndex); GetItemEntry getItemEntry = (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && this->actor.params == SI_RANDOMIZED_ITEM) ? GetItemMystery() : Randomizer_GetItemFromKnownCheckWithoutObtainabilityCheck(shopItemIdentity.randomizerCheck, shopItemIdentity.ogItemId); From d4b9e8c835296bcc9fd20c47fe97167418e21ba9 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 12 Feb 2025 15:42:58 -0500 Subject: [PATCH 041/267] Remove locations from pool that are not shuffled. (#5023) * Cleanup of unshuffled locations from pool/spoiler * Removes unshuffled scrubs from the location pool * Fix some instances of weird spacing * Actually remove placement of vanilla freestandings * Cleans up some now unnecessary code. * Minor Optimization of PlaceItemsForType * Fixes some grammer and spelling * Another grammar fix --- .../randomizer/3drando/item_pool.cpp | 231 +--- soh/soh/Enhancements/randomizer/context.cpp | 81 +- soh/soh/Enhancements/randomizer/context.h | 1 + soh/soh/Enhancements/randomizer/dungeon.cpp | 1204 +---------------- soh/soh/Enhancements/randomizer/dungeon.h | 18 +- .../Enhancements/randomizer/hook_handlers.cpp | 9 +- .../Enhancements/randomizer/randomizerTypes.h | 2 +- 7 files changed, 92 insertions(+), 1454 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a2699cb65..ac79e860a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -471,72 +471,6 @@ void PlaceJunkInExcludedLocation(const RandomizerCheck il) { SPDLOG_ERROR("ERROR: No Junk to Place!!!"); } -static void PlaceVanillaDekuScrubItems(bool junkOneTimeScrubs) { - auto ctx = Rando::Context::GetInstance(); - if (junkOneTimeScrubs){ - ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_DEKU_SCRUB_GROTTO, RG_BLUE_RUPEE, false, true); - } - - ctx->PlaceItemInLocation(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, false, true); - ctx->PlaceItemInLocation(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_GV_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RG_BUY_DEKU_NUTS_5, false, true); - ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RG_BUY_DEKU_STICK_1, false, true); - ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_GROTTO_REAR, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RG_RED_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RG_GREEN_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, false, true); - ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, false, true); - ctx->PlaceItemInLocation(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RG_BUY_DEKU_NUTS_5, false, true); - ctx->PlaceItemInLocation(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RG_BUY_DEKU_SEEDS_30, false, true); - - //Dungeon Scrubs - if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_DEKU_TREE_MQ_DEKU_SCRUB, RG_BUY_DEKU_SHIELD, false, true); - } - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RG_BUY_DEKU_STICK_1, false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RG_BUY_DEKU_SHIELD, false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RG_RED_POTION_REFILL, - false, true); - } else { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RG_BUY_DEKU_NUTS_5, false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RG_BUY_DEKU_STICK_1, false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RG_BUY_DEKU_SHIELD, false, true); - } - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsVanilla()) { - ctx->PlaceItemInLocation(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RG_BUY_DEKU_NUTS_5, false, true); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RG_GREEN_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RG_BUY_ARROWS_30, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RG_RED_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RG_BUY_DEKU_NUTS_5, false, true); - } else { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RG_BUY_BOMBS_535, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RG_BUY_DEKU_SEEDS_30, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RG_RED_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RG_GREEN_POTION_REFILL, false, true); - } -} - static void PlaceVanillaMapsAndCompasses() { auto ctx = Rando::Context::GetInstance(); for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { @@ -558,143 +492,11 @@ static void PlaceVanillaBossKeys() { dungeon->PlaceVanillaBossKey(); } } -// TODO: This feels like it could be moved to Dungeons class and probably shorten -// a few function call chains. Needs investigation. -static void PlaceVanillaBeehiveRupees() { - auto ctx = Rando::Context::GetInstance(); - ctx->PlaceItemInLocation(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RG_BLUE_RUPEE, false, true); - - ctx->PlaceItemInLocation(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_SFM_STORMS_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_LLR_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_DMT_COW_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_GC_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_DMC_HAMMER_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_STORMS_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_LH_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_COLOSSUS_GROTTO_BEEHIVE, RG_RED_RUPEE, false, true); -} - -static void PlaceVanillaCowMilk() { - auto ctx = Rando::Context::GetInstance(); - ctx->PlaceItemInLocation(RC_KF_LINKS_HOUSE_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_HF_COW_GROTTO_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_GV_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_KAK_IMPAS_HOUSE_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_DMT_COW_GROTTO_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_LLR_STABLES_LEFT_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_LLR_STABLES_RIGHT_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_LLR_TOWER_LEFT_COW, RG_MILK, false, true); - ctx->PlaceItemInLocation(RC_LLR_TOWER_RIGHT_COW, RG_MILK, false, true); - - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { - ctx->PlaceItemInLocation(RC_JABU_JABUS_BELLY_MQ_COW, RG_MILK, false, true); +static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, bool dungeonActive) { + if (!(overworldActive || dungeonActive)) { + return; } -} - -static void PlaceVanillaOverworldFish() { - auto ctx = Rando::Context::GetInstance(); - for (auto rc : Rando::StaticData::GetOverworldFishLocations()) { - ctx->PlaceItemInLocation(rc, RG_FISH, false, true); - } -} - -static void PlaceVanillaFairies() { - auto ctx = Rando::Context::GetInstance(); - for (auto rc : Rando::StaticData::GetOverworldFairyLocations()) { - ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::WATER_TEMPLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { - ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla()) { - ctx->PlaceItemInLocation(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla()) { - ctx->PlaceItemInLocation(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, GetJunkItem(), false, true); - } -} - -static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, bool dungeonActive, bool placeVanilla) { for (RandomizerCheck rc : ctx->GetLocations(ctx->allLocations, rctype)) { auto loc = Rando::StaticData::GetLocation(rc); @@ -702,8 +504,6 @@ static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, if (loc->IsOverworld()) { if (overworldActive) { AddItemToMainPool(loc->GetVanillaItem()); - } else if (placeVanilla) { - ctx->PlaceItemInLocation(rc, loc->GetVanillaItem(), false, true); } } else { if (dungeonActive) { @@ -723,8 +523,6 @@ static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, } } } - } else if (placeVanilla) { - ctx->PlaceItemInLocation(rc, loc->GetVanillaItem(), false, true); } } } @@ -905,8 +703,6 @@ void GenerateItemPool() { //32 total beehive locations AddItemToMainPool(RG_RED_RUPEE, 23); AddItemToMainPool(RG_BLUE_RUPEE, 9); - } else { - PlaceVanillaBeehiveRupees(); } if (ctx->GetOption(RSK_SHUFFLE_COWS)) { @@ -918,8 +714,6 @@ void GenerateItemPool() { if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { AddItemToMainPool(GetJunkItem()); } - } else { - PlaceVanillaCowMilk(); } // Shuffle Pots @@ -927,9 +721,7 @@ void GenerateItemPool() { ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); - if (overworldPotsActive || dungeonPotsActive) { - PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive, false); - } + PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); auto fsMode = ctx->GetOption(RSK_FISHSANITY); if (fsMode.IsNot(RO_FISHSANITY_OFF)) { @@ -953,8 +745,6 @@ void GenerateItemPool() { if (fsMode.Is(RO_FISHSANITY_OVERWORLD) || fsMode.Is(RO_FISHSANITY_BOTH)) { for (uint8_t i = 0; i < Rando::StaticData::GetOverworldFishLocations().size(); i++) AddItemToMainPool(GetJunkItem()); - } else { - PlaceVanillaOverworldFish(); } if (fsMode.Is(RO_FISHSANITY_HYRULE_LOACH)) { @@ -962,9 +752,6 @@ void GenerateItemPool() { } else { ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true); } - } else { - PlaceVanillaOverworldFish(); - ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true); } if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { @@ -1333,8 +1120,6 @@ void GenerateItemPool() { for (int i = 0; i < extra; i++) { AddItemToMainPool(GetJunkItem()); } - } else { - PlaceVanillaFairies(); } //Scrubsanity @@ -1377,19 +1162,13 @@ void GenerateItemPool() { AddItemToMainPool(RG_DEKU_SEEDS_30); } } - } else { - PlaceVanillaDekuScrubItems(ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF)); } - // RANDOTODO: Don't add freestanding locations to the seed at all in the first place so this check - // can be put back in place, and not place the vanilla items in PlaceItemsForType. bool overworldFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_OVERWORLD) || ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); bool dungeonFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_DUNGEONS) || ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); - //if (overworldFreeStandingActive || dungeonFreeStandingActive) { - PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive, true); - //} + PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive); AddItemsToPool(ItemPool, alwaysItems); AddItemsToPool(ItemPool, dungeonRewards); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index cd4914aaf..d2eb4f2e1 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -98,6 +98,10 @@ ItemLocation* Context::GetItemLocation(size_t locKey) { return &itemLocationTable[static_cast(locKey)]; } +bool Context::IsLocationShuffled(const RandomizerCheck locKey) { + return itemLocationTable[locKey].GetPlacedRandomizerGet() != RG_NONE; +} + ItemOverride& Context::GetItemOverride(RandomizerCheck locKey) { if (!overrides.contains(locKey)) { overrides.emplace(locKey, ItemOverride()); @@ -156,36 +160,73 @@ void Context::GenerateLocationPool() { if (mOptions[RSK_TRIFORCE_HUNT]) { AddLocation(RC_TRIFORCE_COMPLETED); } - AddLocations(StaticData::GetOverworldLocations()); - - if (mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_OFF)) { - AddLocations(mFishsanity->GetFishsanityLocations().first); + for (Location& location : StaticData::GetLocationTable()) { + // skip RCs that shouldn't be in the pool for any reason (i.e. settings, unsupported check type, etc.) + // TODO: Exclude checks for some of the older shuffles from the pool too i.e. Frog Songs, Scrubs, etc.) + if (location.GetRandomizerCheck() == RC_UNKNOWN_CHECK || + location.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || // already in pool + location.GetRCType() == RCTYPE_CHEST_GAME || // not supported yet + location.GetRCType() == RCTYPE_STATIC_HINT || // can't have items + location.GetRCType() == RCTYPE_GOSSIP_STONE || // can't have items + (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_OFF)) || + (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_ONE_TIME_ONLY) && !( + location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || + location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || + location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO + )) || + (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || + (location.GetRCType() == RCTYPE_FISH && mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || + (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || + (location.GetRCType() == RCTYPE_FREESTANDING && + mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || + (location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) { + continue; + } + if (location.IsOverworld()) { + // Skip stuff that is shuffled to dungeon only, i.e. tokens, pots, etc., or other checks that + // should not have a shuffled item. + if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS))) { + continue; + } + // If we've gotten past all the conditions where an overworld location should not be + // shuffled, add it to the pool. + AddLocation(location.GetRandomizerCheck()); + } else { // is a dungeon check + auto* dungeon = GetDungeon(location.GetArea() - RCAREA_DEKU_TREE); + if (location.GetQuest() == RCQUEST_BOTH || (location.GetQuest() == RCQUEST_MQ) == dungeon->IsMQ()) { + if ((location.GetRCType() == RCTYPE_FREESTANDING && + mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD))) { + continue; + } + // also add to that dungeon's location list. + AddLocation(location.GetRandomizerCheck(), &dungeon->locations); + AddLocation(location.GetRandomizerCheck()); + } + } } - - if (mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD) || - mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_ALL)) { - AddLocations(StaticData::GetOverworldPotLocations()); - } - - AddLocations(StaticData::GetAllDungeonLocations()); } void Context::AddExcludedOptions() { - AddLocations(StaticData::GetOverworldLocations(), &everyPossibleLocation); - for (const auto dungeon : mDungeons->GetDungeonList()) { - AddLocations(dungeon->GetEveryLocation(), &everyPossibleLocation); - } - for (const RandomizerCheck rc : everyPossibleLocation) { + for (auto& loc : StaticData::GetLocationTable()) { + // Checks of these types don't have items, skip them. + if (loc.GetRandomizerCheck() == RC_UNKNOWN_CHECK || + loc.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || loc.GetRCType() == RCTYPE_CHEST_GAME || + loc.GetRCType() == RCTYPE_STATIC_HINT || loc.GetRCType() == RCTYPE_GOSSIP_STONE) { + continue; + } + AddLocation(loc.GetRandomizerCheck(), &everyPossibleLocation); bool alreadyAdded = false; - Location* loc = StaticData::GetLocation(rc); - for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc->GetArea())) + for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc.GetArea())) { - if (location->GetName() == loc->GetExcludedOption()->GetName()) { + if (location->GetName() == loc.GetExcludedOption()->GetName()) { alreadyAdded = true; } } if (!alreadyAdded) { - Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc->GetArea()).push_back(loc->GetExcludedOption()); + Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc.GetArea()).push_back(loc.GetExcludedOption()); } } } diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index cc71609eb..b90f251c7 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -41,6 +41,7 @@ class Context { void AddHint(const RandomizerHint hintId, const Hint hint); ItemLocation* GetItemLocation(RandomizerCheck locKey); ItemLocation* GetItemLocation(size_t locKey); + bool IsLocationShuffled(RandomizerCheck locKey); ItemOverride& GetItemOverride(RandomizerCheck locKey); ItemOverride& GetItemOverride(size_t locKey); void PlaceItemInLocation(RandomizerCheck locKey, RandomizerGet item, bool applyEffectImmediately = false, diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 423c8666e..8b749faf8 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -8,16 +8,10 @@ namespace Rando { DungeonInfo::DungeonInfo(std::string name_, const RandomizerHintTextKey hintKey_, const RandomizerGet map_, const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, const RandomizerGet bossKey_, RandomizerArea area_, const uint8_t vanillaKeyCount_, const uint8_t mqKeyCount_, - const RandomizerSettingKey mqSetting_, - std::vector vanillaLocations_, std::vector mqLocations_, - std::vector vanillaPots_, std::vector mqPots_, - std::vector sharedLocations_, std::vector bossRoomLocations_) + const RandomizerSettingKey mqSetting_) : name(std::move(name_)), hintKey(hintKey_), map(map_), compass(compass_), smallKey(smallKey_), keyRing(keyRing_), bossKey(bossKey_), area(area_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_), - mqSetting(mqSetting_), - vanillaLocations(std::move(vanillaLocations_)), mqLocations(std::move(mqLocations_)), - vanillaPots(std::move(vanillaPots_)), mqPots(std::move(mqPots_)), - sharedLocations(std::move(sharedLocations_)), bossRoomLocations(std::move(bossRoomLocations_)) { + mqSetting(mqSetting_) { } DungeonInfo::DungeonInfo() : hintKey(RHT_NONE), map(RG_NONE), compass(RG_NONE), smallKey(RG_NONE), keyRing(RG_NONE), bossKey(RG_NONE) {} @@ -147,1212 +141,42 @@ 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()->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); - } - AddElementsToPool(locations, sharedLocations); - AddElementsToPool(locations, bossRoomLocations); - return locations; -} - -// Gets all dungeon locations (MQ + Vanilla) -std::vector DungeonInfo::GetEveryLocation() const { - auto locations = vanillaLocations; - AddElementsToPool(locations, mqLocations); - AddElementsToPool(locations, vanillaPots); - AddElementsToPool(locations, mqPots); - AddElementsToPool(locations, sharedLocations); - AddElementsToPool(locations, bossRoomLocations); return locations; } Dungeons::Dungeons() { dungeonList[DEKU_TREE] = - DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE, - { - // Vanilla Locations - RC_DEKU_TREE_MAP_CHEST, - RC_DEKU_TREE_COMPASS_CHEST, - RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, - RC_DEKU_TREE_BASEMENT_CHEST, - RC_DEKU_TREE_SLINGSHOT_CHEST, - RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, - RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, - RC_DEKU_TREE_GS_BASEMENT_GATE, - RC_DEKU_TREE_GS_BASEMENT_VINES, - RC_DEKU_TREE_GS_COMPASS_ROOM, - RC_DEKU_TREE_LOBBY_LOWER_HEART, - RC_DEKU_TREE_LOBBY_UPPER_HEART, - RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, - RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, - RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, - }, - { - // MQ Locations - RC_DEKU_TREE_MQ_MAP_CHEST, - RC_DEKU_TREE_MQ_COMPASS_CHEST, - RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, - RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, - RC_DEKU_TREE_MQ_BASEMENT_CHEST, - RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, - RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, - RC_DEKU_TREE_MQ_DEKU_SCRUB, - RC_DEKU_TREE_MQ_GS_LOBBY, - RC_DEKU_TREE_MQ_GS_PAST_BOULDER_VINES, - RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, - RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, - RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, - RC_DEKU_TREE_MQ_DEKU_BABA_HEART, - RC_DEKU_TREE_MQ_LOBBY_HEART, - RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, - RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, - RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, - RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, - }, - {}, {}, {}, - { - // Boss Room Locations - RC_DEKU_TREE_QUEEN_GOHMA_HEART, - RC_QUEEN_GOHMA, - }); + DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE); dungeonList[DODONGOS_CAVERN] = DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, - RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, RSK_MQ_DODONGOS_CAVERN, - { - // Vanilla Locations - RC_DODONGOS_CAVERN_MAP_CHEST, - RC_DODONGOS_CAVERN_COMPASS_CHEST, - RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, - RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, - RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, - RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, - RC_DODONGOS_CAVERN_GS_SCARECROW, - RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, - RC_DODONGOS_CAVERN_GS_BACK_ROOM, - RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, - RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, - RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, - RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, - RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, - RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, - }, - { - // MQ Locations - RC_DODONGOS_CAVERN_MQ_MAP_CHEST, - RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, - RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, - RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, - RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, - RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, - RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, - RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, - RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, - RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, - RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, - RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, - RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, - RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, - RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, - }, - { - // Vanilla Pots - RC_DODONGOS_CAVERN_LIZALFOS_POT_1, - RC_DODONGOS_CAVERN_LIZALFOS_POT_2, - RC_DODONGOS_CAVERN_LIZALFOS_POT_3, - RC_DODONGOS_CAVERN_LIZALFOS_POT_4, - RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, - RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, - RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, - RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, - RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, - RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, - RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, - RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, - RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, - RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, - RC_DODONGOS_CAVERN_STAIRCASE_POT_1, - RC_DODONGOS_CAVERN_STAIRCASE_POT_2, - RC_DODONGOS_CAVERN_STAIRCASE_POT_3, - RC_DODONGOS_CAVERN_STAIRCASE_POT_4, - RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, - RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, - RC_DODONGOS_CAVERN_BLADE_POT_1, - RC_DODONGOS_CAVERN_BLADE_POT_2, - RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, - RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, - RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, - RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, - RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, - RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, - }, - { - // MQ Pots - RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, - RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, - RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, - RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, - RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, - RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, - RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, - RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, - RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, - RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, - RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, - RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, - RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, - RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, - RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, - RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, - RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, - RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, - RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, - RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, - RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, - RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, - RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, - RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, - RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, - RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, - RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, - RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, - RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, - RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, - }, - {}, - { - // Boss Room Locations - RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, - RC_DODONGOS_CAVERN_KING_DODONGO_HEART, - RC_KING_DODONGO, - }); + RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, RSK_MQ_DODONGOS_CAVERN); dungeonList[JABU_JABUS_BELLY] = DungeonInfo("Jabu Jabu's Belly", RHT_JABU_JABUS_BELLY, RG_JABU_JABUS_BELLY_MAP, - RG_JABU_JABUS_BELLY_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, RSK_MQ_JABU_JABU, - { - // Vanilla Locations - RC_JABU_JABUS_BELLY_MAP_CHEST, - RC_JABU_JABUS_BELLY_COMPASS_CHEST, - RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, - RC_JABU_JABUS_BELLY_DEKU_SCRUB, - RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, - RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, - RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, - RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, - }, - { - // MQ Locations - RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, - RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, - RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, - RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, - RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, - RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, - RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, - RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, - RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, - RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, - RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, - RC_JABU_JABUS_BELLY_MQ_COW, - RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, - RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, - RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, - RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, - RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, - RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, - RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, - RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, - RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, - }, - { - // Vanilla Pots - RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, - RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, - RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, - RC_JABU_JABUS_BELLY_BASEMENT_POT_1, - RC_JABU_JABUS_BELLY_BASEMENT_POT_2, - RC_JABU_JABUS_BELLY_BASEMENT_POT_3, - RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, - RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, - RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, - RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, - RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, - - // Shared Pots so in both vanilla and MQ - RC_JABU_JABUS_BELLY_BARINADE_POT_1, - RC_JABU_JABUS_BELLY_BARINADE_POT_2, - RC_JABU_JABUS_BELLY_BARINADE_POT_3, - RC_JABU_JABUS_BELLY_BARINADE_POT_4, - RC_JABU_JABUS_BELLY_BARINADE_POT_5, - RC_JABU_JABUS_BELLY_BARINADE_POT_6, - }, - { - // MQ Pots - RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, - RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, - RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, - RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, - RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, - RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, - RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, - RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, - RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, - - // Shared Pots so in both vanilla and MQ - RC_JABU_JABUS_BELLY_BARINADE_POT_1, - RC_JABU_JABUS_BELLY_BARINADE_POT_2, - RC_JABU_JABUS_BELLY_BARINADE_POT_3, - RC_JABU_JABUS_BELLY_BARINADE_POT_4, - RC_JABU_JABUS_BELLY_BARINADE_POT_5, - RC_JABU_JABUS_BELLY_BARINADE_POT_6, - }, - {}, - { - // Boss Room Locations - RC_JABU_JABUS_BELLY_BARINADE_HEART, - RC_BARINADE, - }); + RG_JABU_JABUS_BELLY_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, RSK_MQ_JABU_JABU); dungeonList[FOREST_TEMPLE] = DungeonInfo("Forest Temple", RHT_FOREST_TEMPLE, RG_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_COMPASS, - RG_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, RSK_MQ_FOREST_TEMPLE, - { - // Vanilla Locations - RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, - RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, - RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, - RC_FOREST_TEMPLE_MAP_CHEST, - RC_FOREST_TEMPLE_WELL_CHEST, - RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, - RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, - RC_FOREST_TEMPLE_BOSS_KEY_CHEST, - RC_FOREST_TEMPLE_FLOORMASTER_CHEST, - RC_FOREST_TEMPLE_BOW_CHEST, - RC_FOREST_TEMPLE_RED_POE_CHEST, - RC_FOREST_TEMPLE_BLUE_POE_CHEST, - RC_FOREST_TEMPLE_BASEMENT_CHEST, - RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, - RC_FOREST_TEMPLE_GS_FIRST_ROOM, - RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, - RC_FOREST_TEMPLE_GS_LOBBY, - RC_FOREST_TEMPLE_GS_BASEMENT, - RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, - RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, - RC_FOREST_TEMPLE_WELL_WEST_HEART, - RC_FOREST_TEMPLE_WELL_EAST_HEART, - }, - { - // MQ Locations - RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, - RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, - RC_FOREST_TEMPLE_MQ_BOW_CHEST, - RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, - RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, - RC_FOREST_TEMPLE_MQ_WELL_CHEST, - RC_FOREST_TEMPLE_MQ_MAP_CHEST, - RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, - RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, - RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, - RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, - RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, - RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, - RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, - RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, - RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, - RC_FOREST_TEMPLE_MQ_GS_WELL, - RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, - RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, - RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, - RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, - RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, - RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, - }, - { - // Vanilla Pots - RC_FOREST_TEMPLE_LOBBY_POT_1, - RC_FOREST_TEMPLE_LOBBY_POT_2, - RC_FOREST_TEMPLE_LOBBY_POT_3, - RC_FOREST_TEMPLE_LOBBY_POT_4, - RC_FOREST_TEMPLE_LOBBY_POT_5, - RC_FOREST_TEMPLE_LOBBY_POT_6, - RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, - RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, - RC_FOREST_TEMPLE_GREEN_POE_POT_1, - RC_FOREST_TEMPLE_GREEN_POE_POT_2, - RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, - RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, - RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, - RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, - RC_FOREST_TEMPLE_BLUE_POE_POT_1, - RC_FOREST_TEMPLE_BLUE_POE_POT_2, - RC_FOREST_TEMPLE_BLUE_POE_POT_3, - RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, - RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, - }, - { - // MQ Pots - RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, - RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, - RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, - RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, - RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, - RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, - RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, - RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, - RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, - RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, - RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, - RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, - RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, - RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, - RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, - RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, - RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, - RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, - RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, - RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, - RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, - }, - {}, - { - // Boss Room Locations - RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, - RC_PHANTOM_GANON, - }); + RG_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, RSK_MQ_FOREST_TEMPLE); dungeonList[FIRE_TEMPLE] = DungeonInfo("Fire Temple", RHT_FIRE_TEMPLE, RG_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_COMPASS, - RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, RA_FIRE_TEMPLE, 8, 5, RSK_MQ_FIRE_TEMPLE, - { - // Vanilla Locations - RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, - RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, - RC_FIRE_TEMPLE_BOSS_KEY_CHEST, - RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, - RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, - RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, - RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, - RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, - RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, - RC_FIRE_TEMPLE_SCARECROW_CHEST, - RC_FIRE_TEMPLE_MAP_CHEST, - RC_FIRE_TEMPLE_COMPASS_CHEST, - RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, - RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, - RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, - RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, - RC_FIRE_TEMPLE_GS_BOULDER_MAZE, - RC_FIRE_TEMPLE_GS_SCARECROW_TOP, - RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, - RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, - RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, - RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, - RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, - RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, - RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, - RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, - RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, - RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, - }, - { - // MQ Locations - RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, - RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, - RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, - RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, - RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, - RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, - RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, - RC_FIRE_TEMPLE_MQ_MAP_CHEST, - RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, - RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, - RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, - RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, - RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE, - RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, - RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, - RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, - RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, - RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, - RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, - RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, - RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, - RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, - }, - { - // Vanilla Pots - RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, - RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, - RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, - RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, - RC_FIRE_TEMPLE_BIG_LAVA_POT_1, - RC_FIRE_TEMPLE_BIG_LAVA_POT_2, - RC_FIRE_TEMPLE_BIG_LAVA_POT_3, - RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, - RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, - RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, - RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, - RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, - RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, - RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, - RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, - }, - { - // MQ Pots - RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, - RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, - RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, - RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, - RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, - RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, - RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, - RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, - RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, - RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, - RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, - RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, - RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, - RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, - RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, - RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, - RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, - RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, - RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, - RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, - RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, - }, - {}, - { - // Boos Room Locations - RC_FIRE_TEMPLE_VOLVAGIA_HEART, - RC_VOLVAGIA, - }); + RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, RA_FIRE_TEMPLE, 8, 5, RSK_MQ_FIRE_TEMPLE); dungeonList[WATER_TEMPLE] = DungeonInfo("Water Temple", RHT_WATER_TEMPLE, RG_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_COMPASS, - RG_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, RSK_MQ_WATER_TEMPLE, - { - // Vanilla Locations - RC_WATER_TEMPLE_MAP_CHEST, - RC_WATER_TEMPLE_COMPASS_CHEST, - RC_WATER_TEMPLE_TORCHES_CHEST, - RC_WATER_TEMPLE_DRAGON_CHEST, - RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, - RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, - RC_WATER_TEMPLE_CRACKED_WALL_CHEST, - RC_WATER_TEMPLE_BOSS_KEY_CHEST, - RC_WATER_TEMPLE_LONGSHOT_CHEST, - RC_WATER_TEMPLE_RIVER_CHEST, - RC_WATER_TEMPLE_GS_BEHIND_GATE, - RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, - RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, - RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, - RC_WATER_TEMPLE_GS_RIVER, - RC_WATER_TEMPLE_RIVER_HEART_1, - RC_WATER_TEMPLE_RIVER_HEART_2, - RC_WATER_TEMPLE_RIVER_HEART_3, - RC_WATER_TEMPLE_RIVER_HEART_4, - }, - { - // MQ Locations - RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, - RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, - RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, - RC_WATER_TEMPLE_MQ_COMPASS_CHEST, - RC_WATER_TEMPLE_MQ_MAP_CHEST, - RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, - RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, - RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, - RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, - RC_WATER_TEMPLE_MQ_GS_RIVER, - RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, - RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, - RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, - RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - }, - { - // Vanilla Pots - RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, - RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, - RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, - RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, - RC_WATER_TEMPLE_TORCH_POT_1, - RC_WATER_TEMPLE_TORCH_POT_2, - RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, - RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, - RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, - RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, - RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, - RC_WATER_TEMPLE_BEHIND_GATE_POT_1, - RC_WATER_TEMPLE_BEHIND_GATE_POT_2, - RC_WATER_TEMPLE_BEHIND_GATE_POT_3, - RC_WATER_TEMPLE_BEHIND_GATE_POT_4, - RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, - RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, - RC_WATER_TEMPLE_RIVER_POT_1, - RC_WATER_TEMPLE_RIVER_POT_2, - RC_WATER_TEMPLE_LIKE_LIKE_POT_1, - RC_WATER_TEMPLE_LIKE_LIKE_POT_2, - RC_WATER_TEMPLE_BOSS_KEY_POT_1, - RC_WATER_TEMPLE_BOSS_KEY_POT_2, - }, - { - // MQ Pots - RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, - RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, - RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, - RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, - RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, - RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, - RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, - RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, - RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, - RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, - RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, - RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, - RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, - RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, - RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, - RC_WATER_TEMPLE_MQ_RIVER_POT_1, - RC_WATER_TEMPLE_MQ_RIVER_POT_2, - RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, - RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, - RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, - RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, - RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, - RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, - RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, - RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, - RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, - RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, - RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, - RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, - RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, - RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, - }, - {}, - { - // Boss Room Locations - RC_WATER_TEMPLE_MORPHA_HEART, - RC_MORPHA, - }); + RG_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, RSK_MQ_WATER_TEMPLE); dungeonList[SPIRIT_TEMPLE] = DungeonInfo("Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, - RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, RSK_MQ_SPIRIT_TEMPLE, - { - // Vanilla Locations - RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, - RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, - RC_SPIRIT_TEMPLE_COMPASS_CHEST, - RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, - RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, - RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, - RC_SPIRIT_TEMPLE_MAP_CHEST, - RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, - RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, - RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, - RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, - RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, - RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, - RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, - RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, - RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, - RC_SPIRIT_TEMPLE_TOPMOST_CHEST, - RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, - RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, - RC_SPIRIT_TEMPLE_GS_LOBBY, - RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, - RC_SPIRIT_TEMPLE_GS_METAL_FENCE, - RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, - RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, - RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, - }, - { - // MQ Locations - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, - RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, - RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, - RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, - RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, - RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, - RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, - RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, - RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, - RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, - RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, - RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, - RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, - RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, - RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, - RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, - RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, - RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, - RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, - RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, - RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, - RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, - RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, - RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, - RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - }, - { - // Vanilla Pots - RC_SPIRIT_TEMPLE_LOBBY_POT_1, - RC_SPIRIT_TEMPLE_LOBBY_POT_2, - RC_SPIRIT_TEMPLE_ANUBIS_POT_1, - RC_SPIRIT_TEMPLE_ANUBIS_POT_2, - RC_SPIRIT_TEMPLE_ANUBIS_POT_3, - RC_SPIRIT_TEMPLE_ANUBIS_POT_4, - RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, - RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, - RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, - RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, - RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, - RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, - RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, - RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, - RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, - RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, - }, - { - // MQ Pots - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, - RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, - RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, - RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, - RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, - RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, - RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, - RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, - RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, - RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, - RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, - RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, - RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, - RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, - RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, - RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, - RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, - RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, - RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, - RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, - RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, - RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, - RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, - RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, - RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, - RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, - RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, - }, - { - // Shared Locations - RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, - RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, - }, - { - // Boss Room Locations - RC_SPIRIT_TEMPLE_TWINROVA_HEART, - RC_TWINROVA, - }); + RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, RSK_MQ_SPIRIT_TEMPLE); dungeonList[SHADOW_TEMPLE] = DungeonInfo("Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, - RG_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE, - { - // Vanilla Locations - RC_SHADOW_TEMPLE_MAP_CHEST, - RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, - RC_SHADOW_TEMPLE_COMPASS_CHEST, - RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, - RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, - RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, - RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, - RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, - RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, - RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, - RC_SHADOW_TEMPLE_WIND_HINT_CHEST, - RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, - RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, - RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, - RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, - RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, - RC_SHADOW_TEMPLE_FREESTANDING_KEY, - RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, - RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, - RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, - RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, - RC_SHADOW_TEMPLE_GS_NEAR_SHIP, - RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, - RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, - RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, - RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, - RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, - RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, - RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, - RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, - RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, - RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, - }, - { - // MQ Locations - RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, - RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, - RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, - RC_SHADOW_TEMPLE_MQ_MAP_CHEST, - RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, - RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, - RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, - RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, - RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, - RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, - RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, - RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, - RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, - RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, - RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, - RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, - RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, - RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, - RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, - RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, - RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, - RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, - RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, - RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, - RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, - RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, - RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, - RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, - RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, - RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, - RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, - RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, - RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, - RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, - RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, - }, - { - // Vanilla Pots - RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, - RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, - RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, - RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, - RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, - RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, - RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, - RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, - RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, - RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, - RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, - RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, - RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, - RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, - RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, - RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, - RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, - RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, - RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, - RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, - RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, - }, - { - // MQ Pots - RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, - RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, - RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, - RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, - RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, - RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, - RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, - RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, - RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, - RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, - RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, - RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, - RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, - RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, - RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, - RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, - RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, - }, - {}, - { - // Boss Room Locations - RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, - RC_BONGO_BONGO, - }); + RG_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE); dungeonList[BOTTOM_OF_THE_WELL] = DungeonInfo( "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_COMPASS, - RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL, - { - // Vanilla Locations - RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, - RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, - RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, - RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, - RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, - RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, - RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, - RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, - RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, - RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, - RC_BOTTOM_OF_THE_WELL_MAP_CHEST, - RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, - RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, - RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, - RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, - RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, - RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, - RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, - RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, - RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, - RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, - RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, - RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, - RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, - RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, - }, - { - // MQ Locations - RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, - RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, - RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, - RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, - RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, - RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, - RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, - RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, - RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, - RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, - RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, - }, - { - // Vanilla Pots - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, - RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, - RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, - RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, - RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, - RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, - RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, - RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, - RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, - }, - { - // MQ Pots - RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, - RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, - RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, - RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, - RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, - RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, - RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, - }, - {}, {}); + RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, - RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN, - { - // Vanilla Locations - RC_ICE_CAVERN_MAP_CHEST, - RC_ICE_CAVERN_COMPASS_CHEST, - RC_ICE_CAVERN_IRON_BOOTS_CHEST, - RC_ICE_CAVERN_FREESTANDING_POH, - RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, - RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, - RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, - RC_ICE_CAVERN_LOBBY_RUPEE, - RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, - RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, - RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, - RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, - RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, - RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, - RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - }, - { - // MQ Locations - RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, - RC_ICE_CAVERN_MQ_COMPASS_CHEST, - RC_ICE_CAVERN_MQ_MAP_CHEST, - RC_ICE_CAVERN_MQ_FREESTANDING_POH, - RC_ICE_CAVERN_MQ_GS_SCARECROW, - RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, - RC_ICE_CAVERN_MQ_GS_RED_ICE, - }, - { - // Vanilla Pots - RC_ICE_CAVERN_HALL_POT_1, - RC_ICE_CAVERN_HALL_POT_2, - RC_ICE_CAVERN_SPINNING_BLADE_POT_1, - RC_ICE_CAVERN_SPINNING_BLADE_POT_2, - RC_ICE_CAVERN_SPINNING_BLADE_POT_3, - RC_ICE_CAVERN_NEAR_END_POT_1, - RC_ICE_CAVERN_NEAR_END_POT_2, - RC_ICE_CAVERN_FROZEN_POT_1, - }, - { - // MQ Pots - RC_ICE_CAVERN_MQ_ENTRANCE_POT, - RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, - RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, - RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, - RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, - RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, - RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, - RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, - RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, - RC_ICE_CAVERN_MQ_COMPASS_POT_1, - RC_ICE_CAVERN_MQ_COMPASS_POT_2, - }, - { - // Shared Locations - RC_SHEIK_IN_ICE_CAVERN, - }, - {}); + RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN); dungeonList[GERUDO_TRAINING_GROUND] = DungeonInfo("Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, - RG_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG, - { - // Vanilla Locations - RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, - RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, - RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, - RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, - RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, - RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, - RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, - RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, - RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, - RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, - RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, - RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, - RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, - RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, - RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, - RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, - RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, - RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, - RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, - RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, - RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, - RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, - RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, - RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, - RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - }, - { - // MQ Locations - RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, - RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, - }, - {}, - { - // MQ Pots - RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, - RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, - RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, - RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, - }, {}, {}); + RG_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG); dungeonList[GANONS_CASTLE] = DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY, - RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE, - { - // Vanilla Locations - RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, - RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, - RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, - RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, - RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, - RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, - RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, - RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, - RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, - RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, - RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, - RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, - RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, - RC_GANONS_CASTLE_FIRE_TRIAL_HEART, - RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, - RC_GANONS_CASTLE_SCRUBS_FAIRY_1, - RC_GANONS_CASTLE_SCRUBS_FAIRY_2, - RC_GANONS_CASTLE_SCRUBS_FAIRY_3, - RC_GANONS_CASTLE_SCRUBS_FAIRY_4, - RC_GANONS_CASTLE_SCRUBS_FAIRY_5, - RC_GANONS_CASTLE_SCRUBS_FAIRY_6, - RC_GANONS_CASTLE_SCRUBS_FAIRY_7, - RC_GANONS_CASTLE_SCRUBS_FAIRY_8, - RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, - }, - { - // MQ Locations - RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, - RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, - RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, - RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, - RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, - RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, - RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, - RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, - RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, - RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, - RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, - RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, - RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, - }, - { - // Vanilla Pots - RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, - RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, - RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, - RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, - RC_GANONS_CASTLE_WATER_TRIAL_POT_1, - RC_GANONS_CASTLE_WATER_TRIAL_POT_2, - RC_GANONS_CASTLE_WATER_TRIAL_POT_3, - RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, - RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, - RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, - RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, - RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, - RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, - RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, - RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, - RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, - - // Shared Pots so in both vanilla and MQ - RC_GANONS_CASTLE_GANONS_TOWER_POT_1, - RC_GANONS_CASTLE_GANONS_TOWER_POT_2, - RC_GANONS_CASTLE_GANONS_TOWER_POT_3, - RC_GANONS_CASTLE_GANONS_TOWER_POT_4, - RC_GANONS_CASTLE_GANONS_TOWER_POT_5, - RC_GANONS_CASTLE_GANONS_TOWER_POT_6, - RC_GANONS_CASTLE_GANONS_TOWER_POT_7, - RC_GANONS_CASTLE_GANONS_TOWER_POT_8, - RC_GANONS_CASTLE_GANONS_TOWER_POT_9, - RC_GANONS_CASTLE_GANONS_TOWER_POT_10, - RC_GANONS_CASTLE_GANONS_TOWER_POT_11, - RC_GANONS_CASTLE_GANONS_TOWER_POT_12, - RC_GANONS_CASTLE_GANONS_TOWER_POT_13, - RC_GANONS_CASTLE_GANONS_TOWER_POT_14, - RC_GANONS_CASTLE_GANONS_TOWER_POT_15, - RC_GANONS_CASTLE_GANONS_TOWER_POT_16, - RC_GANONS_CASTLE_GANONS_TOWER_POT_17, - RC_GANONS_CASTLE_GANONS_TOWER_POT_18, - }, - { - // MQ Pots - RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, - RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, - RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, - RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, - RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, - RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, - RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, - RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, - RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, - RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, - RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, - - // Shared Pots so in both vanilla and MQ - RC_GANONS_CASTLE_GANONS_TOWER_POT_1, - RC_GANONS_CASTLE_GANONS_TOWER_POT_2, - RC_GANONS_CASTLE_GANONS_TOWER_POT_3, - RC_GANONS_CASTLE_GANONS_TOWER_POT_4, - RC_GANONS_CASTLE_GANONS_TOWER_POT_5, - RC_GANONS_CASTLE_GANONS_TOWER_POT_6, - RC_GANONS_CASTLE_GANONS_TOWER_POT_7, - RC_GANONS_CASTLE_GANONS_TOWER_POT_8, - RC_GANONS_CASTLE_GANONS_TOWER_POT_9, - RC_GANONS_CASTLE_GANONS_TOWER_POT_10, - RC_GANONS_CASTLE_GANONS_TOWER_POT_11, - RC_GANONS_CASTLE_GANONS_TOWER_POT_12, - RC_GANONS_CASTLE_GANONS_TOWER_POT_13, - RC_GANONS_CASTLE_GANONS_TOWER_POT_14, - RC_GANONS_CASTLE_GANONS_TOWER_POT_15, - RC_GANONS_CASTLE_GANONS_TOWER_POT_16, - RC_GANONS_CASTLE_GANONS_TOWER_POT_17, - RC_GANONS_CASTLE_GANONS_TOWER_POT_18, - }, - { - // Shared Locations - RC_GANONS_TOWER_BOSS_KEY_CHEST, - RC_GANON, - }, - {}); + RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE); } Dungeons::~Dungeons() = default; diff --git a/soh/soh/Enhancements/randomizer/dungeon.h b/soh/soh/Enhancements/randomizer/dungeon.h index c8ecd247e..5d26036eb 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.h +++ b/soh/soh/Enhancements/randomizer/dungeon.h @@ -12,11 +12,7 @@ class DungeonInfo { public: DungeonInfo(std::string name_, RandomizerHintTextKey hintKey_, RandomizerGet map_, RandomizerGet compass_, RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, RandomizerArea area_, - uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, RandomizerSettingKey mqSetting_, - std::vector vanillaLocations_, std::vector mqLocations_, - std::vector vanillaPots_, std::vector mqPots_, - std::vector sharedLocations_, - std::vector bossRoomLocations_); + uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, RandomizerSettingKey mqSetting_); DungeonInfo(); ~DungeonInfo(); @@ -43,7 +39,7 @@ class DungeonInfo { void PlaceVanillaBossKey() const; void PlaceVanillaSmallKeys() const; std::vector GetDungeonLocations() const; - std::vector GetEveryLocation() const; + std::vector locations; private: std::string name; @@ -60,12 +56,6 @@ class DungeonInfo { uint8_t mqKeyCount{}; bool masterQuest = false; bool hasKeyRing = false; - std::vector vanillaLocations; - std::vector mqLocations; - std::vector vanillaPots; - std::vector mqPots; - std::vector sharedLocations; - std::vector bossRoomLocations; }; typedef enum { @@ -79,8 +69,8 @@ typedef enum { SHADOW_TEMPLE, BOTTOM_OF_THE_WELL, ICE_CAVERN, - GANONS_CASTLE, - GERUDO_TRAINING_GROUND + GERUDO_TRAINING_GROUND, + GANONS_CASTLE } DungeonKey; class Dungeons { diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index cba64059a..da2281894 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -232,7 +232,7 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { if (rc == RC_UNKNOWN_CHECK) return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - if (loc == nullptr || loc->HasObtained()) return; + if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; SPDLOG_INFO("Queuing RC: {}", static_cast(rc)); randomizerQueuedChecks.push(rc); @@ -250,7 +250,7 @@ void RandomizerOnSceneFlagSetHandler(int16_t sceneNum, int16_t flagType, int16_t if (rc == RC_UNKNOWN_CHECK) return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - if (loc == nullptr || loc->HasObtained()) return; + if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; SPDLOG_INFO("Queuing RC: {}", static_cast(rc)); randomizerQueuedChecks.push(rc); @@ -813,7 +813,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_GIVE_ITEM_FROM_CHEST: { EnBox* chest = va_arg(args, EnBox*); RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(chest->dyna.actor.id, gPlayState->sceneNum, chest->dyna.actor.params); - + if (!OTRGlobals::Instance->gRandoContext->IsLocationShuffled(rc)) { + break; + } + // if this is a treasure chest game chest then set the appropriate rando inf RandomizerSetChestGameRandomizerInf(rc); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index dabfedac7..550f2b1af 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -5342,7 +5342,7 @@ typedef enum { //Scrubsanity settings (off, affordable, expensive, random) typedef enum { RO_SCRUBS_OFF, - RO_SCRUBS_MAJOR_ONLY, + RO_SCRUBS_ONE_TIME_ONLY, RO_SCRUBS_ALL, } RandoOptionScrubsanity; From 0ce9807df64d8dc497ea5132546d27cf7e65dfc5 Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 12 Feb 2025 15:52:18 -0500 Subject: [PATCH 042/267] ShipInit and move ValueViewer rendering out of src (#5039) --- soh/soh/Enhancements/debugger/colViewer.h | 7 +--- soh/soh/Enhancements/debugger/valueViewer.cpp | 39 ++++++++++++++++++- soh/soh/Enhancements/debugger/valueViewer.h | 8 ---- soh/src/code/graph.c | 24 ------------ 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/soh/soh/Enhancements/debugger/colViewer.h b/soh/soh/Enhancements/debugger/colViewer.h index 5252bc950..b4807e873 100644 --- a/soh/soh/Enhancements/debugger/colViewer.h +++ b/soh/soh/Enhancements/debugger/colViewer.h @@ -2,11 +2,6 @@ #include -#ifdef __cplusplus -extern "C" -#endif -void DrawColViewer(); - typedef enum { COLVIEW_DISABLED, COLVIEW_SOLID, @@ -23,4 +18,4 @@ class ColViewerWindow : public Ship::GuiWindow { void UpdateElement() override {}; }; -#endif \ No newline at end of file +#endif diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index 088e69713..7d09dfb63 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -1,6 +1,7 @@ #include "valueViewer.h" #include "soh/SohGui/UIWidgets.hpp" #include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include @@ -14,6 +15,10 @@ void GfxPrint_SetPos(GfxPrint* printer, s32 x, s32 y); s32 GfxPrint_Printf(GfxPrint* printer, const char* fmt, ...); } +#define CVAR_NAME CVAR_DEVELOPER_TOOLS("ValueViewerEnablePrinting") +#define CVAR_DEFAULT 0 +#define CVAR_VALUE CVarGetInteger(CVAR_NAME, CVAR_DEFAULT) + ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); std::vector valueTable = { @@ -104,8 +109,40 @@ extern "C" void ValueViewer_Draw(GfxPrint* printer) { } } +extern "C" void ValueViewer_SetupDraw() { + OPEN_DISPS(gGameState->gfxCtx); + + Gfx* gfx; + Gfx* polyOpa; + GfxPrint printer; + + polyOpa = POLY_OPA_DISP; + gfx = Graph_GfxPlusOne(polyOpa); + gSPDisplayList(OVERLAY_DISP++, gfx); + + GfxPrint_Init(&printer); + GfxPrint_Open(&printer, gfx); + + ValueViewer_Draw(&printer); + + gfx = GfxPrint_Close(&printer); + GfxPrint_Destroy(&printer); + + gSPEndDisplayList(gfx++); + Graph_BranchDlist(polyOpa, gfx); + POLY_OPA_DISP = gfx; + + CLOSE_DISPS(gGameState->gfxCtx); +} + +void RegisterValueViewerHooks() { + COND_HOOK(OnGameFrameUpdate, CVAR_VALUE, []() { ValueViewer_SetupDraw(); }); +} + +RegisterShipInitFunc initFunc(RegisterValueViewerHooks, { CVAR_NAME }); + void ValueViewerWindow::DrawElement() { - UIWidgets::PaddedEnhancementCheckbox("Enable Printing", CVAR_DEVELOPER_TOOLS("ValueViewerEnablePrinting")); + UIWidgets::PaddedEnhancementCheckbox("Enable Printing", CVAR_NAME); ImGui::BeginGroup(); static int selectedElement = -1; diff --git a/soh/soh/Enhancements/debugger/valueViewer.h b/soh/soh/Enhancements/debugger/valueViewer.h index 747d39018..e93491fa5 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.h +++ b/soh/soh/Enhancements/debugger/valueViewer.h @@ -42,12 +42,4 @@ class ValueViewerWindow : public Ship::GuiWindow { void UpdateElement() override {}; }; -extern "C" { -#include #endif - -void ValueViewer_Draw(GfxPrint* printer); - -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index 06d84aa3b..51f8fcd17 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -6,8 +6,6 @@ #include #include -#include "soh/Enhancements/debugger/colViewer.h" -#include "soh/Enhancements/debugger/valueViewer.h" #include "soh/Enhancements/gameconsole.h" #include "soh/OTRGlobals.h" #include "libultraship/bridge.h" @@ -300,28 +298,6 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { OPEN_DISPS(gfxCtx); - if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ValueViewerEnablePrinting"), 0)) { - Gfx* gfx; - Gfx* polyOpa; - GfxPrint printer; - - polyOpa = POLY_OPA_DISP; - gfx = Graph_GfxPlusOne(polyOpa); - gSPDisplayList(OVERLAY_DISP++, gfx); - - GfxPrint_Init(&printer); - GfxPrint_Open(&printer, gfx); - - ValueViewer_Draw(&printer); - - gfx = GfxPrint_Close(&printer); - GfxPrint_Destroy(&printer); - - gSPEndDisplayList(gfx++); - Graph_BranchDlist(polyOpa, gfx); - POLY_OPA_DISP = gfx; - } - gDPNoOpString(WORK_DISP++, "WORK_DISP 終了", 0); gDPNoOpString(POLY_OPA_DISP++, "POLY_OPA_DISP 終了", 0); gDPNoOpString(POLY_XLU_DISP++, "POLY_XLU_DISP 終了", 0); From f7d6a4713993b2b462b59697c53bd0f6c939f0dc Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 13 Feb 2025 04:09:58 -0500 Subject: [PATCH 043/267] Fix issues leftover from PR #5023 (#5054) --- soh/soh/Enhancements/randomizer/context.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index d2eb4f2e1..9ae705295 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -174,8 +174,17 @@ void Context::GenerateLocationPool() { location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO )) || + (location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || - (location.GetRCType() == RCTYPE_FISH && mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF)) || + (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || + (location.GetRCType() == RCTYPE_FISH && ( + mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF) || + (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OVERWORLD) && location.GetScene() == SCENE_FISHING_POND) || + (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) && (location.GetScene() != SCENE_FISHING_POND || + (mOptions[RSK_FISHSANITY_AGE_SPLIT].Is(RO_GENERIC_OFF) && ( + location.GetRandomizerCheck() >= RC_LH_ADULT_FISH_1 && location.GetRandomizerCheck() <= RC_LH_ADULT_LOACH)) + )) + )) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && From dbf7fcf7756b04b3782f65b5ce5d490ab946bbe2 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Thu, 13 Feb 2025 04:10:27 -0500 Subject: [PATCH 044/267] explicitly exclude ganon + triforce completed (#5050) --- .../Enhancements/randomizer/randomizer_check_tracker.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 0b5178621..a84922ba7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -80,7 +80,6 @@ bool initialized; bool doAreaScroll; bool previousShowHidden = false; bool hideShopUnshuffledChecks = true; -bool hideTriforceCompleted = true; bool alwaysShowGS = false; std::map startingShopItem = { { SCENE_KOKIRI_SHOP, RC_KF_SHOP_ITEM_1 }, @@ -1192,8 +1191,6 @@ void LoadSettings() { showLinksPocket = IS_RANDO ? // don't show Link's Pocket if not randomizer, or if rando and pocket is disabled OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING :false; - hideTriforceCompleted = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT) != RO_GENERIC_ON : false; if (IS_RANDO) { switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS)) { @@ -1300,7 +1297,8 @@ bool IsCheckShuffled(RandomizerCheck rc) { OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) && (loc->GetRCType() != RCTYPE_SHOP || (showShops && OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1).enGirlAShopItem == 50)) && - (rc != RC_TRIFORCE_COMPLETED || !hideTriforceCompleted) && + (rc != RC_TRIFORCE_COMPLETED) && + (rc != RC_GANON) && (loc->GetRCType() != RCTYPE_SCRUB || showScrubs || (showMajorScrubs && (rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized From 668040562fae802d7e416d15e6201585d9d075aa Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 14 Feb 2025 21:29:22 +0100 Subject: [PATCH 045/267] Autosave Overhaul (#5022) * Autosave interval based * Move to save on soft reset, remove adjustable interval * Use new BeforeExitGame hook to prevent non-existent data problems * Fix check tracker crash, remove BeforeExitGame hook * update comment --- soh/include/functions.h | 1 - soh/soh/Enhancements/Autosave.cpp | 78 ++++++++++++++++++ soh/soh/Enhancements/Autosave.h | 4 + soh/soh/Enhancements/debugconsole.cpp | 1 - soh/soh/Enhancements/enhancementTypes.h | 9 -- soh/soh/Enhancements/mods.cpp | 82 ------------------- soh/soh/Enhancements/presets.h | 5 +- .../Enhancements/randomizer/randomizer.cpp | 4 + .../randomizer/randomizer_check_tracker.cpp | 4 +- soh/soh/SohGui/SohGui.cpp | 1 - soh/soh/SohGui/SohMenuBar.cpp | 12 ++- soh/soh/config/ConfigMigrators.h | 1 - soh/src/code/z_play.c | 8 -- 13 files changed, 96 insertions(+), 114 deletions(-) create mode 100644 soh/soh/Enhancements/Autosave.cpp create mode 100644 soh/soh/Enhancements/Autosave.h diff --git a/soh/include/functions.h b/soh/include/functions.h index 8f902c5a8..147500c66 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -1073,7 +1073,6 @@ uint16_t Interface_DrawTextLine(GraphicsContext* gfx, char text[], int16_t x, in u8 Item_Give(PlayState* play, u8 item); u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry); u8 Item_CheckObtainability(u8 item); -void PerformAutosave(PlayState* play, u8 item); void Inventory_DeleteItem(u16 item, u16 invSlot); s32 Inventory_ReplaceItem(PlayState* play, u16 oldItem, u16 newItem); s32 Inventory_HasEmptyBottle(void); diff --git a/soh/soh/Enhancements/Autosave.cpp b/soh/soh/Enhancements/Autosave.cpp new file mode 100644 index 000000000..74b548dab --- /dev/null +++ b/soh/soh/Enhancements/Autosave.cpp @@ -0,0 +1,78 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Notification/Notification.h" +#include "soh/ShipInit.hpp" +#include "soh/SaveManager.h" + +extern "C" { +extern PlayState* gPlayState; +#include "functions.h" +#include "variables.h" +} + +static uint64_t lastSaveTimestamp = GetUnixTimestamp(); + +#define CVAR_AUTOSAVE_NAME CVAR_ENHANCEMENT("Autosave") +#define CVAR_AUTOSAVE_DEFAULT AUTOSAVE_OFF +#define CVAR_AUTOSAVE_VALUE CVarGetInteger(CVAR_AUTOSAVE_NAME, CVAR_AUTOSAVE_DEFAULT) +#define THREE_MINUTES_IN_UNIX 3 * 60000 + +typedef enum { + AUTOSAVE_OFF, + AUTOSAVE_ON, +} AutosaveOptions; + +bool Autosave_CanSave() { + + // Don't save when in title screen + // Don't save the first 60 frames to not save the magic meter when it's still in the animation of filling it. + // Don't save in Ganon's fight and chamber of sages because of master sword and remember save location issues. + if (!GameInteractor::IsSaveLoaded(true) || gPlayState->gameplayFrames < 60 || + gPlayState->sceneNum == SCENE_GANON_BOSS || gPlayState->sceneNum == SCENE_CHAMBER_OF_THE_SAGES) { + return false; + } + + return true; +} + +void Autosave_PerformSave() { + Play_PerformSave(gPlayState); + + // Send notification + Notification::Emit({ + .message = "Game autosaved", + }); +} + +void Autosave_IntervalSave() { + // Check if the interval has passed in minutes. + uint64_t currentTimestamp = GetUnixTimestamp(); + if ((currentTimestamp - lastSaveTimestamp) < THREE_MINUTES_IN_UNIX) { + return; + } + + // If save available to create, do it and reset the interval. + // Interval gets extra check for being paused to avoid rare issues like bypassing shop + // rupees draining after buying an item. Since the interval can just retry until it + // passes, it can use more conditions without hampering the player experience. + if (Autosave_CanSave() && !GameInteractor::IsGameplayPaused()) { + + // Reset timestamp, set icon timer to show autosave icon for 5 seconds (100 frames) + lastSaveTimestamp = currentTimestamp; + + Autosave_PerformSave(); + } +} + +void Autosave_SoftResetSave() { + if (Autosave_CanSave()) { + Autosave_PerformSave(); + } +} + +void RegisterAutosave() { + COND_HOOK(GameInteractor::OnGameFrameUpdate, CVAR_AUTOSAVE_VALUE, Autosave_IntervalSave); + COND_HOOK(GameInteractor::OnExitGame, CVAR_AUTOSAVE_VALUE, [](int32_t fileNum) { Autosave_SoftResetSave(); }); +} + +static RegisterShipInitFunc initFunc(RegisterAutosave, { CVAR_AUTOSAVE_NAME }); diff --git a/soh/soh/Enhancements/Autosave.h b/soh/soh/Enhancements/Autosave.h new file mode 100644 index 000000000..202fcde4f --- /dev/null +++ b/soh/soh/Enhancements/Autosave.h @@ -0,0 +1,4 @@ +typedef enum { + AUTOSAVE_OFF, + AUTOSAVE_ON, +} AutosaveOptions; diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 7037f9b0a..5df00dfab 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -208,7 +208,6 @@ static bool ResetHandler(std::shared_ptr Console, std::vectorrunning = false; GameInteractor::Instance->ExecuteHooks(gSaveContext.fileNum); diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index 4b2f825f5..db96a7700 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -52,15 +52,6 @@ typedef enum { ENEMY_RANDOMIZER_RANDOM_SEEDED, } EnemyRandomizerMode; -typedef enum { - AUTOSAVE_OFF, - AUTOSAVE_LOCATION_AND_MAJOR_ITEMS, - AUTOSAVE_LOCATION_AND_ALL_ITEMS, - AUTOSAVE_LOCATION, - AUTOSAVE_MAJOR_ITEMS, - AUTOSAVE_ALL_ITEMS -} AutosaveType; - typedef enum { BOOTSEQUENCE_DEFAULT, BOOTSEQUENCE_AUTHENTIC, diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index bbfcf1052..e6777644e 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -135,87 +135,6 @@ void RegisterOcarinaTimeTravel() { }); } -void AutoSave(GetItemEntry itemEntry) { - u8 item = itemEntry.itemId; - bool performSave = false; - // Don't autosave immediately after buying items from shops to prevent getting them for free! - // Don't autosave in the Chamber of Sages since resuming from that map breaks the game - // Don't autosave during the Ganon fight when picking up the Master Sword - 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 - performSave = true; - - } else if (((CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS) || (CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_MAJOR_ITEMS)) && (item != ITEM_NONE)) { - // Autosave for major items - if (itemEntry.modIndex == 0) { - switch (item) { - case ITEM_STICK: - case ITEM_NUT: - case ITEM_BOMB: - case ITEM_BOW: - case ITEM_SEEDS: - case ITEM_FISHING_POLE: - case ITEM_MAGIC_SMALL: - case ITEM_MAGIC_LARGE: - case ITEM_INVALID_4: - case ITEM_INVALID_5: - case ITEM_INVALID_6: - case ITEM_INVALID_7: - case ITEM_HEART: - case ITEM_RUPEE_GREEN: - case ITEM_RUPEE_BLUE: - case ITEM_RUPEE_RED: - case ITEM_RUPEE_PURPLE: - case ITEM_RUPEE_GOLD: - case ITEM_INVALID_8: - case ITEM_STICKS_5: - case ITEM_STICKS_10: - case ITEM_NUTS_5: - case ITEM_NUTS_10: - case ITEM_BOMBS_5: - case ITEM_BOMBS_10: - case ITEM_BOMBS_20: - case ITEM_BOMBS_30: - case ITEM_ARROWS_SMALL: - case ITEM_ARROWS_MEDIUM: - case ITEM_ARROWS_LARGE: - case ITEM_SEEDS_30: - case ITEM_NONE: - break; - case ITEM_BOMBCHU: - case ITEM_BOMBCHUS_5: - case ITEM_BOMBCHUS_20: - if (!CVarGetInteger(CVAR_ENHANCEMENT("EnableBombchuDrops"), 0)) { - performSave = true; - } - break; - default: - performSave = true; - break; - } - } else if (itemEntry.modIndex == 1 && item != RG_ICE_TRAP) { - performSave = true; - } - } else if (CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS || - CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS || - CVarGetInteger(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_OFF) == AUTOSAVE_LOCATION) { - performSave = true; - } - if (performSave) { - Play_PerformSave(gPlayState); - performSave = false; - } - } -} - -void RegisterAutoSave() { - GameInteractor::Instance->RegisterGameHook([](GetItemEntry itemEntry) { AutoSave(itemEntry); }); - GameInteractor::Instance->RegisterGameHook([](GetItemEntry itemEntry) { AutoSave(itemEntry); }); - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { AutoSave(GET_ITEM_NONE); }); -} - void RegisterRupeeDash() { GameInteractor::Instance->RegisterGameHook([]() { if (!CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0)) { @@ -1168,7 +1087,6 @@ void InitMods() { TimeSavers_Register(); RegisterTTS(); RegisterOcarinaTimeTravel(); - RegisterAutoSave(); RegisterDaytimeGoldSkultullas(); RegisterRupeeDash(); RegisterShadowTag(); diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index d61ff6ade..83b0e94d5 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -157,7 +157,6 @@ const std::vector enhancementsCvars = { CVAR_ENHANCEMENT("GSCutscene"), CVAR_ENHANCEMENT("RestoreRBAValues"), CVAR_ENHANCEMENT("SkipSaveConfirmation"), - CVAR_ENHANCEMENT("Autosave"), CVAR_ENHANCEMENT("DisableCritWiggle"), CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), CVAR_ENHANCEMENT("SkipArrowAnimation"), @@ -754,7 +753,7 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AnubisFix"), 1), // Autosave - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_LOCATION_AND_MAJOR_ITEMS), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), // Bombchu shop doesn't sell out, and 10 bombchus cost 99 instead of 100 PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1), @@ -887,7 +886,7 @@ const std::vector randomizerPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AnubisFix"), 1), // Autosave - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), AUTOSAVE_LOCATION_AND_MAJOR_ITEMS), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), // Customize Fishing Behaviour PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index d1ca49162..44831c7c0 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -39,6 +39,7 @@ #include "soh/util.h" #include "fishsanity.h" #include "randomizerTypes.h" +#include "soh/Notification/Notification.h" extern std::map rcAreaNames; @@ -4105,6 +4106,9 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { gSaveContext.ship.stats.gameComplete = 1; Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); Play_PerformSave(play); + Notification::Emit({ + .message = "Game autosaved", + }); GameInteractor_SetTriforceHuntCreditsWarpActive(true); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index a84922ba7..e3b07b672 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -1382,7 +1382,9 @@ void UpdateAllAreas() { } void UpdateAreas(RandomizerCheckArea area) { - areasFullyChecked[area] = areaChecksGotten[area] == checksByArea.find(area)->second.size(); + if (checksByArea.contains(area)) { + areasFullyChecked[area] = areaChecksGotten[area] == checksByArea.find(area)->second.size(); + } } void UpdateAllOrdering() { diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 84a44b052..8d7a4ba45 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -64,7 +64,6 @@ namespace SohGui { static const char* subPowers[8] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6], allPowers[7] }; 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* bonkDamageValues[8] = { "No Damage", "0.25 Heart", diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index e6337dae6..bad852f7a 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -45,6 +45,7 @@ #include "soh/Enhancements/randomizer/Plandomizer.h" #include "soh/Enhancements/TimeDisplay/TimeDisplay.h" #include "soh/AboutWindow.h" +#include "soh/Enhancements/Autosave.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,7 +105,6 @@ static const char* imguiScaleOptions[4] = { "Small", "Normal", "Large", "X-Large static const char* subPowers[8] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6], allPowers[7] }; 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* DekuStickCheat[3] = { "Normal", "Unbreakable", "Unbreakable + Always on Fire" }; @@ -1569,13 +1569,11 @@ void DrawEnhancementsMenu() { ImGui::EndMenu(); } - UIWidgets::PaddedSeparator(false, true); + UIWidgets::PaddedSeparator(); - // Autosave enum value of 1 is the default in presets and the old checkbox "on" state for backwards compatibility - UIWidgets::PaddedText("Autosave", false, true); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("Autosave"), autosaveLabels, AUTOSAVE_OFF); - UIWidgets::Tooltip("Automatically save the game when changing locations and/or obtaining items\n" - "Major items exclude rupees and health/magic/ammo refills (but include bombchus unless bombchu drops are enabled)"); + UIWidgets::EnhancementCheckbox("Autosave", CVAR_ENHANCEMENT("Autosave")); + UIWidgets::Tooltip("Save the game automatically on a 3 minute interval and when soft-resetting the game.\n\n" + "The interval autosave will wait if the game is paused in any way (dialogue, pause screen up, cutscenes)."); UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index 3a566f493..29cbb0774 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -145,7 +145,6 @@ namespace SOH { { MigrationAction::Rename, "gAskToEquip", "gEnhancements.AskToEquip" }, { MigrationAction::Rename, "gAssignableTunicsAndBoots", "gEnhancements.AssignableTunicsAndBoots" }, { MigrationAction::Rename, "gAuthenticLogo", "gEnhancements.AuthenticLogo" }, - { MigrationAction::Rename, "gAutosave", "gEnhancements.Autosave" }, { MigrationAction::Rename, "gBetterFW", "gEnhancements.BetterFarore" }, { MigrationAction::Rename, "gBetterOwl", "gEnhancements.BetterOwl" }, { MigrationAction::Rename, "gBlueFireArrows", "gEnhancements.BlueFireArrows" }, diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 0b6db75b1..115369171 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -2206,13 +2206,5 @@ void Play_PerformSave(PlayState* play) { // Restore temp B values back gSaveContext.equips.buttonItems[0] = prevB; gSaveContext.buttonStatus[0] = prevStatus; - - uint8_t triforceHuntCompleted = - IS_RANDO && - 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"); - } } } From 6df5abc30b177bc3cdf2d1f86aa0b7ddc5610edc Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Fri, 14 Feb 2025 15:30:11 -0500 Subject: [PATCH 046/267] Fix ER + Fishsanity settings combos (#5061) --- soh/soh/Enhancements/randomizer/3drando/fill.cpp | 2 +- soh/soh/Enhancements/randomizer/context.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 9c2bff044..ff3413e98 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -602,7 +602,7 @@ void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAcce auto message = "Location " + Rando::StaticData::GetLocation(ctx->GetItemLocation(loc)->GetRandomizerCheck())->GetName() + " not reachable\n"; - SPDLOG_DEBUG(message); + LUSLOG_DEBUG("%s", message.c_str()); #ifndef ENABLE_DEBUG break; #endif diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 9ae705295..ba9ab6d2c 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -178,12 +178,14 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || (location.GetRCType() == RCTYPE_FISH && ( - mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF) || + mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF) || mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_HYRULE_LOACH) || (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OVERWORLD) && location.GetScene() == SCENE_FISHING_POND) || - (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) && (location.GetScene() != SCENE_FISHING_POND || - (mOptions[RSK_FISHSANITY_AGE_SPLIT].Is(RO_GENERIC_OFF) && ( - location.GetRandomizerCheck() >= RC_LH_ADULT_FISH_1 && location.GetRandomizerCheck() <= RC_LH_ADULT_LOACH)) - )) + (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) && location.GetScene() != SCENE_FISHING_POND) || + ((mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) || mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_BOTH)) && + (mOptions[RSK_FISHSANITY_AGE_SPLIT].Is(RO_GENERIC_OFF) && ( + location.GetRandomizerCheck() >= RC_LH_ADULT_FISH_1 && location.GetRandomizerCheck() <= RC_LH_ADULT_LOACH) + ) + ) )) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || From 20a9f4190659c2108437a798d87605e86e8c49ef Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:32:25 -0800 Subject: [PATCH 047/267] remove unused `VB_SHOULD`s (#5056) * remove an unused should * another unused * remove more unused * one more * remove case * more cases for unused shoulds --- soh/soh/Enhancements/boss-rush/BossRush.cpp | 7 ------- .../vanilla-behavior/GIVanillaBehavior.h | 18 ------------------ .../Enhancements/randomizer/hook_handlers.cpp | 3 --- 3 files changed, 28 deletions(-) diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index 96220f057..aabe5d67a 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -522,13 +522,6 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } break; } - // Replace the blue warp transitions with ones that lead back to the chamber of sages - case VB_BLUE_WARP_APPLY_ENTRANCE_AND_CUTSCENE: { - DoorWarp1* blueWarp = va_arg(args, DoorWarp1*); - BossRush_HandleBlueWarp(gPlayState, blueWarp->actor.world.pos.x, blueWarp->actor.world.pos.z); - *should = false; - break; - } // Spawn clean blue warps (no ruto, adult animation, etc) case VB_SPAWN_BLUE_WARP: { switch (gPlayState->sceneNum) { diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 96453dff8..a9118c776 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -212,9 +212,6 @@ typedef enum { // - None VB_BIGGORON_CONSIDER_TRADE_COMPLETE, - // # UNUSED - VB_BLUE_WARP_APPLY_ENTRANCE_AND_CUTSCENE, - // #### `result` // Actor is ACTOR_EN_ELF, ACTOR_EN_FISH, ACTOR_EN_ICE_HONO, or ACTOR_EN_INSECT // ```c @@ -335,9 +332,6 @@ typedef enum { // - None VB_DEKU_STICK_BURN_OUT, - // # UNUSED - VB_DEKU_UPDATE_BURNING_DEKU_STICK, - // #### `result` // ```c // Flags_GetItemGetInf(ITEMGETINF_30) @@ -730,12 +724,6 @@ typedef enum { // - None VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD, - // # UNUSED - VB_GIVE_ITEM_GORON_RUBY, - - // # UNUSED - VB_GIVE_ITEM_KOKIRI_EMERALD, - // #### `result` // ```c // true @@ -904,9 +892,6 @@ typedef enum { // - None VB_GIVE_ITEM_ZELDAS_LULLABY, - // # UNUSED - VB_GIVE_ITEM_ZORA_SAPPHIRE, - // #### `result` // ```c // false @@ -1390,9 +1375,6 @@ typedef enum { // - None VB_PLAY_NABOORU_CAPTURED_CS, - // # UNUSED - VB_PLAY_ODD_POTION_ANIM, - // #### `result` // ```c // true diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index da2281894..5eee3541a 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1667,9 +1667,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_GIVE_ITEM_STRENGTH_1: case VB_GIVE_ITEM_ZELDAS_LETTER: case VB_GIVE_ITEM_OCARINA_OF_TIME: - case VB_GIVE_ITEM_KOKIRI_EMERALD: - case VB_GIVE_ITEM_GORON_RUBY: - case VB_GIVE_ITEM_ZORA_SAPPHIRE: case VB_GIVE_ITEM_LIGHT_MEDALLION: case VB_GIVE_ITEM_FOREST_MEDALLION: case VB_GIVE_ITEM_FIRE_MEDALLION: From 169a3d742d09188a0591fc047b1b252d8cb01a8f Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Fri, 14 Feb 2025 21:59:02 -0800 Subject: [PATCH 048/267] make `cmake_minimum_required` consistent between root `CMakeLists.txt` and `soh/CMakeLists.txt` (#5066) also remove some version checks that don't apply anymore --- CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index edbe5b44b..3437ef3fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) +cmake_minimum_required(VERSION 3.26.0 FATAL_ERROR) set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") @@ -195,8 +195,7 @@ find_package(Python3 COMPONENTS Interpreter) # Target to generate OTRs add_custom_target( ExtractAssets - # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions - COMMAND ${CMAKE_COMMAND} -E $,remove,rm> -f oot.otr oot-mq.otr soh.otr + COMMAND ${CMAKE_COMMAND} -E rm -f oot.otr oot-mq.otr soh.otr COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../soh/assets/xml --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter @@ -217,8 +216,7 @@ add_custom_target( # Target to generate only soh.otr add_custom_target( GenerateSohOtr - # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions - COMMAND ${CMAKE_COMMAND} -E $,remove,rm> -f soh.otr + COMMAND ${CMAKE_COMMAND} -E rm -f soh.otr COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -DONLYSOHOTR=On -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter From 2645a5fce27379981d939499af40299b4c0484f3 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:58:26 -0800 Subject: [PATCH 049/267] bump lus (#5065) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index 74f1c35cd..f776531ab 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 74f1c35cd3bfa4f9e746c85234b8cb716c592a54 +Subproject commit f776531abf74db98f8d9c7da64e9a21590af65ad From 6f22c05eec784ba68c649876d82cdaffc9cfde6b Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Sat, 15 Feb 2025 23:25:30 -0800 Subject: [PATCH 050/267] pin linuxdeploy (#5070) * test forked linuxdeploy * pin version --- CMake/Packaging.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMake/Packaging.cmake b/CMake/Packaging.cmake index 907f8da76..e809e32ab 100644 --- a/CMake/Packaging.cmake +++ b/CMake/Packaging.cmake @@ -60,7 +60,7 @@ if (NOT LINUXDEPLOY_EXECUTABLE) message(STATUS "Downloading linuxdeploy") set(LINUXDEPLOY_EXECUTABLE ${CPACK_PACKAGE_DIRECTORY}/linuxdeploy/linuxdeploy) file(DOWNLOAD - https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20240109-1/linuxdeploy-x86_64.AppImage ${LINUXDEPLOY_EXECUTABLE} INACTIVITY_TIMEOUT 10 LOG ${CPACK_PACKAGE_DIRECTORY}/linuxdeploy/download.log From 489cd84faa2c4a5ecf47bca2067a4abdf473d4ab Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 17 Feb 2025 23:43:51 +0100 Subject: [PATCH 051/267] Clean up autosave header (#5077) --- soh/soh/Enhancements/Autosave.h | 4 ---- soh/soh/SohGui/SohMenuBar.cpp | 1 - 2 files changed, 5 deletions(-) delete mode 100644 soh/soh/Enhancements/Autosave.h diff --git a/soh/soh/Enhancements/Autosave.h b/soh/soh/Enhancements/Autosave.h deleted file mode 100644 index 202fcde4f..000000000 --- a/soh/soh/Enhancements/Autosave.h +++ /dev/null @@ -1,4 +0,0 @@ -typedef enum { - AUTOSAVE_OFF, - AUTOSAVE_ON, -} AutosaveOptions; diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index bad852f7a..053ed9e13 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -45,7 +45,6 @@ #include "soh/Enhancements/randomizer/Plandomizer.h" #include "soh/Enhancements/TimeDisplay/TimeDisplay.h" #include "soh/AboutWindow.h" -#include "soh/Enhancements/Autosave.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 From cc25c96385cecbfd08bd17687df18ed32cdeecf6 Mon Sep 17 00:00:00 2001 From: Miles Acquaviva Date: Mon, 17 Feb 2025 20:03:55 -0500 Subject: [PATCH 052/267] Added and implemented TrailType enum (#5059) * added TrailType enum * fixed build, moved declaration * added enhancement comment * Apply suggestions from code review --------- Co-authored-by: link5669 --- soh/include/z64effect.h | 18 +++++++++++++++--- soh/src/code/z_eff_blure.c | 18 +++++++++--------- soh/src/code/z_player_lib.c | 4 ++-- .../overlays/actors/ovl_En_Arrow/z_en_arrow.c | 8 ++++---- .../actors/ovl_En_Bom_Chu/z_en_bom_chu.c | 2 +- .../overlays/actors/ovl_En_Boom/z_en_boom.c | 2 +- .../actors/ovl_player_actor/z_player.c | 2 +- 7 files changed, 33 insertions(+), 21 deletions(-) diff --git a/soh/include/z64effect.h b/soh/include/z64effect.h index d1d6b3329..6804e0981 100644 --- a/soh/include/z64effect.h +++ b/soh/include/z64effect.h @@ -14,6 +14,18 @@ struct PlayState; #define TOTAL_EFFECT_COUNT SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT +typedef enum { + TRAIL_TYPE_REST, + TRAIL_TYPE_SWORDS, + TRAIL_TYPE_BOOMERANG, + TRAIL_TYPE_BOMBCHU, + TRAIL_TYPE_KOKIRI_SWORD, + TRAIL_TYPE_MASTER_SWORD, + TRAIL_TYPE_BIGGORON_SWORD, + TRAIL_TYPE_STICK, + TRAIL_TYPE_HAMMER +} TrailType; //SOH [Enhancements] + typedef struct { /* 0x00 */ u8 active; /* 0x01 */ u8 unk_01; @@ -73,7 +85,7 @@ typedef struct { /* 0x194 */ s32 elemDuration; /* 0x198 */ s32 unkFlag; /* 0x19C */ s32 calcMode; - /* 0x1A0 */ u8 trailType; // 1 is swords, 2 is boomerang, 3 is bombchu, 0 is rest + /* 0x1A0 */ TrailType trailType; //SOH [Enhancements] } EffectBlureInit1; // size = 0x1A0 typedef struct { @@ -90,7 +102,7 @@ typedef struct { /* 0x1B */ u8 mode4Param; /* 0x1C */ Color_RGBA8 altPrimColor; // used with drawMode 1 /* 0x20 */ Color_RGBA8 altEnvColor; // used with drawMode 1 - /* 0x1A0 */ u8 trailType; // 1 is swords, 2 is boomerang, 3 is bombchu, 4 is stick, 0 is rest + /* 0x1A0 */ TrailType trailType; //SOH [Enhancements] } EffectBlureInit2; // size = 0x24 typedef struct { @@ -110,7 +122,7 @@ typedef struct { /* 0x1A1 */ u8 drawMode; // 0: simple; 1: simple with alt colors; 2+: smooth /* 0x1A2 */ Color_RGBA8 altPrimColor; // used with drawMode 1 /* 0x1A6 */ Color_RGBA8 altEnvColor; // used with drawMode 1 - /* 0x1A0 */ u8 trailType; // 1 is default swords, 2 is boomerang, 3 is bombchu, 0 is rest. 4 is Kokiri, 5 is Master, 6 is BGS, 7 is Stick, 8 is Hammer. + /* 0x1A0 */ TrailType trailType; //SOH [Enhancements] } EffectBlure; // size = 0x1AC typedef struct { diff --git a/soh/src/code/z_eff_blure.c b/soh/src/code/z_eff_blure.c index 82e50fc65..f5716dc16 100644 --- a/soh/src/code/z_eff_blure.c +++ b/soh/src/code/z_eff_blure.c @@ -206,8 +206,8 @@ s32 EffectBlure_Update(void* thisx) { static u8 changed = 0; u8 reset = 0; - switch (this->trailType) { //there HAS to be a better way to do this. - case 2: + switch (this->trailType) { + case TRAIL_TYPE_BOOMERANG: if (CVarGetInteger(CVAR_COSMETIC("Trails.Boomerang.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.Boomerang.Value"), (Color_RGBA8){ 255, 255, 100, 255 }); changed = 1; @@ -216,7 +216,7 @@ s32 EffectBlure_Update(void* thisx) { reset = 1; } break; - case 3: + case TRAIL_TYPE_BOMBCHU: if (CVarGetInteger(CVAR_COSMETIC("Trails.Bombchu.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.Bombchu.Value"), (Color_RGBA8){ 250, 0, 0, 255 }); this->p1StartColor.r = color.r; @@ -247,7 +247,7 @@ s32 EffectBlure_Update(void* thisx) { this->p2EndColor.b = color.b * 0.4f; } break; - case 4: + case TRAIL_TYPE_KOKIRI_SWORD: if (CVarGetInteger(CVAR_COSMETIC("Trails.KokiriSword.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.KokiriSword.Value"), (Color_RGBA8){ 255, 255, 255, 255 }); changed = 1; @@ -256,7 +256,7 @@ s32 EffectBlure_Update(void* thisx) { reset = 1; } break; - case 5: + case TRAIL_TYPE_MASTER_SWORD: if (CVarGetInteger(CVAR_COSMETIC("Trails.MasterSword.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.MasterSword.Value"), (Color_RGBA8){ 255, 255, 255, 255 }); changed = 1; @@ -265,7 +265,7 @@ s32 EffectBlure_Update(void* thisx) { reset = 1; } break; - case 6: + case TRAIL_TYPE_BIGGORON_SWORD: if (CVarGetInteger(CVAR_COSMETIC("Trails.BiggoronSword.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.BiggoronSword.Value"), (Color_RGBA8){ 255, 255, 255, 255 }); changed = 1; @@ -274,7 +274,7 @@ s32 EffectBlure_Update(void* thisx) { reset = 1; } break; - case 7: + case TRAIL_TYPE_STICK: if (CVarGetInteger(CVAR_COSMETIC("Trails.Stick.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.Stick.Value"), (Color_RGBA8){ 255, 255, 255, 255 }); changed = 1; @@ -283,7 +283,7 @@ s32 EffectBlure_Update(void* thisx) { reset = 1; } break; - case 8: + case TRAIL_TYPE_HAMMER: if (CVarGetInteger(CVAR_COSMETIC("Trails.Hammer.Changed"), 0)) { color = CVarGetColor(CVAR_COSMETIC("Trails.Hammer.Value"), (Color_RGBA8){ 255, 255, 255, 255 }); changed = 1; @@ -316,7 +316,7 @@ s32 EffectBlure_Update(void* thisx) { } // Don't override boomerang and bombchu trail durations - if (this->trailType != 2 && this->trailType != 3) { + if (this->trailType != TRAIL_TYPE_BOOMERANG && this->trailType != TRAIL_TYPE_BOMBCHU) { if (CVarGetInteger(CVAR_COSMETIC("Trails.Duration.Changed"), 0)) { this->elemDuration = CVarGetInteger(CVAR_COSMETIC("Trails.Duration.Value"), 4); } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index dd15a4932..9d4b55091 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1748,7 +1748,7 @@ f32 sMeleeWeaponLengths[] = { }; f32 sSwordTypes[] = { - 0, 5, 4, 6, 0, 8, + TRAIL_TYPE_REST, TRAIL_TYPE_MASTER_SWORD, TRAIL_TYPE_KOKIRI_SWORD, TRAIL_TYPE_BIGGORON_SWORD, TRAIL_TYPE_REST, TRAIL_TYPE_HAMMER, }; Gfx* sBottleDLists[] = { gLinkAdultBottleDL, gLinkChildBottleDL }; @@ -1821,7 +1821,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList, Ve D_80126080.x = this->unk_85C * 5000.0f; func_80090A28(this, sp124); if (this->meleeWeaponState != 0) { - EffectBlure_ChangeType(Effect_GetByIndex(this->meleeWeaponEffectIndex), 7); // stick sword type + EffectBlure_ChangeType(Effect_GetByIndex(this->meleeWeaponEffectIndex), TRAIL_TYPE_STICK); func_800906D4(play, this, sp124); } else { Math_Vec3f_Copy(&this->meleeWeaponInfo[0].tip, &sp124[0]); 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 8a62ff4ba..f6822ed49 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 @@ -64,19 +64,19 @@ void EnArrow_SetupAction(EnArrow* this, EnArrowActionFunc actionFunc) { void EnArrow_Init(Actor* thisx, PlayState* play) { static EffectBlureInit2 blureNormal = { 0, 4, 0, { 0, 255, 200, 255 }, { 0, 255, 255, 255 }, { 0, 255, 200, 0 }, { 0, 255, 255, 0 }, 16, - 0, 1, 0, { 255, 255, 170, 255 }, { 0, 150, 0, 0 }, 0, + 0, 1, 0, { 255, 255, 170, 255 }, { 0, 150, 0, 0 }, TRAIL_TYPE_REST, }; static EffectBlureInit2 blureFire = { 0, 4, 0, { 0, 255, 200, 255 }, { 0, 255, 255, 255 }, { 0, 255, 200, 0 }, { 0, 255, 255, 0 }, 16, - 0, 1, 0, { 255, 200, 0, 255 }, { 255, 0, 0, 0 }, 0, + 0, 1, 0, { 255, 200, 0, 255 }, { 255, 0, 0, 0 }, TRAIL_TYPE_REST, }; static EffectBlureInit2 blureIce = { 0, 4, 0, { 0, 255, 200, 255 }, { 0, 255, 255, 255 }, { 0, 255, 200, 0 }, { 0, 255, 255, 0 }, 16, - 0, 1, 0, { 170, 255, 255, 255 }, { 0, 100, 255, 0 }, 0, + 0, 1, 0, { 170, 255, 255, 255 }, { 0, 100, 255, 0 }, TRAIL_TYPE_REST, }; static EffectBlureInit2 blureLight = { 0, 4, 0, { 0, 255, 200, 255 }, { 0, 255, 255, 255 }, { 0, 255, 200, 0 }, { 0, 255, 255, 0 }, 16, - 0, 1, 0, { 255, 255, 170, 255 }, { 255, 255, 0, 0 }, 0, + 0, 1, 0, { 255, 255, 170, 255 }, { 255, 255, 0, 0 }, TRAIL_TYPE_REST, }; static u32 dmgFlags[] = { 0x00000800, 0x00000020, 0x00000020, 0x00000800, 0x00001000, 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 e0b2bd7cb..12fbbbde9 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 @@ -85,7 +85,7 @@ void EnBomChu_Init(Actor* thisx, PlayState* play) { blureInit.elemDuration = 16; blureInit.unkFlag = 0; blureInit.calcMode = 0; - blureInit.trailType = 3; + blureInit.trailType = TRAIL_TYPE_BOMBCHU; Effect_Add(play, &this->blure1Index, EFFECT_BLURE1, 0, 0, &blureInit); Effect_Add(play, &this->blure2Index, EFFECT_BLURE1, 0, 0, &blureInit); 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 6f4d00084..85eae391e 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 @@ -89,7 +89,7 @@ void EnBoom_Init(Actor* thisx, PlayState* play) { blure.elemDuration = 8; blure.unkFlag = 0; blure.calcMode = 0; - blure.trailType = 2; + blure.trailType = TRAIL_TYPE_BOOMERANG; Effect_Add(play, &this->effectIndex, EFFECT_BLURE1, 0, 0, &blure); 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 f939d5030..1c9d5a688 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10696,7 +10696,7 @@ static InitChainEntry sInitChain[] = { static EffectBlureInit2 blureSword = { 0, 8, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, 4, - 0, 2, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, 1, + 0, 2, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, TRAIL_TYPE_SWORDS, }; static Vec3s sSkeletonBaseTransl = { -57, 3377, 0 }; From 3d7da51fc718e2dee4d3ae48e05f891b739d67f5 Mon Sep 17 00:00:00 2001 From: Archez Date: Mon, 17 Feb 2025 20:33:36 -0500 Subject: [PATCH 053/267] Remove committed mods folder (#5082) --- mods/custom_mod_files_go_here.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/custom_mod_files_go_here.txt diff --git a/mods/custom_mod_files_go_here.txt b/mods/custom_mod_files_go_here.txt deleted file mode 100644 index e69de29bb..000000000 From 75f33a00d82c06224f0baba1175dead1e81279e9 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 19 Feb 2025 19:08:24 -0500 Subject: [PATCH 054/267] Remove Right-Stick Aiming from Enhancement Presets (#5086) --- soh/soh/Enhancements/presets.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 83b0e94d5..329fbcdc8 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -565,8 +565,6 @@ const std::vector vanillaPlusPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), // Prevent Dropped Ocarina Inputs PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - // Right Stick Aiming - PRESET_ENTRY_S32(CVAR_SETTING("Controls.RightStickAim"), 1), // Text Speed (1 to 5) PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), @@ -637,8 +635,6 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), // Prevent Dropped Ocarina Inputs PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - // Right Stick Aiming - PRESET_ENTRY_S32(CVAR_SETTING("Controls.RightStickAim"), 1), // Text Speed (1 to 5) PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), @@ -770,8 +766,6 @@ const std::vector randomizerPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), // Prevent Dropped Ocarina Inputs PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - // Right Stick Aiming - PRESET_ENTRY_S32(CVAR_SETTING("Controls.RightStickAim"), 1), // Text Speed (1 to 5) PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), From b6e2a995f10d37d20a842511a97f50d9f1ef7a5a Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Wed, 19 Feb 2025 20:22:56 -0500 Subject: [PATCH 055/267] Use VB hook to fix Deku Nut upgrade bug (#5047) * Use VB hook to fix Deku Nut upgrade bug * Use constexpr, remove unused extern * Separate IS_RANDO out of value macro * Restore mask check in hook * Call VB hook in SkipMiscInteractions hook * Mask of Truth hook not registered in rando --- .../Enhancements/Fixes/DekuNutUpgradeFix.cpp | 43 +++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 16 +++++++ .../Enhancements/timesaver_hook_handlers.cpp | 4 +- soh/soh/SohGui/SohMenuBar.cpp | 5 ++- soh/src/code/z_parameter.c | 2 +- .../actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c | 5 ++- 6 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 soh/soh/Enhancements/Fixes/DekuNutUpgradeFix.cpp diff --git a/soh/soh/Enhancements/Fixes/DekuNutUpgradeFix.cpp b/soh/soh/Enhancements/Fixes/DekuNutUpgradeFix.cpp new file mode 100644 index 000000000..2e095c59f --- /dev/null +++ b/soh/soh/Enhancements/Fixes/DekuNutUpgradeFix.cpp @@ -0,0 +1,43 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" +#include "macros.h" +#include "variables.h" +#include "z64save.h" + +extern "C" PlayState* gPlayState; + +static constexpr int32_t CVAR_NUT_UPGRADE_FIX_DEFAULT = 0; +#define CVAR_NUT_UPGRADE_FIX_NAME CVAR_ENHANCEMENT("DekuNutUpgradeFix") +#define CVAR_NUT_UPGRADE_FIX_VALUE CVarGetInteger(CVAR_NUT_UPGRADE_FIX_NAME, CVAR_NUT_UPGRADE_FIX_DEFAULT) + +void DekuNutUpgradeFixAtForestStage(bool* should) { + // This check is needed because of an intentional fallthrough at the source + if (Player_GetMask(gPlayState) == PLAYER_MASK_SKULL) { + return; + } + + s32 expectedNutUpgrades = (INV_CONTENT(ITEM_NUT) == ITEM_NUT ? 1 : 0) + + (Flags_GetInfTable(INFTABLE_BOUGHT_NUT_UPGRADE) ? 1 : 0) + + (Flags_GetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE) ? 1 : 0); + s32 actualNutUpgrades = CUR_UPG_VALUE(UPG_NUTS); + + if (expectedNutUpgrades != actualNutUpgrades) { + Flags_UnsetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE); + *should = true; + } +} + +void DekuNutUpgradeSetByPoachersSaw(bool* should) { + *should = false; +} + +void RegisterDekuNutUpgradeFix() { + COND_VB_SHOULD(VB_POACHERS_SAW_SET_DEKU_NUT_UPGRADE_FLAG, CVAR_NUT_UPGRADE_FIX_VALUE || IS_RANDO, + { DekuNutUpgradeSetByPoachersSaw(should); }); + COND_VB_SHOULD(VB_DEKU_SCRUBS_REACT_TO_MASK_OF_TRUTH, CVAR_NUT_UPGRADE_FIX_VALUE && !IS_RANDO, + { DekuNutUpgradeFixAtForestStage(should); }); +} + +static RegisterShipInitFunc initFunc(RegisterDekuNutUpgradeFix, { CVAR_NUT_UPGRADE_FIX_NAME, "IS_RANDO" }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index a9118c776..1157f3c75 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -287,6 +287,14 @@ typedef enum { // - `*EnTk` VB_DAMPE_IN_GRAVEYARD_DESPAWN, + // #### `result` + // ```c + // !Flags_GetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE) && (Player_GetMask(play) != PLAYER_MASK_SKULL) + // ``` + // #### `args` + // - None + VB_DEKU_SCRUBS_REACT_TO_MASK_OF_TRUTH, + // #### `result` // ```c // CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) @@ -1500,6 +1508,14 @@ typedef enum { // - `*DemoIm` VB_PLAY_ZELDAS_LULLABY_CS, + // #### `result` + // ```c + // item == ITEM_SAW + // ``` + // #### `args` + // - None + VB_POACHERS_SAW_SET_DEKU_NUT_UPGRADE_FLAG, + // #### `result` // ```c // (dropParams >= ITEM00_RUPEE_GREEN) && (dropParams <= ITEM00_BOMBS_SPECIAL) diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index d4675621f..eee2a0e9b 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -92,7 +92,9 @@ void EnDntDemo_JudgeSkipToReward(EnDntDemo* enDntDemo, PlayState* play) { return; } case PLAYER_MASK_TRUTH: { - Flags_SetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE); + if (GameInteractor_Should(VB_DEKU_SCRUBS_REACT_TO_MASK_OF_TRUTH, true)) { + Flags_SetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE); + } return; } default: { diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index 053ed9e13..5fd7324fb 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -1335,7 +1335,10 @@ void DrawEnhancementsMenu() { UIWidgets::PaddedEnhancementCheckbox("Fix the Gravedigging Tour Glitch", CVAR_ENHANCEMENT("GravediggingTourFix"), true, false, SaveManager::Instance->IsRandoFile(), "This setting is always enabled in randomizer files", UIWidgets::CheckboxGraphics::Checkmark); UIWidgets::Tooltip("Fixes a bug where the Gravedigging Tour Heart Piece disappears if the area reloads"); - UIWidgets::PaddedEnhancementCheckbox("Fix Deku Nut upgrade", CVAR_ENHANCEMENT("DekuNutUpgradeFix"), true, false); + UIWidgets::PaddedEnhancementCheckbox( + "Fix Deku Nut upgrade", CVAR_ENHANCEMENT("DekuNutUpgradeFix"), true, false, IS_RANDO, + "This setting is forcefully enabled when you are playing a randomizer.", + UIWidgets::CheckboxGraphics::Checkmark); UIWidgets::Tooltip("Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw"); UIWidgets::PaddedEnhancementCheckbox("Fix Navi text HUD position", CVAR_ENHANCEMENT("NaviTextFix"), true, false); UIWidgets::Tooltip("Correctly centers the Navi text prompt on the HUD's C-Up button"); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index a696292ef..a331e4ace 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2442,7 +2442,7 @@ u8 Item_Give(PlayState* play, u8 item) { } return Return_Item(item, MOD_NONE, ITEM_NONE); } else if ((item >= ITEM_WEIRD_EGG) && (item <= ITEM_CLAIM_CHECK)) { - if ((item == ITEM_SAW) && CVarGetInteger(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 0) == 0) { + if (GameInteractor_Should(VB_POACHERS_SAW_SET_DEKU_NUT_UPGRADE_FLAG, item == ITEM_SAW)) { Flags_SetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE); } 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 f9328d729..05cda9db4 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 @@ -10,6 +10,7 @@ #include "overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.h" #include "vt.h" #include "soh/OTRGlobals.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -165,7 +166,9 @@ void EnDntDemo_Judge(EnDntDemo* this, PlayState* play) { break; } case PLAYER_MASK_TRUTH: - if (!Flags_GetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE) && (Player_GetMask(play) != PLAYER_MASK_SKULL)) { + if (GameInteractor_Should(VB_DEKU_SCRUBS_REACT_TO_MASK_OF_TRUTH, + !Flags_GetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE) && + (Player_GetMask(play) != PLAYER_MASK_SKULL))) { Audio_PlaySoundGeneral(NA_SE_SY_TRE_BOX_APPEAR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->prize = DNT_PRIZE_NUTS; From 49c5e19041112273d4a5c5fdc1609c48ec6866ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Fri, 21 Feb 2025 03:37:57 +0000 Subject: [PATCH 056/267] Fix rando generation crash (#5076) Assertion failed in CreateChildAltarHints because all 3 stones were placed on fairies/beehives while those were disabled Fix: consolidate on Context building settings dependant location lists. Overworld vs Dungeon should not operate so differently --- .../Enhancements/randomizer/3drando/fill.cpp | 4 +-- .../Enhancements/randomizer/3drando/hints.cpp | 14 ++++---- soh/soh/Enhancements/randomizer/context.cpp | 1 + soh/soh/Enhancements/randomizer/context.h | 1 + .../Enhancements/randomizer/fishsanity.cpp | 2 +- .../overworld/castle_grounds.cpp | 2 +- .../Enhancements/randomizer/location_list.cpp | 32 ------------------- soh/soh/Enhancements/randomizer/static_data.h | 2 -- 8 files changed, 12 insertions(+), 46 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index ff3413e98..351c57fd2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -1077,7 +1077,7 @@ static void RandomizeDungeonItems() { //Randomize Any Dungeon and Overworld pools AssumedFill(anyDungeonItems, anyDungeonLocations, true); - AssumedFill(overworldItems, Rando::StaticData::GetOverworldLocations(), true); + AssumedFill(overworldItems, ctx->overworldLocations, true); //Randomize maps and compasses after since they're not advancement items for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { @@ -1086,7 +1086,7 @@ static void RandomizeDungeonItems() { AssumedFill(mapAndCompassItems, anyDungeonLocations, true); } else if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(mapAndCompassItems, Rando::StaticData::GetOverworldLocations(), true); + AssumedFill(mapAndCompassItems, ctx->overworldLocations, true); } } } diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index b9e9f4688..932b97316 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -695,15 +695,13 @@ std::vector FindItemsAndMarkHinted(std::vector i void CreateChildAltarHint() { auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled()){ + if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled() && ctx->GetOption(RSK_TOT_ALTAR_HINT)){ std::vector stoneLocs = {}; - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {}); - } else { - stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {RC_ALTAR_HINT_CHILD}); - } + //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {}); + } else { + stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {RC_ALTAR_HINT_CHILD}); } std::vector stoneAreas = {}; for (auto loc : stoneLocs){ diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index ba9ab6d2c..9fcf71d55 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -203,6 +203,7 @@ void Context::GenerateLocationPool() { } // If we've gotten past all the conditions where an overworld location should not be // shuffled, add it to the pool. + AddLocation(location.GetRandomizerCheck(), &overworldLocations); AddLocation(location.GetRandomizerCheck()); } else { // is a dungeon check auto* dungeon = GetDungeon(location.GetArea() - RCAREA_DEKU_TREE); diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index b90f251c7..bd6bc1735 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -47,6 +47,7 @@ class Context { void PlaceItemInLocation(RandomizerCheck locKey, RandomizerGet item, bool applyEffectImmediately = false, bool setHidden = false); std::vector allLocations; + std::vector overworldLocations; void AddLocation(RandomizerCheck loc, std::vector* destination = nullptr); template void AddLocations(const Container& locations, std::vector* destination = nullptr); diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index f07546de9..9da52ddc2 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -229,7 +229,7 @@ namespace Rando { if (ageSplit && !IsFish(&mCurrPondFish.second) && tableEntry.second != RC_UNKNOWN_CHECK && (!Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.second)) || i == pondCount - 1)) { - mCurrPondFish.second = mCurrPondFish.second = GetPondFish(params, true); + mCurrPondFish.second = GetPondFish(params, true); } } } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index 6a3069b18..c4dcf4f02 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_CastleGrounds() { //With multi-area support {RA_CASTLE_GROUNDS} is not strictly required anymore, as any interior here could inherit both - //{RA_HYRULE_CASTLE} and {RA_OUTSIDE_GANONS_CASTLE}, but an setting to merge the latter 2 into the former may be preffered + //{RA_HYRULE_CASTLE} and {RA_OUTSIDE_GANONS_CASTLE}, but a setting to merge the latter 2 into the former may be preferred areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", "Castle Grounds", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index f005391d7..b4e26c84a 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -33,16 +33,6 @@ std::vector Rando::StaticData::GetOverworldFishLocations() { return overworldFishLocations; } -std::vector Rando::StaticData::GetOverworldPotLocations() { - std::vector overworldPotLocations = {}; - for (Location& location : locationTable) { - if (location.GetRCType() == RCTYPE_POT && location.IsOverworld() && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { - overworldPotLocations.push_back(location.GetRandomizerCheck()); - } - } - return overworldPotLocations; -} - std::vector Rando::StaticData::GetStaticHintLocations() { std::vector staticHintLocations = {}; for (Location& location : locationTable) { @@ -103,28 +93,6 @@ std::vector Rando::StaticData::GetShopLocations() { return shopLocations; } -std::vector Rando::StaticData::GetOverworldLocations() { - //RANDOTODO better way of filling the initial location pool, among other things. - std::vector overworldLocations = {}; - auto ctx = Rando::Context::GetInstance(); - for (Location& location : locationTable) { - if ( - location.IsOverworld() && - location.GetRandomizerCheck() != RC_UNKNOWN_CHECK && - location.GetRandomizerCheck() != RC_TRIFORCE_COMPLETED && //not really an overworld check - location.GetRCType() != RCTYPE_FISH && // temp fix while locations are properly sorted out - location.GetRCType() != RCTYPE_POT && // Same as fish - location.GetRCType() != RCTYPE_CHEST_GAME && //this is supposed to be excluded - (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || location.GetRCType() != RCTYPE_ADULT_TRADE) && //trade is handled elsewhere in location pool - location.GetRCType() != RCTYPE_STATIC_HINT && - location.GetRCType() != RCTYPE_GOSSIP_STONE //don't put items on hints - ) { - overworldLocations.push_back(location.GetRandomizerCheck()); - } - } - return overworldLocations; -} - std::vector Rando::StaticData::GetAllDungeonLocations() { auto ctx = Rando::Context::GetInstance(); std::vector dungeonLocations; diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 852fe3841..8936294a2 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -35,7 +35,6 @@ class StaticData { static std::unordered_map PopulateTranslationMap(std::unordered_map input); static std::unordered_map PopulateTranslationMap(std::unordered_map input); static std::multimap, RandomizerCheck> CheckFromActorMultimap; - static std::vector GetOverworldLocations(); static std::vector GetAllDungeonLocations(); static std::vector dungeonRewardLocations; static std::vector GetShopLocations(); @@ -46,7 +45,6 @@ class StaticData { static std::vector GetStaticHintLocations(); static std::vector GetPondFishLocations(); static std::vector GetOverworldFishLocations(); - static std::vector GetOverworldPotLocations(); static std::vector GetOverworldFairyLocations(); static void RegisterFishLocations(); static void RegisterFairyLocations(); From acdb2dd32499ccb3983bdc696a33a318a599e8ea Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:48:11 -0800 Subject: [PATCH 057/267] bump lus (#5092) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index f776531ab..02bb77ef2 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit f776531abf74db98f8d9c7da64e9a21590af65ad +Subproject commit 02bb77ef253e2de0969fd2cb36ad2e870677d18d From 51310db68fc66725f5720e6d7aa7dcda0b17b8fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Tue, 25 Feb 2025 08:11:46 +0000 Subject: [PATCH 058/267] ShuffleCows.cpp (#5093) --- .../Enhancements/randomizer/ShuffleCows.cpp | 74 +++++++++++++++++++ .../Enhancements/randomizer/hook_handlers.cpp | 54 -------------- .../Enhancements/randomizer/location_list.cpp | 12 --- soh/soh/Enhancements/randomizer/static_data.h | 1 + soh/soh/OTRGlobals.cpp | 2 +- 5 files changed, 76 insertions(+), 67 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCows.cpp diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp new file mode 100644 index 000000000..5fc86f76d --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -0,0 +1,74 @@ +#include +#include "static_data.h" + +extern "C" { +#include "src/overlays/actors/ovl_En_Cow/z_en_cow.h" +extern PlayState* gPlayState; +} + +void EnCow_MoveForRandomizer(EnCow* enCow, PlayState* play) { + bool moved = false; + + // Don't reposition the tail + if (enCow->actor.params != 0) { + return; + } + + if (play->sceneNum == SCENE_LON_LON_BUILDINGS && enCow->actor.world.pos.x == -108 && + enCow->actor.world.pos.z == -65) { + // Move left cow in lon lon tower + enCow->actor.world.pos.x = -229.0f; + enCow->actor.world.pos.z = 157.0f; + enCow->actor.shape.rot.y = 15783.0f; + moved = true; + } else if (play->sceneNum == SCENE_STABLE && enCow->actor.world.pos.x == -3 && enCow->actor.world.pos.z == -254) { + // Move right cow in lon lon stable + enCow->actor.world.pos.x += 119.0f; + moved = true; + } + + if (moved) { + // Reposition collider + func_809DEE9C(enCow); + } +} + +void RegisterShuffleCows() { + bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_COWS).Get(); + + COND_VB_SHOULD(VB_GIVE_ITEM_FROM_COW, shouldRegister, { + EnCow* enCow = va_arg(args, EnCow*); + CowIdentity cowIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCow(gPlayState->sceneNum, enCow->actor.world.pos.x, enCow->actor.world.pos.z); + // Has this cow already rewarded an item? + if (!Flags_GetRandomizerInf(cowIdentity.randomizerInf)) { + Flags_SetRandomizerInf(cowIdentity.randomizerInf); + // setting the ocarina mode here prevents intermittent issues + // with the item get not triggering until walking away + gPlayState->msgCtx.ocarinaMode = OCARINA_MODE_00; + *should = false; + } + }); + + COND_VB_SHOULD(VB_DESPAWN_HORSE_RACE_COW, shouldRegister, { + EnCow* enCow = va_arg(args, EnCow*); + // If this is a cow we have to move, then move it now. + EnCow_MoveForRandomizer(enCow, gPlayState); + }); +} + +static RegisterShipInitFunc initFunc(RegisterShuffleCows, { "IS_RANDO" }); + +void Rando::StaticData::RegisterCowLocations() { + locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); + locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW)); + locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), "Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW)); + locationTable[RC_LLR_STABLES_RIGHT_COW] = Location::Base(RC_LLR_STABLES_RIGHT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(116, -254), "Stables Right Cow", RHT_LLR_STABLES_RIGHT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW)); + locationTable[RC_LLR_TOWER_LEFT_COW] = Location::Base(RC_LLR_TOWER_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-229, 157), "Tower Left Cow", RHT_LLR_TOWER_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW)); + locationTable[RC_LLR_TOWER_RIGHT_COW] = Location::Base(RC_LLR_TOWER_RIGHT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-142, -140), "Tower Right Cow", RHT_LLR_TOWER_RIGHT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW)); + locationTable[RC_KAK_IMPAS_HOUSE_COW] = Location::Base(RC_KAK_IMPAS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_IMPAS_HOUSE, 0x00, "Impas House Cow", RHT_KAK_IMPAS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW)); + locationTable[RC_DMT_COW_GROTTO_COW] = Location::Base(RC_DMT_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444, -471), "Cow Grotto Cow", RHT_DMT_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW)); + locationTable[RC_GV_COW] = Location::Base(RC_GV_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, "Cow", RHT_GV_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_GV_COW)); + locationTable[RC_JABU_JABUS_BELLY_MQ_COW] = Location::Base(RC_JABU_JABUS_BELLY_MQ_COW, RCQUEST_MQ, RCTYPE_COW, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, "MQ Cow", RHT_JABU_JABUS_BELLY_MQ_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW)); +} + +static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 5eee3541a..e236666f6 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -26,7 +26,6 @@ extern "C" { #include "soh/Enhancements/randomizer/randomizer_grotto.h" #include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" #include "src/overlays/actors/ovl_En_Si/z_en_si.h" -#include "src/overlays/actors/ovl_En_Cow/z_en_cow.h" #include "src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.h" #include "src/overlays/actors/ovl_En_Dns/z_en_dns.h" #include "src/overlays/actors/ovl_En_Gb/z_en_gb.h" @@ -512,33 +511,6 @@ void ItemEtcetera_UpdateRandomizedFireArrow(ItemEtcetera* itemEtcetera, PlayStat } } -void EnCow_MoveForRandomizer(EnCow* enCow, PlayState* play) { - bool moved = false; - - // Don't reposition the tail - if (enCow->actor.params != 0) { - return; - } - - // Move left cow in lon lon tower - if (play->sceneNum == SCENE_LON_LON_BUILDINGS && enCow->actor.world.pos.x == -108 && - enCow->actor.world.pos.z == -65) { - enCow->actor.world.pos.x = -229.0f; - enCow->actor.world.pos.z = 157.0f; - enCow->actor.shape.rot.y = 15783.0f; - moved = true; - // Move right cow in lon lon stable - } else if (play->sceneNum == SCENE_STABLE && enCow->actor.world.pos.x == -3 && enCow->actor.world.pos.z == -254) { - enCow->actor.world.pos.x += 119.0f; - moved = true; - } - - if (moved) { - // Reposition collider - func_809DEE9C(enCow); - } -} - u8 EnDs_RandoCanGetGrannyItem() { return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS || RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL) && @@ -1060,23 +1032,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SARIAS_SONG); break; } - case VB_GIVE_ITEM_FROM_COW: { - if (!RAND_GET_OPTION(RSK_SHUFFLE_COWS)) { - break; - } - EnCow* enCow = va_arg(args, EnCow*); - CowIdentity cowIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCow(gPlayState->sceneNum, enCow->actor.world.pos.x, enCow->actor.world.pos.z); - // Has this cow already rewarded an item? - if (Flags_GetRandomizerInf(cowIdentity.randomizerInf)) { - break; - } - Flags_SetRandomizerInf(cowIdentity.randomizerInf); - // setting the ocarina mode here prevents intermittent issues - // with the item get not triggering until walking away - gPlayState->msgCtx.ocarinaMode = OCARINA_MODE_00; - *should = false; - break; - } case VB_GIVE_ITEM_FROM_GRANNYS_SHOP: { if (!EnDs_RandoCanGetGrannyItem()) { break; @@ -1257,15 +1212,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = false; break; } - case VB_DESPAWN_HORSE_RACE_COW: { - if (!RAND_GET_OPTION(RSK_SHUFFLE_COWS)) { - break; - } - EnCow* enCow = va_arg(args, EnCow*); - // If this is a cow we have to move, then move it now. - EnCow_MoveForRandomizer(enCow, gPlayState); - break; - } case VB_BUSINESS_SCRUB_DESPAWN: { EnShopnuts* enShopnuts = va_arg(args, EnShopnuts*); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index b4e26c84a..1e0b3a7d1 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -874,18 +874,6 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_GERUDO_VALLEY, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xF0), "Deku Scrub Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO)); locationTable[RC_COLOSSUS_GROTTO_BEEHIVE] = Location::Base(RC_COLOSSUS_GROTTO_BEEHIVE, RCQUEST_BOTH, RCTYPE_BEEHIVE, RCAREA_DESERT_COLOSSUS, ACTOR_OBJ_COMB, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2262, 0xFD), "Grotto Beehive", RHT_BEEHIVE_SCRUB_PAIR_GROTTO, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BEEHIVE_COLOSSUS_GROTTO)); - // Cows - locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); - locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW)); - locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), "Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW)); - locationTable[RC_LLR_STABLES_RIGHT_COW] = Location::Base(RC_LLR_STABLES_RIGHT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(116, -254), "Stables Right Cow", RHT_LLR_STABLES_RIGHT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW)); - locationTable[RC_LLR_TOWER_LEFT_COW] = Location::Base(RC_LLR_TOWER_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-229, 157), "Tower Left Cow", RHT_LLR_TOWER_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW)); - locationTable[RC_LLR_TOWER_RIGHT_COW] = Location::Base(RC_LLR_TOWER_RIGHT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(-142, -140), "Tower Right Cow", RHT_LLR_TOWER_RIGHT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW)); - locationTable[RC_KAK_IMPAS_HOUSE_COW] = Location::Base(RC_KAK_IMPAS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_IMPAS_HOUSE, 0x00, "Impas House Cow", RHT_KAK_IMPAS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW)); - locationTable[RC_DMT_COW_GROTTO_COW] = Location::Base(RC_DMT_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444, -471), "Cow Grotto Cow", RHT_DMT_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW)); - locationTable[RC_GV_COW] = Location::Base(RC_GV_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, "Cow", RHT_GV_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_GV_COW)); - locationTable[RC_JABU_JABUS_BELLY_MQ_COW] = Location::Base(RC_JABU_JABUS_BELLY_MQ_COW, RCQUEST_MQ, RCTYPE_COW, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, "MQ Cow", RHT_JABU_JABUS_BELLY_MQ_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW)); - /*------------------------------- --- SHOPS --- 8 6 2 4 diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 8936294a2..a456089a3 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -46,6 +46,7 @@ class StaticData { static std::vector GetPondFishLocations(); static std::vector GetOverworldFishLocations(); static std::vector GetOverworldFairyLocations(); + static void RegisterCowLocations(); static void RegisterFishLocations(); static void RegisterFairyLocations(); static void RegisterPotLocations(); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 6b5afb0c3..dc745b0b5 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2254,7 +2254,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { messageEntry = OTRGlobals::Instance->gRandomizer->GetGoronMessage(choice); } else if (textId == TEXT_FROGS_UNDERWATER && ctx->GetOption(RSK_FROGS_HINT)) { - messageEntry = ctx->GetHint(RH_FROGS_HINT)->GetHintMessage(MF_AUTO_FORMAT), TEXTBOX_TYPE_BLUE; + messageEntry = ctx->GetHint(RH_FROGS_HINT)->GetHintMessage(MF_AUTO_FORMAT); } else if ( Randomizer_GetSettingValue(RSK_LOACH_HINT) && From f023a46a5d5ef8e969427dbd694366f06fb078b7 Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 25 Feb 2025 03:13:17 -0500 Subject: [PATCH 059/267] Use gamemode enum (#5089) * Use gamemode enum * update console command for file_select --- soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp | 2 +- soh/soh/Enhancements/debugconsole.cpp | 13 +++++++------ .../Enhancements/randomizer/randomizer_entrance.c | 2 +- soh/src/code/graph.c | 2 +- soh/src/code/z_camera.c | 2 +- soh/src/code/z_construct.c | 2 +- soh/src/code/z_demo.c | 14 +++++++------- soh/src/code/z_kankyo.c | 6 +++--- soh/src/code/z_parameter.c | 2 +- soh/src/code/z_player_lib.c | 2 +- soh/src/overlays/actors/ovl_En_Light/z_en_light.c | 2 +- soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c | 6 +++--- soh/src/overlays/actors/ovl_En_Mm/z_en_mm.c | 2 +- .../ovl_En_Okarina_Effect/z_en_okarina_effect.c | 2 +- .../overlays/actors/ovl_player_actor/z_player.c | 2 +- .../gamestates/ovl_file_choose/z_file_choose.c | 5 +---- .../overlays/gamestates/ovl_opening/z_opening.c | 2 +- soh/src/overlays/gamestates/ovl_title/z_title.c | 2 +- 18 files changed, 34 insertions(+), 36 deletions(-) diff --git a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp index d478f8fc3..2d750ab5d 100644 --- a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp +++ b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp @@ -205,7 +205,7 @@ void OnZTitleUpdateSkipToFileSelect(void* gameState) { gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; - gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; + gSaveContext.gameMode = GAMEMODE_FILE_SELECT; titleContext->state.running = false; SET_NEXT_GAMESTATE(&titleContext->state, FileChoose_Init, FileChooseContext); diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 5df00dfab..67547437d 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -146,7 +146,7 @@ static bool SetPlayerHealthHandler(std::shared_ptr Console, const static bool LoadSceneHandler(std::shared_ptr Console, const std::vector&, std::string* output) { gSaveContext.respawnFlag = 0; gSaveContext.seqId = 0xFF; - gSaveContext.gameMode = 0; + gSaveContext.gameMode = GAMEMODE_NORMAL; return 0; } @@ -489,13 +489,14 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< } static bool FileSelectHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - if (gPlayState != nullptr) { - SET_NEXT_GAMESTATE(&gPlayState->state, FileChoose_Init, FileChooseContext); - gPlayState->state.running = 0; - } else { - ERROR_MESSAGE("gPlayState == nullptr"); + if (gGameState == nullptr) { + ERROR_MESSAGE("gGameState == nullptr"); return 1; } + + gSaveContext.gameMode = GAMEMODE_FILE_SELECT; + SET_NEXT_GAMESTATE(gGameState, FileChoose_Init, FileChooseContext); + gGameState->running = false; return 0; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index fdb1f6809..3ad26b1f6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -440,7 +440,7 @@ void Entrance_SetWarpSongEntrance(void) { // have to force the grotto return afterwards Grotto_ForceGrottoReturnOnSpecialEntrance(); - if (gSaveContext.gameMode != 0) { + if (gSaveContext.gameMode != GAMEMODE_NORMAL) { // During DHWW the cutscene must play at the destination gSaveContext.respawnFlag = -3; } else if (gSaveContext.respawnFlag == -3) { diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c index 51f8fcd17..be5ee994d 100644 --- a/soh/src/code/graph.c +++ b/soh/src/code/graph.c @@ -412,7 +412,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) { { if (CHECK_BTN_ALL(gameState->input[0].press.button, BTN_Z) && CHECK_BTN_ALL(gameState->input[0].cur.button, BTN_L | BTN_R)) { - gSaveContext.gameMode = 0; + gSaveContext.gameMode = GAMEMODE_NORMAL; SET_NEXT_GAMESTATE(gameState, Select_Init, SelectContext); gameState->running = false; } diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index 6551d6347..7167daceb 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -7589,7 +7589,7 @@ Vec3s Camera_Update(Camera* camera) { } if (camera->status == CAM_STAT_ACTIVE) { - if ((gSaveContext.gameMode != 0) && (gSaveContext.gameMode != 3)) { + if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_END_CREDITS)) { sCameraInterfaceFlags = 0; Camera_UpdateInterface(sCameraInterfaceFlags); } else if ((D_8011D3F0 != 0) && (camera->thisIdx == MAIN_CAM)) { diff --git a/soh/src/code/z_construct.c b/soh/src/code/z_construct.c index 960088cba..065c6f413 100644 --- a/soh/src/code/z_construct.c +++ b/soh/src/code/z_construct.c @@ -479,7 +479,7 @@ void Regs_InitDataImpl(void) { WREG(94) = 3; WREG(95) = 6; - if (gSaveContext.gameMode == 0) { + if (gSaveContext.gameMode == GAMEMODE_NORMAL) { R_TEXTBOX_X = 52; R_TEXTBOX_Y = 36; VREG(2) = 214; diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c index 9821b8d26..c079d0064 100644 --- a/soh/src/code/z_demo.c +++ b/soh/src/code/z_demo.c @@ -510,8 +510,8 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB bool debugCsSkip = (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) && (gSaveContext.fileNum != 0xFEDC) && CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0)); - if ((gSaveContext.gameMode != 0) && (gSaveContext.gameMode != 3) && (play->sceneNum != SCENE_HYRULE_FIELD) && - (csCtx->frames > 20) && + if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_END_CREDITS) && + (play->sceneNum != SCENE_HYRULE_FIELD) && (csCtx->frames > 20) && (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) || CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B) || CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START)) && @@ -575,7 +575,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB osSyncPrintf("\n分岐先指定!!=[%d]番", cmd->base); // "Future fork designation=No. [%d]" - if ((gSaveContext.gameMode != 0) && (csCtx->frames != cmd->startFrame)) { + if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (csCtx->frames != cmd->startFrame)) { gSaveContext.unk_13E7 = 1; } @@ -908,7 +908,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB play->transitionType = TRANS_TYPE_FADE_WHITE; break; case 54: - gSaveContext.gameMode = 3; + gSaveContext.gameMode = GAMEMODE_END_CREDITS; Audio_SetSoundBanksMute(0x6F); play->linkAgeOnLoad = 1; play->nextEntranceIndex = ENTR_GERUDO_VALLEY_EAST_EXIT; @@ -1288,7 +1288,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; break; case 117: - gSaveContext.gameMode = 3; + gSaveContext.gameMode = GAMEMODE_END_CREDITS; Audio_SetSoundBanksMute(0x6F); play->linkAgeOnLoad = 0; play->nextEntranceIndex = ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN; @@ -2080,7 +2080,7 @@ void func_80068DC0(PlayState* play, CutsceneContext* csCtx) { osSyncPrintf("\n\n\n\n\nやっぱりここかいな"); // "Right here, huh" gSaveContext.cutsceneIndex = 0; - gSaveContext.gameMode = 0; + gSaveContext.gameMode = GAMEMODE_NORMAL; if (D_8015FCC8 != 0) { switch (gSaveContext.entranceIndex) { @@ -2203,7 +2203,7 @@ void Cutscene_HandleConditionalTriggers(PlayState* play) { return; } - if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { + if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { if ((gSaveContext.entranceIndex == ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT)) { Flags_SetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT); gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_EAST_EXIT; diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index 6e3736b77..df5decc4a 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -895,7 +895,7 @@ void Environment_Update(PlayState* play, EnvironmentContext* envCtx, LightContex EnvLightSettings* lightSettingsList = play->envCtx.lightSettingsList; s32 adjustment; - if ((((void)0, gSaveContext.gameMode) != 0) && (((void)0, gSaveContext.gameMode) != 3)) { + if ((((void)0, gSaveContext.gameMode) != GAMEMODE_NORMAL) && (((void)0, gSaveContext.gameMode) != GAMEMODE_END_CREDITS)) { func_800AA16C(play); } @@ -925,9 +925,9 @@ void Environment_Update(PlayState* play, EnvironmentContext* envCtx, LightContex } if ((pauseCtx->state == 0) && (gameOverCtx->state == GAMEOVER_INACTIVE)) { - if (((msgCtx->msgLength == 0) && (msgCtx->msgMode == 0)) || (((void)0, gSaveContext.gameMode) == 3)) { + if (((msgCtx->msgLength == 0) && (msgCtx->msgMode == 0)) || (((void)0, gSaveContext.gameMode) == GAMEMODE_END_CREDITS)) { if ((envCtx->unk_1A == 0) && !FrameAdvance_IsEnabled(play) && - (play->transitionMode == TRANS_MODE_OFF || ((void)0, gSaveContext.gameMode) != 0)) { + (play->transitionMode == TRANS_MODE_OFF || ((void)0, gSaveContext.gameMode) != GAMEMODE_NORMAL)) { if (IS_DAY || gTimeIncrement >= 0x190) { gSaveContext.dayTime += gTimeIncrement; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index a331e4ace..1daa29fb9 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -3215,7 +3215,7 @@ void Interface_UpdateMagicBar(PlayState* play) { case MAGIC_STATE_FILL: gSaveContext.magic += 4; - if (gSaveContext.gameMode == 0 && gSaveContext.sceneSetupIndex < 4) { + if (gSaveContext.gameMode == GAMEMODE_NORMAL && gSaveContext.sceneSetupIndex < 4) { Audio_PlaySoundGeneral(NA_SE_SY_GAUGE_UP - SFX_FLAG, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 9d4b55091..bf7189616 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1131,7 +1131,7 @@ void Player_DrawImpl(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dL if (((CVarGetInteger(CVAR_ENHANCEMENT("FirstPersonGauntlets"), 0) && LINK_IS_ADULT) || (overrideLimbDraw != Player_OverrideLimbDrawGameplayFirstPerson)) && (overrideLimbDraw != Player_OverrideLimbDrawGameplayCrawling) && - (gSaveContext.gameMode != 3)) { + (gSaveContext.gameMode != GAMEMODE_END_CREDITS)) { if (LINK_IS_ADULT) { s32 strengthUpgrade = CUR_UPG_VALUE(UPG_STRENGTH); diff --git a/soh/src/overlays/actors/ovl_En_Light/z_en_light.c b/soh/src/overlays/actors/ovl_En_Light/z_en_light.c index d7f9772d6..ca5cdaa0d 100644 --- a/soh/src/overlays/actors/ovl_En_Light/z_en_light.c +++ b/soh/src/overlays/actors/ovl_En_Light/z_en_light.c @@ -50,7 +50,7 @@ void EnLight_Init(Actor* thisx, PlayState* play) { EnLight* this = (EnLight*)thisx; s16 yOffset; - if (gSaveContext.gameMode == 3) { + if (gSaveContext.gameMode == GAMEMODE_END_CREDITS) { // special case for the credits yOffset = (this->actor.params < 0) ? 1 : 40; Lights_PointNoGlowSetInfo(&this->lightInfo, this->actor.world.pos.x, yOffset + (s16)this->actor.world.pos.y, 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 558a18796..0ea4a2e25 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 @@ -251,7 +251,7 @@ void EnMag_UpdateMq(Actor* thisx, PlayState* play) { Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - gSaveContext.gameMode = 2; + gSaveContext.gameMode = GAMEMODE_FILE_SELECT; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; } @@ -411,7 +411,7 @@ void EnMag_UpdateVanilla(Actor* thisx, PlayState* play) { Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - gSaveContext.gameMode = 2; + gSaveContext.gameMode = GAMEMODE_FILE_SELECT; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_BLACK; } @@ -1065,4 +1065,4 @@ void EnMag_Draw(Actor* thisx, PlayState* play) { POLY_OPA_DISP = gfx; CLOSE_DISPS(play->state.gfxCtx); -} \ No newline at end of file +} 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 e72a174f8..c3a27994f 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 @@ -463,7 +463,7 @@ void func_80AAE294(EnMm* this, PlayState* play) { dustPos.y = this->actor.world.pos.y; dustPos.z = this->actor.world.pos.z; - if (gSaveContext.gameMode != 3) { + if (gSaveContext.gameMode != GAMEMODE_END_CREDITS) { func_80033480(play, &dustPos, 50.0f, 2, 350, 20, 0); } 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 0d3519e3d..5bde1af54 100644 --- a/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c +++ b/soh/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c @@ -73,7 +73,7 @@ void EnOkarinaEffect_ManageStorm(EnOkarinaEffect* this, PlayState* play) { Flags_UnsetEnv(play, 5); // clear storms env flag if (((play->pauseCtx.state == 0) && (play->gameOverCtx.state == GAMEOVER_INACTIVE) && (play->msgCtx.msgLength == 0) && (!FrameAdvance_IsEnabled(play)) && - ((play->transitionMode == TRANS_MODE_OFF) || (gSaveContext.gameMode != 0))) || + ((play->transitionMode == TRANS_MODE_OFF) || (gSaveContext.gameMode != GAMEMODE_NORMAL))) || (this->timer >= 250)) { if (play->envCtx.indoors || play->envCtx.unk_1F != 1) { this->timer--; 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 1c9d5a688..1d9c89212 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10859,7 +10859,7 @@ void Player_Init(Actor* thisx, PlayState* play2) { } if (startMode != PLAYER_START_MODE_NOTHING) { - if ((gSaveContext.gameMode == 0) || (gSaveContext.gameMode == 3)) { + if ((gSaveContext.gameMode == GAMEMODE_NORMAL) || (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) { this->naviActor = Player_SpawnFairy(play, this, &thisx->world.pos, &D_80854778, FAIRY_NAVI); if (gSaveContext.dogParams != 0) { gSaveContext.dogParams |= 0x8000; 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 6b2d0546f..664a9dcfc 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 @@ -3112,7 +3112,7 @@ void FileChoose_LoadGame(GameState* thisx) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); gSaveContext.fileNum = this->buttonIndex; - gSaveContext.gameMode = 0; + gSaveContext.gameMode = GAMEMODE_NORMAL; if ((this->buttonIndex == FS_BTN_SELECT_FILE_1 && CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0)) || this->buttonIndex == 0xFF) { if (this->buttonIndex == 0xFF) { @@ -3737,7 +3737,4 @@ void FileChoose_Init(GameState* thisx) { Font_LoadOrderedFont(&this->font); Audio_QueueSeqCmd(0xF << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0xA); func_800F5E18(SEQ_PLAYER_BGM_MAIN, NA_BGM_FILE_SELECT, 0, 7, 1); - - // Originally this was only set when transitioning from the title screen, but gSkipLogoTitle skips that process so we're ensuring it's set here - gSaveContext.gameMode = GAMEMODE_FILE_SELECT; } diff --git a/soh/src/overlays/gamestates/ovl_opening/z_opening.c b/soh/src/overlays/gamestates/ovl_opening/z_opening.c index 3ecd61fca..7898e8aed 100644 --- a/soh/src/overlays/gamestates/ovl_opening/z_opening.c +++ b/soh/src/overlays/gamestates/ovl_opening/z_opening.c @@ -9,7 +9,7 @@ void Sram_InitDebugSave(void); void Opening_SetupTitleScreen(OpeningContext* this) { - gSaveContext.gameMode = 1; + gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; this->state.running = false; gSaveContext.linkAge = 0; gSaveContext.fileNum = 0xFF; diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c index 544fb6884..239ee9d3d 100644 --- a/soh/src/overlays/gamestates/ovl_title/z_title.c +++ b/soh/src/overlays/gamestates/ovl_title/z_title.c @@ -137,7 +137,7 @@ void Title_Main(GameState* thisx) { if (this->exit) { gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.natureAmbienceId = 0xFF; - gSaveContext.gameMode = 1; + gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; this->state.running = false; SET_NEXT_GAMESTATE(&this->state, Opening_Init, OpeningContext); } From 5fcdf74f5cc92be3244d820cd1a37f5619a4600b Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 25 Feb 2025 03:13:31 -0500 Subject: [PATCH 060/267] Exclude debug file and cutscene map from auto save (#5088) * Exclude debug file and cutscene map from auto save * Remove ganon's lair from auto save exclusion --- soh/soh/Enhancements/Autosave.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/Autosave.cpp b/soh/soh/Enhancements/Autosave.cpp index 74b548dab..faa5ee8dd 100644 --- a/soh/soh/Enhancements/Autosave.cpp +++ b/soh/soh/Enhancements/Autosave.cpp @@ -24,11 +24,11 @@ typedef enum { bool Autosave_CanSave() { - // Don't save when in title screen + // Don't save when in title screen or debug file // Don't save the first 60 frames to not save the magic meter when it's still in the animation of filling it. - // Don't save in Ganon's fight and chamber of sages because of master sword and remember save location issues. - if (!GameInteractor::IsSaveLoaded(true) || gPlayState->gameplayFrames < 60 || - gPlayState->sceneNum == SCENE_GANON_BOSS || gPlayState->sceneNum == SCENE_CHAMBER_OF_THE_SAGES) { + // Don't save in Chamber of Sages and the Cutscene map because of remember save location and cutscene item gives. + if (!GameInteractor::IsSaveLoaded(false) || gPlayState->gameplayFrames < 60 || + gPlayState->sceneNum == SCENE_CHAMBER_OF_THE_SAGES || gPlayState->sceneNum == SCENE_CUTSCENE_MAP) { return false; } From 66844fb22037a5e7ec3910ee0d06fc18e1122cc7 Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 25 Feb 2025 03:14:27 -0500 Subject: [PATCH 061/267] Fix crash with scene logging paths (#5081) --- .../resource/logging/SceneCommandLoggers.cpp | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/soh/soh/resource/logging/SceneCommandLoggers.cpp b/soh/soh/resource/logging/SceneCommandLoggers.cpp index 805de9be0..22e7420c2 100644 --- a/soh/soh/resource/logging/SceneCommandLoggers.cpp +++ b/soh/soh/resource/logging/SceneCommandLoggers.cpp @@ -24,9 +24,18 @@ #include "soh/resource/type/scenecommand/SetTransitionActorList.h" #include "soh/resource/type/scenecommand/SetWindSettings.h" #include "spdlog/spdlog.h" +#include namespace SOH { +const char* TrimOTRSignature(const char* fileName) { + static const char* sOTRSignature = "__OTR__"; + if (strncmp(fileName, sOTRSignature, strlen(sOTRSignature)) == 0) { + return fileName + 7; + } + return fileName; +} + void LogEndMarkerAsXML(std::shared_ptr resource) { std::shared_ptr endMarker = std::static_pointer_cast(resource); @@ -292,12 +301,12 @@ void LogMeshAsXML(std::shared_ptr resource) { for (int i = 0; i < setMesh->meshHeader.polygon0.num; i += 1) { tinyxml2::XMLElement* polygon = doc.NewElement("Polygon"); polygon->SetAttribute("PolyType", "0"); - polygon->SetAttribute("MeshOpa", setMesh->opaPaths[i].c_str()); - polygon->SetAttribute("MeshXlu", setMesh->xluPaths[i].c_str()); + polygon->SetAttribute("MeshOpa", TrimOTRSignature(dlist->opa ? (char*)dlist->opa : "")); + polygon->SetAttribute("MeshXlu", TrimOTRSignature(dlist->xlu ? (char*)dlist->xlu : "")); root->InsertEndChild(polygon); + dlist += 1; } - dlist += 1; } else if (setMesh->meshHeader.base.type == 1) { root->SetAttribute("PolyNum", "1"); tinyxml2::XMLElement* polygon = doc.NewElement("Polygon"); @@ -313,8 +322,10 @@ void LogMeshAsXML(std::shared_ptr resource) { polygon->SetAttribute("PolyType", "0"); - polygon->SetAttribute("MeshOpa", setMesh->opaPaths[0].c_str()); - polygon->SetAttribute("MeshXlu", setMesh->xluPaths[0].c_str()); + PolygonDlist* dlist = (PolygonDlist*)setMesh->meshHeader.polygon1.dlist; + + polygon->SetAttribute("MeshOpa", TrimOTRSignature(dlist->opa ? (char*)dlist->opa : "")); + polygon->SetAttribute("MeshXlu", TrimOTRSignature(dlist->xlu ? (char*)dlist->xlu : "")); root->InsertEndChild(polygon); @@ -325,7 +336,7 @@ void LogMeshAsXML(std::shared_ptr resource) { if (setMesh->meshHeader.polygon1.format == 1) { bgImage->SetAttribute("Unknown_00", image->unk_00); bgImage->SetAttribute("Id", image->id); - bgImage->SetAttribute("ImagePath", setMesh->imagePaths[i].c_str()); + bgImage->SetAttribute("ImagePath", TrimOTRSignature((char*)setMesh->meshHeader.polygon1.single.source)); bgImage->SetAttribute("Unknown_0C", setMesh->meshHeader.polygon1.single.unk_0C); bgImage->SetAttribute("TLUT", setMesh->meshHeader.polygon1.single.tlut); bgImage->SetAttribute("Width", setMesh->meshHeader.polygon1.single.width); @@ -337,7 +348,7 @@ void LogMeshAsXML(std::shared_ptr resource) { } else { bgImage->SetAttribute("Unknown_00", image->unk_00); bgImage->SetAttribute("Id", image->id); - bgImage->SetAttribute("ImagePath", setMesh->imagePaths[i].c_str()); + bgImage->SetAttribute("ImagePath", TrimOTRSignature((char*)image->source)); bgImage->SetAttribute("Unknown_0C", image->unk_0C); bgImage->SetAttribute("TLUT", image->tlut); bgImage->SetAttribute("Width", image->width); @@ -363,8 +374,8 @@ void LogMeshAsXML(std::shared_ptr resource) { polygon->SetAttribute("PosZ", dlist->pos.z); polygon->SetAttribute("Unknown", dlist->unk_06); - polygon->SetAttribute("MeshOpa", setMesh->opaPaths[i].c_str()); - polygon->SetAttribute("MeshXlu", setMesh->xluPaths[i].c_str()); + polygon->SetAttribute("MeshOpa", TrimOTRSignature(dlist->opa ? (char*)dlist->opa : "")); + polygon->SetAttribute("MeshXlu", TrimOTRSignature(dlist->xlu ? (char*)dlist->xlu : "")); root->InsertEndChild(polygon); dlist += 1; @@ -606,4 +617,4 @@ void LogWindSettingsAsXML(std::shared_ptr resource) { SPDLOG_INFO("{}: {}", resource->GetInitData()->Path, printer.CStr()); } -} //namespace SOH \ No newline at end of file +} //namespace SOH From e516f45e2322b93e2d8c8a1737c1d68b2796362d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Tue, 25 Feb 2025 08:30:05 +0000 Subject: [PATCH 062/267] logic: allow finding big poe in bottle for reward logic (#5075) * logic: allow finding big poe in bottle for reward logic only applies when big poe count is set to 1 * Allow multiple big poe bottles for when big poe requirement > 1 --- .../randomizer/location_access/overworld/market.cpp | 2 +- soh/soh/Enhancements/randomizer/logic.cpp | 6 +++++- soh/soh/Enhancements/randomizer/logic.h | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 0b010c8a7..af406f8bf 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -39,7 +39,7 @@ void RegionTable_Init_Market() { EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}), }, { //Locations - LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && logic->BigPoeKill), + LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && (logic->BigPoeKill || logic->BigPoes > ctx->GetOption(RSK_BIG_POE_COUNT).Get())), LOCATION(RC_MARKET_GS_GUARD_HOUSE, logic->IsChild), LOCATION(RC_MK_GUARD_HOUSE_CHILD_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_CHILD_POT_2, logic->IsChild && logic->CanBreakPots()), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index fa9c8d8e5..9e1b1cf85 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1694,6 +1694,9 @@ namespace Rando { if (BottleRandomizerGetToItemID.contains(randoGet)) { itemId = BottleRandomizerGetToItemID[randoGet]; } + if (randoGet == RG_BOTTLE_WITH_BIG_POE) { + BigPoes++; + } mSaveContext->inventory.items[slot] = itemId; } break; case RG_RUTOS_LETTER: @@ -2255,7 +2258,8 @@ namespace Rando { IsChild = false; IsAdult = false; //CanPlantBean = false; - BigPoeKill = false; + BigPoeKill = false; + BigPoes = 0; BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() + 1; diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index ea9d51801..77d6b2573 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -36,7 +36,6 @@ class Logic { // Adult logic bool FreedEpona = false; - //bool BigPoe = false; //unused // Trade Quest Events bool WakeUpAdultTalon = false; @@ -101,6 +100,7 @@ class Logic { bool IsChild = false; bool IsAdult = false; bool BigPoeKill = false; + uint8_t BigPoes = 0; uint8_t BaseHearts = 0; // Bridge and LACS Requirements From db41c6513b409e9fca95b1c5fe1d9cc5ef35f7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Tue, 25 Feb 2025 09:25:45 +0000 Subject: [PATCH 063/267] Move boss kill logic into CanKillEnemy (#5000) * Move boss kill logic into CanKillEnemy Added hammer as being able to defeat Morpha * add hammer vs gohma, king dodongo, & twinrova --- .../location_access/dungeons/deku_tree.cpp | 2 +- .../dungeons/dodongos_cavern.cpp | 2 +- .../location_access/dungeons/fire_temple.cpp | 2 +- .../dungeons/forest_temple.cpp | 2 +- .../dungeons/jabujabus_belly.cpp | 2 +- .../dungeons/shadow_temple.cpp | 6 +---- .../dungeons/spirit_temple.cpp | 2 +- .../location_access/dungeons/water_temple.cpp | 2 +- soh/soh/Enhancements/randomizer/logic.cpp | 25 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 8 ++++++ 10 files changed, 41 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 9d3febe36..2500e4996 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -350,7 +350,7 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", "Deku Tree", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || (logic->HasBossSoul(RG_GOHMA_SOUL) && (logic->CanJumpslashExceptHammer() && (logic->CanUse(RG_NUTS) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->HookshotOrBoomerang())));}), + EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || logic->CanKillEnemy(RE_GOHMA);}), }, { // Locations LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), 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 e961a5c08..bb5e1754f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -528,7 +528,7 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", "Dodongos Cavern", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->DodongosCavernClear, []{return logic->DodongosCavernClear || (logic->HasBossSoul(RG_KING_DODONGO_SOUL) && (Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && (logic->CanUse(RG_BOMB_BAG) || logic->HasItem(RG_GORONS_BRACELET)) && logic->CanJumpslashExceptHammer())); /*todo add chu kill to tricks*/}), + EventAccess(&logic->DodongosCavernClear, []{return logic->DodongosCavernClear || (Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && logic->CanKillEnemy(RE_KING_DODONGO)); /*todo add chu kill to tricks*/}), }, { // Locations LOCATION(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 429d84667..1e7214a3d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -705,7 +705,7 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", "Fire Temple", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->FireTempleClear, []{return logic->FireTempleClear || (logic->HasBossSoul(RG_VOLVAGIA_SOUL) && (logic->FireTimer() >= 64 && logic->CanUse(RG_MEGATON_HAMMER)));}), + EventAccess(&logic->FireTempleClear, []{return logic->FireTempleClear || (logic->FireTimer() >= 64 && logic->CanKillEnemy(RE_VOLVAGIA));}), }, { // Locations LOCATION(RC_FIRE_TEMPLE_VOLVAGIA_HEART, logic->FireTempleClear), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 87f738b90..c9f4ebc23 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -600,7 +600,7 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", "Forest Temple", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->ForestTempleClear, []{return logic->ForestTempleClear || (logic->HasBossSoul(RG_PHANTOM_GANON_SOUL) && ((logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))));}), + EventAccess(&logic->ForestTempleClear, []{return logic->ForestTempleClear || logic->CanKillEnemy(RE_PHANTOM_GANON);}), }, { // Locations LOCATION(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, logic->ForestTempleClear), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index fe043caa3..fa9c7b085 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -341,7 +341,7 @@ void RegionTable_Init_JabuJabusBelly() { areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", {}, NO_DAY_NIGHT_CYCLE, { // Events //todo: add pot kill trick - EventAccess(&logic->JabuJabusBellyClear, []{return logic->JabuJabusBellyClear || (logic->HasBossSoul(RG_BARINADE_SOUL) && (logic->CanUse(RG_BOOMERANG) && logic->CanJumpslashExceptHammer()));}), + EventAccess(&logic->JabuJabusBellyClear, []{return logic->JabuJabusBellyClear || logic->CanKillEnemy(RE_BARINADE);}), }, { // Locations LOCATION(RC_JABU_JABUS_BELLY_BARINADE_POT_1, logic->CanBreakPots()), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 1267e2408..bdcf8a4fa 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -399,11 +399,7 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", "Shadow Temple", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->ShadowTempleClear, []{ - return logic->ShadowTempleClear || (logic->HasBossSoul(RG_BONGO_BONGO_SOUL) && ((logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && - (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && - (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || ctx->GetTrickOption(RT_SHADOW_BONGO)))); - }), + EventAccess(&logic->ShadowTempleClear, []{return logic->ShadowTempleClear || logic->CanKillEnemy(RE_BONGO_BONGO);}), }, { // Locations LOCATION(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, logic->ShadowTempleClear), 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 3d8e26cd6..e3d00ccf3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -544,7 +544,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", "Spirit Temple", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->SpiritTempleClear, []{return logic->SpiritTempleClear || (logic->HasBossSoul(RG_TWINROVA_SOUL) && (logic->CanUse(RG_MIRROR_SHIELD) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))));}), + EventAccess(&logic->SpiritTempleClear, []{return logic->SpiritTempleClear || logic->CanKillEnemy(RE_TWINROVA);}), }, { // Locations LOCATION(RC_SPIRIT_TEMPLE_TWINROVA_HEART, logic->SpiritTempleClear), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index 318a5eb64..4d2fbb9bf 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -725,7 +725,7 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", "Water Temple", {}, NO_DAY_NIGHT_CYCLE, { // Events - EventAccess(&logic->WaterTempleClear, []{return logic->WaterTempleClear || (logic->HasBossSoul(RG_MORPHA_SOUL) && (logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))));}), + EventAccess(&logic->WaterTempleClear, []{return logic->WaterTempleClear || logic->CanKillEnemy(RE_MORPHA);}), }, { // Locations LOCATION(RC_WATER_TEMPLE_MORPHA_HEART, logic->WaterTempleClear), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 9e1b1cf85..5e5389dd4 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -673,6 +673,31 @@ namespace Rando { case RE_BIG_OCTO: //If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room without shenanigains anyway. Bunny makes it free return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS) || CanUse(RG_MASTER_SWORD); + case RE_GOHMA: + return HasBossSoul(RG_GOHMA_SOUL) && CanJumpslash() && + (CanUse(RG_NUTS) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang()); + case RE_KING_DODONGO: + return HasBossSoul(RG_KING_DODONGO_SOUL) && CanJumpslash() && + (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET)); + case RE_BARINADE: + return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); + case RE_PHANTOM_GANON: + return HasBossSoul(RG_PHANTOM_GANON_SOUL) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT)); + case RE_VOLVAGIA: + return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); + case RE_MORPHA: + return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER)); + case RE_BONGO_BONGO: + return HasBossSoul(RG_BONGO_BONGO_SOUL) && + (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || ctx->GetTrickOption(RT_SHADOW_BONGO)); + case RE_TWINROVA: + return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER)); case RE_GANONDORF: // RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the energy ball // and either of them regardless of jumpslashing to damage and kill ganondorf diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 550f2b1af..155b31db1 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -5732,6 +5732,14 @@ typedef enum { RE_BIG_OCTO, RE_GERUDO_WARRIOR, RE_GIBDO, + RE_GOHMA, + RE_KING_DODONGO, + RE_BARINADE, + RE_PHANTOM_GANON, + RE_VOLVAGIA, + RE_MORPHA, + RE_BONGO_BONGO, + RE_TWINROVA, RE_GANONDORF, RE_GANON, RE_DARK_LINK, From 06387060d6b3434eae7d65f12f651d495444af2c Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:09:01 +0100 Subject: [PATCH 064/267] Trade cleanup (#4971) * Move adult trade to flags * Move child trade to flags * Fix vanilla * Address review * Rename `trade_shuffle` to `ShuffleTradeItems` * Fix mac build * Update GIVanillaBehavior.h * Update z_kankyo.c * Update z_en_heishi2.c --- soh/include/z64save.h | 1 - .../Enhancements/debugger/debugSaveEditor.cpp | 27 -------- .../Enhancements/debugger/debugSaveEditor.h | 24 +++++++ .../GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 4 ++ .../game-interactor/GameInteractor_Hooks.h | 2 +- .../vanilla-behavior/GIVanillaBehavior.h | 5 ++ .../randomizer/ShuffleTradeItems.c | 51 ++++++++++++++ .../randomizer/ShuffleTradeItems.h | 11 +++ .../randomizer/adult_trade_shuffle.c | 33 --------- .../randomizer/adult_trade_shuffle.h | 13 ---- .../Enhancements/randomizer/hook_handlers.cpp | 68 ++++++++++++++----- soh/soh/Enhancements/randomizer/logic.cpp | 31 ++------- soh/soh/Enhancements/randomizer/logic.h | 2 - .../Enhancements/randomizer/randomizer_inf.h | 24 +++++++ soh/soh/Enhancements/randomizer/savefile.cpp | 18 +++-- soh/soh/SaveManager.cpp | 8 --- soh/src/code/z_kankyo.c | 3 + soh/src/code/z_parameter.c | 20 ++++-- soh/src/code/z_play.c | 1 + soh/src/code/z_scene_table.c | 3 +- soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c | 1 - soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 1 - soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 1 - .../actors/ovl_En_Heishi2/z_en_heishi2.c | 4 +- soh/src/overlays/actors/ovl_En_Hs/z_en_hs.c | 1 - soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c | 1 - soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 1 - soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 1 - .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 1 - .../overlays/actors/ovl_En_Toryo/z_en_toryo.c | 1 - .../misc/ovl_kaleido_scope/z_kaleido_item.c | 48 +++++++++---- 32 files changed, 246 insertions(+), 165 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/ShuffleTradeItems.c create mode 100644 soh/soh/Enhancements/randomizer/ShuffleTradeItems.h delete mode 100644 soh/soh/Enhancements/randomizer/adult_trade_shuffle.c delete mode 100644 soh/soh/Enhancements/randomizer/adult_trade_shuffle.h diff --git a/soh/include/z64save.h b/soh/include/z64save.h index f59271212..f7873031f 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -160,7 +160,6 @@ typedef struct { #pragma region SoH typedef struct ShipRandomizerSaveContextData { - u16 adultTradeItems; u8 triforcePiecesCollected; } ShipRandomizerSaveContextData; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 962f50bd6..b9858aff4 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -19,7 +19,6 @@ extern "C" { #include "functions.h" #include "macros.h" #include "soh/cvar_prefixes.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" extern PlayState* gPlayState; #include "textures/icon_item_static/icon_item_static.h" @@ -414,22 +413,6 @@ void DrawInfoTab() { void DrawBGSItemFlag(uint8_t itemID) { const ItemMapEntry& slotEntry = itemMapping[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.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.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.ship.quest.data.randomizer.adultTradeItems &= ~(1 << tradeIndex); - Inventory_ReplaceItem(gPlayState, itemID, Randomizer_GetNextAdultTradeItem()); - } - } } void DrawInventoryTab() { @@ -476,9 +459,6 @@ void DrawInventoryTab() { if (ImGui::BeginPopup(itemPopupPicker)) { if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; - if (selectedIndex == SLOT_TRADE_ADULT) { - gSaveContext.ship.quest.data.randomizer.adultTradeItems = 0; - } ImGui::CloseCurrentPopup(); } UIWidgets::SetLastItemHoverText("None"); @@ -512,13 +492,6 @@ void DrawInventoryTab() { ImGui::PopStyleVar(); if (ret) { gSaveContext.inventory.items[selectedIndex] = slotEntry.id; - // Set adult trade item flag if you're playing adult trade shuffle in rando - if (IS_RANDO && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) && - selectedIndex == SLOT_TRADE_ADULT && - slotEntry.id >= ITEM_POCKET_EGG && slotEntry.id <= ITEM_CLAIM_CHECK) { - gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(slotEntry.id); - } ImGui::CloseCurrentPopup(); } UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 2a77b9b0a..554a90b2a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -1600,6 +1600,30 @@ const std::vector flagTables = { { 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" }, + + { RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, "RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG" }, + { RAND_INF_CHILD_TRADES_HAS_CHICKEN, "RAND_INF_CHILD_TRADES_HAS_CHICKEN" }, + { RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, "RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, "RAND_INF_CHILD_TRADES_HAS_MASK_KEATON" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, "RAND_INF_CHILD_TRADES_HAS_MASK_SKULL" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, "RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, "RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_GORON, "RAND_INF_CHILD_TRADES_HAS_MASK_GORON" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, "RAND_INF_CHILD_TRADES_HAS_MASK_ZORA" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, "RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, "RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH" }, + + { RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, "RAND_INF_ADULT_TRADES_HAS_POCKET_EGG" }, + { RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, "RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO" }, + { RAND_INF_ADULT_TRADES_HAS_COJIRO, "RAND_INF_ADULT_TRADES_HAS_COJIRO" }, + { RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, "RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM" }, + { RAND_INF_ADULT_TRADES_HAS_ODD_POTION, "RAND_INF_ADULT_TRADES_HAS_ODD_POTION" }, + { RAND_INF_ADULT_TRADES_HAS_SAW, "RAND_INF_ADULT_TRADES_HAS_SAW" }, + { RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, "RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN" }, + { RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, "RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION" }, + { RAND_INF_ADULT_TRADES_HAS_FROG, "RAND_INF_ADULT_TRADES_HAS_FROG" }, + { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, "RAND_INF_ADULT_TRADES_HAS_EYEDROPS" }, + { RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, "RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK" }, } }, }; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 3f2f80265..3bd2ef36e 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -22,6 +22,7 @@ DEFINE_HOOK(OnFlagUnset, (int16_t flagType, int16_t flag)); DEFINE_HOOK(OnSceneSpawnActors, ()); DEFINE_HOOK(OnPlayerUpdate, ()); DEFINE_HOOK(OnOcarinaSongAction, ()); +DEFINE_HOOK(OnCuccoOrChickenHatch, ()); DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price)); DEFINE_HOOK(OnActorInit, (void* actor)); DEFINE_HOOK(OnActorUpdate, (void* actor)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index ab69b543f..b41030cfa 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -80,6 +80,10 @@ void GameInteractor_ExecuteOnOcarinaSongAction() { GameInteractor::Instance->ExecuteHooks(); } +void GameInteractor_ExecuteOnCuccoOrChickenHatch() { + GameInteractor::Instance->ExecuteHooks(); +} + void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price) { GameInteractor::Instance->ExecuteHooks(cursorIndex, price); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index b73f9fe70..f1b918cef 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -24,6 +24,7 @@ void GameInteractor_ExecuteOnFlagUnset(int16_t flagType, int16_t flag); void GameInteractor_ExecuteOnSceneSpawnActors(); void GameInteractor_ExecuteOnPlayerUpdate(); void GameInteractor_ExecuteOnOcarinaSongAction(); +void GameInteractor_ExecuteOnCuccoOrChickenHatch(); void GameInteractor_ExecuteOnActorInit(void* actor); void GameInteractor_ExecuteOnActorUpdate(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); @@ -33,7 +34,6 @@ void GameInteractor_ExecuteOnTimestamp (u8 item); void GameInteractor_ExecuteOnPlayerBonk(); void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount); void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents); -void GameInteractor_ExecuteOnOcarinaSongAction(); void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price); void GameInteractor_ExecuteOnPlayDestroy(); void GameInteractor_ExecuteOnPlayDrawEnd(); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 1157f3c75..a95dabb00 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -371,6 +371,11 @@ typedef enum { // #### `args` // - `*Actor` VB_DOOR_PLAY_SCENE_TRANSITION, + // Vanilla condition: true + VB_HATCH_CUCCO_OR_CHICKEN, + // Vanilla condition: exchangeItemId == EXCH_ITEM_LETTER_ZELDA + // Opt: s32 + VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER, // #### `result` // In `Interface_DrawAmmoCount`: diff --git a/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c new file mode 100644 index 000000000..62e0bc9f0 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c @@ -0,0 +1,51 @@ +#include "functions.h" +#include "variables.h" +#include "macros.h" + +u8 Randomizer_GetNextChildTradeItem() { + const u8 numTradeItems = ITEM_MASK_TRUTH - ITEM_WEIRD_EGG + 1; + u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_CHILD) - ITEM_WEIRD_EGG; + for (int i = 0; i < numTradeItems; i++) { + u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; + if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) { + return ITEM_WEIRD_EGG + tradeIndex; + } + } + return ITEM_NONE; +} + +u8 Randomizer_GetPrevChildTradeItem() { + const u8 numTradeItems = ITEM_MASK_TRUTH - ITEM_WEIRD_EGG + 1; + u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_CHILD) - ITEM_WEIRD_EGG; + for (int i = 0; i < numTradeItems; i++) { + u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems; + if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) { + return ITEM_WEIRD_EGG + tradeIndex; + } + } + return ITEM_NONE; +} + +u8 Randomizer_GetNextAdultTradeItem() { + const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1; + u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG; + for (int i = 0; i < numTradeItems; i++) { + u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; + if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { + return ITEM_POCKET_EGG + tradeIndex; + } + } + return ITEM_NONE; +} + +u8 Randomizer_GetPrevAdultTradeItem() { + const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1; + 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 (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { + return ITEM_POCKET_EGG + tradeIndex; + } + } + return ITEM_NONE; +} diff --git a/soh/soh/Enhancements/randomizer/ShuffleTradeItems.h b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.h new file mode 100644 index 000000000..a43f7de52 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.h @@ -0,0 +1,11 @@ +#ifndef Z_ADULT_TRADE_SHUFFLE_H +#define Z_ADULT_TRADE_SHUFFLE_H + +#include + +u8 Randomizer_GetNextChildTradeItem(); +u8 Randomizer_GetPrevChildTradeItem(); +u8 Randomizer_GetNextAdultTradeItem(); +u8 Randomizer_GetPrevAdultTradeItem(); + +#endif diff --git a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c b/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c deleted file mode 100644 index 4bf481d2a..000000000 --- a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" -#include "functions.h" -#include "variables.h" -#include "macros.h" - -void Randomizer_ConsumeAdultTradeItem(PlayState* play, u8 itemId) { - gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(itemId); - Inventory_ReplaceItem(play, itemId, Randomizer_GetNextAdultTradeItem()); -} - -u8 Randomizer_GetNextAdultTradeItem() { - const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1; - 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.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) { - return ITEM_POCKET_EGG + tradeIndex; - } - } - return ITEM_NONE; -} - -u8 Randomizer_GetPrevAdultTradeItem() { - const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1; - 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.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) { - return ITEM_POCKET_EGG + tradeIndex; - } - } - return ITEM_NONE; -} diff --git a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h b/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h deleted file mode 100644 index f9894cf4e..000000000 --- a/soh/soh/Enhancements/randomizer/adult_trade_shuffle.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef Z_ADULT_TRADE_SHUFFLE_H -#define Z_ADULT_TRADE_SHUFFLE_H - -#include - -#define ADULT_TRADE_FLAG(itemId) (1 << (itemId - ITEM_POCKET_EGG)) -#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(); -u8 Randomizer_GetPrevAdultTradeItem(); - -#endif diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index e236666f6..f48b7da5a 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -21,7 +21,7 @@ extern "C" { #include "macros.h" #include "functions.h" #include "variables.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" +#include "soh/Enhancements/randomizer/ShuffleTradeItems.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/randomizer/randomizer_grotto.h" #include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" @@ -55,7 +55,6 @@ extern "C" { #include "src/overlays/actors/ovl_En_Xc/z_en_xc.h" #include "src/overlays/actors/ovl_Fishing/z_fishing.h" #include "src/overlays/actors/ovl_En_Mk/z_en_mk.h" -#include "adult_trade_shuffle.h" #include "draw.h" extern SaveContext gSaveContext; @@ -219,14 +218,21 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { if (RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && flagType == FLAG_RANDOMIZER_INF) { switch (flag) { case RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD: - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_SWORD_BROKEN); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN); + Inventory_ReplaceItem(gPlayState, ITEM_SWORD_BROKEN, Randomizer_GetNextAdultTradeItem()); break; case RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS: - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_EYEDROPS); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_EYEDROPS); + Inventory_ReplaceItem(gPlayState, ITEM_EYEDROPS, Randomizer_GetNextAdultTradeItem()); break; } } + if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_TALON_WOKEN_IN_CASTLE) { + //remove chicken as this is the only use for it + Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN); + } + RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag); if (rc == RC_UNKNOWN_CHECK) return; @@ -1133,7 +1139,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l EnFr* enFr = va_arg(args, EnFr*); if ( - (enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) || + (enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) || (enFr->songIndex < FROG_STORMS && enFr->reward == GI_RUPEE_PURPLE) ) { *should = true; @@ -1142,7 +1148,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_TRADE_POCKET_CUCCO: { EnNiwLady* enNiwLady = va_arg(args, EnNiwLady*); - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_POCKET_CUCCO); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO); + Inventory_ReplaceItem(gPlayState, ITEM_POCKET_CUCCO, Randomizer_GetNextAdultTradeItem()); // Trigger the reward now Flags_SetItemGetInf(ITEMGETINF_2E); enNiwLady->actionFunc = func_80ABA778; @@ -1151,13 +1158,15 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_TRADE_COJIRO: { - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_COJIRO); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO); + Inventory_ReplaceItem(gPlayState, ITEM_COJIRO, Randomizer_GetNextAdultTradeItem()); *should = false; break; } case VB_TRADE_ODD_MUSHROOM: { EnDs* granny = va_arg(args, EnDs*); - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_ODD_MUSHROOM); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM); + Inventory_ReplaceItem(gPlayState, ITEM_ODD_MUSHROOM, Randomizer_GetNextAdultTradeItem()); // Trigger the reward now Flags_SetItemGetInf(ITEMGETINF_30); granny->actor.textId = 0x504F; @@ -1168,14 +1177,16 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_TRADE_ODD_POTION: { EnKo* enKo = va_arg(args, EnKo*); - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_ODD_POTION); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_POTION); + Inventory_ReplaceItem(gPlayState, ITEM_ODD_POTION, Randomizer_GetNextAdultTradeItem()); // Trigger the reward now Flags_SetItemGetInf(ITEMGETINF_31); *should = false; break; } case VB_TRADE_SAW: { - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_SAW); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_SAW); + Inventory_ReplaceItem(gPlayState, ITEM_SAW, Randomizer_GetNextAdultTradeItem()); *should = false; break; } @@ -1192,14 +1203,16 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l if (func_8002F368(gPlayState) == EXCH_ITEM_PRESCRIPTION || (hasShieldHoldingR && INV_CONTENT(ITEM_TRADE_ADULT) < ITEM_FROG)) { Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION); - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_PRESCRIPTION); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION); + Inventory_ReplaceItem(gPlayState, ITEM_PRESCRIPTION, Randomizer_GetNextAdultTradeItem()); } else { Flags_SetRandomizerInf(RAND_INF_KING_ZORA_THAWED); } } else { - if (enKz->isTrading){ + if (enKz->isTrading) { Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION); - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_PRESCRIPTION); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION); + Inventory_ReplaceItem(gPlayState, ITEM_PRESCRIPTION, Randomizer_GetNextAdultTradeItem()); } else { Flags_SetRandomizerInf(RAND_INF_KING_ZORA_THAWED); } @@ -1208,7 +1221,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_TRADE_FROG: { - Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_FROG); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_FROG); + Inventory_ReplaceItem(gPlayState, ITEM_FROG, Randomizer_GetNextAdultTradeItem()); *should = false; break; } @@ -1236,9 +1250,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l if (!RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE)) { break; } - if (PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO)) { + if (Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO)) { *should = false; - } else if (PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_ODD_POTION)) { + } else if (Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_POTION)) { *should = true; } else { *should = Flags_GetItemGetInf(ITEMGETINF_30); // Traded odd mushroom @@ -1250,10 +1264,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } - if (PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO)) { + if (Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO)) { *should = false; } else { - *should = PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_ODD_POTION); + *should = Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_POTION); } break; @@ -1595,6 +1609,13 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } + case VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER: { + if (*should) { + //remove zelda's letter as this is the only use for it + Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); + } + break; + } case VB_FREEZE_ON_SKULL_TOKEN: case VB_TRADE_TIMER_ODD_MUSHROOM: case VB_TRADE_TIMER_FROG: @@ -2293,6 +2314,13 @@ void RandomizerOnKaleidoscopeUpdateHandler(int16_t inDungeonScene) { prevKaleidoState = gPlayState->pauseCtx.state; } +void RandomizerOnCuccoOrChickenHatch() { + if (LINK_IS_CHILD) { + Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN); + } +} + void RandomizerRegisterHooks() { static uint32_t onFlagSetHook = 0; static uint32_t onSceneFlagSetHook = 0; @@ -2310,6 +2338,7 @@ void RandomizerRegisterHooks() { static uint32_t onPlayDestroyHook = 0; static uint32_t onExitGameHook = 0; static uint32_t onKaleidoUpdateHook = 0; + static uint32_t onCuccoOrChickenHatchHook = 0; static uint32_t fishsanityOnActorInitHook = 0; static uint32_t fishsanityOnActorUpdateHook = 0; @@ -2345,6 +2374,7 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->UnregisterGameHook(onPlayDestroyHook); GameInteractor::Instance->UnregisterGameHook(onExitGameHook); GameInteractor::Instance->UnregisterGameHook(onKaleidoUpdateHook); + GameInteractor::Instance->UnregisterGameHook(onCuccoOrChickenHatchHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnActorInitHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnActorUpdateHook); @@ -2373,6 +2403,7 @@ void RandomizerRegisterHooks() { onPlayDestroyHook = 0; onExitGameHook = 0; onKaleidoUpdateHook = 0; + onCuccoOrChickenHatchHook = 0; fishsanityOnActorInitHook = 0; fishsanityOnActorUpdateHook = 0; @@ -2414,6 +2445,7 @@ void RandomizerRegisterHooks() { onPlayDestroyHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayDestroyHandler); onExitGameHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnExitGameHandler); onKaleidoUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnKaleidoscopeUpdateHandler); + onCuccoOrChickenHatchHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnCuccoOrChickenHatch); if (RAND_GET_OPTION(RSK_FISHSANITY) != RO_FISHSANITY_OFF) { OTRGlobals::Instance->gRandoContext->GetFishsanity()->InitializeFromSave(); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 5e5389dd4..408ded72e 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -226,7 +226,7 @@ namespace Rando { case RG_EYEBALL_FROG: case RG_EYEDROPS: case RG_CLAIM_CHECK: - return HasAdultTrade(StaticData::RetrieveItem(itemName).GetGIEntry()->itemId); + return CheckRandoInf(itemName - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); case RG_BOTTLE_WITH_BIG_POE: case RG_BOTTLE_WITH_BLUE_FIRE: case RG_BOTTLE_WITH_BLUE_POTION: @@ -1509,7 +1509,7 @@ namespace Rando { case RG_EYEBALL_FROG: case RG_EYEDROPS: case RG_CLAIM_CHECK: - SetAdultTrade(item.GetGIEntry()->itemId, state); + SetRandoInf(randoGet - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); break; case RG_PROGRESSIVE_HOOKSHOT: { @@ -2079,26 +2079,10 @@ namespace Rando { return ((1 << item) & mSaveContext->inventory.questItems); } - bool Logic::HasAdultTrade(uint32_t itemID) { - int tradeIndex = itemID - ITEM_POCKET_EGG; - 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->ship.quest.data.randomizer.adultTradeItems &= ~(1 << tradeIndex); - } - else { - mSaveContext->ship.quest.data.randomizer.adultTradeItems |= (1 << tradeIndex); - } - } - void Logic::SetQuestItem(uint32_t item, bool state) { if (!state) { mSaveContext->inventory.questItems &= ~(1 << item); - } - else { + } else { mSaveContext->inventory.questItems |= (1 << item); } } @@ -2118,8 +2102,7 @@ namespace Rando { void Logic::SetDungeonItem(uint32_t item, uint32_t dungeonIndex, bool state) { if (!state) { mSaveContext->inventory.dungeonItems[dungeonIndex] &= ~gBitFlags[item]; - } - else { + } else { mSaveContext->inventory.dungeonItems[dungeonIndex] |= gBitFlags[item]; } } @@ -2131,8 +2114,7 @@ namespace Rando { void Logic::SetRandoInf(uint32_t flag, bool state) { if (!state) { mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); - } - else { + } else { mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); } } @@ -2144,8 +2126,7 @@ namespace Rando { void Logic::SetEventChkInf(int32_t flag, bool state) { if (!state) { mSaveContext->eventChkInf[flag >> 4] &= ~(1 << (flag & 0xF)); - } - else { + } else { mSaveContext->eventChkInf[flag >> 4] |= (1 << (flag & 0xF)); } } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 77d6b2573..4286cc5c3 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -261,8 +261,6 @@ class Logic { bool CheckEquipment(uint32_t item); bool CheckQuestItem(uint32_t item); void SetQuestItem(uint32_t item, bool state); - bool HasAdultTrade(uint32_t item); - void SetAdultTrade(uint32_t item, bool state); uint8_t GetSmallKeyCount(uint32_t dungeonIndex); void SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count); bool CheckDungeonItem(uint32_t item, uint32_t dungeonIndex); diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index e43acf57c..8c4d05a4f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1325,6 +1325,30 @@ typedef enum { RAND_INF_FISHING_HOLE_UNLOCKED, RAND_INF_FISHING_HOLE_KEY_OBTAINED, + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, + RAND_INF_CHILD_TRADES_HAS_CHICKEN, + RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, + RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, + RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, + RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, + RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, + RAND_INF_CHILD_TRADES_HAS_MASK_GORON, + RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, + RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, + RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, + + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, + RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, + RAND_INF_ADULT_TRADES_HAS_COJIRO, + RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, + RAND_INF_ADULT_TRADES_HAS_ODD_POTION, + RAND_INF_ADULT_TRADES_HAS_SAW, + RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, + RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, + RAND_INF_ADULT_TRADES_HAS_FROG, + RAND_INF_ADULT_TRADES_HAS_EYEDROPS, + RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, + // 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/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 7e91026b0..fba7c688b 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -260,11 +260,6 @@ extern "C" void Randomizer_InitSaveFile() { // Give Link's pocket item GiveLinksPocketItem(); - // shuffle adult trade quest - if (Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) { - gSaveContext.ship.quest.data.randomizer.adultTradeItems = 0; - } - // remove One Time scrubs with scrubsanity off if (Randomizer_GetSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_OFF) { Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE); @@ -316,6 +311,7 @@ extern "C" void Randomizer_InitSaveFile() { // Set "Got Zelda's Letter" flag. Also ensures Saria is back at SFM. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); // Got item from impa Flags_SetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY); @@ -325,6 +321,7 @@ extern "C" void Randomizer_InitSaveFile() { // set this at the end to ensure we always start with the letter // this is for the off chance we got the weird egg from impa (which should never happen) INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA; + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && startingAge == RO_AGE_ADULT) { @@ -375,6 +372,7 @@ extern "C" void Randomizer_InitSaveFile() { if (Randomizer_GetSettingValue(RSK_KAK_GATE) == RO_KAK_GATE_OPEN) { Flags_SetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD); + Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } if (Randomizer_GetSettingValue(RSK_GERUDO_FORTRESS) == RO_GF_CARPENTERS_FAST || @@ -412,6 +410,16 @@ extern "C" void Randomizer_InitSaveFile() { if (Randomizer_GetSettingValue(RSK_COMPLETE_MASK_QUEST)) { Flags_SetInfTable(INFTABLE_GATE_GUARD_PUT_ON_KEATON_MASK); Flags_SetEventChkInf(EVENTCHKINF_PAID_BACK_BUNNY_HOOD_FEE); + + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_KEATON); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_SKULL); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_GORON); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_ZORA); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO); + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH); + gSaveContext.itemGetInf[3] |= 0x100; // Sold Keaton Mask gSaveContext.itemGetInf[3] |= 0x200; // Sold Skull Mask gSaveContext.itemGetInf[3] |= 0x400; // Sold Spooky Mask diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index f91696191..55c7d204e 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -218,8 +218,6 @@ void SaveManager::LoadRandomizerVersion1() { } randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, {CustomMessage(ganonText)})); - SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); @@ -348,8 +346,6 @@ 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.ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); @@ -445,8 +441,6 @@ void SaveManager::LoadRandomizerVersion3() { randoContext->AddHint(hint, Rando::Hint(hint, json)); }); - SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); @@ -582,8 +576,6 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f }); }); - SaveManager::Instance->SaveData("adultTradeItems", saveContext->ship.quest.data.randomizer.adultTradeItems); - SaveManager::Instance->SaveData("triforcePiecesCollected", saveContext->ship.quest.data.randomizer.triforcePiecesCollected); SaveManager::Instance->SaveData("pendingIceTrapCount", saveContext->ship.pendingIceTrapCount); diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index df5decc4a..2c88ecd80 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -6,6 +6,8 @@ #include "soh/frame_interpolation.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" typedef enum { /* 0 */ LENS_FLARE_CIRCLE0, @@ -2111,6 +2113,7 @@ void func_80075B44(PlayState* play) { if ((Inventory_ReplaceItem(play, ITEM_WEIRD_EGG, ITEM_CHICKEN) || Inventory_HatchPocketCucco(play)) && play->csCtx.state == 0 && !Player_InCsMode(play)) { + GameInteractor_ExecuteOnCuccoOrChickenHatch(); Message_StartTextbox(play, 0x3066, NULL); } play->envCtx.unk_E0++; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 1daa29fb9..f424b9fcd 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -4,7 +4,6 @@ #include "textures/do_action_static/do_action_static.h" #include "textures/icon_item_static/icon_item_static.h" #include "soh_assets.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "libultraship/bridge.h" @@ -2446,8 +2445,17 @@ u8 Item_Give(PlayState* play, u8 item) { Flags_SetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE); } - if (item >= ITEM_POCKET_EGG) { - gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(item); + if (IS_RANDO) { + if (item >= ITEM_POCKET_EGG) { + Flags_SetRandomizerInf(item - ITEM_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); + } else if (item == ITEM_LETTER_ZELDA) { + //don't care about zelda's letter if it's already been shown to the guard + if (!Flags_GetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD)) { + Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); + } + } else { + Flags_SetRandomizerInf(item - ITEM_WEIRD_EGG + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG); + } } temp = INV_CONTENT(item); @@ -2759,12 +2767,12 @@ bool Inventory_HatchPocketCucco(PlayState* play) { return Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO); } - if (!PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_POCKET_EGG)) { + if (!Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { return 0; } - gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG); - gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO); + Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); + Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO); Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO); return 1; } diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 115369171..e625f4b53 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -521,6 +521,7 @@ void Play_Init(GameState* thisx) { if (Inventory_ReplaceItem(play, ITEM_WEIRD_EGG, ITEM_CHICKEN) || Inventory_HatchPocketCucco(play)) { + GameInteractor_ExecuteOnCuccoOrChickenHatch(); Message_StartTextbox(play, 0x3066, NULL); } diff --git a/soh/src/code/z_scene_table.c b/soh/src/code/z_scene_table.c index c7d76db01..a85965a82 100644 --- a/soh/src/code/z_scene_table.c +++ b/soh/src/code/z_scene_table.c @@ -24,7 +24,6 @@ #include "overlays/actors/ovl_Bg_Dodoago/z_bg_dodoago.h" #include "soh/mq_asset_hacks.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -1300,7 +1299,7 @@ void func_8009EE44(PlayState* play) { bool playerHasCojiro = INV_CONTENT(ITEM_COJIRO) == ITEM_COJIRO; if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) { - playerHasCojiro = PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO); + playerHasCojiro = Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO); } if ((play->roomCtx.unk_74[0] == 0) && playerHasCojiro) { if (play->roomCtx.unk_74[1] == 50) { 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 ebc1b07b4..3a85be38b 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 @@ -6,7 +6,6 @@ #include "z_en_ds.h" #include "objects/object_ds/object_ds.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 22117f9d0..bb43d4709 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 @@ -3,7 +3,6 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_oF1d_map/object_oF1d_map.h" #include "soh/frame_interpolation.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) 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 1462f8302..264daa595 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 @@ -3,7 +3,6 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_oF1d_map/object_oF1d_map.h" #include "soh/frame_interpolation.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 3a0824bc1..0bb2b1e9d 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 @@ -12,6 +12,8 @@ #include "overlays/actors/ovl_En_Bom/z_en_bom.h" #include "overlays/actors/ovl_Bg_Spot15_Saku/z_bg_spot15_saku.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) @@ -407,7 +409,7 @@ void func_80A53AD4(EnHeishi2* this, PlayState* play) { this->unk_300 = TEXT_STATE_DONE; if (Actor_ProcessTalkRequest(&this->actor, play)) { exchangeItemId = func_8002F368(play); - if (exchangeItemId == EXCH_ITEM_LETTER_ZELDA) { + if (GameInteractor_Should(VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER, exchangeItemId == EXCH_ITEM_LETTER_ZELDA, exchangeItemId)) { Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); player->actor.textId = 0x2010; this->unk_300 = TEXT_STATE_EVENT; 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 468d2124f..0ca12f878 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 @@ -7,7 +7,6 @@ #include "z_en_hs.h" #include "vt.h" #include "objects/object_hs/object_hs.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 33c86821f..9e70ebce1 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 @@ -10,7 +10,6 @@ #include "objects/object_km1/object_km1.h" #include "objects/object_kw1/object_kw1.h" #include "vt.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 7e0a3521e..99695266b 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 @@ -6,7 +6,6 @@ #include "z_en_kz.h" #include "objects/object_kz/object_kz.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 b1891a296..56f0e70b2 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 @@ -6,7 +6,6 @@ #include "z_en_mk.h" #include "objects/object_mk/object_mk.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 2c3b2bbe5..59f2cafc6 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 @@ -3,7 +3,6 @@ #include "objects/object_os_anime/object_os_anime.h" #include "overlays/actors/ovl_En_Niw/z_en_niw.h" #include "vt.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" 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 d13309059..15940afc2 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 @@ -6,7 +6,6 @@ #include "z_en_toryo.h" #include "objects/object_toryo/object_toryo.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 6e8a42803..9096271c1 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -1,7 +1,7 @@ #include "z_kaleido_scope.h" #include "textures/parameter_static/parameter_static.h" #include "textures/icon_item_static/icon_item_static.h" -#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" +#include "soh/Enhancements/randomizer/ShuffleTradeItems.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" @@ -316,6 +316,10 @@ void KaleidoScope_HandleItemCycleExtras(PlayState* play, u8 slot, bool canCycle, } bool CanMaskSelect() { + if (IS_RANDO) { + return CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0) /* || Randomizer_GetSettingValue(RSK_SHUFFLE_CHILD_TRADE) */; + } + // only allow mask select when: // the shop is open: // * zelda's letter check: Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER) @@ -333,12 +337,20 @@ void KaleidoScope_HandleItemCycles(PlayState* play) { play, SLOT_TRADE_CHILD, CanMaskSelect(), - INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ? - ITEM_MASK_TRUTH : - INV_CONTENT(ITEM_TRADE_CHILD) - 1, - INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ? - ITEM_MASK_KEATON : - INV_CONTENT(ITEM_TRADE_CHILD) + 1, + IS_RANDO ? + Randomizer_GetPrevChildTradeItem() : + ( + INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ? + ITEM_MASK_TRUTH : + INV_CONTENT(ITEM_TRADE_CHILD) - 1 + ), + IS_RANDO ? + Randomizer_GetNextChildTradeItem() : + ( + INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ? + ITEM_MASK_KEATON : + INV_CONTENT(ITEM_TRADE_CHILD) + 1 + ), true ); @@ -379,14 +391,22 @@ void KaleidoScope_DrawItemCycles(PlayState* play) { play, SLOT_TRADE_CHILD, CanMaskSelect(), - INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ? - ITEM_MASK_TRUTH : - INV_CONTENT(ITEM_TRADE_CHILD) - 1, - INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ? - ITEM_MASK_KEATON : - INV_CONTENT(ITEM_TRADE_CHILD) + 1 + IS_RANDO ? + Randomizer_GetPrevChildTradeItem() : + ( + INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ? + ITEM_MASK_TRUTH : + INV_CONTENT(ITEM_TRADE_CHILD) - 1 + ), + IS_RANDO ? + Randomizer_GetNextChildTradeItem() : + ( + INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ? + ITEM_MASK_KEATON : + INV_CONTENT(ITEM_TRADE_CHILD) + 1 + ) ); - + //draw the adult trade select KaleidoScope_DrawItemCycleExtras( play, From 2d78cb561ac504b160f9d1988839fc7890a9d876 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Thu, 27 Feb 2025 22:33:48 -0500 Subject: [PATCH 065/267] Move Broken Giant's Knife fix hook to its own file (#5049) * Move Broken Giant's Knife fix hook to its own file * Separate IS_RANDO out of value macro * Remove redundant extern * One-line comment --- .../Enhancements/Fixes/BrokenGiantsKnife.cpp | 46 +++++++++++++++++++ soh/soh/Enhancements/mods.cpp | 39 ---------------- 2 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 soh/soh/Enhancements/Fixes/BrokenGiantsKnife.cpp diff --git a/soh/soh/Enhancements/Fixes/BrokenGiantsKnife.cpp b/soh/soh/Enhancements/Fixes/BrokenGiantsKnife.cpp new file mode 100644 index 000000000..6d21d812b --- /dev/null +++ b/soh/soh/Enhancements/Fixes/BrokenGiantsKnife.cpp @@ -0,0 +1,46 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" +#include "macros.h" +#include "variables.h" +#include "z64save.h" + +extern "C" PlayState* gPlayState; + +static constexpr int32_t CVAR_BGS_FIX_DEFAULT = 0; +#define CVAR_BGS_FIX_NAME CVAR_ENHANCEMENT("FixBrokenGiantsKnife") +#define CVAR_BGS_FIX_VALUE CVarGetInteger(CVAR_BGS_FIX_NAME, CVAR_BGS_FIX_DEFAULT) + +void OnReceiveBrokenGiantsKnife(GetItemEntry itemEntry) { + if (itemEntry.itemId != ITEM_SWORD_BGS) { + return; + } + + // Flag wasn't reset because Kokiri or Master Sword was missing, so we need to bypass those checks + int32_t bypassEquipmentChecks = (1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER); + + int32_t allSwordsInEquipment = bypassEquipmentChecks | ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD); + int32_t allSwordFlags = (1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER) | + (1 << EQUIP_INV_SWORD_BIGGORON) | (1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE); + + if (allSwordsInEquipment != allSwordFlags) { + return; + } + + gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); + + if (gSaveContext.equips.buttonItems[0] == ITEM_SWORD_KNIFE) { + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; + if (gPlayState != NULL) { + Interface_LoadItemIcon1(gPlayState, 0); + } + } +} + +void RegisterBrokenGiantsKnifeFix() { + // If enhancement is off, flag should be handled exclusively by vanilla behaviour + COND_HOOK(OnItemReceive, CVAR_BGS_FIX_VALUE || IS_RANDO, OnReceiveBrokenGiantsKnife); +} + +static RegisterShipInitFunc initFunc(RegisterBrokenGiantsKnifeFix, { CVAR_BGS_FIX_NAME, "IS_RANDO" }); diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index e6777644e..cd60f7d8c 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -35,7 +35,6 @@ #include "src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h" #include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h" #include "src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h" -#include "src/overlays/actors/ovl_En_Door/z_en_door.h" #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" #include "objects/object_link_boy/object_link_boy.h" #include "objects/object_link_child/object_link_child.h" @@ -47,7 +46,6 @@ extern "C" { #include "align_asset_macro.h" #include "macros.h" #include "soh/cvar_prefixes.h" -#include "functions.h" #include "variables.h" #include "functions.h" #include "src/overlays/actors/ovl_En_Door/z_en_door.h" @@ -552,42 +550,6 @@ void RegisterResetNaviTimer() { }); } -void RegisterBrokenGiantsKnifeFix() { - GameInteractor::Instance->RegisterGameHook([](GetItemEntry itemEntry) { - if (itemEntry.itemId != ITEM_SWORD_BGS) { - return; - } - - int32_t bypassEquipmentChecks = 0; - - if (IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("FixBrokenGiantsKnife"), 0)) { - // Flag wasn't reset because Kokiri or Master Sword was missing, so we need to - // bypass those checks - bypassEquipmentChecks |= (1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER); - } else { - // If enhancement is off, flag should be handled exclusively by vanilla behaviour - return; - } - - int32_t allSwordsInEquipment = bypassEquipmentChecks | ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD); - int32_t allSwordFlags = (1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER) | - (1 << EQUIP_INV_SWORD_BIGGORON) | (1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE); - - if (allSwordsInEquipment != allSwordFlags) { - return; - } - - gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); - - if (gSaveContext.equips.buttonItems[0] == ITEM_SWORD_KNIFE) { - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; - if (gPlayState != NULL) { - Interface_LoadItemIcon1(gPlayState, 0); - } - } - }); -} - //this map is used for enemies that can be uniquely identified by their id //and that are always counted //enemies that can't be uniquely identified by their id @@ -1098,7 +1060,6 @@ void InitMods() { RegisterMenuPathFix(); RegisterMirrorModeHandler(); RegisterResetNaviTimer(); - RegisterBrokenGiantsKnifeFix(); RegisterEnemyDefeatCounts(); RegisterBossDefeatTimestamps(); RegisterRandomizedEnemySizes(); From eb6c0d9d29da4abdfe23ead81d53d7b765aba6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Fri, 28 Feb 2025 03:34:16 +0000 Subject: [PATCH 066/267] presets: clear blocks (#5098) * presets: clear blocks this avoids needing to list every new cvar in presets.h * avoid resetting selected preset * no cvar lists, clear less blocks on drop --- soh/soh/Enhancements/presets.cpp | 11 +- soh/soh/Enhancements/presets.h | 499 +------------------------------ soh/soh/OTRGlobals.cpp | 8 +- 3 files changed, 12 insertions(+), 506 deletions(-) diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp index 4ba4b62be..2b1812d21 100644 --- a/soh/soh/Enhancements/presets.cpp +++ b/soh/soh/Enhancements/presets.cpp @@ -6,12 +6,6 @@ #include "soh/SohGui/UIWidgets.hpp" #include -void clearCvars(std::vector cvarsToClear) { - for(const char* cvar : cvarsToClear) { - CVarClear(cvar); - } -} - std::string FormatLocations(std::vector locs) { std::string locString = ""; for (auto loc: locs) { @@ -69,10 +63,13 @@ void DrawPresetSelector(PresetType presetTypeId) { ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f)); if (ImGui::Button(("Apply Preset##" + presetTypeCvar).c_str())) { - clearCvars(presetTypeDef.cvarsToClear); + for(const char* block : presetTypeDef.blocksToClear) { + CVarClearBlock(block); + } if (selectedPresetId != 0) { applyPreset(selectedPresetDef.entries); } + CVarSetInteger(presetTypeCvar.c_str(), selectedPresetId); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); if (presetTypeId == PRESET_TYPE_RANDOMIZER){ Rando::Settings::GetInstance()->ReloadOptions(); diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 329fbcdc8..2922ec589 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -61,499 +61,6 @@ void applyPreset(std::vector entries); // TODO: Ideally everything below this point will come from one/many JSON files -const std::vector enhancementsCvars = { - CVAR_SETTING("DPadOnPause"), - CVAR_SETTING("DpadInText"), - CVAR_SETTING("OcarinaControl.Dpad"), - CVAR_SETTING("OcarinaControl.RStick"), - CVAR_ENHANCEMENT("DpadEquips"), - CVAR_ENHANCEMENT("PauseAnyCursor"), - CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), - CVAR_ENHANCEMENT("NaviOnL"), - CVAR_SETTING("FreeLook.InvertXAxis"), - CVAR_SETTING("FreeLook.InvertYAxis"), - CVAR_SETTING("Controls.RightStickAim"), - CVAR_SETTING("DisableFirstPersonAutoCenterView"), - CVAR_ENHANCEMENT("TextSpeed"), - CVAR_ENHANCEMENT("MweepSpeed"), - CVAR_ENHANCEMENT("ForgeTime"), - CVAR_ENHANCEMENT("ClimbSpeed"), - CVAR_ENHANCEMENT("FasterBlockPush"), - CVAR_ENHANCEMENT("CrawlSpeed"), - CVAR_ENHANCEMENT("FasterHeavyBlockLift"), - CVAR_ENHANCEMENT("NoForcedNavi"), - CVAR_ENHANCEMENT("SkulltulaFreeze"), - CVAR_ENHANCEMENT("MMBunnyHood"), - CVAR_ENHANCEMENT("AdultMasks"), - CVAR_ENHANCEMENT("FastChests"), - CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), - CVAR_ENHANCEMENT("FastDrops"), - CVAR_ENHANCEMENT("BetterOwl"), - CVAR_ENHANCEMENT("FastOcarinaPlayback"), - CVAR_ENHANCEMENT("InstantPutaway"), - CVAR_ENHANCEMENT("FastBoomerang"), - CVAR_ENHANCEMENT("AskToEquip"), - CVAR_ENHANCEMENT("MaskSelect"), - CVAR_ENHANCEMENT("RememberSaveLocation"), - CVAR_ENHANCEMENT("DamageMult"), - CVAR_ENHANCEMENT("FallDamageMult"), - CVAR_ENHANCEMENT("VoidDamageMult"), - CVAR_ENHANCEMENT("BonkDamageMult"), - CVAR_ENHANCEMENT("NoRandomDrops"), - CVAR_ENHANCEMENT("NoHeartDrops"), - CVAR_ENHANCEMENT("EnableBombchuDrops"), - CVAR_ENHANCEMENT("GoronPot"), - CVAR_ENHANCEMENT("FullHealthSpawn"), - CVAR_ENHANCEMENT("DampeWin"), - CVAR_ENHANCEMENT("CustomizeFishing"), - CVAR_ENHANCEMENT("InstantFishing"), - CVAR_ENHANCEMENT("GuaranteeFishingBite"), - CVAR_ENHANCEMENT("FishNeverEscape"), - CVAR_ENHANCEMENT("MinimumFishWeightChild"), - CVAR_ENHANCEMENT("MinimumFishWeightAdult"), - CVAR_ENHANCEMENT("LowHpAlarm"), - CVAR_ENHANCEMENT("MinimalUI"), - CVAR_ENHANCEMENT("DisableNaviCallAudio"), - CVAR_ENHANCEMENT("VisualAgony"), - CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), - CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), - CVAR_ENHANCEMENT("CowOfTime"), - CVAR_ENHANCEMENT("GuardVision"), - CVAR_ENHANCEMENT("TimeFlowFileSelect"), - CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), - CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), - CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), - CVAR_ENHANCEMENT("DayGravePull"), - CVAR_ENHANCEMENT("DampeAllNight"), - CVAR_ENHANCEMENT("QuitFishingAtDoor"), - CVAR_ENHANCEMENT("SkipSwimDeepEndAnim"), - CVAR_ENHANCEMENT("InstantScarecrow"), - CVAR_ENHANCEMENT("BlueFireArrows"), - CVAR_ENHANCEMENT("SunlightArrows"), - CVAR_ENHANCEMENT("MinFrameCount"), - CVAR_ENHANCEMENT("NewDrops"), - CVAR_ENHANCEMENT("DisableBlackBars"), - CVAR_ENHANCEMENT("DynamicWalletIcon"), - CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), - CVAR_ENHANCEMENT("FixMenuLR"), - CVAR_ENHANCEMENT("NGCKaleidoSwitcher"), - CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), - CVAR_ENHANCEMENT("TwoHandedIdle"), - CVAR_ENHANCEMENT("GravediggingTourFix"), - CVAR_ENHANCEMENT("DekuNutUpgradeFix"), - CVAR_ENHANCEMENT("NaviTextFix"), - CVAR_ENHANCEMENT("AnubisFix"), - CVAR_ENHANCEMENT("CrouchStabHammerFix"), - CVAR_ENHANCEMENT("CrouchStabFix"), - CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), - CVAR_ENHANCEMENT("FixCameraDrift"), - CVAR_ENHANCEMENT("FixCameraSwing"), - CVAR_ENHANCEMENT("FixHangingLedgeSwingRate"), - CVAR_ENHANCEMENT("RedGanonBlood"), - CVAR_ENHANCEMENT("HoverFishing"), - CVAR_ENHANCEMENT("N64WeirdFrames"), - CVAR_ENHANCEMENT("BombchusOOB"), - CVAR_ENHANCEMENT("QuickPutaway"), - CVAR_ENHANCEMENT("GSCutscene"), - CVAR_ENHANCEMENT("RestoreRBAValues"), - CVAR_ENHANCEMENT("SkipSaveConfirmation"), - CVAR_ENHANCEMENT("DisableCritWiggle"), - CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), - CVAR_ENHANCEMENT("SkipArrowAnimation"), - CVAR_ENHANCEMENT("SeparateArrows"), - CVAR_ENHANCEMENT("CustomizeShootingGallery"), - CVAR_ENHANCEMENT("InstantShootingGalleryWin"), - CVAR_ENHANCEMENT("ConstantAdultGallery"), - CVAR_ENHANCEMENT("ShootingGalleryAmmoChild"), - CVAR_ENHANCEMENT("ShootingGalleryAmmoAdult"), - CVAR_ENHANCEMENT("CustomizeBombchuBowling"), - CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco"), - CVAR_ENHANCEMENT("BombchuBowlingNoBigCucco"), - CVAR_ENHANCEMENT("BombchuBowlingAmmo"), - CVAR_ENHANCEMENT("CustomizeOcarinaGame"), - CVAR_ENHANCEMENT("InstantOcarinaGameWin"), - CVAR_ENHANCEMENT("OcarinaGame.NoteSpeed"), - CVAR_ENHANCEMENT("OcarinaUnlimitedFailTime"), - CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), - CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes"), - CVAR_ENHANCEMENT("OcarinaGame.RoundTwoNotes"), - CVAR_ENHANCEMENT("OcarinaGame.RoundThreeNotes"), - CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), - CVAR_ENHANCEMENT("InstantFrogsGameWin"), - CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), - CVAR_ENHANCEMENT("FrogsModifyFailTime"), - CVAR_ENHANCEMENT("CreditsFix"), - CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), - CVAR_ENHANCEMENT("StaticExplosionRadius"), - CVAR_ENHANCEMENT("NoInputForCredits"), - CVAR_ENHANCEMENT("FastFarores"), - CVAR_ENHANCEMENT("NightGSAlwaysSpawn"), - CVAR_ENHANCEMENT("SkipText"), - CVAR_ENHANCEMENT("LinkDefaultName"), - CVAR_ENHANCEMENT("MarketSneak"), - CVAR_ENHANCEMENT("TimeTravel"), - CVAR_ENHANCEMENT("NutsExplodeBombs"), - CVAR_ENHANCEMENT("BowSlingshotAmmoFix"), - CVAR_ENHANCEMENT("BetterFarore"), - CVAR_ENHANCEMENT("DisableFirstPersonChus"), - CVAR_ENHANCEMENT("BetterBombchuShopping"), - CVAR_ENHANCEMENT("HyperBosses"), - CVAR_ENHANCEMENT("RupeeDash"), - CVAR_ENHANCEMENT("RupeeDashInterval"), - CVAR_ENHANCEMENT("DogFollowsEverywhere"), - CVAR_ENHANCEMENT("DisableTunicWarningText"), - CVAR_ENHANCEMENT("DisableLOD"), - CVAR_ENHANCEMENT("DisableDrawDistance"), - CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), - CVAR_ENHANCEMENT("WidescreenActorCulling"), - CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors"), - CVAR_LOW_RES_MODE, - CVAR_ENHANCEMENT("DrawLineupTick"), - CVAR_ENHANCEMENT("QuickBongoKill"), - CVAR_ENHANCEMENT("FirstPersonGauntlets"), - CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), - CVAR_Z_FIGHTING_MODE, - CVAR_ENHANCEMENT("AuthenticLogo"), - CVAR_ENHANCEMENT("BowReticle"), - CVAR_ENHANCEMENT("BoomerangFirstPerson"), - CVAR_ENHANCEMENT("BoomerangReticle"), - CVAR_ENHANCEMENT("FixTexturesOOB"), - CVAR_ENHANCEMENT("IvanCoopModeEnabled"), - CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), - CVAR_ENHANCEMENT("TreesDropSticks"), - CVAR_ENHANCEMENT("ShadowTag"), - CVAR_ENHANCEMENT("RandomizedEnemySizes"), - CVAR_ENHANCEMENT("RandomizedEnemies"), - CVAR_ENHANCEMENT("MirroredWorldMode"), - CVAR_ENHANCEMENT("MirroredWorld"), - CVAR_ENHANCEMENT("HyperEnemies"), - CVAR_ENHANCEMENT("HookshotableReticle"), - CVAR_ENHANCEMENT("HideBunnyHood"), - CVAR_ENHANCEMENT("FixVineFall"), - CVAR_ENHANCEMENT("FileSelectMoreInfo"), - CVAR_ENHANCEMENT("EnemyHealthBar"), - CVAR_ENHANCEMENT("BushDropFix"), - CVAR_ENHANCEMENT("AllDogsRichard"), - CVAR_ENHANCEMENT("ExtraTraps.Enabled"), - CVAR_ENHANCEMENT("ExtraTraps.Ammo"), - CVAR_ENHANCEMENT("ExtraTraps.Bomb"), - CVAR_ENHANCEMENT("ExtraTraps.Burn"), - CVAR_ENHANCEMENT("ExtraTraps.Ice"), - CVAR_ENHANCEMENT("ExtraTraps.Kill"), - CVAR_ENHANCEMENT("ExtraTraps.Knockback"), - CVAR_ENHANCEMENT("ExtraTraps.Shock"), - CVAR_ENHANCEMENT("ExtraTraps.Speed"), - CVAR_ENHANCEMENT("ExtraTraps.Teleport"), - CVAR_ENHANCEMENT("ExtraTraps.Void"), - CVAR_ENHANCEMENT("ToTMedallionsColors"), - CVAR_ENHANCEMENT("CuccoStayDurationMult"), - CVAR_ENHANCEMENT("DeleteFileOnDeath"), - CVAR_ENHANCEMENT("EnemySizeScalesHealth"), - CVAR_ENHANCEMENT("BetterAmmoRendering"), - CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), - CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), - CVAR_ENHANCEMENT("OpenAllHours"), - CVAR_ENHANCEMENT("ResetNaviTimer"), - CVAR_ENHANCEMENT("ScaleAdultEquipmentAsChild"), - CVAR_ENHANCEMENT("LeeverSpawnRate"), - CVAR_ENHANCEMENT("SwordToggle"), - CVAR_ENHANCEMENT("FixFloorSwitches"), - CVAR_ENHANCEMENT("FixZoraHintDialogue"), - CVAR_ENHANCEMENT("HurtContainer"), - CVAR_ENHANCEMENT("PauseWarp"), - CVAR_ENHANCEMENT("PermanentHeartLoss"), - CVAR_ENHANCEMENT("RemoveExplosiveLimit"), - CVAR_ENHANCEMENT("ToggleStrength"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding"), - CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), - CVAR_ENHANCEMENT("TimeSavers.NoForcedDialog"), - CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), - CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), - CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), - CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), - CVAR_ENHANCEMENT("TimeSavers.SkipChildStealth"), - CVAR_ENHANCEMENT("TimeSavers.SkipTowerEscape"), - CVAR_ENHANCEMENT("TimeSavers.SkipForcedDialog"), - CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), - CVAR_ENHANCEMENT("SlowTextSpeed"), -}; - -const std::vector cheatCvars = { - CVAR_CONSOLE_WINDOW_OPEN, - CVAR_WINDOW("ActorViewer"), - CVAR_WINDOW("CollisionViewer"), - CVAR_WINDOW("DLViewer"), - CVAR_WINDOW("SaveEditor"), - CVAR_SETTING("WalkModifier.Enabled"), - CVAR_SETTING("WalkModifier.SpeedToggle"), - CVAR_SETTING("WalkModifier.Mapping1"), - CVAR_SETTING("WalkModifier.Mapping2"), - CVAR_SETTING("WalkModifier.SwimMapping1"), - CVAR_SETTING("WalkModifier.SwimMapping2"), - CVAR_ENHANCEMENT("GoronPot"), - CVAR_ENHANCEMENT("DampeWin"), - CVAR_ENHANCEMENT("CustomizeShootingGallery"), - CVAR_ENHANCEMENT("CustomizeBombchuBowling"), - CVAR_ENHANCEMENT("CustomizeFishing"), - CVAR_CHEAT("InfiniteAmmo"), - CVAR_CHEAT("InfiniteEponaBoost"), - CVAR_CHEAT("InfiniteHealth"), - CVAR_CHEAT("InfiniteMagic"), - CVAR_CHEAT("InfiniteMoney"), - CVAR_CHEAT("InfiniteNayru"), - CVAR_CHEAT("NoClip"), - CVAR_CHEAT("ClimbEverything"), - CVAR_CHEAT("HookshotEverything"), - CVAR_CHEAT("HookshotReachMultiplier"), - CVAR_CHEAT("MoonJumpOnL"), - CVAR_CHEAT("SuperTunic"), - CVAR_CHEAT("EasyISG"), - CVAR_CHEAT("EasyQPA"), - CVAR_CHEAT("TimelessEquipment"), - CVAR_CHEAT("NoRestrictItems"), - CVAR_CHEAT("FreezeTime"), - CVAR_GENERAL("PrevTime"), - CVAR_CHEAT("DropsDontDie"), - CVAR_CHEAT("FireproofDekuShield"), - CVAR_CHEAT("ShieldTwoHanded"), - CVAR_CHEAT("TimeSync"), - CVAR_DEVELOPER_TOOLS("DebugEnabled"), - CVAR_DEVELOPER_TOOLS("SkulltulaDebugEnabled"), - CVAR_DEVELOPER_TOOLS("SkipLogoTitle"), - CVAR_DEVELOPER_TOOLS("SaveFileID"), - CVAR_CHEAT("EnableBetaQuest"), - CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen"), - CVAR_CHEAT("NoRedeadFreeze"), - CVAR_CHEAT("NoKeeseGuayTarget"), - CVAR_CHEAT("BombTimerMultiplier"), - CVAR_CHEAT("NoFishDespawn"), - CVAR_CHEAT("NoBugsDespawn"), - CVAR_SETTING("WalkModifier.DoesntChangeJump"), - CVAR_STATS_WINDOW_OPEN, - CVAR_CHEAT("SaveStatesEnabled"), - CVAR_CHEAT("SaveStatePromise"), - CVAR_DEVELOPER_TOOLS("RegEditEnabled"), - CVAR_CHEAT("DekuStick"), - CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), - CVAR_DEVELOPER_TOOLS("DebugSaveFileMode"), - CVAR_COSMETIC("Link.BodyScale.Changed"), - CVAR_COSMETIC("Link.BodyScale.Value"), - CVAR_COSMETIC("Link.HeadScale.Changed"), - CVAR_COSMETIC("Link.HeadScale.Value"), - CVAR_COSMETIC("Link.SwordScale.Changed"), - CVAR_COSMETIC("Link.SwordScale.Value"), - CVAR_ENHANCEMENT("RememberMapToggleState"), -}; - -const std::vector randomizerCvars = { - CVAR_RANDOMIZER_ENHANCEMENT("MatchKeyColors"), - CVAR_RANDOMIZER_ENHANCEMENT("QuestItemFanfares"), - CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), - CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), - CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), - CVAR_RANDOMIZER_SETTING("100GSHint"), - CVAR_RANDOMIZER_SETTING("10GSHint"), - CVAR_RANDOMIZER_SETTING("20GSHint"), - CVAR_RANDOMIZER_SETTING("30GSHint"), - CVAR_RANDOMIZER_SETTING("40GSHint"), - CVAR_RANDOMIZER_SETTING("50GSHint"), - CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), - CVAR_RANDOMIZER_SETTING("AltarHint"), - CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), - CVAR_RANDOMIZER_SETTING("BigPoesHint"), - CVAR_RANDOMIZER_SETTING("BiggoronHint"), - CVAR_RANDOMIZER_SETTING("BlueFireArrows"), - CVAR_RANDOMIZER_SETTING("BombchuBag"), - CVAR_RANDOMIZER_SETTING("BossKeysanity"), - CVAR_RANDOMIZER_SETTING("BridgeRewardOptions"), - CVAR_RANDOMIZER_SETTING("ChickensHint"), - CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), - CVAR_RANDOMIZER_SETTING("CuccosToReturn"), - CVAR_RANDOMIZER_SETTING("DampeHint"), - CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), - CVAR_RANDOMIZER_SETTING("DoorOfTime"), - CVAR_RANDOMIZER_SETTING("DungeonCount"), - CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), - CVAR_RANDOMIZER_SETTING("FishingPoleHint"), - CVAR_RANDOMIZER_SETTING("Fishsanity"), - CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), - CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), - CVAR_RANDOMIZER_SETTING("ClosedForest"), - CVAR_RANDOMIZER_SETTING("FrogsHint"), - CVAR_RANDOMIZER_SETTING("FullWallets"), - CVAR_RANDOMIZER_SETTING("GanonTrial"), - CVAR_RANDOMIZER_SETTING("GanonTrialCount"), - CVAR_RANDOMIZER_SETTING("GanondorfHint"), - CVAR_RANDOMIZER_SETTING("FortressCarpenters"), - CVAR_RANDOMIZER_SETTING("GerudoKeys"), - CVAR_RANDOMIZER_SETTING("GossipStoneHints"), - CVAR_RANDOMIZER_SETTING("GregHint"), - CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), - CVAR_RANDOMIZER_SETTING("HBAHint"), - CVAR_RANDOMIZER_SETTING("HintClarity"), - CVAR_RANDOMIZER_SETTING("HintDistribution"), - CVAR_RANDOMIZER_SETTING("IceTraps"), - CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), - CVAR_RANDOMIZER_SETTING("InfiniteUpgrades"), - CVAR_RANDOMIZER_SETTING("ItemPool"), - CVAR_RANDOMIZER_SETTING("KakarikoGate"), - CVAR_RANDOMIZER_SETTING("Keysanity"), - CVAR_RANDOMIZER_SETTING("LacsDungeonCount"), - CVAR_RANDOMIZER_SETTING("LacsMedallionCount"), - CVAR_RANDOMIZER_SETTING("LacsRewardCount"), - CVAR_RANDOMIZER_SETTING("LacsRewardOptions"), - CVAR_RANDOMIZER_SETTING("LacsStoneCount"), - CVAR_RANDOMIZER_SETTING("LacsTokenCount"), - CVAR_RANDOMIZER_SETTING("LinksPocket"), - CVAR_RANDOMIZER_SETTING("LoachHint"), - CVAR_RANDOMIZER_SETTING("LogicRules"), - CVAR_RANDOMIZER_SETTING("MQDungeonCount"), - CVAR_RANDOMIZER_SETTING("MQDungeons"), - CVAR_RANDOMIZER_SETTING("MQDungeonsBottomOfTheWell"), - CVAR_RANDOMIZER_SETTING("MQDungeonsDekuTree"), - CVAR_RANDOMIZER_SETTING("MQDungeonsDodongosCavern"), - CVAR_RANDOMIZER_SETTING("MQDungeonsFireTemple"), - CVAR_RANDOMIZER_SETTING("MQDungeonsForestTemple"), - CVAR_RANDOMIZER_SETTING("MQDungeonsGTG"), - CVAR_RANDOMIZER_SETTING("MQDungeonsGanonsCastle"), - CVAR_RANDOMIZER_SETTING("MQDungeonsIceCavern"), - CVAR_RANDOMIZER_SETTING("MQDungeonsJabuJabu"), - CVAR_RANDOMIZER_SETTING("MQDungeonsSelection"), - CVAR_RANDOMIZER_SETTING("MQDungeonsShadowTemple"), - CVAR_RANDOMIZER_SETTING("MQDungeonsSpiritTemple"), - CVAR_RANDOMIZER_SETTING("MQDungeonsWaterTemple"), - CVAR_RANDOMIZER_SETTING("MalonHint"), - CVAR_RANDOMIZER_SETTING("MaskShopHint"), - CVAR_RANDOMIZER_SETTING("MedallionCount"), - CVAR_RANDOMIZER_SETTING("MerchantAdultWalletWeight"), - CVAR_RANDOMIZER_SETTING("MerchantChildWalletWeight"), - CVAR_RANDOMIZER_SETTING("MerchantFixedPrice"), - CVAR_RANDOMIZER_SETTING("MerchantGiantWalletWeight"), - CVAR_RANDOMIZER_SETTING("MerchantNoWalletWeight"), - CVAR_RANDOMIZER_SETTING("MerchantPriceRange1"), - CVAR_RANDOMIZER_SETTING("MerchantPriceRange2"), - CVAR_RANDOMIZER_SETTING("MerchantPrices"), - CVAR_RANDOMIZER_SETTING("MerchantPricesAffordable"), - CVAR_RANDOMIZER_SETTING("MerchantText"), - CVAR_RANDOMIZER_SETTING("MerchantTycoonWalletWeight"), - CVAR_RANDOMIZER_SETTING("MixBosses"), - CVAR_RANDOMIZER_SETTING("MixDungeons"), - CVAR_RANDOMIZER_SETTING("MixGrottos"), - CVAR_RANDOMIZER_SETTING("MixInteriors"), - CVAR_RANDOMIZER_SETTING("MixOverworld"), - CVAR_RANDOMIZER_SETTING("MixedEntrances"), - CVAR_RANDOMIZER_SETTING("OoTHint"), - CVAR_RANDOMIZER_SETTING("RainbowBridge"), - CVAR_RANDOMIZER_SETTING("RewardCount"), - CVAR_RANDOMIZER_SETTING("SariaHint"), - CVAR_RANDOMIZER_SETTING("ScrubText"), - CVAR_RANDOMIZER_SETTING("ScrubsAdultWalletWeight"), - CVAR_RANDOMIZER_SETTING("ScrubsChildWalletWeight"), - CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), - CVAR_RANDOMIZER_SETTING("ScrubsGiantWalletWeight"), - CVAR_RANDOMIZER_SETTING("ScrubsNoWalletWeight"), - CVAR_RANDOMIZER_SETTING("ScrubsPriceRange1"), - CVAR_RANDOMIZER_SETTING("ScrubsPriceRange2"), - CVAR_RANDOMIZER_SETTING("ScrubsPrices"), - CVAR_RANDOMIZER_SETTING("ScrubsPricesAffordable"), - CVAR_RANDOMIZER_SETTING("ScrubsTycoonWalletWeight"), - CVAR_RANDOMIZER_SETTING("SheikLAHint"), - CVAR_RANDOMIZER_SETTING("Shopsanity"), - CVAR_RANDOMIZER_SETTING("ShopsanityAdultWalletWeight"), - CVAR_RANDOMIZER_SETTING("ShopsanityChildWalletWeight"), - CVAR_RANDOMIZER_SETTING("ShopsanityCount"), - CVAR_RANDOMIZER_SETTING("ShopsanityFixedPrice"), - CVAR_RANDOMIZER_SETTING("ShopsanityGiantWalletWeight"), - CVAR_RANDOMIZER_SETTING("ShopsanityNoWalletWeight"), - CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange1"), - CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange2"), - CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), - CVAR_RANDOMIZER_SETTING("ShopsanityPricesAffordable"), - CVAR_RANDOMIZER_SETTING("ShopsanityTycoonWalletWeight"), - CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), - CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), - CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), - CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), - CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), - CVAR_RANDOMIZER_SETTING("ShuffleChildWallet"), - CVAR_RANDOMIZER_SETTING("ShuffleCows"), - CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), - CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), - CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), - CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), - CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), - CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), - CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), - CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), - CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), - CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsFireTemple"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsForestTemple"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGerudoFortress"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsRandomCount"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsShadowTemple"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsSpiritTemple"), - CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsWaterTemple"), - CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), - CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), - CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), - CVAR_RANDOMIZER_SETTING("ShuffleOcarinaButtons"), - CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), - CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), - CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), - CVAR_RANDOMIZER_SETTING("ShuffleOwlDrops"), - CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), - CVAR_RANDOMIZER_SETTING("ShuffleSongs"), - CVAR_RANDOMIZER_SETTING("ShuffleSwim"), - CVAR_RANDOMIZER_SETTING("ShuffleTokens"), - CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), - CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), - CVAR_RANDOMIZER_SETTING("SkeletonKey"), - CVAR_RANDOMIZER_SETTING("SkipChildStealth"), - CVAR_RANDOMIZER_SETTING("SkipChildZelda"), - CVAR_RANDOMIZER_SETTING("SkipEponaRace"), - CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), - CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), - CVAR_RANDOMIZER_SETTING("StartingAge"), - CVAR_RANDOMIZER_SETTING("StartingBoleroOfFire"), - CVAR_RANDOMIZER_SETTING("StartingConsumables"), - CVAR_RANDOMIZER_SETTING("StartingDekuShield"), - CVAR_RANDOMIZER_SETTING("StartingEponasSong"), - CVAR_RANDOMIZER_SETTING("StartingHearts"), - CVAR_RANDOMIZER_SETTING("StartingKokiriSword"), - CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), - CVAR_RANDOMIZER_SETTING("StartingMasterSword"), - CVAR_RANDOMIZER_SETTING("StartingMinuetOfForest"), - CVAR_RANDOMIZER_SETTING("StartingNocturneOfShadow"), - CVAR_RANDOMIZER_SETTING("StartingOcarina"), - CVAR_RANDOMIZER_SETTING("StartingPreludeOfLight"), - CVAR_RANDOMIZER_SETTING("StartingRequiemOfSpirit"), - CVAR_RANDOMIZER_SETTING("StartingSariasSong"), - CVAR_RANDOMIZER_SETTING("StartingSerenadeOfWater"), - CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), - CVAR_RANDOMIZER_SETTING("StartingSongOfStorms"), - CVAR_RANDOMIZER_SETTING("StartingSongOfTime"), - CVAR_RANDOMIZER_SETTING("StartingSunsSong"), - CVAR_RANDOMIZER_SETTING("StartingZeldasLullaby"), - CVAR_RANDOMIZER_SETTING("StoneCount"), - CVAR_RANDOMIZER_SETTING("SunlightArrows"), - CVAR_RANDOMIZER_SETTING("TokenCount"), - CVAR_RANDOMIZER_SETTING("TriforceHunt"), - CVAR_RANDOMIZER_SETTING("TriforceHuntRequiredPieces"), - CVAR_RANDOMIZER_SETTING("TriforceHuntTotalPieces"), - CVAR_RANDOMIZER_SETTING("WarpSongText"), - CVAR_RANDOMIZER_SETTING("ZorasFountain"), -}; - const std::vector vanillaPlusPresetEntries = { // D-pad Support in text and file select PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), @@ -1325,12 +832,12 @@ typedef struct PresetDefinition { } PresetDefinition; typedef struct PresetTypeDefinition { - std::vector cvarsToClear; + std::vector blocksToClear; std::map presets; } PresetTypeDefinition; const std::map presetTypes = { - { PRESET_TYPE_ENHANCEMENTS, { enhancementsCvars, { + { PRESET_TYPE_ENHANCEMENTS, { { CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_CHEAT }, { { ENHANCEMENT_PRESET_DEFAULT, { "Default", "Reset all options to their default values.", @@ -1352,7 +859,7 @@ const std::map presetTypes = { randomizerPresetEntries } }, } } }, - { PRESET_TYPE_RANDOMIZER, { randomizerCvars, { + { PRESET_TYPE_RANDOMIZER, { { CVAR_PREFIX_RANDOMIZER_SETTING, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT }, { { RANDOMIZER_PRESET_DEFAULT, { "Default", "Reset all options to their default values.", diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index dc745b0b5..2acc01d7f 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2437,9 +2437,11 @@ void SoH_ProcessDroppedFiles(std::string filePath) { return; } - clearCvars(enhancementsCvars); - clearCvars(cheatCvars); - clearCvars(randomizerCvars); + CVarClearBlock(CVAR_PREFIX_ENHANCEMENT); + CVarClearBlock(CVAR_PREFIX_CHEAT); + CVarClearBlock(CVAR_PREFIX_RANDOMIZER_SETTING); + CVarClearBlock(CVAR_PREFIX_RANDOMIZER_ENHANCEMENT); + CVarClearBlock(CVAR_PREFIX_DEVELOPER_TOOLS); // Flatten everything under CVars into a single array auto cvars = configJson["CVars"].flatten(); From 39e52aa8e6695610cac9e986095f882971d46de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 6 Mar 2025 23:59:02 +0000 Subject: [PATCH 067/267] Fix Gerudo Valley entrance logic (#5094) * Fix Gerudo Valley entrance logic Logic assumed cucco could be used as child to get around lacking bronze scale, but this assumption fails if you enter grotto ledge from grotto or initial spawn * fix lower/upper mixup * fix: you can walk to lake hylia * adult can jump across --- .../randomizer/location_access/overworld/gerudo_valley.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 1c4714e52..a0441dbec 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -13,10 +13,11 @@ void RegionTable_Init_GerudoValley() { }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), - Entrance(RR_GV_UPPER_STREAM, []{return true;}), + Entrance(RR_GV_UPPER_STREAM, []{return logic->IsChild || logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->IsChild || logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CarpenterRescue)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), + Entrance(RR_LAKE_HYLIA, []{return logic->IsChild;}), //can use cucco as child }); areaTable[RR_GV_UPPER_STREAM] = Region("GV Upper Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { @@ -41,11 +42,12 @@ void RegionTable_Init_GerudoValley() { areaTable[RR_GV_LOWER_STREAM] = Region("GV Lower Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(RR_LAKE_HYLIA, []{return logic->IsChild || logic->HasItem(RG_BRONZE_SCALE);}),//can use cucco as child + Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), }); areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { //Exits + Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), Entrance(RR_GV_LOWER_STREAM, []{return true;}), Entrance(RR_GV_OCTOROK_GROTTO, []{return logic->CanUse(RG_SILVER_GAUNTLETS);}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), From 6dedf8a2773d7d5d67fd937df83e90d93ac393b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 12 Mar 2025 17:32:03 +0000 Subject: [PATCH 068/267] Gerudo Valley: fix regression with previous fix when combined with overworld shuffle (#5109) Missed this in #5094 since only in last week I started becoming familiar with entrance shuffle logic --- .../location_access/overworld/gerudo_valley.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index a0441dbec..189d96521 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -17,7 +17,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_CRATE_LEDGE, []{return logic->IsChild || logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CarpenterRescue)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), - Entrance(RR_LAKE_HYLIA, []{return logic->IsChild;}), //can use cucco as child + Entrance(RR_GV_LOWER_STREAM, []{return logic->IsChild;}), //can use cucco as child }); areaTable[RR_GV_UPPER_STREAM] = Region("GV Upper Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { @@ -37,18 +37,19 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_GOSSIP_STONE, true), }, { //Exits - Entrance(RR_GV_LOWER_STREAM, []{return true;}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), }); + // scale/boots logic is outside lower stream, as lower stream combines access to lake hylia for entrance randomizer's sake areaTable[RR_GV_LOWER_STREAM] = Region("GV Lower Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_LAKE_HYLIA, []{return true;}), }); areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), - Entrance(RR_GV_LOWER_STREAM, []{return true;}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), Entrance(RR_GV_OCTOROK_GROTTO, []{return logic->CanUse(RG_SILVER_GAUNTLETS);}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), }); @@ -59,7 +60,7 @@ void RegionTable_Init_GerudoValley() { }, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), - Entrance(RR_GV_LOWER_STREAM, []{return true;}), + Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), }); areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { From 9b9a0061ab73aa2fb7d8d5fc66d36c415f1f764f Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 12 Mar 2025 10:32:17 -0700 Subject: [PATCH 069/267] Unify spoiler name creation across all shuffle types, and remove all versions of constructor functions with explicit spoilerName parameters except base. (#5111) --- .../randomizer/ShuffleFairies.cpp | 426 +++---- .../Enhancements/randomizer/ShufflePots.cpp | 1082 ++++++++--------- soh/soh/Enhancements/randomizer/location.cpp | 17 +- soh/soh/Enhancements/randomizer/location.h | 4 +- .../Enhancements/randomizer/location_list.cpp | 14 +- 5 files changed, 771 insertions(+), 772 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index d771c58f3..441591aa0 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -185,225 +185,225 @@ void ShuffleFairies_UnregisterHooks() { } void Rando::StaticData::RegisterFairyLocations() { - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", "SFM Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", "SFM Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", "SFM Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, "Grotto Fairy 4", "SFM Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, "Grotto Fairy 5", "SFM Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, "Grotto Fairy 6", "SFM Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, "Grotto Fairy 7", "SFM Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, "Grotto Fairy 8", "SFM Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, "Grotto Fairy 1", "ZR Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, "Grotto Fairy 2", "ZR Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, "Grotto Fairy 3", "ZR Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, "Grotto Fairy 4", "ZR Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, "Grotto Fairy 5", "ZR Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, "Grotto Fairy 6", "ZR Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, "Grotto Fairy 7", "ZR Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, "Grotto Fairy 8", "ZR Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, "Grotto Fairy 1", "HF Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, "Grotto Fairy 2", "HF Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, "Grotto Fairy 3", "HF Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, "Grotto Fairy 4", "HF Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, "Grotto Fairy 5", "HF Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, "Grotto Fairy 6", "HF Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, "Grotto Fairy 7", "HF Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, "Grotto Fairy 8", "HF Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, "Grotto Fairy 1", "ZD Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, "Grotto Fairy 2", "ZD Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, "Grotto Fairy 3", "ZD Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, "Grotto Fairy 4", "ZD Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, "Grotto Fairy 5", "ZD Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, "Grotto Fairy 6", "ZD Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, "Grotto Fairy 7", "ZD Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, "Grotto Fairy 8", "ZD Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, "Grotto Fairy 1", "GF Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, "Grotto Fairy 2", "GF Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, "Grotto Fairy 3", "GF Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, "Grotto Fairy 4", "GF Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, "Grotto Fairy 5", "GF Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, "Grotto Fairy 6", "GF Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, "Grotto Fairy 7", "GF Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7)); - locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, "Grotto Fairy 8", "GF Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, "Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, "Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, "Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, "Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, "Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, "Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, "Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, "Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, "Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, "Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, "Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, "Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, "Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, "Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, "Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, "Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, "Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, "Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, "Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, "Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, "Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, "Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, "Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, "Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, "Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, "Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, "Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, "Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, "Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, "Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, "Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, "Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, "Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, "Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, "Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, "Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7)); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, "Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, "Shield Grave Fairy 1", "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, "Shield Grave Fairy 2", "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, "Shield Grave Fairy 3", "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, "Shield Grave Fairy 4", "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, "Shield Grave Fairy 5", "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, "Shield Grave Fairy 6", "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, "Shield Grave Fairy 7", "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7)); - locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, "Shield Grave Fairy 8", "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "Scrubs Fairy 1", "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "Scrubs Fairy 2", "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "Scrubs Fairy 3", "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "Scrubs Fairy 4", "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "Scrubs Fairy 5", "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "Scrubs Fairy 6", "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "Scrubs Fairy 7", "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7)); - locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "Scrubs Fairy 8", "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "MQ Scrubs Fairy 1", "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "MQ Scrubs Fairy 2", "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "MQ Scrubs Fairy 3", "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "MQ Scrubs Fairy 4", "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "MQ Scrubs Fairy 5", "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "MQ Scrubs Fairy 6", "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "MQ Scrubs Fairy 7", "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7)); - locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "MQ Scrubs Fairy 8", "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, "Oasis Fairy 1", "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_1)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, "Oasis Fairy 2", "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_2)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, "Oasis Fairy 3", "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_3)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, "Oasis Fairy 4", "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_4)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, "Oasis Fairy 5", "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_5)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, "Oasis Fairy 6", "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_6)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, "Oasis Fairy 7", "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_7)); - locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, "Oasis Fairy 8", "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_8)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7)); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7)); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7)); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_1)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_2)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_3)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_4)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_5)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_6)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_7)); + locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_OASIS_FAIRY_8)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, "Bean Sprout Fairy 1", "ZR Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, "Bean Sprout Fairy 2", "ZR Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, "Bean Sprout Fairy 3", "ZR Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, "Bean Sprout Fairy 1", "KF Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, "Bean Sprout Fairy 2", "KF Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, "Bean Sprout Fairy 3", "KF Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, "Bean Sprout Near Bridge Fairy 1", "LW Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, "Bean Sprout Near Bridge Fairy 2", "LW Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, "Bean Sprout Near Bridge Fairy 3", "LW Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, "Bean Sprout Near Theatre Fairy 1", "LW Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, "Bean Sprout Near Theatre Fairy 2", "LW Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2)); - locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, "Bean Sprout Near Theatre Fairy 3", "LW Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, "Bean Sprout Fairy 1", "LH Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, "Bean Sprout Fairy 2", "LH Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, "Bean Sprout Fairy 3", "LH Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, "Bean Sprout Fairy 1", "GV Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, "Bean Sprout Fairy 2", "GV Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, "Bean Sprout Fairy 3", "GV Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, "Bean Sprout Fairy 1", "Col Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, "Bean Sprout Fairy 2", "Col Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, "Bean Sprout Fairy 3", "Col Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, "Bean Sprout Fairy 1", "GY Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, "Bean Sprout Fairy 2", "GY Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, "Bean Sprout Fairy 3", "GY Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, "Bean Sprout Fairy 1", "DMC Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, "Bean Sprout Fairy 2", "DMC Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, "Bean Sprout Fairy 3", "DMC Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, "Bean Sprout Fairy 1", "DMT Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, "Bean Sprout Fairy 2", "DMT Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2)); - locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, "Bean Sprout Fairy 3", "DMT Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, "Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, "Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, "Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, "Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, "Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, "Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, "Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, "Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, "Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2)); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, "Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, "Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, "Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, "Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, "Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, "Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, "Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, "Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, "Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, "Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, "Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, "Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, "Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, "Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, "Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, "Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, "Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2)); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3)); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), "ToT Left Gossip Stone Fairy", "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), "ToT Left Gossip Stone Big Fairy", "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), "ToT Left Center Gossip Stone Fairy", "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), "ToT Left Center Gossip Stone Big Fairy", "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), "ToT Right Center Gossip Stone Fairy", "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), "ToT Right Center Gossip Stone Big Fairy", "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), "ToT Right Gossip Stone Fairy", "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY)); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), "ToT Right Gossip Stone Big Fairy", "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), "Gossip Stone Fairy", "DMC Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), "Gossip Stone Big Fairy", "DMC Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), "Gossip Stone Fairy", "DMT Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), "Gossip Stone Big Fairy", "DMT Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), "Gossip Stone Fairy", "Col Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY)); - locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), "Gossip Stone Big Fairy", "Col Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), "Gossip Stone Fairy", "DC Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY)); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), "Gossip Stone Big Fairy", "DC Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), "MQ Gossip Stone Fairy", "DC MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY)); - locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), "MQ Gossip Stone Big Fairy", "DC MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), "Gossip Stone Fairy", "GV Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY)); - locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), "Gossip Stone Big Fairy", "GV Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), "Maze Gossip Stone Fairy", "GC Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY)); - locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), "Maze Gossip Stone Big Fairy", "GC Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), "Medigoron Gossip Stone Fairy", "GC Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY)); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), "Medigoron Gossip Stone Big Fairy", "GC Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), "Gossip Stone Fairy", "GY Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY)); - locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), "Gossip Stone Big Fairy", "GY Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), "Malon Gossip Stone Fairy", "HC Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), "Malon Gossip Stone Big Fairy", "HC Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), "Rock Wall Gossip Stone Fairy", "HC Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), "Rock Wall Gossip Stone Big Fairy", "HC Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), "Storms Grotto Gossip Stone Fairy", "HC Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), "Storms Grotto Gossip Stone Big Fairy", "HC Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), "Deku Tree Left Gossip Stone Fairy", "KF Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), "Deku Tree Left Gossip Stone Big Fairy", "KF Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), "Deku Tree Right Gossip Stone Fairy", "KF Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), "Deku Tree Right Gossip Stone Big Fairy", "KF Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), "Gossip Stone Fairy", "KF Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), "Gossip Stone Big Fairy", "KF Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), "Storms Gossip Stone Fairy", "KF Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), "Storms Gossip Stone Big Fairy", "KF Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), "Lab Gossip Stone Fairy", "LH Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), "Lab Gossip Stone Big Fairy", "LH Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), "Southeast Gossip Stone Fairy", "LH Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), "Southeast Gossip Stone Big Fairy", "LH Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), "Southwest Gossip Stone Fairy", "LH Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY)); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), "Southwest Gossip Stone Big Fairy", "LH Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), "Gossip Stone Fairy", "LW Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY)); - locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), "Gossip Stone Big Fairy", "LW Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), "Maze Lower Gossip Stone Fairy", "SFM Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), "Maze Lower Gossip Stone Big Fairy", "SFM Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), "Maze Upper Gossip Stone Fairy", "SFM Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), "Maze Upper Gossip Stone Big Fairy", "SFM Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), "Saria Gossip Stone Fairy", "SFM Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY)); - locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), "Saria Gossip Stone Big Fairy", "SFM Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), "Gossip Stone Fairy", "ZD Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), "Gossip Stone Big Fairy", "ZD Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), "Fairy Gossip Stone Fairy", "ZF Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), "Fairy Gossip Stone Big Fairy", "ZF Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), "Jabu Gossip Stone Fairy", "ZF Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), "Jabu Gossip Stone Big Fairy", "ZF Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), "Near Grottos Gossip Stone Fairy", "ZR Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), "Near Grottos Gossip Stone Big Fairy", "ZR Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), "Near Domain Gossip Stone Fairy", "ZR Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), "Near Domain Gossip Stone Big Fairy", "ZR Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), "Cow Grotto Gossip Stone Fairy", "HF Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), "Cow Grotto Gossip Stone Big Fairy", "HF Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), "Near Market Gossip Stone Fairy", "HF Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), "Near Market Gossip Stone Big Fairy", "HF Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), "Southeast Gossip Stone Fairy", "HF Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), "Southeast Gossip Stone Big Fairy", "HF Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), "Open Grotto Gossip Stone Fairy", "HF Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), "Open Grotto Gossip Stone Big Fairy", "HF Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), "Open Grotto Gossip Stone Fairy", "Kak Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), "Open Grotto Gossip Stone Big Fairy", "Kak Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), "Open Grotto Gossip Stone Fairy", "ZR Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), "Open Grotto Gossip Stone Big Fairy", "ZR Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), "Near Shortcuts Gossip Stone Fairy", "LW Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), "Near Shortcuts Gossip Stone Big Fairy", "LW Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), "Storms Grotto Gossip Stone Fairy", "DMT Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), "Storms Grotto Gossip Stone Big Fairy", "DMT Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), "Upper Grotto Gossip Stone Fairy", "DMC Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY)); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), "Upper Grotto Gossip Stone Big Fairy", "DMC Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY)); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), "Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), "Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), "Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), "Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), "Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY)); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), "Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), "Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY)); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA,RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), "Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), "MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY)); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), "MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), "Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY)); + locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), "Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), "Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY)); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), "Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), "Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY)); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), "Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), "Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY)); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), "Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), "Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), "Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), "Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), "Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), "Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), "Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), "Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), "Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), "Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), "Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), "Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), "Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), "Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), "Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), "Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), "Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), "Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), "Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), "Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY)); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), "Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), "Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY)); + locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), "Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), "Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), "Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), "Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), "Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), "Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY)); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), "Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), "Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), "Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), "Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), "Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), "Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), "Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), "Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), "Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), "Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), "Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), "Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), "Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), "Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), "Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), "Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), "Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), "Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), "Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), "Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), "Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), "Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), "Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), "Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), "Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), "Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), "Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG)); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), "Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY)); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), "Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG)); - locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), "Island Sun's Song Fairy", "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_SUN_FAIRY)); - 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_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_ISLAND_SUN_FAIRY)); + 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", 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", 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", 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", 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", 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", 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", 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", 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)); - locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), "Beamos Song of Storms Fairy", "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), "Pit Room Song of Storms Fairy", "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "Wind Hint Sun's Song Fairy", "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), "Basement Sun's Song Fairy", "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY)); - locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), "Entrance Song of Storms Fairy", "Ice Cavern Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY)); - locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_GERUDO_TRAINING_GROUND,SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), "Entrance Song of Storms Fairy", "GTG Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), "Spirit Trial Beamos Sun's Song Fairy", "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_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", 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", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY)); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY)); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA,RCAREA_GERUDO_TRAINING_GROUND,SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA,RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY)); - locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), "MQ Lower Loop Stalfos Room Sun's Song Fairy", "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY)); - locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), "MQ Before Dark Link Pilar Sun's Song Fairy", "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), "MQ Before Dark Link Left Song of Storms Fairy", "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY)); - locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), "MQ Before Dark Link Right Sun's Song Fairy", "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY)); - locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "MQ Dinalfos Room Sun's Song Fairy", "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), "MQ Beamos Song of Storms Fairy", "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), "MQ Pit Room Song of Storms Fairy", "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY)); - locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY)); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY)); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY)); + locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY)); + locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); } static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 91e44a55e..be12d086b 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -99,553 +99,553 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va void Rando::StaticData::RegisterPotLocations() { // Overworld Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", "KF Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); - locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", "KF Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); - locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", "KF Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", "KF Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", "KF Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); - locationTable[RC_GF_BREAK_ROOM_POT_1] = Location::Pot(RC_GF_BREAK_ROOM_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Pot 1", "GF Break Room Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_1)); - locationTable[RC_GF_BREAK_ROOM_POT_2] = Location::Pot(RC_GF_BREAK_ROOM_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Pot 2", "GF Break Room Pot 2", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_2)); - locationTable[RC_GF_KITCHEN_POT_1] = Location::Pot(RC_GF_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", "GF Kitchen Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_1)); - locationTable[RC_GF_KITCHEN_POT_2] = Location::Pot(RC_GF_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", "GF Kitchen Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "North F1 Carpenter Pot 1", "GF North F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "North F1 Carpenter Pot 2", "GF North F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "North F1 Carpenter Pot 3", "GF North F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "North F2 Carpenter Pot 1", "GF North F2 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "North F2 Carpenter Pot 2", "GF North F2 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "South F1 Carpenter Pot 1", "GF South F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "South F1 Carpenter Pot 2", "GF South F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "South F1 Carpenter Pot 3", "GF South F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "South F1 Carpenter Cell Pot 1", "GF South F1 Carpenter Cell Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "South F1 Carpenter Cell Pot 2", "GF South F1 Carpenter Cell Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "South F1 Carpenter Cell Pot 3", "GF South F1 Carpenter Cell Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "South F1 Carpenter Cell Pot 4", "GF South F1 Carpenter Cell Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4)); - locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", "Wasteland Near GS Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); - locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", "Wasteland Near GS Pot 2", RHT_POT_GERUDO_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); - locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", "Wasteland Near GS Pot 3", RHT_POT_GERUDO_FORTRESS, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); - locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", "Wasteland Near GS Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", "MK Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", "MK Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", "MK Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", "MK Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", "MK Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", "MK Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", "MK Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", "MK Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", "MK Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", "MK Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", "MK Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", "MK Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", "MK Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", "MK Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", "MK Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", "MK Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", "MK Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", "MK Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", "MK Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", "MK Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", "MK Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", "MK Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", "MK Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", "MK Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", "MK Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", "MK Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", "MK Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", "MK Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", "MK Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", "MK Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", "MK Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", "MK Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", "MK Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", "MK Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", "MK Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", "MK Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", "MK Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", "MK Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", "MK Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", "MK Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", "MK Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", "MK Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", "MK Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", "MK Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", "MK Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", "MK Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", "MK Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", "MK Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", "MK Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", "MK Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", "MK Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", "MK Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", "MK Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", "MK Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", "MK Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", "MK Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", "MK Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", "MK Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", "Kak Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", "Kak Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", "Kak Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", "Kak Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", "Kak Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", "Kak Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", "Kak Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", "Kak Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", "Kak Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", "Kak Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", "Kak Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", "GY Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); - locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", "GY Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", "GY Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); - locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", "GY Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); - locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", "GY Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); - locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", "GY Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", "GC Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", "GC Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", "GC Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", "GC Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", "GC Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); - locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", "GC Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); - locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", "GC Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); - locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", "GC Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); - locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", "GC Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", "DMC Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); - locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", "DMC Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", "DMC Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); - locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", "DMC Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", "ZD Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); - locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", "ZD Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); - locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", "ZD Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); - locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", "ZD Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", "ZD Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", "ZF Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", "ZF Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", "ZF Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", "ZF Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); - locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", "ZF Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); - locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", "ZF Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", "ZF Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); - locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", "LLR Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); - locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", "LLR Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); - locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", "LLR Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); - locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", "LLR Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); - locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", "LLR Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); - locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", "LLR Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); - locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", "LLR Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); - locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", "LLR Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); - locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", "LLR Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); - locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", "LLR Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); - locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", "HF Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); - locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", "HF Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", "HC Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); - locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", "HC Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", "HC Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); - locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", "HC Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); + locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); + locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); + locationTable[RC_GF_BREAK_ROOM_POT_1] = Location::Pot(RC_GF_BREAK_ROOM_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_1)); + locationTable[RC_GF_BREAK_ROOM_POT_2] = Location::Pot(RC_GF_BREAK_ROOM_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Pot 2", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_2)); + locationTable[RC_GF_KITCHEN_POT_1] = Location::Pot(RC_GF_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_1)); + locationTable[RC_GF_KITCHEN_POT_2] = Location::Pot(RC_GF_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_2)); + locationTable[RC_GF_NORTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "North F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1)); + locationTable[RC_GF_NORTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "North F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2)); + locationTable[RC_GF_NORTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "North F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3)); + locationTable[RC_GF_NORTH_F2_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "North F2 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1)); + locationTable[RC_GF_NORTH_F2_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "North F2 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "South F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "South F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "South F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "South F1 Carpenter Cell Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "South F1 Carpenter Cell Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "South F1 Carpenter Cell Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3)); + locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "South F1 Carpenter Cell Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4)); + locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); + locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", RHT_POT_GERUDO_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); + locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", RHT_POT_GERUDO_FORTRESS, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); + locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); + locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); + locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); + locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); + locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); + locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); + locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); + locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); + locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); + locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); + locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); + locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); + locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); + locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); + locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); + locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); + locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); + locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); + locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); + locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); + locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); + locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); + locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); + locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); + locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); + locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); + locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); + locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); + locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); + locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); // Dungeon Pots // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", "Dodongos Cavern Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", "Dodongos Cavern Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", "Dodongos Cavern Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", "Dodongos Cavern Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", "Dodongos Cavern Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", "Dodongos Cavern Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", "Dodongos Cavern Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", "Dodongos Cavern Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", "Dodongos Cavern Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", "Dodongos Cavern Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", "Dodongos Cavern Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", "Dodongos Cavern Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", "Dodongos Cavern Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", "Dodongos Cavern Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", "Dodongos Cavern Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", "Dodongos Cavern Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", "Dodongos Cavern Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", "Dodongos Cavern Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", "Dodongos Cavern Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", "Dodongos Cavern Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", "Dodongos Cavern Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", "Dodongos Cavern Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", "Dodongos Cavern Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", "Dodongos Cavern Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", "Dodongos Cavern Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", "Dodongos Cavern Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", "Dodongos Cavern Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", "Dodongos Cavern Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", "Jabu Jabus Belly Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", "Jabu Jabus Belly Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", "Jabu Jabus Belly Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", "Jabu Jabus Belly Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", "Jabu Jabus Belly Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", "Jabu Jabus Belly Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", "Jabu Jabus Belly Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", "Jabu Jabus Belly Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", "Jabu Jabus Belly Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", "Jabu Jabus Belly Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", "Jabu Jabus Belly Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", "Jabu Jabus Belly Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", "Jabu Jabus Belly Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", "Jabu Jabus Belly Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", "Jabu Jabus Belly Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", "Jabu Jabus Belly Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", "Jabu Jabus Belly Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", "Forest Temple Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", "Forest Temple Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", "Forest Temple Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", "Forest Temple Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", "Forest Temple Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", "Forest Temple Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", "Forest Temple Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", "Forest Temple Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", "Forest Temple Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", "Forest Temple Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", "Forest Temple Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", "Forest Temple Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", "Forest Temple Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", "Forest Temple Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", "Forest Temple Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", "Forest Temple Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", "Forest Temple Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", "Forest Temple Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", "Forest Temple Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", "Fire Temple Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", "Fire Temple Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", "Fire Temple Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", "Fire Temple Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", "Fire Temple Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", "Fire Temple Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", "Fire Temple Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", "Fire Temple Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", "Fire Temple Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", "Fire Temple Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", "Fire Temple Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", "Fire Temple Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", "Fire Temple Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", "Fire Temple Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", "Fire Temple Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", "Water Temple Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", "Water Temple Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", "Water Temple Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", "Water Temple Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", "Water Temple Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", "Water Temple Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", "Water Temple Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", "Water Temple Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", "Water Temple Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", "Water Temple Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", "Water Temple Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", "Water Temple Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", "Water Temple Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", "Water Temple Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", "Water Temple Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", "Water Temple Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", "Water Temple Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", "Water Temple River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", "Water Temple River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", "Water Temple Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", "Water Temple Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", "Water Temple Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", "Water Temple Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); - locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", "Shadow Temple Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", "Shadow Temple Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", "Shadow Temple Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", "Shadow Temple Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", "Shadow Temple Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", "Shadow Temple Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", "Shadow Temple Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", "Shadow Temple Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", "Shadow Temple Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", "Shadow Temple Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", "Shadow Temple Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", "Shadow Temple Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", "Shadow Temple After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", "Shadow Temple After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); - locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", "Shadow Temple Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", "Shadow Temple Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", "Shadow Temple Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", "Shadow Temple After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", "Shadow Temple After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", "Shadow Temple After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", "Shadow Temple After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", "Spirit Temple Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", "Spirit Temple Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", "Spirit Temple Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", "Spirit Temple Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", "Spirit Temple Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", "Spirit Temple Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", "Spirit Temple Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", "Spirit Temple After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", "Spirit Temple After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", "Spirit Temple Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", "Spirit Temple Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", "Spirit Temple Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", "Spirit Temple Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", "Spirit Temple Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", "Spirit Temple Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); - locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", "Spirit Temple Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", "Ganons Castle Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", "Ganons Castle Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", "Ganons Castle Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", "Ganons Castle Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", "Ganons Castle Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", "Ganons Castle Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", "Ganons Castle Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", "Ganons Castle Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", "Ganons Castle Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", "Ganons Castle Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", "Ganons Castle Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", "Ganons Castle Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", "Ganons Castle Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", "Ganons Castle Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", "Ganons Castle Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", "Ganons Castle Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", "Ganons Castle Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", "Ganons Castle Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", "Ganons Castle Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", "Ganons Castle Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", "Ganons Castle Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", "Ganons Castle Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", "Ganons Castle Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", "Ganons Castle Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", "Ganons Castle Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", "Ganons Castle Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", "Ganons Castle Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", "Ganons Castle Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", "Ganons Castle Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", "Ganons Castle Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", "Ganons Castle Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", "Ganons Castle Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", "Ganons Castle Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", "Ganons Castle Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", "Bottom Of The Well Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", "Bottom Of The Well Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", "Bottom Of The Well Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", "Bottom Of The Well Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", "Bottom Of The Well Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", "Bottom Of The Well Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", "Bottom Of The Well Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", "Bottom Of The Well Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", "Bottom Of The Well Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", "Bottom Of The Well Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", "Bottom Of The Well Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", "Bottom Of The Well Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", "Bottom Of The Well Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", "Bottom Of The Well Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", "Bottom Of The Well Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", "Bottom Of The Well Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", "Bottom Of The Well Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", "Bottom Of The Well Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", "Bottom Of The Well Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); - locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", "Ice Cavern Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); - locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", "Ice Cavern Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", "Ice Cavern Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", "Ice Cavern Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", "Ice Cavern Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", "Ice Cavern Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", "Ice Cavern Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); - locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", "Ice Cavern Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); + locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); + locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); + locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); + locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); + locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); + locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); // MQ Dungeon Pots // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", "Dodongos Cavern MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", "Dodongos Cavern MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", "Dodongos Cavern MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", "Dodongos Cavern MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", "Dodongos Cavern MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", "Dodongos Cavern MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", "Dodongos Cavern MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", "Dodongos Cavern MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", "Dodongos Cavern MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", "Dodongos Cavern MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", "Dodongos Cavern MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", "Dodongos Cavern MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", "Dodongos Cavern MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", "Dodongos Cavern MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", "Dodongos Cavern MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", "Dodongos Cavern MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", "Dodongos Cavern MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", "Dodongos Cavern MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", "Dodongos Cavern MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", "Dodongos Cavern MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", "Dodongos Cavern MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", "Dodongos Cavern MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", "Dodongos Cavern MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", "Dodongos Cavern MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", "Dodongos Cavern MQ Armos SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", "Dodongos Cavern MQ Armos SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", "Dodongos Cavern MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", "Dodongos Cavern MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", "Dodongos Cavern MQ Armos NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", "Dodongos Cavern MQ Armos NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", "Jabu Jabus Belly MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", "Jabu Jabus Belly MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", "Jabu Jabus Belly MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", "Jabu Jabus Belly MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", "Jabu Jabus Belly MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", "Jabu Jabus Belly MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", "Jabu Jabus Belly MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", "Jabu Jabus Belly MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", "Jabu Jabus Belly MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", "Forest Temple MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", "Forest Temple MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", "Forest Temple MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", "Forest Temple MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", "Forest Temple MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", "Forest Temple MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", "Forest Temple MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", "Forest Temple MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", "Forest Temple MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", "Forest Temple MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", "Forest Temple MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", "Forest Temple MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", "Forest Temple MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", "Forest Temple MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", "Forest Temple MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", "Forest Temple MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", "Forest Temple MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", "Forest Temple MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", "Forest Temple MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", "Forest Temple MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", "Forest Temple MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", "Ganons Castle MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", "Ganons Castle MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", "Ganons Castle MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", "Ganons Castle MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", "Ganons Castle MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", "Ganons Castle MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", "Ganons Castle MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", "Ganons Castle MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", "Ganons Castle MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", "Ganons Castle MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", "Ganons Castle MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", "Ganons Castle MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", "Shadow Temple MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", "Shadow Temple MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", "Shadow Temple MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", "Shadow Temple MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", "Shadow Temple MQ Stone Umbrella Lower West Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", "Shadow Temple MQ Stone Umbrella Lower East Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", "Shadow Temple MQ Stone Umbrella Upper South Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", "Shadow Temple MQ Stone Umbrella Upper North Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", "Shadow Temple MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", "Shadow Temple MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", "Shadow Temple MQ Before Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", "Shadow Temple MQ Before Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", "Shadow Temple MQ After Chasm West Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", "Shadow Temple MQ After Chasm East Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", "Shadow Temple MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", "Shadow Temple MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", "Shadow Temple MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", "Bottom Of The Well MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", "Bottom Of The Well MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", "Bottom Of The Well MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", "Bottom Of The Well MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", "Bottom Of The Well MQ East Inner Room Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", "Bottom Of The Well MQ East Inner Room Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", "Bottom Of The Well MQ East Inner Room Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", "Fire Temple MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", "Fire Temple MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", "Fire Temple MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", "Fire Temple MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", "Fire Temple MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", "Fire Temple MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", "Fire Temple MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", "Fire Temple MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", "Fire Temple MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", "Fire Temple MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", "Fire Temple MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", "Fire Temple MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", "Fire Temple MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", "Fire Temple MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", "Fire Temple MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", "Fire Temple MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", "Fire Temple MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", "Fire Temple MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", "Fire Temple MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", "Fire Temple MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", "Fire Temple MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", "Fire Temple MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", "Fire Temple MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", "Fire Temple MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", "Fire Temple MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", "Fire Temple MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", "Fire Temple MQ South Fire Maze West Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", "Fire Temple MQ South Fire Maze East Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); - locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", "Ice Cavern MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", "Ice Cavern MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", "Ice Cavern MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", "Ice Cavern MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", "Ice Cavern MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", "Ice Cavern MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", "Ice Cavern MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", "Ice Cavern MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", "Ice Cavern MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", "Ice Cavern MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", "Ice Cavern MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", "Spirit Temple MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", "Spirit Temple MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", "Spirit Temple MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", "Spirit Temple MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", "Spirit Temple MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", "Spirit Temple MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", "Spirit Temple MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", "Spirit Temple MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", "Spirit Temple MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", "Spirit Temple MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", "Spirit Temple MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", "Spirit Temple MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", "Spirit Temple MQ Statue 2F Center East Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", "Spirit Temple MQ Statue Room 3F East Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", "Spirit Temple MQ Statue Room 3F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", "Spirit Temple MQ Statue 2F West Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", "Spirit Temple MQ Statue 2F Eastmost Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", "Spirit Temple MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", "Spirit Temple MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", "Spirit Temple MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", "Spirit Temple MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", "Spirit Temple MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", "Spirit Temple MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", "Spirit Temple MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", "Spirit Temple MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", "Spirit Temple MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", "Spirit Temple MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", "Spirit Temple MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", "Spirit Temple MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", "Water Temple MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", "Water Temple MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", "Water Temple MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", "Water Temple MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", "Water Temple MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", "Water Temple MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", "Water Temple MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", "Water Temple MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", "Water Temple MQ Lizalfos Hallway West Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", "Water Temple MQ Lizalfos Hallway South Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", "Water Temple MQ Lizalfos Hallway SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", "Water Temple MQ Lizalfos Cage North Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", "Water Temple MQ Lizalfos Cage South Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", "Water Temple MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", "Water Temple MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", "Water Temple MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", "Water Temple MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", "Water Temple MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", "Water Temple MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", "Water Temple MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", "Water Temple MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", "Water Temple MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", "Water Temple MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", "Water Temple MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", "Water Temple MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", "Water Temple MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", "Water Temple MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", "Water Temple MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", "Water Temple MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", "Water Temple MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", "Water Temple MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", "Gerudo Training Ground MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", "Gerudo Training Ground MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", "Gerudo Training Ground MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", "Gerudo Training Ground MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); + locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); } static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index f5c78884b..b6f332927 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -376,11 +376,10 @@ Rando::Location Rando::Location::GrottoFish(RandomizerCheck rc, RandomizerCheckQ } Rando::Location Rando::Location::Pot(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, - std::string&& spoilerName_, RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_POT, area_, ACTOR_OBJ_TSUBO, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, - collectionCheck }; + SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_POT, area_, ACTOR_OBJ_TSUBO, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; } Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { @@ -388,8 +387,8 @@ Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQu } Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, - RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, - RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, RG_NONE, false, collectionCheck}; + RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, false, collectionCheck}; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index bd96c3ae1..b4fb6482a 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -195,7 +195,7 @@ class Location { RandomizerInf flag_, std::string&& shortName_, RandomizerHintTextKey hintKey); static Location Pot(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); @@ -206,7 +206,7 @@ class Location { static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_); - static Location Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck); + static Location Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck); static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, std::string&& shortName_); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 1e0b3a7d1..d828bad47 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -169,14 +169,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GV_DEKU_SCRUB_GROTTO_FRONT] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xF0), "Deku Scrub Grotto Front", RHT_GV_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT), false, 40); // Gerudo Fortress locationTable[RC_GF_CHEST] = Location::Chest(RC_GF_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, 0x00, "Chest", RHT_GF_CHEST, RG_PIECE_OF_HEART, true); - locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "GF HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); - locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "GF HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); + locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); + locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); // RandoTodo: Do we replace these with the RC_HIDEOUT keys or keep these? - locationTable[RC_GF_GERUDO_MEMBERSHIP_CARD] = Location::Base(RC_GF_GERUDO_MEMBERSHIP_CARD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "GF Gerudo Membership Card", RHT_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS), true); - locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "GF North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "GF North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "GF South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "GF South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_GERUDO_MEMBERSHIP_CARD] = Location::Base(RC_GF_GERUDO_MEMBERSHIP_CARD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "Gerudo Membership Card", RHT_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS), true); + locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); // Haunted Wasteland locationTable[RC_WASTELAND_CHEST] = Location::Chest(RC_WASTELAND_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, 0x00, "Chest", RHT_WASTELAND_CHEST, RG_PURPLE_RUPEE); locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, "Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BUY_BOMBCHUS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN), false, 200); From c54883da72afe09c5d89a93a9aee6a96824fc8e5 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 12 Mar 2025 13:32:45 -0400 Subject: [PATCH 070/267] Fix more missing location pool exclusions (#5108) * Fix more location pool exclusion misses * Add assert to ensure item pool isn't too large. This will catch any issues where too many items are getting added to the pool in Debug mode. It only checks to make sure the item pool is smaller than the location pool, as the code actually handles that just fine by placing Junk if the pool runs out. The Item Pool being larger than the location pool though could easily result in items not being placed. Logic should prevent a seed like that actually being generated, but No Logic does no such checks. * Add TODO comment for Item Pool, should be same size as Location Pool. * Prevent Completed Triforce from ending up in Location List --- .../randomizer/3drando/item_pool.cpp | 5 +++++ soh/soh/Enhancements/randomizer/context.cpp | 17 ++++------------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index ac79e860a..45e6221ce 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1363,6 +1363,11 @@ void GenerateItemPool() { } } PendingJunkPool.clear(); + + // RANDOTODO: Ideally this should be checking for equality, but that is not currently the case and has never been + // the case, and isn't even currently the case in the 3drando repo we inherited this from years ago, so it may + // be a large undertaking to fix. + assert(ItemPool.size() <= ctx->allLocations.size() || !"Item Pool larger than Location Pool"); } void AddJunk() { diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 9fcf71d55..221e2176c 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -157,17 +157,17 @@ bool Context::IsQuestOfLocationActive(RandomizerCheck rc) { void Context::GenerateLocationPool() { allLocations.clear(); - if (mOptions[RSK_TRIFORCE_HUNT]) { - AddLocation(RC_TRIFORCE_COMPLETED); - } for (Location& location : StaticData::GetLocationTable()) { // skip RCs that shouldn't be in the pool for any reason (i.e. settings, unsupported check type, etc.) // TODO: Exclude checks for some of the older shuffles from the pool too i.e. Frog Songs, Scrubs, etc.) if (location.GetRandomizerCheck() == RC_UNKNOWN_CHECK || location.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || // already in pool + (location.GetRandomizerCheck() == RC_MASTER_SWORD_PEDESTAL && mOptions[RSK_SHUFFLE_MASTER_SWORD].Is(RO_GENERIC_OFF)) || + (location.GetRandomizerCheck() == RC_KAK_100_GOLD_SKULLTULA_REWARD && mOptions[RSK_SHUFFLE_100_GS_REWARD].Is(RO_GENERIC_OFF)) || location.GetRCType() == RCTYPE_CHEST_GAME || // not supported yet location.GetRCType() == RCTYPE_STATIC_HINT || // can't have items location.GetRCType() == RCTYPE_GOSSIP_STONE || // can't have items + (location.GetRCType() == RCTYPE_FROG_SONG && mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_OFF)) || (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_ONE_TIME_ONLY) && !( location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || @@ -177,16 +177,7 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || - (location.GetRCType() == RCTYPE_FISH && ( - mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OFF) || mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_HYRULE_LOACH) || - (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_OVERWORLD) && location.GetScene() == SCENE_FISHING_POND) || - (mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) && location.GetScene() != SCENE_FISHING_POND) || - ((mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_POND) || mOptions[RSK_FISHSANITY].Is(RO_FISHSANITY_BOTH)) && - (mOptions[RSK_FISHSANITY_AGE_SPLIT].Is(RO_GENERIC_OFF) && ( - location.GetRandomizerCheck() >= RC_LH_ADULT_FISH_1 && location.GetRandomizerCheck() <= RC_LH_ADULT_LOACH) - ) - ) - )) || + (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && From 7e392e63a869baaf70f17deb8aa081dfe33f52f2 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sat, 15 Mar 2025 16:11:30 -0700 Subject: [PATCH 071/267] Modern Menu (#5116) * Add menu files, hook menu up to window system. Temporarily rename new menu's UIWidgets to UIWidgets2 to allow both menu systems to coexist temporarily. * Finish implementing new menu. Rename 2ship UIWidgets to UIWidgets2 to complete facilitation of both menus working for now. * More preliminary setup * More prepwork, begin on settings options * Finish settings, add enhancements windows * Fix search function not looking past first columns. * Add dev tool windows * Finish dev tools * Add about window * Fully replace about window * Remove moved menu items from menubar, add more windows to new menu * Implement WindowButtonOptions. Add ability to not embed popout windows when not popped out. Add ability to hide the button for WindowButtons. Fix Entrance Tracker from showing when not enabled. * Fix entrance tracker settings embedded display. Fix entrance tracker settings window original size declaration. * Initial implementation of themed radio button widget. * Move "About" section to second column of general. Fix sidebar sections starting in second column. * Restore Entrance Tracker `Draw()` to allow for custom styling. * Fix combobox positioning formatting. Fix color picker end spacing. Convert everything in check tracker settings to UIWidgets2 (except color pickers and section headers). Make all tracker windows not embed. * Minor cleanup * Fix main volume defaults & mirror jitter fix removal on dev * Improve color picker with RGB/RGBA options. Not finished. * Finish creating CVarColorPicker and implement for Check Tracker background color. Fix tracker and network prefixes. * Finish check tracker settings and convert check tracker. * Port all Cheats menu except for Beta Quest * Port over Beta Quest to new menu * Remove old cheats menu * Port cutscene skips to modern menu * Port Timesaver Enhancements to new menu * Port the Items and Item Count Messages submenu * Port Difficulty Options to new Menu * Removes options that have been ported thus far. * Port "Reduced Clutter" options to new menu * Add forgotten callbacks to Hyper Enemies/Bosses * Copy StateButton to UIWidgets2, and implement custom padding for them in the tracker. * Ports some pause menu related settinga * Change tracker window active title color. Make state buttons smaller in tracker to get more info on screen. * Convert window title active theming to all windows. * Port the rest of Enhancements->Gameplay to new menu * Port the "Graphics" Enhancements to new menu * Ports Fixes over to the Modern Menu * Ported Restorations to Modern Menu * Ported Extra Modes to new menu * Port Autosave and Boot Sequence to modern menu * Cleans up some leftover data for ported buttons * Ports Enhancement Presets to new menu * Port Additional timers to new menu. Removes Enhancements from old menu * Cleans up some unused stuff * Ports Randomizer Enhancements to modern menu * Convert Item Tracker Settings. Something's wrong with the comboboxes in a second column of a table. * Fix combobox alignment and label position calculations. * Convert Entrance Tracker window. * Save Editor Info tab finished. Added `PushStyleInput` and `PushStyleTabs` for Info tab. Fixed some indentation in entrance tracker source. Added font push to tracker windows. * Increase size of all icons in save editor. * Convert flag groups to child windows for automatic sizing and border drawing. * Flags tab completed. Finished inventory tab. * Convert save editor help hover to UIWidgets2. * Various fixes and corrections * Start cosmetics editor, fix theme colors not updating * Cosmetics editor conversion progress * Remove Mac internal resolution restrictions. * Copy over advanced resolution partial and enable most options as a custom widget. * Add size to float sliders, more cosmetics editor progress * Fix incorrect cvar for notifications * Radio button & header color options, more cosmetics editor progress * Finish cosmetics editor conversion * Create and apply THEME_COLOR macro. Resides in SohGui for easy access to mSohMenu. * Move ResolutionEditor to SohGui directory. * Add labels to build info. Fix slider width calculations. * Fix some advanced resolution widget hiding. * Fully implement Advanced Resolution options. Fix graphics settings formatting. Improve slider label position calculations. Implement Clamp options on sliders. * Finish save editor. Convert save editor code to `using namespace UIWidgets2`. Fix search crashing on time splits window. Remove `SetLastItemHoverText` from `UIWidgets2`. * Unify cvar sectioning in time splits. * Add InputString and InputInt widgets, and corresponding CVar Widgets * Adds Widget Type for Inputs, not currently used. * Convert Sail to modern menu * Add Combobox that takes a vector of std::strings * Convert checkbox and combobx to new widgets * Add Tristate checkbox * Convert sliders and tristate checkboxes * Convert top half of Rando window * remove/replace remainder of UIWidgets usage in option.cpp * Converts tricks, locations, and removes old UIWidgets refs * Fix windows build errors * Remove Tri-State checkboxes * Use PushStyleInput instead of PushStyleSlider lol oops didn't realize it was a thing in Ship. * Rebase and address review comments * Convert Crowd Control to modern menu. * Fix build error * Audio editor progress * Re-add CVar SaveOnNextFrame calls to Resolution Editor. Remove old Resolution Editor files. * Convert TimeSplits to new menu. Fix a few enum warnings. * Decrease padding on Arrow Buttons * Audio editor + gameplay stats done * Give Randomizer Menu more screen real-estate * Port plandomizer menu * Fix slider width calculation and allow combobox LabelPosition::None * Fix None labelPos and slider width for inline labels * Fix all slider value label insertions. Convert Collision Viewer. * Minor Collision Viewer enum change. Convert Actor Viewer. * Theme/convert Message Viewer. * Add font to Message Viewer. Theme Value Viewer. * DL Viewer and SohModals themed. * Convert Input Viewer. * Missed some color settings in Input Viewer. Removed UIWidgets references from Controller Config, and restored SoH version. * Remove UIWidgets.hpp include from multiple files. * Completely remove old UIWidgets. Rename UIWidgets2 to UIWidgets. Move Accessibility and Language options to new menu. * Fix Gfx Debugger not showing up. Remove menubar registration. * Fix clearCvars references. * Fix passing std::string to const char* argument. * enum name spacing --------- Co-authored-by: aMannus Co-authored-by: Christopher Leggett --- CMakeLists.txt | 5 +- .../custom/fonts/Inconsolata-Regular.ttf | Bin 0 -> 101752 bytes .../custom/fonts/Montserrat-Regular.ttf | Bin 0 -> 197624 bytes soh/include/variables.h | 6 +- soh/soh/AboutWindow.cpp | 103 - soh/soh/AboutWindow.h | 20 - .../Enhancements/TimeDisplay/TimeDisplay.h | 8 +- soh/soh/Enhancements/audio/AudioEditor.cpp | 239 +- soh/soh/Enhancements/controls/InputViewer.cpp | 253 +- .../controls/SohInputEditorWindow.cpp | 184 +- .../cosmetics/CosmeticsEditor.cpp | 757 +++--- .../Enhancements/cosmetics/CosmeticsEditor.h | 1 - .../Enhancements/debugger/MessageViewer.cpp | 20 +- soh/soh/Enhancements/debugger/actorViewer.cpp | 169 +- soh/soh/Enhancements/debugger/colViewer.cpp | 129 +- .../Enhancements/debugger/debugSaveEditor.cpp | 919 ++++--- soh/soh/Enhancements/debugger/dlViewer.cpp | 14 + soh/soh/Enhancements/debugger/valueViewer.cpp | 25 +- soh/soh/Enhancements/enhancementTypes.h | 26 +- soh/soh/Enhancements/gameplaystats.cpp | 53 +- soh/soh/Enhancements/gameplaystatswindow.h | 1 - soh/soh/Enhancements/mods.cpp | 2 +- soh/soh/Enhancements/presets.cpp | 16 +- .../Enhancements/randomizer/Plandomizer.cpp | 121 +- soh/soh/Enhancements/randomizer/Plandomizer.h | 8 +- soh/soh/Enhancements/randomizer/option.cpp | 120 +- soh/soh/Enhancements/randomizer/option.h | 12 +- .../Enhancements/randomizer/randomizer.cpp | 121 +- .../randomizer/randomizer_check_tracker.cpp | 310 +-- .../randomizer/randomizer_check_tracker.h | 1 + .../randomizer_entrance_tracker.cpp | 134 +- .../randomizer/randomizer_entrance_tracker.h | 2 +- .../randomizer/randomizer_item_tracker.cpp | 195 +- .../randomizer/randomizer_settings_window.h | 2 + soh/soh/Enhancements/randomizer/settings.cpp | 20 +- soh/soh/Enhancements/randomizer/tricks.cpp | 27 +- soh/soh/Enhancements/randomizer/tricks.h | 2 +- .../resolution-editor/ResolutionEditor.cpp | 489 ---- .../resolution-editor/ResolutionEditor.h | 16 - .../Enhancements/timesplits/TimeSplits.cpp | 299 ++- soh/soh/Network/CrowdControl/CrowdControl.cpp | 65 - soh/soh/Network/CrowdControl/CrowdControl.h | 1 - soh/soh/Network/Sail/Sail.cpp | 68 - soh/soh/Network/Sail/Sail.h | 1 - soh/soh/OTRGlobals.cpp | 48 +- soh/soh/OTRGlobals.h | 8 + soh/soh/ShipUtils.cpp | 115 + soh/soh/ShipUtils.h | 31 + soh/soh/SohGui/Menu.cpp | 819 +++++++ soh/soh/SohGui/Menu.h | 65 + soh/soh/SohGui/MenuTypes.h | 280 +++ soh/soh/SohGui/ResolutionEditor.cpp | 528 ++++ soh/soh/SohGui/ResolutionEditor.h | 12 + soh/soh/SohGui/SohGui.cpp | 82 +- soh/soh/SohGui/SohGui.hpp | 13 +- soh/soh/SohGui/SohMenu.cpp | 168 ++ soh/soh/SohGui/SohMenu.h | 227 ++ soh/soh/SohGui/SohMenuBar.cpp | 2104 +--------------- soh/soh/SohGui/SohMenuDevTools.cpp | 170 ++ soh/soh/SohGui/SohMenuEnhancements.cpp | 2146 +++++++++++++++++ soh/soh/SohGui/SohMenuNetwork.cpp | 148 ++ soh/soh/SohGui/SohMenuRandomizer.cpp | 133 + soh/soh/SohGui/SohMenuSettings.cpp | 373 +++ soh/soh/SohGui/SohModals.cpp | 9 +- soh/soh/SohGui/UIWidgets.cpp | 1947 ++++++++------- soh/soh/SohGui/UIWidgets.hpp | 1016 +++++++- soh/soh/config/ConfigMigrators.h | 6 +- soh/soh/cvar_prefixes.h | 10 +- soh/src/code/audio_playback.c | 2 +- soh/src/code/z_frame_advance.c | 5 +- 70 files changed, 9652 insertions(+), 5777 deletions(-) create mode 100644 soh/assets/custom/fonts/Inconsolata-Regular.ttf create mode 100644 soh/assets/custom/fonts/Montserrat-Regular.ttf delete mode 100644 soh/soh/AboutWindow.cpp delete mode 100644 soh/soh/AboutWindow.h delete mode 100644 soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp delete mode 100644 soh/soh/Enhancements/resolution-editor/ResolutionEditor.h create mode 100644 soh/soh/ShipUtils.cpp create mode 100644 soh/soh/ShipUtils.h create mode 100644 soh/soh/SohGui/Menu.cpp create mode 100644 soh/soh/SohGui/Menu.h create mode 100644 soh/soh/SohGui/MenuTypes.h create mode 100644 soh/soh/SohGui/ResolutionEditor.cpp create mode 100644 soh/soh/SohGui/ResolutionEditor.h create mode 100644 soh/soh/SohGui/SohMenu.cpp create mode 100644 soh/soh/SohGui/SohMenu.h create mode 100644 soh/soh/SohGui/SohMenuDevTools.cpp create mode 100644 soh/soh/SohGui/SohMenuEnhancements.cpp create mode 100644 soh/soh/SohGui/SohMenuNetwork.cpp create mode 100644 soh/soh/SohGui/SohMenuRandomizer.cpp create mode 100644 soh/soh/SohGui/SohMenuSettings.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3437ef3fd..38ac6ce4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,10 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -set(CMAKE_PROJECT_GIT_COMMIT_HASH "${GIT_COMMIT_HASH}" CACHE STRING "Git commit hash" FORCE) +# Get only the first 7 characters of the hash +string(SUBSTRING "${GIT_COMMIT_HASH}" 0 7 SHORT_COMMIT_HASH) + +set(CMAKE_PROJECT_GIT_COMMIT_HASH "${SHORT_COMMIT_HASH}" CACHE STRING "Git commit hash" FORCE) execute_process( COMMAND git describe --tags --abbrev=0 --exact-match HEAD diff --git a/soh/assets/custom/fonts/Inconsolata-Regular.ttf b/soh/assets/custom/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d1241516bc2357fadd283371e34055d9b1cc89a8 GIT binary patch literal 101752 zcmd44cVHYv(l^}Qvs&exgS9KIB+Hg9uU4{xqq1|BY{^lpEL#Z$Cz8n^I3GD5n4Dov zH1Q1Q?U0YvU#+X*g7%!f)bjgZOa~+Y4)qc)c%Efb5)Rw>ZduIY;VS5=1+_z-K z6xW8!9C@Jq7F-%u)RfhH_m}r>MA?IKWmA{CcUkke4U8q6$yiWn)8+wt+-ISWF(ztI z|5a;mTi1ca>sB+C_Yz~_m$te4dx4KY`$;$kv~_N4EiK9oXY8sJ#=c$K-r{afEc+eR zZ$*7!I}ia+TAxLk_+_+r4QvgJdErJ7?0DA2a4(jC6LFduy-%_K4R( zUjTZ0x4Wz5_ITIjjFmMo7Bke_(?4)y!UGR8*0+PPtgCzbT6%Ma`=-G-Cqd`O8E1TC zgoWeCv}f4uY$EGteoR2)DeP)c{4@Lvrs0q3*Nl`i=C^;u^Xtcc_YubTA6gSeW90=m zmsf8HpYa_F);=MMcjB$f$WGP1G8BA}jHZU8;H&tBI6MKE+6lgtH3PQrpMdv6&5)==d4Yc9>zRv3q0IaODQ9dKV?XPUT*Spi!p@#k3(=)Xhyk&Ywv zBR`8?iNiRtYF5E!;%_dShQDe+d90jGXA9U2;HINgio61Kb5J*%%?G@YO=iWY&yzJ( zpeq726YcWYR0Wr^O0-zOmV>SweCMGRQO#yKpekY|fMkcac}$S3fL$S3pV$ZIfjIA6(EBCq4%%-#G< z44^Jvgb_FF3**<6rr8!VV>8z^YD^%o4=`U*yDCluUf>&+jr_2duR zx?OW^U9Q_~ovsnvro0i`M(2pFW6FrFeaf({E%#(wYwobEC3nQu47e$GwykmUh|N7| z#MUsW*|s64*|t7s*tRZb#I_d4H4}$zt0#`w>L=c2tD7)lTb1Rqt;{~zR+~LytH~O% zt;ia-EgwH(TQ+{!wlu5Qwj^`Jwm7rKwkYFd+ro?y+X5WtJ8rYhbBx&LI)-g?95uG; z^buQ?&2Fnq8?jZ`ZnKr!Mr>s`mfDAHv+X0cS@x4{Gwn6D8L1<->EoJh)5eY1O2!S_ zipSO1ic*G4-?J5_jM%284BK3JC)={KZnKTgYPMx1Cnv7WOfI%%SdtRgIub{0>45;! zY_lP1w#_y*A#QDI!bID+_z_!5+-0}nwzIyxzrP??Bogp8F zd>85;ni%Q~T@czBx-Im=(3?Xa34J5<%P<}m9hMbV61E_0eOPbU8DW=&-5&OM*ehY5 zhFilE!rkHh;b(>K3V$N}?TASc>m#m>_&Rbz^BS9eGbwY}ELuvZxhN z-BCNDE{?h->XE1yqCSqE9X%)79eq~x714J@KN0yD|2p*b8HCjD0fpA90qrxVY@N>2ZtV2I4M@yDjd~ zxR>JIjr%%Yi;s(+5I;S>Iev5ex$#%W-xL4Ogy{*35;i1kPPi!H_Jltsyp`}t!boCL zVqW6h#0`mkiDxBVnRsX76N#@RzMuF_l3!9{uTI^a`dsQiQ@^w^TeL0HR%DxJ zTVva7yU2Evo!g`B4fYQEEopPpR;P8QosxE8+Kp)srhS>t(__-dr%y{?n7%Rnr1YKX zyV4&>e>VNY^zR%2jwHt<$1KNE$419Vj-8ID9dBg#Wh7)Q%;?BCF=J=O4H>Uze4IHm zb7|&@nJ;C&mlc(jkyV&AFKbO!ch(bGuV#HPK4pCF_|oyq$9IfBbNn^q?;rpC`2FJ# zWd~pFG2wy<*G=$DcyYqNCyI$@ zPJAP0LeAEl`*Zf?yp{8xoL?q|PjXM{pLF)5=O#~@JZp0O zCjXkdA@_#d&!?~{QByLf6i-<&W&MtSTZgZaR z{Dafue8%~v^Q$~9FD@@TuOhD_@7lb3^Y-Swk@vAH(6z+ncJ;f?c3tVZ%k`w|Ro4fu z|K_LU=jNB@FVAnuzo{UwU{OJB!TAMm7JM~z+SIG3{<$!r@YKQ^i=vA9iuM-$R4j^v zi(`t%6=xMsDK0K9E1qAxqIgYlQ*meUVDTx%XBY1*zP$Ll;#-UFEq=K8sp4mgUnzd8 z_}$`z#a|YGUs6=EqU4H_L(}4?HBNhK+Pl-sre8Mwjv3Y&%V)eXWB-hgXM8c!F>}() zf|)aBo;7pV%s$%y5R< ztg`dUc9rcZd%ogm-t&k35de$EMV_RS5P8#%Xb?j>`dop$Cp@_uc_-*<171ngccet+mv~)@Icf)y}D{tL>=WUVDD+ zwYB%uK2`f_?FY5rtkhPTRoUS^byQ|5+o}Ok2~m=E60eH7~FEbgi~FVQt~s1#3Ij4z0a;?W1eoTKn0$ zfOQkrEn2s6-8t*7TeoN3^Xm?*`(b^^`jqvP)>p3YSbxp>yVk$7{)_d8H^gn2xS@1I z&4!i@XKlD{!y_Bs-tb*RM8lMZ`3=ntr#0Nr@N~lgx5b_1p5?A{pX|QOeYg8b_ut*0 zH}b~F#np8awMDc| zXe)19-!|BGLEDpUAGG_m?`Z#}V{OMR8`;Kb8<%Yy*m%vxn>N0*@s~~QoBq=o)_HqZ zde`|~f9g8i9p0VPJ*j(6cYF7X-M{p#?YXAs{+^NEtlo~^>wDihA^wEo6Ta%p@7vk8 zyYI*T^!^3?+xpMz-`)TB{saC09q=0n9mpG~8E75YJaEpy?+30JxPIWaf%^tt8u-s( z#9+eUqQTn1vj#65e0cDmgWnGRy4kvU;%3+8+Rf`Xw{70KdB^6vH$S`ioy~`~L~NP3 zrE1HjE!S_kZObED{=GG5Yt+`Ht?64QZgp*4vUSzg4O`o`_G}&6`q0*=w!X3TlWjrU zvbQ<6HE!FqZP&KDx9!>Xr){rnduQ9hZQpD=ygg`p-1hYCx!dXbn(lXk_;cb%CMv5J z*6_e$j5o7@vei{~KC7av#?BKeme<(XHw(&E+u2KtmMpZhTbD0cWM?~Y%W7w< zYnCstGu#v6?hbdC;3;qi<;Scn40n4GED~4s(YULMWpOP2C{&@xMHO;fRKdqZ6?9xw zfyYG^a9mXWzd?n&bJ$B$_Bzs97SxknbvnbYN75y@-JJtGyUE?(!qc0Yx_Wt%%p;mR zJKA_qb9YY{x3u=To7gb!>pR)EGXGNMpUC`x%=gRuEt$V2^B1}YyZYF^p1$U8_C!CV zu!sBmoq5cI+{Nxhp3iRXA8hPr*Yywf_OmOuxAgU}i)FvkWF8~)XqjiqJVWLVnWrNc zxKm4&rC6EkUZnRqL}Ef^9wu|_sK91)kIm)%q6V)@!2KST<793}u7Rr`?)8Z~K~!s# zC4#d2zVS=3^jhdv{~7H}`~`@8;$i$a}7HVTex5HL-poRpf!9PxSl9BHgK%7Huulc$1)eY|eU+bZrD? zyoLXbzeS1YkhbC;x(Rlnamc{V1?}(rf<$-v)NUMd!M1{iY7QJxgL`mEr%RqS^1b4f zrFcc5)>z4s$@;Jm_DUqT6d!I$vhF7#q+BjSeYjdj=w6=-+~3Pu>f=iIlD9OM+07Dp zYp~GZ6Mn)f{6&BW6hR_bgb3IfyF~xs2hiCr(FF~?9IO}_(oWWn!jm-4OH7=!BD;q@ z!ms8x0c&A*v4{DU{6>?4WB0{>j7@25a*=fZ3I;^`9AwiZg{31_d*ocCQ_h$8jO|9y z&c!_$d=fmuSOE4`gm#Da6!IIjCz0O->J(Tdf(2=NP(DL@1o>Io!^lt49zuSy55*Ib z;&Dmwn51}AQoz%-Q?=8yTckE}H;!kq1nh6z068~lH*2?Ow`#X(w?p=w+Fjb++CAF6 z+I`sh*sa~KJ)k|QJ*E8-y6GO3qP!pj+z!gI!&W7FK)&@R5_ty$Eye{B9)MdsiMG0p zq-^X&CGlx|{{LFOVE()WqsI6=K2Pq|oBUXr4q-gYcL6V6t?K5Fd4J`zEG*8ixS7zY6^Bj8&`(d}TYq6%E%T8ef zY$I!6t62^91gk+4jyC_`@9=-}{rq3JSAUPc&p+S?%#})r7_43zKZLa}9xF|hh(jJJ zVzE+u$$u0=gaG=2{~)*s2J|`q9>xd)^cnw-kBC4(pYm_{VG#i6Km5P^SK$xn6aEeV zMOXp-n}5xJ7Jh&Z@~`-?urMqCkbmUW0OMOG?V*qOM(oql`b0DAZ+t#hE6g*r{2Cnp z3rXMc@A(hVYy#HiP*EkS#U@&#|JNSEvC~QGA7(Gsz16E`%#$6MDW_wmorm$h6gz>JYgb^*uhy>7uEnT7racbt zqLr0Kl6J1iZ{!Yk5S{_>FckdZZ;XXvkG+JQ!t?lCehU9RzZkmQz&-p?{ygmWnMf9s zMZPE!i?AbkqPS9AEuIj66fcQ?X%;O+3)iBwWGzF>)^fExtxy|G4NMJBjZYnynufdc zoYX0)MXA$M=cTSlU6b08+LL->>RGA3PrW4diqz{;f3gSLBkZyEBzvko-JWH4+Vkzx z?3MOj`!@TD_EYWW*>AAlY`@KZhy5P={q~3KkJ+D0i%yG6OHa#4%Sy{lyDII|bdhdN z4@eJBk4leCk55lZPfgEBpPSy0-jaTqLpTx~;~hDU^Bu2bI5Kx+o|}1T=JlC>$$T;M z)vW1R4OvZDt>a_IC*=6&T$UR(@++>T=wB$aV`R=kZVWQ9E=Fm-k6 z`qa+Ut*JXwccxw}?Xk=54|_z}6YME=yR?VPULx%=AnmaO_PEJ@E9`NXeK+j!sQrmi z_P8+ZAnf5M?GY*Mk!aeZS=l4gv)PAeJKBEjUG07CfcBAgQ2W**EEY?W z#cs*M-ldC(am1B_%Pd@Jd` zG3!3pA#V%fK)=R)0G~qgV*56%5^xCJb*LGU)k&I@9b@MKui(Y zm}%QZF`jaKf+sD0JcLK_NqE9iKxZSqkT1crmDN~1&*tainaU-2mU0_^ivN-C*RB&5 z{+1{e;UY{#h%}s!1@0*ladi`qD<(Tu%N(qkg{%(Grk3MumkB>Vn{8t!vdh`&qMKdH zo@S4;C)pp_KiIYWI`$L$5Bm!4^8-7~IS=4zJetSzR9?ZS^O<}$59N*g1m4VB`DwgM z^zc)0FL67+li$ss<>&C{aCiI*R_{-7t?(;LgRSLr*h)T)ZQu)- zn=j&vSqq+Jw&598D__Ri`3ly_SFv8chV}7v>;%4+4e|zdAwQ9A=Phg}-^Q-yXR+(~ z5W9h2fHm`cb{oHx-OaCJckwIP9sF`!pWetG;y17d`7ZV){>eV%ud$E$>+B=`S9UJ%XMe&I?=n1UXl5IEEvw>F*d_cF+|!M) zWG>icdClRYF@=ogyVwi-5q1y1 z8fW*L*crT=U4>_IXYwBQK7Uyo&`!X!wH|G=HmF^RGwC+1PursPYg=(ny%cBF>v3Ma zLY{q3#aZ`EoPAHk`S>iHgHO?RurwaXvUvoXz$4i#p2cSJOqR>z*gT%k7V~1ZkQcIA zUdlS~7-$n;$+~$x>&J890X!Sr%-!q?emc97pTREXC$o$AN$e&(A-siO#O~$Su>1J6 z>~?+`yOUqRJp2!A55I*y%5P<_@h90!{89E6{}X$I?`41E&#?V?E_@JA6eHP>*jX9I zHSpKCZvQXNYTx2)kEh}68(dR!~57tybae39qd%Tk?r7{*vY(|oyP~*`Fu0GfNx>H z!n6M_Gf-SdzZh+{>5Kl@9~$|2mBQ=Pb?6N z#e6*Knu;rq0#PVtidmvWOcyi6G_77+BOJH}S&QeRtHc^S6J0Hu#5%EFG>QxHoc#i^ zQ(P=A5f_Q`#qY%L#TB?)zf4@Nxy4C%baoo9pxVXhVo(fdEm*4?wIK147B9ZmBE+X! zr1(q=75~=4#3x#ycw4+KKEz%BTUg}}XmPl%$q`>^vDy@Eg7{KP(q?KC#T(i*@ej=@ zzSR=(#3@_+RVxvH*K);wHGlEFmLmQpUe#>kC-H$6BYx1vX_K|_nq3TwFSG>lqn4^o z*RsT$TCw;=OBdg1$>JStl9ncZ7T;)GysHWE9`+ob6aNygh(C$_;$`uSR-k2yzi9bd zhIm#h)r!Q6+H9>*ydeIGYq6&_m*xw@;8F{x76( z$e`pznsAI%h`LlH-y^}({|}});Jp~hag5|boj(#CjkFA~Z<;-(>|5sxF9ltmN)vH3 zQaRxNDaC-su%DsFv5v{0|9>F`LJwmM#{n+>A5sD8k2e*8milNrMmm;_jJnBaf3#%O z|JE@P?IMqoXq-}xGaZdL>0e({ZEN}@o4FI+C`x4 z*fa&WxZ_Mmo3o_LLX~K|iH7V_hcpd|e1v?7^s7K3{~ifI0@?NH|KyI2m=cWVczbk`-+sBqF_e#$ zNHr0Gbc7tI$s zQaKnYULA=y;nI-^{;lJ&?0CF&!`P{P7&3?+@KMLc7as{4q3EbjlxPenO~HA>qbFK_ z4496_dSu{y>wRHKOY;)Rpf!%TD?I`)adaLV(`IaYX=|b(9yBILp+6eVkbSHp@uYfF z7n0#?e^qbL`0|o^5j`c+%Yc3QZ{Un}R5sxM={VN5L_fBl1`mn%;q5EOmk-gIZN|_` ze;}WrIYje=)-;+A;Yfi)Vk2f^JSdRjkVp>AMOr_?X$_*a2o6Tj*E^7YrglirBAthH z4-)CQ7O4)Y6X|-S2I#O8^d#eNNRJ~?|4H6rb-W%&(ti+%^zuy|C~rcddg4j^&4hNW zbpBOWUUB(3XPjqZjG z>({Mav%0=+)ymqM70Z?`S-fcBg8B32&Z*9}MFa&-;=6-`DjXFpL6ax3-9fA?vd)U&Uq2}F8 z%LJR!2N)dz0Pnv1U3Nm(~rXd3b{(S(TU9!D8Ham|&Q+Gd}w^cOY-RKO|)$Oq}PpQP> zeT{~4LK2Cc3fMx$$lQ--`$V6-r<8ei$Xbg;$Z`{UA#pm()&OS#EXz!a$Y=`IQEg29}24`6R}I zQ1=7#7`C4SIeQ?4hw|jz;E5gpy@&7E9ax$SZNW)LJ;rx{l5jgr95g2~A4U+Vcf8iy zgWA<~4}@TWOqMw)%IV+aNmaYW;v9$9t(Vnd0IPQM#W@Xd?FA@mnN@bUwWoAN9nm%< z!{^iL>nkTuBJZ--Ia-n(^}A#6L!zqP5fK#&hAQCb@HOdRyWQ5ThMb`~54jvUnj>Nw z+*Zq+*W{>f0Eq+B2LI;))wI&y;Aw2g0cek?9zwOf$xYNOZnw}fcXLZ7c8_PlZq^V_ zkfWvC6YMBAYi6_AdX1H8{2k>U9;aKq%28!c=oo5pG{OT*m)5l0Y;g|ywg5i3BxmUwOj0t2eQ2oCzPr?tLu~yNl;;^%Hg&*WAQ+DVYw9!`Zd66l2Ws}ZYZSL(d>YQOG}5` z=ytNbsXlqAzDZgf>OeI%d6J)ZbyACypfw<~sTCQfMPq}bQAg119E)oki)aOvFU~Qa z#6j8lq&1F1^Bq;qprGV#_Gs|JGEt(5LcJ`Z zfd50Dw$a6QvsjI4ID;iKSN9cdi7*;n786JmbmMl|}ryFDM!xBp>uYqWhNmlUe zSZZ&mw>LBZi<3fHvfbl{qrKHl&PB`aQpm^urC9rMa1X6OTSgNo+2fBhK&!jOk%q+` zxO!<7jv)_+ika0Q2Ky|JHESLn@V__5;cmeol03V+MYgSmy3#tN zUviZrtsW#Ilk850!)nn;Sc8|cROfDLF`+3wfSz%N&VC1?>XHA?} zbQOYieRZK$;_nHO{{u5U0ht(Rj|DpD)&A5SgQtX{wB80PL0!EAfFX*`bM#+!q(K!d znJ_!}$x|bBfJVO5jalz@B<~s7yA*3=14<2!`g#(N|8P5MAz2UUjLBT!9B@=qC`r2T z;7m_2sHh7%LeGOTJ@}7KL1(Jd4F?fGNqtF&&eBVV)f;Dpu~MW%6oc4Q7KQ%^&L+EPw^g?pcw8lZfowIkH6-T%48=@=9Lq zVAb#;1>j+-hdJir>7oNK@Oijnu1BC~LXP_d;{lFhIs`h3cMI;1)gEiGBO){e3;j@2 zL$iLOhLu@y@(j9Ef;}+M_>ZyOOiNQuonNwrW)^0YXNx|hm{zb05t#K`uo9BBbV~+M z-H=&HhLnxT+L)R$-<%Twen++%3OGJta0NMZtp{a02N( z!KjFU9iP@+I~bJ_==jrE(3IYLMn=ehidr`v>;vZ$_6y~G0LIl zk+`Vo5LDp_uAu7|44@~F)}dUC@5z5AcY{~R%L$*;p+uouYO?Al$po@J42>qRc#mAn zh|sWGtDMq0yRq1sx|1Pa2%O}RYKH9gh)7fo*`siy;W>+@qD9p?Bo1eB zYnGy-9-NgkG^EqfHF<~_TCf5}pgXpp;^ZLcWZr*WnRBdaoSZ6ZuwLz9?T)Q!WQ#p) zy<;0L7b+YcyL~MdMV#vQuth2LLqj;F4ms$)Y9-z1Ag4;af8k7_>jS!$G3m#p;9kua z5dsG2+n$lTQs~CXEB7>0?iR=;4TcQCdsy31#gfbMHI&Q$va5R-&c+U15lfbmJ+yXc zHEtKv_OMhEuk@jESPCuUQlU#oA;#E7%VE41!!3b;9}Ih2!Fba@>=^~)ed(|V6|Aut zVOte!VOe3z73{~7!ip7a1wKl_0jw}|zk&nV+|WxE9L#oxS`{3^E)E$`a45G2*C;rQ z6$IOL7&l%a!7&QvEGSsM=WYqa+bgahr8C!9c92KWSlFbXGZpN|CI+omu$ATF%}v=~ zdhaJl>A(Y+Gw>~i$2%y2_bNDuxdKm8a4_&nH~e0GQed{ihq8$Q%7%E4C^z6Wg%4+0 z0r*Wh*%t4#I0LpTIFe-tD7*0}z!McdnxzKN+u=kX!_xgfRd6h``@f*zIF{jmtAgWM zivN&;6Ihmivw{;@s(-bDlbF*#PQl46%legqQ`ki7vkD%^vaQ!CIF(JZ_9@uLGOUXg zY-hPvV=U6}>yBZCPiHZH2NmpKLD)yr_0RD74Bp`h@iT0a#UlLnDw^>uz;BO&vssj% z(XR>MbFIQpWVwFb3eI5}e)APPiDmnxD|j-?vizdpTsG12x`L;$bc^8+PBzJ6_(LAc zurw$d7urr!a6U`1q$;?8*)?NKr?OP-eT6S%>3Cyb?_&{5(r#98G0VXFOFF)UrD(=j zOk+;1K;fseEKR zvB&v|f-CUMR?S(wXEYISj_EwBu;<#V;A*_zR;l1Q*k83PcrJe1@Qs4!;a3VTDR{om zI4*Hf9eSB<{k8X87K34DJW2=31UgP6qYo(9XVyAL|^)WZA!uylGICisU>|i#_ z@^9DpQmz1f7b0DZ<**pLu6?L+Lxw?90h}(O8~eT_=SU3k(Ip>Q=hgREbz?QL<89GS z=+T7zSuckpsl1ZQp=T$wI~Miv&=~zb9@<6H9v#?Q?mDL2<)CW=74@j^n3M}KDsAw< zfn!p6d+nw7;*PYE*Otek^41xB_hOF5Q@8iAXvW&|ShT*jJQm$(TONz@_-y0lFq+Pg(YE?+y5q5ix2IleuZ6s|hVI7EkZP2DHTQDzw)f(UmPf9m zzW#YEDlb<<`mv~whsJ1sJhZ+&HQF7mFGnAxqfs88ZM?nq(jSeRcl3@{>*Zqf^=MSb zsx$h0EE-=M9gY8J+Z>JJ*nRZ&!b|7H9gUyYD#xbt)*AiuVvf#t?D^wpRAX&+Y@WW> zJ2vHLJ06?%crE4S;%(u*8aZ0;ytX|yotLv=+hfxoAJtgf9-F7HZI4Yk+P250Jzh(B zE#Pgj3fD@_xKe6ot8jf~TsP6R(*VxU)9_23DY#;7!WCBs$^(FNkveb{mMgDw+fcs* zzgJy|U-GmA-;ZDTRLiT~0YEDNwW8G)dCk@Wj84&sV-w^VSHpH(*Xh^CeV`$2h<1gH zk7oz}UPF&Z9 zfuqs8VY6OXqg9R)T`>Y44?{=#llPtwKD6I$-9ASO z!rntAld*DGm>w$!?{VNCepf6cjp%asZDI*so4Pj1UtVL612vkg!;dpX1OF0n?}G5# ztO(Qup^knvssAD$5h9XbNIr=;CGSJpOl|So?>kLu&N#muzqg}6r6KrD;+Keyae(b- zZ^dnAudx@{zSymCv)EJE8or<1jrX>8;a#sw+0Ml7_`4J7_xq<~&Ypys+zb0PL|ZLs?2?8eO8l%P1Cy>z zL>?+W2If1-?I-ab;Ge{=$UoQcdwBfd{Y;`4gUG)Y*8{`FLlRHXGMQM5Jf5P(@&w@q z&3i<{M#MVgzaYhMQ#I}o1* zv0Ad=r%CulV;FEhj=-A8E79lhktKjXKm1?hzexO{ky^B1iO@aqcBC7Tu0^^~rm?Y4 z$roj$l*HHK5u-Mt74I-UoS4g4{3-F!I3B%L5c;klSilF@An8_{IP_iBqNfU)YeMBF zL^!?e3=>yqLQWH!XhInVB=ytVA_|a_kzhhmCKO^oK0ShMR10)nhvJ3}NT)*ui^Cg! zabHU46B9aMLR7ootkt2n%-YvX=mp}8(!RK-Oo(s|5(g-5kA&{0+PJ#`-)cg;Oz3J8 z0xs@SNw?F)oohmbYml|4o4AuqXtN3Rn$SiQYBnL#Mdz~K#MPP5auZr;Le(ZzYC_%~ zO*3#l)-6CkavA=`Wt&jC38k12(Zxx+2oo1%KnB0KeWRf`cy-*qc=9l5ds*8+xY)yl zi~W(Y*l$eea}zpfLhqZHslf=aYnww z7dN&o(UA<~a`q6Em>att)*XQD`%I|Qgyx!1xd{=jLAID-;tEa3X+jfCD8qnayG^Lw zfTRXGzf=PkpI|^o)9=_V;)ad3@li*CLJVANqY14wAg?qpi^MeI@&nr}dI zJSuhTjv9~S7{U07qgpf&m-r}OoIZlFvoPAlR2%Cup-Co`WkPlnq83TAMa(E%n8XE) z!U+>6A+I&0Pof_&zjz_T6LnnNrA96Jq@rsuAkv<2G2h3Z67v=M)n`JTCN$TCCYn%& z0m-%vvTdq?i%&41m`@Y4V?LtwH0E6sBHY^&_qvID$%LLYp!g_*iw_iH;9|QC$VYpt zfr}e9pxBiLWLOBg>_vKvY#Q^R3EgW#x0}$72IOr^P|UT|mgc^KuudunXILGgxvxXA z#pSX^s)377Frg3wqE$d|A@#eET1fqLXb2@8I@5&q0>bEH-ME!}GG;5v&`Lp_Ce&&| zglmv=UR;A&yV`_mOlYwQ5l(N5{wf*eCN#r@3QfpqKvF-wt(;L(1K3J&fn5{?yXcTl zkD?4*3~Z(7tOlghkqr>;QmviQuw?YNgp2;tgg!ALsy$%V>d=0(_ALWSyfykYI)6mJ zFa~Nca5Q^RyAvz;m(lwGKV?FwQMmg}h;aKQ-Q6Y*z{U zF`+mUil7lhDJXgrL{}cbA@`{ziw8v=CS25yhPRJ~Vmgi581hp|7b87!G+op;My;2h zgc^u0MtY}&G7P$yR1-=tAfL9Mo4AAcn8N#Hm#BA4=uH!Ph3I50ApQCv>NyklOw==>%c zxR?wBI+}jRZV_WO+D5H4pqNw>N-&_Pl_s>*fV|SYkdIxwoaY-YqAE>jmI)QZ-!7DP zcA3y56Us6n)JEAQU6LWB3I`3G%DRU!r~kqU!^_mOL!-m&or&wP-ME z$=4!(NxU`ktH@6yKZ49Y6Y4af8WSosA*TV!w(rWe6AfHUh5<#s9r=3XOOek)%3c#9 z++z~=pozQJgl;#WsI>-{m{b!=FrcV*1M<;6%D}}~4Jc~90gahaa@OkSRkE(WzDUSv z%wK)oAe^^tNKHN1M*7q>KFC7p_R8* zLJg!#l({l^@6RJq6SGBI?>R#V)$kJ9|Tj*QxPQ$ zIetIL*{|XxnKuEW$z7|z%l)lB?BGx>?O+|IobMFH$RkK1hefFt5uFhKlXkz@=d$fy zneUfvf0C4IB;|g}`N=xH%>PX^h=E0X{w-@g692jQCoq3QTq@2BCFV0R2XGkeEAe#N zhvQ+?UmiyLO~BCJ+f*qlo#+uilC&Du;*kHWVZV}xY7{&5O|67r@iX#t`DLeJ@dMFN z4x3;{khdWQ6z73t6K;_bEmF@wX#tCr7$_yCNQoAyd7zRQPI6&yj%cD%2YeNYBT^Z` z?F93GNE^=8Yw@)x&gV)C4@;h5;yYl-i@--p4AU%tPZ!wHWSb?o0|Fz32y`?q2efR^ z_Y+TGXcWF0Sx>O!|1jT67|D%dZ=pwWtlyP(h?jP-5I5k-szGw>-j$!EF~RMCFlDjeJbr6 z0z)I1C+W$%$ur4fzjBNh>_B4?D&zDG)1E6ZWPxF+Gm|>MDf6GDwg=^07?wN1!=x=J zX{HQIJ{FZOD+E0GW5 zjY`ZoZMTF^mH2HkzXBX=Qil@}QycVB?lAFZ!*Xx;Imv&M)a^kzM$bvj56HgHml6+Y z7;$!p_SCVPPQBhQd;Nvv_J!6D%olQJ{hxC8{T$h&Ls~SoBL3Vhbv`7y4a@!IDB_8g zhsGjE+Tl(qF-rD5irP~2OXN{fA5Gf)E9xVxggzoC4w~HQ50qMcCC83So?Pm4Na~{@ z3NlgB$ZFaRGN)$?*GN5wmF3AFG$~h;IzJ=rrYW7tulDP9leXF~wF;54Zk3uRNIqdw z|1ilRLFyl-bCCKEYZrmfFlmLHtU4_9XHx%vORN4UH9x3mpgCxuIdW)@oHV~!YW|(J z0+{bLJcYsN<4FY@mfn@1)ksRR|FG2LI%)r5WBum8pe-`4k(>KW+cuu&1 z&A`*BCbk++pgPzZoMkrQ_wMvfGB=`TUc+|EZ<75U&vXv5o8&ji-sbd8vajVg$$qA9 zlHtoq_$C>Tqi>S&8T3suM4iMp$@nb#CK<1$Z<6ti^i49piQ}7Oh((ESlJNohCKt?NO$keMj+weNHLzDlH@V}@TEk2 z*%1*q1^mT=*s50is^Bj?fCus*9*jts(3b@{f8&;M4p6rk=d+;r|@w&(?7>;+|JW@I(P64MBdEgS&05Ho@Yy+%#m?i zbJ+wok^RW0a3{~>F2u^rL2TElxF#vWldzXCuV2Rb=@od&Fl_rOymuzNb~Z+9GA~1X z&2nCW2rZSo3SK-1@vGoFr5Fe4ffPqvx2@K#)>wDS(W5%GUEAqHnBzC6~AH^=i4IkNyU zhI;V5hZA@o@5f9TM4X(>hl|FMoQvoi=kXzaKEHtf4zus~n0*&v{$0W^#g*jci1t~6m{3>ps}P0!8a!p6 z!9GJI(8u{7_;r|}yAY-OM#KfV3GqH}#`n-}#na~wej6gk-htS$ck#OsXY?LKlD&_6 z_-;ho>_qg9W5Mtvzf|yZzu!`(L^w28)7~T#!32*Uw)-^v)CbOZ;X23V)Tq#{bG+$Exur{~Ml@&u2g3 zO62c|SdaMc2$-NEz~dd8za!%5dx&`YJ|crrEcg!*t%~BYA4IJ2PY|K@Km1d~?D&j- zj>uPEAPW2;uA;BA4`qC&Wn9Hz$Cow{FP&}08wlI@FNhi96E~fmgoo7l1_RqZ<|_=L zi0B(GBItV?>;@6dPDTWJd_{xp#+y1{;_ZT3`kn@&7bnT+#p4j+*v3{O>_Zyv0n+h| z*?|bhnTUBj9`Q(4Av!U|fv32~lSM9`;hrLX^|*K6w_%k zjwwYnoh?f7=EQ1ICdw(cJ683zxU#Qek0GA?95EMhQ0I#UY@Jxh{*Bnhi^UR(jx3gn zWr*mC%|rZjRsX6<5=&+&h-|z9k&SC*RMa}G(5n#}b*+qxxfMH?cZ zc8HCLS>K6hsNJGR^okScJ04;HaZxvmEr^x84e^#wWKSSk?04*YL{2?foPy}7I}kth zba4iYM6}&;_#Vq$Sb=ZCS?WgiCw2}C#Z{sezn+*a&Jt%M!fc3)?Mz<*jS%PH%=7@o z$QMI6o9$zNW)I?veh;%p5GCeLyp8ZjM4t^p#MTQCvvnt;wq7VMVw#NODx7eq*vjcg&z=o{u*(u_=C7kTrYNs8^n#`CU%y%nO%;!rMDuE>FweUJUKsvEAl^7V+Z^j!T7mGXDwTOIrH@g~V(Obkl>`FwzeOBBn?h_udTih=m z5D$un@V%Eu#2ytB^$A2oeF{*Glx+oM`Z6N5zA9c5 ze?{!rH^iHW|N55rJ0i*cL%f3st@{zl^=M4z3Ei1kx6C!*cD5M{PNn~G@uMOv{|qD@1z+8Ky?I|~tKOSLksT&vJ3 zwJNPzo1@Lu=4tb_1=>Pw5x%>)1ktsZA*S{UtwyWWR%)vdZ@V55($^qH`Z`2O-=H;U zZmm&kLImCx#7l2O#Pkkrqqa%w)Vj28L|^XJPSE;r38fs#6|i55vu>i{(-BEciH=6zCQ9G&b$w6k7#?0uP+$i zBhjA5cZB|=?bH6OJ*)i%k>H<4-1ip|`Tb?>6>C{zU(4ne|H1B#ysEM){a9Y8j!t!S zsbhhDEHjQ3s;ubCidDIcj!u_TwJ$S{k`M4M|FSN3Q(sTFe_2mkPj}0vpt8P>?lyPR z;6RIiS(Sd2DmjaTE1Ej`ng+XCJ6pB}RW$buxSN_Qv2p|8h1pv!eCeVkR+ zD%mY-l_b(@^HgoQ>Scw}xnUFsm7^NHLcWjb?Kw;bh*^v?BNB<-f#tz^AI#Q>82?rcm&b{!Vv)yN?SOD9#0vGxV#lF4qmR+{YkO zRWI_C)>Bn4@(c-8))hWX3svU}3xijT89Y~>GE|{rRj61LDtw8qNM3QZr3U_Gt?^Mq zr**pWlz9r3@`Y8_T60WLt;AOu$3nkauWhT8plYQ+m0@eetg0%s_DI`e^3?j;wy4a% zR(DgsT3Q{fwbEJj;VUY(u9D^mUghn6;Hu`1mcEw$j(+Q^wm$dfmf(7CrQWVs4R3XU zwO*3w=xSyCd}XTYV(V(jK4|rrNm=63YI8fRZqpbT^J<+*d67Eisbju6Dqk-%j+HvT zOwpH>sB$?S;bf|PnQ@eSfY0}LD+9UJvg!6No9-6VJ)ACm-sV*~OM;ucCJ1UWJ7aA& z2OU&OA!oI~h6WvgbQ!Z6-x~57#SVv2&ZBoPFHgE5w@$y{xL2YBCyYejU-gUG*xP5dR ztfNz{9p-qV14>(0bzny>eP|FLk<|N9A@#?Ks_Wr$miu?8esri6wZn8$rz^iGc;jeU zSTl=4HnsJ&v~+j6yPG?jtetYytevL8K~iDqL>F|C`O-AbJY6J~Ri#2fzO`F#+U?V{ zK>BfBmASkYX)WfmT4L=ndx>RL4PT||ZKWE?99Xv0*yS6;uH2%c+ONku z^(&QnRR%XjRjHh(DlfF>$f@tF_V4lahpDRdR4EI~YI$(a5zDILTp&3^ze;PLZje47 zgG^Pu$WvNRRlO)u$2>!l;!;p)?KkI9UR9woMqyEK|Co_<CB zsJg_uU9u0_K4z|#uTmmxu2h9s0S z2vW9_c5yn(^_9w5F71M{vP+S&OOdimk+MsXvP+S&OHoOP9E)OSE*U*c4g}f8r$|y| zQ70|ZNzHcD#HXFNDBDrdY)1vDe^s6I#bmJ2by_#5i(N4cYa6G@bV z?sS$_2DNsy4T1_+UV8ua8H7`*GxUVPo`II;#!hOGA0bQqxSZ&0k%;K_ZN2R+-5anb zyTLe@K1v(kvbCwx-L;|Rgh6+wo=d#W+Nn&0%V}vE{jwWcC|A@^AGrC!=E`!NqFOQW2DTEB=hFSa<&;PCVQLV~ z@y?ds&cXh0Hx@zt1ShQ@AG&pI;OE_pk0Rsdz%$?m2Uey{R-2Sr!R##>S~wkYP-rybhj>7V^!{)8rs|~ zXG?n{&gh%Mn!7Q!eHd_AjBf6hGhCX#5whr`7OY0>z^S><-8~TA+$|}La@b(6Z*{U>)Z2_9jWy~Kbew{bl|BK)mD8zsG{z7 zQ!9!>u)@G&diu6EZf({JWDFESWsQ`KQV>c$RB#Dz6TOS7iRyxCvbm*?c!i-gfvS;F zRFc9~tsx5oq@?wCx1qIOCStuDA?qczj)4ERx41WNBlglBXk_51nSqN{bcBP_WI0e` zO32odp@EF^MS5us4toC$V#typ$(O8j`4UI63>;dUIB+19b@>u2ZI9WplZ~xFBMxtpV_^31*sdNgJl!hRkWT3Ctw=1KOqxv$~YxYIAp-)k1 z7%2s)F>j{6>%H@Ow%#GdH$swAL3P)Q7{!n%46T!>=I9=lKvmu@DmQ=O4D#v zYxE^VmJR=w1w|QW7Q90O9bzPUtbdO}s-A^Pq#;OeH`c!;iGft@^u9>{)-A1u%BOc; zkCzP0anO6`9R$61if@FZrGnw#CPH;t7e^F^)=A3D(gZ~1_0|MgWmfq3_vi|53!RzS zg5*dIU{#%&ERhr+|CY?m3LpO-T_L+=__wT5q&ho84o=i?N$S6T!qLk_qn9IOy=<=| za3+@uLnGgFlEV7p49d|0qkYscl!#L}DaLEJ7+Zqikwosj<`!y^k}ol7WGaCA2JzGK+~FWdai`Ss1;Qs*dWff${cODnGi<@>;Ag zza+4~s{@4Yrk0S7?#*VwufG>pb(W^i!A3tw>KpLKa)(>7X4$St-vV+K>3iBZ>h}&s z`lckx#n!HlZakT?_O~<{t@2c>yu8A|mi__k0^%N1@+)xZx7hi`<$mowgZ(WMi(O)Q z%y;Q`F!}m+nk!%3aOJynsrmZmy(_;$Zd6xSS69aQ+=lwxj7I5b-}}}mRq&z0okV~C z2K^pa-oxTn0|?pHyr*^M>)QZMmwvB_quf%$QEKgU85^GZ1}O0Qwt`FF6GmBT3p#^d z-m{`Cw-KEA>K-}YSrjO@g_?T08Uy7H5J6-a(C9Mr^{pM0bsqWZRy5yP7ASY9d|DKQ zw)gaGayRyD#>kj_^sT&neap|8uRlS-u{;EuO^q#`JzKoQt^!@SJ`7GZJUA-F^=E0$ ze0|pwM>$M57Sg5#bu72Z-QS`LMY0fPc2O^y{q!X*_bs@53l+YFLf=A}EQFa>@Ttqw z`Gp!gbULNExh9K2QZF5pI!Q3ncdJmZlpB{iC^sb~7)YChI#Mbi!C3dUm%lb&FMo?wHX;QR=kzoeJKeGtyEh?230e2K6uu3d~f~*03EN5R%WXY8L$P#B>i=!xiyyl3`k9P2u17Z8t-duGs z;NaYc3%@*^CAR;1HbvKvytH_07QN+$I21R1!C3IaBG{kvq?IhEz)KTt(%c3uKobs{ z%+WMw>okaX3L4@T+{0o^!?dJ0&I?w0TPVIGUHl_W@kN`VU}{6$6G}t0WXWDc264V; zIPHBQ=lgqQIPTbBV|YnslGy^KjNiJqD}<$`rn|w#pJzL@s0!a9lt@nR8jkD zXODb_HJDvKn<*X zQCRurxs*oIUG}UFjqJn&fSHJ^Alnxq$cIqB2!B0 zW^CFrsXWs@XJ%_-QE5uJy&$to^u%Qsr;RI~7#wKN$x9kvmYX;;z91*FByD=qvHpdKk1#6{J~Fyw&R9bUW0V(||M4NH%AR5Z+--cX$t<%myr$yp_}lhz%lTNg`x z@WXr}rmEfWIGrXD{-D#`8Y5{YgJztUW;*rKr1>3!$AeD^qBsSOqA_H_BSAys35i%s zM7b2{ZK1DjWA(d5mreR5d-=k`T8b(AhG?@7Ws(N|S~xPoUxJ5(vm_SrND>?)!f*^{ z-YU36TwFZ7B23f0VZ8K)!ix&$7sSLShidlHmU$JWbJtAb*|pURxaf_^Oi8I;kvF$* zX-?6!-lfY2X3?xjg_PGJB?fQWVYFizzD;j;IGD{(^ht5L8)7EVTv!zef0N!wqQ`h5 z&51ws&y>pspg;+UZA+wEIIn(gs{GO4& z$z?@SwTz;=5U;~yeNB;6*GVe){B%ft6stopODqlX3kbmH8?h)D2B(=w^Dr&e_?ym8 zIlPbi9sZe@sOe7{NiNb~@Owh?l<(!ZhL|(oq@k5nr@2k{y9m%sF?y==A#3O~x9T+E zph+`nMyB&e<@E+=$TvSDiNuY3Gh4Fb^kWve4(q--R=-GCGR^sOXidJ#N7(8n97+UC8J;WF1a*-g3@soiuS3SBObS~FrJf*ab2K~K9%786j z)aYEUQ~%LV*C+|PtUoICqZ*ydb?Uu}cRYAM_Z!r7E+=X_mwzkIUEQ6eJL!akBqSt2Kw$_DBQn88 zj7WgUB8teOj*2@dpdt!_fIDvE@&k3ynbDsP?vA1&3cEK?ayl? z2_2%rkiHkVUn>Ql>gw)(4Xd##i08WecAHI&GG@G!Qp;_S?Jr5&$3eg zKZ$=~D6{{@=sI)-Cg+_2xCmCOUJ03&?fRitTn>}9F}4f*nLF;QjO@q#lZIc%{?O@M ze(W2uR?U^2G#^lA3ty|7xYlHTH_`7a1N!ktB;z5A%bWRsHMc)+Y7=Y>y0WK6gvmdD$yi`?A+evuCHL`v$Tg_y`=A z?HuFxa|?pmMuz-)0Ykc1z})p`zTPgtGzRN^^f-427#b%zfSDs~b)+?D9MT#;9%v1K zH3^Js4KWsJ4e`GB{YljtfZ_sr2#PcoprAtm#bxS`(Qy!%cj~epCfWBu*Jw`(9v7n% z_lnVP!{{W}0jA0IouEGGs=*vz+Z;XT+y7e|NsEaH7}7Rk&ex*zhieEg-nV{0839Gw zMnGK$?@j0tKy6wJHCPAisg*ykLcL6bg7hE8{l@b-R%@jH4$%J{x}Dnm?*C1eXh17^ z2_FZ%H3sQVzE%_(%3_O}m;D}(mv0;5ELgSae4*0`z@Fxkexj{%nIE3kmn&OhMdJuF z+T9s{derwS7CT!GH)c}SOuA{(n;llWBfdDr_Ja-IJ+r$V04LJ>e#JSFdR`5>JAfo` zia{+44gyZ2D}Q7E2_H*=XX{{+)vMQeu$6r}?u0^O1mO7XGD1M8JDJ6Gt(MMfymRcN zEszyVZ?M@N#_(_db_ScA=%YcEw(%cX7G0dI|HuA&^kk2YLJHz7pw8JGlN-Qakb-F) z?cyH`+gDa`p;K|QQheT>^~8;-v|dVjf;Q+7B2>9K2ZZK;k&2D#@F|&mzK~9n4lybj zZ-*I23Ax7JZ5xwjkBJdZ(8HEwZT)G}C;elaxz7-Y9@+hhjR{$XEHW`mYVnfOpJIDP z`-k+$*WPu+*t2|y9GB}fq-FgtbE;|*BM3v zNnf(;zv`>B?nh1;(SP`DnRHigu^J6dE3N(0SbO)(?(yK;fR4`OI`VW6wCD5STyQR@ z{rf-7xd2f?HO@#F^SQnP-E_p8)(~*@09Wp2KMJZh#?}>tqu(B%fX7EM09CXT8Q899 zAO>$wQBvMq|M3A)*gJ#Dn8WJv*?o~*%-;xuDLKI(`mvm@9uX7tNB6U{U`G~M4ezPT2V zzZ+Nl@r0tlzXZ1Dt(lYX7MYFH=iOq*FnG%n`y4pU4==~gyn4G{g2M8tli_>!;?lTfkDJ@=os5~}J56@|=UL^C?w$vI%(yMh+kbvSHzLpXz6Dw%27@n; z!YZ_pd_Y^DNpBpHD(e?0%! zeid^nVVy7**8D<@Y9JqtR?~}c+8`EYI)2O*i;qG>mVl-H@0JjixR}Yu)-jUyT#a{EymnJJy7vwj7F2& zmB=_*|JejQkxj zQxWTAUd&XB9YvslzAs;l*iizpqo7HL*b#X-Fh#k#qb)>xhzpd$AeNYhIX}m}g6HZ2cWw&~ zo&xRVi#43Yj$1?R_kH+h--o2*lX-aM z0|ULa%44q^;#J+~+V>IWG?IW3nClute6j{}0VOa$dL*J8VNNhc-2ijl*fE&vXjhAo z#IDv61M$TpYfj)zwzXK{4}4GLlZa5BqgHqTWz=c;9Rl01hEm+C74+2dI|Oz9S}2O! z07{~G53)d*1Lb6Ryhlfy_tRqC`BQ^+r#T<{9OX4%__@Lwez`GkAqfFxDCId$uqPrb z{{ff}<0r3_fxYU`$#N8iD#OWcdM@Oehct6yZ-E7L6!v%ld3S1s9UT4k354FLPkzLI z1?k-Q>BabyuJd`WqiYEYrdo`(M zFhB=&+=I-K-~W+ZZ!}QYJg$^H|NWtxZo2E2?xHJPG}`hBFH%&Yx-q}~Rj0i4#wE8e z##3(zpQksPV*Asb(DZp*PkBWTcv8fc>=`@aHLz$LNbm*8oFNBGBsI9T$(0}+y^I^i z+90Vm{k4sIO8)v%>)Oj}li~1W6-HHK`&f3i5r#FgGcuM;G!sMb@IlWe=ADW+VfNyW zq`hZ2kLYf3eQQ((iZ_!{)a)H4@}^HFyYMQ!xVU@ay6ejAAl`deJ^=qoXE&eT*wJX5 zTzk(CV$HaCcZ~EJB7bpM)rdKj9J=L1aKyX};!B6-py|1?Uo?Q`JVggrCoUUdK^x)q zbc_YW``Y6?{>MX{?3S?&B~SB=?&!j{%;?U!tQ@E>R%Lr4x>J5QJYJ5(>g`}*D(}s2 zx<$69Ckn=;*X=*+^393dwo7*}Ubv%a@u$5b3ttO$_pRT3!A!8Ucv@ror3=I{lURvw zVK-aG>P>Z9!=GSNj{peJ~iA)dW+FC=}m)a@smkd zio;{6IW1&+G)oZ{{Wv0*UzHC^^ThuVcfvMrUall~SeQr-i+*k7gENG#plwnfB!(9@ z*q7vtAyy2V_byqiN5kQ; z)0-EBxm`2__|`XV8gxtuiRT$ml(?G3Ya&6ezc-_f&t`hmRFKQlNSN{z#gVO zAtb1HhIm1YdnbigA7l#v)~bdC%%`+*0fV)^4N;2s@R64Q{KGw~&kRPMrWMdee&etB z$UEkTa?D51>JIUC!ZA3|!{gw@;c;#d9^AHhT5m0yEk+_ANX+9li$)*KLK+7b4v%!b ziTi?^_()F-EF=!a^V5QgfZ|jXS-ovQZFUbEeg@NJQV0C@ZTa0e7b`XI94(i@rh^nghsBf>Nb9IFVPk2}%w0C#Qm@ zKgC!Beu4iBO7ScO(Mrod2&j*VH%hDC&-;MQJIJ=y$uX$q&K^EEe@w%oux90NY?B|u z(m|-CflL>pQ&pUpkEn{{^FfgHZ+y9^Do((W=OEzJcn|URQM4h?0Wi>dM|lqN7=Rzy z!}kM!hAerUG>RO=6OeTVl65*sUM=|{TWqh6f{VJ}eRuQw-nRH}difRo6no;x8}XbQ z5C00g-3DvUX~2im?%RI-YZ2FN{_c1EZ}q?Mm%m`NC`S7}sAi&wuF14)#5u>LC!k+QOCX?I zrWB{3y7I$EcHDaXmiwMzm-ZiLwf=R_fI@r(PNDA!3JFPQM#e{z6i36TQjTCW3JDmZ zkQiqmy$EQPLIR4c2?3=>RL#TL#VF(i=A^+~k2*F;9E$M{>5!vwQY9RXbQInsC+Kaf zQ4*fX(dxV6ibs$VJ%+M|356`b{LHPbH~`q+*n`I8!WT5PiaKHIzJVw zBlwph(Aq2o3|X22=1#%CYvbK~9HP5`xefda&O9cP4eT|T>tQ;8?h20-Ymsb{y|-eH z|1Vnkr)TWznMZW(4GZmF^_0ouYh}=na-5&VskI%cFz*|)EZa;byW1^g%f{taBqCWg zI>PjU!3WlcufdCIV9^Bv1HV($op1{4~R5ERc?mH*%&d%+wyE6qv_T;ke z>`W!-3}=)=uk26Gjiu(pndI(zbxS*TvOPCiv2N<*rb~Vt6W!72WLq#FQDSaWsIjrS zur(P9*OEzpYtOnrZVV;eMywXcU;Z#C2$LMr=5mqcpDZ(097t#ZbE5|Hn!oaum;sEY zNjQwIs=<5$Fyv`$nqh4J9;U$xe_#yz<+HLnBIGnI0=%2XrE0k)J}{f*yJsjCee^pX z{5$W!%IM}aj2=>}$HL2L0(3fzd`_ z1d1Gk5m97PgZ_+4zYTzX^!U(2eDqq_mlnjk3@{~2@U2d9Ev@d|Eg6j`24K`3cLU)XoAa88}eIjZS9_?c#5E{ zcxu2ySTXr-ZS<=})h+EkQMrg%u?6z#DK4)z;OybOIo{#IcgkU-sDR>%qL8qoK4-YG zJ{5_K?-+MwqW-)qIH{2Q}$<*=JvXnEBU^+ zIufB!)@#l7a@lUdFIT3Jzpg|h&WO(!aW+n$%^MrBdfH=h+eX6(`zT7n-K%Y@$=*^X zny~+3WV9PiP{kCd3Gpt2^9VU~IbS*5HZ&>-83^BY26X#6PTY+l%9xt>=*Pxl)@4Vr z=rtl2y=<^hFm+X9QiWl`sMV}cmB^q@Tnjf+k`ZE`S)$F7D^#PR1#3K8^o}kzBgxJ} z)*P&66;G-b$#s(s%){zV`e)=@$u)e^6ZczV)2B`M&g{kKJ*9=Q>V}F^-Ptb8*Klk; z|PF(1W@t#)o2Vyh26oqG;~!rPICLW0R*x ztHu$d&EHJL#!JEA=yWv0_Ari_PZ>R_6Jn-kv^q=yb1!&9z#NWqm>OUjgPlK#SOn&z!MssOnaLtR*T4+k zg*^=z;xxRGwB$PeN~S#__Op05bb|WsE3+DY)zxu{FK^ahE=y=IdpQhvw~Bbw7r?t| zsZG2aZ@1Id<*;ShDJ?rH6|8`;_0%=kD>_+t;3=R+EWAE{AcJ@)@&lbgq>4AUpiu0| z%!W=fJ-LucwhC6NgJ3%2rV%}J6q|8tsus0}CoA!K!WEwywZv!6?9H9tjrcM_lwE+6 zkNjUx#$yWxY{8swE;6<**V>7KfnL752aQ3pR9yKJDmLB+Zt0Pa(3Zob^2y+%sil0lT6DQaqlZ1`J5w3& z&Oljtnfuh}Xv`65ZEc3?Iln8M$$Nuig`hv*v}NY@w3??amnD!;r**+n^3ukbT<4pO?ygN2Np0b84 zGwrrRvZHF*D9u5<&b8`~&e0DfX9r0O|6noP!;7J2Y6hJ~UQrumEQoL-vP=&}+oPdS zWg?zy+j>|X*)XTq%a%kTXiFBoN+}u025pW|&i|Ar;!CXLz-YBQ0*2&~fI+DsjYBoq zyaa+MKL&Zkt!siIS;M=vXf&#>SmMLUNDGSou7T|U+L1-8j(a8d$T)uGVf>yZi&lmC zB;HLUwkl-NuEGvRBpY8H5m;PbB8f-iQoYF}uqf}5>5}`0S46y>*PHP9>0r^S@A%Zv zJKlJlcRa%$CyQ2v{xp0e0SmQ8-j>AWXPRK{FdeygG z%k`Sv0?D=RSHVZHdR3U~1h3KLwBA<%1FKhsxn`9oxUnvH4fEG62pFs~V7RSHkwIFC z255V>pe=u9z#GSV>JaAl!cSG!Q0TqCaS|2V;N($GMXu}q%Dw{o)(?*yIaX7lP_Ih~ zC(0}b3WLm89@i83z0M0;K&@u8qYS)szyG(BdmH{jB$lY2+?adO_{2Y~E6-(8z0pL` z=PsrVHiN-tH3kY%SG;9n#l=#z8aKG>(QGH#yI|wu%VuUqw|B>PR6TK@C+cDw5Q;PV zqP|c;(P&BbyGrk?xg9Fg{(tFUejV6PU&8!I#=)-hz-%vAtjj@(Yw>|yw`*W-a_uqE zN!6hB46xE?Wp74pa{0Lsa9b-vz_CRx-~#2WtLSSC2{`th6G*sV!rA}%s)XCOvYmZ_ zeO+(FjS@b(!%mumr2D@7UMWr$gmKF*;VcBQGJ$__^l4pTxN))sXsv%(WL3dOB zi}#11!y$9~x#yO*j+IXe<#{gEl?=sd;kUkZk=@+Q_fF0wl5L(Vb=U%}O1|5_2-W!c zmEE{s<^M_(xW#1;ZrhyL@JMax@efD+Ji4^5#lq zsa#&FR5q7qBDF}g8i`b+_~C=8SOj-lSg;d073J508>?Jny@SW!^e>)MlljE40*17a zfI0kAl56_?fYG8y0*3T}fVmQZCcw}*T0D@$=*k+*>z;XrU@icR7V{M2kPH>$T=p|< zob3Y{Dqu)r37BhE-?dNdAcnhmB;3+0YTAIsj^yh<~d?xDJC>*mtM@xbH?#2FZn77dl*@Br$r2j1Fg#YNB zz>5+Nu!UBxSm_82s0pIxX7n1ZLK$>wuTg?`2n~9TR=!7L>DFmu-LY~A9e?m! z640f|)v+#IGnN`d$?>tYtmb}brCzvRF}7fi8Jr}{6Sq8W+tKM7pL_-_@l6^j;u)?mo$5in|W z(E*s9gV~%5L~h}>gn+q{OGZZHh;t1v&K5ow^5O-|AOb}|tFaY<5v_!PdNVMh2n<2- zAPHXy4yBtFP|#|KQ*o{K4DQVdKcGvy7*bQu%$pH}S$&Y(FJgS+QZc?pQBs5II`4Z@DoUZQlrtNYe`#HNHjTXwh2%L;FU+ zT(e4FEt{|(T}T?QfF_t3IOfK4ga@0%6Ve_|4L(o7(PCWEXky$4L_~_#R&*s{-5ThN zxQz24tsr<18x-6e_6{fp9weBTg9k$tHL!&|Uc+*TM7D?;tgYUGMQnm2IFxYzjAnavdB`2`x5oW}4Y zKR)XhllKU*(ZBw?)UNc2{_lCW67{Cw9iSRc1_DLYx`j2}N-8F}aZHiY^B$WAy>Wz$ z-mt9rR9sN~31nJSb1{UE@IJ zd(AgqJ0<6)j@-s~|8`)12bWaz6Ec~<<8q2PPm}!gFJG76i@DNIM%@9N_rs|kfQf7v z?3nGK2yjrLG>TAv<)8u$w%;N~ctl`Iwx7#lfvh?TU(tcODzTuhp~Mkyf+M(i@r4h* zBM?ew1A$ydod@%zg27ZO7)aB8+m4+(jE5>!>9XH}w@UT6;MR`=j}Yo|>r!ss7f(pb zsYnDNm(eWou1&Q!n%{&KG}L>C!m`!QJKp7!(?siVzt3MQ8^fa2#~QGMt$CwQ|Ih2D zuQ_y{+U^4;7hOIhh5?gPkIzTcY00IbUZ3sou7_u(*0xZG)}Y@4dyuatX5~h$u}kML zSdr{DOUpQmVU-(1HxBGM>iMBYC2IC*Dci5xzWp`d*thSsQ~woNA7O^6{`XUhi9b(a z)I8SgKj5>MK_{;+XN^Rh&YaP>%nZvZzZe*Miie+tu7Q>jF=ifWMkVJ!Ia9kD>1k0r zm0xd-WjwxgKyOZz{DHLJ!q!`THW)@5l$bT(v$3yN-64lN?!(37o&#Sr`Y&NX&~FE^g*KTG__-@<*;GdM1n>-k;@VM}UJ z1OY=fnSeRW?KTz%j20nS!hQm_8q5tro;S^*Hej%yw6~Ei6C+*5{Xa%;)4bLtP-l3g z>lHpyf{&zSU>8<);LgSGN>%JjSKRB(7?-1l<%k6(1ghmdi2w3lH(r3O7Uh!3MRXG( zbY25z2#@*Gx)EDYNtG2lENE{&6LD?XVow)FmH2pG3D;)tb-On(i`|l5Z2dCZj63YG z#lrn(L0Tmpv@6xkQF>c?5`hCOE9n{sr*HV_ctNL}`%arEv!xN0mKl56lmFnGd(1I37F# zB=Askn*1Gz03GuV(40qr1hksd)YX6yB0$H5Mov@3U(IRi%78`$=y=dWlob}G=n3Ma z<+h@r8|fy2fyikJsMVaNm=zOHpoOp~uYm-73+429zfnW&Hxf?`Xh`#0eU7XyQK$75 z9$%q;qprYw4{6K6Q=mNMB2}DJ3sZD=30fbAbA*M-sc;nMkcBB`CoD{vx{b69s-S>L zgL(ZAenXKf>gjlR<=#QPoq!^H_TnKv)s+A>^fuxc8cDziymfWH7mtItfD(8gJrd|9 z6W#(w;H_&Mi#J)P0!HLZbydKKe5ppGPXk8G{|ZzbQxuR`g$L7ycz|qd0VQl~4y5If z#r(;}7BIrb<}g|gS#SwO(*Of50Sxy${ygXwg3>99)#lF(R-1U_=%)@LU##{Ro#3g$ zDvwC8Z{a7_Ym1&BW+T^5=4(l1wz*nQ-q<7LNm!jz}cwM~rrl zB~Xb5%U6BSm5qf9ej6MRpVB^S>9q4}0sL3m*_++8HRAP_Bazt=tHUf?Ex}6BQ)tEY zW|z&F+T5GpUHW-rDw3Fn6+g3bI&M#<2<|9lE0sXNZC%zSlft5s9OU*1tC{D=RGUgo zuT$P#8Kfu+bZSvtKeO3d>Ll}v?L?}xn2oeXU5A3Tyg%B`N5}FCv-#usyX1?`$W)Zr z)M+!wP$t|d|IdElE-tn@+eT&CS39Yl9500Il#%4v!3vH@bkdLqJzk1+IpSD0=5lL- zNWz{Ojw20YsAW-A6k9Vq{eKjiTmJQEJpHP__`kz-6qNiFZl4aox(2QR$Fd*M*K`_8 z#Dc*Q&PJlfuZ%eCB4u~AY$FbZfcd_*IVvu*Wk}2N?tKF` zAsBn!0aFm|i#{J2Oo%S=1s2ia7J}BW{f_FvQ8EWl(wPnM(Pkvu3ntNmW3syQ2NZ8Rq!Z2^r-h-7bqApI1QfF0#oFgFmMw z)G50=;ktgh5;rc}r&aOGeO)S`S$k#<^2b`|7&g&RMuV~h{J2QS=;!l`Jsz1Fu`1KG zTq|meRFdN-kLFLpDQT6QyF^FrSOZg$;*>Hu-d#+TcF$W}$>0Jw+HF%Jo|NAi@cAsx zVmqB_#mt_Fr)e57IjtUVH0F%OoSs}Gm0w@Ls_=PmE_}1#dFUYU{0xqi)Oeo5=!#f5 zz`*W61r&7SWr$$Bophr-kE1yPsDd0kBXpw}nRbd8`LGyy9iX(GB1X<=BLjwy%y9oW zjl5xoNj7w%4W1c{JWaIMMt-9h`6MK*ErXblcsuzk;_Yfom~bp>FxaQV1swqei-pGHb*+5BHP2wW ztNmhAkkam^*Nbkk#3)>h7OLCFCr)j8Goe^D>8_qaontnel5fQ$ zjf}5r_JlM3a5?R%@0#rIWq0kma01O^(eaYqoUTtM+k0E27dN6C`ZMy96c%}vxMX6c z!x6)>H!QYG_|dblS4l#3yf|YDxkzKc2mz*=B^ezZ<5R9o#?7+rBnwUtl+C!y-I0x_ zT2X&`sqhQ7x&M$cK6mzdw$aRtMu+?5o;$YgN`!sgP>_8ajG>cyDh@i}kS1C}@E|{G zW46O|&Q5$46SoM8LUI^i5ThR3yzlSe^uuoVXD3Dr`;RE|9r=skuJ>}@KOlWn%7Ay| z1T@OSE4K}_#YR+ZfPyNVLH9=9(I(fzOfnAmc_a9F7)I^HE%Q2<|6UylYe5zG{EY_P ztDnAt`z-WA9<1O#%SLeY@K~yknB!ypV0EnX)XMgf=b2$L8~{eSV3R@ZZ6-@?WXw$EQ9Jzu4GB?3mA%j2pBcT zQ~->YV-heVPXvrAPcn$`XgQ{%-!;fF5zwke7f=)t5F-t$oC%7%7M%X`pg(A)L0ykb z6eJ3&WWW`o>RrQ}ydN=^ngu$}?8w&@FlrWP6tmN^Kt-(34`lR$K%)_rUjIM*ZFH3Q zP*0qIqPN{EX!#S;6>?>mmPOz#MiMaB|Bgmd>r^znj~?mJaYrJY2yZdcwa@dnwT{J` zJUapN0M9VX4Zvs_B%=4HW%AL*{DqG$a~4=fTSuigc$DhARVXzNMvJ0ZCt~HuM;9Xr zADt15mIvc7x|V=}t`t5xd4y^&97^VJGW_a8+WTWe>rH3GzeebpN?4NIgB>m~K!v!9 z!JtB%7MvI649$h8BJdRcE+c+kLzPc)e-|*o^C*8;o^Fx9yZQ`N5q5GBU%rZ+Y=?HX zpfSsgKs*m(Q)!9X%a);2yjl?9y8rsb(pwxmgE8ZRDIGe%zTSWRr#dexj_#l8BVj7J zV8#6eWBJI!*BQJz$*#w69yKWbXiJz-qB{;stlh$)3}}&i*_m@&POh9|cbjz^EP;q? zVfPNkzR|yhE%ZNo`ts&x$hqy-w{K;|{`Y8a^SAK*|9Qc)q7Ohpd_dd(0*3asfKm6h zg8Cb6ZwnaOwE||aYYAv|*B<>gbw94Y4fC!8kFR0g)CKKO`{iTL(xi&=bG;_{X7B{m3JI8skKzB#jhGx)S=R5<~td zDx&6Mq@&ZH9q(XyU}%E4#w(L;UjkWBi^J@*MsiX6UT1V<$ryJp2TvN?dD2^wAN6_1 zU|3plAbohE#O$>*YPA>D`=8s;kq`E-KAot{ap6?{il8#26(mCn9H&uPzz~%M%#}I; zgYrp@$^wR{EMQ(Oi+EZJK&w<1P-Kw_sLT4=+q5h?hvD**V2rx!rK|aVl2g&4Gjhd9 zB+E{~S9Pr+dh}-|nI@b~^g)?i}j3`yyYNZ;6!={7-#y z+RE^^%4Devn8VKzX3Phe?m+Sg7^1m=d5e%vG>%4d>f{FY8jP?Rj_$W3*?$w}m?ox}DhH-#mZDZa2VKz8U>>D}x@I8U^N z`oGG&uLId%52EqUXq0L-NlF#PY0&jnoh)k6&2l-pk-K;zm@>g?Tb_uDX$Lb5+VXG? z18>VS!eISDcec8{X$=BfYdB=hwxaI1CsK+!m2xUr@g+iYnd*kzI!h=Xe-AsW|9&P< zmJ5?{Cd+kMW+-Lzg)E*-JJXyDxP66iAijD1BiPgSk@^JLvxB+N>2(><(vnFgU2r9E zj2*ZI$3(UUn7?2X2VweLbyKOdsao4uDs8MqsZ}Bp8O7H(bF}oeU7gOZn)o`Nnkg2i zQ>p1{&PMI{Tl*yEB%hnJkLY0sl`&s?KjYF&>U@V|mleiHnPo0t6B`liXw8QT^&eK}bi;5Dd~T@z8Fo`affY!7@;URgTq zby8KmA@lUu8Oa*r7zV4mk|>UcL$�qnEPT11X=ckn@bDcNSYq1*MY8OvKB(de&^F zLop1S)0^yOv(1=QKj}+XgOso}``n|MSYcx=*&Vf7%d_RNT}^Oe1C#h3*1`gN1?Rrw zFng#uyVO`?J}ot!iIRMEN3%8e3jLEU01-=OwESIVT3n3{pl~J_`DR z6wh|gNlen=@fP1$Hdw*@Gqs3P&bcZIo9VAu+^LMaw9tx|?TZ$HdtA;QXF?0U8Y&0NUz(!{GRy*geFD%B;K!tOkO&*`kRV-!{<``{;Gqd$b zV@Fe`6yk1gvf%Y(k`asEo@yp7OV^xn(K~iTV-%2bU_o@Y_{6C*!IUR9aZ+veMdP#H z>_j#{k#SS%KE2eV5)fWpaxZ9ZrwT8ys{ypOVH#p@T#T?K$qnHA&RB0M?Lb$L*|6#>)~>M3Wg$uoMmz0|6vfh)N55%`b*5LG5> zib(Qok0>cw#g(ns9lNr9ft^=o#^j zw$p|6W05F&w5IpeTQ6E~iABe-!gj0KR6F_XCc;8q)TzYlDG$;>o0Oy{(p(&^Z0W=o z4sN^R13O{otx9vNM5pFq4hBiGWql*dQQMlnM4^l!{eaxxE2w@>E!Ya3K&CTkP{Gyz z^N9t!tZACTS+PUSlB@h81TsITPux32K{v3-b0>KDiJKy!SC?1*$gX0C4MrKp0j>u2TmJh1 zQv*Zr0slV0)4-nMzb{L_XIIIGpbUtzz*2gKCFM);JLrnvFUIee^M5C*;(5TolK&1I z@%umH-`~XHiK61)ua;kh=ZT&x(yOJX*%k8T_?@T;`~ZI`|97J0igXG7{jhum{+%dE z&p)lc4|K#nQ1RndO$vEr8%~{JdY}GagiM=q^XE-|>^)i+k7LiQ$|C>UA9OyrtK3T_ zdu8#pQ1<4+;heY3&iZEd(XF-9=VniDpcQ)V^jdYt=K5kTw^-l21Cm6g2+q9m&s%h` zMv;)?8uNEh8QdHZM$E5v*$3l$S8bTg74^-nh$rdu<(w8A{$eWlm#W!rGTNBSUQ6c73QLsNwVRP()Mmpu<)#rs zB2$QrWfGH}sT3?1nDK0|Vz5P_qep!{uQ%JY#hM4Rgv`%dbENx7M;}~kxe)DC!-WfU zanuHh8Jq@5k}&g!%)CEElF)7qx$?zWJC`g4&8~q$B+FIo(ZmA?F8e*{7%m{}N*+-daN^WY8xHSr6M($rx#2)G0q#T=bP-otSObm`BO^QHJPexHaXajlKbW;FTo;Yi+xY?JM4wU?NT?sOwwnx=C=)qR2c6DEkS zYSHLK_Mq3OG6)dE^`)AhHIy3zcMObOEJ25#KPoaBJV$`@YBuH|%AlBT`e5W@tYft4dBElMc2WL;D#kvTAb(#nHVlMES6!MMj0b3JJGM;wlT!{N7k!Z;LfAf>RUu(zYIzz_N= z0)4)6M{T7w`VV^>h6UDc)zqXt^<-kg&zH<@a#_-4zdIYj>8MKD=TAm(Hen-`?WWSx znYqPn8=rQ03s@|RS=LpSO5^Ji-drS*a+`4ng*OnN$mXU}XKq`*hyl;7IQjS!sKL-l zw)=H5<7X;@v*?WD%j&G#7!AuGir`;8E1zP&kUt6;mxYzwnGfL(N24j7Hlj4ZSS%Fu zka{{DG=d%n+Vfj3N%Y}I{1K4>9vEnIZ_eA+L>soyuvk-ac=1{D*3)vY&rcN;N6_Vp z2Fz*qR3-)^KRXt^uK!j-iyiu#FH!D)vp<{7w2FD0nr}9HU6E))DMmu&QZ-zPa>RiS zVg4k?+zlT)D6N~1!yPc%Enct7XEm9OR;w`>2)w`qApe9w;WL6@9?T*`IT%&6j0_Mz z@`ktOtJP~y?LV~^(ap)Pf3di9(JQ{j5yRyU9IyM}cTG#Ps8Q<8$L8nerdtye-R?|p zd~9rbe0+NSx^>=BpDx>IWQnc_@*-40KMYV3ROTU(+OlVw^B1q!##uR!Hq!v zAERw|6e7W5H@GaZxW5z&B|Rpa;&3G#F>fPK8IJ}+*~u2m@d=KxQ$Ncm_)3o_ixv=@ zMW>4e{2{Y0Z*+PrC}gtOV_sJ|6Uv&5`Bbjmf1^r(SL`MVK$9=8{2DgfD`Cy}V9h*t z{7*FN12B+^18wib=^@SsUDCmT@X&rPr1Zcy89Gihn8HD9Q zHl=2<$tcaH-!<$2fn74dj%@N0No|-wQQN@`ta5IN@V!55kkgGMt4%dkTIsY?c3%Fc5kMDdy!thwAdW#RetK}toj+oWU9ZCF% z7yM^4V)x?;U)vasg5lZg`>&4Y+%WFsvoZnxA^1t=Q6TE#$wMC^(wB#TELfLqA+>oK ziUR15YeBoCV|IFki33AZ`l&CON%~yzQZU~Qpan{As`*=+#@ah7N-~>N)@M|5{xsLj zr?X?}KsMs=2Vwpi4Ea)@%junQQ7KCXr*D8ureu1JgzOi`>iUBs0Z2`$f#-Ce7 zGFc}iOOrsdnixWoN%u1k_R}@kPp11IT0vXPMbfGFq>_GXw+mH3Cr?`4S)0=TqnS76P|k&_izil zWc4cy>Q2UJ>|{DE{OZ^=BwmdT_sv1Or0(vCqMXwSLvZ+ zR_WC%Z)fk3e*`IOyWec`Y8a^pJ_IPLhtfRuhFzC!SpTY>-p2NBA~ChIb$;RMJ5E3S zwkz|q;jL%BbaL{gFWwd*ESE9fTh;Nbwjq0yEJ8#Haf2H1b`3U49SFAh+GG zr!%kwXYIw6Z`2ZYHH$y-qtoTT%pAF*dldADK}8Dk8anyV`U$#o|nQNot2~` zzlC&}!6)yOUJC9nNWO-QQ8}Gt7cNL{?RqR z-4XW`vNo&R<>N*ZjE>wfp8$^?>;U_)d)YQ_%r_-LehDzh`K5>~rj9C`vnap3y=wz0N~Qg*GY5 zfcW;4_q@Gu>ESoN`)&Bz`%vJ`rB~ii6yHGcC5-W<)iKa4td4OWSGmfF_{MU@!~rl)Zcu(|sHZs5|j;R_AY5-%I;>7?!_npg5FI@^`3% zW6xa2-o`GJZ`J4Jg-?*CSvZNFe;l8tVegTZf~ar(G0?9?*TiIMy2p3OBe>2JcVNo$ ztusqw)nu~T*i8HN5s3=$x-VhSeYj8(-aYY@}ng z>L5J>uqkhKr6GI!S)j9SCRa>56Uma8dzY#*bMRrA{Ba*3B{n;%CvjjTsNNA z&gI%n8G%e-_pm$rXRzo0c8z?Vf78!?wyFPzNx6qSuO24=UN!PDc{8L4DvE(sX&%P~ zNQkc5O^E%DjOg`duNczlcC0X04Mgg5*-*Xc7?1DnZIYin;_u~7 ze$}qc7jCKeHcUqKMw8u<4rDf*-J3ppW8MQ}ya^GDTXF>Bd0S1xXDT9$>VS5e?!NQd@c92m*Vd&|9fiw?`PSxfodvI4F;+o$aHz@jp&C zBHGTZ{2R`bd;_A>bC6K$=kt|y>-?E)c6w~iQJwcJnph&>^e6mR`gMLBb7Sb(?QMzK zq`Akah5-N1o%I-1E#fEoLv}yee|{hOIs*8S+>=hb<@Z5-85L^(Kzm3{SHO>CAsUso z2<#RLZ4v1GO?IvwDC>3Zd^I$_m?>_o%`*c_wrig92pci`f)VG`=4|n#@nkKiRI^j@ zqR&^X_jKNLa7O3QdqPg#4?X2>HrFc|a8fms&BnaWm-J7_juDI7X4ZYdGuj=^ZE70l zE;S^|h)G1Or`@9qrhMKMY%IOB4&v&Q@|B=X4i!_=IEBIGot&JWu7R2`ArDJB%$`h# zIxjfFjdC>YgQ#y%`Ht79pjQkxxhrdq2_0k{#6(+E;D07t*Z=&XXuA@QR41b0Qo`JZ zM3W6&y^dLv#h^Je>QyS)U@l}2*3uKq(f`B5#JR!7=CS5dO>srNKQtKq{Ut}tfk3F) z8+SDe>k6g$JmuVLi+T2e3CP|QVh-O%1z3mrC({l`&RWsyOGYdHNHJ`ohE@n5+9&x+ z@>!AHU4SDsj#ItxO>H}?>FGoXa;FRipMr0z;)!jT`iJ$FDSHvU!1k7{F~5{8Erdg6 zi_MpgMaQd2^I!Z=GWN~DeU`>jS;?i*nX}P4{*sfX5UjLLP48?4B9Vm=x5sJm=BGTJ!Mz4m4Z2M{0*yp#P{z71VpxK(Y`=`6ThQrge7V-t8=h+ss@bK#&F5}aOG z>c}9#W(gpu0{$bz+-QUYp>xRlLq&H>{b)K~=m-S(W1W8unm0Vmmkhd|=50D*s zaqdIF$X9_^WAG^=Lk5O3{Hkl)a^Vz9jL*)7%Dr;Jo=34!qFD&kOG!`lIlW%;{&X;c~xt%ywx~lVqf-YxfYIk?fU27EZ>AO zxt8;Ux0V-H{)hbsZZ|N<`+1}m$2g+Soivvbv4h6EpGwap1fGyVl#u7rFDr`EM98)3 zD17SHQ6AU|(vF2nCk%5?<2ePF7ef{)Zt5E%11A$=r}pp0-@oBb@APadr%dNJo-@r3 z^j_8b9sc%j1P*2kE{`?`^3%oXy_1loq6+X|c@`!{o-Bk(C}egry+a1RKI>R=$*qLkZY?emg5B~u?KoyQfSPADyFT+Xck=;wxZq@HE zl`5#|u@~({+c{Nx)n>Z@Vsx%Khf{m$}!3l<6iD&Hc z$hd{!x@@L**zFOo%To+oa=Ym^W=KvbF?4*6Sj<6>%WpONmC;I|7)mv~anyJkt!B4X zaff0EicZ%0&nEL8Pd?$250n;))uqw?S8UO#+NFjmi)=JH-2ubJ*#fFR>n=BQHhvNe zw9zB#u_Nh{*<;d4a4vksgZ1=S}9r5Fo{(TfgiAUsEv{csd+>q8UEK9UO9nGpUSG{jQ^n#zAZ_^_qJu z?d%uZUH$*C?qt8%;p{(dj~#QbC40P7+F2^~uRPubm%tBEB=)$v_Y^59C2?lQ2=<>J zJ*RU|&h>o4_K-djf!i z54Fwl!{$)P7S=EOIS!yv_=!ikOAFQ;@J2hJav{G^lCEAOi+=odRer7K>tCbYD)~Cx zchNtOy;I!o*@~}^7dACg>&MJ=yCh5WdT)b~&u~rzmrXdAyFBl=CX=R2##5iLFNZw( z<LAM?^Z+H>ZVhp@X8Z-9qQqV?PH-(NQp&s%U|qOWSB$3h<9Z#g z0L`t7R@|f2NGYJ#U-b%&A7wi@vx&hF|PQhOkH1Pw(cEEblpj3XJ<7O z?)YNyPTrpMb)#dxP#tMXs~hI#xS}}R4(}TI;*#?4lAI$(3%p4^lCC5AWrv=mE8>!* zcp+gSWk{~V_Zq(9iA2o5oH0FfhHqc1eR}Zhb6LDt?Emzb%brG%mnN>dh)Zo&%|vYMjz~R*jCrIMi`MDtBB{0V5_XTy4C)+{=RdE>mYVPI z>26Z6W<^PlbAi7CD3~(1L08Y&(8d??Xkb-3ANT57 z;ZOS>LbJTyB0YkDX&9b@i(K4;WTL#~^4iyuJ+ldTeoUsbU7WBQps8JccG!YDyePa2T@`i>BxzwNU8NiP z83E3FJ-9&wmpphp(U{vE2~#-pZMfDU62-L+{f9$dUzmO(yPzsP2s(Wc?=vDxq8}My zgf-6z&`u$-gL!fhb8WBpElii<1X*ge8vP&59Xpml19%)ZQ3QyB zxkKpKWfDT)=%3Cp+SlKY!M@tKXVaDMde_{XSQR&-9&t?3lU9BY9vTkzRUCM4;CpWC5Rq;;U4I1}#NJ$?VKZlCwCeX!UpAD6*Bb&8^%hcbT<<3;@=Y{R>+ zockQ$&O#LN&Cr_$@IUGsaM_&3m(Wm@bJkAgzNE8o%z!AX#O1z5j#+s5S5d`s%XbR8I zof);Z9BCc;mHjr+K|~@Ho$3u2| zIOg)joUE3eO6N<(LTW0P!=sf_J~@>yBs>Ylm-Nu>H%YfM5yZ6wo+M^vhgA4A4qwxu z#(`&|u;bDWCIxA;wZILS4ulw@f2&b23Su~Li;qYj@N*Ust1E=rmqNddn5i+Y$GK^GasJm@jF!CmpC! z%x!quV4O7=LlYJGlKE4L#*yBLAo;U~)9H9Tm9kkq zE=!6chkMn zD;})P#EVr>p8s2L0cD zE&t&N-(iK7Qy~f81%83lFzJj&v#hr;E6SQ-13`Vj{pGmqZF@-|r#fC8)N0{NUqUSU z=D-)e>SveS-NM3y zw{+}{*i-zjUEyjCsuWRaNre!FsBBPzdic=jH_UhuT%0$1?2eeh5b>77O4hHl7VDv4 zHDh6SxtGp3bE|*l|10lHprowse82mBUHiW8Rb5rxRn_}e-9^(4UCoXlf`I#yh(rYu z9vW!`CM^mk5ranD;x?1jEGjBCCKASDOlI;l&d8WV9hVqq-WZRQhsJrs1N-au```P0 zRn?1Ql5=v-ob$TrD(b7d{_lUk_y51@2hF8=XXE@fW>LQ%O1Z)gdrv$DF(1u%T=k)N zfB&om)-Xk9Z{$0m}^j@CS;!>yZ|~BJ&m-8s;FwBZX_&{n(G-F&kXAlS<6V^lFC4A;7hk zJoLk@e190$KXi*3zUOo2x>-9rw_p7xb0rbc)RRngCzCx1oKtm#JdUu-9rWpt{sX?Yk;;tcORJ@I(8ptI7AydcUa;J-b+EOy*Z@~N9gwr@;fI`6 z@^DPfE;tmnVM~V1ILj*Q|MQ?!t?y?qs9%qF#_=!F5s!5wZGML%V5iq0ZdtAQ!tS@@ z3v0mP47^wSyr#l$XR*3jsteL4Q>uq+7t*GP>(!!2;*pF-QqJNhe#0*K#IHztHc9KC z5gGU{a1SD~96jAltsQMfD;RH*3r_tgPGz%YW-(K$(Wn1!%kuvE`u^oDcu%MCo}JSX zjdskzVH^JLzWVB>EnC*nH+l(rFT~pCX0n4+1cGU9dn~oRuz7P~JMH5wX2-zihOm!5 z0`30q@#JFmd3J|}zV-5X5oZ*R@M|NHcQbspMrN>{Kq#L-MLTY^^D6r{v=c)dDi|}3M>5cnBwSh| zHK)Ce7| zldX&nw7b<`8lPfEJJm-I+SNDR*%Ap+z$XFtoG;)bTPy~X*^CrobZmo;kpMXKOa3qq zY?dsB_1gRm-46$!Zn;K2U!Au<{rmT`6enxLcwVcF$7q@cpJ7%C8S=gm?Bv(fN1igO zza#*$mF%ecC_#v2><8H@v=jn_expMOLtz+^QGz`(2|~kxG!~0Cw%Kpg!(te0i9R%% znN8ZjUc(s>0iilYwwQ6HTn&WQn^?%ClngkM{931akU+#*j8A>7ldU>vXBizrRL!AkotnLB(1wPB|7Z0P$B=PpslFUvjr z{lewUu#UYu7JR&W!-nq1gJUh%T*Fsm7FHvSzC4GW1|uR(ER_Xa&!Nxbdk9TS?1z(T zze9~PMKrFSS_fH%(^|LzdM6-2URRt+v@5d5j$aqdUap{3_ENCIS0nW|C;(30JZ2Gq zq1v-=!wa$JuQefNKH}a( zmQd|n@@0?7;jq-XTr_r9S`Qufd&d-;mD z02g)-R)JQ7u)I22?1~$Vh>T#&%#U7@riXM1#G1&Z!NDzn`~zy``75UNZZ<10kOd3T zdnc@eMuuPZGC}UGE8Zc9ZBlQa-g}(|>u%8&z0&)79V9v^UitxF1FA2nTi8bvDM*}( zM`aaRfgh<`9wlxmzJIauJs9;WPufG@!&3aZUP9V6QwiBI{s+ATYn`#gk?{qU68}6? z31#EQcjzVLFV9q>E_&*J=_Qo@8B6^9RH;(p-I+=lMoxZ_O0ZV;kupOGWG>J~s`O7Q z!QrL!>+q6>rnb=I8B(|KF2pFLUDHeKnq1<@^b$uVmpD1S#K}n|SpU=#SU24Cq|X&A zxNU|K+a{G5o1w&5r35;h3XRpk)RX!^7(>~qC5BOgjm@1jR_Wwa{6H(}77ld4jQ2CS zgx-(7F8FpPh-eE}v-$=N(>W#+U5U|-FQ{T7=4?VK?c~&I5Wgr#CFLX3Prou|hQkw*Lc?Fu}BSiKLt|joT-&LNTh%6>U0~Euo zP&j5pqttpwS#920-_4Ro{Stde`3KO3IO*hr7C`5$vr-;@jt*Edbjo2!nhy`wGGrZC zEu9T7(#6p9FOxP(n-Sl-P1+%S0l9>3!a48#$WnQibg%TF^bP4dl0_g?v|G(E#UU}BavsbEPcsXmO z>i!FSx^5-^x%4mh27jfeli&<)|9%LZUUf?^R<{TF&4 zuKgM57-|1p?So-@vb*D#?Ju z{TGVf6l;8{#XZfoCVjWsP9DBnKg@gW%E&rj=ZnkA1}M5JEa z`uLw*E5cwpAQxA|ygB*y+i$b~#0!nET889~0r@hhAQVhd776)y`TmCUm#1~OzHB_yNsBGAy&5NkNu;9*e77Tw95Bg}cH zD$57Zho?UH7i%|PIKAtVgmXUEY9}6FcG{R>{lGpwO6C#}^bQvbmh`*Kc zf$=Nl10y3N$7$q%3Dw|w8Lj~$uZrEourGx$XWWC0-gTJJ@`y%A-1A@2*qvyL{*I5x zW`fH22>}slggwGF1=^dn!tO^BBCSEb)@TgP(A`=+o|SCxh$>Sn@`;ac6)h1&w6W28 z`45{JlFh@M5rg7w(9tH$i-r?eG{W|(A7UuVmT~jQaWN1MRXz>@kvhH+sx7gY#v=48 z)JLw%)(I@pM(%;;0+{$*0f)nDM~)b63sTsn{6N40(hZF&#cO3LERe%A(G(;{?A2$K?edzrg#D zj?!nXk4f-DAH)jOElQDwQwu-$lSnF40iT#ZM|;#6Jbp|}LMe_Psm_CQM-Dw4FR2-y zfSwp3PMwM|YAs-tq6sb;I7cQ+$dA(xlSG5w20@X;j1I}`G$~V&Fap#1AYq7d(1wvS zXOdVPXK1%wgDuW$bNHIU*C1G!1}9Myc~z=HMPM8HrqL6`=&U!OwgolEPk{dpAxdft z5T3?6;ez6J*U+wAyAB=456Q3H6DhWp`%HMOpg3~EcZ~sIVlKN;@NIJR$Va%lN30AZ zO4B_?q%ZK2SlbgIlPTDTR3SuPRm`oS-buK(Rl^IdypHD@^>WnH@nR+n0xfU~6bMA4 zkPdNN)5obvR7g`yUwqF9-=}`h_Ex^<^@#^5MkE}fom+C|kw~RqNI-)Aq2q%igE;Bv z2IT)mgFNXf{=;@0=d4IC#2#S;`YPzwu=~P#{>xWHtV$ht$9-6pBYX|1rBvAg-zOrC zC|@RciRSv`nO6idiN&G?(-)1}LNi8Wz`bbdEAgkJ)1gBbf&iyz_6p8P9%8RlW&_Wt z8L>|AO$snzHH9#*G3Mi&OIu2twTYmG-Re=y;%nM05Q&N{7D5Eh{i_2e48u^5vXc69 z>?O@o|DOF5{h!tv*}sTW>nj9IBkch-IHKumj1qi}5M##Ih&Gch6CTsR%45fm9TKF? zc^qa%EfW8R3z>u0$&^CTy2zw09H?<1fFSaa@?ghX`DTQ z-RPWirrI`ZW~0-M@W@T(`&Mf$XVv*WT1C6W_c1Y&8^m1&-xBA$194OplIF?@5L}Ojk`J|_hDwYn1GM8syywQrdEN^=#pu$W{iWi(hZnJ zToJrYQ%9;?k!VXu9KqW#MP5~-Xw1(-Hb_+@aEiq21Wl68Peci@jDjvTZiHGk)G}Fd zMYoXlG)LmUydLjQ)YM_hg|Swfj~2Q5wOu)FtYlXU84Lx3)&l+MGDyP-8flIACi+J$ zzJ`1S4-JygJ_24md7P8#kYO`z-MO^qBClH0G1CmSnphDok&hkIWio-MR`OpC4rYDa zXmSyeVx)-B=W*&ux=HkCvbZq6a%InjEBaF--T8&ZY~1lc0Q>7 zFhUg&gaTB+8H@ny6XjQ~q`I)Yo)t||vz(5Pvp%em8y1k&f(53e4Ok(%%U2P1waC3k zYnxEsRp-_;L8Fkc=2{!bh6^sq+Zd*!EHnxnJ;D}BU+qNXTy-Wmc}ddqIHV`ZHlhe{ zI~-xg0Sy|9&bdi`!Vcp$q;wSWv+uu>pGQ$}lKdne?#uA<-UuE9?V@a{GvS!3nQ}bR zc`c%&RYAEIF zS|%tDT0{k_rs>+6=0n3EmIC~zm9H6TRnn8e%)g&B6a9O(SN~pU3W9HPh9)FEBqIHi zj)yY^dqJ&($GN0G4oNStM3c|hnXIcrM+~;fJs%EkF4bm zI}-Xza0p;~`;9k$;eHb@f-~!ap56(==;srKy+#?6;iJiVnm@_<{2la9eP$L~lh8~4ifRGLN0Nabp?nyf{oV$5oMG;p!p&4o#Mt~P+ zRLnKd8V?5PZp7{3wIHjDl}9u&gLIl==W(cU`CT;=tFnz_t}yB4Q6cj=x7J{Tbeen) znncrj;}Vp{iK%dFwlY?dFpy2Umx=lzDM+iJNkZM8g>cao6J55=EJX!{35gFH(l1XqM}vLLtQ*HGZg#6<(x2Mdz#4PcTY;m%x_E}k9z-(s95q0@0>+_yOH(K8_@CQ+o z?1ozIpz$8Av(}&#=_t@5sZNc@gZD(nfhK!&i=&3GP!05Nt0{}4XZhashEG=Iqj4UkSmisy%Eg>3 zTwS-#1h>|VGkAO?-J?!)0MBa;DRF`p7Il@TeF_XiCA{Htp*#e{qxr1 zCLn`aK+7Nxa8>nDcADP8kn&menfWoD#yoy*l&#he1G98%L8rbz=) zQ?rW2$TdxaQxwPfsS=Xgwz^e3RX$Pp&p(kDh1LHziG)3qp%wdji)U0NQlXsFMJ9jk- z4CJG?A=bibM!d8Ezud{AU$8y7bv`BDD$qi-#?QUz8VPSlF+OEPuZ%?PuW~8Q5pzw zY@G5I*9Q63ruzJ}Jy@h)_xb%TAx|n|i6U0P?(^C4_gC8cr*F|7NJUf8h$G}m$73m8 zm+EVOQ)XSl`J6Lo)`iXmvre1)=ggWS=|%7dMST4Ev+fH;Es>PRorpX9zFC+4$tz}n0cA|N_q?n za_We@!PyK2P#}s72?50aPfR%~-%QKsh$q}r*743yTF3M1G5e6s5q4tTrjK9dk^BE9 zp9{{|gg6&VENn|8kf5Ds*`#b9w4JgZVN;~N0m_7v&E&HpH*0aOp%-V96GKHs z{gF~C$J25&-`3U`N^~aIw$!z(O>`x~xsLW+_~eR9yX(AO1=%6k#SOj9jrq0#M3N^; zr9^KwKhTzMZ0YYgB8F`sYjEQQ zkKLOyk$UB#lPA4(o3`DCLioBhgMa+nL`KxiByQWbsm=?{2{%I^6738rE%_c#L>x~| zOgz3d0w&kp;(;?|SmZS@1hU0;LnXMT2SI4;+WMXpAk>iy<2qk@OBGX@zLYgvlFz80 z)zG&V%|U8YD}ry#~4G*@BQekQnJ&3SEi z&pAImx6~$YOI~{DzTG|FEpF`Cbp5>~mGFa158DxU;Kf-AixmwSxvU{9rwn+eJi-ld z={vh=V}9#Ri_h!2yn8|V%(bV>+w*%~e{^2wA3~~{$Xv1Sdla{!#YrP78%M4osgc!; zeI$RL^mtgnR>ZIg%NC)g6k{67@pPS`g$v939z3t(oI7v$;Eex~T@xHQqiFB{%=f-^ zPXDU!9K7&amU}$1`MHOdP>XdF?5yQO~PS;o~XZ{B(Bz!}YFu3B^U#dG^_y6@4?7QU^% zIZEwQoY+f%N4GQ=dD;B4l05;BCy>Oil(8yXTO|ucwpCKV^4${35lY#nC~^$pGC1C( zBkNo_#KTF&!5VM^&izOvRZ^}8I>Z4c%$vkJbt+?)ow`FP3Y z3)3EVmp|}3Z(&}i!QWcnNN1!QaCgkxSc!Jzh&Wx!mIJJ(t-hFY&NUkr1(mHG2FuoV zEYlFChRM<5FVy%M&5I`v6M=CQbZP=>m5`Q+&?D4HNsjp4Oi5YX%>-V@BgfcZm;8Nm z(`}0j-gHMi+Yrcg$D0N-xGycdg>*~Yyf|(3CWkn{AJFs&DnQ%{AqwRiIG!%9y2D#0j&-u;|BC7UbdnQ-# z2eL628?r>xS$Db(ceA^5t-$p1#1TZY-UDy2dki#VMet@d_7ZMfiXbI}E9?0~<2+o? zaODNNW-njB_R5K_azo2$?c-Vbo8uP{jto!yPh>*pG~A-gXf ztgnx@&rRFiW;?DzX+cUdqdihU67#;6<~g#_=5<=_CVMaeWQ#jI4Q)wJG8QoUXEo-A z^MOLVTQ(|=h|eC#Alpqi?6yVX^=h6=H)Yf2xYb3{CU$;X-$$Z=tnVC)?cSfX$hTdm}BlsxM?}4a{rqK6`#+Zr(ZF zUC3q_X`Qn)S6EU?rTUgMH7)6*_v@M$H`Vtx1$&x(uq~W6gTWeXh$K4`Hor4b-*8!B z(S^m{3l|me-rKUg+>Q&`XRl~!J$-g2J$pqP-qVytN1wA3ysA|yBSsc^A7qCsWH6O7 zH1oD_&CK&S7YXZyOFR>@U<-)6XE}c8C{i4=lI1w*DTFf>yHg@%W+VpPNwSzST zbCF1^dDjC${2==0kC>4xd2x{L9eD>NlwWEo2e5mLa||}0Tk(1&7lo%NIEqJ!q9M@x zA&cN0PfK&V(l#&K{jC)xz2%dWs8R-7d8eA;Phe*!d zj1n8LkiCtAZMptN zuctogqQA_%j%;s(x8?k$)`(Vb|H=F5~rvRs&NL`tzigT-omt8Yo8 zzc7&NU$-)GZmKQeV6UZHg5IX=KL!Vu*TBIC+3a&EidH)gJwIikjD^d4SfhPT;0ep;di;SzLr?5PO&=> z(aGwz+MpehpoEx&#`-$X|9Leo#zAr^KhJAc^7wFs0ai|pq6(`=PyeKe$IhXvg7ZzC zJAzMt_bf`7Pnq-a8bpAw9Tth-VGkfl5!@T6j8@zD4`h#V{C8|!bMtADwq&X!hP0cw ziJ;jT^Z8>gSIqB=IkC|==7n2q*$s>NIRfM<;-U&W~gdSv_kQn#% za+}l?`1rK-#lpN*h2hT)st@=VBJ&`kb>LQ|79jm&A*e2Qv{K@0R=&9BFzECE2t9$=r4r`SzKv>{!gg^1BSS)te;)XeiZqkY^aSxrm$l@47vOnOGD&H_{T&oaZKhF+`L=|l?daK z5Fv;VI%L2>(w|CXAjhs@gsqiKc*(O@)CF&ju`9>e67?yza{M0HYT;uRjR zN&CMZDJpf9gSd6Y7LB?smXO`;`PSk6`wMzlW!*DBvFs__dv9Ucp8F{T^8UgD$zQ()X{12!TY(!&Df5sC)@{7( za(g{av(0Wbo9axsTb|M)BT*o!eyeejR|$V17!iOgAZyCc!Sw-q3#?iF)y^{`XX^iC ztGb|oIqRSC1@$GPuNTo5!4HaaIpFmNJia=&)#7m3oOawIXHXz52ra8U=5fJP+SF6i z=UxKkjrTFLdScVx)pS9JAf9t`qo z`VJ#i5{~VX6@?TSeEmMl(`fVr6p#Qr`&ZZB_p9BHJ;okrQ7>u1YYS}Suw-Vhv*!^J zHO%9nK8xt5#pQHn^=iu{fx!IvmW|Qq5|77{UAgkY&d&b+H7za3pG;R?ya*to6UbTZ z1s^pQh$np8gJ+L|cH5g3ED2gh0LS+93w(?qIZg3EfnEe;_yw~kK>1rChWrvMSOXL9WJJu}H7@uqx6N)gKh9?J#S#=Jr*; z#TQyv%!;-|qeS6pDa~HMiXo$yG`ox|eZ5AHNkLLk++^)^x!o2x04x^hen1zVN+?W$ z2}sKHBHnh9nB<@x=Gz23GPnnE$P^oFf>WNA_o*LxZ@$?-T6jKs`T7W4DnC~rKkwe? zE$7^M^g_p#TW#m6L?=~?-;YQ*x@*^2YE2;$f&w7~DdO%yasePQbH$6)16hoOD%`1L zL<0Cyt`FW4v4TzoSx4U{Z-Ltx#9h;Vzsu!|$9#hwiPnrePWKAh94U`C>GQ^8UY1R= zF!w2x0!|ldIs?~5Vwq?p8*T4%C;UNv#h}@0i-&`$Xgn9=)ZHdo43Dy(a84rdeUwT3 zKta!o-TVR;J+&B5FIG)X&h}OklN+EBS97Y9v<*tda@gVb%Lb+d+;-fG6fk={ZoVXL zz6u0?z816+fDYcE1>!gh@^@hi!sH1-v~#C(ZyM>>PpJkKEAc^e1mX7IyW+ z#qYeM{`|?bye9qRzs`9G8Qx^+_K6=WtC1guGQ6kDE~^Fk-6+X>8R^1IbT%@IESKcs zb(1*TCNhRGBo?`y9afjg^7zN{Gq;G8Wol_TyI?umEMta8dO+8vJA29daNcK@4}K`x@EL!p{1H)r^}sZT?te zBG3iS#iYk^-$xg02@l${JyW@gg1k3|CnJ0ho=HxtWEkRJ-(U~xOm-#kkA*U>sEa)t z?@FdR6YY&*cg#cW`~>ZEYV9!2$+b+Sf|Y{eh4b?{cf^$mG2BR<=wi=ydSdQyV|$`A zmF$Y6m8ax(c8UB9&GB(ua!V->F-NT12mR-tA-8{(dioWzPNk$|?JO5UA7-hgOOL*e z@83Ya#s-X}X61+J`-a7f*^gf*duNMWgdKJd($pe706sr2H{p(pTk-h-|NJ#}3b^q- ze7=K!eg&V`@y~ZkAE5kS0nP{Ir}6z=9ER)I1iMXs7}N$IHLd~10Vg6tNM@cZg;Wrc zwdLl*&EcC1o7qHW-@eRM80+P*yzZ0_ikjp-Ho)y^;5Cu{lNiEkQdzS3Tail!b>)Ls zU4^=+d5s)px5{6EW{}(BZ)6Nt@;9Fo*7syXyMsTB|_4V>x>79Dkuo^wz&wIW{ zwlUB%^h)5PaWq6*6vP+drz2M+ymvxU=+|VjvL^^R=68D?j)<|*+Y}2n2IXr5A$P!M z!nTUnV{tm|{#?lCO;djtV=cdowah6ye@eFQ&h<3kt7SLaFW<;SQf1#`hT95*-t7gHzG{AvO$< z_y}f5N>Npd`iEq=!lcxHpTeXFlHZ*eU>Flt?g74XcTFT%3tFWUvJ!(TN9`^&k#`F& zRaj-@Ar86I-HCW#J{D>8C!gpvgc>6;sQw;*OS3nSM61^zEB&n#KgD>j$9PM4vSVUB z+dgqWp4^BhotVLPmISvwn^QPnCyc*09oUZZhspka8k=^z5)2%=T}jp{99>}8+J65m=c+u1GhUQTJao=mA5rQ=vcX`F9i zH8h?@7;~y+S$%_VAX`5Wk9#|MWqUr?mMmnm&EW<==B;rp=$$dibtq^ab@Qfp_HN-$ z)AdO1uBd37$n@6~jW&g$cjFZo_IfRGf44g_SANfFRq%?cmHF?G8nJEs43U^TYVOiGO~Cm)|1qVgIBw<9nns#i%Zj_p`f|&?G51%0>7T zDYz@WKX_Mix4b`h$-0I`X!#uZHg-UXpe1ZcNs}M7_yq*zO3M+ihJDZ#ogN*?jVYL9V6*0>MlZsVV52Yg-N+Uw~Aiw!b9p#Pf}K{vBn2p2N9h zQg-4L<864p9?yTSG|+Q!T$8c~s@g@q9;yRC0I?vaa|l&>Dg!Ckg!Znbq_2qd=Dz8DvaYppc|eGKOo;ZNf4{te`zpUv ziI6_1ZR+Iyxmo>tYSSkoy)Dw~J899x&Ej<&5?WM591s${H)&6FfR#Eb_2Y!AGyLNs ziM(4Br9A#b3wa@px?A04BIMDPaK|nVb$=tAf3I>mXY({kh2Ol{|8P;t(??o}aKWKQ zm^zCe%7FXSk*k5L5H`3+&w(nt?1AYy)CJdF@zzu+n9-i<9ux?`sGzeD>_J?xT*OgE z_8M!4<3`0H?My;x1dgBmmJwDIOU%PdPPA?uN63Cc{$Ry*6s@Vfnb7&_I+I4;=HjQ5 zhL(GrjS%HQ=m)SxOlX(1Td3HN+EZeym(@dwhn}iukSLT^(}_-XrgL5Ds^$eaR~6uc zKO?>*0P*VhGZIJ=5l<$)fP3T5NDk?b_yGJF$t8mjAB;aEL&ylkN8!)NXtDzF)#P2^ z_sDMGJ>(1EugH1eZ^&if@5nE}zfyZbsRMOH+c{BR#H-OT;F`2PZ~{%h`9zwGcnVEH zya8>3cr)4z@#eGz;;ra%;FWX(@Y{4V@VoR~T-`!HMf^BD1N=F?0sKAv9_N3c4-kJy zA0qyU2|}61&<0FrXc<;{}E`vDJ>=)-cDL@UXWawPB=IUabT zoCZ8gVr!i+J;wI6kB!ZGG*0yoeb z0jrV6^=v&GeO~=4)Aec$3oFDoqm_%}m|5^XisOvfixHMMCy^q-5*MTj-hFWzNy-b& z64yu-e#H_u5pTZV61OT9w;`c?hUL6%skj|Av%Z$|_9UFuw#3U34_2`_j$+#~M@t+t zBr{p!jJVQ!mN+NY^rj^)o|m6WVoNVt&TIJUov_4pVxk{f;wIuuw_4&>$j8z?)SCFw zahCHoB%C(2#BGT`tzwDWksxy461T^^b<`4fAi-pjCGLosG1n4zBB3PK5_cy4#LW_S z!OUrGiMt|3NK4X>^dae_FKIvqBFrJ#B!e`;*}gc=BU#8Z7v~3-N*PGvkuDwSdjDn0 zM9iB5jU3{UXAa5y%RByVx>hJ#AC&g*rf-7unMj|HyZ)+vEs?edQmR_!{$=XM$h8OQ ziF*E3zRz3Z@86S(oU`#Zp11k)TuSO*68>wOJg@WfCqBRb`MHv(v_;MTUTsu;2jW{< zo7BKR54|B5clO7*JoMH)#B&h#!`U9V-i#!X#-#WudBlvP;vQxutq|*uy9OI=orP=J zxZ8}oRZq-9%~dbV#F>1=GZD{4d>~pyrEP_N+ZbUpJXxhJowKUl^Bk( zGYLTn6_`tv?9b0FDNQ<70_nI<^@wi3>e+*Ftjb}=IrZE)(!z)jM4On6{_s!R=g)1b z)*XXUx?vb+L(vKf2cbr4#0D9yRRb#|)l0Kc9yNN+q_t7PzDP63a>vX1WFSU!=^p-K zyF?=YVB`O?yUj1${XBIYJijs8q0UQ3!i!J+a~WRtr242wf7Dv_tl|-7#>^IscNT)W zs@|mD!^`e8ljgXqAJ%nQXt9Av6^E8mZ%g$^)xZ3ny`elyAMRm!pZR#hCGGrT3m3O< zjh8;N8s<~ALRBkeS2fETp|Czj@F~TCj#W4zb{Gv&WE34uXVL=t7TrvD&=d45y+waw z6__UrWMQlpYtIVU9`*q{#=hZ#+j0l)%qw8M<;R0~2#@4*_&UCa?-%7oWl>wy7hOaK zRzmsWuqcu)vXZPOYj{|BIC!{wRPylhsOk~mQNyE_M;(s_9<4k&cw~F@^BC?i(PO4Z zp~rlWB_0pWHfBe28FP8FhuPcgV-7ZlnQNO9%q`9R%|p#o&2O1kn%9`unKzlYn75gC zoA-LTc)59bd--?;cm;W-dUf_%=*_$}ZwGH@?=s%yy*<1Gyi>fpdS_LAtLl4IcU0Y5 z^+45+svh(0}&NO6;Vedh;E{n$Q7@N52d3lFRREP50i(jhpR_L53@%V z4}Xs!j|h+29`PQHJ<>cnd*pZw@fhPV!=u1xhh=6R?ci)KYp!TE8|@Hkj~(8{ZW*DSPyL_0X49m+jxhs>(Ws&1*ez3QH-`>TG4 zcKCkHv_C)z>X}+PXvi6=If??sRTVx3nfT{l(e|SLMUkb?@gMnZewBa2FYqt;=lnFQ z!W`*S`Ulc<09+`Y_MgSSd+!RUSVFGXD7o+2{p zB1VZZVw{*F9?QO12M?1I;aU!Ic}!3ZTU#8{R^sZ`=U_RDbjWeDwnbf2KW(#t zduf%lrdky(56?WPHPZsMAg!`CO)IBGX=SylT6wL4R-nz)W^10>0km2r;sKgA5Z|3- zeEnJ*^La1KaD&KLvJ$lE8uAX=OAezqd_%5)8vRiV(R{Q}ZJ`#cJJZQ@g`z1zMIHkU z`8hpLZ_}UXuko(eQ?U3fB+iOx}XpJ;y%|Ua~%)|w=q%|o| zoJd(xfq0R+m~BHbCw3ui!4K&G`g{zTNyd>0WGR`Zy-pUBW8?_=7^~i^WEHDV7t$$o z7F|Z?(Jg%SyR@6wPJlRyY?e) z^i9I)RN_t-6HmGdw8}bC1?zD$`kxG@_r8R`e^o-a{zC7P98eH_>3!0N z{zm%I-$@?E>JVB)hA~ElGS&G@ZbK7BfVlm?NdsK&_jk z4XAYod_SC|vn(UMK($wql@-;F@2WrO_8Kx=)|7VAUPeeO83gJ*Scb?@86d06FzJRb zuvz+wd9s$6FC)bQ86_6V+9FT7iqGX>aZU~q+0t4pl6AxzvaWbj))R|mv{)iz#8Me6 zmdQBrmW&t6Wqq+iCV;B$C05BKv05gJH8Mr4l?}u?*-)&Pjl>4oSZtI{#M`o|*d&{Y z&9a4fSGE*e#CtMTY?ZBL8?jBc729Pyu|u{OJHZ=hC3eXUVz=xl-j|)k9@$y!m0iR> z*;RZX)5U(-O&pLJ;-JhFhh&yGEW3*%vIoAWJ;g^dTYM~giBDv2aa87rPh}r*O!gJW zWj}F3_7^AR0C7s@iqB-8I4uW?GcsSCm4n1enJC_o&BYgTsQ40`2yeO;)a^SY0Q{^t zP{^_L2nnIvNfU6hQt8*E1^t3_q*q9P@Un90Ba%;_kl~Dz5#VQyW;$8M{K#9Z8hL|N zCX1Li*~r4lCKf?)OidlHDwx9Au5iA=a3jXPM*+)|Ffa@9QG#K`yau za)b3Jzp!DT%ol*lUqo!^Y+^?Xi9MY|9Ozt7^#w%G*N8@^6P>;eYJLWhbQ-Bc_mg_` zAgND3CSi0ZsY!Q}2>L#$MfZS$-$lC8>!dTiN@g%OGK-ZZ6PX>E%pAxRa2TdCCo+lI zlLA(r%mMddE~`Z5F%MG6Dv(cEDml*Dkdxr3e#X+sY1V<9VI9dS)}H*pa>@5>0J+KX z$ZeLd_0Y1l9IdC;N2{mR(duf^T8h>{OVEvIYDT^>fAgtq#6FEiiNU!s>bqnMUT3xA5KBjrsZ%c%j$91AR<&>P#zv z?^%<^(Z+Nz9Z$D|OL>nLVU8}#D&t$zl67X;Y#ZgzaR9*a`L(yTR_VC)|d+ zaW7t-*W&TK32(nVStDbaiXzkE9PSa>=hq_V|P*f zAbyh-q%THhjBF&^$_&|04wsW$@TFtRqYPH_#TWig_y7h4D_14?0 z_gjBzea`x_^=<3lZ6a;z+cdT5Xw$UOp4;_aH)wX@5x>uWdEZi3w*yOVZb z+g-E!!@h#OuYH((jC~{fKK4`X=h!c`UvIz7e!u;v_UG&`+uwGO4vr2L9DE!?95NkV zbC~O}%wdDWE{DSoCmp_axaRP)!yk@Tj;@ZLj{c4{9b+9EIks_3cg%4d>^R5Z*Ij;bdF-mYI=fbK^>Yn#jdpF| zn(ErcwU=wYYoY5B*Y&R7x&Bnfxr|4dYGuO9#FS}RrgfP~WeUnHF0;1GZ8v|n#%^uh zy1Dgn8{#(JZHC)sxA)yXboqcHQi&~8@ab}Pj}C8AM8HP zeTMrY_f_tj-LJUcaeq`+E9+b~p=`6VX=Ss@_Afi4?BucqWfzxSTlQGlFUnpi`(xP$ zqvFDf zYbtK3xVPe`70*??T=90r-z%|7c9qIjs$40kQdFgcO3f;zReG<|zDf@~h=+|wFlf6; z9YZzU%#@vZ=C5<*t=` zR~}S(Y~|^dA61c69II5Q;!`E0%J?cXsw}LsvdTMEc2_x4)xTl3*T65;uZv$Vzd?Ru{igfP_gn7ww%<;_Lw+axzVf@~_p{$0 zU~-qM7FjK!TJvfhtM#llx!Swc_Eh_*+UaWFRQtZ#uhpLVTlu^C2l_|)*Y|Jg-`;b$yr z^>Wp#RDZ4dyz0xVe^vcz^`ELg3N!_}1bPHk53Cg!AJ`_VbL8iuq9=@zmm zWLwDokWWL-gWD27yCXh~_`MddDs@1kuMy-Ce z3TrK`wV~FIT4!s08%ZKHd1E^KZ!gW`EBIQ z$lsz!lwVYMR7_OEs1Z?*Up0Q|EY{yLF@L_Nbd%cVyiu zbqnh*sk^T3*1C7=KB;G_=UA^oJ)e3Z_3GA3uGg|&r+U5Xji@)dUO~OZ_14yVuin0T zpVYfq@3&|YZ4>Pl?G;@;x>j_2bd%`z(V5ZxqK8FKjGh(!M)d0Fccb@2KZ!BLxWstG zgvPXp=@gS4lOHoSW@*fhn1eCLW4?^}F6K_m!&njP5L-SrEH*l}L2PPlm)ME1vtr+f zT^+kM_Ji1?v7g6YioF$kKTgCs#FdY$8W$W_CoUC^OkSD%PV(;LBgvRMjIQQZ1i!wak%Qa1HI-}{Lrbn6{Z+gF3?Pl4{ z7B@TC>`8Ok+`D<5<~hxWG@sCXR`XrWziVONqI?UV7NIRhx0u#qev9{7eBR=6OPiMN zEn{1DYuUHuo|YfCJlpb8E4Nm4TcxzhYc;ynv{v(4EorsB)eo)irIJ*e)Ox8YsjX7G zq%KX}kh(qfK=)VAB&?rr;V+cRy?x4qH!_jatEU%OWAI<(7Z*RS0>?Y?R6+&;Pey!OZ1 zpG~t$E0gAxRy{2|Eha5Ftz}xLw4P~sX`|Anrp--ToOUMddsm+4%+bMwx*ofmgr*ZEB6^Ie>}Bz0-pC9O-hE;G7((&g8#L0#K*o!NDM*X>2W}M!GfZ)}~utx7WLE?6$Mp*WIpX*k`z9BxTIbSe&sg zV_U}Uj0c&OGOJ~_%IuQaD>FZHWagC2gPF%Ozs&qD%O%Srt6ElgR!-L7tZ`YdXD!HD zk+msnSJvUId);2Jb&=A!RrQZ8T|g>!-J0xJ~#N=!QT)5W$>dRe2DFkGDAFu_ztN#BymXVAz4H6 zhfEwYcgU(C+lCw&a(>8zp<<}xQ1j4wLpuzeJM`4h>%-WvfMHFCbsE-tSl+PV!)6a# zHf+%9 zjwn0AJfhx+1|wRJNFOnJ#NrX_Mr<2#WW?DKmqy$faeu_qk=jW6kyS>W1! ze;oO6lpN(Ws>Y}$quP(k8kIk4!l+rJ7LR&o)PaBb|1mmbbl&KX#yE^=KW5>WQ)6zA ztv+_t*yUqSkG((6JT7ru>v7Y@Z6Ejjc$e`3e|h}933Nia35gTh zO~{)tX~Loj?@c%{;rhht6I)H}HgV9z&6BiA!IL5<#ZGE9DR0u$NwX)NpImeD*2$kv zzBc*s6!$4XQ&OgMo-$<0f+;(voSbrf%9E)sQ!7ucGquIk&QtTIj+y%U)J0R*Ox->8 z#MCQOe|xR(YlmL@c3SeZb<_Fupy^$w_nkg|`mE_Ir++v7!Rv0XcX@rq>lEjUwfq2OARa|-hdM-@&koK?86aCzZ|!mWjS3y&6lS$L!H z=Q;Wuzd23kWX;K&GiFY~oKv`qoh0Tkf*J57RdA;Winm2ad^mz;Bt(^DHyxsE-%{w;l^LZEN-I(|Dyod7{{`T|B z&-b5Sdw%Zxwcr-`vE$Hu`CkBNM=%BKF3Dvlp_lLq;I&Dv+)Q$L46#%3XQ4VDg?ktO z2cZWsgIi(-_b``B68=i?!L>l7sf9ACuoTcBlW2{a+OA|A(0NE?6(p8@Y;iMJ#!{C$)~0m=j2 zn?IGSbQwiVscXro%YOkt*C`zBrrIu7m4}@{{NDj2?RZxPfb)`C5`SfQkL2(W_tF-<6bD!{{o0W(oKOH zqtMjK1xK;ge+<%4r++sN1HggYOR5{=tyHMa(Y-}ai$fLv3%G|d2M`!b;%G5&Pt?x^ zeG%cyK!lV!uf|UZY0MIfp1ulr1=Qs~2x242c@elP>G5}f%_X7#0!{H={}+INO=>A% zt4RhVDM7D<)wl+o5TyGPh%Gqo_#XyVbdv#SD~!{(@vK+Dd$_g|^?)?AI4ru%Rw{t3 z%nmX%J0na)s8hS5M}Sp`R{%&rTL97&eTy&zphLQ(?y&;Y12F1bw7LYqCC^~(k+%w) z8u_YcsJvC!k=8B_kq3^8ex&Z0d#aKQ1(q^qu+ND5vv_g2jca^IsWi}V0vG;&7NF_# zPxFLEta|Sm76^j$BEtgl2s;8aOW2IgMt#30Qonh`i7tcO zRE5vMz9i0;kwT;DYK8U43m}$Zy^)T2LqTh_e?Nq6unzuT0Nx(@<^VQ|WJAIh z{7QHq*H02(Ryssn9LD*Ge+13{QTq8PQ+3cF3M$|^({cPNSchx7kmfSds<0H$^3Xjf zhDMNnHbUGEKxp}*4G6seHh_+RZa8-hVJ(0igIx+j2S9y*2|5r|0p3-1X@EvUHlVR3 zRB;3N+Tsw$0_*E+1*OaNVq8Fn_u099sLy`^@Z~5+Hp-^!N%>ySYr3D61m_#o|v2*Z)jX`EY5 zZ15c$gf&|PJ4EWRgU};G-r!ldK+~fPuaD~qxPF1e<5{-c8@z~t#7#Y$-A0m4*(fVu5cdF_ zAf5_n1mdbqP=6i_Kz^|0s?9GWRBZ|n6#1b2&|U!sSlST$0`s#rRBdGeRmYNcGD7uS zyc5+P_%>7q4ep9HqZu@N9Cto5DzKZ!K>lChVRT5#0g_K5_)Wd z)O$1Phj(Gn>(O}crD*7Xp%Gn4Rd$qQLf6gi87)_cygmVKmw~oEO?u$n*ud&*kfLFE z7}{H2iuHmC2$DwL<0WT|+@TD+r4cys?7Tgt7Ek8nGnHK~q1nPs#q+Lm8L`>Hm~ z2F(k2){ctCENMs8UaH&*P|uRKGD5VIdM~O?@LjcIw#Ij?65d5!hBikVhoKGaSqsp1 zyHLgzMXNE!CEh_RRu<3QOlqiS((6U{VF#J|3=)wx5bs#Muf-$_TE$tQEklrBD&nn0 z7-@~QU0dYEcthxWevj+w{j2wh@~|8dh<9Oy{DahbS>0pM5_sO9*8ioSsp5sCiSeuw zx+n(ED8w_INn5NcP*3ms8s#ne6^ z3z#jTXQ|K|abI$l)C5FW!kTO{+EYOD5x~GZ2Q(s&p?&KM7>D-XNh;B1MK=K7P)G1S z>Hyl3NhRlC#}rB%KvTB?beEfwx_~k?8d{Ul2s*U=@~}qXkHBxu(jB^9pLJ&{FOQ`VI2^hWO9`gaHWiNg_E4Udu1Y_ZO^3Vi3lV zVDbg%ijw-lP7->~jf^};pudeko(Rbqw8Mo2i=Y_KZAG}ywfO>&IV$fjs)z$x%uE* zb|)TM3xshv_Z{E_zMbm&3G~b5BtjG#X{mY#jA4$&JHZ^9WP#jL@se{dhS5l)Ac@5y zj~L?57l8I2TXcb|@u9sQgO97dUPNQ1?7VUa)?l6mi&O7~w(0M_aC|`?3L`qS0pw)?_F*U=Cn1;GiX3 zi|{dEBH(?1s_$sPA%H5+Kdj%s)a{?tsh6d!4G_Zegea?-4*+OeqkgKLRa=&{pK1ry zUaGFDo%aKl0p13z0jNAwJQYw55QThH`_Ba=V{WR8FbQ)}5axtv>QCZvtnw@Ym3PUr zO2U$BDty^>LfybqaDlzv2|O);B#Et9OMXJKU^1Ws!dmu9B^O`0_}lSfS(Cz#36md%=&$s)KIF_T`Y zEgP9hZCGO!kuu1e!cv73Ni+gWZg}c&CuLFV@~~Q|XxQI)5;O54-mgsW_7Bs${=@Vx z|1iDtKTPlV57RsR!}NClFunD^N$+ZTU!v6edimS>kjVJtmS$2A-zvpSUaOzd+DyhZ zX@tJevQ^7?^S^nYW&X|cU)Eogh10A03nlhOzoEqTmHo%&7559&RrS%5I+yOFFMnd? z^z@v8bZbUvUIyKik)D@D*Jfn&=}+G@@Qloy>>hMVX5W5&=(z5==^1ngPNdV^oWA*e zXb$}0k9<8)r95lAZ)I~!F&Y(C z^D-qN23B(t#W+HLZ)ss5%H?XpGq{P|4P6k#MipHA(wl?Ap26i*Bqk)w_ z9f~)ju#JJ$Oh_#=M)5oGHO?q2N=}Mr36;XbI2!~kQ5I>;DONZV&yG~8KqFNEFbu-e93_Rq9yZs%|3XnWK4H2#Ne zx7)6Tg}`>(#tf!e>q@ zZB5(IwzM5>Pt#}z+L3mmooN@^m8R2fG=pZ+EZUv+pgn0e?L~Xj9NLHWrTu7sI)LWV zJUWo((?PIR8A6BBVRSehK}S+$vpt56rQ=}1GJ#H{lV~`+=Zs>b*%&sKjbr241U8XP zf(^?QHWl8Grm^YlbvA>|WV6_8*tHb0IczSQ2Zf^r@VB#wy}{mOi(&1ulr3X#vE^(9 zTgg_j)ocx0%hs{=Yy;cK-e#NFJ8Uz1mu-Pxo~>*f+s<~tK4up@^SloW@x8E({($Xg z2iQT_%p7J%U@83(`!Mgv zqV^0w3oGJtuqFPIe+BE>^RO%ahF|30@=N?Ozrw$Rt?@P3+}_~d^B?$4`0Tk23*}sU6_QGuogDLR@e!9 z;UFC0?Z;WT2v=C|xCwVrR+NK9dj(NZR1zM-6Ba#Q!W$OuRYXEe>O4F5jgiL2t8xGugI zH(*b66TW_Kiyy@u@ss!&9)IqNU&TG~o47B27Z1ck@ksn39*Za9DXj4!#+FQS_ySrW z7sBTF4Oks7Htdd<%C}&9yh5&&tK@3AMy{3XN-kSisRxqU86iQ(Y4AW6I}=EO-a|ocGI42faRtueMeT5 z73q7@Lz?MUSZ!9PJ7g^h8$H=UcBOmaA1R9-lD%XOJpzlce)MBGSPrJ2XrF1H(W97? zi|0f2T`BgMW=k}*1f##QuYu3wEJf=*Pv>l;qmXTamq+0v3V(P}Dw$XDPU>mCnxE#c z1;DdXm=>&d%j*^Nih3p8L-*9p zus!qEE9+JCs=ANvtNZEIbbmcSudWB`L3#~6SP#)d^)NkLuc>#`JL#SEE_zp3s&&&d z(080PFAZx|*pmAY2Cq(`@Szr^MG+fiKS*q0!QF(|!ya%oafU_vTH*q$_VvUSHi8>T z8SQ{}fVdg{pWI=I`!lHwYuqQqSI3Wp>Q?Xw6$UR*9nce>)tI?b9sTB8c8OhPSJ-## zD!az6!>aFl_5-`gZn4|!M|Ow(#C~SKz|!wmc8~qW?z7+71NM+TVt=s5>hA4VMzFZ(9sL6xHaqoZMhw{hffGcc!hB0F5H!u;cncWm*wSndH9K_$SZLV?#a#E zi+iKjR^e6QIl>oSG^%lb9srxdK=_fU!GqybBb0~naQHH-1@9VByf&|co?VYe^B5k> z<6wDMpC|A{p2U-R3U9z0@S4L^0)aW{tn*^E6OeWJ-(H1gO9cy zd?#!wck}n*VPr4g$3MXMJ-`q0L$I?v!aw96@sIf@@XGKh{4yNpCwNUQRco!afz@O? zt-Y3}b+80Ds*eznri>CzGeEq=v{xOZ^gc%Z@t*F8lpG7 zyk~X%ujyOnQoZZHt8c+SA--_rAN3@7i^NKw!L!~z`4JZ8r{#GZm&{@6s`8UbarHA} zCNKFaXhpY;^QYyt7tY@|&VOvAfBtoFMV=;r&^{xaS)s41?*n}EJ^Mb`69Mlv846T7 zz*st&S)l~Ql#AiHjhw^zVv2>p|A*pGj71vdZD`NGT%i;`5H0yr5?yrPl9vx^sP0f- zEJcl|G?k4~|12LOuC7%yt`}ePHm*I=xRI7>@M&qpRDHA}_&x+XR+XisZGyoge17C@ ztXfL0xnjNY{F(;3thja2_Rr2U;z%TXD}Ey`%9(N&&P#Y~TnrBgb!2p@RCsUVTM6He z2;m)})D_$h`|de%EVlIT{`l$I5YXJp9K@ga?_)@F6o*z9y&1>GE}W@1eM(7uGUkEWRU3JV&^|cZ9nv zr=AJ#5mjVW>4Q~BH5vZwX{vXrHl)UCqPT_N7ZLA%2RNfK@R*_c!8Wp=)nh58?y6$k zRnnqvph8t2Dehk?KlOg7=7pAZ!xakad>k8C`CX#)S9NS)AN9Z;$}gZ=!wkn7 z=C+DqL@|Tc#-NS)O{vuL5LbQygN+hb#IqcUwcdp=tV=or2kV`HJ#_d2)y+s-k^*ZH zr08a(NHB<3n=;eXUB~RBL zs+wpIfG=r}jQUva(J-gL_sKou3M8&*3sqCR8B6RZ#I6>XL%WIi@7fQ>8I|gWIyTZ@ zGh!uqerKe+418U?0<7|Mz>}}y_eOl6k z8Er_?Fn{3PqEEwbF5Zml!|Jb|t^BB|u;h$}6dFo>3q4+~OR2FgrN+9H8tYPOtV=1< zske&tDb~hnhJ8Nf+dy`9f&TbES|0}8x$_v;1fG>Jj*JpAqlETG37w4+Rx(PcJQsH$ zW@8i!$UX*P##-{y;`q38c(fYJhh_nR1e&#+7sgkEgfOBih2^$igdIPd?>4LMR6K6bE#((e<7at zm0Nhi9eCz3dJKH?Jl39QPmvB(66#)jFXkoIhWc5jSjSt}wT`e3w)VHKV(npF*4o+H z7CtbD)g!BWR(Gtvx4L3=!RnmVDXXJahpqNm?X=orwb5#|)iSF^@R%{fYKql3s}WX% ztomE^vdXmTY}L-HrB!3AB&%4f+E(FKK~{cN-c}W@+^ig}tgVFUsp)~~uIaYvy6KYX zYtvcN3Dd`>gQh+3%CXtB-n7!R#I(RvV47~4WEx`{W*TVfYwBt0X6k5aV`^?{Xi6|e z!;?p-sk+I>WHyyIxti=vCKJ;i>-Y7a_3!m7`UU-*eo8;8AJ+HjJM}I4M)(9-rZ3Xx z=ri;w`Z#@rK1lDc_tG;#i?!2R>W%dzJyx#`3M~lZ$s1$KO?SlFR%lPP2ijfjHpbp1 z_(VDj4=x{T`{8?JE4+oRg(s~ywR!MH@*4cNjDjbZT=;(Jj`ejK*4|Cw`6V76U?Sk1 z%O5^WJh1+8)@v{ZQKXn<0g0_7vTr_v^XX{ z6#K<)u~lpmYsGT-Rh|c5Os~Pe(kL+mo|t-p_U{btN=tBG62O@W23N;bXy6y!1h44? z=!-3&MOK4OSp+I(1}L0ypne9u^ju%iPu)OUwZTfcAx}V0^+iwnJ3NuG7M@5Kd{MWN zt_Ei$-QbLjH8>-a49>_rgEON1q8%fj8YB3a!5=vezi3wQv!%EsU*LOO4?eaOujDI( zS900lm0U+ndy(H1UxVBiW5gKpJA6s6CJ)eRCh`#L4;%6bya^Zb2UZ0Y$WyEgJV=pR z6<~?7Po9UfZZFM?nn9yirCy36r`~GBQXhl<@x=^QQ&CZ%@f%=-w$i!*w}cl#2HpX_ zqTnIm`wL$-{&1G)3oZkEoXd}}LS^zpiSL6vA~EZu4`9Ames6#e%1gipLFJ`yXx zg*X}^=U{DkQJ{9>yto7WwZNAVD?HR4J|#~8f59PpXXl`0$JpomQ{c1wDDWA`7#Taw zKL-8`x^|46;vWK^ue{7zj(HTHwE6#n*eX)je)mv^cD6VZ-|-rJ06Po7G4?nU2X>6%sqkM zfz}{nn>f}e>}_ZsFt(9ng~B#KmP8*e+Qn+uIzsgxI$ZT0I!yH*I#l%@Iz;szI#~4{I!N^%ny-2f9jJN_%~QRH=E93U16Oqi zaDToXxF6pJ+?Q_!?!(^$&f!~tdvmo@KriSBGMdfb0q)5+0r%i<19#^efwTAq;7qBjh1n$IF0C$8Q8lxTfTfk|mH`Dg2H`8{iACm*L zt?I|Ljq1m=wd%(-RrO=qO7%RlL-l6bl23rn3q02%-hy`qZq7RaH{%_FoAM68O?Vn` zW8NOP5yu*ZHiT9w_DSGvfK!Z=$-FhK45VCfWi3#1_uxroIqf31cAXB1g^;=fWavQ4&|}H;2Z)6^8nx) z+#fgyx-yIgazEhe+!r{2`vCj%s=(EF6<|L#4#7jm2&6u01k$Q%1kx&M1k%cC1X6D` z0;!i8fz+%ZC>>byOpeIvChqjYDdu#v!#;3fkP;3&BvzB3VQu#d)_%WYZTOqKFMpR0u-1GoP4Ih#q^z`*K}i>$Nz6bu zo%uhc;v0e{`&XG+7sywuVxCcZ23e5=k_fuI8MNOV;g7x-I9@p<5AwlrWEHfA){w0v ziEJnDYU z<_~|n)mdG#mqoMs@X`za%aF#xc@X)L4F^x|jvD7}D4phBP)3 zlu>hh_mniYz9EfmW=Lb38`9YRpterXd_x*L0bX(YKqjlCu~Q5=>~zRsN7L60IqWP$ z4m;P7!_HGX=Fs`z!7io?44LdgLngb(kjXAHWU|W*nd~YBi9Nt zSzGByH-d&NL*E5o)E$!9a+p%{ zO>e>vwhz6fB%t)Rl7P}*l?0UDgVd=3y$^c28GWqep!BJdgVG`;2L+P}a!`Ei4rm7% zQ!-*E6iSNcFBrwHDs4J{kuOUscTo@?3=KiEPT+BW24>it~b zh8$HIH=u0)MdyZ8gI3f7Xx@aE=-$8z>zVcqG_a$|F=%ujr?KP&jU$g}JURJX69<+K zDbV_aHV$ktUeL$ECp*LLw9?oiSLrzN$1|;+$?zXO6r^H@=iEgU|8hBnqCvSHOe%D)=FF~ z^Uf3O8BoNGg&N~bVDB}J>F}Lyg?Y#Z-qY=vJ#%1=%!xTO7v{>!FgNB7kG6swJW z$m)WJ0&RE}%i>r(tIrZxBIeg@mc)`-3Mk=*OxZ2>#thh$HDk?L3)Yh4uvXA$PlZ4C zHn2D9%i3Wllx48UNyNPS6wASWERA(w9pMrGChLTiXJ^)hbtNgJKTBubSO&DwGg%h+ zH9c5Q*cs)qUYJ)0fOFG_^=187e>Q;SvOG4B<&y^3S>+)c#0JA-`cO6uGjAh!C$?yN zVULq9pj|%}mTTk4;9|Wml3!Z$3$`57+3TcfvGx}%2xgbo{{pwEIa@$l{Hqoi83K9A zP_`W2u2($Q27}*gLmv$O;$Nu|27lPQ;6>ih3M21gUz|Jm3bp>Tei%F@9ab7*@CyGC zR^A_%XoJ7P{7F*`{NPbaTa1i>rQTRr4vvODW@rMbmDtO4I!JqxR-)HII*^X= zQGJ{2F0J1|I)P@m@n4|h0UGZAM$3cjCkOspG(Ad5;{Wq{9w+~wzTn@`7wiTJex_yD zfu1589O2%^E(LupyAR}wJnTS_4<7Mg@WzLVVOV#Kz^ZE$_A3}8#)@&+nP39;C76UY z*c7#Yp_qof4PM6%1v8EP4GPpw1=#ao9(H~!(HIozc2Q{SNcBj0eJWa)OrrP z2ps`O|0AsGJ`qR7r{M1&7bnC?aY}p!ZvPo^7OT5+;tTNpAt@(|$rA8Z4QajjR{U9C z@&+^}fA~MtmsB!)9h`G3X>IJtU}e^Rq$N5;RUVI zrI6{oC71twtx_dJl)L5oN{R@c{|Ar(9Dq#V5M%^LAT#*rrBvH#aOuy2i+>JW{x2Z~ z_!?4z3-TLzQGP2g!JGaS`JKEfuYq@e1HAno!27=i*}#vG9sKk%iVsq%KjdTiL_USQ zfIyzWAa4+wRJ+J%Ce2E-)@&fpvV&a1L37lcAl-7&T(vTqo92$yeK})qoQhcCdth%I zv(j?J&N)?-o}-~}SBorn~u^b}db#mez#Jg50hL_HD@4dSNG> z9PHoF7rQd_*9JhQmuKwOFbMlL4AF){K6MW}Hw;&L_{NS6qqNc3GsnTOJlX(B@CwkJ z%VFs@89E&r5)YZ;Y^{JCCPzTMZUgnYgRCR#$v#+#Nn(xNALd{;pLy8zX90E&T7=yY-qaRj ze~6{nA>u7aC0Ag#qE(=k)__u42Rdm3bVWIKlGud(BtVsu3ECFu!0OOu-AYzNqi>tG zUE87U#GVqnv7f{q>@2ZQ`+!V@q!V-%nTP#?4r@n1WB){cCOe6l%!GZFC#=inkV4Sc z>0~8|(>{cC+MC)(+Q*QTFC?q9Psjr3!+fY6#r{OcwByF!7pFj>oz~8PAMiPLm-zyF z%6vt3L9Tip`^n^%0cD8ZD-Zn4M@g=WAXZtd&CclKe;002jd`rHD-pV)RE8SbK z{I|4!BlKE&q#gxHa~-{|UQdtKV<2~q)8qB}dV-z^DRi=)Qmm5+nRFAqsoqR)uD5`M zx)rF`*4W>oE#%eh^)$W1i(C=Nva|H=dJny)+L=c0jeRis=zaBmkaG{vbM-uZpcdCH zH)~Lqp5He+Brz_rIE;_5gu#|D)DniPFgT=sLh*5&ag6)wTaGRF#YI|<xMpoZ}#uGy7hieHL>BtB{ZohQnY)E3TrCh;Ay-@C&TB1>1Ezw9^ zT*?qjs(4H7>sxA3-%{H8mfF`Zu6<~5xOL*69v_kzZ>ey6NrfZyL`%ht(uY{G3<=j0 ziz{0E=y>DN!6EUrimQ>Bs3jXEvq^ql+2Tu~q1MSSJT=rPU~oucxJc=io?Dz{sHF%Y zi8d*J&Lbo-G@LbPs5N-@#_@+9A4a!LqqFpEsGnbWvPa#X{kksrPMV`x zp&^!Lim+57B2jDo?A-*1B!n5SE)-+K7%Pb-VT5e`yse9SS4d)#r67qVZEwjmG10E| zzqU2TUF*_qT`Nv+UEGajYc)ACxvV6jU>gVlPqr|%+h2@ky@IOy>;3P<2WkRv4L@=OT!>#aS2;z zEiOpeQrg5B=Phxg(TupQ(Nb}Vr4HgFN*@H5J_s#+5dQy>_a$(0RaM@vs$Nyn`)Z6B zLI@ZG39-Anx;u>l$1 z6IMe+U_wL)F(QNz12U=afBxrgue!R^fjHy$`(FL(zH`q#_uO;0bI)Dgd(Iv*|Fu+R-4#s0f2_-W_1wA@m z5Ule<2mMu(S+|5SmhfI}#uW94kQg~aPdhz1rLNKeh^Q(ZI1J2I?&7s}w`%Fscb6^5 zDPcWL4a;t7SWi=Z&Y^$Zg~f95gX4uiEK}vegcj*NUr~?m8^FYT#7UMW>e*^iJpRzm7d(E91i88MVOo6aG*1S>Cnl5Djh!qqJp+` z%}T*HHW^MyHWXuOKtFYg^MJ&(u^EBrpK;+W7!Byj&E%~@Mg~GvIy?lF9lp)WK;c4K zyE{UK)1eiSJ4)Fc6=+2rN?b%4Pw1&Xs%&+e7F~N(nd&yJtm>%J8tv91spNR%l4|Yl z_BAadQy3Cvr8~?@w`Qd=F{rJ!73fg!U!r}?z0-M zgB#)cV1y&0)(vxp))ztUbBg+$FZB9g4AkhKD^r{kL$%kVO{_{sNJi4O*W>j~OTNuF z2Nb9g{}@eQ2Tucg-BRaA(|~K2=@+w|p@AW+M+as#wqdll8b1vX_-R+7|CsT7vavHK z+u06{bnxlYc#~;2p^F%{*EiS7UZ-zz zbDcqj>5LJig&BdM9l3eTUv6GN)oQ4wnCwn9Vox>VO*Pq_s@cuAv{%k^>6sESIhxOu8lC&iF0)E}A}2-#xhnl(1@n&!r@VF`%t-K}qU)3W`|m z@j^eXF`~5gR4q*Mz);biTjc5)^d+^1^w!B>|fPO-bloJM-zx%yTmyJ2mLaEp>%} z8IP&$X{IpL$_C!Bn5M$ywM}8hW6HP9wi45druJl)dMkXI5xLv6p=pL{nrUm@tu;&g zTH$D~OT*^VZeq9Fik?!nw9kyka4u+D&*!J*@U9aq3*?ps1=DVF(Q2e_x2?pc(33kQ z=w=Q&iCAX7vx4)T z6|QY#Jn71vrtR)DUkDYaSxufhjblL789q?k@kCSEJ?*(ONTTQ-Qx|Qfz(tF3+!LykYe&Ub1S%v*L6y3w4)r%X7dH#b|={A^Mgm_-<<_{nNy=qNHpZ6o7p z4alabIbcG()gyYIWc9Os27`E$JtNAT8k1ucJTs^h(5@lEC$EiS+DOv+n^GeHd zN}@JQrI~Roh~FAkXRDFI3~K?|6yF47fMZB*zTOt|R;2@gfvF$}OU`8|pr=B{1Bb>S z;8RD73>#CMieI&us*zEKEY*6-DTfMCMGUA?edPGIw08Ki70u*AFnakEVP*SV!DGz! z)0C$w2g3D%h9IKWsR={t3qN;;qR#N0w?5Dz8vTq!#cJCyvj+9_Xhl@1hG8TV;Kj%A z>~jfKX)5JRO<$FdfqiY%d2JMM?NUaWna3|2GJg>RhRoM$jiHQsE37I4WE4?vCF)hI zN(3t?O2~p}=N1HO3nEhlRr&PRCRC3h62)Ud)Q$x`Z&5iGi;5+v>ZZ3kP&SrCB&o29 z#v-jus$_aAor(dd0|sIZHR`3eCR8q9W>iaWRul_jSha!Y;o*;aCBXU&W%xEY{YZDzV<`K!x?zgbK_umm;XJ%F7~y zdS!}EZ5aYlS{7uAPGMONwnS7}5i16{i6%BVz<9nmnCJIaEU?YGLQQqxY6EK>UMVIq z*a6mfo81J!3b*AUmOHSqRM`-*;5~`YR;wgm8<_H*h>_6;d#j)-7tcH86oD($VgS@s zYCAC0N?*Gu9Fa`6+03dJd7WblDKA1)yGa5(+7x8511TDvW|6krp=KpKyXXXoU}g^l zUC*h|IRucg5Y+~A2*I5w)GW=^FTycE-HPe8Ruo3CD4Qq3~AF%dCfc+Rr; z4UtMJSz5$U&Uj25NMoa8!6y*Gb}$e~ByBm}!oNN-2Qpz0k7Q;h_qF4GI~eMubYmK8duB9yH1c3-Tm zRxI>uTNJP<0=Xs4_!Qxyvn@a>Sck1AnR78bOa&H)q=Gq^8y0GV`IzB?qOLMJQ%aZ@dCd#R}J8bp~h1WfBLlc154I zE7LlJRIey$glIZ~uUL_6ZrvilP)_>*m?q?N+v9V~24M)is8r(hiHV@$13@%%IvsS} zJGBO#rW(q5A%ZJ(YUl}Brl-OmpC-Z98tko2*n+*)fh7nko4@#UiFt;^w1!}BZNd!f ztqzPplXo!z4JZa6;#z*1^&VScYWi7HiVCx@x565IfNV>v2@O6IL(DzcF>q+=)jI3W zcni`I&Vq_;WGUVo080c)n75+ zL1GCoPOY;hjW<#9O-Z}brDBXr`Wq7#rXw+Crt=$HlYXrBn&j&P!;wL?&U&PGco`GY z&?S0)Q_`3uiBvJF&}F|NG%FniN5 zRcbprT4O*uKV)#y)jCs>!4+S!B2~z+Ph7Pb`{}8527qH{tN`y~2&rqGF%m|0S*SS8 zmA*4eNZ6FLO^9m<4HV_>tQ2}H&T!nEsiNGH_KI=~jTU0GylA-uewr`z*E$;}40e^p zPQ!()u%*dbmijBiu2DwLxG~;D=W9%uIYCmib?BFM`jT#Qn{Uka_dNmpp)x_wIl z+m@v3((`BqJ(mS~?o%M#;C0&*cs=J-&`m-3c{B`n-6kuT9j3xWJ&jh-<6z*!O&HMW zo=riIVZzTH4&3!7V<{!yp`L~=XHOjkT>$?bzh>8H*)5Ue0eLM zlzSC+FmCRgY% z{5uW4)9^Q&sD&=;H|cbld~}(3T}FO$B(I={ZCeVH4L?1s+tO~!M-S;D+{B+ewc;pj zKF(gWy!VVc1IcFOiSv5TP)Vm4PE(8|dQ7;bpr>DPS5ED=q|NEpf*!1GDd>S(+)c~V zooM(?iJ5KLf^O3SZ%S5AZ?+Wl)F$pGeRFEFpr<;4H#wPRNZ)TcD+J!7 z+ic2hT39;MLfN`Q2Ie%9#xbXc)DxUEl13S%V~)&_49zSEk>wYNqa9g~HMbOWvmbZU zuyyOUrJx)1Erl*iZyJ1?QGMp9a=~oi7tA^Cf;r((Xfqw6&8XOR(~3#+>L_Ka}@9!`3hD(%ipA5 zF!B|Q>Ne+D3g$p{q1~2)DVKtg*Brnum}3crc9V`dmQXOqw+rS_LqU&zw-n3?fs9}i6$r*!$(gtA>72DJgs7d8v+be zG6Wb-=B!k~Jh)JpVk9vqhT83*JH<$(hmoMtjb!>v1^lK2^_dI!O^Ho4H89oGh@Qzp ze={|24viP|I1BKmMD(}|{3b_wKm~r2ZnufA2Uwu$O-Xc{_~vX+L62J?+{oW;;_Gn? z^g2@xJtn?6{7~pI<A=Zzs(FCj=p3lYAdDhNyf){)r7p53?}_0 z^5UdvGQ32-!qk%R68Q?<$#59MOy47>pfu{b8n5ad?k+RJg-EBrwwy8;*Z`H{G?vsa}Id9q02}@6zKLpRO z@xJ^t`YV<%#Nj}}44uDp#WDpJovJjaEIM5f6{q0YyCsC?En2W}If<4mGK|Q1`TU$P z#!dJxpO0M}VY__(5OS5fFh#iVM7Xj9pd3L!hRf$yC_fR190edx0F{QT$fSG;k+aZ| zx6m2x0vi58s3`!FQp1sYj?=hP+u~090(WXn+^O|(r}o61hB)rj!nku3z`aXlmXDoL zW&$F!07hm3Rc3`mX3~kwq*Iv*s>~#$%!F7j@{u#9K|seReSR6WjG}}Z@%)bqjwqGyE4HpG{!$|-W zzri3p3HxfxvAG+9!u`qGMdrz~G2 z56Se_S=fX%d}+nf<#_B2smwt^D+Mq(AzA9D6xelU41}u)*n}j)gx1hwgX&$jOmKrk zBuIQNPw6E|kVnd|5<$9JFRuv8;_uXnb-q)rDm)Kn+OaOBz^~R`i!N2bukE@8=d!0B zp*1+Ay{3054&I)G2EKguvNPhjID{K_uUNL!gy+rOsFcam;>C-W%{E9{kvOhFD-zG* zbmUH+cMABJV56SYNClZmUe_}~&glg1iZ@4tv3;XyqW=w@chbqr&j3dXi(^j0U;a#0Lu?auR*q|m>5GB=aFkOm~nlYFT#mrf{e4#=sPM*7@+OTFb z#_>RTotih z7jp9LMsKz2EC7C5ui)64J897pIjnukyxyft=4v)t+bX2FpEMh-*kC$_;1HKcBtvh$ z)js<&`y}+8Q*a#Ew4|22SxU;=Clc&~*7hX7Su)BS&6+p!jl5ZU%A5H_-pnWRW}eZ8 z$I4~8k30S?0o)qEY+4BKG`LQ{g$i!s^e#PVj={DN%L4-ewl#<+u;n$y#F{z*AJLT3 zKp2}9?o(};#5G~MRMplp*@R6-SZf8hdxF&3fSuUnu*a85BjHwpg5iV(UsnnO+fop? zwPxYcr6Zgb`>UV54*Hmi+oW=*ioObpx1 z8dsZH6>T$15p8CPq0KBQw3#J^wzi41&LAq=OMOslrHIy2M8P#NWT`U@Wla)M>#8#h zXPs)eE6OmOwOfivBsYbjM)rK@nHt8M>LfFy9Sp5?RT&bqmWded!hKbjQYOSvk10LY zd`QmfFGXl^HYOSZX^f;jfd@y0Y;SHsRfZldca4Kdi;y*GB^D+up|&EfLUElF7AcgU zIAM{kY)-vqP4Av*5IT1hM5C`gu~dli6=qQ;nodCjK01dC5IPAZ7gxZgiR(m9Xoe+= z#->(lnyAU0@#d4>4&$x&>1bgXa$7d)Me%B=oQ7cm>uDK)_Jkfl%m{lMG;wN|38!E? zaJd#I>STEp_qe5t_MTBScOFh(EtxxSS??Jzv@jb{JnN!92qa=yDMDE{glHyaR7;1b zkN~!-Metn#zRkcmPvYnWw)6s9dV$+aO_INgs`(W}ODUqO6wwwUm}V&=!Go!nQYepj z#!-hI)_Cf?Wy=@!&W2%zQY2wb0#zsFGjsN$#U`}U`>9b2lU2JHCU-{sVoN2y^mUAW zCp~JG@1#e~`ki!sCrQ30t>0-$N0}4nEn5D)cq6W{6FBN{zq&mp6u zy@re#GA8;6zS21kUrX8#UzFNs$V_~DXuK;aDa9l3-qjS|Kw2GT_n#9D$G;IU(kU_r z#ghns2{c*rb|Ji32ppox_{w#ee=5Rma-v-N^lg8WM)6>9xH@qYCX}ojv zR@B^O__Fard@1=5d~JCwzSmrf?>xVTw+}slH!xj~(mW?x7A?g4Ao1pV`wcIAGwt)j zHT(H=O_aj74*+N8SYjPB0!lfu^$5c9|-Hav5K zgdcgF^~d-=N0gp7&VoxM3>eEQ|AHsX4 zeAR|h#*GYzSN(Vwr=xb6P}g(dyhgYP zq*oVez6-UhI1`Fi(sh@^-R_`UEF^cmx^C>cZWln;{2g&Am!m6PemykU`jC-=S69C= zx-LeEpD#pR=iq-9A;F#MAPx0&0-Y?Oa&?{1HFuXn$L$h+N2^Sb&qGJRcUV_X*FjzT z4-zVrp(}@*0J^bVqq|0Q4Rh(%JE+n@EJ^WciT4Zn()BUQ;o>CciQ6Y`o49%6rYPDe z=;fV`F>o6F@)Kz%ZniQ9(930TC3HKLqk-icL?|U)=cIaeK?RLa$r(@jeVhjx3Wa%c}+Io;;Y=jecr&SfT-i(M$8&iS2R zH076oI*$>${z50ROi3}bbB1#4+||$_yOQ&a7doe?oC#=>;*ir0{98Kr?cBR_=77*4 zWkSp0MuKj5XJcn|XU?TzfvDph3zoCtI<}MvbtN9eD1*~BF7cJF@wjuUK*9YAv(-Ekd9 zE8HT&H@0oAMh<(-Dsxfp|m zp556Pc7BU-dW?-*4r+hehPJP6f1v%|_B-2eYhUefH@DxQaQn*ks|N*LF-W?B`Mn=5 z?EV;wZhLUPxu{qXifcL6l* z?}$se93ANLJFyIucesI}@jIq#M;~e*C3Nk(VZ6MNkl>mfG^z|#D>%72bL~U_Hc)$d zS8y)Ce%C92wuZRE>xGSlmpTrLqW+=63w=Y&;?|Px$-*Or`)nGzBP+hbJr<`WF21sm zE8QTp46blTl3(H0!cFZ<3fCj0oq!70?re;K)99Zc^UJ=UgbLTXe3S`QZLu>s^70j~ zvU&565A7ckc?y?XsR~^EAg&yAVHvt|xN{xd*}DWfy$lzRBUD(1d@L5aK|u4%(0SY! zB@}#)!IQNw?*eH2PIKA$81Gq9)u4G{eOhEOf|D$C%<`3=BU&>M-XA|dcB@ovui1RGZE(=~0ioy0gqFjtNz%1F9z|^r32qS3sxovQcb9T*yB)8W zIhvI34;sJITy{RjE|3%@cZ=qHCm>p?ETh3f*SRzX8N=If14C`sIL=qLU8Zo`#THlY z-gaf%`G&3x*{*P}?~YyX`E?qwUnTliN;cn``~{-gcZoZD@mSM_Alo?rn!z zDuLR1+75!dzs1SDtzdm^6C5M%&o@b_>hhOG+PWi;!%2!? zxfJrPDM=T|;?KVvt}(;YEV7@YmxannWm6N%QVH_wG`_lpDfwp=>NqIGm%{m{?P=n2 zkf*lerpLTLD8E|b=O4iTUP5=~Z<~0g%%hT**KqADwfxP9af78%F5>f$4IAj5Uui=F z=xU3Td;SXR%U|lCi}GJrSoc!%U&)_YxXOkOe9tep;rS&31vz(RU@7!on&13F8}1>C zDSyw;$sgOc-iGC8g;4(R{Gs`2d1@bv5AR++!TQqm?aD*>18vNp4Nc7F6`OaEr9xjd zR-MOKD4%EtKHYMVjbrb=E-gmyzSri*Cqt04G5C)XY+oo@289kAH@};O?A^z;nB?8( zS8FvHYIo-S{#zLC_i_A+e_tp+Cf{uHF%X1&)>`g9AMNWb&O<(35BYRu&q3o@sGI~C z-^y_IIRC_ho&nDf&8Mv-=AO#DlztgcFrAnBD4qzL18gcKBU>shqi!lKQl!!i@cq2ssnlA*q$-3%bU|t^;4yT6MasWQtmwY<8Nh!KPmHBfUncz|hWUMK`_F{i=>D1X zcc(uIe4d!r)ZyT^N-*gPhTcOw+9+toq&^3CTC^4JMq+Y88Qm>#^smJH6Wv3^O`j*B znPUacQ0C|-OzWeh`6#(vNtlwSe#}_kkmsaQKTaJ7_saC%a9<>T9x2Zv{9D4J(Nd`o z7g2iYeDTZT;t9zVN?%gn8_%hwqRsL&A6(Exn*|?jPD$;2mQVS8R`99Ml70yJ3?a=E zq<>3caZ^W<{z$}6rS@d3KM=ns-BomFk;9=1(;Z35k%Wg4W}8VpBbfBZDB+(e;h!Zm z(i-`5su`)&lfIsD4`k{G5+k}UmD)!4Xu8J}FXKQe{Q=>bIzIJbxW_WqcNqF%Ql8Jy zC8+}uT3~2_p{G)kZ=@ywe_pB!?iAvuNUZ20fuo<3!?DC4%cmnxPW@6+Q9R)z8G0l! zHFOW7`*FdiV} zL3g#d>0_kFrJj|(mOhO=?!Or-Hc2WKGwwIkC1$I*(FTzUuH^Sm#9S}EKH5N<6npUx z1e0c+M)#5aKGNSunk;Fqp*CnChWY_dm4avLPGY7r-Kh%GW!pnv71?g1TSs>WDGyLs z-1LX36W(UJZ!_KP3?0UF|AW%LO-utZw-WOvDc>ai4DuO8xJ&S;Z%OwdYK$&wjIWZW znW;AmjOTlWriwf-VtMW(Zgd{&F-QD)#P3a4MkvvN!XJ-9lTu1mEGNWb=uBxv(KhDj z*P;WX=NbA1mR<*GCXho>VG|2=l)gq%O#PmkQ?3o%SeA2!cwVY zNO>^v$1rXq;Y*1BH-+iWB%hgt4sGIUP(QCIb%If8rD(jL~{G3&_q|IPC-t8 zojM!td{WLQ<$TiIPMYtK=9i>d!O#^F8c{ppd2_;~znr0$Q^V+(@~<2PF4s`Pmyu>4 zVonw~JzHVA=Te4qN%I}SL=P|*7Z84o?ekp14-vkMvCb4X%_r3FTwc?rYHvINXwWlVhMyIBwK9%|yM(NL_x>84`u1!tC zGvYrR~)9{+rYvQ@=?4IUS>)=F(lMb?J|%r=*+H-RTq3Bhri0XTta8^yTT# z;0fZNr%z1(BE2?!Zu;5ubLkt>FJwlif124lQ%G;lbYwn}$z&#Hre_DYxg8;QWbVqGmANO5GGC3;aVB$boQ>-;tKx?E zLz&0o568P_*5Wzkv6^GWm*NTW?940iT>L&9&yN?zBjOX|Gvhttv*ItuAB(>l zpA)yn=f?jOx5ek-*B)OGUl@197scO*C&u55FNyb$FUN0Ed_r~|dUx*)$AC2e4zrk-_ycWOt@pJLI zctN~Ael=bk|1thkygYs@n~G1%#@TFqZgxnvBK~@|Iy)-9AUis{SA2E$BiS+WHQBM* zvGKLpeY4~6{Plj>3GolJE!o!iN7=S)Tm0kf$Fm=gZ^#~yJs|!`_7mAp#5ZOqXS?H{ zW)IGOGQK7IsqClYf6sm@nFn@jcnO+4=E<*%Pu$<43Z~ zv!}*SX3xx?8UH5xmFzk3n(RMi|2h6`_LA(S@w)6~*~{YJXD`oQ5xM2%L1H+U)*%D;7V%f!lv_^ z&cWaQ&T^2&oZ571)5-Xqko+}Y*fclsJFaOkzoS8Q1pbFL^|;?bO?`j+H`!mIX+qQ3 zrqTS5;C*bv-L)Nnog*EU?$a5+ORp(`{B-O+F%!ma}L+=jCeL*T0#PH$M& zuo$@c4PR_HhVFdcXEw}eIHX}p!=#3paA!7j@ZZv~Z$k@zd($1+Fub9Wzu^tl4dTnu zRj84nQT;m&BkQ*`G}gaU|62Wq`t|kC)vtm3c>P25tLpEnzn#!6^*6$IUHvunSJq#K z`^EL=*Pl~=7XPR6eop<#@SR+LLj7EX9Y>0zfjI)uVfdX>-&223{r(=2fzh~(_UAMaKfx3I^Rx@vn z4b^pbn!H90jdi!x-CTD=-AdfAuDhb{(z=W4zFzm0x-0)=urH=Qa7#cz`BWb`MU9SV~jhhZnwJTy4t#-xbIe%u6?(5tNFc-`|GtEYhMEH zh1#tQTMOKiwU5+30^io!`)cp0y`%Ql+MD>hwf6ejYvH@9_Hz6$!SAZt3-LR*_H6vl ztv$VV8Sdg=jQjlBF9JTh_L$n4wKHlD!GA{Wl-f!7+h0d*3w~GC?n_R>O}Oq|JF<2- zevSNB*XH1lYTl{YA|W-eFMDV zxuxdDn(Jz=skt4l{a;ygWzA*yUs-c8-ScbCsX2?kb81el5#Pyl6*`NdC)CWXISw>) zYmTltqUNxg9=He9>|ax;nSj4QV{1kO8c{Q>rXIf$HI+4S_4ev*{BP!cd-W#xHdVh| zy$)f|lHzG#R@YQkKY-u%>U*p2tiG-K=IR^FZzb+4tFNxU0=P>7OV~xYf4%xE_}x~0 z18S?JrmD}xZ+Z0+{FYZQte!*PvDHgz=U2}HyrlZ@>O-ri;dfy5#Ogd;`HMRqzcF-2 ziOUigOsSl&AQG_6_)RZmtu zVy%Iy`|yKpP<2PutyMP(P1W^P*H&HCw7%-{s!OUa1pZv12i4hCr-KeuRm<>O47&MM zU&Qb7swaWJ2Wh-ebxiZts+sti6c8IfjE28%M3GL(FeV z)g=5nnog~n!jTZ8o{VG+l@NqgwN&j}wRhFXs^L|QRn=9w`s=7$UubwzMuDoR@}0^p zm9I6PS-GKdJ$}zsu7Ue_Of(1`H&=yn=c)(#&b=Mlu*Au>c4a5bWa z_%G9)M7Na^P8B%%XReW4h&MB5*-=sUA?)St^SJ0i3z8f44Cw>gw9=aRTvd(uZ z;d$alMY`X~$Q#uDmH0#GZlwDex*w%`4c#BpeUa`L=}w~iSGs4>T~2pK`ah7?jLh!h z8qA}FpP`G@&2)A8|Ih^)+_YU=Jaa19iaal-byB}#QmJmq=%65KLsECC*da~ z#pnr15iV9nqbJDc3DP_vae!XExf@Q*aAJm$ z=P>ddMxMh+GmJFDNb?Nw&k+9%@y`%{B&9l%c|4MQjwGKWNq;2ik0kw(LLdEE@NlIh z|4a_`nSCH(Jt^xm2N9N%uV?6i#2-iw2NLr|y4&a;P5jY>k7w$~Gxg)i=XgqWJS91v zrSuF-=`Sp$8B8XpTO9G5z31s-RRp2OX|@@ zY!4SPrx%g(BJ#P2e2yiblMO5_yH>_+WsX`I_tSI_CjRpVmeh|X=4hsSbb2i@l6ntmZYGDD36Eo4k7MfN znEE)TK8~qh%hZ3()W@*}j$;cPNB-l;XB_#grXG8i+V5Gyar%cyF~%G4#1(BEQwz-? zek--sR)%h6=vE1hzM8>4RrGbd$q=x(>5+`pLbpJ7JY^oA7R@|9y_K${HJ&`jXDR^y zfNz#umHq?qBExt|1@8FCd{5={OiX&= zGo5^ z-_N{HAkPWR`vl>T`5`gm7;Bt?CGX?N|4~vtN_cnH{_ad`cc!&FQ`w!V{0me0H>R>X zTj}m>rMr{o?&PyO`Fx7K`#f>eI@X+z_iCn6=V!i0_ow2LW^cOO6-h4?IQl)^{}TG> zdWA`I3^^RbH@!Z=H@$A=n_iER(6qccGnKl8{4Wuj^iZKm??akPGAkK+rMRR#jP3!9 zJD%`G#`5wUh?l{IsA_0@K^HhW$3wLtEB#s?v=!x zDQ-GLcmZ>_fN}qeaf^(*faS9wBjvLIl<8BPX%;3b|k(O{Ui1wPK~a^Uc|q0FXBhsi})G$A|B>m#A@zEJcYf8+Gu^M0Xq`g zu_Muz`T+JKrlv-vx>E;ZFJd}&B=V`lu_MvR9f>aNNZgRR0PiY&ICV+t(bQAepZHDc zmDDY%S5wKy0PCSKQFLxp4Vi#gVyokFHC&zE#cS^hkzvc1PY&u?%#TB2!9f_}DM`9TE zC5C5ri@%i}f!&GAvU_27;=9<9*f+isI}-cF|C;?6_9Cvzc4fQb?{i1uTJA{vfIAW^ zu_G}RyA}s$4~ehmj>HYzk@zY1B7V-jh+D81u{8ca*%jD@xIg>l?3b}G@s;e?;)k#c z@%4Ch_5$ohJkGs{r?40Cee6#B0J{(`Wq*|YQT#IYB5uQugzQ4R8BNC`KhBT*ul%vY zAiE5^^pDdnW%=zWj|0mgwutBg)o$aVm+@}z#CvJwU9=~qx7NmvNLk%w(m}i4#nP$xr$o_D87O}A^PNWN^lj|71st{fJK~^C_a(I!8g=m z67g6g7G|5VA>Q@eRs80-@sbB86PVE#N6X&BGAH+GgTu z_`A3b!5jSMli*q{P_KRcF&GJ_ydwl#uTy@2D=W0#-|B5~a|0LMKm) zjqovD&QLGBzyp^^BY$uzZY{1Y%E_k)`usytOEe=w3*)s{v|sVD;al%+(a_gr#VUl{cm_&-IcU(l<*(%|8?;XUaI0-z&z#s3bCXC z7T4o16mkv=E!Tv;0CXqUzf%^^qXtmNCC1-HokTw@pB79R3=Q!XOYLic!ATGo|d+AAXi5?N%WH0Ke-y@F5`fTw(1ZEHl9p~i%M8>t^w8YDfkc(sv0$A?Yev^AOpTzm0u#L<>A67*6RGJ@b7 zC?wccd=;Ez^ce}w)`>EA7xK7{9ytvcf$nbnC2i?zcNTAEnD|C26pbS9SBw7!*-=j{ z1BtmF8dB~Xi(kVCG}ez##SMZ-h-=5vhwW9o$@YIKF{u@_CNt_d8tok$6kq(4({8X<1U+7AyI-;R0a1-jjLJb}v1ZGHX9l7bS;KYB?V#=qJ)+aajyn?gGU`r?Y=XbDIlZLD0ykyH8{~3a@kQ#eI@QuOv#QEb*A-O3sGW={x>Tp>pVS^o@*SMdrWHj8qO83pws?E@+$_e{o7_ut z>8Zn#Q7c<5Wwrw$D?W$5K%Q3H*}kEA-?IWV2IHA>+|Q=jzvUOiELW02a34_8@DiGS zX{d(!5MU}r9zXi^;S?eq#}J89--=!sTrU6Y-$B4Y?JPm|zwEJn)axV_$hMqP@v_nG z4%HuxBlv#{NQ_%CTFTbqA36U(U(gHwcLnmZ5*w%Zy45StfN7;EJ_l&1r67*hl0e}l zn?#2xb8iOSJi$umranj)u78rs??BzD3$DB)7adZ_zlm zByCySyM&sO&~ZlMRyqAI^O8PSKPA_P&LC7iCuNchyt0zp@N)d2{~a6>7`Rw6^FSG6 zy(5fa*FSts*z(jlwPz|6oLw0kPD4Uoo_6OUTl#~I>C#2X>?p3IHO%36y1=KGuv0yn zP=bTx|AUr8d7CalU&1T!iWFre2`B(!wpoV8r+^W>??|0w;e2-H>JWnlN?XIABmS=v zn%SYQ07y&OgcTuKL)vb|q95gpagcUaal36zSQj%Z2exluwP7`SqVlm}Wy^j?bGF1d zVMXcZF173Vu@?pwA#$|E$|*CJK9|w734EZD6Zle38M_)9e0A8~5-lphw|IfD3u(z- zMl{(q2rrE{+Uiv3G}ES;_xpVA5%V>aK&8oXrPGULdPtbSdxQJPu52J}5K^X$TxtV_ zIih|69~;mP#@SLPiSeSi4)KGL7R05qwzB0H;$x*4QAU^+qxM%NY+NtDO%GvQ9oP%201p-)V?uV_SUhh17o6WQ z>%V4wnzYs#OMvrK(J3;&w7SKT$lYr4;seFUiI=))!Oz-=cKuhpg7uP9EQXWq#??{@p-m6eh|HFeYsej*pefb3>y9BiL!TEjv^>0@6CCQ3D z>1sK!b&E}m)*$@=vpm;A-Y6*ng zzrdsWLVkowgf%05x^nbK8_;tQp6%9x3ML5+jmq(AA}mL30@Gt=7r z?rJFyFSFQ3ZmrFuMM9~GL0p!%8|C_q6LJh;jUakL_KM*KbEdxbo7*91L z-{>vaOr{hlzx2vFn}(GFe6eDpmyvL<2*o(utE2H;{H|uJMT|I=XTagk{)RM8> z3?I|xd1gWOjY{>lO;1+N*P1xD2xKXBzsihhf5j}>uDhFLNn%Tce~cPA1tnVSU+;fDHvYNxq^RdS1hpbYBoDHAufdbUr{azaU&M` z4$l7M9g}2wd8BXq^PX=0mscWry4W_NAQ~*nz#Fx@0c_nfz<>JalxD2Jw z>feF1zfIH2VAHktV4uYjo8C~;lNdUj{Xa*z+R>K*yuK_G*gwk4Y5Qbf+M#;lM#gMh z8e?bom-N(GDesc@SQ>2nS(eX-O#0<@+JI}4{qXIJ_I1=ZEP)xo0?_ht<%+RH+pEhf zM_G>Zw$3a!r*WcavI+CGGS;>do&<8-oLDYJhuIM@7X&WHkYTVKQ1@2i9VM|#!n0-` zZSq`pOdG810}CX2u;0tp7H!wQI)M7bMdnDwdCgWkp4+hEUv!Po`u*KobQXv4Zw*S@ zYdi!beU5TVe<4ayVn<+4Vz8I2=-d4_dk^E5NS)>`l`D;e9*v6s4PO1)Rl(#J+1iDpq$nfn4KgnhSoeW3x<0D)UVOysBd6{4oaaXD0KTjI&7K`z;sd{{L)1~F zmU2nmn9@kr0PEY86Qz0u5}B3>IXvekNl!vpcH0pmyMwkzqMsYsuJAX}TH{I*VhqJT zBJvC>&i{~yN}OL(sjJzWDlrdyQ1e}UAlgl6an+fb;75?wvlv4*;>5(h+DhH|uL>nK z+=jUPuQzzTnG#}c%BXG2V|!rlYQ4Nsd|9IeXHALVxz4xD3S1VJxjBiY)Pr%8T3~<} zu1*3P#rd_lvBg*l2@FLNK#6Z3+YKS;vC==oTTa?wQz5x2KrE(!<;!~e`et(aUJ>xL2Y?@!Y(l50Aw>+$Z zy`bDg8;4i9QuE>Hxpu7bNC(;HN(A9`wCIB3<8E~l>sNT5Li^!Hz*y6D40Z_gt-tb7 zpwqBh1@2plMT|p70OIPCvz|vW6zO9f5T|weJS8Q;?y|c@1ExL=Wn)&J5z%QL$E0+o zY0rNOK^bZv?{5P6{nN3#h<^d&-ws#!%A^(Ky>Hvn`HHj_gptymS9RmJT7R&NwwiNn zE(z2kxKn zz(r2~y9;AzbLiKAWJ%Cw4D=N8Y%K`KryO8MVT2{=>w^6cj>ILgKWNgIvhZ^zco2_r zB=Q|dR>H@4i|Y{c`~8Hy=B)$LJ%YV~)!3XSE7qwan>hyH|qkV6y<10 zXdD}E@0Gz*BOzVbb}YUe&W0uLjY)4mJ}ZL_4*b+}e=5H0P7+7OyNbWXp4S?jYTK%_ zE3uV9S1r-e``6>imRF%MA))ugE-WZ5!xVikH*l;&Z(=)<83lksY^9n2GyKN^OLAp_@c56K1p)PIB017AP@u z11j)=D>>XI5bjTNz3e$+M3M^8b&z$KQlMP6fgbt+c*)~7vN=<$P>C&|FAT=!7;yXq@*J}{pq!VZgM)Em`PV}KO-){RTnf9-COutA=K)@c|gB{4{r4mc&+F2YPd10+x0 z@v^qP`kWh-ufq)tNLoQ{d1Bw!6ep!+O8}TqMrsTn6Lg!XMbvupmRO}bDXTF?F;3FP z3)z@d(CVd5p+|xl<=7PmiV}GWfr#{+3m@_%U9cMqlX$(R~VoZ~g;a$0d+ScGAlZ&IG zqcL7eANVIc3C!{-o{h0g=HixC&ty--dl|~jj7-ArHiUIkiMi)o&};ct;`v`WtNC+M z$rC=lCeU9|rz0>A5o;Y!BEfBu+&Yc~WPJ0u;<}Phyw{-w18c>Medtxkg@5DTk zdMkZa`j+%NnZ59BmxD8h;B9H=WWJWUJC5<5vMKS@cpAQoa%uc8@lEm1;uo`bW$(`3 zll@ip-t4cltFr%@y)S!z_JQn!*@vC+xe2+CLilb9O6gzV-W1;y4MA!B4DgHbi_sn^wY#DZqU7$5+E9A;MAJ}$zltWK6z`2D zpd^1CjYDa!igrhd{%3R`O7*^|9wmD}Vm*+3AexR6elRMalpl(^QPK}bQ&8HEL?1(m zKN^iksjo)d$Fh$_pFrt9j<`=`pNR5O3sDW~VfW~xsEd)&KB$j9qKT-JQPKXWmyh7v zDr0hEqDs`yzJSN&#sS_hw_ntOx|$FTLw$WLszRN$!p-OM(O#&#wx|>J*B(`)4m;r< zlshQuL0$GlS=8sj(T7o|hX9_Qn-2KU+@Vnu>i00XsAGJ=O##Q9eo_N|M_S)w18uy5oiTp0DN5TIKao}j*mWo7BL$xT1E6Bw2S4@ zN6+(;o z3E!}0dvaitS(NnbmHt#bd@{2w*&$G3oG^Vguwo@9*5^tuIe~4@T$hH0{!k-@`2Jzh zbS~74-PSsB_`flr64+Foh7VG;VJL+G*T#dqAhvlARKVx|Ww3nv`FqKcj#754LfOkR z20YPgTQ|mBuD9c)m5$Z4Amw=jJaf4T^A9=SeK_L1fn5lUYwRZ|dN1aA!k#Oidg zI%9cJYDx1gdnVn^e^7p#Yzr27wg21F@aZDN+XGzrN`wVzdc3Itk@F>aW0Qu64deOC z^FEMZ6H8?)>>X!4c|PSK&!c>Je^`@``)xR6!zzbd#fR{}laRBG89>K8nS@fX^cp5* z-2d4Mgh`8eRa&Z{NB;d~c0XR@Y-)g-H*{~yDLTE#_eOid%3)s!+b(A|4uxJnZS-h3yb(?m-r!1m5(8m#PcWzmF7A5)>9ipZT9fp96`Ay&H_Q2Nmc@RKi&YB zoQBucnE{BBL2NPdUMq9y>Z;8H^bs_)`p`<>_WcAUB=sb%NB*p}Fm2S}Q0zOdW7y03 z^cb|vGdS7EeuVvFY9+UJ{9H6zL=cM!dhjV|&N}SoJq;Ub9p;oHk@md^Sp|}j2!lo^ zpE_!LJ44i`TTM?EZlFS07FQ~)Gf0JzdNtB{9&Pk5km?opzQH>X&UvlSL0>0{Zn z*si3naj(pd#^B-hb5QGVnL6vk#qtwL`@Db729~+&^R3#FG}xycl3OVgIBDCG9&I_( z8n=st)C|=9Y;kz|pvFh;wxLYe{y~KiOZtzyXr(c(Xq5F>HNoy7pueC84oi%iI@Y<8 z3guV6j;GlN^nP*_sWINdH6?C(wDeP8!;AG|ZG&yP)9Cx6$u%`#7%PNPZ}xmbfQHUN zti*-6q7PNTN-Qu!Pxc;!n3Av&EA9>Ul6!u_Jr)M%Iw z0)vnTLkwgkv2!NIk1i`95xY#kA7xV?uI7WcQm({8dhuxYPe61Jho zL<+mZg4!rKpJ1tFRl&|tK_zSY-iECP3zQ7vik-&UDd-2VLxRysY*n!h`;;v3>wxEl z8qWs1`9lm=XJCOYV9#bx`k&PQMo4qB`Y(yyl|HFAe`#;<{tyZ+k`S-3ty`(NWN4Z7 zDJ3XVONcG+xWZ*@AW19-{wE?+`*<^0xf(3W{rY z1ZlP5*)S8A;|9j6wWO4{NjGB$X+INh7~Z3~+U?{Hq!`-1}joa z8qfW3b|DfoC2!x<1M{NE3C9ffT2uZK8#3d)ueh%_YgXcuQ`W&~%8^#IjpX7@$j$W# z<`yUXfI|vcv09Ju{1tF}x%eX74Zy9#_^)d?+Ys^xO#|yO>!`crYZUVBf{mc&_ajh0 z9INr(<%dN}BJNu}xA+DyPiih8Gj`!H@~-pegp0RI+h;ERO1ss!FXY0vKicllV>))? z9*mg9N3<0~;#a^OD`dvPHvM0}S^+s%Q4VVzw9rENgDc^%rCQ`JxtI12t@)7kd$Brw ze9Lc;T>6gIp4I;#wCm>o(zf5NiWn%5 z=xd^dc%i>nSh(C>`OxK)HioZArdk75w_HYd(H0U*8GY8Q*-8v*z8B>*1Zfc>B~x67 zbwX%8dCCaApKo)5#t?0yU!vjYi5@(Z8iM)vBOf&httzLnG2=IKxL!)(N*zkhSk)qB z@p>hIR(=jXZ5^^RgcCQSt$;(0;L3SZ&2=fq!TQsKCG3xmI=#QZzY~0a?Yuwy;KVl1 zk-R++b>GrS_P}IZSl;;V3F;LsPA(l46owBYD{B8wY`Z0PoTVv$mwY0o^!-LZYeYLY zT-=x>t7sTgaY4r-C0T>w2#x!C{5ILS07qTZ8u<8mrn8Xyi0f z!7nY{`y}re%gILM@;k9_zzW#{%kg=P{=Y*Uu_>MdZWG=s@JFmCy2!({EySBc#gJ#Jq5M~^pfsqe0ymv(tr&Li)AD%u_54t_l|MQ z-a>wBRX(`#1kCfWm5>WSQhQ>%jKCjShjTK#^??2T_Tp8fc?WBtGP;XqQ`?ef?`5|U z7f)`X{Km>#uaGa*1jsLZs5yH{eW=c`bLptXDx&&JCt5NF7RK z_ANEF!6KaPLt2%T0osSOSvQ&pFR>NL8I+`R>uVYY_gz_g1`S68is$m7F^tF(J{0Sp zHdm&O5Et`gxYF9qoK^hc#jp@TSf2AhJiNO>gFvO{UHec9g8ktQw>mVExnmDQTj%OA z?EDw;moj)BPvdUJyIZ%zI(`8=V0`aIah=E~rG#GbSGHH~*Pw*V8))QfiwJoUU%h$` zZCvW`4fG$G~gTI_t#F<=-NSCqyNZIPUD<}`eM@vV_Y@dK+#vr*Ii@#_W z>D#Y^m&{kLFJ1>%_LMgxybil+T7x1hY+hq&HKVV{C@60lV;!)k%KF$FSSc2nev4fH z8nQ~;c?R!hdl_F8dkgz^&lGP*o`e#!1GqBx`6cdnV>I(C-#Aj|-75cX62Z^d8E+P;GFUXT3OLZ0U#ndE4V(g9+h2sMEX z@%Qqr(1$z7_XLMBfapkV?GKj*4a%SCONEm2tww@<>K+pO(8PE;l69%MPR1A7;9@)H zm}*B>2}J#xx(P_tGTfl0FXan5)7#l%Z9hfr;X)mi`8p|s5MpSJ_dVR~3R6kxya!IZ zCJI^{OIx`OJpU0|(L<%zU`j>mRW6LPVR`|q;nqd_kzMbXO%Fh=BJF33Pq=cc1Li4y z@zO|y9=;v@n9mkkE_#O@@G3_4t?1Ry7>plHM&kQkta;%qS_JNMppr4W?==dc)Cm$q z{r3_y0M>01myA&B&H7I^`T+W`=s&DJfJ(wdE8>qn@d4oN+mOT>*dlz&m9gOax%~OE zfWVcL$0hrn!P|OK?+)tU)S+WpmZJ+L5Z1OJklSEw+0<^((+9Gplbm;zFD&h3Y3#BT zs9Tkrv#JuzcRts)`?-7j#!6kD z8{4rNF+>VjgTL{VQme4}u+|b@(%#VOH^EB8i7<>OYBO+#kD1!<5ejQfF8|hlUy2&y zUCv&xmiyi=wx%-uvphH0|2X4przn0V+zUzP_x)^oY$tA zYt}96xe+D6ubyien^mYf*yekobo80Z~8gOL&Yb7h44M@+s!>;v<31X3(Nwor^onU?aP0V*PrzX@pqVYVV34?dVm&zbXEk zq2-!|rGzH@cT%a8mDr7|MjT1A>_rX0HZ8&6tu4{&R$VzjZy3yl*s8q)dfT!~;s+EZ zA?k%K8eWuAB@5AnlQ{q?iyHIx4`yQaqPCD8g|n}6t`qpt97WL6fPDdf?32NLNAv^$ zl!9AZZnUGF&W<$%eRMa>-SLJVtf9RT?T^}hkZb4*@Rh;0q!#rn+-64QN|mYH3oY>) z##-(;3dUc-yW1TSEtd5!2xyV5#jk4+_Qlph0R(63-A zL($9{OG+?})rU73=Uv7!`wY;rZ({sx<`^pL$YbP-<4)#glz$`YOYI-g6et3l07VRySl#^EIrG{1&iCt-BrA@dOO3*Q{~8 zi#RxukLPln9s@N_J0gt-nJsz4;;jPd8ktxY!Ral*KP{nhk+*#1Cup^{?P1SFq_`il zzDmo^%*V{Ch?|XpZX4PQ+aOrt&5Vepwg}hg5E^oKFxOaLWNB@rFd~mU-xt)fZ7CdW z7htXo-SxB2sXK(N6;^)AP} zYR0WYTbNAj7P>C43@vfAj7pH=O?)vq5k4Z}GahMSv<$g6ZD;4QYo>O5GEP_*J|rx2 zVAG6E8&YXdE3ez}fwY_CUa8+QmwUUs z36nnB|K)7x1W9?UC&}^zu=>YB60iMaw?)nqh$a3mdZzR?b7`qM9i#fl%{_f?eCe|V zn=i@<6Hh~*=^5eqbKnoe+r_2NseQE<>Oik%>atR+t6)NtH{?m;X}&}g0k%D{4t(UT zEu%mqHFdaz;V#z@oQjk5(mWkE3}wL(FSoWgyIRjUx;m>M-G0`8bUX|CP;p%l$%8G} z|8n0cLk@iXry(ig2W@^REXCnID&lEQ8WcxroFow+EL*YZGSzQ0H>yvmRs_8etU@UiO89NXC#a{B9A@cnb zrm-Kex?8ptvu3%ZcQvC$$@}apX;Fw4A8WMh=%D?#2sx#ZuQiM;E{B(`R`7|dTI>^I zWM{Y$ywyjPlU4K|P7J_pG(A|J!_u|6y%1+a@P*O6qIT@Bt^zIAk|13ky&6uR?CVXV&))& zd>K>tO8eV_KlCn7Sj!5h7H*|Ey5@@r_QHFSgtW7$3y z;!Hf$Pq|*#m-2rQQ(klT5x};yl7KBZKMll&N6pV9RCDGL*^Z;NmoG5VoL1g&fUS{KOziB=c%bQ>Pr z)6pmKZm6libVn<3zb^WD^n>UZ(WBANqQ_DnjUGzvlWI%tm1<9QrzWHhPR&hyA~iqt zlhhYdH>Dm-{UG%)es`xHO+A&mC-s}umel>Jt?91RE9sA?r>4iHyVL)WE~LMl{(1Vu z^e@u4rmsogmcAo>ZTimiL+Kx-pHBZ4{@>wuXZrc{+v#7X|C$+}&%CiBZU8y}Qe6Zgb({Dt`P z_^0vl@y+qN__TO^{7!s*{NLGB{HtsxJ2bv8Ta`U2ek8jzdvW$-*-NtD&we`lgY3_; zv$H?X-kx2Oy)*mE?5VloxesMe&yC29$ex+oGq+dvA95efjm@5&>&oq){Yvf=xld%z z$xY5p&VDU7E!UkrH}}chC$nGAeJb~o#5 z&|^YPLJI^;5+Df)1V}Jvu|p&d zSMf?J_7|n0J_TmFP3V1_@gtNLr3-ksvK-edl$GE_tCVway$5x!qyG2d`fmK_%8!+w z;QFVqhH0>dC-M0detMMs_|cW8mFJXDw3|k6p2RB z1f)gG#OEy0i#15Q`w^Qsw}lgW7;^o77GvUY(&XS4?$RamDkpGVQj?#d3@-D9bu70IV;#2=Lv>BneG*wGbG%Zm}#5J7*sG${Q;W}Guz;&b6 zq?F;r#D%zCr0oHYQxkE$SKEv0^R>%xeYtj}l7N&un#IKgnWBJ?%-8YNp_tFOoP27QAPrf<|YDjE7FeH)PN`gVM~L*I$(UHUFX z*U!**UZh`yI2Y>|6asKpyI{RZ51qkf|@UB5}cNtvnNtlx~7Kh%GSZ*S3WfwWuo+kxDn-+{aC)PIEQeLC8s z{$u^eKks4l5&aRwc~t*7t{>MQ zN1P}0Cvg1>{VC{hzrG*WPwT&g9M*kh~=k@1-{9bu=-R zcl39F|6P9%*9Y_i%0xbEvKxK$LCE=+{sF%IQ2$V=)IZWc!nYsmA1i74C;DL}N z!Cn8+|D%l2kLpKJ>Q8m}lJ(E@&ydP7{TS~3ul`@9NdH{_T$!bRp?`sUkLzDT&R6lN8mMY)r;! zl~arND>+7jk*I_iNk$ToWFr|8 zQj8SEG*XQW#GGzSN1RL}6W3Wr7Nlhx=xvM~BS(obat-u07@_izV!lxTywE7b$(uz+ zk+RDuHj06G3=d?M7$wR$qtqycv@)X%NV!ptdn=3zq+V%MD$5M7f%ldeRYn!Qtv0G5 zv&N_eQfJiR-g=`R_cjX#(Lbl!PtavHyc|Jf2*-o*=(F{oDTWhjBSX&-Pn$pJB%Gl zm$B2>iI}^LUC`1Q#ujP zBL4Ztg^+NOaT)N-jmuHqD~v1f?Ulxrz^^i{!d+JzS3}M<#x+2`Z+u^wZCqeEK#b>GP4YyU|^68 z28PdCvsO8ico<}Yhao?7qH77C=-SCAx|Z;XuAO|MYXq@0rIF8djUcXuYdYPvm``^t zAl{}l@foiLU~j#+?lb!!lg@h`T3isKb$j5XTL@e|HCz%0NV~0xDltjZZbD1s=3+RjO#7t7A4)>YHr23v2;GHN*oag zof5kkOmPRUcbYp9lTM6H=M!UF`NY_CFvznMVSdm29`LixvvGZnxd+#DlI#{fNw$^v zB@jAK_IrGuY$UTZxGRr?Y5x@>#S4d=_mnpF&#)hWaOb`)Bjdkogz$FSw?2Y5Pn%m$rn@ zr4__q;kQ)9W#Ed_@bqR3_~STcvAN7*qrhU*6b(MSba=GgcvGx~C*!jbD+la$9Jpc@{u8L*kI3ru%4cA~7oPoc6FKQ3jRvI*B)l&$zYUD=MicHqaQ z>{Osrs$wkUE%*pET zSuYxuQq0bplq_)N7JRmfRv>Mn3)ekh&sof#HD=HGV9#Lxn8R(s=T>lN7jx(oaOm5? zgYN*7)|pA0VAA&~$(ZZiuf$`v_cMGxBpyPp9u~hxoIikPo6NHdz^&iHz5fA|t^||* zFJgWnzQpGVuMyv5km71X9{ASD#vlJaXI|tXqt*0}$PGD}Gz}(toZXKZx zsPmO-2e%G$aO+rR)jC-9jY_O~lln8rdSGwkDF*k6KYPho~#28NAw6AeE~x;7SUdkVAdG0d~W!Ly4MRr6>b zWxQ6R)!@2TtHpI4__xaZdpu^e-8h-MN9zGTQ=5hBUTq$}ov+OYvH^u?Yg(vCL!2&b&Ok8Jysb?@#A7e9hlvJJZIK8G5rx)-sT!(oJar$WH^cr*eBI>&jqKy4KZ&Av#(%g9}Q-ICvtL^ei!ucBa7vOCFpm9>qqIt^;31?`f1Gdqrvqb zK>P>6^(D*K94tQ?EdNnReoTK1-~Jqo-_49)FynWF@jr>#)Kg&m-y`cmpAM= zfScz4V|fms@f@I8e^-AOHb66hD4q#S;5ooV#~fe+&jIRq4v^1t02j{zG|T~xA{Ao) z0_^`7u8H@TGVgC;-k;CBe**LVam@QCI(WZ}dB4WIzl9mU3C8bI3XCzv7@S*Aj9+KQ zAI6Nozz7H94`Y^Z8nIycCbRrxX8COnmTxl44>K~r?6bk?F-9?)Phd8m%xvCd25&Hf zH<`6JGHVZG)^0jjdmFR%MrQ3{%-Rc>wTCfluVmI9W;7a&$aAyNj9j&VyC*YupYGu9 zVa(SJ=Ic81^?300*(lLGV?NmD0%IY{y9m78WL_S|yu1L6d^Hfs#W#V4PiGb$#wY#~#xWDEXZG2^ z3^I-xWE^wH2Ih{%%nsw27sfFcY+x4Hz$~zs*Y`ra7DPrm?zAGu8c8-=FiRBjm$C4MwqKmJwrWB?N|H9DpEGmRai2o zMd;Xml4;(q>cS_!6kn?S;s|~|5dXvv{>IOn;syNB)o;Wv5$N}qxNrNI?T9Jk;6B_* z9?x}PepiE!J+1sw`IYi(v z7;WG;LVte~dTI2~=rjMIzknX{ujt)A*1teI*@}4(=0LE!G|YB#_#GmcxxngbF-K{I ztpg;s2V+2;~SB2sH@Jc*{l$7=9~$x8Zj? zuugF5gtK!6yY(1pCdeu z@C3py5S~PM3IWfTi>DEOiSR3gUn4w&@GQb}2){x2EyC{*o=5mS!XFS`LU<;Qh44Luvk}fg*n@B`!g&aL z5za@r0O3M}ix4hGxCG%+gv$^vN4NsvN`$Kru12^9;rj^JBK!d1I)ob$ZbG;j;fDyf zAl!;@8^Y}fcOcw}a2EpVRz=;as9P0vtDVi}k=0I3SKo~;sAq>N_ zkM(X z2w3Sh@U)+SGsTQh1nd|#!Vw}6q7b4HVh}K&Hc}DN5YiFc2pI^O2uRaFdhjuhgEn07 zERKV>aGX(tP>X;WHaNyOcn8OUHHZK(1y^C(1Fm2 z@D{?`2=6K?%V>s-X2@uUjAqDa29sTicN{HK;!WBUM1N)AuMGT!w<_VU9{kmVHwzKc z18+Ox z^5ONu`?ukJ9D@-p10z}*+lUV~LhbqQsI&K=mjkfef8hF`2>(XFlSYuJKqBfA>;5XV zp{ObFIAB#wQMQI8g`_2gBxQ(`zS&})Z=bq0zKD1(tluhIdAYqvl$It% zs-m_{)OPvaiub)$5FxIQpnKG-hc-Ut_0pJ6_i3B)Ml69kHC>67N)XiTKwq`v&X?$L zy+cB}OQ|F|!S7h$kn@f$XQ2aq#YPu7&_Mpuf}*Jo^f6n)Vu=RLU+_DYIOIHU%US9` z|7xSl9B3ea1rBtn9XCp%loNHojY3mFbRF+Ne`?3gcc9yBw9tXJ+i12#hf~!9c4{t{ zE^bu<>HW!y?J_?_Hh${QhaPI<@WTagZM`i$1NEzu-Doet-Z1*$Df0-nx$u-yGP!X4 zPYOi{K~Tm0ZS}dn^@C$XQ>NJJyL^n;=L-=Bd~4MGwedqMVTHf1@tvy0UosEcOKgoX zutt|FQ9%!iw6@^mDWnzx|1GtG!iexN(@ZHXjG&7YcTr)9r#L+&#pA!&B67Fw@ysg; zX;@Nn-rg^d&tJN9{_wy17A)v{Pu;(;zq~6WYWhs?+@)1DO^r2GwKcUhu>a!W6Y5>) z|B@7?DLGg56j!T7g%Odi^z@YENosglJpL>xjWkVhXZHn5OG}qs(A{}KZeG@D-kNni zIXOM+YP_dq<>g*rdKRBMW5&6QJw-)%+3u|F)ipJ%yR$N~^NNa5MoxvxNITKc;x->9Tj$oc?dh9+P8;P1wPReYZPwG#%hAs8|7gf9 z@QJXI@oa%<*ivk|ite&vYo@jdd7;>*E3J3f5!Zx&o?{KyQ{L=Y${dLfj6m_?JS+Vv z>f8SG)ty>}Z8b|!K8^asUWZXWDz^Bpunke1XBnU+OI^acr9I22ozh^aJ1CkaQM9{& z1k_F=$q9Z(sx9XVjruK_=3+}u{RlbqxQXcs+_A)Q#}Zr45{>#TDQBqzrG87I%N!{6 zTM{jBpww?kG|GXJ^++^UqUg<_T^mLIWL-FNZMxze5~w$m67n4=^=1++bfDCmNi^Gm z9~qN91I=Pv z8f)273UzPNlG>?16RT@|Z=f5a*wmWu4x zrmAlJ%$%H=>ubGhb21Ar*xX|GD23=z(y2$OUeleGnpKvavs9?Q&q?!~Cbz2=&bNDA zFf=VFnkrEr=NdYe5>%_V0jg2$OElIYfoe&j+3V2QDG%CYlv_jFo~|e>JW1ikxAvr5 z`s>9`-*x{(1222MfAx2(-=qZ19w&$`q0QG7g`^~%Y_H9{tag!((SNOJ2F8h&CHRp0RQggWyhu4yA;~PcfIdHdy ze+Jy^z*8+8^9C`-ffq&1F zqbH4^9-2=Ta}OcqWKeuX;Axu^;$p5FWx!uEo)B0Ss^;m+RS8*fow?@@E23?cS)5;( znSGPEr`8vBTATo7H=U7H{3;uc5i2*pSdN_;OcLdJt;Pg325)nMPbs-Jd?A9d6Cxa@+S z?hE*Lcg@=F?CkEfH8tzHb8@=ZnVuzkX3W^L#N!_#>iw+SKUPw{IZd|aJyP#GgQ4!A zXsQDxrY0pUw$OSl)Rv1G@J?>$LGM`NK#8eIIZGWVF*S)UbD+f3BwFA=sRx#5lmq>h zjm9|8XKXaiLXm5pTSy7Wbr2oJJ5cI(W!!v}kXa7OJqx>Pz_$Z+$fH&?&w2V_r2WJv}sG($tXb$jTa1A0M-DcMDCo z>a)AnR9CO*%H~R6-IFzgfD33%(mtCTx%Pvur-IhyMEzt}I8mOxj2TG%p z)Lx+jB?cwYYzImss6_LEqPdp-Q@IUg(KD4`44&eWl2RAu#Wv+4y_=?sCa+X0G)o>Ns~nY;5efvF`B`MO0SznrfQ*`WqqZ?MY}}wae$3B(+H>>Ft&gwS+!`M`NiA zr;Y;}%5-Sxpe=X00}Zr?Ea(j^6%LFv^yA@p(mP2}mL#XM>WYfOQ<6;+s*1oRIWYWA z3~|4l1mAk|e3}H$zd4U4kS=jIdootfy=B#^+h{^OyYHN~+Q4*D`YoTDRH)5*;FH8Ley-F3Sl#8qfKUXcYIxK(9hX|alu&5J z9T*W8+fTt;@-PP|L#==(1ZDtm#pD{)wryt=8EL#hO&W%bho4{=6A^Wn0anjPlfiq_X7cg>ezlnN4NI1D>R~%J|si^3>^t zu@TdzHB1;XjN7%v zcbd3){@#|!@lgebGfh2jUPJx7JjxTz>xYo1Y^#-GPMuWBzDSTH$&%2;yUAB6+pf5A z#(9f9>cvApj?U~jt;V}*MrL;RnySp6mW1r2-esQd^Ou&CEIAjA^1QByn)KSWU0InJ zI9=7Jb!CO5#ug=HMW8qD>^ye~ItD@eKhz4;vWwbb3Q|uAIq`*B@`ZY4ZSBxr(x?>! z+Q)hlbXj!lzkZZ0Nup`TI4*oMkY>l#B#K&fqN)|Qegvvm=)efnJm#;t`;p5Kt~s7G z2WHRWvI}l%-?Vborq&zHo35wX@|oMWpNYxx#_MlFPN~-K=bZjV+Wcb5>1fm)6io|? zrUpd|94Ik2nOc;E)~m?BjVg|~)COeScn3;sOrrUIRGZA4hESI|EY`9A9_0W|GF~20 zx_T?NMD6rO#I@4{O6keC&h&@@Ni@TsixIj^aiG)(${ZIuP+~w5&32&F*GM#HvEY`O zO8QYU*{c&alGA`=2Dndppz_sat&4lBYa^J(ObN-3D)dHImAb}-kF)GS-S69Y#$|Eg zxmi;!(gI@RDUOI2B48)BEzp{Y)a|EG7p<8{8zCLYygGG23`L@ui^)RKOR7)EcC^G= zpA+T27kWf;wn**py?~KzB5Ie4@=Qh zrwVp^@oaiYNTh$oGDJj&_}=IiMy4>@eQ$&aJy#sUV(0z7X}P{rR0h6}%l1CfVngQhr8sYJT zr}QOwL?m2E;liC1o+A#8@kOgyzL>G%M3K58wzg>K=Ga=w3E#oxJ}k?f7z|Bwpj1K` zH&&u3A=0!_T3puQcRZ1ZrV-&Hi0P}G89<|aUR}zBdgIwuZzES!h+b`+8Q*6P9 zkr7`3XXF{;O5fI%7d4|o;fxf|pNW6qu5b^lk1^i_cirkAKzS^cgQ^=ESl709VD5Qs zZQEC_*b$BGbC<8WxT)#lRlcp_+8x`r?eML8xwaOXU|FmQbp2!j%SjWXQMUu7HES7n zzC@vk$7~7U0Lw{E@H-Yb9q&M?Rmiyc4wU+S zi55CgYAX`WmMGZ43wCO>a&wUqNRRqoicM?Q%VqydR>f=9693GJ^UP67&p`cZ%2JrS z!EJ6bo)J=(&;kzq;CC9V&wy3RIbe8*8i6I9)nc9RT5i(LO zRlXB7Z&p{oDK5YI)`nf%eA_68ESoG!Or#uQ<@ylk9J31Jion{a*lVqg5+3eYvwWS` zECtR~J)y2dJIUpCDCeb-{t2poF`DM6f!V5mQF`{G@6}Z-uF%W+a=p6-YjUTV+_LiS%&6?H!s3DAxR}bA=+5%W+S=Ii?5fVpw6f_r zC=KU=OM}jeT39ZXaWv`Gz%OkT7rc}IZ*Ve78+}z$RAm(g(81JG!^ea z(LSuW`3@BA!$J!kDB6dGW;;+Y3k%H)isnK`WJ#z2SW<&z#Kr9W0aNknh5Rn82Q zNRA;LDA8nEf1)uYFd+^P(P;d*;(YIE88NAI3r<@;O`InFxcU5;IB!hk!U3O0Os}n# zK1*w5)=hf(wp|{j9=8XJZa--H-tvl3YqR-1D@(nnXC_R)@LW7Cnmf3+zw6v39&254 zZB6sqc6WYZL3x?EaNHNZJINww7Iz=F2ds-yOK_~BlKn~4xjGv_{j0MlDd%=v^)zA2 zC99MYMy<|TXkc}A3iL;-vsvG1byjNN2CUDX|G%_A3$*`J5%k=pBCbLoY^~7lfXB*( zniB|5w!I;i`+g{vPgL(3S}?J;mS&h#?@NcT`@gP?uJNyoe(swjS4KbcO`>|>^tm1i zWY6}9bq{Rz25h z>f@Bomf`EP&jPEO0_+#x@(R4Z0PO&?q&n;*BY%$V*r5w{@f3wi*G?pUX^XaB)V6wH za6{Y50q^|6_Li|RJNoAB4hxIfqdt4#1-=gP$m->*PxmdL-?>Y=d<)e5*Nkg!?d=p@ zJu)Ztlp;zDHy^Di3a>vWc*68qTJay96HZ^;eb!a&8<(!w(cTgof4=(cwU_%AiQ6`9 z-hQTUi@N{82?Lh&>-4+TXZ3VExeMu{9#58Xs%SiquvQ4iD84cnnkG?rV2~5!P{vhP z1mcnnNi`mD2CMi`PtCV1RJ1HF-)sMd6X* zZhIv7hNY^ru@0X4KUN_xyfXTQ7oxA+^Yz8Z(H?H0bXs0LOu;bUN_VG48ob}*8-03R z=Pij*mxK&GA0B`H{BQK>l`d~O;r+O%bMTuzdN}(VcF}^Gny7@pb8DHoi=CUH=#Qgg zny&5WxUMm#>Y}Em^Y3m~D=RY6(lRPilaq(;P;VY0?fPXvyM1h1MPGd4M`;g|g{FPU zalu58o{eh98HL3;QB|U_Ehnm2=)efnJWduz-j{pPW1#iW>KC%kt6X%E;-PJtJ9eY> zEMC5yTF+kd+RMcqz9nQ-;)sN#rAEI`JMcc9cKOElk);(2ncXEI8@zmj#RjTbVoOQ6Dr)~Yv ztnf@ZE2R3@Fe|i5{V59K_sZQ%vp-9UGj}vf$`mu_TQ;O)^Re9XJJN=1W0E~t5e#bU z?#tSj&z-ZXZROlKE7~sIz2MBq$cWwMWtWS4eS=$9t=ftuLI3Z8%P;F`YwMBLgp=l| z7Pg`mFgL`yiDhLY@YE4FS&57vH3ARFi6OFQD+}6G^Y60XJMgJyC0y0Z0 zM(6floSU4pt!?e*i1>5o?)knPUs}&wU0zsTP_X@sAGrEwUVHh+A8g*dWA~d(V<@kj z2A2U#sANg=f}yDnl=3g*MmbO#OC%a=q4nx7xo!!ik#QC4W^{V-4jE*PQbxW5C0mkc zwgV+AkZ1;~UB%Nuin@F1VkMTvR*}iyq;C$lWVUN8Po~N#k zt<4>}F1A)QRf}q}NtVO>}Bav3*PqUh<66C0%slPYFyC&f{9Dtc!8 zxdi;%T72SVrtlD#fBwd6)qz!g@qpIRUNk>3F=JEp%8g%D4&=J$c0Be-XJvDZcOYy^ z*s{|@pKWMOj`bv`tytxI(r`EBOmCR(DaptwDJ?E2u14Nv%5Nh-7gCAL4?d+5jYf|K zP_4=z*VSjC^~k$l0=#O+NKWuOW;^6G+j9CHXt|9J1W;SLX&woR9`>VZtCnC(m}8;A z@@L;6jydj_>z5;rY6Z5OK?hoGqw@l&BY&qH=pX%Y%>x!nIhpE5NmD^|eJCJ7i}uGg zPXj9_p-Y zsp%Z_8+O&;stJklJG)C4G`WTFm5Dp!iu#KR`-?mastaZ&WTdRF@viO)&mGsa)aY+= z*H8C&+_@z^&F5H#-`Qz4bi11uSGdNTp2(_!{QNo9i^iT5Sqmr= zS@9jzBbgs4^jlMw!B4(ZJp}JV1a>?zYqJ*RdG$AqX0nmtrT#}JteqrcOVfthx($sT zI~p5z`0j2Q=lWgQoZ{j+Wo2`Visl+MJ7@RrsBYNV)4i+FP!IVoTeIfYilPNo)$@yr z=2urOC?YNABIWVWa@>eiBPC;#`&F#xQmVRkH#hI@YFL-xiRsBJ8!Rp!EX(VO@g%G> zns#+{?`$kCPR&S%WXMly64){`){8FOVj zvO?yofxe5>mW{Qwo7=q0>c+&3HEOr_WVOdnNSKwo;s5K4Ykq5n_<6y;0)KtH zL;I$1k`h_vC*pLx3q#h^-72vf#xa0Ct~|?lJx)LJFKyjR!l%enDc@@im zmG46u((ZC$cVD;m@Na0qqJGwy%?;by+PBsVU#Yk&wxF-Hq(9%Ys4BlV9u1VNuxn>i z!>(=vZ7{riZeihIh1CW#v;F1FWm|e!TB8~aJsK1}Vxg&OKmx2${S#$DX79Gu_#a6x0%(L(D8W%p=oj0sz?rJPfp^D^zmcIeT%7$ zn=&q=GCM3@?o+h2Mx&c7^D(O&bb1HdKRg<8=bq$W@K$0E4nLn!LZh62m=n_|qo=o% z{fj^N7Lfgy&d&ENtS*=ppOLy+o!Ydst7}&idL?~=;R&bSYOs8Qcd$4)H7^tURq-~1 zGVynHqG{r6OVp?JH}$PAaCy8V>XQh}rI z1n_X#-1^)cmj&^i8*ENJ01T)JGY z;p=%MS%&AJ0yv(7qA`Qs=Bc)5kN9JoM~3Gqf3xwM{kSU?IE_=w*stT4?jMhOkj)BDp|6O z-(tnD!t+jlw)O0GNjl8 zCi#8!_JeBSiIri|iG`UtE#1$Dgp|Y-7O2HTe{35dn}IYD#if_h8d(~cHEd}ntl0l7 z6wan}$!DRoQgO2?S_b}|@rM@C^L8%I)Sf3Y-%a*?rXCuaCPGSmPgpiLlWp-oluN%Y zD$C$ugj{HYa6FAPo_Rc{Hu3+K8qAMVlWh*RdB|a#$co=KITx7r(!2pWM2n!(!6Q%1 zjd0WaCQy*q0B=GHK7FuX6|MM|cwVwKWm-SnVQDOLuEYcUDVJtEVTc zrEz@J+O`?%ro={W8{NwUx|@ktM3>jim@&S#o7ydU1xgpXIYl~yxqpD){(f!hH}q?? zGUM#m8pj9e*Ct+tZjIC6evQTw_`S)m!JHSnkkqZ}$9lT?8cg04zMNojk8oVFqZZC3 zOK_@Iawk1ZTJJXmZ>!*MY*rW62qGpy2El zIxm3Q(oOS}0|jTd%5orpYSV4>eFvIlqyMr{$~9`oN)5RVqN76rltv0GwUa2Jzs`Q7 zq|&o3&N?IevLD4FcQCO#dT`+D6**&PbMvklF==U$neGW=awkkmsLGib6Oz)o08E;Q z>YQ?(R&&knXj1jeSnDCIWKX=NCdHgTIJ&Awlmev6QPWi7AE6YCQauHUJG#VD0+m?$ z3Yye6@Fa{^=|rnarl$o>SBms8(UvIq>ote-gBA9dH4w=7$_8MtloB9zcn& zSm=qM=vS8Qq;h+AE2aMV+Q_X!lJ}38m}#S2F`~cF8|5t)Q==!6lDI$UYw>!+{X4Hc z+%-r8dZ&2$G(0>Oqp4CYO*^{#&q<8Q&kXZFI2Pe_)JTo|0(qR}FOO@Sj$t3Y2%*&4 z)1+-p2xt#;Ijii)f|mVr2ij%F{jUQJwB0ZK7N_~FezAFED+|`342SLE`)``>igHU~ z+v@ALbvd-8PMNv8v2F`bCH=0H(!K(ArNm{VoMtscC~tJDtNE6hFPtpo$*hKthkE#+ zo=iMN7Ve4+`MM{waYJ40h9=9C+2|Vg+z3zRj(+lFlDn<(Y4w#`SFiEic?$JdHNUuc zeieH%{V9K=50#!@``;?X7EfTRYc!JEmVAr-JJ`2q7xk1_xMuaOLj{t_h_#$9&185_Nq9233&KN|HM$~B zo1u@H`peE%gICKh-lTQ>G6P_Mb4(0ZVkJJ2JHf=N;euwjbpvYDib z*lQiJPs!NW|Kp79=aJoreGd78Sc+*5QEXf5Pw8Th@EsILYbH^oxOqh~T zl7pvDVi}yt>^W73e&Jl;4GF#4nEHstM>qlK$ATDcI=H#$MQ6J8@sv|DgqLu4| z7Fs_duHr!balv9x7SqHXWKUpc8{qlDj1l9!<*T7F9*1ACtC~&AenO3&ruQF{Wr{s< z-l&P;x$%V^SxdSqdKb=Y>zdzEy}r3=c}a3vQ*vzWipuJ>#+Wf)mn*q0r?I_C^fXqs z%^UQM5uf#LC@btQ&1or^7N0v%Q#%hCQ0Zv_u?M;Nh8>wj;b+Y1lwPQaoZNlqIebt< zk4g^|d|9xio$4OUC8x^q2b};dSo1+!v^8*SdrwPVc3whsc%|<{(PZ?riNn6g+`^cm z(5d2$%1YE_1Z140?$OiLCd_JFt{KCZ4{ri4WuJo9o5)sNo&O?R3Bj&3q-dksON^r4 zoG4zTg}9R_cUp}V*JU2Sn~t}#jQSC=6)6L=uJ1b}n=etFEkvDFVYUn}4RbTAfT%89 z$(<_RhUMg?DV<5vsOZ&3;qneq;CrKQc22)ngbp3MYFY*PXrv^v{Tb5slPQm*(W61p zBSF!_LD5qVl$fnd?SO^WQ)&FD3y#Aec{mh6nXO6*CvEf^^)5>Srltz!=a!6XxIGPw zC|$iOV>9YV&lxw6-Zh+_l;BK{7=c8O*}16V)MVa1cA(S`N_5D963de4@c^n3dywdt z7MiNgvh_o|Rj{McuOSVqtyb($12Sk1W}%L}F@KYiKTjq*5@>R9up>;9x5}r&w2wY) ze?8@I%^#@~ebM6ILwJjoG6wW`6=F@cW6|?t{Os7vziWIn;TKhpCp=#Fe8bPeACh;; zJH-pW668|e{Ws)iCF+1yKQF;J@OAv~2pk?WEB=8IctFk}!jZdBltHs{7wXcABHg7$ zT4`vCJJJ>Uckyb^gYge`y(SLKd_4A1k%(8A`~%Nn98UKgII4f5sCb)eIctDD1NKQg zB{eD@KbxeMLMf}#8lsZI^5Rm8B9q6w+3fo&!c)ESv-a1YkBahyhPw-9jE9;YE%HV` zp~m{+Q7@KEYEyWEh{luGf}w{UD76R~_kaVX{#v339VoREMqSFBU~&%y;?pi_5MT*y zgUY>Kmiw<{rK8a!4wOnL;~tbKxCGMlqb>!`NL^`19aZ3TUE1Ltf%oyS2bUfn3+3^O zhyrzhCPB+u7GK(X=WU7J@Ti1>tlXBa5IjgmzFu|FnP;AQ%XT3CzPVpZ$8%&f{*h0w zoc3<6@HN?u#&#~JG(w`-fuoMdd(yx?7reJ*v2nrBqXCq5>Zlyo)n}o!I!tv>C>TZ@ z$q9bPY=@j?TTZ_NEw|Bu0BTFePMx6WVH-W2y)rU?b1XDi{sMP2IPREh%W0ssSF4jQu@3A>d4XPi@63o+>I%oB?Y^+y(m4>)|n#i45Qa(^vy11&KJ0YX(Z10+x;W^*BN2g{>#~jbh^uk`p z?tp%4gAQp!mW8bMdRQ-wQBV4{q@U~9$MCv(H@*+-W56Kl^o==-C)aYBayHC53tJdE zTQ)XmKCdorixGLVO3DU!5w{mJZ~rESn#~<^ie)b6d21IIV;fOswpCZWMy1{)TcBI?QWFt2(1T;pBK$eVFf<{=qbN2#2X}~8L)2z|nxDee- z8+SUJH#KPDH@a`h2&<2Gr`TH;YPYn_Deg%x>?LA&u~R4?*gOefb3oU)HaW|cD7{YOpYF7OinU-TGYOwhjR-Jz0xpYH%*wS zmD2i~`UuMJSbqavOY3ipo8~8f`{!G z{k^989bN5Pn>1gJAs&no1%2h^bBoHB)D+E5n4T&(3GQh6W}jlPo*6Dh)IR2*Vx@l; z@2EGbHVs?Qzr-XymnQLH-m8E0wJAJljppiWc@F=yHHSZw=kQW8&EcO$yoM_%v(3q2=LxqeeiYuAj9miDgBww6unJ61+Shc7dBZxhMBgA3*kE)>&z zhZYXbT_9q8f8Vydv8%J0%S35V&-Ytt!3y^L1i=rFz^Sj5@eho^19A=#&SfZPKLo}> zoQykyJzEb81PWH-5nr^NxvO!vJ2iQE`Mmx~(W{$n9|h)(*ui6M=vg0LQCGOUQ$+fX z_RY?n?UgyElqd(3G8n2g*By!aeGi0EDP&x~mw`|kF(i7>mhc46I0&Vu1(sME8Y$WD z4FJkxhLqv=22flY9VF_X%M(g{s6;UjhgD;iA>QU$73QtZd6gUPwn{ZT&pEw%E$pU; zLw^vMWF0OqCtXMxq>H~wUA!3#J>o#A)H3ctiNa2i3qR^o-lV+gm~7R&DVDU;lQS4zIWAh=U$*`>*Wbfqu1(jCeAZ*M-XO!=jW=8MvbKSX zAqRfU!Z8AkU zX#N6s^g8aCYs=}?=Gt-w9q39Mo##LU`8yRr)nop+=zCeKloQqCM@dsbbbTlwL96q} zHBUNFmyHeuQ1u-fJ#M9zinq%7Q=?f`I@__V@isg5rvVw-Wj6X*09A)=^w==o14K5X zxnXJF^cIXrdAbPRf-$G9HplmLvnj@jYP$}hZVI4sZFL)2&+l_77X(4gDC`g2gd4?OV=*!m^63Eh7Hd> z)7IJ9_R^E}ZEf{GQ9YeaP3@5#ZLK|J1;w8Hvcmj)c=Lsl58sMM^?rxv3>NlZ+}(X~ zf8#oLZgO8i{Ti=#O?^RMa;|&5*>PTP@420snRzKml`HG&R#hZ|AQIzZ>6!)&g1gh0 zkWH2_8a-m6sgx6cT$jcxKl#{K?6DpJgLJuPSV%|5%uTSgoAOObOoYU4K5qo-?X81mt2 zd({V&>gZCcJKA=RQXYw+Qd)6Ag*3Lj)v$l$z#q$nu95D=bIeW@ua}Y%^qlM4Ul2_l3P_;-$&!20fueu1(4hcI{gZ_r51`r(8$A&e z{Ys*!foMBt=*#F0IsUwnrCXAZVVkaO(W}s+(NNg)@lE^IWfPdBiq771+VI$;C!%y| zP1WMkisf~=eJN?_YpQzB>&%+5%Iw%XJE9`7VO4qgirTR?D=OpS3scfM&+VX^eiH%7sabS~9J1M#h{=d%7*of4FM8s8v6d5A5A*CbZA5&@Kw z2}kdYCm`^52O<}9O8A>S35zlQ>PiPZUKgSVr`7IAIzh}~AdsbX!oe(n-DNhKb>}ncD z%E%G^VgEUeDx4!%qr`{r#}~c;j(zMhKDCc8xv!J)8!Q}kA`-Z#ktO@5h0jO)r&a0& zC4SJtmtxoP<6IL`jshGS8vYmJzwAi&kQKia_=nsVN;xMjT$YP^Ln)_~aJ0v{(C8S{ z2=5;VrcE)eVtGnJ@~oV$xva$?%A*>?@FB)=zbfUoSm`!k-}@Vm{Fe>yB+rwHLz zB;z-8ez3xd{%a=kGsUs5#Y2bQVz#`mxPMwscvb4kKZ(dWW|liAK4qt9^ZL$NxBxkz zJ7=**8leNz)p!%NK(g5Z$n)=P$6G!$duRJSn&_E%D&rTeqUUIyh`h94^!ZL?`c9Hn zicpX53BT13u-s;nYaWSUt4H4exzH!0E;YiA%XUmC+dFmuQ|fH*N#SUNm8!?*VwTy7 zD4($8cEl!s*%G!jBB~;HW-J#-%S6ed$kcZy$I;tyI)zz)6ySgtQ_2~1pu{{SI?sVpKP_{8Du8ltEYSl2l-47xxbHjA zUK{95FfokT)s5Izd;;~ft<_2s>YP! zyx6(?rjB@T_LS*U^YM^!_eFD1uin!})T?2(h9*v&8j=;2RuZdeVc|2Dm-{Pvl~+|O zR$y{Sd$*{jujD%2IHIQORpb|?V3g`9NZde)ujEljN_BOJ zk~$j-pggKb^mqW}F;t=_f}&qpT2JMcGGcEvzoBE~V-k90!{am|sVSOQ{o2m3=!Q)H=IStKQ)4|nk37N$ zCCl#W2$h-!%C)jv)`~r!zJhfs%kI=E&0i$?xkDq{Z1lelG+^~#Ku=(*@S|)*pB@h1 z1Gr1@H*zqo$62j(R-jn9;IbJrE?cnY?Dn;lm22D2o(iJ>1e_{&ihO&bUf-~ylzb|_ z2Coos4azxl0n)MF$6?R>Q%b`f@8ekgcKhmziq-9pB*s24tG|EN1F@`Bes6 zqp`Dst?GPfRa2SGj6#n{l;=M*T60{NI+g5l!Kk>WWL)rlSE8>M5>l~%8y?ldqHH!m9OIqr7B*!PLD(h-UuWoOzNh@63 zT(~4U7180P8H^;AA)lN! zYvppOm4l=eiBhYQ=!cA2JDN=suU4Znj=uMZsr5KGK4T>HKiXIM%o(iB`Vwu_j3$3S8K);N-;GztYheH7g zJibZ^CvEg@9-#@PGv_p(KTtXD=F-vZ6n--LYKkMMzx$}t(8g|WR1{pp*Y?*5m+?! zh*Qlq^|jTZ{?m`;3n$dc(G%L&NuvNUf2wDDTx|aIkQjOVgnX4&oT@r(B~TYwov_OA zX&|>e0?RTuwLpD^L_g;;OhjMVC0m*G770y^8=CP^)+cR4m}DMRrwqMF77g#Tc0S@w zMr$1Pwuuj(>3BH(iN?oLA8mf7;9gM~g zJ8`y08UKJ2cgQ(JIC4j;kWp6dLc_6RI0ZX~J)!)riU0g_=Fby<-t*okvz|$KR(Oj< z_OWBWH?w`u3(Yr#doj;fQ*iHil*|)p?U^nO|7_BiGhR!7t^N4KSM%}0qI<=FZ$tj8 zC=18uJp5YP?nl%zN27-WD3?RVJ>Wp8*OTZ$iDG<0KK!Ul`G{(GwA@1h32gmR!pQ*2 zwky%&4wTx2M2~$$8iUQMroYsIcS~f6i%j26@uF|n7;$61cptu1UwkzC0{9Ltw_N@H z;1eE!NR9(N5Z+h#)vZ@VjtsAOZ=lAr? znoSRn^?pHFo*Q692=uroX^;wPMy80xF zJO<)oM9L&N!S9&ukVD*9%ISBYOKfz&fzsSh=I=;Q^stTY;WZ8^caB7Z<}YwZyW@_z zww!ie6_IiV9VpFBB|6W62J&|*fU*_KTpy4q<%F4nlmJZysewZQ32d)Y!bt~8J+MTF z0w`OtM2}mkrK$_<)M$M+j=7Djaq0nO>`wzSXnoc~KMSDTFUq*bGHG4`wx})UmN4>- z58+>b1-H{WtY-yGFb`OEU(SKj0G-Xm(aom0JN&`0NM zv1GQp4`Ge8Mtg(bd*)oN(--k-9qqK!(ckIgTF3|Iu(u-DfdX}d~r1oX^bk|f|dqYiE?;Lk~b$C@m>inkcy5#WWs_9v+ z*-;T?;b9dy+4+_Eg}IfJV?&W+&H?B66WM+~r}i@%JsK1}Vxg&G*p`6Rzt6e-1ij<1 zA5}ZqYB^2U91E=hnCq7VlzcD}9dw{%=MtUgK*`P-HBSXlwsVOd zaG=y%OZ1?HB7ba;QZDirL{oyrfoDH-V->aF$3-2U?4d!ERwY`4}Ylali@GX3k5a*yh#NH6H~iu4AeW!p9v z%t?rfZ=K%L9WBzthD94AA}Yf}+Z%mXe^gaPV;cFZiX<06ZH+N%F;6m^0Lj&vA^^2^NO4zttILP zx7<-{i55C)Ezv^#Yl$c2TB1a;mPlvV%94ORSaC5<7IwRyBa!9E2$2CtnQ1o4vgjVQ@R_gBmpDT6CQXMOGvlFn) zIc?q|dfOr`bK+%S{#sZ`eV`@1#mY79<_+Y!?Dv7VWS?APu4d$f*68m2ZfkS{+3uW# zs*u4<7rI_>A+W|?SsXmm1F`rD=9+Pjk~iYja4{%BHrJp)pbGRPXwAzFWk?-p-zWOg60Fs^`oJ z-pa-XqmG{J#d;Z~hO#Chbvg;@ZGSHCetYjXzae7nY1>=-yL#rgHibs7QN3qu^gSqg z`sOa2>w8l5Tr{z+jxB<0dRnsm94`4N^oT^^cSDNE3CDG*S+)dX{Sq|~%DCW( z&bT!7fab7fMR|snS#$oK#z9^Lf!z1c&gza%%4}UWvJ}tHUzD8SDcvr-&cayrHKclV znG=^DuRdU}U^(+*I`U06BujoQNA8UHKKtceSjWdaHSiV)n~nuPB&SksR8wsy{K)mJ z^`}Se+ZT2ED%Q8*|j3GTcuJ${Y0MD2c zRVB)K`>#K)dBBoTKO(Lo<6@7zQ-b+Bs(14IG@zHpRt|W^Mr@6jPr28@R%dt3n#Z4RXHUDd{qs^|72V<;H$csd}EB#6YgKyzOkFR9JM1#SFg(0j5^YD#to!* zGp8pdIMX95muSE%)iQV^&=F#<-4B9K+Y4O=Z~ch=W^s{tn~7_XZivuJK!S=u%W`&e6h z+FEC|?p)KcIy^G$G_z=ByO`sVal&2NZV@ z{IC;eJCX4ZIB|!ZLxiIxEF8X9#hYBLr$zkx;J)dN3~jBO-ASoS%KPU;M4vWe)h^ja zyz2*YGD_0Z=PleZuC{L1re8fxP2~~arrynER0d9i)8^d_c*cV2W;A*@fO7t2+yf4j z`gDmNw9saC0b4(z^o)h6Xh9?&3dmr4lrl~RP_`zC9(SN*2@*Y)Ow1zStqLVCUBF)@ z=n0Dycb2%o<=X+b)o!@0e625pJ^7c=fcFXudtTzQwg*dJfLvpQ`-rqL8a)y~c`TE0 zrH?KPV;Os}qy!foN}(###r>jP{Rm!2H%7D3?_&tZ`xrp~oilcRh9O$d%}x4$X!{Pp zwyNuI-6u=RbYe@gyq9dt*0ild=slcF)*J~2X${&(D40#THnl2?hJvB2GYD$o0qt_ki zm3uAPr)twbS}xI##i@I-Nw#nMzPeL6!SC;r$i1+`XNxS$|x!%gCrfZb6Zu-gMf zGl**vUO+}HrHn2N6=YlRfsFOCc_gzp@qCz4d}bt^T(93E$i&(=ckDfH-!o4S4n6WT z5@5bLvTS6`TVHb_3?$yd&1hkPEK!O|&-yP>>06k7-R?7o;x?bTd-n$)^!D}je(-E- zcX#Wv!u^YTx_guQdKV3OE2=^PPcRS&f|m$J%7v_qKd_h0lR5|<0Ixf4UemuNXomV^~eT$Umu) z5d761#Y3;Way8v8L=cT|JX>N2@BBB1a5aZ8oyWLHrON=fREm2U0Bs`B`Vyd$ z);g21hJ&~Z6*)?@ZUgSR&@-Ky2R%9MxI;rNKk!aDlZoa(EC{{Ua^i+ACM$omrl$B0 ze|YY_mRDJSj<}lzgF)>)wrD)W_U4E`!Wo|fK{Hz}-bk3zPkfHm;qPT;nQSZenWbxl z^iGN|a##hPzd?!#iQFU-MGMCx zUSxj|)>vB?XSaSJW()R;N! zrCPOkIDU3ag0Vs=kEw_WU%r`{G1`kX+KE-)A1R8^vb+&3F5vjV^z)cE{=KD)1u|J# zSvXF7Sueh*286E)*{I(r&SU=`zcT{mZ#XqJb87TJ%O)XToKm(I4h4x*9*$x^0%hD5 zp%H*(PfdE@b>gwi?!lsu#J@JP zSydXX&o!HUJ$`qYFGjOj@Q?E|L%bbM4ZHXZv<#C}DxP>-K7=!LI`~_Gz>%l~Efpq% z8H|FvxY!OQ?Vv-@*$}7vHgg@3-*0!`v2^JjJK3yRY}Xx2m)x;Km_1u1#IRMDH#J|n z5;skc9&Ks8B3xA%K4Yc^~a?*B^M-qqgTEZ&7SfN}XOv@wtF$e(NjGJUEQVa{39%6l&|{fu^Y z1g092s9xU3$8?Cs6my|)HJ3Qx^O!BX9Ppz25PKQlTqnkC<6})AOE!vkih|F@`3LE? zHaAUTAhK@f;NX zMK`*1cmqi|7kIFo^Wg0&nsYCHUx(~|l;u?xMEpJDemXyqzT~4MCosPOfZHk`i94C8 zZub(0W6AEi)^lxE^BTWzq~2((AMyFun60*R*_N_0aldovzQ)FVOPvn8&0;V&ttu~H z)nv{$+w72e0(8h%!l7ud?LaasmNF@ltsc#62yFsBqkKSrV`q!c)bFBBch$EXwpz_& zT3+A>Un>XRJCy`|6yF)qcI-WT_7jf}E_?WK@k{mw z5+b~?ZfxCVZ%5mYZZE;S2vl1>0Eqed3`2 z+)=hpy!aNF$J8RErtr|r771tSlkCG>w*2*zEJPvSMdJSGjPe`k{Z|~0S59gJuqFVe8##9Oa+uoKYxtH!-Yu5XN@F&pDQGsL zDfI5Rs8JQM$CyB7a>lB1ZJ)S^b%)Deuqdx zKP^_&utU3-_d7OwSlKq`j&sMKt$nSnH!YvH@889St=LV4Ku73p*p;8q_kvcZ%yrE-x)P!|wE7q%2&#zrA(;fW3Ih-j>-3vn}kvtvwJ?Mg z(>imagnL+|b!MidhoWmtc{WU=$TFKEykX{UsY!TB6K3+3i#=|wQJ-%!)C`t*y7q?K zsUuo?rYPB>6Fbs82}PEizL6ESg2tnVJ+WR`!ad_V z)utw#bs23j+uBFHo-Iyi;F8+f{VTklk+YS>OZGL-j-Tz;21d!CnnqDk+5?n`*cL=N z!A=wf*tr!i(GQhM^phxif{&E@X87Br5Ailo!ep6fqY$$I3krVnsDGJX0@dU})J&$2&@Kh&}gqT1xL`uXl^G$WW@cHC6-~9Be^Kxn2BMLh&N6 zcfdv1BNn%zgJ;vUM?Jq z+ON@E>lJy`OFW(>)p_Ih=T$HDc$QY@VGL7nkqs4r3*~&Z!r{F@8but9Sn?&%h$UZw zIcutvMl6*kPAes!qg1NrrCk2As{yy(PamVecJ=$~)QLVSJ76 ze>5)Mkz7<%vM{jGR;gzn!;}?d8c3rtv^|^qY8hOI@JOiSipkbN`w&EOI(DLA%Fj9< zf2{Sh+&9>0YDtPFKNr%dqSa_C?yocDhuBJ-SN#V|6MtqAANj+ASSJKhcGr^S4oCUs z(WS=1${di2EE6BQ&?DEZ-1eO21zEvN?l=CYTZZG91$E8P0-sw+o| zB#++~c>JQ0*E6wM?&0hC8x_NEG+vea=k&PUDODuZLdFdpZ1e<6kup ze&cI|OZi_&SU-Ld(G#5E!kyo`4x+%P3u|Acb$g#OO1 zKJEBN*{mlUQ62XHzrRNN&|cvPekILCeiOoLEtHo%s|K2@R%~*%Esi4ceXh7dtXw=o z%8RHD_Mv<>+R{-BLU)w9XZTuP}ZMkk4 zL%(;y5>v`Pg?z-`80Izw+FMOGFq|%?Tou{6Ijd%WPtX3Ex-*t9-~2-+{HJRC62>kc zIv5Ha91>Tvt2S-eut^-|(?W9I4V?=5_gRZh5?kx@5OtqXlh_0rt4ba)VTk=PLx*G5k5&;eAp)^f^Q$&c(+s_=sWC zpKink$i401Jzcn;sBZn>vJKa4+jiPv(gVG_ ztB&lf+*&r@vLU#1_4>h~we0qN7nN^m+j_3i6fjwq_w}z_vrMGybi{OBB(qotzbR)0 zZhZSG#|NxNJmcd0A-4JQ|9n%iX3cb;%$d=s#-0`o>YHEGr-Ba0gM)0U|-&Uk~E$JRv+UjjFTCL?)i)VG?dMp6R&-IlY zEG$XjAcO zG@jUri#ww0AIbL{JwB_~lY2wn-@Y{{uEA>P(%Kg{?G0}2@b=h-djDYSQ974}&f)u{ ze`guu-&YS*E_3?xs;t$uM{HzSPMnxH$_{Y~uK*t_7s{Dd@$jN*PwU6Ymh+iab9Yb!OuXl17O_6dF*vw-Xikc~}}0IP}tdRHo?ccs$AX{BUiOQrfqDX5*p@GrDLHa*r+Xu~nFU9RS^ zwxL{*r2wkmOrH^0yWhlnq`7~1;8Ir0)(#D=!Nta98zmwYUW#%4XyH^Ip|@%N!Yk zoMp@ntthYE7_2V)@qW=7Te3$*VUd8 z^xAveu8txb(opwcpGGbl0eBfa|3)NUL*k2XzD024?cNp3T4D!!hF0GElgcW8=uen7m0#;{F?1hG=T?rnqp`Q`2 z5jDUb8&?XmwR!2`jQoT-auwS@{+ZBUDHde2pKW$7?{vn@$9?Xr+_#I`>mPVv_imyb zJ8mH==CgMP-_@3WzZ8?Fn8)EeuAF)c_tZv8Uk9Knvf<@dWPL zeWfg)#llg^Wa-$0dQs5QowD81EfIQEXU2aaVj1vplXc0pNNvHBoK5QPCnBQ~(g zQz%sP6`2OjEctAprCZcM;=pfx zI4s^J%zyjs@lW4=8{;Vk_0|&g3bSLP^FrCC_`F0$08V-yAYTF|L_cq+)nYnoE=Nwh zvv^IjK$xeN7H~d5bO&G%@bO%Gh~JN9P;cTxcr0>+`G8=I z{BDuogkh|eX|^F3HvCG(-Mb}7INYKThqt8&3km%Oim*taWxN6RBZr4ptXuVT z_}tq1y1H{&2kUC>ScFiO`S*ygu`;jM%@Cg`-L+hgc6bC~B+3F?p+KXW90IVj*#2cB zYgat^LKt6k?)njGojE zhZ{S(TH)!%!()RliVuauED*jpSX~{wn3XoyHgt`T3-kZ>x4(%e+(m`Oe?nh2=>Jza zC%GY11kn1|$Wx`ph~Ryp7!26{(LBmh3`TT+jc;<`aLg0$wd|^`-PICYn^&OkEG`@L zcm~UgJM{&5YgwApDZYyI%1HE?pI?xf?poq28*pc2733G7FX#keE-pvmebL^PJgNdF z7j-nH6fjB~H@C5(Xjkju0_udzQ4a#~C2}K#x z;mfK7germ%vXw`%N}0vu09qD%)EQjr4!6~N+Rfo`Y|#k!vc^cFD`YoZ*mU?$rF>)Ka zx{Hguh52s;-<^@X+VAKu^Y_{9eg3k32YM|5vwaErq1|R^3n@B+2LaEBjX;dRz4PxF z*?8viSH$v*>W(n`{GZgeUViHX3wk;h^^Sk~r$0T#;p`>5j%pP~;bnlW=G0$nU7qICP#G)1~IHN9PEe6T|j&e@by}qUk@s5|8ZqlQ8E` z+uY%-tgw6Aia^;v|5+AT!E}%O^%<*`XMrG%)q#9TN(Fh=8F{8~i+>_Xdg&$$>@grn z0_T%LLJs%OnInZ=92NmexRHkU(ahd4z z*V@0MH8@aN`P~dc-F`qjGI72z$~6;NR)CiM7~cwhb3+x!>+~3nnN}Og{7)Y6JSV1y zwU5OI?`aT!>0mM0;)^8YBgUJ!iK)d8s6_@Olyb_QY_Z*`(5g?i1zFt>$Qm?<6Mjn8 zps>Wr9OKtZM&a@CzWkX)OJ&ESFBB-c+H zn<22(eMg!aLM~rr`TF|SUE!PxlO>c_I&z>+S+#Fnhs`})5m@SSFWaXK@9Ahcl%Hid zqbjuAgDgOWbp@tId)2Cnc(pTrwyk9>SiRC)G87DL>Mq1Q7Xwzy!t7Lr>sW&L?qw(2 zp6Cbm3~3GM<7Ys=qz{h>SAZ)h-VHM|7*!upZv!7mWZy#&+UrU>ESd7sl~v_SoMLL2 z{WNRSTeF!13mS|XP=Oj-IkuNGXlQT_S$jX@GJ>y9mxpOAcps}utk`LFBFWSy*+X~} zD@*8L6J|%l_qQ^M-y&)l##1CZLrMPA$(81%t`e;&C%@P^Q05Aal;nlP8zRfjN7Gz7 zXy(x|OTKg4HkYL`_t9x`jA%pws8@0t;npeEw+8_QS@9m^w2$Trj@ki})+s6f+cJHc z#Ee3dRlE(BXC5_`Z0Ql#ZDWocBdjZ z+_;8vS^&pqAi>7U*2T;+V7z)vofv+wv-kRIyxszjHbH#iHm~~NCK^VhZMs>OLxe{X$CLLrqpI<)YopRU~ty=r4@F%+?`10S60-Po}V+B*etZY zIcA>1siiFMi#+puiyYaM+6?eYeG8iE|iMWlwnDx1#=htF!J&mB$f9=C!WRp5*MC5|dw zy+V9wTQe3c;NIqKA&<4K#NBQc`>gFHCGA#VPqN$y3bNb)1-EykwG5Toq|)br>4-mp zM#udL$}e7?Dy4U&($}YzPWm2{?@=kw!So5`m{O2LMsIIWDL8~Yl_=$YNL6!zR7$H+ zdKWZI?~W0E=1+Lo?=gc4@C;-t_iRR@GWcB12+P>c8pW?F!KS(eCY{NWF!}?1=r~e4Jx`EQoZWf6N*(up7u0ryNNhCZc^Qo0HmL*SYOXK@uoJDkOq{^_F`uDP*=IT?*>+bz|rnk&*xa4kdpc#OGNgJ~M45+jJLR>~!Z|RGpJ+y%<9!(OT3>wPOk7=tX8$zi=stve(;gzl(&`SH46>wjDEK=y-G zkJa9#y&Dz-GIeuH=2ObK4cgLS9af0ibKWON+ROc5o6#kjjyIP&eiG?+`(l%3~t<&qo&m?D)&smkNuXfgiJ)w}TEF-(x z395hwWADOtCvPXW-Tex5N>))Mf)*k+Rw4NtB|p$S|4>P8SzWC^H(Zfk=1xd5EO!R_ z9eKQ{C0J1FOGq|uQe;;Y7ueI|7HG25O_q7uSf?&iA1X3BP^8XIGnwO3W9{h_|7HXJ z>$ykwF)W#)yA`zJkFJ||9*h6Q-HPL4Omw$m;`518b{o84uzRJwViIK%-lxsL6fS@l zh&$4Pzj6$l6AfJ^M~fw=!n|gsC!AMRSk<0jU2F+1b7y)Dtg1b@_V-zt_T;p@N@IaP z%TrTY;Lpy*!4X@B#}u~Co-=nz*xTo81 zycy^^@|%11p&25-<$vU}d4iU!bh45C8&wyQ*X5)$g5WNgs_YkW%W8VZs+%j!_0}*` znrxlDcmBfbOL7#5H&EvsJ4cXpia3j~K`YNY@y%qN@Som?)(sKrMRVLUPJBDwG5U}3Pmd&d zf=vx`0xf{1bK*$MLJrMg2^u+B^Mb4!e2#LA6%k$FCK4X}q!p)^h>MRrOJFBfv|>{@ zp`$Fg*yb3jF0RO`uX8qNnw6{jS^evo1=coqX>YMRFOci0HyaAe8%d4`Xnz>(lLrf` zvK<5}#cO9r9`air7puP2aS0rPzHq*YY#3>82s^B_mKk9?#Xsd>VG8TyIVg9`LOQ=uSql!~ zR;)_?M=C8weAd*uA5JwM>qD)+Ak5s&6=W9R(~mJ`(%tS6=_lxP+=F3{KBrhlk0(Kwrf&ym}7u*TDFh$NzktCnN0aIKtofn=KR*k>^E$krdx7o(Gd?%iu zOxu)$UMcM4kk63nd?b{Ko1R}88CfJVw*tR0lH=1#$*z@3U&k{Rm5rpK`7F&CnRIK9 zJv8hNw>P+3%wag0S1AbQBJnxmV;@tGe|k}JDc#&7Nm-JrS5vQ(QuT;%K3{E9DRy%q z+GscTW)9Oyb-2tGWR0+1mcV+6Cr+HU5;5S&S{yFhQ%AK(#KL6VOb^nv@c* z+}0Q&k)EQW9xOw)V;K_aY@90|WskOO4~Yh6pU>Ctbo7?Dv#FukL1yV_ka0+DUV3D{wy*UVEn&GSD21*-ymVx_OLXll>AeK zESzod6@ZUa&?`I9n-2E~x?r&xCU@JV7&7P*#kb4%Sxlu-rRcTugjsBzNqjecmM~YH zY0H|QEF2_E_m);fG2K+}Zq~N5pdgqVhTZr3HCH%>JA*lLImzd5!u<#!ghqsXj;9kA zw6BEoA==zXgfldZP6AMhu)sENhj^}z9QF1O>vdJi72QIJ1>_j zSN93IVtq!ArQPizGAhsW)|m}O{s#7t%N3Chm7D{=C($pD*^*=mNdsQ0d_9e1B0L@P zTe&2;Vw%h#+UGJu)znNfgX+@0+f44v`~QcC_EdS1& z!?*1Q#x{ku-DNbB!=d7e?1n~nle$Gb!L}<0J6Zo%sW}Dpc1Nqlo#oCft}tYo+!btu zR&~-|`=1ft$TJ-VSr(JyW(FK^JdXv&-7N4{f)Gp)-@<(l{5pm~ySY9`qIdU{U$1Mx(KDRr#W;Y(AonAxQ5^-~@uc`($lGOEEYy;)bI7 zWZnXAgUR2ki#;YhF-@ghqPBQb?M0d5Z-`&M!r=eJu}r>MSvxl(TsRk)#jOY(9b&Pg zt8BHlpvf&{v+=jQr3+&hm4r*)t!64+S(-6q@Hz`MX0>=+T6>F0u_<^jT54cVJ*|rSwTN1d5P-4mwhjY@@qC z;%>|Q-3P)o*#V03WsrI@As#TK62&k&5l5EUjCC3_WN8gdpPwJw-s)eHZ7B z7um$mH0%yLOEY*Ky0YrLd~>10(p8#WQEL^yN)7PdF+w?dm+bf{2iK{-P^M@&RG`n^ z6zV2t=<{>LGug4{^(nh{mTXWK6?pX4hCraf$rhvraB@wzzK0I33D7Ds+(bd=GUh|O zI5DMwRpoSJnE7l|i+GViusf-9p$=7FXs_gAIE$_WNhwT=x$<4?;dvuSdWW5AgbHEbJVM_wIktfH|@AnSU=_{Js z3g9(s$|mMQKN1l_dL_D5gEjEfnufb(SbP7Tiq?yk*t)XPQmPFb4k>0Q%?&K|RFC48 zj&O0Kc}c6Q#cFI-BB%n$q|M7hRYT%v3vS^Be<#;GnZCx5`@8mS1JgtAa7h zV4KT?Y>apgQ9j&d(g~K^nKeOd&J7EK_>yo{rvAozdm7mNYjH zEXIjlzpvA3?ezH<7nU^ygZ1^nU<1oGHoHsP&F1z}ceAlD$dzb zieOzJir|W+Kyb(g1Xr63Ars(n0-lY+z<1>3j*h)`b$dJ7>9gHWhZp?*L6>V#*?8Wf zMdvk2pB2b;g;XM?V|B=THO0$4C-ZVCc=@OF9MNFHe89kYIrp@@tN?#xv7Eg81#K$EoQyTY zBao%wBtV*t9>Gc7r{|>MDON)L2rr@j@420o0Zdwi0sMYcb`>b65|p!@^BU~W)9{(( zM2jwe20C`v)a>q%KK*q4i=TfgyRTcb_S)|5YuB#1uDc?%udjb^D73e~Zy%TPmw_^H zdY$eQ8NmS}guda@11JM_P1a*#-QTk^pB6JS1A$CoS2myR3cQbV2YmMs&$ew7hbf zUbt3Vg}JT6T=b$|rZf`~g(c0vDVm|xHPo7>&)Hg6-eEMYSbRe+J72swH$#8H*gmgk zvogVu?8&m^1&zjFZbUmc`^riOaW}B64gG8ae)Uta9%QIR?rh?+>NM(M%4c$B-+^#Z z@6JX`S5|6TbuM<@l(V$6Dn`8Fb>$W7>KrXrY{EG^ip^chmaEox9ULfDtG)3HEB6c} zRAeL0-Kv#HV4Z#ck~V~@9r8|rYu@i z=IgRryL@Gfipm;c62L5IWLf4Gm#58QY4f;R%tck6(om?>Qw2QN0>aTKo+T|2F-y6Y zpou+=nwZiP6%jm}yQkq_o`qvAKiDuG(YlKCWLwQ7qC-}5RbF0| z8EP4DRRFFtzq7U&Xxm#`ySGjH^bfdP1OBolF4q!ewAm0q>f+x;0+uljc(5 z`JPjG{_3p9iRZJPK9Qas2xJSX63=6~2W#}dYL5|SFDRJT(OJ1HtE6CGcl~OQ#$grT zk7Ey-Kguec)E?$0N2a$d_t~5v!4iVZYd?*YK8^N}_Ebj>9xmn zexIg2qWpdo{ND4w!SAEr$nVer5q^ive_qD<4DfC}MTbo1vza<1!fB}gBI*-e9|c_x zNb=+VFI^AJpzFQ;-%QsSXXeEB*afT{aDFVi3couhu43z%7r+0-e?xb&ZT$Hs{C5W4 z-^!nV%73Te`9=KqzxnTMJm1cLf5v|s@%vm}|8xG^fcKB^=U?#O)ZT^s`G5HDT>Re8 ze}Bn!ZRP}$6R;n_Qo`OV_NgZCiJNY-KG!xf(nf!t+FB3(Vm2-t+_-UY*+y$uOG{^G zOG_6hx&za=o?Uw?cg18K5&wB*R^s8C=4M+g*=$deg=QQY1tb3vt&}%8-O|?NT0VtF<-5c1s*f*Z)*+(xw@8y0nbUio%Q%;}sg-Vg|;t6%b$z zGqvMJhPU47=J$fAA~y~y|K#pV)ajaRWu+dU@xoc+znJF&ovyjv&=`}Jn6F7O>2r*^ zKhRk8S1qV;W_z-T!VsB=nYcD;k73mvU0G>U9``+w!aC27DICpVapFg_%%h{`#s8vF zW&@_}sFijKOmt4$%^~8OIDc{V>keI?=4lMcG(PwZKyTM_{fJ;5 zX%!_u=gBzn*~CJ&{EzH#V)Do~y|^E1D4L%O0WaN4XdpcgnE7G^Ku0&SCf7;sZ=l6z zJ#A)FTdB9*ge6dURaLn^6!N!rFK%q=>uK}&{BF0;7nAPP=h{GYFSk5;WQ zCpIi5^tF~+u}5BGBgAF`e@D zbRy5kXVi~Ar~Z$hrv87T^(UXttRH<2ITWcsF{AzHb3^pGlAZb-eD0k1T6V2$C9S9> zNh7huXhKFt0{#@4y2SMKL|rCOj0nfI{9WvxcDr@c_!u(1#5_xfD!Md5sW4u0pD8^t zF+DS3)p43wkL_5HLh$R-(w<`PiV4qUXcN-X60{kR3yl-YQIpOU zp=LYcsu4{C5deVz4SDr~j@VSx(xEo?XHD#x=h73j>FL@8s2;i-#%*=@ zVFG}yeb)SfqAXVk2a$?h z#wM4k%vNA@c(g>CD);|f|N+_ zI|mZd(-ZJ_ow1>~z-u<-7iSwh7DIkvhOGkK7rBLc8YT@FGhHitUUny|CaTyvt?^wP ztLf>_gDNsIB2-Z;`#>Cvwx?_)@ifp-@0rKQBwlj!N#y( z1p6eYa_SJH1-;3?4D^L0L~b^A_^|GrxmGskP~v&#B_5i?taHy1wl*znGBzu||9wTX zaq6GYL(s+ie&uK!kZcgjoUTJv;G1I2*!Q|zU1GD)FD7@nyN@6t1cbzcZuf)q%^r2T z0oTM^u(USH>qwe}Ax)B4T~NGxSbp1yHhTIBp01RhR?#(#EAcRhr$n{w%piM!T^6HM zX3c5hzcsRV*sb`TJ*NpHKFGGp-exZmR@gQT(cteNscLm9{m~q(oba~s!I{sH@x?Fud!&w@n|B83pzB!32PF;9rSF*ZcJIFqAN~k6eCWl4 z8n7uq!4$;|%MG-Pe?^l_kQP=saaSPuE^$CbU0J0|$j(mCRaNGt}+jf)iJ4kb<7+^ywrY0Wu)&4I?KEfJr$rQ6>vw9F8JGc z&-(Sp@SfwXg>mff598~9P`SHy`Ybc6MLCaUI6;A%&Elh;)%Vo_xNus z|6PsemHfAj|IWbgRQ|h=|K5S$cK*94`ds!b|6M$XAoR&TW);jzluYNod`$VV-;aJG zWm8P8`s>3up~S19zcI@CbR zXo+f|W%#8|*VDw4JP#RacJiJI3wabvHQ;Pudw>bg9J+Z2dL0m*iFUlQ$ZxbuzkRY+ zK=yyHiBOZ(a?JvFAv8)zCdF(x*#``}*U&hyCQx1zDR;3?Sgr6L%4>OfEtLZTyf3>3 za|>PAt};y1AuhN3D)THT&4fg*3x(tNnbM#PGjy|Kp$w@m+Jx47kJtTXJ*rTc*eCZI zrMj~gs!=_Qf|bxgq?L39*i5^%}2 z?%|6suDIZWx(Dz-f(7+tUq+tm-3ZWLiKi78({r?1#eT{7UA#*8OwejGvR6|rl*{%@ z7FRp8Z=IrCfj4J~|3Mv}><8?akbt?Y<8xVv-*@rf_53$IU%-DiOg@+M-;Hx{gW~DzfO)O4DT!%7U~1}vY^!+g!#H!EPJdJr@12gJ6{OGT|j)TWAT>%(apby}KQLn;P$Abrh#g}TYW9@zo7JDAoE)9e8G3_IYd zOq(sMrpnooUX-`Kw!Gh-U09TrL6E`Lc+lW9WE(SbEorF*`hrZaG2fY&W6hopYd!k= zGTL9n29T2tfXI3B;GJRvBvT(ng;^nVoEhdF=WggA!v=#=WcmuwN3J!?;LOt-)2U}; zwvoL`!=qsmg-#s89E=c!o?_{h=SD0&rcmZ=zs{7N09!^kD^{~$J!aoAafsE(MnIpv zU}KfCSB4E6lsj2B_{)j%eojgK5&m+pK9rZDe1Mk^O!8MZ_{(`({<=Ij%3lgaj^Mn` z#0|EDSqs#$h+@L&Le_`6rKjbuvIz9)LX0wp^<8gDu{MhhVZoP zYU!-pv}cCanGd-Ge(sjTtWiI9{q=#X zt~$n^W>1S|5e@^2(DpNp^iI24u2;)9@plkRi5KWa(6D3T9N|ZDI{BRot&A`O1ER^L zAc}~iVaCnGY-_Qq`QS3Qd)dL}#)DRyX{E1xtOdu|$I5*xO*ZSnZSq@BbZm4+vMJc@ zHnYLhOxYBgO_SLatmt#DZ~%Q~Mf;qz7bDIMz9}3bX_j6T-*i@W^;u1oV;Rnr7F)?8 zhhtHRttG{oF}6(@AD3^E&fz#5Ir(`w$&T~vd4?Q2qDth`#;2k?TC0F6eunbfM_Kog z?W0HV_uzjY>wg`uk|K#KZPHy(1EiUbNr#ub|j zwrnZbY-G1@Hg3j$M)8r7;d+y)ez?Rl++Z>_410XbyxwI#@3PX;W$cB`md)c|S@4Pf z*sb`-_;F+HQn!1M5+@A0-AikYzLI{AXMq3LPdoTF%u5NUg`&xMnc5JtBD{b4hCZN5 zM|eLXPScCinl3b?Or=U1BA-N#rws&Lh6o|yyg*(TOL#C_Y_ccXN)HcL%0A+&hMl60&72-OVAV9J+!ire=9wu z3yI@z3yHy|gF|lj(7~pr1GYlrDsNz{#cXaF3wT!<3vCCO+-yEMr48ua`y(%3ZXD4h7Yy096+X)(X!y0R*R)| zO~AL>Vk|zmAv{yM6hpe?k#zBoHk)!xC1%SqCWxP51vohIC2o*^7;(SJ7z2nYLN{(Z zzezW$EQv&D_7Il>)jd;p13f?N-t1K`+@{Ob8rp;5UAc*t!{QcUr%35+FTCv-6-5$HQ3P(VjSMwis1R-CI~SD=<)`EX24}8TfxioD+*e*%+w=3Y-;i1Z zi2JWNcm37vFW5e{Eyo|E%SMRfT+jqRmwVDZpOTb|BP!U~bJgCCD6CYzm8;;i1U%o+n0_le+mW$J;yaupEa$^8CMmHj2L5@sk(%fF?WBJa>Tjfp1$WF!eDm3o z>m#$JCEkm2KC+EOPm|&{0O!QzYuB!PIg4%NbRotF z_j^`1)U7VnPsqN?S=`>yr;m(ExP_03-$IYmn9{le?N7Ujm`@SyPkHiO?-FKNEaU$XE(92Iin|up;QiU~XT;G>0nuD-QF3KwN=D&EG~ZY3 zX2e(A9L+_s)%KjV&iWh_4IfJkl5TPB1K-psw^IWOk{vAP^TxOGKdgQ)@15GuoBpnO zL%cPn`|F!xx%@>)iyc6u%kYLU0_-FoMqLEe0)}p^A{7cFnir%KXTBo}}(aVeE;?kt1Y9im%>r<&( zZAyw(o62^lY7$aX5;UoN9FGCQk0dyVw-xw93t}T+{iWCY7T1T>vNrTS%HJZNC?s`M zu&!bGW#aS0QVrzq8GrjMsTM{ryAZW3grThvmbtjgr5edzSFk%T^k1KOz5g}@AI*4c zB$vxo1^be^$BW;;@V1KE=v@ve-Ov=0xFOmeu9VEGW><>KrT%X(zt(VV`7Pz*joy=M zMBAqEMcQAEisra^^TqrewX56$&BOH< zNDyrJ7g@9L!m!gtVb8E+D-zk$iJyCxmUxzUN|%(BEGaeD7>zY%bJ%DMFG*&1CyPTR zOFg9nB_#u;c+GCAG4W?+{DZj5D!WcTDx_iuxg6Y?ZB;~96F4!hfO)`oJ#npZ#9N<^ zvZyT`s}OD~X>ptLiz*5YGk?-Ccd>8P5!q`AaYP*_oz@6XBc z=i?s*rjq9C^rcl*rTQFSUY;*U`gc*MTRP9@?kdukhN|(j3{UmaQ($@GWmvX1;H)#Y zohR*DClttZD@LPiMB?GZj3T40xhB)6O^Pi@G+CRYR_wOw&V}(#+&@q_eoi%=WSa2NoK`u6mS85-7)#D6Z_=e6ThRkEQtAE z%{2k;;bB~XWx4SUQ`o{*;T~nPsGZOJ;$3suiDP#569>D&9!L@Q*u}j`0ivG?zdRZ1 z7(f$*fg*?hSFIPGsS@w2J+|-eU&jf@PxJ_Kuc!pXk@E$B@K;>Ewjge5On4k?NLrIk z&J?a3Q$=TLn!|~2VMj>_PN4)O5nmq&Y^W()7Mz_rTN&8WT2P-kH?!Tm>hhM**^A3M zk?6(MHDqZ;`l`yxVVAkHY<6Zv%D~xGbLW)Jnb&pW*0F25%8+Q;T4U^~DXhVUmqKR5 zIT|%?Stm-)0JlS2(AfgW-Wj_-(r!8^4uC-8eB-lA_&%)yp<{*`n=PD=J6empUJ6uT zuUTvI^J}aK-!p^@sStmpn^={t3#TM)(x;^{6l$bD@!ZoE!;T}EV|L7dxn72y-~Si5 z75{rQwM?=@50xRvtW9xp(hH;^pj_M}GhNM{c6MH9@vt)(b!TAEX}eHa7j_4A~@) znT+q6-g=A07}3KumiH{yBDPRGVP-K@>kL^bJHg(F)Y7U9PMsP&%T7qc5Q2ve1^2OK z;zf*d@NSbWVgF!{OK*>;4Dhq$G6Q4x@?o$A;@1T%=7=;3@q`6k2(nRGgAmJ}mFh@- za?*DnOM_sm8>Wq6yKIcTfn7X~Q@o4KN;NXx{a6};c*4kHj`9(RAF~)UWn#lUG-!V( zZ=bLDM##~w%HsZb>WAIAcW>pPL*lW62SfYzUB+JK{Y~~M$0-^+Za3PFJ|inenn^YA z;6_e2X+GKSes}D3FZ%^YhA0C@_5~ZsCrB7vDcgYhNfOMb&_UZtbWkVT$vzZR(%Yw- zQ$aNe8_mubJ0WNyZ=W(dj+wJFD%*v-T4qUap9a&rCR=8*q=_$Z+By~ZleNzll9-ys ziyz{4TwIqYeuz;`J%=2}8*-i75P9pl=bn8w`X-Bi>Zzv)3s&qoKN|7JA!A(tIHfhf06Y;GS6+D~L4pjoe?xOf1DI}nB z#m4{_l0I9n0QMXcCGuymGAxnR$a+YVMZL`A?c{-2PPpx`IT}5)LiXbf*R$bNaU0ci z+(9bHSKNG7W#!IWS1iA2N2Q_8VfW9P6U<4@uqOG|9$mcndux2&v7?JEE6j10jsEcZ zU~ql7YIRxJXql@Ux6Qlw&GUb#-2RiH;TyJB1UCP084mLJOPT}2SBM9U*~LpLdoEh( zMw*%4-pf{d6B3Gax`!(_*Vms>;osEKaz=S+F)r5cEh<{%^DVMt28)mb{32)^?5#%i zHm(bmwuneI>mcw534Ddj4KdZEa|&BI$Pb$u8ZFE3tt$_wJBys9^K;=hC=hq)3l^GM zTt&47xg9m-wdtnD;_9{aaUONwIZ8{5(^6lXueaM$424dkHqWXT&$h86x$fdr+|rii zH|JH98}y~_tUOOf>6YI3;d811sTQ%hl-&V)XWelTkjNO)$Gzd}cQ^-wEZKMKF#Cv^ znjEf1;n$6t~zdW?9GI~-E#fvV@ zQ#s6;`MNkwrpr`Voi|Un(3PkwEX>GFh}UG7SnT!UXL0FjcXDo#Ei+dar_L%dyJ{EY zsvM>)L*hbBmfM7+7bKk>6XU|?!f#;J7-Ur^)99%=h}=^IdAePT%j%JL2sv8n>-R2k zx(4?&gf?~;+B!E?hR*0LEbQFW;G?*9pS?ZFr1j;PD)aLzO*uZTDXCqKx9jTm47!|4 zccb>8E4Qd?b4BIGE?Z&u#>xs@Q#pqF-O2`>1v!~%sfKEst=f>9mXTWkX*x9q9nP`2 z$nKxXYq0`XIw$2*!pbhN-a@r|JD~KSG{Sy2K9Ybe|H&!5axHY!#t&eBq+nll!`T*(6yqgUHtvxCX1!1So(BTR=ONjRnr~SUlkRdgXm*xO+i78)mBqr3D_Ow0sH?c z?Al|Sy3V-Ixg;ip;MlR_x1Hd`v15}sPv_yhLmrTk(g22l2y{dc1SQY{-GCtwAwp^^ zNJ9rm(GacL@(OfX*J@B&Rs>u3M66@eB5i}xwL>MW8e7*U@qXXA*TLq|{^8`F-+A71 zzSlYDyXO?u(&}GvWSjJnlz=t4i>d~tT^q!X0L{;eA)CLYEeyO5X)nAN=m9==rKM7C zOtbv{d4(m7jU^?sXHS@R?4PsYsqU?Fn$sM8k8D^?aZxQx8+-w`Wc;XisycrsQgl1`jtRN)IIR3fcPkVd>y-dWtXtgyo5$;q8%!5Wcg z;(ebpt6^5nTxU}S@Hth%CDodsZeDMqyU||~&a>oX8ys0)r^)Y~xaw!szN$=jnWL&S zqqNvzfperU80czBoxiby`mqxJIIqITCo!=#fx>OPUG=HCm^zsHEazC)KHjx``!~xDrn<;Gm`|Ds zy247D(jf*hkuG9BN5EzaIPC6h2k)RS?*sNMkKG0h#+VQJ4l4Odi%m~U!dM7K=>vQ-O7WqT3Q;SS(*I3kDe`nFHB%ea>S)c6=~v_!MUP*Q+EEL& zUM=dPcN+jMzk`g+C2`d`oEelNMhKdq4rAoPk1b!(-g{$Z`$ifpK~>DpZEOwylb|?! z^UD08ByKx@9_{Z($yZSVX_8=((FK2!{#`A*>UWmyr0i?g#-|~A6?IG%N$PhYQBTiy z>LF2*RED-!qwR@k`+DRZd74k6eoE^%^%gYJD z#Nw(CK(T{@VyzOdJ2V`I3UUZcCbXA%>^sS>j93pr*cQ6Rp1~i zWZ-=+deoOFSQ&U^>FaX4J&&njn`Tu8-uXq|%|7JUzhRxZ*O+CuX^d7JzFd%F%(h!K zMjP{?AG-Bc!%RnE$Y9lH+5;i#*8_YtyCTg)zt#$xAgU*tka6Mz8IRJtj1#@fc$DfM zBaZ}iZ3T5v4U|?b_)4Za!l?!sk8;`okHD!j(N=eDjabY{2tLB0lhbHNnXpQ9K@{R2)Z}hgWn51V= zRTrr0uS8WH@?IjY)giS$$ip>6SFAGETgiD>sIgIy6jnI+N*~NvAw1|EboAuSBh+CF1-?)oPYxQfrE9h6 z#?)!)DRW5P{~Raa_2X29bkTyzi5dK{(Np4mS-RP)(`qtxjtr;MX!2>i{+f~L$?l|S z=5)PfX@xW^)02;qcA}(u@R&j9bDGVPqJ}j_%#UvpJ}(TJt4lKjC5CL9HgkHa&Notw zPAfKA4c;8=%1ukkNlrmIgOMV3DRPR&8GWKij}o%wNO}ZV$mb6Qc=$KQ%x?ANR1mY>3Vw#%;swF!mQeipE$ZJ3EZcE5zW6 zaMr}`iWta)g_&PuFpcl0!jG;d@-yz`9ikpq#A?{N{E4O}et3K}ajhcbVI_Pj_81g7 zi11wzR^%?icSKm}`zbhK@PYWxMOe|GNdGqxR(S1hthhaL4OJ403V0k{us!=;}GhxdvOT$&wmtTK(gXZ=K#StiE;*{6d+X2 zmvIP{^S_4>Oo~LV>--L6@foD~T0!RGO@~CA#}s4`$R%kr(u@-VdS46A`a5iQloPOS z$(m{3SLTH8yC_GwAkHj9@=^?lgyhr~!gW5!zWaT@b!ML)ib5!LC8M!p483o{;RiXr|} zYmQ=^-ifz@kM=b6)UFDwnzVvX!+tn9Y01LVjVO>D-WV1R^Zi*_{`{6$E0(EVhaLE4 zoE>Ozkr5y~A4JY>gVStC(Wd#lu5^d|KER7rpixN<0XC z`vLoXw8Vofj}6IR4mI;7Y?IuRSb>X~6O7c)=S8g4=L@2uC;5_w8c$xHr$&6O6nOz( z9ahtsPht7qfrGeYP`;)Gd+B_XJumeNdoZrV&*p})`&JnURN~)aKH6ACC1Qb!PIUaP z>XxcDro^NAy>AbRo9^K&g4io@vAgw)_eEptBhRZYtEyu1_N6V_^K5@w)tiubg6pIz z*v(jH#Y`xK6}yMg${4h1GHpFhXe8Ud6S|{(60H?!!Sg&UIe}K8Ts6u)gtOqq%!~6F zyz)NIZc7D9`b2g8bFFe}XuRr4v{toMw2m~|HAv|NB&Fk!g>lFT(qNlP(Q$Xt&fftE zD+u%{+V~a_ELDm$gm8g?V4?`xbp>fUW00%TAAl?+1f$b~{yz=r0J_?W<-pU8x-(~p zPS=1APQrgr!A~}5_v|5Dh4iPC@e0zBPU^fo=eAP~(GhDxzMBgD$nl%9ecOkEG6iwf zmdN@k`>=9h6ki_%(`iLCk0;XfMfSYUrZs2y31ps-4fQ=u&Cj%1Um_0$cogc#dr5lX9yRI5INvcz zl|d_n(XtbQ>0-kqw&rg33*2LROvf&3npaoIx2aV;yXHxpvWn|9qIa7 -#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 deleted file mode 100644 index 5a731fdc1..000000000 --- a/soh/soh/AboutWindow.h +++ /dev/null @@ -1,20 +0,0 @@ -#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/Enhancements/TimeDisplay/TimeDisplay.h b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h index 090ac2901..671577631 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h @@ -13,20 +13,20 @@ class TimeDisplayWindow : public Ship::GuiWindow { void TimeDisplayUpdateDisplayOptions(); void TimeDisplayInitSettings(); -typedef enum { +typedef enum TimerDisplay { DISPLAY_IN_GAME_TIMER, DISPLAY_TIME_OF_DAY, DISPLAY_CONDITIONAL_TIMER, DISPLAY_NAVI_TIMER -}; +} TimerDisplay; -typedef enum { +typedef enum NaviTimerValues { NAVI_PREPARE = 600, NAVI_ACTIVE = 3000, NAVI_COOLDOWN = 25800, DAY_BEGINS = 17759, NIGHT_BEGINS = 49155 -}; +} NaviTimerValues; typedef struct { uint32_t timeID; diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index d15bc5f25..0149aa148 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -12,6 +12,7 @@ #include "soh/cvar_prefixes.h" #include #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "AudioCollection.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" @@ -165,13 +166,20 @@ void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequence const std::string previewButton = ICON_FA_PLAY + hiddenKey; if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) == sequenceId) { - if (ImGui::Button(stopButton.c_str())) { + if (UIWidgets::Button(stopButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Stop Preview") + .Color(THEME_COLOR))) { func_800F5C2C(); CVarSetInteger(CVAR_AUDIO("Playing"), 0); } - UIWidgets::Tooltip("Stop Preview"); } else { - if (ImGui::Button(previewButton.c_str())) { + if (UIWidgets::Button(previewButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Play Preview") + .Color(THEME_COLOR))) { if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) != 0) { func_800F5C2C(); CVarSetInteger(CVAR_AUDIO("Playing"), 0); @@ -188,11 +196,10 @@ void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequence } } } - UIWidgets::Tooltip("Play Preview"); } } -void Draw_SfxTab(const std::string& tabId, SeqType type) { +void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabName) { const std::map& map = AudioCollection::Instance->GetAllSequences(); const std::string hiddenTabId = "##" + tabId; @@ -200,7 +207,10 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { const std::string randomizeAllButton = "Randomize All" + hiddenTabId; const std::string lockAllButton = "Lock All" + hiddenTabId; const std::string unlockAllButton = "Unlock All" + hiddenTabId; - if (ImGui::Button(resetAllButton.c_str())) { + + ImGui::SeparatorText(tabName.c_str()); + if (UIWidgets::Button(resetAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); ResetGroup(map, type); @@ -211,7 +221,8 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } ImGui::SameLine(); - if (ImGui::Button(randomizeAllButton.c_str())) { + if (UIWidgets::Button(randomizeAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); RandomizeGroup(type); @@ -222,7 +233,8 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } ImGui::SameLine(); - if (ImGui::Button(lockAllButton.c_str())) { + if (UIWidgets::Button(lockAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); LockGroup(map, type); @@ -233,7 +245,8 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } ImGui::SameLine(); - if (ImGui::Button(unlockAllButton.c_str())) { + if (UIWidgets::Button(unlockAllButton.c_str(), + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); UnlockGroup(map, type); @@ -244,10 +257,12 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } } + // Longest text in Audio Editor + ImVec2 columnSize = ImGui::CalcTextSize("Navi - Look/Hey/Watchout (Target Enemy)"); ImGui::BeginTable(tabId.c_str(), 3, ImGuiTableFlags_SizingFixedFit); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, columnSize.x + 30); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, columnSize.x + 30); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 160.0f); for (const auto& [defaultValue, seqData] : map) { if (~(seqData.category) & type) { continue; @@ -273,6 +288,7 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { ImGui::TableNextColumn(); ImGui::PushItemWidth(-FLT_MIN); const int initialValue = map.contains(currentValue) ? currentValue : defaultValue; + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo(hiddenKey.c_str(), map.at(initialValue).label.c_str())) { for (const auto& [value, seqData] : map) { // If excluded as a replacement sequence, don't show in other dropdowns except the effect's own dropdown. @@ -293,22 +309,30 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); ImGui::TableNextColumn(); ImGui::PushItemWidth(-FLT_MIN); DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue : currentValue, seqData.sfxKey, type); auto locked = CVarGetInteger(cvarLockKey.c_str(), 0) == 1; ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); - if (ImGui::Button(resetButton.c_str())) { + if (UIWidgets::Button(resetButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Reset to default") + .Color(THEME_COLOR))) { CVarClear(cvarKey.c_str()); CVarClear(cvarLockKey.c_str()); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); UpdateCurrentBGM(defaultValue, seqData.category); } - UIWidgets::Tooltip("Reset to default"); ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); - if (ImGui::Button(randomizeButton.c_str())) { + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Randomize this sound") + .Color(THEME_COLOR))) { std::vector validSequences = {}; for (const auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (seqInfo->category & type) { @@ -327,10 +351,14 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { UpdateCurrentBGM(defaultValue, type); } } - UIWidgets::Tooltip("Randomize this sound"); ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); - if (ImGui::Button(locked ? lockedButton.c_str() : unlockedButton.c_str())) { + if (UIWidgets::Button(locked ? lockedButton.c_str() : unlockedButton.c_str(), + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip(locked ? "Sound locked" : "Sound unlocked") + .Color(THEME_COLOR))) { if (locked) { CVarClear(cvarLockKey.c_str()); } else { @@ -338,7 +366,6 @@ void Draw_SfxTab(const std::string& tabId, SeqType type) { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::Tooltip(locked ? "Sound locked" : "Sound unlocked"); } ImGui::EndTable(); } @@ -401,10 +428,11 @@ ImVec4 GetSequenceTypeColor(SeqType type) { } } -void DrawTypeChip(SeqType type) { +void DrawTypeChip(SeqType type, std::string sequenceName) { ImGui::BeginDisabled(); ImGui::PushStyleColor(ImGuiCol_Button, GetSequenceTypeColor(type)); - ImGui::SmallButton(GetSequenceTypeName(type).c_str()); + std::string buttonLabel = GetSequenceTypeName(type) + "##" + sequenceName; + ImGui::Button(buttonLabel.c_str()); ImGui::PopStyleColor(); ImGui::EndDisabled(); } @@ -425,56 +453,68 @@ void AudioEditor::InitElement() { void AudioEditor::DrawElement() { AudioCollection::Instance->InitializeShufflePool(); - float buttonSegments = ImGui::GetContentRegionAvail().x / 4; - if (ImGui::Button("Randomize All Groups", ImVec2(buttonSegments, 30.0f))) { + UIWidgets::Separator(); + if (UIWidgets::Button("Randomize All Groups", + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Randomizes all unlocked music and sound effects across tab groups"))) { AudioEditor_RandomizeAll(); } - UIWidgets::Tooltip("Randomizes all unlocked music and sound effects across tab groups"); ImGui::SameLine(); - if (ImGui::Button("Reset All Groups", ImVec2(buttonSegments, 30.0f))) { + if (UIWidgets::Button("Reset All Groups", + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Resets all unlocked music and sound effects across tab groups"))) { AudioEditor_ResetAll(); } - UIWidgets::Tooltip("Resets all unlocked music and sound effects across tab groups"); ImGui::SameLine(); - if (ImGui::Button("Lock All Groups", ImVec2(buttonSegments, 30.0f))) { + if (UIWidgets::Button("Lock All Groups", UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Locks all music and sound effects across tab groups"))) { AudioEditor_LockAll(); } - UIWidgets::Tooltip("Locks all music and sound effects across tab groups"); ImGui::SameLine(); - if (ImGui::Button("Unlock All Groups", ImVec2(buttonSegments, 30.0f))) { + if (UIWidgets::Button("Unlock All Groups", + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Unlocks all music and sound effects across tab groups"))) { AudioEditor_UnlockAll(); } - UIWidgets::Tooltip("Unlocks all music and sound effects across tab groups"); - + UIWidgets::Separator(); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("SfxContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Background Music")) { - Draw_SfxTab("backgroundMusic", SEQ_BGM_WORLD); + Draw_SfxTab("backgroundMusic", SEQ_BGM_WORLD, "Background Music"); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Fanfares")) { - Draw_SfxTab("fanfares", SEQ_FANFARE); + Draw_SfxTab("fanfares", SEQ_FANFARE, "Fanfares"); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Events")) { - Draw_SfxTab("event", SEQ_BGM_EVENT); + Draw_SfxTab("event", SEQ_BGM_EVENT, "Events"); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Battle Music")) { - Draw_SfxTab("battleMusic", SEQ_BGM_BATTLE); + Draw_SfxTab("battleMusic", SEQ_BGM_BATTLE, "Battle Music"); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Ocarina")) { - Draw_SfxTab("instrument", SEQ_INSTRUMENT); - Draw_SfxTab("ocarina", SEQ_OCARINA); + Draw_SfxTab("instrument", SEQ_INSTRUMENT, "Instruments"); + Draw_SfxTab("ocarina", SEQ_OCARINA, "Ocarina"); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Sound Effects")) { - Draw_SfxTab("sfx", SEQ_SFX); + Draw_SfxTab("sfx", SEQ_SFX, "Sound Effects"); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Voices")) { - Draw_SfxTab("voice", SEQ_VOICE); + Draw_SfxTab("voice", SEQ_VOICE, "Voices"); ImGui::EndTabItem(); } @@ -486,53 +526,63 @@ void AudioEditor::DrawElement() { ImGui::TableNextRow(); ImGui::TableNextColumn(); if (ImGui::BeginChild("SfxOptions", ImVec2(0, -8))) { - ImGui::PushItemWidth(-FLT_MIN); - UIWidgets::EnhancementCheckbox("Disable Enemy Proximity Music", CVAR_AUDIO("EnemyBGMDisable")); - UIWidgets::InsertHelpHoverText( - "Disables the music change when getting close to enemies. Useful for hearing " - "your custom music for each scene more often."); - UIWidgets::EnhancementCheckbox("Disable Leading Music in Lost Woods", CVAR_AUDIO("LostWoodsConsistentVolume")); - UIWidgets::InsertHelpHoverText( - "Disables the volume shifting in the Lost Woods. Useful for hearing " - "your custom music in the Lost Woods if you don't need the navigation assitance " - "the volume changing provides. If toggling this while in the Lost Woods, reload " - "the area for the effect to kick in." - ); - UIWidgets::EnhancementCheckbox("Display Sequence Name on Overlay", CVAR_AUDIO("SeqNameOverlay")); - UIWidgets::InsertHelpHoverText( - "Displays the name of the current sequence in the corner of the screen whenever a new sequence " - "is loaded to the main sequence player (does not apply to fanfares or enemy BGM)." - ); + UIWidgets::CVarCheckbox( + "Disable Enemy Proximity Music", CVAR_AUDIO("EnemyBGMDisable"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the music change when getting close to enemies. Useful for hearing " + "your custom music for each scene more often.")); + UIWidgets::CVarCheckbox( + "Disable Leading Music in Lost Woods", CVAR_AUDIO("LostWoodsConsistentVolume"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the volume shifting in the Lost Woods. Useful for hearing " + "your custom music in the Lost Woods if you don't need the navigation assitance " + "the volume changing provides. If toggling this while in the Lost Woods, reload " + "the area for the effect to kick in.")); + UIWidgets::CVarCheckbox( + "Display Sequence Name on Overlay", CVAR_AUDIO("SeqNameOverlay"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Displays the name of the current sequence in the corner of the screen whenever a new " + "sequence " + "is loaded to the main sequence player (does not apply to fanfares or enemy BGM).")); + UIWidgets::CVarSliderInt("Overlay Duration: %d seconds", CVAR_AUDIO("SeqNameOverlayDuration"), + UIWidgets::IntSliderOptions() + .Min(1) + .Max(10) + .DefaultValue(5) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderFloat("Link's voice pitch multiplier", + CVAR_AUDIO("LinkVoiceFreqMultiplier"), + UIWidgets::FloatSliderOptions() + .IsPercentage() + .Min(0.4f) + .Max(2.5f) + .DefaultValue(1.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - UIWidgets::EnhancementSliderInt("Overlay Duration: %d seconds", "##SeqNameOverlayDuration", - CVAR_AUDIO("SeqNameOverlayDuration"), 1, 10, "", 5); - ImGui::PopItemWidth(); - ImGui::NewLine(); - ImGui::PopItemWidth(); - UIWidgets::EnhancementSliderFloat("Link's voice pitch multiplier: %.1f %%", "##linkVoiceFreqMultiplier", - CVAR_AUDIO("LinkVoiceFreqMultiplier"), 0.4, 2.5, "", 1.0, true, true); - ImGui::SameLine(); - const std::string resetButton = "Reset##linkVoiceFreqMultiplier"; - if (ImGui::Button(resetButton.c_str())) { + ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 40.f); + if (UIWidgets::Button("Reset##linkVoiceFreqMultiplier", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarSetFloat(CVAR_AUDIO("LinkVoiceFreqMultiplier"), 1.0f); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - - ImGui::NewLine(); - UIWidgets::EnhancementCheckbox("Randomize All Music and Sound Effects on New Scene", CVAR_AUDIO("RandomizeAllOnNewScene")); - UIWidgets::Tooltip("Enables randomizing all unlocked music and sound effects when you enter a new scene."); - - ImGui::NewLine(); - ImGui::PushItemWidth(-FLT_MIN); - UIWidgets::PaddedSeparator(); - UIWidgets::PaddedText("The following options are experimental and may cause music\nto sound odd or have other undesireable effects."); - UIWidgets::EnhancementCheckbox("Lower Octaves of Unplayable High Notes", CVAR_AUDIO("ExperimentalOctaveDrop")); - UIWidgets::InsertHelpHoverText("Some custom sequences may have notes that are too high for the game's audio " - "engine to play. Enabling this checkbox will cause these notes to drop a " - "couple of octaves so they can still harmonize with the other notes of the " - "sequence."); - ImGui::PopItemWidth(); + UIWidgets::CVarCheckbox( + "Randomize All Music and Sound Effects on New Scene", CVAR_AUDIO("RandomizeAllOnNewScene"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "Enables randomizing all unlocked music and sound effects when you enter a new scene.")); + UIWidgets::CVarCheckbox( + "Lower Octaves of Unplayable High Notes", CVAR_AUDIO("ExperimentalOctaveDrop"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Some custom sequences may have notes that are too high for the game's audio " + "engine to play. Enabling this checkbox will cause these notes to drop a " + "couple of octaves so they can still harmonize with the other notes of the " + "sequence.")); } ImGui::EndChild(); ImGui::EndTable(); @@ -564,9 +614,12 @@ void AudioEditor::DrawElement() { std::set seqsToExclude = {}; static ImGuiTextFilter sequenceSearch; + UIWidgets::PushStyleInput(THEME_COLOR); sequenceSearch.Draw("Filter (inc,-exc)", 490.0f); + UIWidgets::PopStyleInput(); ImGui::SameLine(); - if (ImGui::Button("Exclude All")) { + if (UIWidgets::Button("Exclude All", + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { for (auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { seqsToExclude.insert(seqInfo); @@ -574,7 +627,8 @@ void AudioEditor::DrawElement() { } } ImGui::SameLine(); - if (ImGui::Button("Include All")) { + if (UIWidgets::Button("Include All", + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { for (auto seqInfo : AudioCollection::Instance->GetExcludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { seqsToInclude.insert(seqInfo); @@ -643,13 +697,17 @@ void AudioEditor::DrawElement() { ImGui::BeginChild("ChildIncludedSequences", ImVec2(0, -8)); for (auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { - if (ImGui::Button(std::string(ICON_FA_TIMES "##" + seqInfo->sfxKey).c_str())) { + if (UIWidgets::Button(std::string(ICON_FA_TIMES "##" + seqInfo->sfxKey).c_str(), + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(9.0f, 6.0f)) + .Color(THEME_COLOR))) { seqsToExclude.insert(seqInfo); } ImGui::SameLine(); DrawPreviewButton(seqInfo->sequenceId, seqInfo->sfxKey, seqInfo->category); ImGui::SameLine(); - DrawTypeChip(seqInfo->category); + DrawTypeChip(seqInfo->category, seqInfo->label); ImGui::SameLine(); ImGui::Text("%s", seqInfo->label.c_str()); } @@ -667,13 +725,17 @@ void AudioEditor::DrawElement() { ImGui::BeginChild("ChildExcludedSequences", ImVec2(0, -8)); for (auto seqInfo : AudioCollection::Instance->GetExcludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { - if (ImGui::Button(std::string(ICON_FA_PLUS "##" + seqInfo->sfxKey).c_str())) { + if (UIWidgets::Button(std::string(ICON_FA_PLUS "##" + seqInfo->sfxKey).c_str(), + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(9.0f, 6.0f)) + .Color(THEME_COLOR))) { seqsToInclude.insert(seqInfo); } ImGui::SameLine(); DrawPreviewButton(seqInfo->sequenceId, seqInfo->sfxKey, seqInfo->category); ImGui::SameLine(); - DrawTypeChip(seqInfo->category); + DrawTypeChip(seqInfo->category, seqInfo->sfxKey); ImGui::SameLine(); ImGui::Text("%s", seqInfo->label.c_str()); } @@ -695,6 +757,7 @@ void AudioEditor::DrawElement() { ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); } std::vector allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE }; diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index 5f650a25f..3eb18c0e2 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -10,31 +10,25 @@ #include #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" + +using namespace UIWidgets; // Text colors -static ImVec4 textColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); -static ImVec4 range1Color = ImVec4(1.0f, 0.7f, 0, 1.0f); -static ImVec4 range2Color = ImVec4(0, 1.0f, 0, 1.0f); +static Color_RGBA8 textColorDefault = { 255, 255, 255, 255 }; +static Color_RGBA8 range1ColorDefault = { 255, 178, 0, 255 }; +static Color_RGBA8 range2ColorDefault = { 0, 255, 0, 255 }; -static const char* buttonOutlineOptions[4] = { "Always Shown", "Shown Only While Not Pressed", - "Shown Only While Pressed", "Always Hidden" }; -static const char* buttonOutlineOptionsVerbose[4] = { "Outline Always Shown", "Outline Shown Only While Not Pressed", - "Outline Shown Only While Pressed", "Outline Always Hidden" }; +static std::unordered_map buttonOutlineOptions = + {{ BUTTON_OUTLINE_ALWAYS_SHOWN, "Always Shown" }, { BUTTON_OUTLINE_NOT_PRESSED, "Shown Only While Not Pressed" }, + { BUTTON_OUTLINE_PRESSED, "Shown Only While Pressed" }, { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Always Hidden" }}; +static std::unordered_map buttonOutlineOptionsVerbose = + {{ BUTTON_OUTLINE_ALWAYS_SHOWN, "Outline Always Shown" }, { BUTTON_OUTLINE_NOT_PRESSED, "Outline Shown Only While Not Pressed" }, + { BUTTON_OUTLINE_PRESSED, "Outline Shown Only While Pressed" }, { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Outline Always Hidden" }}; -static const char* stickModeOptions[3] = { "Always", "While In Use", "Never" }; - -static Color_RGBA8 vec2Color(ImVec4 vec) { - Color_RGBA8 color; - color.r = vec.x * 255.0; - color.g = vec.y * 255.0; - color.b = vec.z * 255.0; - color.a = vec.w * 255.0; - return color; -} - -static ImVec4 color2Vec(Color_RGBA8 color) { - return ImVec4(color.r / 255.0, color.g / 255.0, color.b / 255.0, color.a / 255.0); -} +static std::unordered_map stickModeOptions = + {{ STICK_MODE_ALWAYS_SHOWN, "Always" }, { STICK_MODE_HIDDEN_IN_DEADZONE, "While In Use" }, { STICK_MODE_ALWAYS_HIDDEN, "Never" }}; InputViewer::~InputViewer() { SPDLOG_TRACE("destruct input viewer"); @@ -399,17 +393,17 @@ void InputViewer::DrawElement() { (rSquared >= (range1Min * range1Min)) && (rSquared < (range1Max * range1Max))) { ImGui::PushStyleColor( ImGuiCol_Text, - color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)))); + VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color.Value"), range1ColorDefault))); } else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { ImGui::PushStyleColor( ImGuiCol_Text, - color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)))); + VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color.Value"), range2ColorDefault))); } else { - ImGui::PushStyleColor(ImGuiCol_Text, color2Vec(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), - vec2Color(textColor)))); + ImGui::PushStyleColor(ImGuiCol_Text, VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor.Value"), + textColorDefault))); } // Render text @@ -434,250 +428,217 @@ InputViewerSettingsWindow::~InputViewerSettingsWindow() { } void InputViewerSettingsWindow::DrawElement() { - // gInputViewer.Scale - UIWidgets::EnhancementSliderFloat("Input Viewer Scale: %.2f", "##Input", CVAR_INPUT_VIEWER("Scale"), 0.1f, 5.0f, "", - 1.0f, false, true); - UIWidgets::Tooltip("Sets the on screen size of the input viewer"); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + // gInputViewer.Scale + CVarSliderFloat("Input Viewer Scale: %.2f", CVAR_INPUT_VIEWER("Scale"), + FloatSliderOptions().Color(THEME_COLOR).DefaultValue(1.0f).Min(0.1f).Max(5.0f).ShowButtons(true).Tooltip("Sets the on screen size of the input viewer")); // gInputViewer.EnableDragging - UIWidgets::EnhancementCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(true, true); // gInputViewer.ShowBackground - UIWidgets::EnhancementCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(true, true); + PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader("Buttons")) { // gInputViewer.ButtonOutlineMode - UIWidgets::PaddedText("Button Outlines/Backgrounds", true, false); - UIWidgets::EnhancementCombobox( - CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, BUTTON_OUTLINE_NOT_PRESSED, - !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), "", - CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); - UIWidgets::Tooltip( - "Sets the desired visibility behavior for the button outline/background layers. Useful for " - "custom input viewers."); + CVarCombobox("Button Outlines/Backgrounds", CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, + ComboboxOptions({{ .disabled = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), .disabledTooltip = "Disabled because Global Button Outline is off" }}) + .Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED) + .Tooltip("Sets the desired visibility behavior for the button outline/background layers. Useful for " + "custom input viewers.")); // gInputViewer.UseGlobalButtonOutlineMode - UIWidgets::EnhancementCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(); bool useIndividualOutlines = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); // gInputViewer.ABtn - UIWidgets::EnhancementCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##ABtnOutline", CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.BBtn - UIWidgets::EnhancementCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("BBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##BBtnOutline", CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CUp - UIWidgets::EnhancementCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CUp"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CUpOutline", CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CRight - UIWidgets::EnhancementCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CRightOutline", CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CDown - UIWidgets::EnhancementCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CDownOutline", CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CLeft - UIWidgets::EnhancementCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##CLeftOutline", CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.LBtn - UIWidgets::EnhancementCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("LBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##LBtnOutline", CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.RBtn - UIWidgets::EnhancementCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##RBtnOutline", CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.ZBtn - UIWidgets::EnhancementCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##ZBtnOutline", CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.StartBtn - UIWidgets::EnhancementCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, true); + CVarCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("StartBtn"), 1)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##StartBtnOutline", CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Dpad - UIWidgets::EnhancementCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); + CVarCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Dpad"), 0)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##DpadOutline", CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Mod1 - UIWidgets::EnhancementCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); + CVarCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod1"), 0)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##Mmod1Outline", CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Mod2 - UIWidgets::EnhancementCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), false, "", - UIWidgets::CheckboxGraphics::Checkmark, false); + CVarCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::Indent(); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, - BUTTON_OUTLINE_NOT_PRESSED); + CVarCombobox("##Mod2Outline", CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } - UIWidgets::PaddedSeparator(true, true); + UIWidgets:PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Analog Stick")) { // gInputViewer.AnalogStick.VisibilityMode - UIWidgets::PaddedText("Analog Stick Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, - STICK_MODE_ALWAYS_SHOWN); - UIWidgets::Tooltip( - "Determines the conditions under which the moving layer of the analog stick texture is visible."); + CVarCombobox("Analog Stick Visibility", CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip("Determines the conditions under which the moving layer of the analog stick texture is visible.")); // gInputViewer.AnalogStick.OutlineMode - UIWidgets::PaddedText("Analog Stick Outline/Background Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), stickModeOptions, - STICK_MODE_ALWAYS_SHOWN); - UIWidgets::Tooltip( - "Determines the conditions under which the analog stick outline/background texture is visible."); + CVarCombobox("Analog Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), stickModeOptions, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip("Determines the conditions under which the analog stick outline/background texture is visible.")); // gInputViewer.AnalogStick.Movement - UIWidgets::EnhancementSliderInt("Analog Stick Movement: %dpx", "##AnalogMovement", - CVAR_INPUT_VIEWER("AnalogStick.Movement"), 0, 200, "", 12, true); - UIWidgets::Tooltip( - "Sets the distance to move the analog stick in the input viewer. Useful for custom input viewers."); + CVarSliderInt("Analog Stick Movement: %dpx", CVAR_INPUT_VIEWER("AnalogStick.Movement"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(200).DefaultValue(12).ShowButtons(true) + .Tooltip("Sets the distance to move the analog stick in the input viewer. Useful for custom input viewers.")); UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { // gInputViewer.RightStick.VisibilityMode - UIWidgets::PaddedText("Right Stick Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, - STICK_MODE_HIDDEN_IN_DEADZONE); - UIWidgets::Tooltip( - "Determines the conditions under which the moving layer of the right stick texture is visible."); + CVarCombobox("Right Stick Visibility", CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip("Determines the conditions under which the moving layer of the right stick texture is visible.")); // gInputViewer.RightStick.OutlineMode - UIWidgets::PaddedText("Right Stick Outline/Background Visibility", true, false); - UIWidgets::EnhancementCombobox(CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, - STICK_MODE_HIDDEN_IN_DEADZONE); - UIWidgets::Tooltip( - "Determines the conditions under which the right stick outline/background texture is visible."); + CVarCombobox("Right Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip("Determines the conditions under which the right stick outline/background texture is visible.")); // gInputViewer.RightStick.Movement - UIWidgets::EnhancementSliderInt("Right Stick Movement: %dpx", "##RightMovement", - CVAR_INPUT_VIEWER("RightStick.Movement"), 0, 200, "", 7, true); - UIWidgets::Tooltip( - "Sets the distance to move the right stick in the input viewer. Useful for custom input viewers."); + CVarSliderInt("Right Stick Movement: %dpx", CVAR_INPUT_VIEWER("RightStick.Movement"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(200).DefaultValue(7).ShowButtons(true) + .Tooltip("Sets the distance to move the right stick in the input viewer. Useful for custom input viewers.")); UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Analog Angle Values")) { // gAnalogAngles - UIWidgets::EnhancementCheckbox("Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled")); - UIWidgets::Tooltip("Displays analog stick angle values in the input viewer"); + CVarCheckbox("Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Displays analog stick angle values in the input viewer")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0)) { // gInputViewer.AnalogAngles.TextColor - if (ImGui::ColorEdit4("Text Color", (float*)&textColor)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), vec2Color(textColor)); - } + CVarColorPicker("Text Color", CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), textColorDefault, + true, ColorPickerRandomButton | ColorPickerResetButton); // gAnalogAngleScale - UIWidgets::EnhancementSliderFloat("Angle Text Scale: %.2f%%", "##AnalogAngleScale", - CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 0.1f, 5.0f, "", 1.0f, true, true); + CVarSliderFloat("Angle Text Scale: %.2f%%", CVAR_INPUT_VIEWER("AnalogAngles.Scale"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.1f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); // gInputViewer.AnalogAngles.Offset - UIWidgets::EnhancementSliderInt("Angle Text Offset: %dpx", "##AnalogAngleOffset", - CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0, 400, "", 0, true); + CVarSliderInt("Angle Text Offset: %dpx", CVAR_INPUT_VIEWER("AnalogAngles.Offset"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(400).DefaultValue(0).ShowButtons(true) + .Tooltip("Sets the distance to move the right stick in the input viewer. Useful for custom input viewers.")); UIWidgets::PaddedSeparator(true, true); // gInputViewer.AnalogAngles.Range1.Enabled - UIWidgets::EnhancementCheckbox("Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled")); - UIWidgets::Tooltip( - "Highlights the angle value text when the analog stick is in ESS position (on flat ground)"); + CVarCheckbox("Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Highlights the angle value text when the analog stick is in ESS position (on flat ground)")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0)) { // gInputViewer.AnalogAngles.Range1.Color - if (ImGui::ColorEdit4("ESS Color", (float*)&range1Color)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), vec2Color(range1Color)); - } + CVarColorPicker("ESS Color", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), range1ColorDefault, + true, ColorPickerRandomButton | ColorPickerResetButton); } UIWidgets::PaddedSeparator(true, true); // gInputViewer.AnalogAngles.Range2.Enabled - UIWidgets::EnhancementCheckbox("Highlight Walking Speed Angles", - CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled")); - UIWidgets::Tooltip("Highlights the angle value text when the analog stick is at an angle that would " + CVarCheckbox("Highlight Walking Speed Angles", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Highlights the angle value text when the analog stick is at an angle that would " "produce a walking speed (on flat ground)\n\n" - "Useful for 1.0 Empty Jumpslash Quick Put Away"); + "Useful for 1.0 Empty Jumpslash Quick Put Away")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0)) { // gInputViewer.AnalogAngles.Range2.Color - if (ImGui::ColorEdit4("Walking Speed Color", (float*)&range2Color)) { - CVarSetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), vec2Color(range2Color)); - } + CVarColorPicker("Walking Speed Color", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), range2ColorDefault, + true, ColorPickerRandomButton | ColorPickerResetButton); } } } + PopStyleHeader(); + ImGui::PopFont(); } diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index 7e4918799..135cb8a00 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -2,6 +2,7 @@ #include #include "soh/OTRGlobals.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "z64.h" #include "soh/cvar_prefixes.h" #ifndef __WIIU__ @@ -10,6 +11,8 @@ #define SCALE_IMGUI_SIZE(value) ((value / 13.0f) * ImGui::GetFontSize()) +using namespace UIWidgets; + SohInputEditorWindow::~SohInputEditorWindow() { } @@ -1062,17 +1065,16 @@ void SohInputEditorWindow::DrawLEDSection(uint8_t port) { } // todo: clean this up, probably just hardcode to LED_COLOR_SOURCE_GAME and use SoH options only here if (mapping->GetColorSource() == LED_COLOR_SOURCE_GAME) { - static const char* ledSources[] = { + static std::vector ledSources = { "Original Tunic Colors", "Cosmetics Tunic Colors", "Health Colors", "Original Navi Targeting Colors", "Cosmetics Navi Targeting Colors", "Custom" }; - UIWidgets::PaddedText("Source"); - UIWidgets::EnhancementCombobox(CVAR_SETTING("LEDColorSource"), ledSources, LED_SOURCE_TUNIC_ORIGINAL); - UIWidgets::Tooltip("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " + CVarCombobox("Source", CVAR_SETTING("LEDColorSource"), ledSources, UIWidgets::ComboboxOptions().Color(THEME_COLOR).DefaultIndex(LED_SOURCE_TUNIC_ORIGINAL) + .Tooltip("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " "health < 40%. Green otherwise.\n\n" "Tunics: colors will mirror currently equipped tunic, whether original or the current " "values in Cosmetics Editor.\n\n" - "Custom: single, solid color"); + "Custom: single, solid color")); if (CVarGetInteger(CVAR_SETTING("LEDColorSource"), 1) == LED_SOURCE_CUSTOM) { UIWidgets::Spacer(3); auto port1Color = CVarGetColor24(CVAR_SETTING("LEDPort1Color"), { 255, 255, 255 }); @@ -1090,14 +1092,13 @@ void SohInputEditorWindow::DrawLEDSection(uint8_t port) { ImGui::SameLine(); ImGui::Text("Custom Color"); } - UIWidgets::PaddedEnhancementSliderFloat("Brightness: %.1f %%", "##LED_Brightness", CVAR_SETTING("LEDBrightness"), 0.0f, - 1.0f, "", 1.0f, true, true); - UIWidgets::Tooltip("Sets the brightness of controller LEDs. 0% brightness = LEDs off."); - UIWidgets::PaddedEnhancementCheckbox( - "Critical Health Override", CVAR_SETTING("LEDCriticalOverride"), true, true, - CVarGetInteger(CVAR_SETTING("LEDColorSource"), LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, - "Override redundant for health source.", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Shows red color when health is critical, otherwise displays according to color source."); + CVarSliderFloat("Brightness: %.1f %%", CVAR_SETTING("LEDBrightness"), + FloatSliderOptions().IsPercentage().Min(0.0f).Max(1.0f).DefaultValue(1.0f).ShowButtons(true) + .Tooltip("Sets the brightness of controller LEDs. 0% brightness = LEDs off.")); + CVarCheckbox("Critical Health Override", CVAR_SETTING("LEDCriticalOverride"), + CheckboxOptions({{ .disabled = CVarGetInteger(CVAR_SETTING("LEDColorSource"), LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, + .disabledTooltip = "Override redundant for health source."}}).DefaultValue(true) + .Tooltip("Shows red color when health is critical, otherwise displays according to color source.")); } ImGui::TreePop(); } @@ -1281,7 +1282,6 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt preview = "Unknown"; } - UIWidgets::Spacer(0); ImVec2 cursorPos = ImGui::GetCursorPos(); ImVec2 textSize = ImGui::CalcTextSize(mapping.label); ImGui::SetCursorPosY(cursorPos.y + textSize.y / 4); @@ -1303,16 +1303,16 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt } ImGui::EndCombo(); } - UIWidgets::Spacer(0); } void SohInputEditorWindow::DrawOcarinaControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x, cursor.y + 5)); - UIWidgets::EnhancementCheckbox("Dpad Ocarina Playback", CVAR_SETTING("CustomOcarina.Dpad")); - UIWidgets::EnhancementCheckbox("Right Stick Ocarina Playback", CVAR_SETTING("CustomOcarina.RightStick")); - UIWidgets::EnhancementCheckbox("Customize Ocarina Controls", CVAR_SETTING("CustomOcarina.Enabled")); + CheckboxOptions checkOpt = CheckboxOptions().Color(THEME_COLOR); + CVarCheckbox("Dpad Ocarina Playback", CVAR_SETTING("CustomOcarina.Dpad"), checkOpt); + CVarCheckbox("Right Stick Ocarina Playback", CVAR_SETTING("CustomOcarina.RightStick"), checkOpt); + CVarCheckbox("Customize Ocarina Controls", CVAR_SETTING("CustomOcarina.Enabled"), checkOpt); if (!CVarGetInteger(CVAR_SETTING("CustomOcarina.Enabled"), 0)) { ImGui::BeginDisabled(); @@ -1344,60 +1344,56 @@ void SohInputEditorWindow::DrawCameraControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("Aiming/First-Person Camera", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim")); - UIWidgets::Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming"); + CVarCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming")); if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) { - UIWidgets::PaddedEnhancementCheckbox("Allow moving while in first person mode", CVAR_SETTING("MoveInFirstPerson")); - UIWidgets::Tooltip("Changes the left stick to move the player while in first person mode"); + CVarCheckbox("Allow moving while in first person mode", CVAR_SETTING("MoveInFirstPerson"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Changes the left stick to move the player while in first person mode")); } - UIWidgets::PaddedEnhancementCheckbox("Invert Aiming X Axis", CVAR_SETTING("Controls.InvertAimingXAxis")); - UIWidgets::Tooltip("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming"); - UIWidgets::PaddedEnhancementCheckbox("Invert Aiming Y Axis", CVAR_SETTING("Controls.InvertAimingYAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Camera Y Axis in:\n-First-Person/C-Up view\n-Weapon Aiming"); - UIWidgets::PaddedEnhancementCheckbox("Invert Shield Aiming X Axis", CVAR_SETTING("Controls.InvertShieldAimingXAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Shield Aiming X Axis"); - UIWidgets::PaddedEnhancementCheckbox("Invert Shield Aiming Y Axis", CVAR_SETTING("Controls.InvertShieldAimingYAxis")); - UIWidgets::Tooltip("Inverts the Shield Aiming Y Axis"); - UIWidgets::PaddedEnhancementCheckbox("Invert Z-Weapon Aiming Y Axis", CVAR_SETTING("Controls.InvertZAimingYAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming"); - UIWidgets::PaddedEnhancementCheckbox("Disable Auto-Centering in First-Person View", CVAR_SETTING("DisableFirstPersonAutoCenterView")); - UIWidgets::Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming"); - if (UIWidgets::PaddedEnhancementCheckbox("Enable Custom Aiming/First-Person sensitivity", CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), true, false)) { + CVarCheckbox("Invert Aiming X Axis", CVAR_SETTING("Controls.InvertAimingXAxis"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Invert Aiming Y Axis", CVAR_SETTING("Controls.InvertAimingYAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Invert Shield Aiming X Axis", CVAR_SETTING("Controls.InvertShieldAimingXAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) + .Tooltip("Inverts the Shield Aiming X Axis")); + CVarCheckbox("Invert Shield Aiming Y Axis", CVAR_SETTING("Controls.InvertShieldAimingYAxis"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Inverts the Shield Aiming Y Axis")); + CVarCheckbox("Invert Z-Weapon Aiming Y Axis", CVAR_SETTING("Controls.InvertZAimingYAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming")); + CVarCheckbox("Disable Auto-Centering in First-Person View", CVAR_SETTING("DisableFirstPersonAutoCenterView"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming")); + if (CVarCheckbox("Enable Custom Aiming/First-Person sensitivity", CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), CheckboxOptions().Color(THEME_COLOR))) { if (!CVarGetInteger(CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), 0)) { CVarClear(CVAR_SETTING("FirstPersonCameraSensitivity.X")); CVarClear(CVAR_SETTING("FirstPersonCameraSensitivity.Y")); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } if (CVarGetInteger(CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), 0)) { - UIWidgets::EnhancementSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", "##FirstPersonSensitivity Horizontal", - CVAR_SETTING("FirstPersonCameraSensitivity.X"), 0.01f, 5.0f, "", 1.0f, true); - UIWidgets::EnhancementSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", "##FirstPersonSensitivity Vertical", - CVAR_SETTING("FirstPersonCameraSensitivity.Y"), 0.01f, 5.0f, "", 1.0f, true); + CVarSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", CVAR_SETTING("FirstPersonCameraSensitivity.X"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", CVAR_SETTING("FirstPersonCameraSensitivity.Y"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); } - UIWidgets::Spacer(0); Ship::GuiWindow::EndGroupPanel(0); - UIWidgets::Spacer(0); cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("Third-Person Camera", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Free Look", CVAR_SETTING("FreeLook.Enabled")); - UIWidgets::Tooltip("Enables free look camera control\nNote: You must remap C buttons off of the right stick in the " - "controller config menu, and map the camera stick to the right stick."); - UIWidgets::PaddedEnhancementCheckbox("Invert Camera X Axis", CVAR_SETTING("FreeLook.InvertXAxis")); - UIWidgets::Tooltip("Inverts the Camera X Axis in:\n-Free look"); - UIWidgets::PaddedEnhancementCheckbox("Invert Camera Y Axis", CVAR_SETTING("FreeLook.InvertYAxis"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Inverts the Camera Y Axis in:\n-Free look"); - UIWidgets::Spacer(0); - UIWidgets::PaddedEnhancementSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", "##ThirdPersonSensitivity Horizontal", - CVAR_SETTING("FreeLook.CameraSensitivity.X"), 0.01f, 5.0f, "", 1.0f, true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", "##ThirdPersonSensitivity Vertical", - CVAR_SETTING("FreeLook.CameraSensitivity.Y"), 0.01f, 5.0f, "", 1.0f, true, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Camera Distance: %d", "##CamDist", - CVAR_SETTING("FreeLook.MaxCameraDistance"), 100, 900, "", 185, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Camera Transition Speed: %d", "##CamTranSpeed", - CVAR_SETTING("FreeLook.TransitionSpeed"), 0, 900, "", 25, true, false, true); + CVarCheckbox("Free Look", CVAR_SETTING("FreeLook.Enabled"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Enables free look camera control\nNote: You must remap C buttons off of the right stick in the " + "controller config menu, and map the camera stick to the right stick.")); + CVarCheckbox("Invert Camera X Axis", CVAR_SETTING("FreeLook.InvertXAxis"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Inverts the Camera X Axis in:\n-Free look")); + CVarCheckbox("Invert Camera Y Axis", CVAR_SETTING("FreeLook.InvertYAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-Free look")); + CVarSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.X"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.Y"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderInt("Camera Distance: %d", CVAR_SETTING("FreeLook.MaxCameraDistance"), IntSliderOptions().Color(THEME_COLOR).Min(100).Max(900).DefaultValue(185).ShowButtons(true)); + CVarSliderInt("Camera Transition Speed: %d", CVAR_SETTING("FreeLook.TransitionSpeed"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(900).DefaultValue(25).ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); } @@ -1405,17 +1401,17 @@ void SohInputEditorWindow::DrawDpadControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("D-Pad Options", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("D-pad Support on Pause Screen", CVAR_SETTING("DPadOnPause")); - UIWidgets::Tooltip("Navigate Pause with the D-pad\nIf used with \"D-pad as Equip Items\", you must hold C-Up to equip instead of navigate"); - UIWidgets::PaddedEnhancementCheckbox("D-pad Support in Text Boxes", CVAR_SETTING("DpadInText")); - UIWidgets::Tooltip("Navigate choices in text boxes, shop item selection, and the file select / name entry screens with the D-pad"); + CVarCheckbox("D-pad Support on Pause Screen", CVAR_SETTING("DPadOnPause"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Navigate Pause with the D-pad\nIf used with \"D-pad as Equip Items\", you must hold C-Up to equip instead of navigate")); + CVarCheckbox("D-pad Support in Text Boxes", CVAR_SETTING("DpadInText"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Navigate choices in text boxes, shop item selection, and the file select / name entry screens with the D-pad")); if (!CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CVarGetInteger(CVAR_SETTING("DpadInText"), 0)) { ImGui::BeginDisabled(); } - UIWidgets::PaddedEnhancementCheckbox("D-pad hold change", CVAR_SETTING("DpadHoldChange"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("The cursor will only move a single space no matter how long a D-pad direction is held"); + CVarCheckbox("D-pad hold change", CVAR_SETTING("DpadHoldChange"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) + .Tooltip("The cursor will only move a single space no matter how long a D-pad direction is held")); if (!CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CVarGetInteger(CVAR_SETTING("DpadInText"), 0)) { ImGui::EndDisabled(); @@ -1536,30 +1532,24 @@ void SohInputEditorWindow::DrawLinkTab() { DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2); ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - UIWidgets::PaddedEnhancementCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"), true, false); - UIWidgets::Tooltip("Hold the assigned button to change the maximum walking or swimming speed"); + CVarCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Hold the assigned button to change the maximum walking or swimming speed")); if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0)) { UIWidgets::Spacer(5); Ship::GuiWindow::BeginGroupPanel("Speed Modifier", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Toggle modifier instead of holding", - CVAR_SETTING("WalkModifier.SpeedToggle"), true, false); + CVarCheckbox("Toggle modifier instead of holding", CVAR_SETTING("WalkModifier.SpeedToggle"), CheckboxOptions().Color(THEME_COLOR)); Ship::GuiWindow::BeginGroupPanel("Walk Modifier", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementCheckbox("Don't affect jump distance/velocity", - CVAR_SETTING("WalkModifier.DoesntChangeJump"), true, false); - UIWidgets::PaddedEnhancementSliderFloat("Walk Modifier 1: %.0f %%", "##WalkMod1", - CVAR_SETTING("WalkModifier.Mapping1"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Walk Modifier 2: %.0f %%", "##WalkMod2", - CVAR_SETTING("WalkModifier.Mapping2"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); + CVarCheckbox("Don't affect jump distance/velocity", CVAR_SETTING("WalkModifier.DoesntChangeJump"), CheckboxOptions().Color(THEME_COLOR)); + CVarSliderFloat("Walk Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.Mapping1"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Walk Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.Mapping2"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); Ship::GuiWindow::BeginGroupPanel("Swim Modifier", ImGui::GetContentRegionAvail()); - UIWidgets::PaddedEnhancementSliderFloat("Swim Modifier 1: %.0f %%", "##SwimMod1", - CVAR_SETTING("WalkModifier.SwimMapping1"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); - UIWidgets::PaddedEnhancementSliderFloat("Swim Modifier 2: %.0f %%", "##SwimMod2", - CVAR_SETTING("WalkModifier.SwimMapping2"), 0.0f, 5.0f, "", 1.0f, - true, true, false, true); + CVarSliderFloat("Swim Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping1"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Swim Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping2"), + FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); Ship::GuiWindow::EndGroupPanel(0); } @@ -1659,9 +1649,7 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); - ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.133f, 0.133f, 0.133f, 1.0f)); - ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); - ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); + PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); @@ -1690,19 +1678,20 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo DrawStickSection(portIndex, Ship::LEFT, 0); } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); + PopStyleHeader(); ImGui::EndTabItem(); } } void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { + PushStyleButton(THEME_COLOR); if (ImGui::Button("Clear All", ImGui::CalcTextSize("Clear All") * 2)) { ImGui::OpenPopup("Clear All##clearAllPopup"); } + PopStyleButton(); if (ImGui::BeginPopupModal("Clear All##clearAllPopup", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("This will clear all mappings for port %d.\n\nContinue?", portIndex + 1); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { ImGui::CloseCurrentPopup(); } @@ -1710,6 +1699,7 @@ void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->ClearAllMappings(); ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } } @@ -1717,22 +1707,23 @@ void SohInputEditorWindow::DrawClearAllButton(uint8_t portIndex) { void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { ImGui::SameLine(); auto popupId = StringHelper::Sprintf("setDefaultsPopup##%d", portIndex); + PushStyleButton(THEME_COLOR); if (ImGui::Button(StringHelper::Sprintf("Set Defaults##%d", portIndex).c_str(), ImVec2(ImGui::CalcTextSize("Set Defaults") * 2))) { ImGui::OpenPopup(popupId.c_str()); } + PopStyleButton(); if (ImGui::BeginPopup(popupId.c_str())) { bool shouldClose = false; - ImGui::PushStyleColor(ImGuiCol_Button, BUTTON_COLOR_KEYBOARD_BEIGE); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED); + PushStyleButton(BUTTON_COLOR_KEYBOARD_BEIGE); if (ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str())) { ImGui::OpenPopup("Set Defaults for Keyboard"); } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); + PopStyleButton(); if (ImGui::BeginPopupModal("Set Defaults for Keyboard", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("This will clear all existing mappings for\nKeyboard on port %d.\n\nContinue?", portIndex + 1); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { shouldClose = true; ImGui::CloseCurrentPopup(); @@ -1747,21 +1738,21 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { shouldClose = true; ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } 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); + PushStyleButton(buttonColor); 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(); + PopStyleButton(); 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); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { shouldClose = true; ImGui::CloseCurrentPopup(); @@ -1776,12 +1767,15 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { shouldClose = true; ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } + PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel") || shouldClose) { ImGui::CloseCurrentPopup(); } + PopStyleButton(); ImGui::EndPopup(); } diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 16fb2bed4..93c866eb3 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -11,6 +11,7 @@ #include #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -92,6 +93,7 @@ std::map groupLabels = { typedef struct { const char* cvar; + const char* valuesCvar; const char* rainbowCvar; const char* lockedCvar; const char* changedCvar; @@ -111,7 +113,8 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { #define COSMETIC_OPTION(id, label, group, defaultColor, supportsAlpha, supportsRainbow, advancedOption) \ { id, { \ - CVAR_COSMETIC(id ".Value"), CVAR_COSMETIC(id ".Rainbow"), CVAR_COSMETIC(id ".Locked"), CVAR_COSMETIC(id ".Changed"), label, group, \ + CVAR_COSMETIC(id), CVAR_COSMETIC(id ".Value"), CVAR_COSMETIC(id ".Rainbow"), CVAR_COSMETIC(id ".Locked"), \ + CVAR_COSMETIC(id ".Changed"), label, group, \ ImVec4(defaultColor.r / 255.0f, defaultColor.g / 255.0f, defaultColor.b / 255.0f, defaultColor.a / 255.0f), defaultColor, \ supportsAlpha, supportsRainbow, advancedOption \ } } @@ -313,7 +316,7 @@ static std::map cosmeticOptions = { #define MESSAGE_COSMETIC_OPTION(id, label, r, g, b) COSMETIC_OPTION("Message." id, label, COSMETICS_GROUP_MESSAGE, ColorRGBA8(r, g, b, 255), false, true, true) MESSAGE_COSMETIC_OPTION("Default.Normal", "Message Default Color", 255, 255, 255), - MESSAGE_COSMETIC_OPTION("Default.NoneNoShadow", "Message Default (None No Shadow) Color", 0, 0, 0), + MESSAGE_COSMETIC_OPTION("Default.NoneNoShadow", "Message Default (None No Shadow)", 0, 0, 0), MESSAGE_COSMETIC_OPTION("Red.Normal", "Message Red Color", 255, 60, 60), MESSAGE_COSMETIC_OPTION("Red.Wooden", "Message Red (Wooden) Color", 255, 120, 0), MESSAGE_COSMETIC_OPTION("Adjustable.Normal", "Message Adjustable Color", 70, 255, 80), @@ -322,7 +325,7 @@ static std::map cosmeticOptions = { MESSAGE_COSMETIC_OPTION("Blue.Wooden", "Message Blue (Wooden) Color", 80, 110, 255), MESSAGE_COSMETIC_OPTION("LightBlue.Normal", "Message Light Blue Color", 100, 180, 255), MESSAGE_COSMETIC_OPTION("LightBlue.Wooden", "Message Light Blue (Wooden) Color", 90, 180, 255), - MESSAGE_COSMETIC_OPTION("LightBlue.LightBlue.NoneNoShadow", "Message Light Blue (None No Shadow) Color", 80, 150, 180), + MESSAGE_COSMETIC_OPTION("LightBlue.LightBlue.NoneNoShadow", "Message Light Blue (None No Shadow)", 80, 150, 180), MESSAGE_COSMETIC_OPTION("Purple.Normal", "Message Purple Color", 255, 150, 180), MESSAGE_COSMETIC_OPTION("Purple.Wooden", "Message Purple (Wooden) Color", 210, 100, 255), MESSAGE_COSMETIC_OPTION("Yellow.Normal", "Message Yellow Color", 255, 255, 50), @@ -469,41 +472,38 @@ static const char* MarginCvarNonAnchor[] { CVAR_COSMETIC("HUD.TitleCard.Boss") }; -ImVec4 GetRandomValue() { -#if !defined(__SWITCH__) && !defined(__WIIU__) - std::random_device rd; - std::mt19937 rng(rd()); -#else - size_t seed = std::hash{}(std::to_string(rand())); - std::mt19937_64 rng(seed); -#endif - std::uniform_int_distribution dist(0, 255 - 1); - - ImVec4 NewColor; - NewColor.x = (float)(dist(rng)) / 255.0f; - NewColor.y = (float)(dist(rng)) / 255.0f; - NewColor.z = (float)(dist(rng)) / 255.0f; - return NewColor; -} - -void SetMarginAll(const char* ButtonName, bool SetActivated) { - if (ImGui::Button(ButtonName)) { - //MarginCvarNonAnchor is an array that list every element that has No anchor by default, because if that the case this function will not touch it with pose type 0. +void SetMarginAll(const char* ButtonName, bool SetActivated, const char* tooltip) { + if (UIWidgets::Button(ButtonName, UIWidgets::ButtonOptions() + .Size(ImVec2(200.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip(tooltip))) { + // MarginCvarNonAnchor is an array that list every element that has No anchor by default, because if that the + // case this function will not touch it with pose type 0. u8 arrayLengthNonMargin = sizeof(MarginCvarNonAnchor) / sizeof(*MarginCvarNonAnchor); for (auto cvarName : MarginCvarList) { std::string cvarPosType = std::string(cvarName).append(".PosType"); std::string cvarNameMargins = std::string(cvarName).append(".UseMargins"); - if (CVarGetInteger(cvarPosType.c_str(),0) <= ANCHOR_RIGHT && SetActivated) { //Our element is not Hidden or Non anchor + if (CVarGetInteger(cvarPosType.c_str(), 0) <= ANCHOR_RIGHT && + SetActivated) { // Our element is not Hidden or Non anchor for (int i = 0; i < arrayLengthNonMargin; i++) { - if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) == ORIGINAL_LOCATION)) { //Our element is both in original position and do not have anchor by default so we skip it. - CVarSetInteger(cvarNameMargins.c_str(), false); //force set off - } else if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && (CVarGetInteger(cvarPosType.c_str(), 0) != ORIGINAL_LOCATION)) { //Our element is not in original position regarless it has no anchor by default since player made it anchored we can toggle margins + if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && + (CVarGetInteger(cvarPosType.c_str(), 0) == + ORIGINAL_LOCATION)) { // Our element is both in original position and do not have anchor by + // default so we skip it. + CVarSetInteger(cvarNameMargins.c_str(), false); // force set off + } else if ((strcmp(cvarName, MarginCvarNonAnchor[i]) == 0) && + (CVarGetInteger(cvarPosType.c_str(), 0) != + ORIGINAL_LOCATION)) { // Our element is not in original position regarless it has no + // anchor by default since player made it anchored we can toggle + // margins CVarSetInteger(cvarNameMargins.c_str(), SetActivated); - } else if (strcmp(cvarName, MarginCvarNonAnchor[i]) != 0) { //Our elements has an anchor by default so regarless of it's position right now that okay to toggle margins. + } else if (strcmp(cvarName, MarginCvarNonAnchor[i]) != + 0) { // Our elements has an anchor by default so regarless of it's position right now + // that okay to toggle margins. CVarSetInteger(cvarNameMargins.c_str(), SetActivated); } } - } else { //Since the user requested to turn all margin off no need to do any check there. + } else { // Since the user requested to turn all margin off no need to do any check there. CVarSetInteger(cvarNameMargins.c_str(), SetActivated); } } @@ -511,12 +511,16 @@ void SetMarginAll(const char* ButtonName, bool SetActivated) { } void ResetPositionAll() { - if (ImGui::Button("Reset all positions")) { + if (UIWidgets::Button("Reset all positions", + UIWidgets::ButtonOptions() + .Size(ImVec2(200.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Revert every element to use their original position and no margins"))) { for (auto cvarName : MarginCvarList) { std::string cvarPosType = std::string(cvarName).append(".PosType"); std::string cvarNameMargins = std::string(cvarName).append(".UseMargins"); CVarSetInteger(cvarPosType.c_str(), 0); - CVarSetInteger(cvarNameMargins.c_str(), false); //Turn margin off to everythings as that original position. + CVarSetInteger(cvarNameMargins.c_str(), false); // Turn margin off to everythings as that original position. } } } @@ -545,7 +549,7 @@ void CosmeticsUpdateTick() { cosmeticOption.currentColor.z = newColor.b / 255.0f; cosmeticOption.currentColor.w = newColor.a / 255.0f; - CVarSetColor(cosmeticOption.cvar, newColor); + CVarSetColor(cosmeticOption.valuesCvar, newColor); } // If we don't want the rainbow color on items to be synced, offset the index for each item in the loop. // Technically this would work if you replaced "60" with 1 but the hue would be so close it's @@ -573,21 +577,21 @@ void CosmeticsUpdateTick() { void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& magicFaroresPrimary = cosmeticOptions.at("Magic.FaroresPrimary"); if (manualChange || CVarGetInteger(magicFaroresPrimary.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(magicFaroresPrimary.cvar, magicFaroresPrimary.defaultColor); + Color_RGBA8 color = CVarGetColor(magicFaroresPrimary.valuesCvar, magicFaroresPrimary.defaultColor); PATCH_GFX(sInnerCylinderDL, "Magic_FaroresPrimary1", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(sOuterCylinderDL, "Magic_FaroresPrimary2", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& magicFaroresSecondary = cosmeticOptions.at("Magic.FaroresSecondary"); if (manualChange || CVarGetInteger(magicFaroresSecondary.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(magicFaroresSecondary.cvar, magicFaroresSecondary.defaultColor); + Color_RGBA8 color = CVarGetColor(magicFaroresSecondary.valuesCvar, magicFaroresSecondary.defaultColor); PATCH_GFX(sInnerCylinderDL, "Magic_FaroresSecondary1", magicFaroresSecondary.changedCvar, 25, gsDPSetEnvColor(color.r, color.g, color.b, 255)); PATCH_GFX(sOuterCylinderDL, "Magic_FaroresSecondary2", magicFaroresSecondary.changedCvar, 25, gsDPSetEnvColor(color.r, color.g, color.b, 255)); } static CosmeticOption& linkGoronTunic = cosmeticOptions.at("Link.GoronTunic"); if (manualChange || CVarGetInteger(linkGoronTunic.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkGoronTunic.cvar, linkGoronTunic.defaultColor); + Color_RGBA8 color = CVarGetColor(linkGoronTunic.valuesCvar, linkGoronTunic.defaultColor); PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic1", linkGoronTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic2", linkGoronTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic3", linkGoronTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); @@ -596,7 +600,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& linkZoraTunic = cosmeticOptions.at("Link.ZoraTunic"); if (manualChange || CVarGetInteger(linkZoraTunic.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkZoraTunic.cvar, linkZoraTunic.defaultColor); + Color_RGBA8 color = CVarGetColor(linkZoraTunic.valuesCvar, linkZoraTunic.defaultColor); PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic1", linkZoraTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic2", linkZoraTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic3", linkZoraTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); @@ -605,7 +609,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& linkHair = cosmeticOptions.at("Link.Hair"); if (manualChange || CVarGetInteger(linkHair.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkHair.cvar, linkHair.defaultColor); + Color_RGBA8 color = CVarGetColor(linkHair.valuesCvar, linkHair.defaultColor); PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair1", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair2", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair3", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); @@ -627,7 +631,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& linkLinen = cosmeticOptions.at("Link.Linen"); if (manualChange || CVarGetInteger(linkLinen.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkLinen.cvar, linkLinen.defaultColor); + Color_RGBA8 color = CVarGetColor(linkLinen.valuesCvar, linkLinen.defaultColor); PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen1", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen2", linkLinen.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen3", linkLinen.changedCvar, 25, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -668,7 +672,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& linkBoots = cosmeticOptions.at("Link.Boots"); if (manualChange || CVarGetInteger(linkBoots.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(linkBoots.cvar, linkBoots.defaultColor); + Color_RGBA8 color = CVarGetColor(linkBoots.valuesCvar, linkBoots.defaultColor); PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots1", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots2", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots3", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); @@ -704,7 +708,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& mirrorShieldBody = cosmeticOptions.at("MirrorShield.Body"); if (manualChange || CVarGetInteger(mirrorShieldBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(mirrorShieldBody.cvar, mirrorShieldBody.defaultColor); + Color_RGBA8 color = CVarGetColor(mirrorShieldBody.valuesCvar, mirrorShieldBody.defaultColor); PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body1", mirrorShieldBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body2", mirrorShieldBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Body3", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -716,7 +720,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& mirrorShieldMirror = cosmeticOptions.at("MirrorShield.Mirror"); if (manualChange || CVarGetInteger(mirrorShieldMirror.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(mirrorShieldMirror.cvar, mirrorShieldMirror.defaultColor); + Color_RGBA8 color = CVarGetColor(mirrorShieldMirror.valuesCvar, mirrorShieldMirror.defaultColor); PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror1", mirrorShieldMirror.changedCvar, 47, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror2", mirrorShieldMirror.changedCvar, 48, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Mirror3", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -728,7 +732,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& mirrorShieldEmblem = cosmeticOptions.at("MirrorShield.Emblem"); if (manualChange || CVarGetInteger(mirrorShieldEmblem.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(mirrorShieldEmblem.cvar, mirrorShieldEmblem.defaultColor); + Color_RGBA8 color = CVarGetColor(mirrorShieldEmblem.valuesCvar, mirrorShieldEmblem.defaultColor); PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem1", mirrorShieldEmblem.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 140)); PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem2", mirrorShieldEmblem.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Emblem3", mirrorShieldEmblem.changedCvar, 165, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -741,7 +745,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& swordsKokiriBlade = cosmeticOptions.at("Swords.KokiriBlade"); if (manualChange || CVarGetInteger(swordsKokiriBlade.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsKokiriBlade.cvar, swordsKokiriBlade.defaultColor); + Color_RGBA8 color = CVarGetColor(swordsKokiriBlade.valuesCvar, swordsKokiriBlade.defaultColor); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriBlade1", swordsKokiriBlade.changedCvar, 79, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriBlade2", swordsKokiriBlade.changedCvar, 75, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade3", swordsKokiriBlade.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -750,7 +754,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { /* static CosmeticOption& swordsKokiriHilt = cosmeticOptions.at("Swords.KokiriHilt"); if (manualChange || CVarGetInteger(swordsKokiriHilt.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsKokiriHilt.cvar, swordsKokiriHilt.defaultColor); + Color_RGBA8 color = CVarGetColor(swordsKokiriHilt.valuesCvar, swordsKokiriHilt.defaultColor); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt1", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt2", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt3", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); @@ -791,7 +795,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { */ static CosmeticOption& swordsMasterBlade = cosmeticOptions.at("Swords.MasterBlade"); if (manualChange || CVarGetInteger(swordsMasterBlade.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsMasterBlade.cvar, swordsMasterBlade.defaultColor); + Color_RGBA8 color = CVarGetColor(swordsMasterBlade.valuesCvar, swordsMasterBlade.defaultColor); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterBlade1", swordsMasterBlade.changedCvar, 60, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterBlade2", swordsMasterBlade.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade3", swordsMasterBlade.changedCvar, 13, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -802,7 +806,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { /* static CosmeticOption& swordsMasterHilt = cosmeticOptions.at("Swords.MasterHilt"); if (manualChange || CVarGetInteger(swordsMasterHilt.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsMasterHilt.cvar, swordsMasterHilt.defaultColor); + Color_RGBA8 color = CVarGetColor(swordsMasterHilt.valuesCvar, swordsMasterHilt.defaultColor); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt1", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt2", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt3", swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); @@ -849,7 +853,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { */ static CosmeticOption& swordsBiggoronBlade = cosmeticOptions.at("Swords.BiggoronBlade"); if (manualChange || CVarGetInteger(swordsBiggoronBlade.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsBiggoronBlade.cvar, swordsBiggoronBlade.defaultColor); + Color_RGBA8 color = CVarGetColor(swordsBiggoronBlade.valuesCvar, swordsBiggoronBlade.defaultColor); PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronBlade1", swordsBiggoronBlade.changedCvar, 108, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronBlade2", swordsBiggoronBlade.changedCvar, 63, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade3", swordsBiggoronBlade.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -858,7 +862,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { /* static CosmeticOption& swordsBiggoronHilt = cosmeticOptions.at("Swords.BiggoronHilt"); if (manualChange || CVarGetInteger(swordsBiggoronHilt.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(swordsBiggoronHilt.cvar, swordsBiggoronHilt.defaultColor); + Color_RGBA8 color = CVarGetColor(swordsBiggoronHilt.valuesCvar, swordsBiggoronHilt.defaultColor); PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt1", swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt2", swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt3", swordsBiggoronHilt.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -877,7 +881,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { */ static CosmeticOption& glovesGoronBracelet = cosmeticOptions.at("Gloves.GoronBracelet"); if (manualChange || CVarGetInteger(glovesGoronBracelet.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesGoronBracelet.cvar, glovesGoronBracelet.defaultColor); + Color_RGBA8 color = CVarGetColor(glovesGoronBracelet.valuesCvar, glovesGoronBracelet.defaultColor); PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet1", glovesGoronBracelet.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet2", glovesGoronBracelet.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet3", glovesGoronBracelet.changedCvar, 3, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); @@ -889,19 +893,19 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& glovesSilverGauntlets = cosmeticOptions.at("Gloves.SilverGauntlets"); if (manualChange || CVarGetInteger(glovesSilverGauntlets.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesSilverGauntlets.cvar, glovesSilverGauntlets.defaultColor); + Color_RGBA8 color = CVarGetColor(glovesSilverGauntlets.valuesCvar, glovesSilverGauntlets.defaultColor); PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets1", glovesSilverGauntlets.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets2", glovesSilverGauntlets.changedCvar, 4, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } static CosmeticOption& glovesGoldenGauntlets = cosmeticOptions.at("Gloves.GoldenGauntlets"); if (manualChange || CVarGetInteger(glovesGoldenGauntlets.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesGoldenGauntlets.cvar, glovesGoldenGauntlets.defaultColor); + Color_RGBA8 color = CVarGetColor(glovesGoldenGauntlets.valuesCvar, glovesGoldenGauntlets.defaultColor); PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets1", glovesGoldenGauntlets.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets2", glovesGoldenGauntlets.changedCvar, 4, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } static CosmeticOption& glovesGauntletsGem = cosmeticOptions.at("Gloves.GauntletsGem"); if (manualChange || CVarGetInteger(glovesGauntletsGem.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(glovesGauntletsGem.cvar, glovesGauntletsGem.defaultColor); + Color_RGBA8 color = CVarGetColor(glovesGauntletsGem.valuesCvar, glovesGauntletsGem.defaultColor); PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem1", glovesGauntletsGem.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem2", glovesGauntletsGem.changedCvar, 85, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultLeftGauntletPlate2DL, "Gloves_GauntletsGem3", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -912,7 +916,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& equipmentBoomerangBody = cosmeticOptions.at("Equipment.BoomerangBody"); if (manualChange || CVarGetInteger(equipmentBoomerangBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBoomerangBody.cvar, equipmentBoomerangBody.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBoomerangBody.valuesCvar, equipmentBoomerangBody.defaultColor); PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody1", equipmentBoomerangBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody2", equipmentBoomerangBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangBody3", equipmentBoomerangBody.changedCvar, 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -921,7 +925,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& equipmentBoomerangGem = cosmeticOptions.at("Equipment.BoomerangGem"); if (manualChange || CVarGetInteger(equipmentBoomerangGem.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBoomerangGem.cvar, equipmentBoomerangGem.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBoomerangGem.valuesCvar, equipmentBoomerangGem.defaultColor); PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem1", equipmentBoomerangGem.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem2", equipmentBoomerangGem.changedCvar, 85, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangGem3", equipmentBoomerangGem.changedCvar, 16, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -932,7 +936,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { /* static CosmeticOption& equipmentSlingshotBody = cosmeticOptions.at("Equipment.SlingshotBody"); if (manualChange || CVarGetInteger(equipmentSlingshotBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentSlingshotBody.cvar, equipmentSlingshotBody.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentSlingshotBody.valuesCvar, equipmentSlingshotBody.defaultColor); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody1", equipmentSlingshotBody.changedCvar, 10, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), MAX(color.b - 100, 0), 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody2", equipmentSlingshotBody.changedCvar, 12, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, MAX(color.b - 100, 0) / 3, 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody3", equipmentSlingshotBody.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -956,7 +960,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { */ static CosmeticOption& equipmentSlingshotString = cosmeticOptions.at("Equipment.SlingshotString"); if (manualChange || CVarGetInteger(equipmentSlingshotString.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentSlingshotString.cvar, equipmentSlingshotString.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentSlingshotString.valuesCvar, equipmentSlingshotString.defaultColor); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString1",equipmentSlingshotString.changedCvar, 75, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString2",equipmentSlingshotString.changedCvar, 76, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); PATCH_GFX(gLinkChildSlingshotStringDL, "Equipment_SlingshotString3",equipmentSlingshotString.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -964,7 +968,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& equipmentBowTips = cosmeticOptions.at("Equipment.BowTips"); if (manualChange || CVarGetInteger(equipmentBowTips.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowTips.cvar, equipmentBowTips.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBowTips.valuesCvar, equipmentBowTips.defaultColor); PATCH_GFX(gGiBowDL, "Equipment_BowTips1", equipmentBowTips.changedCvar, 86, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBowDL, "Equipment_BowTips2", equipmentBowTips.changedCvar, 87, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowTips3", equipmentBowTips.changedCvar, 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -973,14 +977,14 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& equipmentBowString = cosmeticOptions.at("Equipment.BowString"); if (manualChange || CVarGetInteger(equipmentBowString.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowString.cvar, equipmentBowString.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBowString.valuesCvar, equipmentBowString.defaultColor); PATCH_GFX(gGiBowDL, "Equipment_BowString1", equipmentBowString.changedCvar, 105, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBowDL, "Equipment_BowString2", equipmentBowString.changedCvar, 106, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultBowStringDL, "Equipment_BowString3", equipmentBowString.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowBody = cosmeticOptions.at("Equipment.BowBody"); if (manualChange || CVarGetInteger(equipmentBowBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowBody.cvar, equipmentBowBody.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBowBody.valuesCvar, equipmentBowBody.defaultColor); PATCH_GFX(gGiBowDL, "Equipment_BowBody1", equipmentBowBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBowDL, "Equipment_BowBody2", equipmentBowBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowBody3", equipmentBowBody.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -989,7 +993,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& equipmentBowHandle = cosmeticOptions.at("Equipment.BowHandle"); if (manualChange || CVarGetInteger(equipmentBowHandle.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBowHandle.cvar, equipmentBowHandle.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBowHandle.valuesCvar, equipmentBowHandle.defaultColor); PATCH_GFX(gGiBowDL, "Equipment_BowHandle1", equipmentBowHandle.changedCvar, 51, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBowDL, "Equipment_BowHandle2", equipmentBowHandle.changedCvar, 52, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowHandle3", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -999,7 +1003,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& equipmentHammerHead = cosmeticOptions.at("Equipment.HammerHead"); if (manualChange || CVarGetInteger(equipmentHammerHead.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentHammerHead.cvar, equipmentHammerHead.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentHammerHead.valuesCvar, equipmentHammerHead.defaultColor); PATCH_GFX(gGiHammerDL, "Equipment_HammerHead1", equipmentHammerHead.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiHammerDL, "Equipment_HammerHead2", equipmentHammerHead.changedCvar, 6, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiHammerDL, "Equipment_HammerHead3", equipmentHammerHead.changedCvar, 68, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -1009,7 +1013,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& equipmentHammerHandle = cosmeticOptions.at("Equipment.HammerHandle"); if (manualChange || CVarGetInteger(equipmentHammerHandle.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentHammerHandle.cvar, equipmentHammerHandle.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentHammerHandle.valuesCvar, equipmentHammerHandle.defaultColor); PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle1", equipmentHammerHandle.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle2", equipmentHammerHandle.changedCvar, 85, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHandle5", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -1018,13 +1022,13 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& equipmentHookshotChain = cosmeticOptions.at("Equipment.HookshotChain"); if (manualChange || CVarGetInteger(equipmentHookshotChain.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentHookshotChain.cvar, equipmentHookshotChain.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentHookshotChain.valuesCvar, equipmentHookshotChain.defaultColor); PATCH_GFX(gLinkAdultHookshotChainDL, "Equipment_HookshotChain1", equipmentHookshotChain.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentChuFace = cosmeticOptions.at("Equipment.ChuFace"); if (manualChange || CVarGetInteger(equipmentChuFace.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentChuFace.cvar, equipmentChuFace.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentChuFace.valuesCvar, equipmentChuFace.defaultColor); PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace1", equipmentChuFace.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace2", equipmentChuFace.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gBombchuDL, "Equipment_ChuFace3", equipmentChuFace.changedCvar, 2, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); @@ -1036,7 +1040,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& equipmentChuBody = cosmeticOptions.at("Equipment.ChuBody"); if (manualChange || CVarGetInteger(equipmentChuBody.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentChuBody.cvar, equipmentChuBody.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentChuBody.valuesCvar, equipmentChuBody.defaultColor); PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody1", equipmentChuBody.changedCvar, 39, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody2", equipmentChuBody.changedCvar, 40, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody3", equipmentChuBody.changedCvar, 60, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -1046,7 +1050,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& equipmentBunnyHood = cosmeticOptions.at("Equipment.BunnyHood"); if (manualChange || CVarGetInteger(equipmentBunnyHood.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(equipmentBunnyHood.cvar, equipmentBunnyHood.defaultColor); + Color_RGBA8 color = CVarGetColor(equipmentBunnyHood.valuesCvar, equipmentBunnyHood.defaultColor); PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood1", equipmentBunnyHood.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood2", equipmentBunnyHood.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood3", equipmentBunnyHood.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -1065,7 +1069,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& consumableGreenRupee = cosmeticOptions.at("Consumable.GreenRupee"); if (manualChange || CVarGetInteger(consumableGreenRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableGreenRupee.cvar, consumableGreenRupee.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableGreenRupee.valuesCvar, consumableGreenRupee.defaultColor); PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee1", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee2", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee3", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); @@ -1084,7 +1088,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& consumableBlueRupee = cosmeticOptions.at("Consumable.BlueRupee"); if (manualChange || CVarGetInteger(consumableBlueRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableBlueRupee.cvar, consumableBlueRupee.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableBlueRupee.valuesCvar, consumableBlueRupee.defaultColor); PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee1", consumableBlueRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee2", consumableBlueRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee3", consumableBlueRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); @@ -1092,7 +1096,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& consumableRedRupee = cosmeticOptions.at("Consumable.RedRupee"); if (manualChange || CVarGetInteger(consumableRedRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableRedRupee.cvar, consumableRedRupee.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableRedRupee.valuesCvar, consumableRedRupee.defaultColor); PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee1", consumableRedRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee2", consumableRedRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee3", consumableRedRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); @@ -1100,7 +1104,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& consumablePurpleRupee = cosmeticOptions.at("Consumable.PurpleRupee"); if (manualChange || CVarGetInteger(consumablePurpleRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumablePurpleRupee.cvar, consumablePurpleRupee.defaultColor); + Color_RGBA8 color = CVarGetColor(consumablePurpleRupee.valuesCvar, consumablePurpleRupee.defaultColor); PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee1", consumablePurpleRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee2", consumablePurpleRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee3", consumablePurpleRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); @@ -1108,7 +1112,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& consumableGoldRupee = cosmeticOptions.at("Consumable.GoldRupee"); if (manualChange || CVarGetInteger(consumableGoldRupee.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableGoldRupee.cvar, consumableGoldRupee.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableGoldRupee.valuesCvar, consumableGoldRupee.defaultColor); PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee1", consumableGoldRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee2", consumableGoldRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee3", consumableGoldRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); @@ -1117,7 +1121,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& consumableHearts = cosmeticOptions.at("Consumable.Hearts"); if (manualChange || CVarGetInteger(consumableHearts.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableHearts.cvar, consumableHearts.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableHearts.valuesCvar, consumableHearts.defaultColor); /* PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts1", consumableHearts.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts2", consumableHearts.changedCvar, 26, gsSPGrayscale(true)); @@ -1133,7 +1137,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } static CosmeticOption& consumableMagic = cosmeticOptions.at("Consumable.Magic"); if (manualChange || CVarGetInteger(consumableMagic.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(consumableMagic.cvar, consumableMagic.defaultColor); + Color_RGBA8 color = CVarGetColor(consumableMagic.valuesCvar, consumableMagic.defaultColor); PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic1", consumableMagic.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic2", consumableMagic.changedCvar, 32, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic3", consumableMagic.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -1144,7 +1148,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& npcGoldenSkulltula = cosmeticOptions.at("NPC.GoldenSkulltula"); if (manualChange || CVarGetInteger(npcGoldenSkulltula.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(npcGoldenSkulltula.cvar, npcGoldenSkulltula.defaultColor); + Color_RGBA8 color = CVarGetColor(npcGoldenSkulltula.valuesCvar, npcGoldenSkulltula.defaultColor); PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula1", npcGoldenSkulltula.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula2", npcGoldenSkulltula.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula3", npcGoldenSkulltula.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); @@ -1159,7 +1163,7 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& npcGerudo = cosmeticOptions.at("NPC.Gerudo"); if (manualChange || CVarGetInteger(npcGerudo.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(npcGerudo.cvar, npcGerudo.defaultColor); + Color_RGBA8 color = CVarGetColor(npcGerudo.valuesCvar, npcGerudo.defaultColor); PATCH_GFX(gGerudoPurpleTorsoDL, "NPC_Gerudo1", npcGerudo.changedCvar, 139, gsDPSetEnvColor( color.r, color.g, color.b, 255)); PATCH_GFX(gGerudoPurpleRightThighDL, "NPC_Gerudo2", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); PATCH_GFX(gGerudoPurpleLeftThighDL, "NPC_Gerudo3", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); @@ -1172,39 +1176,39 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& npcMetalTrap = cosmeticOptions.at("NPC.MetalTrap"); if (manualChange || CVarGetInteger(npcMetalTrap.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(npcMetalTrap.cvar, npcMetalTrap.defaultColor); + Color_RGBA8 color = CVarGetColor(npcMetalTrap.valuesCvar, npcMetalTrap.defaultColor); PATCH_GFX(gSlidingBladeTrapDL, "NPC_MetalTrap1", npcMetalTrap.changedCvar, 59, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& n64LogoRed = cosmeticOptions.at("Title.N64LogoRed"); if (manualChange || CVarGetInteger(n64LogoRed.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoRed.cvar, n64LogoRed.defaultColor); + Color_RGBA8 color = CVarGetColor(n64LogoRed.valuesCvar, n64LogoRed.defaultColor); PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed1", n64LogoRed.changedCvar, 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed2", n64LogoRed.changedCvar, 18, gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoBlue = cosmeticOptions.at("Title.N64LogoBlue"); if (manualChange || CVarGetInteger(n64LogoBlue.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoBlue.cvar, n64LogoBlue.defaultColor); + Color_RGBA8 color = CVarGetColor(n64LogoBlue.valuesCvar, n64LogoBlue.defaultColor); PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue1", n64LogoBlue.changedCvar, 29, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue2", n64LogoBlue.changedCvar, 30, gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoGreen = cosmeticOptions.at("Title.N64LogoGreen"); if (manualChange || CVarGetInteger(n64LogoGreen.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoGreen.cvar, n64LogoGreen.defaultColor); + Color_RGBA8 color = CVarGetColor(n64LogoGreen.valuesCvar, n64LogoGreen.defaultColor); PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen1", n64LogoGreen.changedCvar, 56, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen2", n64LogoGreen.changedCvar, 57, gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoYellow = cosmeticOptions.at("Title.N64LogoYellow"); if (manualChange || CVarGetInteger(n64LogoYellow.rainbowCvar, 0)) { - Color_RGBA8 color = CVarGetColor(n64LogoYellow.cvar, n64LogoYellow.defaultColor); + Color_RGBA8 color = CVarGetColor(n64LogoYellow.valuesCvar, n64LogoYellow.defaultColor); PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow1", n64LogoYellow.changedCvar, 81, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow2", n64LogoYellow.changedCvar, 82, gsDPSetEnvColor(color.r, color.g, color.b, 128)); } if (gPlayState != nullptr) { - if (CVarGetInteger(CVAR_COSMETIC("Link.BodyScale.Changed"), 0)) { + if (CVarGetInteger(CVAR_COSMETIC("Link.BodySize.Changed"), 0)) { static Player* player = GET_PLAYER(gPlayState); - float scale = CVarGetFloat(CVAR_COSMETIC("Link.BodyScale.Value"), 0.01f); + float scale = CVarGetFloat(CVAR_COSMETIC("Link.BodySize.Value"), 0.01f); player->actor.scale.x = scale; player->actor.scale.y = scale; player->actor.scale.z = scale; @@ -1235,24 +1239,36 @@ void Table_InitHeader(bool has_header = true) { void DrawUseMarginsSlider(const std::string ElementName, const std::string CvarName){ std::string CvarLabel = CvarName + ".UseMargins"; std::string Label = ElementName + " use margins"; - UIWidgets::EnhancementCheckbox(Label.c_str(), CvarLabel.c_str()); - UIWidgets::Tooltip("Using this allow you move the element with General margins sliders"); + UIWidgets::CVarCheckbox(Label.c_str(), CvarLabel.c_str(), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Using this allow you move the element with General margins sliders")); } -void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = true){ +void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = true) { std::string CvarLabel = CvarName + ".PosType"; - UIWidgets::EnhancementRadioButton("Original position", CvarLabel.c_str(), 0); - UIWidgets::Tooltip("This will use original intended elements position"); - UIWidgets::EnhancementRadioButton("Anchor to the left", CvarLabel.c_str(), 1); - UIWidgets::Tooltip("This will make your elements follow the left side of your game window"); - UIWidgets::EnhancementRadioButton("Anchor to the right", CvarLabel.c_str(), 2); - UIWidgets::Tooltip("This will make your elements follow the right side of your game window"); + UIWidgets::CVarRadioButton("Original position", CvarLabel.c_str(), 0, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will use original intended elements position")); + UIWidgets::CVarRadioButton("Anchor to the left", CvarLabel.c_str(), 1, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the left side of your game window")); + UIWidgets::CVarRadioButton("Anchor to the right", CvarLabel.c_str(), 2, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the right side of your game window")); if (NoAnchorEnabled) { - UIWidgets::EnhancementRadioButton("No anchors", CvarLabel.c_str(), 3); - UIWidgets::Tooltip("This will make your elements to not follow any side\nBetter used for center elements"); + UIWidgets::CVarRadioButton( + "No anchors", CvarLabel.c_str(), 3, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements to not follow any side\nBetter used for center elements")); } - UIWidgets::EnhancementRadioButton("Hidden", CvarLabel.c_str(), 4); - UIWidgets::Tooltip("This will make your elements hidden"); + UIWidgets::CVarRadioButton( + "Hidden", CvarLabel.c_str(), 4, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("This will make your elements hidden")); } void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX, int MaxX){ @@ -1260,10 +1276,22 @@ void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX std::string PosYCvar = CvarName + ".PosY"; std::string InvisibleLabelX = "##" + PosXCvar; std::string InvisibleLabelY = "##" + PosYCvar; - UIWidgets::EnhancementSliderInt("Up <-> Down : %d", InvisibleLabelY.c_str(), PosYCvar.c_str(), MinY, MaxY, "", 0); - UIWidgets::Tooltip("This slider is used to move Up and Down your elements."); - UIWidgets::EnhancementSliderInt("Left <-> Right : %d", InvisibleLabelX.c_str(), PosXCvar.c_str(), MinX, MaxX, "", 0); - UIWidgets::Tooltip("This slider is used to move Left and Right your elements."); + UIWidgets::CVarSliderInt("Up <-> Down : %d", PosYCvar.c_str(), + UIWidgets::IntSliderOptions() + .Min(MinY) + .Max(MaxY) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This slider is used to move Up and Down your elements.")); + UIWidgets::CVarSliderInt("Left <-> Right : %d", PosXCvar.c_str(), + UIWidgets::IntSliderOptions() + .Min(MinX) + .Max(MaxX) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This slider is used to move Left and Right your elements.")); } void DrawScaleSlider(const std::string CvarName, float DefaultValue){ @@ -1274,6 +1302,7 @@ void DrawScaleSlider(const std::string CvarName, float DefaultValue){ } void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, const char* Slider_Title, const char* Slider_ID, int MinY, int MaxY, int MinX, int MaxX, float Default_Value) { + UIWidgets::PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader(Header_Title)) { if (ImGui::BeginTable(Table_ID, 1, FlagsTable)) { ImGui::TableSetupColumn(Column_Title, FlagsCell, TablesCellsWidth); @@ -1282,13 +1311,14 @@ void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const c DrawPositionsRadioBoxes(Slider_ID); DrawPositionSlider(Slider_ID, MinY, MaxY, MinX, MaxX); DrawScaleSlider(Slider_ID, Default_Value); - ImGui::NewLine(); ImGui::EndTable(); } } + UIWidgets::PopStyleHeader(); } void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, const char* Slider_Title, const char* Slider_ID, const char* Int_Type, float Slider_Scale_Value) { + UIWidgets::PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader(Header_Title)) { if (ImGui::BeginTable(Table_ID, 1, FlagsTable)) { ImGui::TableSetupColumn(Column_Title, FlagsCell, TablesCellsWidth); @@ -1306,7 +1336,6 @@ void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const cha } DrawPositionSlider(Slider_ID, 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_CU, Max_X_CU); DrawScaleSlider(Slider_ID, Slider_Scale_Value); - ImGui::NewLine(); ImGui::EndTable(); } std::shared_ptr controller = Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0); @@ -1323,27 +1352,48 @@ void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const cha controller->GetButton(BTN_CUSTOM_OCARINA_NOTE_D5)->AddButtonMapping(mapping); } } + UIWidgets::PopStyleHeader(); } void Draw_Placements(){ - if (ImGui::BeginTable("tableMargins", 1, FlagsTable)) { - ImGui::TableSetupColumn("General margins settings", FlagsCell, TablesCellsWidth); - Table_InitHeader(); - UIWidgets::EnhancementSliderInt("Top : %dx", "##UIMARGINT", CVAR_COSMETIC("HUD.Margin.T"), static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1, 25, "", 0); - UIWidgets::EnhancementSliderInt("Left: %dx", "##UIMARGINL", CVAR_COSMETIC("HUD.Margin.L"), -25, static_cast(ImGui::GetWindowViewport()->Size.x), "", 0); - UIWidgets::EnhancementSliderInt("Right: %dx", "##UIMARGINR", CVAR_COSMETIC("HUD.Margin.R"), static_cast(ImGui::GetWindowViewport()->Size.x) * -1, 25, "", 0); - UIWidgets::EnhancementSliderInt("Bottom: %dx", "##UIMARGINB", CVAR_COSMETIC("HUD.Margin.B"), static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1, 25, "", 0); - SetMarginAll("All margins on",true); - UIWidgets::Tooltip("Set most of the elements to use margins\nSome elements with default position will not be affected\nElements without Anchor or Hidden will not be turned on"); - ImGui::SameLine(); - SetMarginAll("All margins off",false); - UIWidgets::Tooltip("Set all of the elements to not use margins"); - ImGui::SameLine(); - ResetPositionAll(); - UIWidgets::Tooltip("Revert every element to use their original position and no margins"); - ImGui::NewLine(); - ImGui::EndTable(); - } + UIWidgets::PushStyleHeader(THEME_COLOR); + ImGui::SeparatorText("General Margins Settings"); + UIWidgets::CVarSliderInt("Top: %dpx", CVAR_COSMETIC("HUD.Margin.T"), + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderInt("Left: %dpx", CVAR_COSMETIC("HUD.Margin.L"), + UIWidgets::IntSliderOptions() + .Min(-25) + .Max(static_cast(ImGui::GetWindowViewport()->Size.x)) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderInt("Right: %dpx", CVAR_COSMETIC("HUD.Margin.R"), + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.x) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderInt("Bottom: %dpx", CVAR_COSMETIC("HUD.Margin.B"), + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + SetMarginAll("All margins on", true, + "Set most of the elements to use margins\nSome elements with default position will not be " + "affected\nElements without Anchor or Hidden will not be turned on"); + ImGui::SameLine(); + SetMarginAll("All margins off", false, "Set all of the elements to not use margins"); + ImGui::SameLine(); + ResetPositionAll(); + UIWidgets::Separator(true, true, 2.0f, 2.0f); if (ImGui::CollapsingHeader("Hearts count position")) { if (ImGui::BeginTable("tableHeartsCounts", 1, FlagsTable)) { ImGui::TableSetupColumn("Hearts counts settings", FlagsCell, TablesCellsWidth); @@ -1352,9 +1402,14 @@ void Draw_Placements(){ DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.HeartsCount")); DrawPositionSlider(CVAR_COSMETIC("HUD.HeartsCount"), -22, static_cast(ImGui::GetWindowViewport()->Size.y), -125, static_cast(ImGui::GetWindowViewport()->Size.x)); DrawScaleSlider(CVAR_COSMETIC("HUD.HeartsCount"), 0.7f); - UIWidgets::EnhancementSliderInt("Heart line length : %d", "##HeartLineLength", CVAR_COSMETIC("HUD.Hearts.LineLength"), 0, 20, "", 10); - UIWidgets::Tooltip("This will set the length of a row of hearts. Set to 0 for unlimited length."); - ImGui::NewLine(); + UIWidgets::CVarSliderInt("Heart line length : %d", CVAR_COSMETIC("HUD.Hearts.LineLength"), + UIWidgets::IntSliderOptions() + .Min(0) + .Max(20) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This will set the length of a row of hearts. Set to 0 for unlimited length.")); ImGui::EndTable(); } } @@ -1364,11 +1419,13 @@ void Draw_Placements(){ Table_InitHeader(false); DrawUseMarginsSlider("Magic meter", CVAR_COSMETIC("HUD.MagicBar")); DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.MagicBar")); - UIWidgets::EnhancementRadioButton("Anchor to life bar", CVAR_COSMETIC("HUD.MagicBar.PosType"), 5); - UIWidgets::Tooltip("This will make your elements follow the bottom of the life meter"); + UIWidgets::CVarRadioButton( + "Anchor to life bar", CVAR_COSMETIC("HUD.MagicBar.PosType"), 5, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the bottom of the life meter")); DrawPositionSlider(CVAR_COSMETIC("HUD.MagicBar"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -5, static_cast(ImGui::GetWindowViewport()->Size.x / 2)); DrawScaleSlider(CVAR_COSMETIC("HUD.MagicBar"), 1.0f); - ImGui::NewLine(); ImGui::EndTable(); } } @@ -1387,7 +1444,6 @@ void Draw_Placements(){ } DrawPositionSlider(CVAR_COSMETIC("HUD.VisualSoA"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_VSOA, Max_X_VSOA); DrawScaleSlider(CVAR_COSMETIC("HUD.VisualSoA"), 1.0f); - ImGui::NewLine(); ImGui::EndTable(); } } @@ -1413,7 +1469,6 @@ void Draw_Placements(){ } DrawPositionSlider(CVAR_COSMETIC("HUD.Dpad"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_Dpad, Max_X_Dpad); DrawScaleSlider(CVAR_COSMETIC("HUD.Dpad"), 1.0f); - ImGui::NewLine(); ImGui::EndTable(); } } @@ -1440,66 +1495,94 @@ void Draw_Placements(){ ImGui::TableSetupColumn("Enemy Health Bar settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); std::string posTypeCVar = CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"); - UIWidgets::EnhancementRadioButton("Anchor to Enemy", posTypeCVar.c_str(), ENEMYHEALTH_ANCHOR_ACTOR); - UIWidgets::Tooltip("This will use enemy on screen position"); - UIWidgets::EnhancementRadioButton("Anchor to the top", posTypeCVar.c_str(), ENEMYHEALTH_ANCHOR_TOP); - UIWidgets::Tooltip("This will make your elements follow the top edge of your game window"); - UIWidgets::EnhancementRadioButton("Anchor to the bottom", posTypeCVar.c_str(), ENEMYHEALTH_ANCHOR_BOTTOM); - UIWidgets::Tooltip("This will make your elements follow the bottom edge of your game window"); + UIWidgets::CVarRadioButton("Anchor to Enemy", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), + ENEMYHEALTH_ANCHOR_ACTOR, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will use enemy on screen position")); + UIWidgets::CVarRadioButton( + "Anchor to the top", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_TOP, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the top edge of your game window")); + UIWidgets::CVarRadioButton( + "Anchor to the bottom", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_BOTTOM, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the bottom edge of your game window")); DrawPositionSlider(CVAR_COSMETIC("HUD.EnemyHealthBar."), -SCREEN_HEIGHT, SCREEN_HEIGHT, -static_cast(ImGui::GetWindowViewport()->Size.x / 2), static_cast(ImGui::GetWindowViewport()->Size.x / 2)); - if (UIWidgets::EnhancementSliderInt("Health Bar Width: %d", "##EnemyHealthBarWidth", CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value"), 32, 128, "", 64)) { + if (UIWidgets::CVarSliderInt( + "Health Bar Width: %d", CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value"), + UIWidgets::IntSliderOptions() + .Min(32) + .Max(128) + .DefaultValue(64) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This will change the width of the health bar"))) { CVarSetInteger(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed"), 1); } - UIWidgets::Tooltip("This will change the width of the health bar"); ImGui::SameLine(); - if (ImGui::Button("Reset##EnemyHealthBarWidth")) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + if (UIWidgets::Button("Reset##EnemyHealthBarWidth", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value")); CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::NewLine(); ImGui::EndTable(); } } + UIWidgets::PopStyleHeader(); } void Reset_Option_Single(const char* Button_Title, const char* name) { ImGui::SameLine(); - if (ImGui::Button(Button_Title)) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + if (UIWidgets::Button(Button_Title, + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(name); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } void Reset_Option_Double(const char* Button_Title, const char* name) { ImGui::SameLine(); - if (ImGui::Button(Button_Title)) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + if (UIWidgets::Button(Button_Title, + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear((std::string(name) + ".Value").c_str()); CVarClear((std::string(name) + ".Changed").c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } void DrawSillyTab() { ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(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::CVarCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .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); + UIWidgets::Separator(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); + if (UIWidgets::CVarSliderFloat("Link Body Size", CVAR_COSMETIC("Link.BodySize.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.3f") + .Min(0.001f) + .Max(0.05f) + .DefaultValue(0.01f) + .Step(0.001f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { + CVarSetInteger(CVAR_COSMETIC("Link.BodySize.Changed"), 1); } ImGui::SameLine(); - if (ImGui::Button("Reset##Link_BodyScale")) { - CVarClear(CVAR_COSMETIC("Link.BodyScale.Value")); - CVarClear(CVAR_COSMETIC("Link.BodyScale.Changed")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + if (UIWidgets::Button("Reset##Link_BodySize", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + CVarClear(CVAR_COSMETIC("Link.BodySize.Value")); + CVarClear(CVAR_COSMETIC("Link.BodySize.Changed")); if (gPlayState != nullptr) { static Player* player = GET_PLAYER(gPlayState); player->actor.scale.x = 0.01f; @@ -1508,62 +1591,135 @@ void DrawSillyTab() { } } - 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)) { + UIWidgets::Separator(true, true, 2.0f, 2.0f); + if (UIWidgets::CVarSliderFloat("Link Head Scale", CVAR_COSMETIC("Link.HeadScale.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { 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); + UIWidgets::Separator(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)) { + if (UIWidgets::CVarSliderFloat("Link Sword Scale", CVAR_COSMETIC("Link.SwordScale.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { 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::Separator(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); + UIWidgets::CVarSliderFloat("Bunny Hood Length", CVAR_COSMETIC("BunnyHood.EarLength"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(-300.0f) + .Max(1000.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##BunnyHood_EarLength", CVAR_COSMETIC("BunnyHood.EarLength")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(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); + UIWidgets::CVarSliderFloat("Bunny Hood Spread", CVAR_COSMETIC("BunnyHood.EarSpread"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(-300.0f) + .Max(500.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##BunnyHood_EarSpread", CVAR_COSMETIC("BunnyHood.EarSpread")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(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); + UIWidgets::CVarSliderFloat("Goron Neck Length", CVAR_COSMETIC("Goron.NeckLength"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(0.0f) + .Max(5000.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Goron_NeckLength", CVAR_COSMETIC("Goron.NeckLength")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementCheckbox("Unfix Goron Spin", CVAR_COSMETIC("UnfixGoronSpin")); + UIWidgets::CVarCheckbox("Unfix Goron Spin", CVAR_COSMETIC("UnfixGoronSpin"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR)); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Fairies Size: %f", "##Fairies_Size", CVAR_COSMETIC("Fairies.Size"), 0.25f, 5.0f, "", 1.0f, false); + UIWidgets::CVarSliderFloat("Fairies Size", CVAR_COSMETIC("Fairies.Size"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Fairies_Size", CVAR_COSMETIC("Fairies.Size")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(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); + UIWidgets::CVarSliderFloat("N64 Logo Spin Speed", CVAR_COSMETIC("N64Logo.SpinSpeed"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##N64Logo_SpinSpeed", CVAR_COSMETIC("N64Logo.SpinSpeed")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - UIWidgets::EnhancementSliderFloat("Moon Size: %f", "##Moon_Size", CVAR_COSMETIC("Moon.Size"), 0.5f, 2.0f, "", 1.0f, false); + UIWidgets::CVarSliderFloat("Moon Size", CVAR_COSMETIC("Moon.Size"), + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Moon_Size", CVAR_COSMETIC("Moon.Size")); - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(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)) { + if (UIWidgets::CVarSliderFloat("Kak Windmill Speed", CVAR_COSMETIC("Kak.Windmill_Speed.Value"), + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(100.0f) + .Max(6000.0f) + .DefaultValue(100.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { 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); + UIWidgets::Separator(true, true, 2.0f, 2.0f); ImGui::EndDisabled(); } @@ -1582,7 +1738,7 @@ void CopyMultipliedColor(CosmeticOption& cosmeticOptionSrc, CosmeticOption& cosm cosmeticOptionTarget.currentColor.z = newColor.b / 255.0f; cosmeticOptionTarget.currentColor.w = newColor.a / 255.0f; - CVarSetColor(cosmeticOptionTarget.cvar, newColor); + CVarSetColor(cosmeticOptionTarget.valuesCvar, newColor); CVarSetInteger((cosmeticOptionTarget.rainbowCvar), 0); CVarSetInteger((cosmeticOptionTarget.changedCvar), 1); } @@ -1642,7 +1798,7 @@ void RandomizeColor(CosmeticOption& cosmeticOption) { cosmeticOption.currentColor.z = newColor.b / 255.0f; cosmeticOption.currentColor.w = newColor.a / 255.0f; - CVarSetColor(cosmeticOption.cvar, newColor); + CVarSetColor(cosmeticOption.valuesCvar, newColor); CVarSetInteger(cosmeticOption.rainbowCvar, 0); CVarSetInteger(cosmeticOption.changedCvar, 1); ApplySideEffects(cosmeticOption); @@ -1658,12 +1814,12 @@ void ResetColor(CosmeticOption& cosmeticOption) { CVarClear(cosmeticOption.changedCvar); CVarClear(cosmeticOption.rainbowCvar); CVarClear(cosmeticOption.lockedCvar); - CVarClear(cosmeticOption.cvar); - CVarClear((std::string(cosmeticOption.cvar) + ".R").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".G").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".B").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".A").c_str()); - CVarClear((std::string(cosmeticOption.cvar) + ".Type").c_str()); + CVarClear(cosmeticOption.valuesCvar); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".R").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".G").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".B").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".A").c_str()); + CVarClear((std::string(cosmeticOption.valuesCvar) + ".Type").c_str()); // This portion should match 1:1 the multiplied colors in `ApplySideEffect()` if (cosmeticOption.label == "Bow Body") { @@ -1709,40 +1865,28 @@ void ResetColor(CosmeticOption& cosmeticOption) { } void DrawCosmeticRow(CosmeticOption& cosmeticOption) { - bool colorChanged; - if (cosmeticOption.supportsAlpha) { - colorChanged = ImGui::ColorEdit4(cosmeticOption.label.c_str(), (float*)&cosmeticOption.currentColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); - } else { - colorChanged = ImGui::ColorEdit3(cosmeticOption.label.c_str(), (float*)&cosmeticOption.currentColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); - } - if (colorChanged) { - Color_RGBA8 color; - color.r = static_cast(cosmeticOption.currentColor.x * 255.0f); - color.g = static_cast(cosmeticOption.currentColor.y * 255.0f); - color.b = static_cast(cosmeticOption.currentColor.z * 255.0f); - color.a = static_cast(cosmeticOption.currentColor.w * 255.0f); - - CVarSetColor(cosmeticOption.cvar, color); + if (UIWidgets::CVarColorPicker(cosmeticOption.label.c_str(), cosmeticOption.cvar, + cosmeticOption.defaultColor, + cosmeticOption.supportsAlpha, 0, THEME_COLOR)) { CVarSetInteger((cosmeticOption.rainbowCvar), 0); CVarSetInteger((cosmeticOption.changedCvar), 1); ApplySideEffects(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::SameLine(); - ImGui::Text("%s", cosmeticOption.label.c_str()); //the longest option name - ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow) Color").x * 1.0f) + 60.0f); - if (ImGui::Button(("Random##" + cosmeticOption.label).c_str())) { + ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow)").x * 1.0f) + 60.0f); + if (UIWidgets::Button( + ("Random##" + cosmeticOption.label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)).Color(THEME_COLOR))) { RandomizeColor(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } if (cosmeticOption.supportsRainbow) { ImGui::SameLine(); - bool isRainbow = (bool)CVarGetInteger((cosmeticOption.rainbowCvar), 0); - if (ImGui::Checkbox(("Rainbow##" + cosmeticOption.label).c_str(), &isRainbow)) { - CVarSetInteger((cosmeticOption.rainbowCvar), isRainbow); + if (UIWidgets::CVarCheckbox(("Rainbow##" + cosmeticOption.label).c_str(), cosmeticOption.rainbowCvar, + UIWidgets::CheckboxOptions().Color(THEME_COLOR))) { CVarSetInteger((cosmeticOption.changedCvar), 1); ApplySideEffects(cosmeticOption); ApplyOrResetCustomGfxPatches(); @@ -1750,14 +1894,14 @@ void DrawCosmeticRow(CosmeticOption& cosmeticOption) { } } ImGui::SameLine(); - bool isLocked = (bool)CVarGetInteger((cosmeticOption.lockedCvar), 0); - if (ImGui::Checkbox(("Locked##" + cosmeticOption.label).c_str(), &isLocked)) { - CVarSetInteger((cosmeticOption.lockedCvar), isLocked); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } + + UIWidgets::CVarCheckbox(("Locked##" + cosmeticOption.label).c_str(), cosmeticOption.lockedCvar, + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + if (CVarGetInteger((cosmeticOption.changedCvar), 0)) { ImGui::SameLine(); - if (ImGui::Button(("Reset##" + cosmeticOption.label).c_str())) { + if (UIWidgets::Button(("Reset##" + cosmeticOption.label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { ResetColor(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -1769,32 +1913,35 @@ void DrawCosmeticGroup(CosmeticGroup cosmeticGroup) { std::string label = groupLabels.at(cosmeticGroup); ImGui::Text("%s", label.c_str()); // the longest option name - ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow) Color").x * 1.0f) + 60.0f); - if (ImGui::Button(("Random##" + label).c_str())) { + ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow)").x * 1.0f) + 60.0f); + if (UIWidgets::Button(("Random##" + label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { - if (cosmeticOption.group == cosmeticGroup && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) && !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { + if (cosmeticOption.group == cosmeticGroup && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) && + !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { RandomizeColor(cosmeticOption); } } ApplyOrResetCustomGfxPatches(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button(("Reset##" + label).c_str())) { + if (UIWidgets::Button(("Reset##" + label).c_str(), + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.group == cosmeticGroup && !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { ResetColor(cosmeticOption); } } ApplyOrResetCustomGfxPatches(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + UIWidgets::Spacer(); for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.group == cosmeticGroup && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { DrawCosmeticRow(cosmeticOption); } } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); } static const char* colorSchemes[2] = { @@ -1807,193 +1954,199 @@ void CosmeticsEditorWindow::ApplyDungeonKeyColors() { ResetColor(cosmeticOptions.at("Key.KeyringRing")); // Forest Temple - CVarSetColor(cosmeticOptions["Key.ForestSmallBody"].cvar, { 4, 195, 46, 255 }); + CVarSetColor(cosmeticOptions["Key.ForestSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.ForestBossGem"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.FireSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.FireBossGem"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.WaterSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.WaterBossGem"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.SpiritSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.SpiritBossGem"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.ShadowSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.ShadowBossGem"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.GanonsSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.GanonsBossBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.GanonsBossGem"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.WellSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.GTGSmallBody"].valuesCvar, { 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 }); + CVarSetColor(cosmeticOptions["Key.FortSmallBody"].valuesCvar, { 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(); - UIWidgets::EnhancementCombobox(CVAR_COSMETIC("DefaultColorScheme"), colorSchemes, COLORSCHEME_N64); - UIWidgets::EnhancementCheckbox("Advanced Mode", CVAR_COSMETIC("AdvancedMode")); - UIWidgets::InsertHelpHoverText( - "Some cosmetic options may not apply if you have any mods that provide custom models for the cosmetic option.\n\n" - "For example, if you have custom Link model, then the Link's Hair color option will most likely not apply." - ); - + UIWidgets::CVarCombobox("Color Scheme", CVAR_COSMETIC("DefaultColorScheme"), colorSchemes, + UIWidgets::ComboboxOptions() + .DefaultIndex(COLORSCHEME_N64) + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPosition::Near) + .ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + UIWidgets::CVarCheckbox("Sync Rainbow colors", CVAR_COSMETIC("RainbowSync"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR)); + UIWidgets::CVarSliderFloat("Rainbow Speed", CVAR_COSMETIC("RainbowSpeed"), + UIWidgets::FloatSliderOptions() + .Format("%.2f") + .Min(0.01f) + .Max(1.0f) + .DefaultValue(0.6f) + .Step(0.01f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Randomize All on New Scene", CVAR_COSMETIC("RandomizeAllOnNewScene"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene.")); + UIWidgets::CVarCheckbox( + "Advanced Mode", CVAR_COSMETIC("AdvancedMode"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "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))) { + if (UIWidgets::Button("Lock All Advanced", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.advancedOption) { CVarSetInteger(cosmeticOption.lockedCvar, 1); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Unlock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { + if (UIWidgets::Button("Unlock All Advanced", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.advancedOption) { CVarSetInteger(cosmeticOption.lockedCvar, 0); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } - UIWidgets::EnhancementCheckbox("Sync Rainbow colors", CVAR_COSMETIC("RainbowSync")); - UIWidgets::EnhancementSliderFloat("Rainbow Speed: %.3f", "##rainbowSpeed", CVAR_COSMETIC("RainbowSpeed"), 0.03f, 1.0f, "", 0.6f, false, true); - UIWidgets::EnhancementCheckbox("Randomize All on New Scene", CVAR_COSMETIC("RandomizeAllOnNewScene")); - UIWidgets::Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene."); - - if (ImGui::Button("Randomize All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + if (UIWidgets::Button("Randomize All", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { CosmeticsEditor_RandomizeAll(); } ImGui::SameLine(); - if (ImGui::Button("Reset All", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { - for (auto& [id, cosmeticOption] : cosmeticOptions) { - if (!CVarGetInteger(cosmeticOption.lockedCvar, 0)) { - ResetColor(cosmeticOption); - } - } + if (UIWidgets::Button("Reset All", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + CVarClearBlock("gCosmetics"); ApplyOrResetCustomGfxPatches(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - - if (ImGui::Button("Lock All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + if (UIWidgets::Button("Lock All", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { CVarSetInteger(cosmeticOption.lockedCvar, 1); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Unlock All", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { + if (UIWidgets::Button("Unlock All", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { CVarSetInteger(cosmeticOption.lockedCvar, 0); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - if (ImGui::Button("Rainbow All", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { + if (UIWidgets::Button("Rainbow All", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { - if ( - !CVarGetInteger(cosmeticOption.lockedCvar, 0) && - ( - !cosmeticOption.advancedOption || - CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0) - ) - ) { + if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { CVarSetInteger(cosmeticOption.rainbowCvar, 1); CVarSetInteger(cosmeticOption.changedCvar, 1); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Un-Rainbow All", ImVec2(ImGui::GetContentRegionAvail().x, 30.0f))) { + if (UIWidgets::Button("Un-Rainbow All", + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { - if ( - !CVarGetInteger(cosmeticOption.lockedCvar, 0) && - ( - !cosmeticOption.advancedOption || - CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0) - ) - ) { + if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { CVarSetInteger(cosmeticOption.rainbowCvar, 0); } } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + UIWidgets::Spacer(3.0f); + + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("CosmeticsContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Link & Items")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_LINK); DrawCosmeticGroup(COSMETICS_GROUP_GLOVES); @@ -2006,14 +2159,15 @@ void CosmeticsEditorWindow::DrawElement() { if (ImGui::BeginTabItem("Keys")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (ImGui::Button("Give all keys dungeon-specific colors", ImVec2(300.0f, 30.0f))) { + if (UIWidgets::Button( + "Give all keys dungeon-specific colors", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { ApplyDungeonKeyColors(); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_KEYRING); DrawCosmeticGroup(COSMETICS_GROUP_SMALL_KEYS); @@ -2024,29 +2178,37 @@ void CosmeticsEditorWindow::DrawElement() { if (ImGui::BeginTabItem("Effects")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_MAGIC); DrawCosmeticGroup(COSMETICS_GROUP_ARROWS); DrawCosmeticGroup(COSMETICS_GROUP_SPIN_ATTACK); DrawCosmeticGroup(COSMETICS_GROUP_TRAILS); - if (UIWidgets::EnhancementSliderInt("Trails Duration: %d", "##Trails_Duration", CVAR_COSMETIC("Trails.Duration.Value"), 2, 20, "", 4)) { + if (UIWidgets::CVarSliderInt("Trails Duration: %d", CVAR_COSMETIC("Trails.Duration.Value"), + UIWidgets::IntSliderOptions() + .Min(2) + .Max(20) + .DefaultValue(4) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Trails.Duration.Changed"), 1); } ImGui::SameLine(); - if (ImGui::Button("Reset##Trails_Duration")) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + if (UIWidgets::Button("Reset##Trails_Duration", UIWidgets::ButtonOptions() + .Size(ImVec2(80, 36)) + .Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("Trails.Duration.Value")); CVarClear(CVAR_COSMETIC("Trails.Duration.Changed")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("World & NPCs")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_WORLD); DrawCosmeticGroup(COSMETICS_GROUP_NAVI); @@ -2060,7 +2222,7 @@ void CosmeticsEditorWindow::DrawElement() { } if (ImGui::BeginTabItem("HUD")) { - UIWidgets::PaddedSeparator(true, true, 2.0f, 2.0f); + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_HUD); DrawCosmeticGroup(COSMETICS_GROUP_TITLE); @@ -2074,6 +2236,7 @@ void CosmeticsEditorWindow::DrawElement() { if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { if (ImGui::BeginTabItem("Pause Menu")) { + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_KALEIDO); ImGui::EndTabItem(); } @@ -2081,12 +2244,14 @@ void CosmeticsEditorWindow::DrawElement() { if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { if (ImGui::BeginTabItem("Message")) { + UIWidgets::Separator(true, true, 2.0f, 2.0f); DrawCosmeticGroup(COSMETICS_GROUP_MESSAGE); ImGui::EndTabItem(); } } ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); } void RegisterOnLoadGameHook() { @@ -2113,7 +2278,7 @@ void CosmeticsEditorWindow::InitElement() { // Convert the `current color` into the format that the ImGui color picker expects for (auto& [id, cosmeticOption] : cosmeticOptions) { Color_RGBA8 defaultColor = {cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a}; - Color_RGBA8 cvarColor = CVarGetColor(cosmeticOption.cvar, defaultColor); + Color_RGBA8 cvarColor = CVarGetColor(cosmeticOption.valuesCvar, defaultColor); cosmeticOption.currentColor.x = cvarColor.r / 255.0f; cosmeticOption.currentColor.y = cvarColor.g / 255.0f; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h index c9a28ef29..9c3dd76ba 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h @@ -52,7 +52,6 @@ static float TablesCellsWidth = 300.0f; static ImGuiTableColumnFlags FlagsTable = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; static ImGuiTableColumnFlags FlagsCell = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; -ImVec4 GetRandomValue(); void CosmeticsEditor_RandomizeAll(); void CosmeticsEditor_RandomizeGroup(CosmeticGroup group); void CosmeticsEditor_ResetAll(); diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 589dbaf4a..49764374f 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -1,6 +1,9 @@ #include "MessageViewer.h" -#include +#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" +#include "soh/OTRGlobals.h" + #include #include "../custom-message/CustomMessageManager.h" @@ -13,6 +16,8 @@ extern "C" u8 sMessageHasSetSfx; +using namespace UIWidgets; + void MessageViewer::InitElement() { CustomMessageManager::Instance->AddCustomMessageTable(TABLE_ID); mTableIdBuf = static_cast(calloc(MAX_STRING_SIZE, sizeof(char))); @@ -21,8 +26,10 @@ void MessageViewer::InitElement() { } void MessageViewer::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); ImGui::Text("Table ID"); ImGui::SameLine(); + PushStyleInput(THEME_COLOR); ImGui::InputText("##TableID", mTableIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); UIWidgets::InsertHelpHoverText("Leave blank for vanilla table"); ImGui::Text("Text ID"); @@ -38,6 +45,8 @@ void MessageViewer::DrawElement() { UIWidgets::InsertHelpHoverText("Hexadecimal Text ID of the message to load. Hexadecimal digits only (0-9/A-F)."); break; } + PopStyleInput(); + PushStyleCheckbox(THEME_COLOR); if (ImGui::RadioButton("Hexadecimal", &mTextIdBase, HEXADECIMAL)) { memset(mTextIdBuf, 0, sizeof(char) * MAX_STRING_SIZE); } @@ -45,8 +54,10 @@ void MessageViewer::DrawElement() { if (ImGui::RadioButton("Decimal", &mTextIdBase, DECIMAL)) { memset(mTextIdBuf, 0, sizeof(char) * MAX_STRING_SIZE); } + PopStyleCheckbox(); ImGui::Text("Language"); ImGui::SameLine(); + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##Language", mLanguages[mLanguage])) { // ReSharper disable CppDFAUnreachableCode for (size_t i = 0; i < mLanguages.size(); i++) { @@ -58,7 +69,9 @@ void MessageViewer::DrawElement() { } ImGui::EndCombo(); } + PopStyleCombobox(); UIWidgets::InsertHelpHoverText("Which language to load from the selected text ID"); + PushStyleButton(THEME_COLOR); if (ImGui::Button("Display Message##ExistingMessage")) { mDisplayExistingMessageClicked = true; } @@ -66,11 +79,14 @@ void MessageViewer::DrawElement() { UIWidgets::InsertHelpHoverText("Enter a string using Custom Message Syntax to preview it in-game. " "Any newline (\\n) characters inserted by the Enter key will be stripped " "from the output."); + PushStyleInput(THEME_COLOR); ImGui::InputTextMultiline("##CustomMessage", mCustomMessageBuf, MAX_STRING_SIZE); + PopStyleInput(); if (ImGui::Button("Display Message##CustomMessage")) { mDisplayCustomMessageClicked = true; } - // ReSharper restore CppDFAUnreachableCode + PopStyleButton(); + ImGui::PopFont(); } void MessageViewer::UpdateElement() { diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index 8aac60954..a154df65b 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -1,6 +1,7 @@ #include "actorViewer.h" #include "../../util.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/ActorDB.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/nametag.h" @@ -59,6 +60,8 @@ std::array acMapping = { "Chest" }; +using namespace UIWidgets; + typedef enum { ACTORVIEWER_NAMETAGS_NONE, ACTORVIEWER_NAMETAGS_DESC, @@ -70,29 +73,18 @@ const std::string GetActorDescription(u16 id) { return ActorDB::Instance->RetrieveEntry(id).entry.valid ? ActorDB::Instance->RetrieveEntry(id).entry.desc : "???"; } -template void DrawGroupWithBorder(T&& drawFunc) { +template void DrawGroupWithBorder(T&& drawFunc, std::string section) { // First group encapsulates the inner portion and border - ImGui::BeginGroup(); - - ImVec2 padding = ImGui::GetStyle().FramePadding; - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); + ImGui::BeginChild(std::string("##" + section).c_str(), ImVec2(0, 0), + ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY); // Second group encapsulates just the inner portion ImGui::BeginGroup(); - + ImGui::AlignTextToFramePadding(); drawFunc(); - - ImGui::Dummy(padding); ImGui::EndGroup(); - ImVec2 p1 = ImGui::GetItemRectMax(); - p1.x += padding.x; - ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; - ImGui::GetWindowDrawList()->AddRect( - p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); - - ImGui::EndGroup(); + ImGui::EndChild(); } void PopulateActorDropdown(int i, std::vector& data) { @@ -938,10 +930,12 @@ void ActorViewerWindow::DrawElement() { static std::string filler = "Please select"; static std::vector list; static u16 lastSceneId = 0; - static char searchString[64] = ""; + static std::string searchString = ""; static s16 currentSelectedInDropdown; static std::vector actors; + ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); + if (gPlayState != nullptr) { needs_reset = lastSceneId != gPlayState->sceneNum; if (needs_reset) { @@ -951,13 +945,13 @@ void ActorViewerWindow::DrawElement() { filler = "Please Select"; list.clear(); needs_reset = false; - for (size_t i = 0; i < ARRAY_COUNT(searchString); i += 1) { - searchString[i] = 0; - } + searchString = ""; currentSelectedInDropdown = -1; actors.clear(); } lastSceneId = gPlayState->sceneNum; + + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Actor Type", acMapping[category])) { for (int i = 0; i < acMapping.size(); i++) { if (ImGui::Selectable(acMapping[i])) { @@ -990,7 +984,9 @@ void ActorViewerWindow::DrawElement() { } ImGui::EndCombo(); } + PopStyleCombobox(); + PushStyleHeader(THEME_COLOR); if (ImGui::TreeNode("Selected Actor")) { DrawGroupWithBorder([&]() { ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); @@ -998,46 +994,52 @@ void ActorViewerWindow::DrawElement() { ImGui::Text("Category: %s", acMapping[display->category]); ImGui::Text("ID: %d", display->id); ImGui::Text("Parameters: %d", display->params); - }); - + }, "Selected Actor"); + ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetFontSize() * 6); DrawGroupWithBorder([&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); ImGui::Text("Actor Position"); - ImGui::InputScalar("x pos", ImGuiDataType_Float, &display->world.pos.x); - ImGui::SameLine(); - ImGui::InputScalar("y pos", ImGuiDataType_Float, &display->world.pos.y); - ImGui::SameLine(); - ImGui::InputScalar("z pos", ImGuiDataType_Float, &display->world.pos.z); - }); - + ImGui::InputScalar("X##CurPos", ImGuiDataType_Float, &display->world.pos.x); + ImGui::InputScalar("Y##CurPos", ImGuiDataType_Float, &display->world.pos.y); + ImGui::InputScalar("Z##CurPos", ImGuiDataType_Float, &display->world.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, "Actor Position"); + ImGui::SameLine(); DrawGroupWithBorder([&]() { + PushStyleInput(THEME_COLOR); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); ImGui::Text("Actor Rotation"); - ImGui::InputScalar("x rot", ImGuiDataType_S16, &display->world.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("y rot", ImGuiDataType_S16, &display->world.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("z rot", ImGuiDataType_S16, &display->world.rot.z); - }); + ImGui::InputScalar("X##CurRot", ImGuiDataType_S16, &display->world.rot.x); + ImGui::InputScalar("Y##CurRot", ImGuiDataType_S16, &display->world.rot.y); + ImGui::InputScalar("Z##CurRot", ImGuiDataType_S16, &display->world.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, "Actor Rotation"); if (display->category == ACTORCAT_BOSS || display->category == ACTORCAT_ENEMY) { + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Enemy Health", ImGuiDataType_U8, &display->colChkInfo.health); + PopStyleInput(); UIWidgets::InsertHelpHoverText("Some actors might not use this!"); } DrawGroupWithBorder([&]() { ImGui::Text("flags"); UIWidgets::DrawFlagArray32("flags", display->flags); - }); + }, "flags"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("bgCheckFlags"); UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); - }); + }, "bgCheckFlags"); - if (ImGui::Button("Refresh")) { + if (Button("Refresh", ButtonOptions().Color(THEME_COLOR))) { PopulateActorDropdown(category, list); switch (rm) { case INTERACT: @@ -1053,13 +1055,13 @@ void ActorViewerWindow::DrawElement() { } } - if (ImGui::Button("Go to Actor")) { + if (Button("Go to Actor", ButtonOptions().Color(THEME_COLOR))) { Player* player = GET_PLAYER(gPlayState); Math_Vec3f_Copy(&player->actor.world.pos, &display->world.pos); Math_Vec3f_Copy(&player->actor.home.pos, &player->actor.world.pos); } - if (ImGui::Button("Fetch from Target")) { + if (Button("Fetch from Target", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor with target arrow above it. You might need C-Up for enemies"))) { Player* player = GET_PLAYER(gPlayState); fetch = player->talkActor; if (fetch != NULL) { @@ -1069,8 +1071,7 @@ void ActorViewerWindow::DrawElement() { rm = TARGET; } } - UIWidgets::InsertHelpHoverText("Grabs actor with target arrow above it. You might need C-Up for enemies"); - if (ImGui::Button("Fetch from Held")) { + if (Button("Fetch from Held", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor that Link is holding"))) { Player* player = GET_PLAYER(gPlayState); fetch = player->heldActor; if (fetch != NULL) { @@ -1080,8 +1081,7 @@ void ActorViewerWindow::DrawElement() { rm = HELD; } } - UIWidgets::InsertHelpHoverText("Grabs actor that Link is holding"); - if (ImGui::Button("Fetch from Interaction")) { + if (Button("Fetch from Interaction", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor from \"interaction range\""))) { Player* player = GET_PLAYER(gPlayState); fetch = player->interactRangeActor; if (fetch != NULL) { @@ -1091,21 +1091,21 @@ void ActorViewerWindow::DrawElement() { rm = INTERACT; } } - UIWidgets::InsertHelpHoverText("Grabs actor from \"interaction range\""); ImGui::TreePop(); } if (ImGui::TreeNode("New...")) { - ImGui::PushItemWidth(ImGui::GetFontSize() * 10); + //ImGui::PushItemWidth(ImGui::GetFontSize() * 10); - if (ImGui::InputText("Search Actor", searchString, ARRAY_COUNT(searchString))) { - actors = GetActorsWithDescriptionContainingString(std::string(searchString)); + if (InputString("Search Actor", &searchString, InputOptions().Color(THEME_COLOR))) { + actors = GetActorsWithDescriptionContainingString(searchString); currentSelectedInDropdown = -1; } - if (searchString[0] != 0 && !actors.empty()) { + if (!SohUtils::IsStringEmpty(searchString) && !actors.empty()) { std::string preview = currentSelectedInDropdown == -1 ? "Please Select" : ActorDB::Instance->RetrieveEntry(actors[currentSelectedInDropdown]).desc; + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Results", preview.c_str())) { for (u8 i = 0; i < actors.size(); i++) { if (ImGui::Selectable( @@ -1118,6 +1118,7 @@ void ActorViewerWindow::DrawElement() { } ImGui::EndCombo(); } + PopStyleCombobox(); } ImGui::Text("%s", GetActorDescription(newActor.id).c_str()); @@ -1125,44 +1126,51 @@ void ActorViewerWindow::DrawElement() { newActor.params = 0; } - UIWidgets::EnhancementCheckbox("Advanced mode", CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams")); - UIWidgets::InsertHelpHoverText("Changes the actor specific param menus with a direct input"); + CVarCheckbox("Advanced mode", CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), CheckboxOptions().Tooltip("Changes the actor specific param menus with a direct input")); if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), 0)) { + PushStyleInput(THEME_COLOR); ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + PopStyleInput(); } else if (std::find(noParamsActors.begin(), noParamsActors.end(), newActor.id) == noParamsActors.end()) { CreateActorSpecificData(); if (actorSpecificData.find(newActor.id) == actorSpecificData.end()) { + PushStyleInput(THEME_COLOR); ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); + PopStyleInput(); } else { DrawGroupWithBorder([&]() { ImGui::Text("Actor Specific Data"); newActor.params = actorSpecificData[newActor.id](newActor.params); - }); + }, "Actor Specific Data"); } } ImGui::PushItemWidth(ImGui::GetFontSize() * 6); DrawGroupWithBorder([&]() { + PushStyleInput(THEME_COLOR); ImGui::Text("New Actor Position"); - ImGui::InputScalar("posX", ImGuiDataType_Float, &newActor.pos.x); - ImGui::SameLine(); - ImGui::InputScalar("posY", ImGuiDataType_Float, &newActor.pos.y); - ImGui::SameLine(); - ImGui::InputScalar("posZ", ImGuiDataType_Float, &newActor.pos.z); - }); - + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::InputScalar("X##NewPos", ImGuiDataType_Float, &newActor.pos.x); + ImGui::InputScalar("Y##NewPos", ImGuiDataType_Float, &newActor.pos.y); + ImGui::InputScalar("Z##NewPos", ImGuiDataType_Float, &newActor.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, "New Actor Position"); + ImGui::SameLine(); DrawGroupWithBorder([&]() { + PushStyleInput(THEME_COLOR); ImGui::Text("New Actor Rotation"); - ImGui::InputScalar("rotX", ImGuiDataType_S16, &newActor.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("rotY", ImGuiDataType_S16, &newActor.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("rotZ", ImGuiDataType_S16, &newActor.rot.z); - }); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::InputScalar("X##NewRot", ImGuiDataType_S16, &newActor.rot.x); + ImGui::InputScalar("Y##NewRot", ImGuiDataType_S16, &newActor.rot.y); + ImGui::InputScalar("Z##NewRot", ImGuiDataType_S16, &newActor.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, "New Actor Rotation"); - if (ImGui::Button("Fetch from Link")) { + if (Button("Fetch from Link", ButtonOptions().Color(THEME_COLOR))) { Player* player = GET_PLAYER(gPlayState); Vec3f newPos = player->actor.world.pos; Vec3s newRot = player->actor.world.rot; @@ -1170,7 +1178,7 @@ void ActorViewerWindow::DrawElement() { newActor.rot = newRot; } - if (ImGui::Button("Spawn")) { + if (Button("Spawn", ButtonOptions().Color(THEME_COLOR))) { if (ActorDB::Instance->RetrieveEntry(newActor.id).entry.valid) { Actor_Spawn(&gPlayState->actorCtx, gPlayState, newActor.id, newActor.pos.x, newActor.pos.y, newActor.pos.z, newActor.rot.x, newActor.rot.y, newActor.rot.z, newActor.params, 0); @@ -1179,7 +1187,7 @@ void ActorViewerWindow::DrawElement() { } } - if (ImGui::Button("Spawn as Child")) { + if (Button("Spawn as Child", ButtonOptions().Color(THEME_COLOR))) { Actor* parent = display; if (parent != NULL) { if (newActor.id >= 0 && newActor.id < ACTOR_ID_MAX && @@ -1193,28 +1201,26 @@ void ActorViewerWindow::DrawElement() { } } - if (ImGui::Button("Reset")) { + if (Button("Reset", ButtonOptions().Color(THEME_COLOR))) { newActor = { 0, 0, { 0, 0, 0 }, { 0, 0, 0 } }; } ImGui::TreePop(); } + PopStyleHeader(); - static const char* nameTagOptions[] = { - "None", - "Short Description", - "Actor ID", - "Both" + static std::unordered_map nameTagOptions = { + { 0, "None" }, + { 1, "Short Description" }, + { 2, "Actor ID" }, + { 3, "Both" }, }; - UIWidgets::Spacer(0); - - ImGui::Text("Actor Name Tags"); - if (UIWidgets::EnhancementCombobox(CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags"), nameTagOptions, ACTORVIEWER_NAMETAGS_NONE)) { + if (CVarCombobox("Actor Name Tags", CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags"), nameTagOptions, + ComboboxOptions().Color(THEME_COLOR).Tooltip("Adds \"name tags\" above actors for identification"))) { NameTag_RemoveAllByTag(DEBUG_ACTOR_NAMETAG_TAG); ActorViewer_AddTagForAllActors(); } - UIWidgets::Tooltip("Adds \"name tags\" above actors for identification"); } else { ImGui::Text("Global Context needed for actor info!"); if (needs_reset) { @@ -1223,13 +1229,12 @@ void ActorViewerWindow::DrawElement() { filler = "Please Select"; list.clear(); needs_reset = false; - for (size_t i = 0; i < ARRAY_COUNT(searchString); i += 1) { - searchString[i] = 0; - } + searchString = ""; currentSelectedInDropdown = -1; actors.clear(); } } + ImGui::PopFont(); } void ActorViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/colViewer.cpp b/soh/soh/Enhancements/debugger/colViewer.cpp index 493ffdfdc..de2272598 100644 --- a/soh/soh/Enhancements/debugger/colViewer.cpp +++ b/soh/soh/Enhancements/debugger/colViewer.cpp @@ -1,6 +1,7 @@ #include "colViewer.h" #include "../../frame_interpolation.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include #include @@ -19,12 +20,12 @@ extern "C" { extern PlayState* gPlayState; } -enum class ColRenderSetting { Disabled, Solid, Transparent }; +typedef enum ColRenderSetting { ColRenderDisabled, ColRenderSolid, ColRenderTransparent } ColRenderSetting ; -static const char* ColRenderSettingNames[] = { - "Disabled", - "Solid", - "Transparent", +static std::unordered_map ColRenderSettingNames = { + { ColRenderDisabled, "Disabled" }, + { ColRenderSolid, "Solid" }, + { ColRenderTransparent, "Transparent" }, }; ImVec4 scene_col; @@ -53,45 +54,69 @@ static std::vector cylinderVtx; static std::vector sphereGfx; static std::vector sphereVtx; +using namespace UIWidgets; + // Draws the ImGui window for the collision viewer void ColViewerWindow::DrawElement() { - UIWidgets::EnhancementCheckbox("Enabled", CVAR_DEVELOPER_TOOLS("ColViewer.Enabled")); + CheckboxOptions checkOpt = CheckboxOptions().Color(THEME_COLOR); + ComboboxOptions comboOpt = ComboboxOptions().Color(THEME_COLOR); + CVarCheckbox("Enabled", CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), checkOpt); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Scene", CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), ColRenderSettingNames, COLVIEW_DISABLED); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Bg Actors", CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), ColRenderSettingNames, COLVIEW_DISABLED); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Col Check", CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), ColRenderSettingNames, COLVIEW_DISABLED); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), ColRenderSettingNames, COLVIEW_DISABLED); + CVarCombobox("Scene", CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), ColRenderSettingNames, comboOpt); + CVarCombobox("Bg Actors", CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), ColRenderSettingNames, comboOpt); + CVarCombobox("Col Check", CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), ColRenderSettingNames, comboOpt); + CVarCombobox("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), ColRenderSettingNames, comboOpt); - UIWidgets::EnhancementCheckbox("Apply as decal", CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::InsertHelpHoverText("Applies the collision as a decal display. This can be useful if there is z-fighting occuring " - "with the scene geometry, but can cause other artifacts."); - UIWidgets::EnhancementCheckbox("Shaded", CVAR_DEVELOPER_TOOLS("ColViewer.Shaded")); - UIWidgets::InsertHelpHoverText("Applies the scene's shading to the collision display."); + CVarCheckbox("Apply as decal", CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), + checkOpt.DefaultValue(true).Tooltip("Applies the collision as a decal display. This can be useful if there is z-fighting occuring " + "with the scene geometry, but can cause other artifacts.")); + CVarCheckbox("Shaded", CVAR_DEVELOPER_TOOLS("ColViewer.Shaded"), checkOpt.DefaultValue(false).Tooltip("Applies the scene's shading to the collision display.")); // This has to be duplicated in both code paths due to the nature of ImGui::IsItemHovered() const std::string colorHelpText = "View and change the colors used for collision display."; + PushStyleHeader(THEME_COLOR); if (ImGui::TreeNode("Colors")) { - UIWidgets::InsertHelpHoverText(colorHelpText); + UIWidgets::Tooltip(colorHelpText.c_str()); - UIWidgets::EnhancementColor("Normal", CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), scene_col, ImVec4(255, 255, 255, 255), false); - UIWidgets::EnhancementColor("Hookshot", CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), hookshot_col, ImVec4(128, 128, 255, 255), - false); - UIWidgets::EnhancementColor("Entrance", CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), entrance_col, ImVec4(0, 255, 0, 255), false); - UIWidgets::EnhancementColor("Special Surface (Grass/Sand/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), - specialSurface_col, ImVec4(192, 255, 192, 255), false); - UIWidgets::EnhancementColor("Interactable (Vines/Crawlspace/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), - interactable_col, ImVec4(192, 0, 192, 255), false); - UIWidgets::EnhancementColor("Slope", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), slope_col, ImVec4(255, 255, 128, 255), false); - UIWidgets::EnhancementColor("Void", CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), void_col, ImVec4(255, 0, 0, 255), false); - UIWidgets::EnhancementColor("OC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), oc_col, ImVec4(255, 255, 255, 255), false); - UIWidgets::EnhancementColor("AC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), ac_col, ImVec4(0, 0, 255, 255), false); - UIWidgets::EnhancementColor("AT", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), at_col, ImVec4(255, 0, 0, 255), false); - UIWidgets::EnhancementColor("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), waterbox_col, ImVec4(0, 0, 255, 255), false); + if (CVarColorPicker("Normal", CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + scene_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 })); + } + if (CVarColorPicker("Hookshot", CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + hookshot_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 })); + } + if (CVarColorPicker("Entrance", CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + entrance_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 })); + } + if (CVarColorPicker("Special Surface (Grass/Sand/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + specialSurface_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 })); + } + if (CVarColorPicker("Interactable (Vines/Crawlspace/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), { 192, 0, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + interactable_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), { 192, 0, 192, 255 })); + } + if (CVarColorPicker("Slope", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + slope_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 })); + } + if (CVarColorPicker("Void", CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + void_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 })); + } + if (CVarColorPicker("OC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + oc_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 })); + } + if (CVarColorPicker("AC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + ac_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 })); + } + if (CVarColorPicker("AT", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + at_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 })); + } + if (CVarColorPicker("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + waterbox_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 })); + } ImGui::TreePop(); } else { - UIWidgets::InsertHelpHoverText(colorHelpText); + UIWidgets::Tooltip(colorHelpText.c_str()); } + PopStyleHeader(); } // Calculates the normal for a triangle at the 3 specified points @@ -287,7 +312,7 @@ void InitGfx(std::vector& gfx, ColRenderSetting setting) { uint64_t cm; uint32_t gm; - if (setting == ColRenderSetting::Transparent) { + if (setting == ColRenderTransparent) { rm = Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL; blc1 = GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA); blc2 = GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA); @@ -301,7 +326,7 @@ void InitGfx(std::vector& gfx, ColRenderSetting setting) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), 1) != 0) { rm |= ZMODE_DEC; - } else if (setting == ColRenderSetting::Transparent) { + } else if (setting == ColRenderTransparent) { rm |= ZMODE_XLU; } else { rm |= ZMODE_OPA; @@ -340,21 +365,21 @@ void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { CollisionPoly* poly = &col->polyList[i]; if (SurfaceType_IsHookshotSurface(&gPlayState->colCtx, poly, bgId)) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot.Value"), { 128, 128, 255, 255 }); } else if (func_80041D94(&gPlayState->colCtx, poly, bgId) > 0x01) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), {192, 0, 192, 255}); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable.Value"), {192, 0, 192, 255}); } else if (func_80041E80(&gPlayState->colCtx, poly, bgId) == 0x0C) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid.Value"), { 255, 0, 0, 255 }); } else if (SurfaceType_GetSceneExitIndex(&gPlayState->colCtx, poly, bgId) || func_80041E80(&gPlayState->colCtx, poly, bgId) == 0x05) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance.Value"), { 0, 255, 0, 255 }); } else if (func_80041D4C(&gPlayState->colCtx, poly, bgId) != 0 || SurfaceType_IsWallDamage(&gPlayState->colCtx, poly, bgId)) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface.Value"), { 192, 255, 192, 255 }); } else if (SurfaceType_GetSlope(&gPlayState->colCtx, poly, bgId) == 0x01) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope.Value"), { 255, 255, 128, 255 }); } else { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal.Value"), { 255, 255, 255, 255 }); } if (color.r != lastColorR || color.g != lastColorG || color.b != lastColorB) { @@ -404,11 +429,11 @@ void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { void DrawSceneCollision() { ColRenderSetting showSceneColSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_DISABLED); - if (showSceneColSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + if (showSceneColSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showSceneColSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showSceneColSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showSceneColSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); @@ -418,11 +443,11 @@ void DrawSceneCollision() { // Draws all Bg Actors void DrawBgActorCollision() { ColRenderSetting showBgActorSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_DISABLED); - if (showBgActorSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + if (showBgActorSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showBgActorSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showBgActorSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showBgActorSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); @@ -543,22 +568,22 @@ void DrawColCheckList(std::vector& dl, Collider** objects, int32_t count) { // Draws all Col Check objects void DrawColCheckCollision() { ColRenderSetting showColCheckSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), COLVIEW_DISABLED); - if (showColCheckSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + if (showColCheckSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showColCheckSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showColCheckSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showColCheckSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); CollisionCheckContext& col = gPlayState->colChkCtx; - Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 }); + Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC.Value"), { 255, 255, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); DrawColCheckList(dl, col.colOC, col.colOCCount); - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC.Value"), { 0, 0, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); DrawColCheckList(dl, col.colAC, col.colACCount); - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 0, 0, 255, 255 }); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT.Value"), { 0, 0, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); DrawColCheckList(dl, col.colAT, col.colATCount); @@ -595,15 +620,15 @@ extern "C" f32 zdWaterBoxMinY; // Draws all waterboxes void DrawWaterboxList() { ColRenderSetting showWaterboxSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), COLVIEW_DISABLED); - if (showWaterboxSetting == ColRenderSetting::Disabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { + if (showWaterboxSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } - std::vector& dl = (showWaterboxSetting == ColRenderSetting::Transparent) ? xluDl : opaDl; + std::vector& dl = (showWaterboxSetting == ColRenderTransparent) ? xluDl : opaDl; InitGfx(dl, showWaterboxSetting); dl.push_back(gsSPMatrix(&gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); - Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 }); + Color_RGBA8 color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox.Value"), { 0, 0, 255, 255 }); dl.push_back(gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index b9858aff4..dfc4d9681 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -3,6 +3,7 @@ #include "soh/SohGui/ImGuiUtils.h" #include "soh/OTRGlobals.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include #include @@ -27,7 +28,7 @@ extern PlayState* gPlayState; } // Maps entries in the GS flag array to the area name it represents -std::vector gsMapping = { +std::vector gsMapping = { "Deku Tree", "Dodongo's Cavern", "Inside Jabu-Jabu's Belly", @@ -56,6 +57,15 @@ extern "C" u8 gAreaGsFlags[]; extern "C" u8 gAmmoItems[]; +#define IMAGE_SIZE 48.0f + +using namespace UIWidgets; + +IntSliderOptions intSliderOptionsBase; +ButtonOptions buttonOptionsBase; +CheckboxOptions checkboxOptionsBase; +ComboboxOptions comboboxOptionsBase; + // Modification of gAmmoItems that replaces ITEM_NONE with the item in inventory slot it represents u8 gAllAmmoItems[] = { ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE, @@ -65,28 +75,17 @@ u8 gAllAmmoItems[] = { // Encapsulates what is drawn by the passed-in function within a border template -void DrawGroupWithBorder(T&& drawFunc) { +void DrawGroupWithBorder(T&& drawFunc, std::string section) { // First group encapsulates the inner portion and border + ImGui::BeginChild(std::string("##" + section).c_str(), ImVec2(0, 0), + ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY); + ImGui::BeginGroup(); - - ImVec2 padding = ImGui::GetStyle().FramePadding; - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); - - // Second group encapsulates just the inner portion - ImGui::BeginGroup(); - + ImGui::AlignTextToFramePadding(); drawFunc(); - - ImGui::Dummy(padding); ImGui::EndGroup(); - ImVec2 p1 = ImGui::GetItemRectMax(); - p1.x += padding.x; - ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; - ImGui::GetWindowDrawList()->AddRect(p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); - - ImGui::EndGroup(); + ImGui::EndChild(); } char z2ASCII(int code) { @@ -108,6 +107,42 @@ char z2ASCII(int code) { } +typedef enum MagicLevel { + MAGIC_LEVEL_NONE, + MAGIC_LEVEL_SINGLE, + MAGIC_LEVEL_DOUBLE +}; + +std::unordered_map magicLevelMap = { + { MAGIC_LEVEL_NONE, "None" }, + { MAGIC_LEVEL_SINGLE, "Single" }, + { MAGIC_LEVEL_DOUBLE, "Double" }, +}; + +typedef enum AudioOutput { + AUDIO_STEREO, + AUDIO_MONO, + AUDIO_HEADSET, + AUDIO_SURROUND, +}; + +std::unordered_map audioMap = { + { AUDIO_STEREO, "Stereo" }, + { AUDIO_MONO, "Mono" }, + { AUDIO_HEADSET, "Headset" }, + { AUDIO_SURROUND, "Surround" }, +}; + +typedef enum ZTarget { + Z_TARGET_SWITCH, + Z_TARGET_HOLD, +}; + +std::unordered_map zTargetMap = { + { Z_TARGET_SWITCH, "Switch" }, + { Z_TARGET_HOLD, "Hold" }, +}; + void DrawInfoTab() { // TODO Needs a better method for name changing but for now this will work. std::string name; @@ -121,200 +156,147 @@ void DrawInfoTab() { ImGui::PushItemWidth(ImGui::GetFontSize() * 6); ImGui::Text("Name: %s", name.c_str()); - UIWidgets::InsertHelpHoverText("Player Name"); + Tooltip("Player Name"); std::string nameID; for (int i = 0; i < 8; i++) { nameID = z2ASCII(i); if (i % 4 != 0) { ImGui::SameLine(); } + PushStyleInput(THEME_COLOR); ImGui::InputScalar(nameID.c_str(), ImGuiDataType_U8, &gSaveContext.playerName[i], &one, NULL); + PopStyleInput(); } // Use an intermediary to keep the health from updating (and potentially killing the player) // until it is done being edited int16_t healthIntermediary = gSaveContext.healthCapacity; + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Max Health", ImGuiDataType_S16, &healthIntermediary); + PopStyleInput(); if (ImGui::IsItemDeactivated()) { gSaveContext.healthCapacity = healthIntermediary; } - UIWidgets::InsertHelpHoverText("Maximum health. 16 units per full heart"); + Tooltip("Maximum health. 16 units per full heart"); if (gSaveContext.health > gSaveContext.healthCapacity) { gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max } - - const uint16_t healthMin = 0; - const uint16_t healthMax = gSaveContext.healthCapacity; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Health", ImGuiDataType_S16, &gSaveContext.health, &healthMin, &healthMax); - UIWidgets::InsertHelpHoverText("Current health. 16 units per full heart"); + int32_t health = (int32_t)gSaveContext.health; + if (SliderInt("Health", &health, intSliderOptionsBase.Tooltip("Current health. 16 units per full heart") + .Min(0).Max(gSaveContext.healthCapacity))) { + gSaveContext.health = (int16_t)health; + } bool isDoubleDefenseAcquired = gSaveContext.isDoubleDefenseAcquired != 0; - if (ImGui::Checkbox("Double Defense", &isDoubleDefenseAcquired)) { + if (Checkbox("Double Defense", &isDoubleDefenseAcquired, checkboxOptionsBase.Tooltip("Is double defense unlocked?"))) { gSaveContext.isDoubleDefenseAcquired = isDoubleDefenseAcquired; gSaveContext.inventory.defenseHearts = gSaveContext.isDoubleDefenseAcquired ? 20 : 0; // Set to get the border drawn in the UI } - UIWidgets::InsertHelpHoverText("Is double defense unlocked?"); - - std::string magicName; - if (gSaveContext.magicLevel == 2) { - magicName = "Double"; - } else if (gSaveContext.magicLevel == 1) { - magicName = "Single"; - } else { - magicName = "None"; + if (Combobox("Magic Level", &gSaveContext.magicLevel, magicLevelMap, comboboxOptionsBase.Tooltip("Current magic level"))) { + gSaveContext.isMagicAcquired = gSaveContext.magicLevel > 0; + gSaveContext.isDoubleMagicAcquired = gSaveContext.magicLevel == 2; } - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6); - if (ImGui::BeginCombo("Magic Level", magicName.c_str())) { - if (ImGui::Selectable("Double")) { - gSaveContext.magicLevel = 2; - gSaveContext.isMagicAcquired = true; - gSaveContext.isDoubleMagicAcquired = true; - } - if (ImGui::Selectable("Single")) { - gSaveContext.magicLevel = 1; - gSaveContext.isMagicAcquired = true; - gSaveContext.isDoubleMagicAcquired = false; - } - if (ImGui::Selectable("None")) { - gSaveContext.magicLevel = 0; - gSaveContext.isMagicAcquired = false; - gSaveContext.isDoubleMagicAcquired = false; - } - - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Current magic level"); gSaveContext.magicCapacity = gSaveContext.magicLevel * 0x30; // Set to get the bar drawn in the UI if (gSaveContext.magic > gSaveContext.magicCapacity) { gSaveContext.magic = gSaveContext.magicCapacity; // Clamp magic to new max } - const uint8_t magicMin = 0; - const uint8_t magicMax = gSaveContext.magicCapacity; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Magic", ImGuiDataType_S8, &gSaveContext.magic, &magicMin, &magicMax); - UIWidgets::InsertHelpHoverText("Current magic. 48 units per magic level"); + int32_t magic = (int32_t)gSaveContext.magic; + if (SliderInt("Magic", &magic, intSliderOptionsBase.Min(0).Max(gSaveContext.magicCapacity).Tooltip("Current magic. 48 units per magic level"))) { + gSaveContext.magic = (int8_t)magic; + } + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Rupees", ImGuiDataType_S16, &gSaveContext.rupees); - UIWidgets::InsertHelpHoverText("Current rupees"); + Tooltip("Current rupees"); + PopStyleInput(); - const uint16_t dayTimeMin = 0; - const uint16_t dayTimeMax = 0xFFFF; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); - UIWidgets::InsertHelpHoverText("Time of day"); - if (ImGui::Button("Dawn")) { + SliderInt("Time", (int32_t*) &gSaveContext.dayTime, intSliderOptionsBase.Min(0).Max(0xFFFF).Tooltip("Time of day")); + if (Button("Dawn", buttonOptionsBase)) { gSaveContext.dayTime = 0x4000; } ImGui::SameLine(); - if (ImGui::Button("Noon")) { + if (Button("Noon", buttonOptionsBase)) { gSaveContext.dayTime = 0x8000; } ImGui::SameLine(); - if (ImGui::Button("Sunset")) { + if (Button("Sunset", buttonOptionsBase)) { gSaveContext.dayTime = 0xC001; } ImGui::SameLine(); - if (ImGui::Button("Midnight")) { + if (Button("Midnight", buttonOptionsBase)) { gSaveContext.dayTime = 0; } + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Total Days", ImGuiDataType_S32, &gSaveContext.totalDays); - UIWidgets::InsertHelpHoverText("Total number of days elapsed since the start of the game"); + Tooltip("Total number of days elapsed since the start of the game"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Deaths", ImGuiDataType_U16, &gSaveContext.deaths); - UIWidgets::InsertHelpHoverText("Total number of deaths"); + Tooltip("Total number of deaths"); + PopStyleInput(); - bool bgsFlag = gSaveContext.bgsFlag != 0; - if (ImGui::Checkbox("Has BGS", &bgsFlag)) { - gSaveContext.bgsFlag = bgsFlag; - } - UIWidgets::InsertHelpHoverText("Is Biggoron sword unlocked? Replaces Giant's knife"); + Checkbox("Has BGS", (bool*) &gSaveContext.bgsFlag, checkboxOptionsBase.Tooltip("Is Biggoron sword unlocked? Replaces Giant's knife")); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth); - UIWidgets::InsertHelpHoverText("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); + Tooltip("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Bgs Day Count", ImGuiDataType_S32, &gSaveContext.bgsDayCount); - UIWidgets::InsertHelpHoverText("Total number of days elapsed since giving Biggoron the claim check"); + Tooltip("Total number of days elapsed since giving Biggoron the claim check"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Entrance Index", ImGuiDataType_S32, &gSaveContext.entranceIndex); - UIWidgets::InsertHelpHoverText("From which entrance did Link arrive?"); + Tooltip("From which entrance did Link arrive?"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Cutscene Index", ImGuiDataType_S32, &gSaveContext.cutsceneIndex); - UIWidgets::InsertHelpHoverText("Which cutscene is this?"); + Tooltip("Which cutscene is this?"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Navi Timer", ImGuiDataType_U16, &gSaveContext.naviTimer); - UIWidgets::InsertHelpHoverText("Navi wants to talk at 600 units, decides not to at 3000."); + Tooltip("Navi wants to talk at 600 units, decides not to at 3000."); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Timer 1 State", ImGuiDataType_S16, &gSaveContext.timer1State); - UIWidgets::InsertHelpHoverText("Heat timer, race timer, etc. Has white font"); + Tooltip("Heat timer, race timer, etc. Has white font"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Timer 1 Value", ImGuiDataType_S16, &gSaveContext.timer1Value, &one, NULL); - UIWidgets::InsertHelpHoverText("Time, in seconds"); + Tooltip("Time, in seconds"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Timer 2 State", ImGuiDataType_S16, &gSaveContext.timer2State); - UIWidgets::InsertHelpHoverText("Trade timer, Ganon collapse timer, etc. Has yellow font"); + Tooltip("Trade timer, Ganon collapse timer, etc. Has yellow font"); + PopStyleInput(); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Timer 2 Value", ImGuiDataType_S16, &gSaveContext.timer2Value, &one, NULL); - UIWidgets::InsertHelpHoverText("Time, in seconds"); - - const char* audioName; - switch (gSaveContext.audioSetting) { - case 0: - audioName = "Stereo"; - break; - case 1: - audioName = "Mono"; - break; - case 2: - audioName = "Headset"; - break; - case 3: - audioName = "Surround"; - break; - default: - audioName = "?"; - } - if (ImGui::BeginCombo("Audio", audioName)) { - if (ImGui::Selectable("Stereo")) { - gSaveContext.audioSetting = 0; - } - if (ImGui::Selectable("Mono")) { - gSaveContext.audioSetting = 1; - } - if (ImGui::Selectable("Headset")) { - gSaveContext.audioSetting = 2; - } - if (ImGui::Selectable("Surround")) { - gSaveContext.audioSetting = 3; - } + Tooltip("Time, in seconds"); + PopStyleInput(); - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Sound setting"); + Combobox("Audio", &gSaveContext.audioSetting, audioMap, comboboxOptionsBase.Tooltip("Sound setting")); - bool n64DDFlag = gSaveContext.n64ddFlag != 0; - if (ImGui::Checkbox("64 DD file?", &n64DDFlag)) { - gSaveContext.n64ddFlag = n64DDFlag; - } - UIWidgets::InsertHelpHoverText("WARNING! If you save, your file may be locked! Use caution!"); + Checkbox("64 DD file?", (bool*) &gSaveContext.n64ddFlag, checkboxOptionsBase.Tooltip("WARNING! If you save, your file may be locked! Use caution!")); - if (ImGui::BeginCombo("Z Target Mode", gSaveContext.zTargetSetting ? "Hold" : "Switch")) { - if (ImGui::Selectable("Switch")) { - gSaveContext.zTargetSetting = 0; - } - if (ImGui::Selectable("Hold")) { - gSaveContext.zTargetSetting = 1; - } - ImGui::EndCombo(); - } - UIWidgets::InsertHelpHoverText("Z-Targeting behavior"); + Combobox("Z Target Mode", &gSaveContext.zTargetSetting, zTargetMap, comboboxOptionsBase.Tooltip("Z-Targeting behavior")); if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT)) { + PushStyleInput(THEME_COLOR); ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - UIWidgets::InsertHelpHoverText("Currently obtained Triforce Pieces. For Triforce Hunt."); + Tooltip("Currently obtained Triforce Pieces. For Triforce Hunt."); + PopStyleInput(); } ImGui::PushItemWidth(ImGui::GetFontSize() * 10); @@ -330,78 +312,79 @@ void DrawInfoTab() { for (int i = 0; i < 7; i++) { if(i == 2 && ImGui::TreeNode("Fishing") ){ //fishing has a few more flags to it u8 fishSize = gSaveContext.highScores[i] & 0x7F; + PushStyleInput(THEME_COLOR); if(ImGui::InputScalar("Child Size Record",ImGuiDataType_U8,&fishSize)){ gSaveContext.highScores[i]&=~0x7F; gSaveContext.highScores[i]|=fishSize & 0x7F; } char fishMsg[64]; std::sprintf(fishMsg,"Weight: %2.0f lbs",((SQ(fishSize)*.0036)+.5)); - UIWidgets::InsertHelpHoverText(fishMsg); + Tooltip(fishMsg); + PopStyleInput(); bool FishBool = gSaveContext.highScores[i]&0x80; - if (ImGui::Checkbox("Cheated as Child", &FishBool)) { + if (Checkbox("Cheated as Child", &FishBool, checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { gSaveContext.highScores[i] &= ~0x80; gSaveContext.highScores[i] |= (0x80 * FishBool); } - UIWidgets::InsertHelpHoverText("Used the Sinking lure to catch it."); fishSize=(gSaveContext.highScores[i] & 0x7F000000)>>0x18; + PushStyleInput(THEME_COLOR); if(ImGui::InputScalar("Adult Size Record",ImGuiDataType_U8,&fishSize)){ gSaveContext.highScores[i]&=~0x7F000000; gSaveContext.highScores[i]|=(fishSize & 0x7F) << 0x18; } std::sprintf(fishMsg,"Weight: %2.0f lbs",((SQ(fishSize)*.0036)+.5)); - UIWidgets::InsertHelpHoverText(fishMsg); + Tooltip(fishMsg); + PopStyleInput(); FishBool = gSaveContext.highScores[i] & 0x80000000; - if (ImGui::Checkbox("Cheated as Adult", &FishBool)) { + if (Checkbox("Cheated as Adult", &FishBool, checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { gSaveContext.highScores[i] &= ~0x80000000; gSaveContext.highScores[i] |= (0x80000000 * FishBool); } - UIWidgets::InsertHelpHoverText("Used the Sinking lure to catch it."); FishBool = gSaveContext.highScores[i]&0x100; - if (ImGui::Checkbox("Played as Child", &FishBool)) { + if (Checkbox("Played as Child", &FishBool, checkboxOptionsBase.Tooltip("Played at least one game as a child"))) { gSaveContext.highScores[i] &= ~0x100; gSaveContext.highScores[i] |= (0x100 * FishBool); } - UIWidgets::InsertHelpHoverText("Played at least one game as a child"); FishBool = gSaveContext.highScores[i]&0x200; - if (ImGui::Checkbox("Played as Adult", &FishBool)) { + if (Checkbox("Played as Adult", &FishBool, checkboxOptionsBase.Tooltip("Played at least one game as an adult"))) { gSaveContext.highScores[i] &= ~0x200; gSaveContext.highScores[i] |= (0x200 * FishBool); } - UIWidgets::InsertHelpHoverText("Played at least one game as an adult"); FishBool = gSaveContext.highScores[i]&0x400; - if (ImGui::Checkbox("Got Prize as Child", &FishBool)) { + if (Checkbox("Got Prize as Child", &FishBool, checkboxOptionsBase.Tooltip("Got the prize item (Heart Piece, unless rando.)\nunlocks Sinking Lure for Child Link."))) { gSaveContext.highScores[i] &= ~0x400; gSaveContext.highScores[i] |= (0x400 * FishBool); } - UIWidgets::InsertHelpHoverText("Got the prize item (Heart Piece, unless rando.)\nunlocks Sinking Lure for Child Link."); FishBool = gSaveContext.highScores[i]&0x800; - if (ImGui::Checkbox("Got Prize as Adult", &FishBool)) { + if (Checkbox("Got Prize as Adult", &FishBool, checkboxOptionsBase.Tooltip("Got the prize item (Golden Scale, unless rando.)\nUnlocks Sinking Lure for Adult Link."))) { gSaveContext.highScores[i] &= ~0x800; gSaveContext.highScores[i] |= (0x800 * FishBool); } - UIWidgets::InsertHelpHoverText("Got the prize item (Golden Scale, unless rando.)\nUnlocks Sinking Lure for Adult Link."); FishBool = gSaveContext.highScores[i] & 0x1000; - if (ImGui::Checkbox("Stole Owner's Hat", &FishBool)) { + if (Checkbox("Stole Owner's Hat", &FishBool, checkboxOptionsBase.Tooltip("The owner's now visibly bald when Adult Link."))) { gSaveContext.highScores[i] &= ~0x1000; gSaveContext.highScores[i] |= (0x1000 * FishBool); } - UIWidgets::InsertHelpHoverText("The owner's now visibly bald when Adult Link."); fishSize=(gSaveContext.highScores[i] & 0xFF0000)>>16; + PushStyleInput(THEME_COLOR); if(ImGui::InputScalar("Times Played",ImGuiDataType_U8,&fishSize)){ gSaveContext.highScores[i]&=~0xFF0000; gSaveContext.highScores[i]|=(fishSize) << 16; } - UIWidgets::InsertHelpHoverText("Determines weather and school size during dawn/dusk."); + Tooltip("Determines weather and school size during dawn/dusk."); + PopStyleInput(); ImGui::TreePop(); continue; } - if (i == 5) { //HS_UNK_05 is unused + if (i == 5 || i == 2) { //HS_UNK_05 is unused continue; } std::string minigameLbl = minigameHS[i]; + PushStyleInput(THEME_COLOR); ImGui::InputScalar(minigameLbl.c_str(), ImGuiDataType_S32, &gSaveContext.highScores[i], &one, NULL); + PopStyleInput(); } ImGui::TreePop(); @@ -412,14 +395,14 @@ void DrawInfoTab() { void DrawBGSItemFlag(uint8_t itemID) { const ItemMapEntry& slotEntry = itemMapping[itemID]; - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); } void DrawInventoryTab() { static bool restrictToValid = true; - ImGui::Checkbox("Restrict to valid items", &restrictToValid); - UIWidgets::InsertHelpHoverText("Restricts items and ammo to only what is possible to legally acquire in-game"); + Checkbox("Restrict to valid items", &restrictToValid, checkboxOptionsBase.Tooltip("Restricts items and ammo to only what is possible to legally acquire in-game")); for (int32_t y = 0; y < 4; y++) { for (int32_t x = 0; x < 6; x++) { @@ -433,35 +416,33 @@ void DrawInventoryTab() { ImGui::SameLine(); } - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); uint8_t item = gSaveContext.inventory.items[index]; + PushStyleButton(Colors::DarkGray); if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping.find(item)->second; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(48.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { selectedIndex = index; ImGui::OpenPopup(itemPopupPicker); } } else { - if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + if (ImGui::Button("##itemNone", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { selectedIndex = index; ImGui::OpenPopup(itemPopupPicker); } } - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); + PopStyleButton(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); if (ImGui::BeginPopup(itemPopupPicker)) { - if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) { + PushStyleButton(Colors::DarkGray); + if (ImGui::Button("##itemNonePicker", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText("None"); + PopStyleButton(); + UIWidgets::Tooltip("None"); std::vector possibleItems; if (restrictToValid) { @@ -486,15 +467,15 @@ void DrawInventoryTab() { ImGui::SameLine(); } const ItemMapEntry& slotEntry = possibleItems[pickerIndex]; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + PushStyleButton(Colors::DarkGray); auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); + PopStyleButton(); if (ret) { gSaveContext.inventory.items[selectedIndex] = slotEntry.id; ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); + UIWidgets::Tooltip(SohUtils::GetItemName(slotEntry.id).c_str()); } ImGui::EndPopup(); @@ -517,11 +498,13 @@ void DrawInventoryTab() { drawnAmmoItems++; ImGui::PushID(ammoIndex); - ImGui::PushItemWidth(32.0f); + ImGui::PushItemWidth(IMAGE_SIZE); ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[item].name), ImVec2(32.0f, 32.0f)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[item].name), ImVec2(IMAGE_SIZE, IMAGE_SIZE)); + PushStyleInput(THEME_COLOR); ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item)); + PopStyleInput(); ImGui::EndGroup(); ImGui::PopItemWidth(); @@ -548,7 +531,10 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl ImGui::PushID(flagIndex); bool hasDescription = !!flagTable.flagDescriptions.contains(row * 16 + flagIndex); uint32_t bitMask = 1 << flagIndex; - ImGui::PushStyleColor(ImGuiCol_FrameBg, hasDescription ? ImVec4(0.16f, 0.29f, 0.48f, 0.54f) : ImVec4(0.16f, 0.29f, 0.48f, 0.24f)); + ImVec4 themeColor = ColorValues.at(THEME_COLOR); + ImVec4 colorDark = { themeColor.x * 0.4f, themeColor.y * 0.4f, themeColor.z * 0.4f , themeColor.z }; + PushStyleCheckbox(hasDescription ? themeColor : colorDark); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); bool flag = (flags & bitMask) != 0; if (ImGui::Checkbox("##check", &flag)) { if (flag) { @@ -557,7 +543,8 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl flags &= ~bitMask; } } - ImGui::PopStyleColor(); + ImGui::PopStyleVar(); + PopStyleCheckbox(); if (ImGui::IsItemHovered() && hasDescription) { ImGui::BeginTooltip(); ImGui::Text("%s", UIWidgets::WrappedText(flagTable.flagDescriptions.at(row * 16 + flagIndex), 60).c_str()); @@ -575,165 +562,154 @@ void DrawFlagsTab() { DrawGroupWithBorder([&]() { ImGui::Text("stateFlags1"); - UIWidgets::DrawFlagArray32("stateFlags1", player->stateFlags1); - }); + DrawFlagArray32("stateFlags1", player->stateFlags1, THEME_COLOR); + }, "stateFlags1"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("stateFlags2"); - UIWidgets::DrawFlagArray32("stateFlags2", player->stateFlags2); - }); + DrawFlagArray32("stateFlags2", player->stateFlags2, THEME_COLOR); + }, "stateFlags2"); DrawGroupWithBorder([&]() { ImGui::Text("stateFlags3"); - UIWidgets::DrawFlagArray8("stateFlags3", player->stateFlags3); - }); + DrawFlagArray8("stateFlags3", player->stateFlags3, THEME_COLOR); + }, "stateFlags3"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("unk_6AE_rotFlags"); - UIWidgets::DrawFlagArray16("unk_6AE_rotFlags", player->unk_6AE_rotFlags); - }); + DrawFlagArray16("unk_6AE_rotFlags", player->unk_6AE_rotFlags, THEME_COLOR); + }, "unk_6AE_rotFlags"); } ImGui::TreePop(); } if (ImGui::TreeNode("Current Scene")) { if (gPlayState != nullptr) { ActorContext* act = &gPlayState->actorCtx; - DrawGroupWithBorder([&]() { ImGui::Text("Switch"); - UIWidgets::InsertHelpHoverText("Permanently-saved switch flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Switch")) { + InsertHelpHoverText("Permanently-saved switch flags"); + if (Button("Set All##Switch", buttonOptionsBase.Tooltip(""))) { act->flags.swch = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Switch")) { + if (Button("Clear All##Switch", buttonOptionsBase.Tooltip(""))) { act->flags.swch = 0; } - UIWidgets::DrawFlagArray32("Switch", act->flags.swch); - }); + DrawFlagArray32("Switch", act->flags.swch, THEME_COLOR); + }, "Switch"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Temp Switch"); - UIWidgets::InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Temp Switch")) { + InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); + if (Button("Set All##Temp Switch", buttonOptionsBase.Tooltip(""))) { act->flags.tempSwch = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Temp Switch")) { + if (Button("Clear All##Temp Switch", buttonOptionsBase.Tooltip(""))) { act->flags.tempSwch = 0; } - UIWidgets::DrawFlagArray32("Temp Switch", act->flags.tempSwch); - }); + DrawFlagArray32("Temp Switch", act->flags.tempSwch, THEME_COLOR); + }, "Temp Switch"); DrawGroupWithBorder([&]() { ImGui::Text("Clear"); - UIWidgets::InsertHelpHoverText("Permanently-saved room-clear flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Clear")) { + InsertHelpHoverText("Permanently-saved room-clear flags"); + if (Button("Set All##Clear", buttonOptionsBase.Tooltip(""))) { act->flags.clear = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Clear")) { + if (Button("Clear All##Clear", buttonOptionsBase.Tooltip(""))) { act->flags.clear = 0; } - UIWidgets::DrawFlagArray32("Clear", act->flags.clear); - }); + DrawFlagArray32("Clear", act->flags.clear, THEME_COLOR); + }, "Clear"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Temp Clear"); - UIWidgets::InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Temp Clear")) { + InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); + if (Button("Set All##Temp Clear", buttonOptionsBase.Tooltip(""))) { act->flags.tempClear = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Temp Clear")) { + if (Button("Clear All##Temp Clear", buttonOptionsBase.Tooltip(""))) { act->flags.tempClear = 0; } - UIWidgets::DrawFlagArray32("Temp Clear", act->flags.tempClear); - }); + DrawFlagArray32("Temp Clear", act->flags.tempClear, THEME_COLOR); + }, "Temp Clear"); DrawGroupWithBorder([&]() { ImGui::Text("Collect"); - UIWidgets::InsertHelpHoverText("Permanently-saved collect flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Collect")) { + InsertHelpHoverText("Permanently-saved collect flags"); + if (Button("Set All##Collect", buttonOptionsBase.Tooltip(""))) { act->flags.collect = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Collect")) { + if (Button("Clear All##Collect", buttonOptionsBase.Tooltip(""))) { act->flags.collect = 0; } - UIWidgets::DrawFlagArray32("Collect", act->flags.collect); - }); + DrawFlagArray32("Collect", act->flags.collect, THEME_COLOR); + }, "Collect"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Temp Collect"); - UIWidgets::InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Temp Collect")) { + InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); + if (Button("Set All##Temp Collect", buttonOptionsBase.Tooltip(""))) { act->flags.tempCollect = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Temp Collect")) { + if (Button("Clear All##Temp Collect", buttonOptionsBase.Tooltip(""))) { act->flags.tempCollect = 0; } - UIWidgets::DrawFlagArray32("Temp Collect", act->flags.tempCollect); - }); + DrawFlagArray32("Temp Collect", act->flags.tempCollect, THEME_COLOR); + }, "Temp Collect"); DrawGroupWithBorder([&]() { ImGui::Text("Chest"); - UIWidgets::InsertHelpHoverText("Permanently-saved chest flags"); - ImGui::SameLine(); - if (ImGui::Button("Set All##Chest")) { + InsertHelpHoverText("Permanently-saved chest flags"); + if (Button("Set All##Chest", buttonOptionsBase.Tooltip(""))) { act->flags.chest = UINT32_MAX; } ImGui::SameLine(); - if (ImGui::Button("Clear All##Chest")) { + if (Button("Clear All##Chest", buttonOptionsBase.Tooltip(""))) { act->flags.chest = 0; } - UIWidgets::DrawFlagArray32("Chest", act->flags.chest); - }); + DrawFlagArray32("Chest", act->flags.chest, THEME_COLOR); + }, "Chest"); ImGui::SameLine(); ImGui::BeginGroup(); - if (ImGui::Button("Reload Flags")) { + if (Button("Reload Flags", buttonOptionsBase.Tooltip("Load flags from saved scene flags. Normally happens on scene load"))) { act->flags.swch = gSaveContext.sceneFlags[gPlayState->sceneNum].swch; act->flags.clear = gSaveContext.sceneFlags[gPlayState->sceneNum].clear; act->flags.collect = gSaveContext.sceneFlags[gPlayState->sceneNum].collect; act->flags.chest = gSaveContext.sceneFlags[gPlayState->sceneNum].chest; } - UIWidgets::SetLastItemHoverText("Load flags from saved scene flags. Normally happens on scene load"); - if (ImGui::Button("Save Flags")) { + if (Button("Save Flags", buttonOptionsBase.Tooltip("Save current scene flags. Normally happens on scene exit"))) { gSaveContext.sceneFlags[gPlayState->sceneNum].swch = act->flags.swch; gSaveContext.sceneFlags[gPlayState->sceneNum].clear = act->flags.clear; gSaveContext.sceneFlags[gPlayState->sceneNum].collect = act->flags.collect; gSaveContext.sceneFlags[gPlayState->sceneNum].chest = act->flags.chest; } - UIWidgets::SetLastItemHoverText("Save current scene flags. Normally happens on scene exit"); - if (ImGui::Button("Clear Flags")) { + if (Button("Clear Flags", buttonOptionsBase.Tooltip("Clear current scene flags. Reload scene to see changes"))) { act->flags.swch = 0; act->flags.clear = 0; act->flags.collect = 0; act->flags.chest = 0; } - UIWidgets::SetLastItemHoverText("Clear current scene flags. Reload scene to see changes"); ImGui::EndGroup(); @@ -746,8 +722,10 @@ void DrawFlagsTab() { if (ImGui::TreeNode("Saved Scene Flags")) { static uint32_t selectedSceneFlagMap = 0; + ImGui::AlignTextToFramePadding(); ImGui::Text("Map"); ImGui::SameLine(); + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##Map", SohUtils::GetSceneName(selectedSceneFlagMap).c_str())) { for (int32_t sceneIndex = 0; sceneIndex < SCENE_ID_MAX; sceneIndex++) { if (ImGui::Selectable(SohUtils::GetSceneName(sceneIndex).c_str())) { @@ -757,77 +735,68 @@ void DrawFlagsTab() { ImGui::EndCombo(); } + PopStyleCombobox(); // Don't show current scene button if there is no current scene if (gPlayState != nullptr) { ImGui::SameLine(); - if (ImGui::Button("Current")) { + if (Button("Current", buttonOptionsBase.Tooltip("Open flags for current scene"))) { selectedSceneFlagMap = gPlayState->sceneNum; } - UIWidgets::SetLastItemHoverText("Open flags for current scene"); } DrawGroupWithBorder([&]() { ImGui::Text("Switch"); - UIWidgets::InsertHelpHoverText("Switch flags"); - UIWidgets::DrawFlagArray32("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch); - }); + InsertHelpHoverText("Switch flags"); + DrawFlagArray32("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch, THEME_COLOR); + }, "Saved Switch"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Clear"); - UIWidgets::InsertHelpHoverText("Room-clear flags"); - UIWidgets::DrawFlagArray32("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear); - }); + InsertHelpHoverText("Room-clear flags"); + DrawFlagArray32("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear, THEME_COLOR); + }, "Saved Clear"); DrawGroupWithBorder([&]() { ImGui::Text("Collect"); - UIWidgets::InsertHelpHoverText("Collect flags"); - UIWidgets::DrawFlagArray32("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect); - }); + InsertHelpHoverText("Collect flags"); + DrawFlagArray32("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect, THEME_COLOR); + }, "Saved Collect"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Chest"); - UIWidgets::InsertHelpHoverText("Chest flags"); - UIWidgets::DrawFlagArray32("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest); - }); + InsertHelpHoverText("Chest flags"); + DrawFlagArray32("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest, THEME_COLOR); + }, "Saved Chest"); DrawGroupWithBorder([&]() { ImGui::Text("Rooms"); - UIWidgets::InsertHelpHoverText("Flags for visted rooms"); - UIWidgets::DrawFlagArray32("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms); - }); + InsertHelpHoverText("Flags for visted rooms"); + DrawFlagArray32("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms, THEME_COLOR); + }, "Saved Rooms"); ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Floors"); - UIWidgets::InsertHelpHoverText("Flags for visted floors"); - UIWidgets::DrawFlagArray32("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors); - }); + InsertHelpHoverText("Flags for visted floors"); + DrawFlagArray32("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors, THEME_COLOR); + }, "Saved Floors"); ImGui::TreePop(); } DrawGroupWithBorder([&]() { - static uint32_t selectedGsMap = 0; + size_t selectedGsMap = 0; ImGui::Text("Gold Skulltulas"); - ImGui::Text("Map"); - ImGui::SameLine(); - if (ImGui::BeginCombo("##Gold Skulltula Map", gsMapping[selectedGsMap].c_str())) { - for (int32_t gsIndex = 0; gsIndex < gsMapping.size(); gsIndex++) { - if (ImGui::Selectable(gsMapping[gsIndex].c_str())) { - selectedGsMap = gsIndex; - } - } - - ImGui::EndCombo(); - } + Combobox("Map##Gold Skulltulas", &selectedGsMap, gsMapping, comboboxOptionsBase.Tooltip("")); // TODO We should write out descriptions for each one... ugh + ImGui::AlignTextToFramePadding(); ImGui::Text("Flags"); uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); uint32_t allFlags = gAreaGsFlags[selectedGsMap]; @@ -838,6 +807,8 @@ void DrawFlagsTab() { ImGui::SameLine(); ImGui::PushID(allFlags); + PushStyleCheckbox(THEME_COLOR); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); if (ImGui::Checkbox("##gs", &isThisSet)) { if (isThisSet) { SET_GS_FLAGS(selectedGsMap, setMask); @@ -848,6 +819,8 @@ void DrawFlagsTab() { SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); } } + ImGui::PopStyleVar(); + PopStyleCheckbox(); ImGui::PopID(); @@ -860,8 +833,8 @@ void DrawFlagsTab() { // GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected. if (!(IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS) != RO_TOKENSANITY_OFF)) { static bool keepGsCountUpdated = true; - ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); - UIWidgets::InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags."); + Checkbox("Keep GS Count Updated", &keepGsCountUpdated, + checkboxOptionsBase.Tooltip("Automatically adjust the number of gold skulltula tokens acquired based on set flags.")); int32_t gsCount = 0; if (keepGsCountUpdated) { for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { @@ -870,7 +843,7 @@ void DrawFlagsTab() { gSaveContext.inventory.gsTokens = gsCount; } } - }); + }, "Gold Skulltulas"); for (int i = 0; i < flagTables.size(); i++) { const FlagTable& flagTable = flagTables[i]; @@ -899,7 +872,7 @@ void DrawFlagsTab() { DrawFlagTableArray16(flagTable, j, gSaveContext.ship.randomizerInf[j]); break; } - }); + }, flagTable.name); } // make some buttons to help with fishsanity debugging @@ -941,6 +914,8 @@ void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std: ImGui::Text("%s", categoryName.c_str()); ImGui::SameLine(); ImGui::PushID(categoryName.c_str()); + PushStyleCombobox(THEME_COLOR); + ImGui::AlignTextToFramePadding(); if (ImGui::BeginCombo("##upgrade", names[CUR_UPG_VALUE(categoryId)].c_str())) { for (int32_t i = 0; i < names.size(); i++) { if (ImGui::Selectable(names[i].c_str())) { @@ -950,8 +925,9 @@ void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std: ImGui::EndCombo(); } + PopStyleCombobox(); ImGui::PopID(); - UIWidgets::SetLastItemHoverText(categoryName.c_str()); + UIWidgets::Tooltip(categoryName.c_str()); } // Draws a combo that lets you choose and upgrade value from a popup grid of icons @@ -959,59 +935,50 @@ void DrawUpgradeIcon(const std::string& categoryName, int32_t categoryId, const static const char* upgradePopupPicker = "upgradePopupPicker"; ImGui::PushID(categoryName.c_str()); - - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + + PushStyleButton(Colors::DarkGray); uint8_t item = items[CUR_UPG_VALUE(categoryId)]; if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping[item]; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); - if (ret) { + if (ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1))) { ImGui::OpenPopup(upgradePopupPicker); } } else { - if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) { + if (ImGui::Button("##itemNone", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { ImGui::OpenPopup(upgradePopupPicker); } } - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(categoryName.c_str()); + PopStyleButton(); + Tooltip(categoryName.c_str()); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); if (ImGui::BeginPopup(upgradePopupPicker)) { for (int32_t pickerIndex = 0; pickerIndex < items.size(); pickerIndex++) { if ((pickerIndex % 8) != 0) { ImGui::SameLine(); } - + + PushStyleButton(Colors::DarkGray); if (items[pickerIndex] == ITEM_NONE) { - if (ImGui::Button("##upgradePopupPicker", ImVec2(32.0f, 32.0f))) { + if (ImGui::Button("##upgradePopupPicker", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { Inventory_ChangeUpgrade(categoryId, pickerIndex); ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText("None"); + Tooltip("None"); } else { const ItemMapEntry& slotEntry = itemMapping[items[pickerIndex]]; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { Inventory_ChangeUpgrade(categoryId, pickerIndex); ImGui::CloseCurrentPopup(); } - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id)); + Tooltip(SohUtils::GetItemName(slotEntry.id).c_str()); } + PopStyleButton(); } - ImGui::EndPopup(); } - ImGui::PopStyleVar(); - ImGui::PopID(); } @@ -1035,11 +1002,9 @@ void DrawEquipmentTab() { uint32_t bitMask = 1 << i; bool hasEquip = (bitMask & gSaveContext.inventory.equipment) != 0; const ItemMapEntry& entry = itemMapping[equipmentValues[i]]; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + PushStyleButton(Colors::DarkGray); auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasEquip ? entry.name : entry.nameFaded), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasEquip) { gSaveContext.inventory.equipment &= ~bitMask; @@ -1047,9 +1012,9 @@ void DrawEquipmentTab() { gSaveContext.inventory.equipment |= bitMask; } } - ImGui::PopStyleColor(); + PopStyleButton(); + Tooltip(SohUtils::GetItemName(entry.id).c_str()); ImGui::PopID(); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(entry.id)); } const std::vector bulletBagValues = { @@ -1137,11 +1102,9 @@ void DrawQuestItemButton(uint32_t item) { const QuestMapEntry& entry = questMapping[item]; uint32_t bitMask = 1 << entry.id; bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + PushStyleButton(Colors::DarkGray); auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasQuestItem) { gSaveContext.inventory.questItems &= ~bitMask; @@ -1149,8 +1112,8 @@ void DrawQuestItemButton(uint32_t item) { gSaveContext.inventory.questItems |= bitMask; } } - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + PopStyleButton(); + Tooltip(SohUtils::GetQuestItemName(entry.id).c_str()); } // Draws a toggleable icon for a dungeon item that is faded when disabled @@ -1158,11 +1121,9 @@ void DrawDungeonItemButton(uint32_t item, uint32_t scene) { const ItemMapEntry& entry = itemMapping[item]; uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + PushStyleButton(Colors::DarkGray); auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem ? entry.name : entry.nameFaded), - ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasItem) { gSaveContext.inventory.dungeonItems[scene] &= ~bitMask; @@ -1170,12 +1131,11 @@ void DrawDungeonItemButton(uint32_t item, uint32_t scene) { gSaveContext.inventory.dungeonItems[scene] |= bitMask; } } - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + PopStyleButton(); + Tooltip(SohUtils::GetItemName(entry.id).c_str()); } void DrawQuestStatusTab() { - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); for (int32_t i = QUEST_MEDALLION_FOREST; i < QUEST_MEDALLION_LIGHT + 1; i++) { if (i != QUEST_MEDALLION_FOREST) { @@ -1193,14 +1153,13 @@ void DrawQuestStatusTab() { // Put Stone of Agony and Gerudo Card on the same line with a little space between them ImGui::SameLine(); - ImGui::Dummy(ImVec2(20, 0)); + ImGui::Dummy(ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2); ImGui::SameLine(); DrawQuestItemButton(QUEST_STONE_OF_AGONY); ImGui::SameLine(); DrawQuestItemButton(QUEST_GERUDO_CARD); - for (const auto& [quest, entry] : songMapping) { if ((entry.id != QUEST_SONG_MINUET) && (entry.id != QUEST_SONG_LULLABY)) { ImGui::SameLine(); @@ -1208,11 +1167,9 @@ void DrawQuestStatusTab() { uint32_t bitMask = 1 << entry.id; bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + PushStyleButton(Colors::DarkGray); auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), - ImVec2(16.0f, 24.0f), ImVec2(0, 0), ImVec2(1, 1)); - ImGui::PopStyleVar(); + ImVec2(32.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasQuestItem) { gSaveContext.inventory.questItems &= ~bitMask; @@ -1220,25 +1177,28 @@ void DrawQuestStatusTab() { gSaveContext.inventory.questItems |= bitMask; } } - ImGui::PopStyleColor(); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + PopStyleButton(); + Tooltip(SohUtils::GetQuestItemName(entry.id).c_str()); } + PushStyleInput(THEME_COLOR); ImGui::InputScalar("GS Count", ImGuiDataType_S16, &gSaveContext.inventory.gsTokens); - UIWidgets::InsertHelpHoverText("Number of gold skulltula tokens aquired"); + PopStyleInput(); + InsertHelpHoverText("Number of gold skulltula tokens aquired"); uint32_t bitMask = 1 << QUEST_SKULL_TOKEN; bool gsUnlocked = (bitMask & gSaveContext.inventory.questItems) != 0; - if (ImGui::Checkbox("GS unlocked", &gsUnlocked)) { + if (Checkbox("GS unlocked", &gsUnlocked, CheckboxOptions().Color(THEME_COLOR))) { if (gsUnlocked) { gSaveContext.inventory.questItems |= bitMask; } else { gSaveContext.inventory.questItems &= ~bitMask; } } - UIWidgets::InsertHelpHoverText("If unlocked, enables showing the gold skulltula count in the quest status menu"); + InsertHelpHoverText("If unlocked, enables showing the gold skulltula count in the quest status menu"); int32_t pohCount = (gSaveContext.inventory.questItems & 0xF0000000) >> 28; + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("PoH count", std::to_string(pohCount).c_str())) { for (int32_t i = 0; i < 4; i++) { if (ImGui::Selectable(std::to_string(i).c_str(), pohCount == i)) { @@ -1248,13 +1208,14 @@ void DrawQuestStatusTab() { } ImGui::EndCombo(); } - UIWidgets::InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container"); + InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container"); + PopStyleCombobox(); DrawGroupWithBorder([&]() { ImGui::Text("Dungeon Items"); static int32_t dungeonItemsScene = SCENE_DEKU_TREE; - ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) { for (int32_t dungeonIndex = SCENE_DEKU_TREE; dungeonIndex < SCENE_JABU_JABU_BOSS + 1; dungeonIndex++) { if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(), @@ -1265,7 +1226,7 @@ void DrawQuestStatusTab() { ImGui::EndCombo(); } - ImGui::PopItemWidth(); + PopStyleCombobox(); DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene); ImGui::SameLine(); @@ -1277,16 +1238,17 @@ void DrawQuestStatusTab() { float lineHeight = ImGui::GetTextLineHeightWithSpacing(); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[ITEM_KEY_SMALL].name), ImVec2(lineHeight, lineHeight)); ImGui::SameLine(); + PushStyleInput(THEME_COLOR); if (ImGui::InputScalar("##Keys", ImGuiDataType_S8, gSaveContext.inventory.dungeonKeys + dungeonItemsScene)) { gSaveContext.ship.stats.dungeonKeys[dungeonItemsScene] = gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; }; + PopStyleInput(); } else { // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene (Barinade's Lair) ImGui::Text("Barinade's Lair does not have small keys"); } - }); + }, "Dungeon Items"); - ImGui::PopItemWidth(); } void DrawPlayerTab() { @@ -1364,50 +1326,53 @@ void DrawPlayerTab() { } ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); DrawGroupWithBorder([&]() { ImGui::Text("Link's Position"); - ImGui::InputScalar("X Pos", ImGuiDataType_Float, &player->actor.world.pos.x); - ImGui::SameLine(); - ImGui::InputScalar("Y Pos", ImGuiDataType_Float, &player->actor.world.pos.y); - ImGui::SameLine(); - ImGui::InputScalar("Z Pos", ImGuiDataType_Float, &player->actor.world.pos.z); - }); - + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##Pos", ImGuiDataType_Float, &player->actor.world.pos.x); + ImGui::InputScalar("Y##Pos", ImGuiDataType_Float, &player->actor.world.pos.y); + ImGui::InputScalar("Z##Pos", ImGuiDataType_Float, &player->actor.world.pos.z); + ImGui::PopItemWidth(); + }, "Link's Position"); + ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Link's Rotation"); - UIWidgets::InsertHelpHoverText("For Link's rotation in relation to the world"); - ImGui::InputScalar("X Rot", ImGuiDataType_S16, &player->actor.world.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("Y Rot", ImGuiDataType_S16, &player->actor.world.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("Z Rot", ImGuiDataType_S16, &player->actor.world.rot.z); - }); - + InsertHelpHoverText("For Link's rotation in relation to the world"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##Rot", ImGuiDataType_S16, &player->actor.world.rot.x); + ImGui::InputScalar("Y##Rot", ImGuiDataType_S16, &player->actor.world.rot.y); + ImGui::InputScalar("Z##Rot", ImGuiDataType_S16, &player->actor.world.rot.z); + ImGui::PopItemWidth(); + }, "Link's Rotation"); + ImGui::SameLine(); DrawGroupWithBorder([&]() { ImGui::Text("Link's Model Rotation"); - UIWidgets::InsertHelpHoverText("For Link's actual model"); - ImGui::InputScalar("X ModRot", ImGuiDataType_S16, &player->actor.shape.rot.x); - ImGui::SameLine(); - ImGui::InputScalar("Y ModRot", ImGuiDataType_S16, &player->actor.shape.rot.y); - ImGui::SameLine(); - ImGui::InputScalar("Z ModRot", ImGuiDataType_S16, &player->actor.shape.rot.z); - }); + InsertHelpHoverText("For Link's actual model"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.x); + ImGui::InputScalar("Y##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.y); + ImGui::InputScalar("Z##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.z); + ImGui::PopItemWidth(); + }, "Link's Model Rotation"); ImGui::InputScalar("Linear Velocity", ImGuiDataType_Float, &player->linearVelocity); - UIWidgets::InsertHelpHoverText("Link's speed along the XZ plane"); + InsertHelpHoverText("Link's speed along the XZ plane"); ImGui::InputScalar("Y Velocity", ImGuiDataType_Float, &player->actor.velocity.y); - UIWidgets::InsertHelpHoverText("Link's speed along the Y plane. Caps at -20"); + InsertHelpHoverText("Link's speed along the Y plane. Caps at -20"); ImGui::InputScalar("Wall Height", ImGuiDataType_Float, &player->yDistToLedge); - UIWidgets::InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top"); + InsertHelpHoverText("Height used to determine whether Link can climb or grab a ledge at the top"); ImGui::InputScalar("Invincibility Timer", ImGuiDataType_S8, &player->invincibilityTimer); - UIWidgets::InsertHelpHoverText("Can't take damage while this is nonzero"); + InsertHelpHoverText("Can't take damage while this is nonzero"); ImGui::InputScalar("Gravity", ImGuiDataType_Float, &player->actor.gravity); - UIWidgets::InsertHelpHoverText("Rate at which Link falls. Default -4.0f"); + InsertHelpHoverText("Rate at which Link falls. Default -4.0f"); + PopStyleInput(); + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Link Age on Load", gPlayState->linkAgeOnLoad == 0 ? "Adult" : "Child")) { if (ImGui::Selectable("Adult")) { gPlayState->linkAgeOnLoad = 0; @@ -1417,132 +1382,140 @@ void DrawPlayerTab() { } ImGui::EndCombo(); } - - UIWidgets::InsertHelpHoverText("This will change Link's age when you load a map"); - + InsertHelpHoverText("This will change Link's age when you load a map"); + PopStyleCombobox(); ImGui::Separator(); - ImGui::Text("Link's Current Equipment"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 15); - if (ImGui::BeginCombo("Sword", curSword)) { - if (ImGui::Selectable("None")) { - player->currentSwordItemId = ITEM_NONE; - gSaveContext.equips.buttonItems[0] = ITEM_NONE; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE); - } - if (ImGui::Selectable("Kokiri Sword")) { - player->currentSwordItemId = ITEM_SWORD_KOKIRI; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); - } - if (ImGui::Selectable("Master Sword")) { - player->currentSwordItemId = ITEM_SWORD_MASTER; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); - } - if (ImGui::Selectable("Biggoron's Sword")) { - if (gSaveContext.bgsFlag) { - if (gSaveContext.swordHealth < 8) { - gSaveContext.swordHealth = 8; - } - player->currentSwordItemId = ITEM_SWORD_BGS; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; - } else { - if (gSaveContext.swordHealth < 8) { - gSaveContext.swordHealth = 8; - } - player->currentSwordItemId = ITEM_SWORD_BGS; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; + DrawGroupWithBorder([&]() { + PushStyleCombobox(THEME_COLOR); + ImGui::Text("Link's Current Equipment"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + if (ImGui::BeginCombo("Sword", curSword)) { + if (ImGui::Selectable("None")) { + player->currentSwordItemId = ITEM_NONE; + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE); } - - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON); - } - if (ImGui::Selectable("Fishing Pole")) { - player->currentSwordItemId = ITEM_FISHING_POLE; - gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); - } - ImGui::EndCombo(); + if (ImGui::Selectable("Kokiri Sword")) { + player->currentSwordItemId = ITEM_SWORD_KOKIRI; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); + } + if (ImGui::Selectable("Master Sword")) { + player->currentSwordItemId = ITEM_SWORD_MASTER; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + } + if (ImGui::Selectable("Biggoron's Sword")) { + if (gSaveContext.bgsFlag) { + if (gSaveContext.swordHealth < 8) { + gSaveContext.swordHealth = 8; + } + player->currentSwordItemId = ITEM_SWORD_BGS; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; + } + else { + if (gSaveContext.swordHealth < 8) { + gSaveContext.swordHealth = 8; + } + player->currentSwordItemId = ITEM_SWORD_BGS; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; + } - } - if (ImGui::BeginCombo("Shield", curShield)) { - if (ImGui::Selectable("None")) { - player->currentShield = PLAYER_SHIELD_NONE; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); - } - if (ImGui::Selectable("Deku Shield")) { - player->currentShield = PLAYER_SHIELD_DEKU; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); - } - if (ImGui::Selectable("Hylian Shield")) { - player->currentShield = PLAYER_SHIELD_HYLIAN; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN); - } - if (ImGui::Selectable("Mirror Shield")) { - player->currentShield = PLAYER_SHIELD_MIRROR; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR); - } - ImGui::EndCombo(); - } + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON); + } + if (ImGui::Selectable("Fishing Pole")) { + player->currentSwordItemId = ITEM_FISHING_POLE; + gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + } + ImGui::EndCombo(); - if (ImGui::BeginCombo("Tunic", curTunic)) { - if (ImGui::Selectable("Kokiri Tunic")) { - player->currentTunic = PLAYER_TUNIC_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); } - if (ImGui::Selectable("Goron Tunic")) { - player->currentTunic = PLAYER_TUNIC_GORON; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON); + if (ImGui::BeginCombo("Shield", curShield)) { + if (ImGui::Selectable("None")) { + player->currentShield = PLAYER_SHIELD_NONE; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); + } + if (ImGui::Selectable("Deku Shield")) { + player->currentShield = PLAYER_SHIELD_DEKU; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); + } + if (ImGui::Selectable("Hylian Shield")) { + player->currentShield = PLAYER_SHIELD_HYLIAN; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN); + } + if (ImGui::Selectable("Mirror Shield")) { + player->currentShield = PLAYER_SHIELD_MIRROR; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR); + } + ImGui::EndCombo(); } - if (ImGui::Selectable("Zora Tunic")) { - player->currentTunic = PLAYER_TUNIC_ZORA; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA); - } - ImGui::EndCombo(); - } - if (ImGui::BeginCombo("Boots", curBoots)) { - if (ImGui::Selectable("Kokiri Boots")) { - player->currentBoots = PLAYER_BOOTS_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); + if (ImGui::BeginCombo("Tunic", curTunic)) { + if (ImGui::Selectable("Kokiri Tunic")) { + player->currentTunic = PLAYER_TUNIC_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); + } + if (ImGui::Selectable("Goron Tunic")) { + player->currentTunic = PLAYER_TUNIC_GORON; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON); + } + if (ImGui::Selectable("Zora Tunic")) { + player->currentTunic = PLAYER_TUNIC_ZORA; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA); + } + ImGui::EndCombo(); } - if (ImGui::Selectable("Iron Boots")) { - player->currentBoots = PLAYER_BOOTS_IRON; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON); + + if (ImGui::BeginCombo("Boots", curBoots)) { + if (ImGui::Selectable("Kokiri Boots")) { + player->currentBoots = PLAYER_BOOTS_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); + } + if (ImGui::Selectable("Iron Boots")) { + player->currentBoots = PLAYER_BOOTS_IRON; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON); + } + if (ImGui::Selectable("Hover Boots")) { + player->currentBoots = PLAYER_BOOTS_HOVER; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER); + } + ImGui::EndCombo(); } - if (ImGui::Selectable("Hover Boots")) { - player->currentBoots = PLAYER_BOOTS_HOVER; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER); - } - ImGui::EndCombo(); - } + ImGui::PopItemWidth(); + PopStyleCombobox(); + }, "Current Equipment"); + ImGui::SameLine(); ImU16 one = 1; - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); DrawGroupWithBorder([&]() { - ImGui::Text("Current B Item"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Current Items"); ImGui::InputScalar("B Button", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[0], &one, NULL); - ImGui::NewLine(); - - ImGui::Text("Current C Equips"); ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL); - ImGui::SameLine(); ImGui::InputScalar("C Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[2], &one, NULL); - ImGui::SameLine(); ImGui::InputScalar("C Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[3], &one, NULL); - - if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0)) { - ImGui::NewLine(); - ImGui::Text("Current D-pad Equips"); - ImGui::InputScalar("D-pad Up ", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[4], &one, NULL); // Two spaces at the end for aligning, not elegant but it's working - ImGui::SameLine(); + PopStyleInput(); + ImGui::PopItemWidth(); + }, "Current Items"); + + if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0)) { + ImGui::SameLine(); + DrawGroupWithBorder([&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Current D-pad Items"); + // Two spaces at the end for aligning, not elegant but it's working + ImGui::InputScalar("D-pad Up ", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[4], &one, NULL); ImGui::InputScalar("D-pad Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[5], &one, NULL); - // Intentionnal to not put everything on the same line, else it's taking too much for lower resolution. ImGui::InputScalar("D-pad Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[6], &one, NULL); - ImGui::SameLine(); ImGui::InputScalar("D-pad Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[7], &one, NULL); - } - }); + PopStyleInput(); + ImGui::PopItemWidth(); + }, "Current D-pad Items"); + } ImGui::Text("Player State"); uint8_t bit[32] = {}; @@ -1550,8 +1523,9 @@ void DrawPlayerTab() { std::vector> flag_strs = { state1, state2, state3 }; for (int j = 0; j <= 2; j++) { + std::string label = fmt::format("State Flags {}", j + 1); DrawGroupWithBorder([&]() { - ImGui::Text("State Flags %d", j + 1); + ImGui::Text("%s", label.c_str()); std::vector state = flag_strs[j]; for (int i = 0; i <= 31; i++) { bit[i] = ((flags[j] >> i) & 1); @@ -1559,46 +1533,60 @@ void DrawPlayerTab() { ImGui::Text("%s", state[i].c_str()); } } - }); + }, label.c_str()); ImGui::SameLine(); } DrawGroupWithBorder([&]() { ImGui::Text("Sword"); ImGui::Text(" %d", player->meleeWeaponState); - }); + }, "Sword"); } else { ImGui::Text("Global Context needed for player info!"); } } +void ResetBaseOptions() { + intSliderOptionsBase.Color(THEME_COLOR).Size({320.0f, 0.0f}).Tooltip(""); + buttonOptionsBase.Color(THEME_COLOR).Size(Sizes::Inline).Tooltip(""); + checkboxOptionsBase.Color(THEME_COLOR).Tooltip(""); + comboboxOptionsBase.Color(THEME_COLOR).ComponentAlignment(ComponentAlignment::Left).LabelPosition(LabelPosition::Near).Tooltip(""); +} + void SaveEditorWindow::DrawElement() { + PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { + ResetBaseOptions(); if (ImGui::BeginTabItem("Info")) { DrawInfoTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Inventory")) { DrawInventoryTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Flags")) { DrawFlagsTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Equipment")) { DrawEquipmentTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Quest Status")) { DrawQuestStatusTab(); ImGui::EndTabItem(); } + ResetBaseOptions(); if (ImGui::BeginTabItem("Player")) { DrawPlayerTab(); ImGui::EndTabItem(); @@ -1606,6 +1594,7 @@ void SaveEditorWindow::DrawElement() { ImGui::EndTabBar(); } + PopStyleTabs(); } void SaveEditorWindow::InitElement() {} diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index 4f4d13bff..1459d2809 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -1,6 +1,7 @@ #include "actorViewer.h" #include "soh/util.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "ResourceManager.h" #include "DisplayList.h" #include "soh/OTRGlobals.h" @@ -90,11 +91,14 @@ void PerformDisplayListSearch() { } void DLViewerWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); // Debounce the search field as listing otr files is expensive + UIWidgets::PushStyleInput(THEME_COLOR); if (ImGui::InputText("Search Display Lists", searchString, ARRAY_COUNT(searchString))) { doSearch = true; searchDebounceFrames = 30; } + UIWidgets::PopStyleInput(); if (doSearch) { if (searchDebounceFrames == 0) { @@ -105,6 +109,7 @@ void DLViewerWindow::DrawElement() { searchDebounceFrames--; } + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Active Display List", activeDisplayList.c_str())) { for (size_t i = 0; i < displayListSearchResults.size(); i++) { if (ImGui::Selectable(displayListSearchResults[i].c_str())) { @@ -114,8 +119,10 @@ void DLViewerWindow::DrawElement() { } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); if (activeDisplayList == "") { + ImGui::PopFont(); return; } @@ -124,6 +131,7 @@ void DLViewerWindow::DrawElement() { if (res->GetInitData()->Type != static_cast(Fast::ResourceType::DisplayList)) { ImGui::Text("Resource type is not a Display List. Please choose another."); + ImGui::PopFont(); return; } @@ -144,6 +152,7 @@ void DLViewerWindow::DrawElement() { ImGui::SameLine(); ImGui::PushItemWidth(175.0f); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo(("CMD" + id).c_str(), cmdLabel.c_str())) { if (ImGui::Selectable("gsDPSetPrimColor") && cmd != G_SETPRIMCOLOR) { *gfx = gsDPSetPrimColor(0, 0, 0, 0, 0, 255); @@ -162,6 +171,7 @@ void DLViewerWindow::DrawElement() { } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); ImGui::PopItemWidth(); @@ -194,9 +204,11 @@ void DLViewerWindow::DrawElement() { if (cmd == G_SETGRAYSCALE) { bool* state = (bool*)&gfx->words.w1; ImGui::SameLine(); + UIWidgets::PushStyleCheckbox(THEME_COLOR); if (ImGui::Checkbox(("state" + id).c_str(), state)) { // } + UIWidgets::PopStyleCheckbox(); } if (cmd == G_SETTILE) { ImGui::SameLine(); @@ -317,8 +329,10 @@ void DLViewerWindow::DrawElement() { } } catch (const std::exception& e) { ImGui::Text("Error displaying DL instructions."); + ImGui::PopFont(); return; } + ImGui::PopFont(); } void DLViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index 7d09dfb63..40ec77f71 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -1,5 +1,6 @@ #include "valueViewer.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/OTRGlobals.h" #include "soh/ShipInit.hpp" @@ -142,13 +143,15 @@ void RegisterValueViewerHooks() { RegisterShipInitFunc initFunc(RegisterValueViewerHooks, { CVAR_NAME }); void ValueViewerWindow::DrawElement() { - UIWidgets::PaddedEnhancementCheckbox("Enable Printing", CVAR_NAME); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); + UIWidgets::CVarCheckbox("Enable Printing", CVAR_NAME, UIWidgets::CheckboxOptions().Color(THEME_COLOR)); ImGui::BeginGroup(); static int selectedElement = -1; std::string selectedElementText = (selectedElement == -1) ? "Select a value" : ( std::string(valueTable[selectedElement].name) + " (" + std::string(valueTable[selectedElement].path) + ")" ); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##valueViewerElement", selectedElementText.c_str())) { for (int i = 0; i < valueTable.size(); i++) { if (valueTable[i].isActive) continue; @@ -165,20 +168,28 @@ void ValueViewerWindow::DrawElement() { } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); ImGui::SameLine(); + UIWidgets::PushStyleButton(THEME_COLOR); if (selectedElement != -1 && ImGui::Button("+")) { valueTable[selectedElement].isActive = true; selectedElement = -1; } + UIWidgets::PopStyleButton(); ImGui::EndGroup(); for (int i = 0; i < valueTable.size(); i++) { ValueTableElement& element = valueTable[i]; if (!element.isActive || (gPlayState == NULL && element.requiresPlayState)) continue; - if (ImGui::Button(("x##" + std::string(element.name)).c_str())) { + UIWidgets::PushStyleButton(THEME_COLOR); + UIWidgets::PushStyleCheckbox(THEME_COLOR); + ImGui::AlignTextToFramePadding(); + if (ImGui::Button((ICON_FA_TIMES + std::string("##") + std::string(element.name)).c_str())) { element.isActive = false; element.isPrinted = false; } + UIWidgets::PopStyleCheckbox(); + UIWidgets::PopStyleButton(); ImGui::SameLine(); ImGui::Text("%s:", element.name); ImGui::SameLine(); @@ -212,7 +223,7 @@ void ValueViewerWindow::DrawElement() { break; } ImGui::SameLine(); - + UIWidgets::PushStyleCheckbox(THEME_COLOR); if (element.type <= TYPE_U32) { ImGui::Checkbox(("Hex##" + std::string(element.name)).c_str(), &element.typeFormat); ImGui::SameLine(); @@ -220,23 +231,30 @@ void ValueViewerWindow::DrawElement() { ImGui::Checkbox(("Trim##" + std::string(element.name)).c_str(), &element.typeFormat); ImGui::SameLine(); } + UIWidgets::PopStyleCheckbox(); ImGui::BeginGroup(); if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ValueViewerEnablePrinting"), 0)) { + UIWidgets::PushStyleCheckbox(THEME_COLOR); ImGui::Checkbox(("Print##" + std::string(element.name)).c_str(), &element.isPrinted); + UIWidgets::PopStyleCheckbox(); if (element.isPrinted) { char* prefix = (char*)element.prefix.c_str(); ImGui::SameLine(); ImGui::SetNextItemWidth(80.0f); + UIWidgets::PushStyleInput(THEME_COLOR); if (ImGui::InputText(("Prefix##" + std::string(element.name)).c_str(), prefix, 10)) { element.prefix = prefix; } + UIWidgets::PopStyleInput(); ImGui::SameLine(); ImGui::ColorEdit3(("##color" + std::string(element.name)).c_str(), (float*)&element.color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); ImGui::SameLine(); + UIWidgets::PushStyleCheckbox(THEME_COLOR); if (ImGui::Button(("Position##" + std::string(element.name)).c_str())) { ImGui::OpenPopup(("Position Picker##" + std::string(element.name)).c_str()); } + UIWidgets::PopStyleCheckbox(); if (ImGui::BeginPopup(("Position Picker##" + std::string(element.name)).c_str())) { ImGui::DragInt("X", (int*)&element.x, 1.0f, 0, 44); ImGui::DragInt("Y", (int*)&element.y, 1.0f, 0, 29); @@ -246,6 +264,7 @@ void ValueViewerWindow::DrawElement() { } ImGui::EndGroup(); } + ImGui::PopFont(); } void ValueViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index db96a7700..14228054b 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -39,7 +39,7 @@ typedef enum { MIRRORED_WORLD_ALWAYS, MIRRORED_WORLD_RANDOM, MIRRORED_WORLD_RANDOM_SEEDED, - MIRRORED_WORLD_DUNGEONS_All, + MIRRORED_WORLD_DUNGEONS_ALL, MIRRORED_WORLD_DUNGEONS_VANILLA, MIRRORED_WORLD_DUNGEONS_MQ, MIRRORED_WORLD_DUNGEONS_RANDOM, @@ -75,6 +75,18 @@ typedef enum { BONK_DAMAGE_OHKO, } BonkDamage; +typedef enum { + DAMAGE_VANILLA, + DAMAGE_DOUBLE, + DAMAGE_QUADRUPLE, + DAMAGE_OCTUPLE, + DAMAGE_FOOLISH, + DAMAGE_RIDICULOUS, + DAMAGE_MERCILESS, + DAMAGE_TORTURE, + DAMAGE_OHKO +} DamageMultType; + typedef enum { DEKU_STICK_NORMAL, DEKU_STICK_UNBREAKABLE, @@ -87,4 +99,16 @@ typedef enum { SWORD_TOGGLE_BOTH_AGES, } SwordToggleMode; +typedef enum { + TIME_TRAVEL_DISABLED, + TIME_TRAVEL_OOT, + TIME_TRAVEL_ANY +} TimeTravelType; + +typedef enum { + WATERFALL_ALWAYS, + WATERFALL_ONCE, + WATERFALL_NEVER +} SleepingWaterfallType; + #endif diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index aff0d0726..af7807b3a 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -1,11 +1,11 @@ #include "gameplaystats.h" -#include "gameplaystatswindow.h" #include "soh/SaveManager.h" #include "functions.h" #include "macros.h" #include "soh/cvar_prefixes.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "soh/util.h" #include @@ -376,14 +376,18 @@ void SaveStats(SaveContext* saveContext, int sectionID, bool fullSave) { }); } -void GameplayStatsRow(const char* label, const std::string& value, ImVec4 color = COLOR_WHITE) { +void GameplayStatsRow(const char* label, const std::string& value, ImVec4 color = COLOR_WHITE, + const char* tooltip = "") { ImGui::PushStyleColor(ImGuiCol_Text, color); ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("%s", label); - ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(value.c_str()).x - 8.0f)); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(value.c_str()).x)); ImGui::Text("%s", value.c_str()); ImGui::PopStyleColor(); + if (tooltip != "" && ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", tooltip); + } } bool compareTimestampInfoByTime(const TimestampInfo& a, const TimestampInfo& b) { @@ -527,8 +531,8 @@ void DrawGameplayStatsCountsTab() { } } } - GameplayStatsRow("Rupees Collected:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED])); - UIWidgets::Tooltip("Includes rupees collected with a full wallet."); + GameplayStatsRow("Rupees Collected:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_RUPEES_COLLECTED]), + COLOR_WHITE, "Includes rupees collected with a full wallet."); 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)); @@ -606,26 +610,34 @@ void DrawGameplayStatsBreakdownTab() { } void DrawGameplayStatsOptionsTab() { - UIWidgets::PaddedEnhancementCheckbox("Show in-game total timer", CVAR_ENHANCEMENT("GameplayStats.ShowIngameTimer"), true, false); - UIWidgets::InsertHelpHoverText("Keep track of the timer as an in-game HUD element. The position of the timer can be changed in the Cosmetics Editor."); - 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::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")); + UIWidgets::CVarCheckbox("Show in-game total timer", CVAR_ENHANCEMENT("GameplayStats.ShowIngameTimer"), + UIWidgets::CheckboxOptions() + .Tooltip("Keep track of the timer as an in-game HUD element. The position of the " + "timer can be changed in the Cosmetics Editor.") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show latest timestamps on top", CVAR_ENHANCEMENT("GameplayStats.ReverseTimestamps"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Room Breakdown", CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), + UIWidgets::CheckboxOptions() + .Tooltip("Allows a more in-depth perspective of time spent in a certain map.") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("RTA Timing on new files", CVAR_ENHANCEMENT("GameplayStats.RTATiming"), + UIWidgets::CheckboxOptions() + .Tooltip("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") + .Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show Debug Info", CVAR_ENHANCEMENT("GameplayStats.ShowDebugInfo"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); } void GameplayStatsWindow::DrawElement() { DrawGameplayStatsHeader(); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Stats", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Timestamps")) { DrawGameplayStatsTimestampsTab(); @@ -645,6 +657,7 @@ void GameplayStatsWindow::DrawElement() { } ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); ImGui::Text("Note: Gameplay stats are saved to the current file and will be\nlost if you quit without saving."); } diff --git a/soh/soh/Enhancements/gameplaystatswindow.h b/soh/soh/Enhancements/gameplaystatswindow.h index 453b24559..446cc1ef4 100644 --- a/soh/soh/Enhancements/gameplaystatswindow.h +++ b/soh/soh/Enhancements/gameplaystatswindow.h @@ -1,5 +1,4 @@ #include -#include "gameplaystats.h" class GameplayStatsWindow : public Ship::GuiWindow { public: diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index cd60f7d8c..cfcb98fa2 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -463,7 +463,7 @@ void UpdateMirrorModeState(int32_t sceneNum) { mirroredMode == MIRRORED_WORLD_ALWAYS || ((mirroredMode == MIRRORED_WORLD_RANDOM || mirroredMode == MIRRORED_WORLD_RANDOM_SEEDED) && randomMirror) || // Dungeon modes - (inDungeon && (mirroredMode == MIRRORED_WORLD_DUNGEONS_All || + (inDungeon && (mirroredMode == MIRRORED_WORLD_DUNGEONS_ALL || (mirroredMode == MIRRORED_WORLD_DUNGEONS_VANILLA && !ResourceMgr_IsSceneMasterQuest(sceneNum)) || (mirroredMode == MIRRORED_WORLD_DUNGEONS_MQ && ResourceMgr_IsSceneMasterQuest(sceneNum)) || ((mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) && randomMirror))) diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp index 2b1812d21..240d0fa81 100644 --- a/soh/soh/Enhancements/presets.cpp +++ b/soh/soh/Enhancements/presets.cpp @@ -3,8 +3,10 @@ #include #include #include -#include "soh/SohGui/UIWidgets.hpp" #include +#include "soh/SohGui/MenuTypes.h" +#include "soh/SohGui/SohMenu.h" +#include "soh/SohGui/SohGui.hpp" std::string FormatLocations(std::vector locs) { std::string locString = ""; @@ -30,6 +32,7 @@ void applyPreset(std::vector entries) { CVarSetString(cvar, std::get(value).c_str()); break; } + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } @@ -47,21 +50,22 @@ void DrawPresetSelector(PresetType presetTypeId) { comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); } - UIWidgets::PaddedText("Presets", false, true); + ImGui::Text("Presets", false, true); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##PresetsComboBox", selectedPresetDef.label)) { for ( auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter ) { if (ImGui::Selectable(iter->second.label, iter->first == selectedPresetId)) { CVarSetInteger(presetTypeCvar.c_str(), iter->first); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } ImGui::EndCombo(); } + UIWidgets::PopStyleCombobox(); UIWidgets::Tooltip(comboboxTooltip.c_str()); - UIWidgets::Spacer(0); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f)); + UIWidgets::PushStyleButton(THEME_COLOR); if (ImGui::Button(("Apply Preset##" + presetTypeCvar).c_str())) { for(const char* block : presetTypeDef.blocksToClear) { CVarClearBlock(block); @@ -75,5 +79,5 @@ void DrawPresetSelector(PresetType presetTypeId) { Rando::Settings::GetInstance()->ReloadOptions(); } } - ImGui::PopStyleVar(1); + UIWidgets::PopStyleButton(); } diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index e6c9399b5..4741d9d0c 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.cpp +++ b/soh/soh/Enhancements/randomizer/Plandomizer.cpp @@ -1,4 +1,5 @@ #include "Plandomizer.h" +#include #include "soh/SohGui/UIWidgets.hpp" #include "soh/util.h" #include @@ -836,21 +837,9 @@ void PlandomizerDrawItemSlots(uint32_t index) { void PlandomizerDrawShopSlider(uint32_t index) { ImGui::PushID(index); - ImGui::Text("Price:"); - ImGui::SameLine(); - std::string MinusBTNName = " - ##Price"; - if (ImGui::Button(MinusBTNName.c_str()) && plandoLogData[index].shopPrice > 0) { - plandoLogData[index].shopPrice--; - } - ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - 40.0f); - ImGui::SliderInt("", &plandoLogData[index].shopPrice, 0, 999, "%d Rupees"); - ImGui::PopItemWidth(); - ImGui::SameLine(); - std::string PlusBTNName = " + ##Price"; - if (ImGui::Button(PlusBTNName.c_str()) && plandoLogData[index].shopPrice < 999) { - plandoLogData[index].shopPrice++; - } + UIWidgets::SliderInt("Price:", &plandoLogData[index].shopPrice, UIWidgets::IntSliderOptions() + .Color(THEME_COLOR).Format("%d Rupees").Min(0).Max(999).LabelPosition(UIWidgets::LabelPosition::Near) + .ComponentAlignment(UIWidgets::ComponentAlignment::Right).Size(UIWidgets::Sizes::Inline)); ImGui::PopID(); } @@ -883,13 +872,13 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { ImGui::SameLine(); if (plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_NONE && plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_SOLD_OUT) { - if (ImGui::Button(randomizeButton.c_str())) { + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { plandoLogData[index].iceTrapName = GetIceTrapName(plandoLogData[index].iceTrapModel.GetRandomizerGet()).GetForLanguage(CVarGetInteger(CVAR_SETTING("Languages"), 0)).c_str(); } ImGui::SameLine(); } - if (UIWidgets::InputString("##TrapName", &trapTextInput)) { + if (UIWidgets::InputString("##TrapName", &trapTextInput, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::None))) { plandoLogData[index].iceTrapName = trapTextInput.c_str(); } @@ -900,39 +889,64 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { ImGui::PopID(); } - +static std::unordered_map rcAreaNameMap = { + { RCAREA_KOKIRI_FOREST, "Kokiri Forest" }, + { RCAREA_LOST_WOODS, "Lost Woods" }, + { RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow" }, + { RCAREA_HYRULE_FIELD, "Hyrule Field" }, + { RCAREA_LAKE_HYLIA, "Lake Hylia" }, + { RCAREA_GERUDO_VALLEY, "Gerudo Valley" }, + { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress" }, + { RCAREA_WASTELAND, "Haunted Wasteland" }, + { RCAREA_DESERT_COLOSSUS, "Desert Colossus" }, + { RCAREA_MARKET, "Hyrule Market" }, + { RCAREA_HYRULE_CASTLE, "Hyrule Castle" }, + { RCAREA_KAKARIKO_VILLAGE, "Kakariko Village" }, + { RCAREA_GRAVEYARD, "Graveyard" }, + { RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail" }, + { RCAREA_GORON_CITY, "Goron City" }, + { RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater" }, + { RCAREA_ZORAS_RIVER, "Zora's River" }, + { RCAREA_ZORAS_DOMAIN, "Zora's Domain" }, + { RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain" }, + { RCAREA_LON_LON_RANCH, "Lon Lon Ranch" }, + { RCAREA_DEKU_TREE, "Deku Tree" }, + { RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern" }, + { RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly" }, + { RCAREA_FOREST_TEMPLE, "Forest Temple" }, + { RCAREA_FIRE_TEMPLE, "Fire Temple" }, + { RCAREA_WATER_TEMPLE, "Water Temple" }, + { RCAREA_SPIRIT_TEMPLE, "Spirit Temple" }, + { RCAREA_SHADOW_TEMPLE, "Shadow Temple" }, + { RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well" }, + { RCAREA_ICE_CAVERN, "Ice Cavern" }, + { RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Ground" }, + { RCAREA_GANONS_CASTLE, "Ganon's Castle" }, + { RCAREA_INVALID, "All" }, +}; void PlandomizerDrawOptions() { if (ImGui::BeginTable("LoadSpoiler", 2)) { + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextColumn(); ImGui::SeparatorText("Load/Save Spoiler Log"); PlandomizerPopulateSeedList(); static size_t selectedList = 0; if (existingSeedList.size() != 0) { - if (ImGui::BeginCombo("##JsonFiles", existingSeedList[selectedList].c_str())) { - for (size_t i = 0; i < existingSeedList.size(); i++) { - bool isSelected = (selectedList == i); - if (ImGui::Selectable(existingSeedList[i].c_str(), isSelected)) { - selectedList = i; - } - if (isSelected) { - ImGui::SetItemDefaultFocus(); - } - } - ImGui::EndCombo(); - } + UIWidgets::Combobox("##JsonFiles", &selectedList, existingSeedList, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::None)); } else { ImGui::Text("No Spoiler Logs found."); } ImGui::BeginDisabled(existingSeedList.empty()); - if (ImGui::Button("Load")) { + if (UIWidgets::Button("Load", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { logTemp = existingSeedList[selectedList].c_str(); PlandomizerLoadSpoilerLog(logTemp.c_str()); } ImGui::EndDisabled(); ImGui::BeginDisabled(spoilerLogData.empty()); ImGui::SameLine(); - if (ImGui::Button("Save")) { + if (UIWidgets::Button("Save", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerSaveSpoilerLog(); } ImGui::EndDisabled(); @@ -1000,44 +1014,19 @@ void PlandomizerDrawOptions() { } if (getTabID == TAB_HINTS) { - if (ImGui::Button("Clear All Hints")) { + if (UIWidgets::Button("Clear All Hints", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerRemoveAllHints(); } ImGui::SameLine(); - if (ImGui::Button("Randomize All Hints")) { + if (UIWidgets::Button("Randomize All Hints", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerRandomizeHint(HINT_ALL, 0); } } if (getTabID == TAB_LOCATIONS) { if (plandoLogData.size() > 0) { - const char* comboLabel = rcAreaNames[selectedArea].c_str(); - if (selectedArea == RCAREA_INVALID) { - comboLabel = "All"; - } - ImGui::Text("Filter by Area:"); + UIWidgets::Combobox("Filter by Area:##AreaFilter", &selectedArea, rcAreaNameMap, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::Near).ComponentAlignment(UIWidgets::ComponentAlignment::Right)); ImGui::SameLine(); - ImGui::PushItemWidth(300.0f); - if (ImGui::BeginCombo("##AreaFilter", comboLabel)) { - for (const auto& [area, name] : rcAreaNames) { - bool isSelected = (selectedArea == area); - - const char* displayName = name.c_str(); - if (area == RCAREA_INVALID) { - displayName = "All"; - } - if (ImGui::Selectable(displayName, isSelected)) { - selectedArea = area; - } - if (isSelected) { - ImGui::SetItemDefaultFocus(); - } - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - - ImGui::SameLine(); - if (ImGui::Button("Empty All Rewards")) { + if (UIWidgets::Button("Empty All Rewards", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { PlandomizerRemoveAllItems(); } } @@ -1067,16 +1056,14 @@ void PlandomizerDrawHintsWindow() { } ImGui::Text("New Hint: "); ImGui::SameLine(); - if (ImGui::Button(randomizeButton.c_str())) { + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions().Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)).Size(UIWidgets::Sizes::Inline).Tooltip("Randomize Hint"))) { PlandomizerRandomizeHint(HINT_SINGLE, index); } - UIWidgets::Tooltip("Randomize Hint"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - 10); - if (UIWidgets::InputString("##HintMessage", &hintInputText)) { + if (UIWidgets::InputString("##HintMessage", &hintInputText, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::None).Tooltip(plandomizerHintsTooltip().c_str()))) { plandoHintData[index].hintText = hintInputText.c_str(); } - UIWidgets::Tooltip(plandomizerHintsTooltip().c_str()); index++; ImGui::PopID(); } @@ -1133,6 +1120,7 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { void PlandomizerDrawSpoilerTable() { ImGui::BeginChild("Main"); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Check Tabs")) { if (ImGui::BeginTabItem("Gossip Stones")) { getTabID = TAB_HINTS; @@ -1146,12 +1134,13 @@ void PlandomizerDrawSpoilerTable() { } } ImGui::EndTabBar(); + UIWidgets::PopStyleTabs(); ImGui::EndChild(); } void PlandomizerWindow::DrawElement() { PlandomizerDrawOptions(); - UIWidgets::PaddedSeparator(); + UIWidgets::Separator(true, true, 0.f, 0.f); PlandomizerDrawSpoilerTable(); } diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.h b/soh/soh/Enhancements/randomizer/Plandomizer.h index d337e4da6..1b7996ce4 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.h +++ b/soh/soh/Enhancements/randomizer/Plandomizer.h @@ -39,14 +39,14 @@ typedef struct { std::string hintText; } SpoilerHintObject; -typedef enum { +typedef enum PlandoTabs { TAB_HINTS, TAB_LOCATIONS -}; +} PlandoTabs; -typedef enum { +typedef enum PlandoHints { HINT_SINGLE, HINT_ALL, -}; +} PlandoHints; #endif \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index e032d1a2d..2c478e34c 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -2,7 +2,9 @@ #include "libultraship/bridge.h" #include #include +#include "soh/SohGui/SohGui.hpp" #include "soh/SohGui/UIWidgets.hpp" +#include namespace Rando { Option Option::Bool(RandomizerSettingKey key_, std::string name_, std::vector options_, @@ -130,11 +132,10 @@ void Option::Enable() { disabled = false; } -void Option::Disable(std::string text, const UIWidgets::CheckboxGraphics graphic) { - if (!disabled || disabledText != text || disabledGraphic != graphic) { +void Option::Disable(std::string text) { + if (!disabled || disabledText != text) { disabled = true; disabledText = std::move(text); - disabledGraphic = graphic; } } @@ -149,9 +150,6 @@ bool Option::RenderImGui() { case WidgetType::Checkbox: changed = RenderCheckbox(); break; - case WidgetType::TristateCheckbox: - changed = RenderTristateCheckbox(); - break; case WidgetType::Combobox: changed = RenderCombobox(); break; @@ -159,7 +157,6 @@ bool Option::RenderImGui() { changed = RenderSlider(); break; } - UIWidgets::Spacer(0); ImGui::EndGroup(); return changed; } @@ -213,50 +210,19 @@ Option::Option(size_t key_, std::string name_, std::vector options_ bool Option::RenderCheckbox() { bool changed = false; - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } bool val = static_cast(CVarGetInteger(cvarName.c_str(), defaultOption)); - if (CustomCheckbox(name.c_str(), &val, disabled, disabledGraphic)) { + UIWidgets::CheckboxOptions widgetOptions = static_cast(UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip(description.c_str())); + widgetOptions.disabled = disabled; + if (UIWidgets::Checkbox(name.c_str(), &val, widgetOptions)) { CVarSetInteger(cvarName.c_str(), val); changed = true; Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); - } - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); - } - return changed; -} - -bool Option::RenderTristateCheckbox() { - bool changed = false; - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - int val = CVarGetInteger(cvarName.c_str(), defaultOption); - if (CustomCheckboxTristate(name.c_str(), &val, disabled, disabledGraphic)) { - CVarSetInteger(cvarName.c_str(), val); - changed = true; - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); - } - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); - } return changed; } bool Option::RenderCombobox() { bool changed = false; - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - ImGui::Text("%s", name.c_str()); uint8_t selected = CVarGetInteger(cvarName.c_str(), defaultOption); if (selected >= options.size()) { selected = options.size(); @@ -264,25 +230,15 @@ bool Option::RenderCombobox() { changed = true; Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); + UIWidgets::ComboboxOptions widgetOptions = UIWidgets::ComboboxOptions().Color(THEME_COLOR).Tooltip(description.c_str()); + if (this->GetKey() == RSK_LOGIC_RULES) { + widgetOptions = widgetOptions.LabelPosition(UIWidgets::LabelPosition::None).ComponentAlignment(UIWidgets::ComponentAlignment::Right); } - const std::string comboName = std::string("##") + std::string(cvarName); - if (ImGui::BeginCombo(comboName.c_str(), options[selected].c_str())) { - for (size_t i = 0; i < options.size(); i++) { - if (!options[i].empty()) { - if (ImGui::Selectable(options[i].c_str(), i == selected)) { - CVarSetInteger(cvarName.c_str(), static_cast(i)); - changed = true; - selected = i; - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - } - } - ImGui::EndCombo(); - } - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); + widgetOptions.disabled = disabled; + if(UIWidgets::Combobox(name.c_str(), &selected, options, widgetOptions)) { + CVarSetInteger(cvarName.c_str(), static_cast(selected)); + changed = true; + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } return changed; } @@ -295,40 +251,11 @@ bool Option::RenderSlider() { CVarSetInteger(cvarName.c_str(), val); changed = true; } - if (disabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - const std::string formatName = name + ": %s"; - ImGui::Text(formatName.c_str(), options[val].c_str()); - if (!description.empty()) { - UIWidgets::InsertHelpHoverText(description.c_str()); - } - UIWidgets::Spacer(0); - ImGui::BeginGroup(); - const std::string MinusBTNName = " - ##" + cvarName; - if (ImGui::Button(MinusBTNName.c_str())) { - val--; + UIWidgets::IntSliderOptions widgetOptions = UIWidgets::IntSliderOptions().Color(THEME_COLOR).Min(0).Max(options.size() - 1).Tooltip(description.c_str()).Format(options[val].c_str()).DefaultValue(defaultOption); + widgetOptions.disabled = disabled; + if (UIWidgets::SliderInt(name.c_str(), &val, widgetOptions)) { changed = true; } - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - ImGui::PushItemWidth(std::min(ImGui::GetContentRegionAvail().x - 30.0f, 260.0f)); - const std::string id = "##Slider" + cvarName; - if (ImGui::SliderInt(id.c_str(), &val, 0, static_cast(options.size()) - 1, "", ImGuiSliderFlags_AlwaysClamp)) { - changed = true; - } - ImGui::PopItemWidth(); - const std::string PlusBTNName = " + ##" + cvarName; - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::Button(PlusBTNName.c_str())) { - val++; - changed = true; - } - ImGui::EndGroup(); - if (disabled) { - UIWidgets::ReEnableComponent(disabledText.c_str()); - } if (val < 0) { val = 0; changed = true; @@ -465,7 +392,7 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) ImGui::TableSetColumnIndex(i); ImGui::TableHeader(mSubGroups[i]->GetName().c_str()); if (!mSubGroups[i]->GetDescription().empty()) { - UIWidgets::SetLastItemHoverText(mSubGroups[i]->GetDescription().c_str()); + UIWidgets::Tooltip(mSubGroups[i]->GetDescription().c_str()); } } ImGui::PopItemFlag(); @@ -473,12 +400,10 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) } } if (mContainerType == WidgetContainerType::SECTION && !mName.empty()) { - UIWidgets::PaddedSeparator(); - ImGui::Text("%s", mName.c_str()); + ImGui::SeparatorText(mName.c_str()); if (!mDescription.empty()) { - UIWidgets::InsertHelpHoverText(mDescription.c_str()); + UIWidgets::Tooltip(mDescription.c_str()); } - UIWidgets::PaddedSeparator(); } if (mContainerType == WidgetContainerType::COLUMN) { ImGui::TableNextColumn(); @@ -507,9 +432,6 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) if (option->HasFlag(IMFLAG_UNINDENT)) { ImGui::Unindent(); } - if (option->HasFlag(IMFLAG_SEPARATOR_BOTTOM)) { - UIWidgets::PaddedSeparator(false, true); - } } } if (mContainerType == WidgetContainerType::COLUMN) { diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index d2291463b..518487219 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -1,6 +1,7 @@ #pragma once -#include "soh/SohGui/UIWidgets.hpp" +#ifndef RANDOPTION_H +#define RANDOPTION_H #include #include @@ -35,7 +36,6 @@ enum class OptionCategory { */ enum class WidgetType { Checkbox, /** Default for Bools, not compatible if options.size() > 2. */ - TristateCheckbox, /** Compatible with U8s, not compatible if options.size() != 3. */ Combobox, /** Default for U8s, works with U8s and Bools. */ 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. */ }; @@ -312,7 +312,7 @@ class Option { * @param graphic What graphic to display in a disabled checkbox. Defaults to an * "X" symbol. */ - void Disable(std::string text, UIWidgets::CheckboxGraphics graphic = UIWidgets::CheckboxGraphics::Cross); + void Disable(std::string text); bool IsCategory(OptionCategory category) const; /** @@ -339,7 +339,6 @@ protected: private: bool RenderCheckbox(); - bool RenderTristateCheckbox(); bool RenderCombobox(); bool RenderSlider(); void PopulateTextToNum(); @@ -357,7 +356,6 @@ protected: bool defaultHidden = false; int imFlags = IMFLAG_NONE; bool disabled = false; - UIWidgets::CheckboxGraphics disabledGraphic = UIWidgets::CheckboxGraphics::Cross; std::string disabledText; std::unordered_map optionsTextToVar = {}; }; @@ -546,4 +544,6 @@ class OptionGroup { std::string mDescription; bool mDisabled = false; }; -} // namespace Rando \ No newline at end of file +} // namespace Rando + +#endif //RANDOPTION_H \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 44831c7c0..85ddc6c50 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -11,9 +11,8 @@ #include "3drando/rando_main.hpp" #include "3drando/random.hpp" #include "soh/ResourceManagerHelpers.h" -#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "3drando/custom_messages.hpp" -#include "soh/SohGui/UIWidgets.hpp" #include #include #include "../custom-message/CustomMessageTypes.h" @@ -27,6 +26,7 @@ #include #include #include "draw.h" +#include "soh/SohGui/UIWidgets.hpp" #include "static_data.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include @@ -1924,6 +1924,16 @@ bool GenerateRandomizer(std::string seed /*= ""*/) { return false; } +static const std::unordered_map randomizerPresetList = { + { RANDOMIZER_PRESET_DEFAULT, "Default" }, + { RANDOMIZER_PRESET_SPOCK_RACE, "Spock Race" }, + { RANDOMIZER_PRESET_SPOCK_RACE_NO_LOGIC, "Spock Race (No Logic)" }, + { RANDOMIZER_PRESET_S6, "S6" }, + { RANDOMIZER_PRESET_HELL_MODE, "Hell Mode" }, + { RANDOMIZER_PRESET_BENCHMARK, "Benchmark" } +}; +static int32_t randomizerPresetSelected = RANDOMIZER_PRESET_DEFAULT; + void RandomizerSettingsWindow::DrawElement() { auto ctx = Rando::Context::GetInstance(); if (generated) { @@ -1931,30 +1941,62 @@ void RandomizerSettingsWindow::DrawElement() { randoThread.join(); } bool disableEditingRandoSettings = CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); - if (disableEditingRandoSettings) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings); + const PresetTypeDefinition presetTypeDef = presetTypes.at(PRESET_TYPE_RANDOMIZER); + std::string comboboxTooltip = ""; + for (auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter) { + if (iter->first != 0) comboboxTooltip += "\n\n"; + comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); + } + const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(PRESET_TYPE_RANDOMIZER); + randomizerPresetSelected = CVarGetInteger(presetTypeCvar.c_str(), RANDOMIZER_PRESET_DEFAULT); + + if (UIWidgets::Combobox("Randomizer Presets", &randomizerPresetSelected, randomizerPresetList, UIWidgets::ComboboxOptions() + .DefaultIndex(RANDOMIZER_PRESET_DEFAULT) + .Tooltip(comboboxTooltip.c_str()) + .Color(THEME_COLOR)) + ) { + CVarSetInteger(presetTypeCvar.c_str(), randomizerPresetSelected); + } + ImGui::SameLine(); + ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 35.f); + if (UIWidgets::Button("Apply Preset##Randomizer", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { + if (randomizerPresetSelected >= presetTypeDef.presets.size()) { + randomizerPresetSelected = 0; + } + const PresetDefinition selectedPresetDef = presetTypeDef.presets.at(randomizerPresetSelected); + for(const char* block : presetTypeDef.blocksToClear) { + CVarClearBlock(block); + } + if (randomizerPresetSelected != 0) { + applyPreset(selectedPresetDef.entries); + } + CVarSetInteger(presetTypeCvar.c_str(), randomizerPresetSelected); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - DrawPresetSelector(PRESET_TYPE_RANDOMIZER); - ImGui::EndDisabled(); - UIWidgets::Spacer(0); - UIWidgets::EnhancementCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), false, ""); + UIWidgets::CVarCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0)) { - ImGui::Text("Seed"); + UIWidgets::PushStyleInput(THEME_COLOR); ImGui::InputText("##RandomizerSeed", seedString, MAX_SEED_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); UIWidgets::Tooltip( "Characters from a-z, A-Z, and 0-9 are supported.\n" "Character limit is 1023, after which the seed will be truncated.\n" ); - ImGui::SameLine(); - if (ImGui::Button("New Seed")) { + if (strnlen(seedString, MAX_SEED_STRING_SIZE) == 0) { + ImGui::SameLine(17.0f); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Leave blank for random seed"); + } + UIWidgets::PopStyleInput(); + ImGui::SameLine(0.f, 50.f); + if (UIWidgets::Button(ICON_FA_RANDOM, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)).Tooltip( + "Creates a new random seed value to be used when generating a randomizer" + ))) { SohUtils::CopyStringToCharArray(seedString, std::to_string(rand() & 0xFFFFFFFF), MAX_SEED_STRING_SIZE); } - UIWidgets::Tooltip("Creates a new random seed value to be used when generating a randomizer"); ImGui::SameLine(); - if (ImGui::Button("Clear Seed")) { + if (UIWidgets::Button(ICON_FA_ERASER, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)))) { memset(seedString, 0, MAX_SEED_STRING_SIZE); } } @@ -1962,13 +2004,13 @@ void RandomizerSettingsWindow::DrawElement() { UIWidgets::Spacer(0); ImGui::BeginDisabled((CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0) && gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || GameInteractor::IsSaveLoaded()); - if (ImGui::Button("Generate Randomizer")) { + if (UIWidgets::Button("Generate Randomizer", UIWidgets::ButtonOptions().Size(ImVec2(250.f, 0.f)).Color(THEME_COLOR))) { ctx->SetSpoilerLoaded(false); GenerateRandomizer(CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0) ? seedString : ""); } ImGui::EndDisabled(); - UIWidgets::Spacer(0); + ImGui::SameLine(); if (!CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0)) { std::string spoilerfilepath = CVarGetString(CVAR_GENERAL("SpoilerLog"), ""); ImGui::Text("Spoiler File: %s", spoilerfilepath.c_str()); @@ -1978,13 +2020,13 @@ void RandomizerSettingsWindow::DrawElement() { // std::string presetfilepath = CVarGetString(CVAR_RANDOMIZER_SETTING("LoadedPreset"), ""); // ImGui::Text("Settings File: %s", presetfilepath.c_str()); - UIWidgets::PaddedSeparator(); - + UIWidgets::Separator(true, true, 0.f, 0.f); ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); ImGuiWindow* window = ImGui::GetCurrentWindow(); static ImVec2 cellPadding(8.0f, 8.0f); + UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Randomizer Settings", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("World")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); @@ -2048,7 +2090,9 @@ void RandomizerSettingsWindow::DrawElement() { window->DC.CurrLineTextBaseOffset = 0.0f; static ImGuiTextFilter locationSearch; + UIWidgets::PushStyleInput(THEME_COLOR); locationSearch.Draw(); + UIWidgets::PopStyleInput(); ImGui::BeginChild("ChildIncludedLocations", ImVec2(0, -8)); for (auto& [rcArea, locations] : RandomizerCheckObjects::GetAllRCObjectsByArea()) { @@ -2068,7 +2112,7 @@ void RandomizerSettingsWindow::DrawElement() { for (auto& location : locations) { if (ctx->GetItemLocation(location)->IsVisible() && !excludedLocations.count(location) && locationSearch.PassFilter(Rando::StaticData::GetLocation(location)->GetName().c_str())) { - + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Right)) { excludedLocations.insert(location); // todo: this efficently when we build out cvar array support @@ -2080,6 +2124,7 @@ void RandomizerSettingsWindow::DrawElement() { CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), excludedLocationString.c_str()); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + UIWidgets::PopStyleButton(); ImGui::SameLine(); ImGui::Text("%s", Rando::StaticData::GetLocation(location)->GetShortName().c_str()); } @@ -2110,6 +2155,7 @@ void RandomizerSettingsWindow::DrawElement() { for (auto& location : locations) { auto elfound = excludedLocations.find(location); if (ctx->GetItemLocation(location)->IsVisible() && elfound != excludedLocations.end()) { + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Left)) { excludedLocations.erase(elfound); // todo: this efficently when we build out cvar array support @@ -2125,6 +2171,7 @@ void RandomizerSettingsWindow::DrawElement() { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + UIWidgets::PopStyleButton(); ImGui::SameLine(); ImGui::Text("%s", Rando::StaticData::GetLocation(location)->GetShortName().c_str()); } @@ -2272,10 +2319,12 @@ void RandomizerSettingsWindow::DrawElement() { //{ Rando::Tricks::Tag::GLITCH, false }, }; static ImGuiTextFilter trickSearch; + UIWidgets::PushStyleInput(THEME_COLOR); trickSearch.Draw("Filter (inc,-exc)", 490.0f); + UIWidgets::PopStyleInput(); if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) != RO_LOGIC_NO_LOGIC) { ImGui::SameLine(); - if (ImGui::Button("Disable All")) { + if (UIWidgets::Button("Disable All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto etfound = enabledTricks.find(static_cast(i)); if (etfound != enabledTricks.end()) { @@ -2291,7 +2340,7 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (ImGui::Button("Enable All")) { + if (UIWidgets::Button("Enable All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { if (!enabledTricks.count(static_cast(i))) { enabledTricks.insert(static_cast(i)); @@ -2334,19 +2383,19 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - if (ImGui::Button("Collapse All##disabled")) { + if (UIWidgets::Button("Collapse All##disabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeDisabled[static_cast(i)] = false; } } ImGui::SameLine(); - if (ImGui::Button("Open All##disabled")) { + if (UIWidgets::Button("Open All##disabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeDisabled[static_cast(i)] = true; } } ImGui::SameLine(); - if (ImGui::Button("Enable Visible")) { + if (UIWidgets::Button("Enable Visible", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto option = mSettings->GetTrickOption(static_cast(i)); if (!enabledTricks.count(static_cast(i)) && @@ -2387,6 +2436,7 @@ void RandomizerSettingsWindow::DrawElement() { !enabledTricks.count(rt) && Rando::Tricks::CheckTags(showTag, option.GetTags())) { ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(option.GetArea()) + "##disabled").c_str()), areaTreeDisabled[option.GetArea()]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(rt).c_str(), ImGuiDir_Right)) { enabledTricks.insert(rt); std::string enabledTrickString = ""; @@ -2397,10 +2447,11 @@ void RandomizerSettingsWindow::DrawElement() { CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), enabledTrickString.c_str()); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - Rando::Tricks::DrawTagChips(option.GetTags()); + UIWidgets::PopStyleButton(); + Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); ImGui::SameLine(); ImGui::Text("%s", option.GetName().c_str()); - UIWidgets::InsertHelpHoverText(option.GetDescription().c_str()); + UIWidgets::Tooltip(option.GetDescription().c_str()); } } areaTreeDisabled[area] = true; @@ -2416,19 +2467,19 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - if (ImGui::Button("Collapse All##enabled")) { + if (UIWidgets::Button("Collapse All##enabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeEnabled[static_cast(i)] = false; } } ImGui::SameLine(); - if (ImGui::Button("Open All##enabled")) { + if (UIWidgets::Button("Open All##enabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeEnabled[static_cast(i)] = true; } } ImGui::SameLine(); - if (ImGui::Button("Disable Visible")) { + if (UIWidgets::Button("Disable Visible", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto option = mSettings->GetTrickOption(static_cast(i)); if (enabledTricks.count(static_cast(i)) && @@ -2473,6 +2524,7 @@ void RandomizerSettingsWindow::DrawElement() { enabledTricks.count(rt) && Rando::Tricks::CheckTags(showTag, option.GetTags())) { ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(option.GetArea()) + "##enabled").c_str()), areaTreeEnabled[option.GetArea()]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); + UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(rt).c_str(), ImGuiDir_Left)) { enabledTricks.erase(rt); std::string enabledTrickString = ""; @@ -2487,10 +2539,11 @@ void RandomizerSettingsWindow::DrawElement() { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - Rando::Tricks::DrawTagChips(option.GetTags()); + UIWidgets::PopStyleButton(); + Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); ImGui::SameLine(); ImGui::Text("%s", option.GetName().c_str()); - UIWidgets::InsertHelpHoverText(option.GetDescription().c_str()); + UIWidgets::Tooltip(option.GetDescription().c_str()); } } areaTreeEnabled[area] = true; @@ -2532,12 +2585,10 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); ImGui::EndDisabled(); - - if (disableEditingRandoSettings) { - UIWidgets::ReEnableComponent(""); - } + ImGui::EndDisabled(); } void RandomizerSettingsWindow::UpdateElement() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index e3b07b672..cc139fbfd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -7,6 +7,7 @@ #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "dungeon.h" #include "location_access.h" @@ -844,6 +845,39 @@ void SetAreaSpoiled(RandomizerCheckArea rcArea) { } void CheckTrackerWindow::DrawElement() { + Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor.Value"), Color_Bg_Default); + Color_Area_Incomplete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); + Color_Area_Incomplete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); + Color_Area_Complete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); + Color_Area_Complete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); + Color_Unchecked_Main = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.MainColor.Value"), Color_Main_Default); + Color_Unchecked_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.ExtraColor.Value"), Color_Unchecked_Extra_Default); + Color_Skipped_Main = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.MainColor.Value"), Color_Main_Default); + Color_Skipped_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.ExtraColor.Value"), Color_Skipped_Extra_Default); + Color_Seen_Main = CVarGetColor(CVAR_TRACKER_CHECK("Seen.MainColor.Value"), Color_Main_Default); + Color_Seen_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Seen.ExtraColor.Value"), Color_Seen_Extra_Default); + Color_Hinted_Main = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.MainColor.Value"), Color_Main_Default); + Color_Hinted_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.ExtraColor.Value"), Color_Hinted_Extra_Default); + Color_Collected_Main = CVarGetColor(CVAR_TRACKER_CHECK("Collected.MainColor.Value"), Color_Main_Default); + Color_Collected_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Collected.ExtraColor.Value"), Color_Collected_Extra_Default); + Color_Scummed_Main = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.MainColor.Value"), Color_Main_Default); + Color_Scummed_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.ExtraColor.Value"), Color_Scummed_Extra_Default); + Color_Saved_Main = CVarGetColor(CVAR_TRACKER_CHECK("Saved.MainColor.Value"), Color_Main_Default); + Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor.Value"), Color_Saved_Extra_Default); + hideUnchecked = CVarGetInteger(CVAR_TRACKER_CHECK("Unchecked.Hide"), 0); + hideScummed = CVarGetInteger(CVAR_TRACKER_CHECK("Scummed.Hide"), 0); + hideSeen = CVarGetInteger(CVAR_TRACKER_CHECK("Seen.Hide"), 0); + hideSkipped = CVarGetInteger(CVAR_TRACKER_CHECK("Skipped.Hide"), 0); + hideSaved = CVarGetInteger(CVAR_TRACKER_CHECK("Saved.Hide"), 0); + hideCollected = CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0); + showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); + mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); + showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); + + hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 1); + alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); + + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { return; @@ -863,11 +897,11 @@ void CheckTrackerWindow::DrawElement() { } ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); - BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar); if (!GameInteractor::IsSaveLoaded() || !initialized) { ImGui::Text("Waiting for file load..."); //TODO Language + ImGui::PopFont(); EndFloatWindows(); return; } @@ -886,38 +920,40 @@ void CheckTrackerWindow::DrawElement() { ImVec2 size = ImGui::GetContentRegionMax(); size.y -= headerHeight; if (!ImGui::BeginTable("Check Tracker", 1, 0, size)) { + ImGui::PopFont(); EndFloatWindows(); return; } ImGui::TableNextRow(0, headerHeight); ImGui::TableNextColumn(); - UIWidgets::EnhancementCheckbox( - "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), false, - "When active, items will show hidden checks by default when updated to this state."); + UIWidgets::CVarCheckbox( + "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), UIWidgets::CheckboxOptions({{ .tooltip = "When active, items will show hidden checks by default when updated to this state." }}) + .Color(THEME_COLOR)); UIWidgets::PaddedSeparator(); - if (ImGui::Button("Expand All")) { + if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { optCollapseAll = false; optExpandAll = true; doAreaScroll = true; } ImGui::SameLine(); - if (ImGui::Button("Collapse All")) { + if (UIWidgets::Button("Collapse All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { optExpandAll = false; optCollapseAll = true; } ImGui::SameLine(); - if (ImGui::Button("Clear")) { + if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({{ .tooltip = "Clear the search field" }}).Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { checkSearch.Clear(); UpdateFilters(); doAreaScroll = true; } - UIWidgets::Tooltip("Clear the search field"); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (checkSearch.Draw()) { UpdateFilters(); } + UIWidgets::PopStyleCombobox(); - UIWidgets::PaddedSeparator(); + ImGui::Separator(); ImGui::Text("Total Checks: %d / %d", totalChecksGotten, totalChecks); @@ -929,6 +965,7 @@ void CheckTrackerWindow::DrawElement() { size = ImGui::GetContentRegionAvail(); if (!ImGui::BeginTable("CheckTracker##Checks", 1, ImGuiTableFlags_ScrollY, size)) { ImGui::EndTable(); + ImGui::PopFont(); EndFloatWindows(); return; } @@ -946,16 +983,17 @@ void CheckTrackerWindow::DrawElement() { bool doingCollapseOrExpand = optExpandAll || optCollapseAll; bool isThisAreaSpoiled; RandomizerCheckArea lastArea = RCAREA_INVALID; - Color_RGBA8 areaCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor"), Color_Main_Default); - Color_RGBA8 areaIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), Color_Main_Default); - Color_RGBA8 extraCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Extra_Default); - Color_RGBA8 extraIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Extra_Default); + Color_RGBA8 areaCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); + Color_RGBA8 areaIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); + Color_RGBA8 extraCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); + Color_RGBA8 extraIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); Color_RGBA8 mainColor; Color_RGBA8 extraColor; std::string stemp; bool shouldHideFilteredAreas = CVarGetInteger(CVAR_TRACKER_CHECK("HideFilteredAreas"), 1); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); for (auto& [rcArea, checks] : checksByArea) { RandomizerCheckArea thisArea = currentArea; @@ -1039,9 +1077,11 @@ void CheckTrackerWindow::DrawElement() { } } } + ImGui::PopStyleVar(); ImGui::EndTable(); //Checks Lead-out ImGui::EndTable(); //Quick Options Lead-out + ImGui::PopFont(); EndFloatWindows(); if (doingCollapseOrExpand) { optCollapseAll = false; @@ -1099,7 +1139,7 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; - if (!CVarGetInteger(CVAR_TRACKER_CHECK("Draggable"), 0)) { + if (!CVarGetInteger(CVAR_TRACKER_CHECK("Draggable"), 1)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } @@ -1468,54 +1508,54 @@ void DrawLocation(RandomizerCheck rc) { } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Collected_Extra_Default + ? Color_Collected_Extra : Color_Collected_Main; - extraColor = Color_Collected_Extra_Default; + extraColor = Color_Collected_Extra; } else if (status == RCSHOW_SAVED) { if (!showHidden && hideSaved) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Saved_Extra_Default + ? Color_Saved_Extra : Color_Saved_Main; - extraColor = Color_Saved_Extra_Default; + extraColor = Color_Saved_Extra; } else if (skipped) { if (!showHidden && hideSkipped) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Skipped_Extra_Default + ? Color_Skipped_Extra : Color_Skipped_Main; - extraColor = Color_Skipped_Extra_Default; + extraColor = Color_Skipped_Extra; } else if (status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED) { if (!showHidden && hideSeen) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Seen_Extra_Default + ? Color_Seen_Extra : Color_Seen_Main; - extraColor = Color_Seen_Extra_Default; + extraColor = Color_Seen_Extra; } else if (status == RCSHOW_SCUMMED) { if (!showHidden && hideScummed) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Scummed_Extra_Default + ? Color_Scummed_Extra : Color_Scummed_Main; - extraColor = Color_Scummed_Extra_Default; + extraColor = Color_Scummed_Extra; } else if (status == RCSHOW_UNCHECKED) { if (!showHidden && hideUnchecked) { return; } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Unchecked_Extra_Default + ? Color_Unchecked_Extra : Color_Unchecked_Main; - extraColor = Color_Unchecked_Extra_Default; + extraColor = Color_Unchecked_Extra; } //Main Text @@ -1530,8 +1570,10 @@ void DrawLocation(RandomizerCheck rc) { } // Draw button - for Skipped/Seen/Scummed/Unchecked only + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {4.0f, 3.0f}); + float sz = ImGui::GetFrameHeight(); if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || status == RCSHOW_SCUMMED || skipped) { - if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES)) { + if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES, ImVec2(sz, sz), UIWidgets::ButtonOptions().Color(THEME_COLOR))) { if (skipped) { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); areaChecksGotten[loc->GetArea()]--; @@ -1546,8 +1588,10 @@ void DrawLocation(RandomizerCheck rc) { SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); } } else { - ImGui::Dummy(ImVec2(20.0f, 10.0f)); + ImGui::Dummy(ImVec2(sz, sz)); } + ImGui::PopStyleVar(); + ImGui::SameLine(); //Draw @@ -1621,7 +1665,7 @@ void DrawLocation(RandomizerCheck rc) { if (locationInRegion.GetLocation() == rc) { std::string conditionStr = locationInRegion.GetConditionStr(); if (conditionStr != "true") { - UIWidgets::InsertHelpHoverText(conditionStr); + UIWidgets::Tooltip(conditionStr.c_str()); } return; } @@ -1645,7 +1689,7 @@ int hue = 0; void RainbowTick() { float freqHue = hue * 2 * M_PI / (360 * CVarGetFloat(CVAR_COSMETIC("RainbowSpeed"), 0.6f)); for (auto& cvar : rainbowCVars) { - if (CVarGetInteger((cvar + "RBM").c_str(), 0) == 0) { + if (CVarGetInteger((cvar + ".Rainbow").c_str(), 0) == 0) { continue; } @@ -1655,7 +1699,7 @@ void RainbowTick() { newColor.b = sin(freqHue + (4 * M_PI / 3)) * 127 + 128; newColor.a = 255; - CVarSetColor(cvar.c_str(), newColor); + CVarSetColor((cvar + ".Value").c_str(), newColor); } hue++; @@ -1664,46 +1708,33 @@ void RainbowTick() { void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, const char* cvarExtraName, Color_RGBA8& main_color, Color_RGBA8& extra_color, Color_RGBA8& main_default_color, - Color_RGBA8& extra_default_color, const char* cvarHideName, const char* tooltip) { + Color_RGBA8& extra_default_color, const char* cvarHideName, const char* tooltip, UIWidgets::Colors theme) { Color_RGBA8 cvarMainColor = CVarGetColor(cvarMainName, main_default_color); Color_RGBA8 cvarExtraColor = CVarGetColor(cvarExtraName, extra_default_color); main_color = cvarMainColor; extra_color = cvarExtraColor; + UIWidgets::PushStyleCombobox(theme); if (ImGui::CollapsingHeader(text)) { if (*cvarHideName != '\0') { std::string label = cvarHideName; label += "##Hidden"; ImGui::PushID(label.c_str()); - UIWidgets::EnhancementCheckbox("Hidden", cvarHideName, false, - "When active, checks will hide by default when updated to this state. Can " - "be overriden with the \"Show Hidden Items\" option."); + UIWidgets::CVarCheckbox("Hidden", cvarHideName, + UIWidgets::CheckboxOptions({{ .tooltip = "When active, checks will hide by default when updated to this state. Can " + "be overriden with the \"Show Hidden Items\" option." }}).Color(theme)); ImGui::PopID(); } - if (ImGui::BeginTable(text, 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV | ImGuiTableFlags_Hideable)) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (UIWidgets::EnhancementColor("Check", cvarMainName, - ImVec4(main_color.r, main_color.g, main_color.b, main_color.a), - ImVec4(main_default_color.r, main_default_color.g, main_default_color.b, main_default_color.a))) - { - main_color = CVarGetColor(cvarMainName, main_default_color); - }; - ImGui::PopItemWidth(); + std::string mainLabel = "Name##" + std::string(cvarMainName); + if (UIWidgets::CVarColorPicker(mainLabel.c_str(), cvarMainName, main_default_color, false, + UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRainbowCheck, theme)) { + main_color = CVarGetColor(cvarMainName, main_default_color); + } - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (UIWidgets::EnhancementColor("Details", cvarExtraName, - ImVec4(extra_color.r, extra_color.g, extra_color.b, extra_color.a), - ImVec4(extra_default_color.r, extra_default_color.g, extra_default_color.b, extra_default_color.a))) - { - extra_color = CVarGetColor(cvarExtraName, extra_default_color); - } - ImGui::PopItemWidth(); - - ImGui::EndTable(); + std::string extraLabel = "Details##" + std::string(cvarExtraName); + if (UIWidgets::CVarColorPicker(extraLabel.c_str(), cvarExtraName, extra_default_color, false, + UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRainbowCheck, theme)) { + extra_color = CVarGetColor(cvarExtraName, extra_default_color); } } if (tooltip != NULL && strlen(tooltip) != 0) { @@ -1711,6 +1742,7 @@ void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, ImGui::Text(" ?"); UIWidgets::Tooltip(tooltip); } + UIWidgets::PopStyleCombobox(); } void CheckTrackerWindow::Draw() { @@ -1722,73 +1754,84 @@ void CheckTrackerWindow::Draw() { SyncVisibilityConsoleVariable(); } -static const char* windowType[] = { "Floating", "Window" }; -static const char* displayType[] = { "Always", "Combo Button Hold" }; -static const char* buttonStrings[] = { "A Button", "B Button", "C-Up", "C-Down", "C-Left", "C-Right", "L Button", - "Z Button", "R Button", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; +static std::unordered_map windowType = {{ TRACKER_WINDOW_FLOATING, "Floating" }, { TRACKER_WINDOW_WINDOW, "Window" }}; +static std::unordered_map displayType = {{ 0, "Always" }, { 1, "Combo Button Hold" }}; +static std::unordered_map buttonStrings = { + { TRACKER_COMBO_BUTTON_A, "A Button" }, { TRACKER_COMBO_BUTTON_B, "B Button" }, { TRACKER_COMBO_BUTTON_C_UP, "C-Up" }, + { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, + { TRACKER_COMBO_BUTTON_L, "L Button" }, { TRACKER_COMBO_BUTTON_Z, "Z Button" }, { TRACKER_COMBO_BUTTON_R, "R Button" }, + { TRACKER_COMBO_BUTTON_START, "Start" }, { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, + { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }}; void CheckTrackerSettingsWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); - ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); - ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableHeadersRow(); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (UIWidgets::EnhancementColor("BG Color", CVAR_TRACKER_CHECK("BgColor"), - ImVec4(Color_Background.r, Color_Background.g, Color_Background.b, Color_Background.a), - ImVec4(Color_Bg_Default.r, Color_Bg_Default.g, Color_Bg_Default.b, Color_Bg_Default.a), - false, true)) - { - Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default); - } - ImGui::PopItemWidth(); + if (ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableHeadersRow(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + UIWidgets::CVarColorPicker("BG Color", CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default, true, + UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRandomButton, THEME_COLOR); + ImGui::PopItemWidth(); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", CVAR_TRACKER_CHECK("WindowType"), windowType, TRACKER_WINDOW_WINDOW); - if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { - UIWidgets::EnhancementCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable")); - UIWidgets::EnhancementCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused")); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", CVAR_TRACKER_CHECK("DisplayType"), displayType, 0); - if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { - UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", CVAR_TRACKER_CHECK("ComboButton1"), buttonStrings, TRACKER_COMBO_BUTTON_L); - UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", CVAR_TRACKER_CHECK("ComboButton2"), buttonStrings, TRACKER_COMBO_BUTTON_R); + UIWidgets::CVarCombobox("Window Type", CVAR_TRACKER_CHECK("WindowType"), windowType, + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + .Color(THEME_COLOR).DefaultIndex(TRACKER_WINDOW_WINDOW)); + + if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { + UIWidgets::CVarCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCombobox("Display Mode", CVAR_TRACKER_CHECK("DisplayType"), displayType, + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + .Color(THEME_COLOR).DefaultIndex(0)); + if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { + UIWidgets::CVarCombobox("Combo Button 1", CVAR_TRACKER_CHECK("ComboButton1"), buttonStrings, + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + .Color(THEME_COLOR).DefaultIndex(TRACKER_COMBO_BUTTON_L)); + UIWidgets::CVarCombobox("Combo Button 2", CVAR_TRACKER_CHECK("ComboButton2"), buttonStrings, + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + .Color(THEME_COLOR).DefaultIndex(TRACKER_COMBO_BUTTON_L)); + } } + UIWidgets::CVarCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers"), UIWidgets::CheckboxOptions() + .Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked.").Color(THEME_COLOR)); + if (UIWidgets::CVarCheckbox("Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), + UIWidgets::CheckboxOptions().Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles.").Color(THEME_COLOR))) { + hideShopUnshuffledChecks = !hideShopUnshuffledChecks; + UpdateFilters(); + } + if (UIWidgets::CVarCheckbox("Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), + UIWidgets::CheckboxOptions().Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings.").Color(THEME_COLOR))) { + alwaysShowGS = !alwaysShowGS; + UpdateFilters(); + } + UIWidgets::CVarCheckbox("Show Logic", CVAR_TRACKER_CHECK("ShowLogic"), + UIWidgets::CheckboxOptions().Tooltip("If enabled, will show a check's logic when hovering over it.").Color(THEME_COLOR)); + + // Filtering settings + UIWidgets::PaddedSeparator(); + UIWidgets::CVarCheckbox("Filter Empty Areas", CVAR_TRACKER_CHECK("HideFilteredAreas"), + UIWidgets::CheckboxOptions().Tooltip("If enabled, will hide area headers that have no locations matching filter").Color(THEME_COLOR).DefaultValue(true)); + + ImGui::TableNextColumn(); + + CheckTracker::ImGuiDrawTwoColorPickerSection("Area Incomplete", CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Main, Color_Area_Incomplete_Extra, Color_Main_Default, Color_Area_Incomplete_Extra_Default, CVAR_TRACKER_CHECK("AreaIncomplete.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Area Complete", CVAR_TRACKER_CHECK("AreaComplete.MainColor"), CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Main, Color_Area_Complete_Extra, Color_Main_Default, Color_Area_Complete_Extra_Default, CVAR_TRACKER_CHECK("AreaComplete.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Unchecked", CVAR_TRACKER_CHECK("Unchecked.MainColor"), CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), Color_Unchecked_Main, Color_Unchecked_Extra, Color_Main_Default, Color_Unchecked_Extra_Default, CVAR_TRACKER_CHECK("Unchecked.Hide"), "Checks you have not interacted with at all.", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Skipped", CVAR_TRACKER_CHECK("Skipped.MainColor"), CVAR_TRACKER_CHECK("Skipped.ExtraColor"), Color_Skipped_Main, Color_Skipped_Extra, Color_Main_Default, Color_Skipped_Extra_Default, CVAR_TRACKER_CHECK("Skipped.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Seen", CVAR_TRACKER_CHECK("Seen.MainColor"), CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Main, Color_Seen_Extra, Color_Main_Default, Color_Seen_Extra_Default, CVAR_TRACKER_CHECK("Seen.Hide"), "Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy mode.", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Scummed", CVAR_TRACKER_CHECK("Scummed.MainColor"), CVAR_TRACKER_CHECK("Scummed.ExtraColor"), Color_Scummed_Main, Color_Scummed_Extra, Color_Main_Default, Color_Scummed_Extra_Default, CVAR_TRACKER_CHECK("Scummed.Hide"), "Checks you collect, but then reload before saving so you no longer have them.", THEME_COLOR); + //CheckTracker::ImGuiDrawTwoColorPickerSection("Hinted (WIP)", CVAR_TRACKER_CHECK("Hinted.MainColor"), CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Main, Color_Hinted_Extra, Color_Main_Default, Color_Hinted_Extra_Default, CVAR_TRACKER_CHECK("Hinted.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Collected", CVAR_TRACKER_CHECK("Collected.MainColor"), CVAR_TRACKER_CHECK("Collected.ExtraColor"), Color_Collected_Main, Color_Collected_Extra, Color_Main_Default, Color_Collected_Extra_Default, CVAR_TRACKER_CHECK("Collected.Hide"), "Checks you have collected without saving or reloading yet.", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Saved", CVAR_TRACKER_CHECK("Saved.MainColor"), CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Main, Color_Saved_Extra, Color_Main_Default, Color_Saved_Extra_Default, CVAR_TRACKER_CHECK("Saved.Hide"), "Checks that you saved the game while having collected.", THEME_COLOR); + + ImGui::PopStyleVar(1); } - 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, false)) { - hideShopUnshuffledChecks = !hideShopUnshuffledChecks; - UpdateFilters(); - } - UIWidgets::Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles."); - if (UIWidgets::EnhancementCheckbox("Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), false, "")) { - alwaysShowGS = !alwaysShowGS; - UpdateFilters(); - } - UIWidgets::Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings."); - UIWidgets::EnhancementCheckbox("Show Logic", "gCheckTrackerOptionShowLogic"); - UIWidgets::Tooltip("If enabled, will show a check's logic when hovering over it."); - - // Filtering settings - UIWidgets::PaddedSeparator(); - UIWidgets::EnhancementCheckbox("Filter Empty Areas", CVAR_TRACKER_CHECK("HideFilteredAreas"), false, "", UIWidgets::CheckboxGraphics::Checkmark, true); - UIWidgets::Tooltip("If enabled, will hide area headers that have no locations matching filter"); - - ImGui::TableNextColumn(); - - CheckTracker::ImGuiDrawTwoColorPickerSection("Area Incomplete", CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Main, Color_Area_Incomplete_Extra, Color_Main_Default, Color_Area_Incomplete_Extra_Default, CVAR_TRACKER_CHECK("AreaIncomplete.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Area Complete", CVAR_TRACKER_CHECK("AreaComplete.MainColor"), CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Main, Color_Area_Complete_Extra, Color_Main_Default, Color_Area_Complete_Extra_Default, CVAR_TRACKER_CHECK("AreaComplete.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Unchecked", CVAR_TRACKER_CHECK("Unchecked.MainColor"), CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), Color_Unchecked_Main, Color_Unchecked_Extra, Color_Main_Default, Color_Unchecked_Extra_Default, CVAR_TRACKER_CHECK("Unchecked.Hide"), "Checks you have not interacted with at all."); - CheckTracker::ImGuiDrawTwoColorPickerSection("Skipped", CVAR_TRACKER_CHECK("Skipped.MainColor"), CVAR_TRACKER_CHECK("Skipped.ExtraColor"), Color_Skipped_Main, Color_Skipped_Extra, Color_Main_Default, Color_Skipped_Extra_Default, CVAR_TRACKER_CHECK("Skipped.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Seen", CVAR_TRACKER_CHECK("Seen.MainColor"), CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Main, Color_Seen_Extra, Color_Main_Default, Color_Seen_Extra_Default, CVAR_TRACKER_CHECK("Seen.Hide"), "Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy mode."); - CheckTracker::ImGuiDrawTwoColorPickerSection("Scummed", CVAR_TRACKER_CHECK("Scummed.MainColor"), CVAR_TRACKER_CHECK("Scummed.ExtraColor"), Color_Scummed_Main, Color_Scummed_Extra, Color_Main_Default, Color_Scummed_Extra_Default, CVAR_TRACKER_CHECK("Scummed.Hide"), "Checks you collect, but then reload before saving so you no longer have them."); - //CheckTracker::ImGuiDrawTwoColorPickerSection("Hinted (WIP)", CVAR_TRACKER_CHECK("Hinted.MainColor"), CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Main, Color_Hinted_Extra, Color_Main_Default, Color_Hinted_Extra_Default, CVAR_TRACKER_CHECK("Hinted.Hide"), ""); - CheckTracker::ImGuiDrawTwoColorPickerSection("Collected", CVAR_TRACKER_CHECK("Collected.MainColor"), CVAR_TRACKER_CHECK("Collected.ExtraColor"), Color_Collected_Main, Color_Collected_Extra, Color_Main_Default, Color_Collected_Extra_Default, CVAR_TRACKER_CHECK("Collected.Hide"), "Checks you have collected without saving or reloading yet."); - CheckTracker::ImGuiDrawTwoColorPickerSection("Saved", CVAR_TRACKER_CHECK("Saved.MainColor"), CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Main, Color_Saved_Extra, Color_Main_Default, Color_Saved_Extra_Default, CVAR_TRACKER_CHECK("Saved.Hide"), "Checks that you saved the game while having collected."); - - ImGui::PopStyleVar(1); ImGui::EndTable(); + ImGui::PopFont(); } void CheckTrackerWindow::InitElement() { @@ -1807,36 +1850,5 @@ void CheckTrackerWindow::InitElement() { } void CheckTrackerWindow::UpdateElement() { - Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default); - Color_Area_Incomplete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), Color_Main_Default); - Color_Area_Incomplete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Extra_Default); - Color_Area_Complete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor"), Color_Main_Default); - Color_Area_Complete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Extra_Default); - Color_Unchecked_Main = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.MainColor"), Color_Main_Default); - Color_Unchecked_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), Color_Unchecked_Extra_Default); - Color_Skipped_Main = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.MainColor"), Color_Main_Default); - Color_Skipped_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.ExtraColor"), Color_Skipped_Extra_Default); - Color_Seen_Main = CVarGetColor(CVAR_TRACKER_CHECK("Seen.MainColor"), Color_Main_Default); - Color_Seen_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Extra_Default); - Color_Hinted_Main = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.MainColor"), Color_Main_Default); - Color_Hinted_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Extra_Default); - Color_Collected_Main = CVarGetColor(CVAR_TRACKER_CHECK("Collected.MainColor"), Color_Main_Default); - Color_Collected_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Collected.ExtraColor"), Color_Collected_Extra_Default); - Color_Scummed_Main = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.MainColor"), Color_Main_Default); - Color_Scummed_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.ExtraColor"), Color_Scummed_Extra_Default); - Color_Saved_Main = CVarGetColor(CVAR_TRACKER_CHECK("Saved.MainColor"), Color_Main_Default); - Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Extra_Default); - hideUnchecked = CVarGetInteger(CVAR_TRACKER_CHECK("Unchecked.Hide"), 0); - hideScummed = CVarGetInteger(CVAR_TRACKER_CHECK("Scummed.Hide"), 0); - hideSeen = CVarGetInteger(CVAR_TRACKER_CHECK("Seen.Hide"), 0); - hideSkipped = CVarGetInteger(CVAR_TRACKER_CHECK("Skipped.Hide"), 0); - hideSaved = CVarGetInteger(CVAR_TRACKER_CHECK("Saved.Hide"), 0); - hideCollected = CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0); - showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); - mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); - showLogicTooltip = CVarGetInteger("gCheckTrackerOptionShowLogic", 0); - - hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 1); - alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); } } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index 851910489..c5bcaa074 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -2,6 +2,7 @@ #include #include "randomizerTypes.h" #include "randomizer_check_objects.h" +#include "soh/SohGui/UIWidgets.hpp" #include diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 4c3cb971e..7a151a983 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/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include #include @@ -659,77 +659,70 @@ void InitEntranceTrackingData() { } void EntranceTrackerSettingsWindow::DrawElement() { - if (ImGui::BeginTable("entranceTrackerSettings", 1, ImGuiTableFlags_BordersInnerH)) { + + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); + ImGui::TextWrapped("The entrance tracker will only track shuffled entrances"); + UIWidgets::Spacer(0); + + ImGui::TableNextColumn(); + + if (ImGui::BeginTable("entranceTrackerSubSettings", 2, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingStretchProp)) { + ImGui::TableSetupColumn("column 1", ImGuiTableColumnFlags_WidthStretch, 150.0f); + ImGui::TableSetupColumn("column 2", ImGuiTableColumnFlags_WidthStretch, 150.0f); ImGui::TableNextColumn(); - UIWidgets::Spacer(0); - ImGui::TextWrapped("The entrance tracker will only track shuffled entrances"); - UIWidgets::Spacer(0); + ImGui::Text("Sort By"); + UIWidgets::CVarRadioButton("To", CVAR_TRACKER_ENTRANCE("SortBy"), 0, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("Sort entrances by the original source entrance")); + UIWidgets::CVarRadioButton("From", CVAR_TRACKER_ENTRANCE("SortBy"), 1, + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR).Tooltip("Sort entrances by the overrided destination")); + + ImGui::Text("List Items"); + UIWidgets::CVarCheckbox("Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), + UIWidgets::CheckboxOptions().Tooltip("Automatically scroll to the first aviable entrance in the current scene").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"), + UIWidgets::CheckboxOptions().Tooltip("Highlight the previous entrance that Link came from").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Highlight available", CVAR_TRACKER_ENTRANCE("HighlightAvailable"), + UIWidgets::CheckboxOptions().Tooltip("Highlight available entrances in the current scene").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Hide undiscovered", CVAR_TRACKER_ENTRANCE("CollapseUndiscovered"), + UIWidgets::CheckboxOptions().Tooltip("Collapse undiscovered entrances towards the bottom of each group").Color(THEME_COLOR)); + bool disableHideReverseEntrances = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_ON; + static const char* disableHideReverseEntrancesText = "This option is disabled because \"Decouple Entrances\" is enabled."; + UIWidgets::CVarCheckbox("Hide reverse", CVAR_TRACKER_ENTRANCE("HideReverseEntrances"), + UIWidgets::CheckboxOptions({ {.disabled = disableHideReverseEntrances, .disabledTooltip = disableHideReverseEntrancesText }}) + .Tooltip("Hide reverse entrance transitions when Decouple Entrances is off").DefaultValue(true).Color(THEME_COLOR)); ImGui::TableNextColumn(); - if (ImGui::BeginTable("entranceTrackerSubSettings", 2, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingStretchProp)) { + ImGui::Text("Group By"); + UIWidgets::CVarRadioButton( + "Area", CVAR_TRACKER_ENTRANCE("GroupBy"), 0, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Group entrances by their area")); + UIWidgets::CVarRadioButton( + "Type", CVAR_TRACKER_ENTRANCE("GroupBy"), 1, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Group entrances by their entrance type")); - ImGui::TableNextColumn(); - - ImGui::Text("Sort By"); - UIWidgets::EnhancementRadioButton("To", CVAR_TRACKER_ENTRANCE("SortBy"), 0); - UIWidgets::Tooltip("Sort entrances by the original source entrance"); - UIWidgets::EnhancementRadioButton("From", CVAR_TRACKER_ENTRANCE("SortBy"), 1); - UIWidgets::Tooltip("Sort entrances by the overrided destination"); - - UIWidgets::Spacer(2.0f); - - ImGui::Text("List Items"); - UIWidgets::PaddedEnhancementCheckbox("Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), true, false); - UIWidgets::Tooltip("Automatically scroll to the first aviable entrance in the current scene"); - UIWidgets::PaddedEnhancementCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"), true, false); - UIWidgets::Tooltip("Highlight the previous entrance that Link came from"); - UIWidgets::PaddedEnhancementCheckbox("Highlight available", CVAR_TRACKER_ENTRANCE("HighlightAvailable"), true, false); - UIWidgets::Tooltip("Highlight available entrances in the current scene"); - UIWidgets::PaddedEnhancementCheckbox("Hide undiscovered", CVAR_TRACKER_ENTRANCE("CollapseUndiscovered"), true, false); - UIWidgets::Tooltip("Collapse undiscovered entrances towards the bottom of each group"); - bool disableHideReverseEntrances = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_ON; - static const char* disableHideReverseEntrancesText = "This option is disabled because \"Decouple Entrances\" is enabled."; - UIWidgets::PaddedEnhancementCheckbox("Hide reverse", CVAR_TRACKER_ENTRANCE("HideReverseEntrances"), true, false, - disableHideReverseEntrances, disableHideReverseEntrancesText, UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Hide reverse entrance transitions when Decouple Entrances is off"); - UIWidgets::Spacer(0); - - ImGui::TableNextColumn(); - - ImGui::Text("Group By"); - UIWidgets::EnhancementRadioButton("Area", CVAR_TRACKER_ENTRANCE("GroupBy"), 0); - UIWidgets::Tooltip("Group entrances by their area"); - UIWidgets::EnhancementRadioButton("Type", CVAR_TRACKER_ENTRANCE("GroupBy"), 1); - UIWidgets::Tooltip("Group entrances by their entrance type"); - - UIWidgets::Spacer(2.0f); - - ImGui::Text("Spoiler Reveal"); - UIWidgets::PaddedEnhancementCheckbox("Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"), true, false); - UIWidgets::Tooltip("Reveal the sourcefor undiscovered entrances"); - UIWidgets::PaddedEnhancementCheckbox("Show Destination", CVAR_TRACKER_ENTRANCE("ShowTo"), true, false); - UIWidgets::Tooltip("Reveal the destination for undiscovered entrances"); - - ImGui::EndTable(); - } - - ImGui::TableNextColumn(); - - ImGui::SetNextItemOpen(false, ImGuiCond_Once); - if (ImGui::TreeNode("Legend")) { - ImGui::TextColored(ImColor(COLOR_ORANGE), "Last Entrance"); - ImGui::TextColored(ImColor(COLOR_GREEN), "Available Entrances"); - ImGui::TextColored(ImColor(COLOR_GRAY), "Undiscovered Entrances"); - ImGui::TreePop(); - } - - UIWidgets::Spacer(0); + ImGui::Text("Spoiler Reveal"); + UIWidgets::CVarCheckbox("Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"), + UIWidgets::CheckboxOptions().Tooltip("Reveal the sourcefor undiscovered entrances").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Show Destination", CVAR_TRACKER_ENTRANCE("ShowTo"), + UIWidgets::CheckboxOptions().Tooltip("Reveal the destination for undiscovered entrances").Color(THEME_COLOR)); ImGui::EndTable(); } + + ImGui::SetNextItemOpen(false, ImGuiCond_Once); + if (ImGui::TreeNode("Legend")) { + ImGui::TextColored(ImColor(COLOR_ORANGE), "Last Entrance"); + ImGui::TextColored(ImColor(COLOR_GREEN), "Available Entrances"); + ImGui::TextColored(ImColor(COLOR_GRAY), "Undiscovered Entrances"); + ImGui::TreePop(); + } + ImGui::PopFont(); } void EntranceTrackerWindow::Draw() { @@ -742,6 +735,7 @@ void EntranceTrackerWindow::Draw() { } void EntranceTrackerWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Entrance Tracker", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { @@ -752,24 +746,26 @@ void EntranceTrackerWindow::DrawElement() { static ImGuiTextFilter locationSearch; uint8_t nextTreeState = 0; - if (ImGui::Button("Collapse All")) { + if (UIWidgets::Button("Collapse All", UIWidgets::ButtonOptions({{ .tooltip = "Collapse all entrance groups" }}) + .Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { nextTreeState = 1; } - UIWidgets::Tooltip("Collapse all entrance groups"); ImGui::SameLine(); - if (ImGui::Button("Expand All")) { + if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions({{ .tooltip = "Expand all entrance groups" }}) + .Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { nextTreeState = 2; } - UIWidgets::Tooltip("Expand all entrance groups"); ImGui::SameLine(); - if (ImGui::Button("Clear")) { + if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({{ .tooltip = "Clear the search field" }}) + .Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { locationSearch.Clear(); } - UIWidgets::Tooltip("Clear the search field"); + UIWidgets::PushStyleCombobox(THEME_COLOR); if (locationSearch.Draw()) { nextTreeState = 2; } + UIWidgets::PopStyleCombobox(); uint8_t destToggle = CVarGetInteger(CVAR_TRACKER_ENTRANCE("SortBy"), 0); uint8_t groupToggle = CVarGetInteger(CVAR_TRACKER_ENTRANCE("GroupBy"), 0); @@ -940,8 +936,8 @@ void EntranceTrackerWindow::DrawElement() { } } ImGui::EndChild(); - ImGui::End(); + ImGui::PopFont(); } void EntranceTrackerWindow::InitElement() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h index ef217b7f0..0e1271e57 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h @@ -100,8 +100,8 @@ class EntranceTrackerSettingsWindow : public Ship::GuiWindow { class EntranceTrackerWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; - void Draw() override; + void InitElement() override; void DrawElement() override; void UpdateElement() override {}; diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index b2343b000..828fcda2d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -5,6 +5,7 @@ #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" #include "randomizerTypes.h" #include @@ -35,6 +36,8 @@ void DrawSong(ItemTrackerItem item); int itemTrackerSectionId; +using namespace UIWidgets; + bool shouldUpdateVectors = true; std::vector mainWindowItems = {}; @@ -616,7 +619,7 @@ void DrawEquip(ItemTrackerItem item) { ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(item.id)); + Tooltip(SohUtils::GetItemName(item.id).c_str()); } void DrawQuest(ItemTrackerItem item) { @@ -632,7 +635,7 @@ void DrawQuest(ItemTrackerItem item) { ImGui::EndGroup(); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); + Tooltip(SohUtils::GetQuestItemName(item.id).c_str()); }; void DrawItem(ItemTrackerItem item) { @@ -800,7 +803,7 @@ void DrawItem(ItemTrackerItem item) { itemName = SohUtils::GetItemName(item.id); } - UIWidgets::SetLastItemHoverText(itemName); + Tooltip(itemName.c_str()); } void DrawBottle(ItemTrackerItem item) { @@ -815,7 +818,7 @@ void DrawBottle(ItemTrackerItem item) { ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(item.id)); + Tooltip(SohUtils::GetItemName(item.id).c_str()); }; void DrawDungeonItem(ItemTrackerItem item) { @@ -864,7 +867,7 @@ void DrawDungeonItem(ItemTrackerItem item) { } ImGui::EndGroup(); - UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(item.id)); + Tooltip(SohUtils::GetItemName(item.id).c_str()); } void DrawSong(ItemTrackerItem item) { @@ -874,7 +877,7 @@ void DrawSong(ItemTrackerItem item) { ImGui::SetCursorScreenPos(ImVec2(p.x + 6, p.y)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - UIWidgets::SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); + Tooltip(SohUtils::GetQuestItemName(item.id).c_str()); } void DrawNotes(bool resizeable = false) { @@ -931,7 +934,6 @@ void DrawTotalChecks() { } // Windowing stuff -ImVec4 ChromaKeyBackground = { 0, 0, 0, 0 }; // Float value, 1 = 255 in rgb value. void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { ImGuiWindowFlags windowFlags = flags; @@ -947,7 +949,7 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } - ImGui::PushStyleColor(ImGuiCol_WindowBg, ChromaKeyBackground); + ImGui::PushStyleColor(ImGuiCol_WindowBg, VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), {0, 0, 0, 0}))); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); @@ -1220,6 +1222,7 @@ void ItemTrackerWindow::Draw() { } void ItemTrackerWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); UpdateVectors(); int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); @@ -1350,19 +1353,29 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } } + ImGui::PopFont(); } -static const char* itemTrackerCapacityTrackOptions[5] = { "No Numbers", "Current Capacity", "Current Ammo", "Current Capacity / Max Capacity", "Current Ammo / Current Capacity" }; -static const char* itemTrackerKeyTrackOptions[3] = { "Collected / Max", "Current / Collected / Max", "Current / Max" }; -static const char* itemTrackerTriforcePieceTrackOptions[2] = { "Collected / Required", "Collected / Required / Max" }; -static const char* windowTypes[2] = { "Floating", "Window" }; -static const char* displayModes[2] = { "Always", "Combo Button Hold" }; -static const char* buttons[14] = { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; -static const char* displayTypes[3] = { "Hidden", "Main Window", "Separate" }; -static const char* extendedDisplayTypes[4] = { "Hidden", "Main Window", "Misc Window", "Separate" }; -static const char* minimalDisplayTypes[2] = { "Hidden", "Separate" }; +static std::unordered_map itemTrackerCapacityTrackOptions = { + { ITEM_TRACKER_NUMBER_NONE, "No Numbers" }, { ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, "Current Capacity" }, { ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, "Current Ammo" }, + { ITEM_TRACKER_NUMBER_CAPACITY, "Current Capacity / Max Capacity" }, { ITEM_TRACKER_NUMBER_AMMO, "Current Ammo / Current Capacity" }}; +static std::unordered_map itemTrackerKeyTrackOptions = { + { KEYS_COLLECTED_MAX, "Collected / Max" }, { KEYS_CURRENT_COLLECTED_MAX, "Current / Collected / Max" }, { KEYS_CURRENT_MAX, "Current / Max" }}; +static std::unordered_map itemTrackerTriforcePieceTrackOptions = { + { TRIFORCE_PIECE_COLLECTED_REQUIRED, "Collected / Required" }, { TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, "Collected / Required / Max" }}; +static std::unordered_map windowTypes = {{ TRACKER_WINDOW_FLOATING, "Floating" }, { TRACKER_WINDOW_WINDOW, "Window" }}; +static std::unordered_map displayModes = {{ TRACKER_DISPLAY_ALWAYS, "Always" }, { TRACKER_DISPLAY_COMBO_BUTTON, "Combo Button Hold" }}; +static std::unordered_map buttons = {{ TRACKER_COMBO_BUTTON_A, "A" }, { TRACKER_COMBO_BUTTON_B, "B"}, { TRACKER_COMBO_BUTTON_C_UP, "C-Up"}, + { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, { TRACKER_COMBO_BUTTON_L, "L" }, + { TRACKER_COMBO_BUTTON_Z, "Z" }, { TRACKER_COMBO_BUTTON_R, "R" }, { TRACKER_COMBO_BUTTON_START, "Start" }, { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, + { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }}; +static std::unordered_map displayTypes = {{ SECTION_DISPLAY_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_SEPARATE, "Separate" }}; +static std::unordered_map extendedDisplayTypes = {{ SECTION_DISPLAY_EXTENDED_HIDDEN, "Hidden" }, + { SECTION_DISPLAY_EXTENDED_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_EXTENDED_MISC_WINDOW, "Misc Window" }, { SECTION_DISPLAY_EXTENDED_SEPARATE, "Separate" }}; +static std::unordered_map minimalDisplayTypes = {{ SECTION_DISPLAY_MINIMAL_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MINIMAL_SEPARATE, "Separate" }}; void ItemTrackerSettingsWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -1370,154 +1383,168 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::TableHeadersRow(); ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("BG Color"); - ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - if (ImGui::ColorEdit4("BG Color##gItemTrackerBgColor", (float*)&ChromaKeyBackground, ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel)) { - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorR"), ChromaKeyBackground.x); - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorG"), ChromaKeyBackground.y); - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorB"), ChromaKeyBackground.z); - CVarSetFloat(CVAR_TRACKER_ITEM("BgColorA"), ChromaKeyBackground.w); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - ImGui::PopItemWidth(); + CVarColorPicker("Background Color##gItemTrackerBgColor", CVAR_TRACKER_ITEM("BgColor"), { 0, 0, 0, 0 }, true, + ColorPickerRandomButton | ColorPickerResetButton, THEME_COLOR); - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, TRACKER_WINDOW_FLOATING)) { + ImGui::PopItemWidth(); + if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, ComboboxOptions() + .DefaultIndex(TRACKER_WINDOW_FLOATING).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) { - if (UIWidgets::PaddedEnhancementCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"))) { + if (CVarCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"), CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::PaddedEnhancementCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"))) { + if (CVarCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"), CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, TRACKER_DISPLAY_ALWAYS)) { + if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, ComboboxOptions() + .DefaultIndex(TRACKER_DISPLAY_ALWAYS).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, TRACKER_COMBO_BUTTON_L)) { + if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, ComboboxOptions() + .DefaultIndex(TRACKER_COMBO_BUTTON_L).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, TRACKER_COMBO_BUTTON_R)) { + if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, ComboboxOptions() + .DefaultIndex(TRACKER_COMBO_BUTTON_R).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } } - UIWidgets::PaddedSeparator(); - UIWidgets::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", CVAR_TRACKER_ITEM("IconSize"), 25, 128, "", 36); - UIWidgets::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", CVAR_TRACKER_ITEM("IconSpacing"), -5, 50, "", 12); - UIWidgets::EnhancementSliderInt("Text size : %dpx", "##ITEMTRACKERTEXTSIZE", CVAR_TRACKER_ITEM("TextSize"), 1, 30, "", 13); + ImGui::Separator(); + CVarSliderInt("Icon size : %dpx", CVAR_TRACKER_ITEM("IconSize"), IntSliderOptions().Min(25).Max(128).DefaultValue(36).Color(THEME_COLOR)); + CVarSliderInt("Icon margins : %dpx", CVAR_TRACKER_ITEM("IconSpacing"), IntSliderOptions().Min(-5).Max(50).DefaultValue(12).Color(THEME_COLOR)); + CVarSliderInt("Text size : %dpx", CVAR_TRACKER_ITEM("TextSize"), IntSliderOptions().Min(1).Max(30).DefaultValue(13).Color(THEME_COLOR)); - UIWidgets::Spacer(0); - - ImGui::Text("Ammo/Capacity Tracking"); - UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY); - UIWidgets::InsertHelpHoverText("Customize what the numbers under each item are tracking." - "\n\nNote: items without capacity upgrades will track ammo even in capacity mode"); + ImGui::NewLine(); + CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, ComboboxOptions() + .DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY).ComponentAlignment(ComponentAlignment::Left) + .LabelPosition(LabelPosition::Above).Color(THEME_COLOR) + .Tooltip("Customize what the numbers under each item are tracking." + "\n\nNote: items without capacity upgrades will track ammo even in capacity mode")); if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { - if (UIWidgets::PaddedEnhancementCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"))) { + if (CVarCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"), CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - UIWidgets::Spacer(0); + CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, ComboboxOptions() + .DefaultIndex(KEYS_COLLECTED_MAX).ComponentAlignment(ComponentAlignment::Left) + .LabelPosition(LabelPosition::Above).Color(THEME_COLOR) + .Tooltip("Customize what numbers are shown for key tracking.")); - ImGui::Text("Key Count Tracking"); - UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, KEYS_COLLECTED_MAX); - UIWidgets::InsertHelpHoverText("Customize what numbers are shown for key tracking."); - - UIWidgets::Spacer(0); - - ImGui::Text("Triforce Piece Count Tracking"); - UIWidgets::EnhancementCombobox(CVAR_TRACKER_ITEM("TriforcePieceCounts"), itemTrackerTriforcePieceTrackOptions, TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); - UIWidgets::InsertHelpHoverText("Customize what numbers are shown for triforce piece tracking."); + CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"), itemTrackerTriforcePieceTrackOptions, ComboboxOptions() + .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX).ComponentAlignment(ComponentAlignment::Left) + .LabelPosition(LabelPosition::Above).Color(THEME_COLOR) + .Tooltip("Customize what numbers are shown for triforce piece tracking.")); ImGui::TableNextColumn(); - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { - if (UIWidgets::PaddedEnhancementCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, false)) { + if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"))) { shouldUpdateVectors = true; } } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) { + if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) != SECTION_DISPLAY_HIDDEN) { if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { - if (UIWidgets::PaddedEnhancementCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) { + if (CVarCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (UIWidgets::PaddedEnhancementCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) { + if (CVarCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, SECTION_DISPLAY_EXTENDED_HIDDEN)) { + if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, SECTION_DISPLAY_EXTENDED_HIDDEN)) { + if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, SECTION_DISPLAY_MINIMAL_HIDDEN)) { + if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { - if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, SECTION_DISPLAY_HIDDEN)) { + if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - UIWidgets::EnhancementCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier")); - UIWidgets::InsertHelpHoverText("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot."); - - UIWidgets::Spacer(0); + CVarCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier"), CheckboxOptions() + .Tooltip("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot.").Color(THEME_COLOR)); ImGui::PopStyleVar(1); ImGui::EndTable(); + ImGui::PopFont(); } void ItemTrackerWindow::InitElement() { - float trackerBgR = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorR"), 0); - float trackerBgG = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorG"), 0); - float trackerBgB = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorB"), 0); - float trackerBgA = CVarGetFloat(CVAR_TRACKER_ITEM("BgColorA"), 1); - ChromaKeyBackground = { - trackerBgR, - trackerBgG, - trackerBgB, - trackerBgA - }; // Float value, 1 = 255 in rgb value. // Crashes when the itemTrackerNotes is empty, so add an empty character to it if (itemTrackerNotes.empty()) { itemTrackerNotes.push_back(0); diff --git a/soh/soh/Enhancements/randomizer/randomizer_settings_window.h b/soh/soh/Enhancements/randomizer/randomizer_settings_window.h index 9f297c29d..034101aba 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_settings_window.h +++ b/soh/soh/Enhancements/randomizer/randomizer_settings_window.h @@ -1,3 +1,5 @@ +#pragma once + #include namespace Rando { diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index cf1acdd7f..447da07f9 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -246,15 +246,15 @@ void Settings::CreateOptions() { 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); + OPT_U8(RSK_KEYRINGS_GERUDO_FORTRESS, "Gerudo Fortress Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGerudoFortress"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_FOREST_TEMPLE, "Forest Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsForestTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_FIRE_TEMPLE, "Fire Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsFireTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_WATER_TEMPLE, "Water Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsWaterTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_SPIRIT_TEMPLE, "Spirit Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsSpiritTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_SHADOW_TEMPLE, "Shadow Temple Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsShadowTemple"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_BOTTOM_OF_THE_WELL, "Bottom of the Well Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsBottomOfTheWell"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_GTG, "Gerudo Training Ground Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGTG"), "", WidgetType::Combobox, 0); + OPT_U8(RSK_KEYRINGS_GANONS_CASTLE, "Ganon's Castle Keyring", {"No", "Random", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsGanonsCastle"), "", WidgetType::Combobox, 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); @@ -1674,7 +1674,7 @@ void Settings::UpdateOptionProperties() { } // Shuffle 100 GS Reward - Force-Enabled if Ganon's Boss Key is on the 100 GS Reward if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_VANILLA) == RO_GANON_BOSS_KEY_KAK_TOKENS) { - mOptions[RSK_SHUFFLE_100_GS_REWARD].Disable("This option is force-enabled because \"Ganon's Boss Key\" is set to \"100 GS Reward.\"", UIWidgets::CheckboxGraphics::Checkmark); + mOptions[RSK_SHUFFLE_100_GS_REWARD].Disable("This option is force-enabled because \"Ganon's Boss Key\" is set to \"100 GS Reward.\""); } else { mOptions[RSK_SHUFFLE_100_GS_REWARD].Enable(); } diff --git a/soh/soh/Enhancements/randomizer/tricks.cpp b/soh/soh/Enhancements/randomizer/tricks.cpp index 6008ba332..69b3db88d 100644 --- a/soh/soh/Enhancements/randomizer/tricks.cpp +++ b/soh/soh/Enhancements/randomizer/tricks.cpp @@ -1,4 +1,5 @@ #include "tricks.h" +#include "soh/SohGui/UIWidgets.hpp" #include namespace Rando { @@ -71,7 +72,6 @@ namespace Rando { const ImVec4 Tricks::GetTextColor(const Tag tag) { switch(tag) { - case Tag::EXPERIMENTAL: case Tag::GLITCH: return { 0.00f, 0.00f, 0.00f, 1.0f }; default: @@ -82,32 +82,33 @@ namespace Rando { const ImVec4 Tricks::GetTagColor(const Tag tag) { switch(tag) { case Tag::NOVICE: - return { 0.09f, 0.55f, 0.37f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::Green); case Tag::INTERMEDIATE: - return { 0.95f, 0.52f, 0.00f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::Orange); case Tag::ADVANCED: - return { 0.00f, 0.29f, 0.71f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::Blue); case Tag::EXPERT: - return { 0.53f, 0.05f, 0.14f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::Red); case Tag::EXTREME: - return { 0.27f, 0.00f, 0.27f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::Purple); case Tag::EXPERIMENTAL: - return { 0.00f, 1.00f, 1.00f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::LightBlue); case Tag::GLITCH: - return { 1.00f, 1.00f, 1.00f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::White); default: assert(false); - return { 0.50f, 0.50f, 0.50f, 1.00f }; + return UIWidgets::ColorValues.at(UIWidgets::Colors::Gray); } } - void Tricks::DrawTagChips(const std::set& rtTags) { + void Tricks::DrawTagChips(const std::set& rtTags, std::string trickName) { for (const Tag rtTag : rtTags) { + std::string tagId = GetTagName(rtTag) + "##" + trickName; ImGui::SameLine(); ImGui::BeginDisabled(); - ImGui::PushStyleColor(ImGuiCol_Button, GetTagColor(rtTag)); - ImGui::SmallButton(GetTagName(rtTag).c_str()); - ImGui::PopStyleColor(); + UIWidgets::PushStyleButton(GetTagColor(rtTag)); + ImGui::SmallButton(tagId.c_str()); + UIWidgets::PopStyleButton(); ImGui::EndDisabled(); } } diff --git a/soh/soh/Enhancements/randomizer/tricks.h b/soh/soh/Enhancements/randomizer/tricks.h index b3b635555..ddaa0f27c 100644 --- a/soh/soh/Enhancements/randomizer/tricks.h +++ b/soh/soh/Enhancements/randomizer/tricks.h @@ -28,7 +28,7 @@ namespace Rando { static const std::string GetTagName(Tag tag); static const ImVec4 GetTextColor(Tag tag); static const ImVec4 GetTagColor(Tag tag); - static void DrawTagChips(const std::set& rtTags); + static void DrawTagChips(const std::set& rtTags, std::string trickName = ""); }; } diff --git a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp b/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp deleted file mode 100644 index a18aea8dc..000000000 --- a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.cpp +++ /dev/null @@ -1,489 +0,0 @@ -#include "ResolutionEditor.h" -#include -#include - -#include "soh/SohGui/UIWidgets.hpp" -#include -#include "soh/OTRGlobals.h" -#include "soh/cvar_prefixes.h" - -/* Console Variables are grouped under gAdvancedResolution. (e.g. CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled") - - The following cvars are used in Libultraship and can be edited here: - - Enabled - Turns Advanced Resolution Mode on. - - AspectRatioX, AspectRatioY - Aspect ratio controls. To toggle off, set either to zero. - - VerticalPixelCount, VerticalResolutionToggle - Resolution controls. - - PixelPerfectMode, IntegerScale.Factor - Pixel Perfect Mode a.k.a. integer scaling controls. - - IntegerScale.FitAutomatically - Automatic resizing for Pixel Perfect Mode. - - IntegerScale.NeverExceedBounds - Prevents manual resizing from exceeding screen bounds. - - The following cvars are also implemented in LUS for niche use cases: - - IgnoreAspectCorrection - Stretch framebuffer to fill screen. - This is something of a power-user setting for niche setups that most people won't need or care about, - but may be useful if playing the Switch/Wii U ports on a 4:3 television. - - IntegerScale.ExceedBoundsBy - Offset the max screen bounds, usually by +1. - This isn't that useful at the moment, so it's unused here. -*/ - -namespace AdvancedResolutionSettings { -enum setting { UPDATE_aspectRatioX, UPDATE_aspectRatioY, UPDATE_verticalPixelCount }; - -const char* aspectRatioPresetLabels[] = { - "Off", "Custom", "Original (4:3)", "Widescreen (16:9)", "Nintendo 3DS (5:3)", "16:10 (8:5)", "Ultrawide (21:9)" -}; -const float aspectRatioPresetsX[] = { 0.0f, 16.0f, 4.0f, 16.0f, 5.0f, 16.0f, 21.0f }; -const float aspectRatioPresetsY[] = { 0.0f, 9.0f, 3.0f, 9.0f, 3.0f, 10.0f, 9.0f }; -const int default_aspectRatio = 1; // Default combo list option - -const char* pixelCountPresetLabels[] = { "Custom", "Native N64 (240p)", "2x (480p)", "3x (720p)", "4x (960p)", - "5x (1200p)", "6x (1440p)", "Full HD (1080p)", "4K (2160p)" }; -const int pixelCountPresets[] = { 480, 240, 480, 720, 960, 1200, 1440, 1080, 2160 }; -const int default_pixelCount = 0; // Default combo list option - -// Resolution clamp values as hardcoded in LUS::Gui::ApplyResolutionChanges() -const uint32_t minVerticalPixelCount = SCREEN_HEIGHT; -const uint32_t maxVerticalPixelCount = 4320; // 18x native, or 8K TV resolution - -const unsigned short default_maxIntegerScaleFactor = 6; // Default size of Integer scale factor slider. - -enum messageType { MESSAGE_ERROR, MESSAGE_WARNING, MESSAGE_QUESTION, MESSAGE_INFO, MESSAGE_GRAY_75 }; -const ImVec4 messageColor[]{ - { 0.85f, 0.0f, 0.0f, 1.0f }, // MESSAGE_ERROR - { 0.85f, 0.85f, 0.0f, 1.0f }, // MESSAGE_WARNING - { 0.0f, 0.85f, 0.85f, 1.0f }, // MESSAGE_QUESTION - { 0.0f, 0.85f, 0.55f, 1.0f }, // MESSAGE_INFO - { 0.75f, 0.75f, 0.75f, 1.0f } // MESSAGE_GRAY_75 -}; -const float enhancementSpacerHeight = 19.0f; - -void AdvancedResolutionSettingsWindow::InitElement() { -} - -void AdvancedResolutionSettingsWindow::DrawElement() { - // Initialise update flags. - bool update[3]; - for (uint8_t i = 0; i < sizeof(update); i++) - update[i] = false; - - // Initialise integer scale bounds. - short max_integerScaleFactor = default_maxIntegerScaleFactor; // default value, which may or may not get - // overridden depending on viewport res - - short integerScale_maximumBounds = 1; // can change when window is resized - // This is mostly just for UX purposes, as Fit Automatically logic is part of LUS. - if (((float)gfx_current_game_window_viewport.width / gfx_current_game_window_viewport.height) > - ((float)gfx_current_dimensions.width / gfx_current_dimensions.height)) { - // Scale to window height - integerScale_maximumBounds = gfx_current_game_window_viewport.height / gfx_current_dimensions.height; - } else { - // Scale to window width - integerScale_maximumBounds = gfx_current_game_window_viewport.width / gfx_current_dimensions.width; - } - // Lower-clamping maximum bounds value to 1 is no-longer necessary as that's accounted for in LUS. - // Letting it go below 1 in this Editor will even allow for checking if screen bounds are being exceeded. - if (default_maxIntegerScaleFactor < integerScale_maximumBounds) { - max_integerScaleFactor = - integerScale_maximumBounds + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); - } - - // Combo List defaults - static int item_aspectRatio = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", 3); - static int item_pixelCount = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", default_pixelCount); - // Stored Values for non-UIWidgets elements - static float aspectRatioX = - CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioPresetsX[item_aspectRatio]); - static float aspectRatioY = - CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioPresetsY[item_aspectRatio]); - static int verticalPixelCount = - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", pixelCountPresets[item_pixelCount]); - // Additional settings - static bool showHorizontalResField = false; - static int horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - // Disabling flags - const bool disabled_everything = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); - const bool disabled_pixelCount = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); - -#ifdef __APPLE__ - // Display HiDPI warning. (Remove this once we can definitively say it's fixed.) - ImGui::TextColored(messageColor[MESSAGE_INFO], - ICON_FA_INFO_CIRCLE " These settings may behave incorrectly on Retina displays."); - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); -#endif - - if (ImGui::CollapsingHeader("Original Settings", ImGuiTreeNodeFlags_DefaultOpen)) { - // The original resolution slider (for convenience) - const bool disabled_resolutionSlider = (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0) && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0)) || - CVarGetInteger(CVAR_LOW_RES_MODE, 0); - if (UIWidgets::EnhancementSliderFloat("Internal Resolution: %.1f%%", "##IMul", CVAR_INTERNAL_RESOLUTION, 0.5f, - 2.0f, "", 1.0f, true, true, disabled_resolutionSlider)) { - Ship::Context::GetInstance()->GetWindow()->SetResolutionMultiplier( - CVarGetFloat(CVAR_INTERNAL_RESOLUTION, 1)); - } - UIWidgets::Tooltip("Multiplies your output resolution by the value entered."); - - // The original MSAA slider (also for convenience) -#ifndef __WIIU__ - if (UIWidgets::PaddedEnhancementSliderInt("MSAA: %d", "##IMSAA", CVAR_MSAA_VALUE, 1, 8, "", 1, true, true, - false)) { - Ship::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger(CVAR_MSAA_VALUE, 1)); - }; - UIWidgets::Tooltip( - "Activates multi-sample anti-aliasing when above 1x, up to 8x for 8 samples for every pixel.\n\n" - " " ICON_FA_INFO_CIRCLE - " (Higher MSAA with low resolution can approximate an authentic \"real N64\" look!)"); -#endif - - // N64 Mode toggle (again for convenience) - // UIWidgets::PaddedEnhancementCheckbox("(Enhancements>Graphics) N64 Mode", CVAR_LOW_RES_MODE, false, false, false, "", UIWidgets::CheckboxGraphics::Cross, false); - } - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - // Activator - UIWidgets::PaddedEnhancementCheckbox("Enable advanced settings.", CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", false, false, - false, "", UIWidgets::CheckboxGraphics::Cross, false); - // Error/Warning display - if (!CVarGetInteger(CVAR_LOW_RES_MODE, 0)) { - if (IsDroppingFrames()) { // Significant frame drop warning - ImGui::TextColored(messageColor[MESSAGE_WARNING], - ICON_FA_EXCLAMATION_TRIANGLE " Significant frame rate (FPS) drops may be occuring."); - UIWidgets::Spacer(2); - } else { // No warnings - UIWidgets::Spacer(enhancementSpacerHeight); - } - } else { // N64 Mode warning - ImGui::TextColored(messageColor[MESSAGE_QUESTION], - ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings."); - ImGui::SameLine(); - if (ImGui::Button("Click to disable")) { - CVarSetInteger(CVAR_LOW_RES_MODE, 0); - CVarSave(); - } - } - // Resolution visualiser - ImGui::Text("Viewport dimensions: %d x %d", gfx_current_game_window_viewport.width, - gfx_current_game_window_viewport.height); - ImGui::Text("Internal resolution: %d x %d", gfx_current_dimensions.width, gfx_current_dimensions.height); - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - if (disabled_everything) { // Hide aspect ratio controls. - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - // Aspect Ratio - ImGui::Text("Force aspect ratio:"); - ImGui::SameLine(); - ImGui::TextColored(messageColor[MESSAGE_GRAY_75], "(Select \"Off\" to disable.)"); - // Presets - if (ImGui::Combo(" ", &item_aspectRatio, aspectRatioPresetLabels, - IM_ARRAYSIZE(aspectRatioPresetLabels)) && - item_aspectRatio != default_aspectRatio) { // don't change anything if "Custom" is selected. - aspectRatioX = aspectRatioPresetsX[item_aspectRatio]; - aspectRatioY = aspectRatioPresetsY[item_aspectRatio]; - - if (showHorizontalResField) { - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } - - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); - CVarSave(); - } - // Hide aspect ratio input fields if using one of the presets. - if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) { - // Declare input interaction bools outside of IF statement to prevent Y field from disappearing. - const bool input_X = ImGui::InputFloat("X", &aspectRatioX, 0.1f, 1.0f, "%.3f"); - const bool input_Y = ImGui::InputFloat("Y", &aspectRatioY, 0.1f, 1.0f, "%.3f"); - if (input_X || input_Y) { - item_aspectRatio = default_aspectRatio; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - } - } else if (showHorizontalResField) { // Show calculated aspect ratio - if (item_aspectRatio) { - UIWidgets::Spacer(2); - const float resolvedAspectRatio = (float)gfx_current_dimensions.width / gfx_current_dimensions.height; - ImGui::Text("Aspect ratio: %.2f:1", resolvedAspectRatio); - } else { - UIWidgets::Spacer(enhancementSpacerHeight); - } - } - - if (disabled_everything) { // Hide aspect ratio controls. - UIWidgets::ReEnableComponent("disabledTooltipText"); - } - UIWidgets::Spacer(0); - - // Vertical Resolution - UIWidgets::PaddedEnhancementCheckbox("Set fixed vertical resolution (disables Resolution slider)", - CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", true, false, - disabled_everything, "", UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip( - "Override the resolution scale slider and use the settings below, irrespective of window size."); - if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - if (ImGui::Combo("Pixel Count Presets", &item_pixelCount, pixelCountPresetLabels, - IM_ARRAYSIZE(pixelCountPresetLabels)) && - item_pixelCount != default_pixelCount) { // don't change anything if "Custom" is selected. - verticalPixelCount = pixelCountPresets[item_pixelCount]; - - if (showHorizontalResField) { - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } - - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); - CVarSave(); - } - // Horizontal Resolution, if visibility is enabled for it. - if (showHorizontalResField) { - // Only show the field if Aspect Ratio is being enforced. - if ((aspectRatioX > 0.0f) && (aspectRatioY > 0.0f)) { - // So basically we're "faking" this one by setting aspectRatioX instead. - if (ImGui::InputInt("Horiz. Pixel Count", &horizontalPixelCount, 8, 320)) { - item_aspectRatio = default_aspectRatio; - if (horizontalPixelCount < SCREEN_WIDTH) { - horizontalPixelCount = SCREEN_WIDTH; - } - aspectRatioX = horizontalPixelCount; - aspectRatioY = verticalPixelCount; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - } - } else { // Display a notice instead. - ImGui::TextColored(messageColor[MESSAGE_QUESTION], - ICON_FA_QUESTION_CIRCLE " \"Force aspect ratio\" required."); - // ImGui::Text(" "); - ImGui::SameLine(); - if (ImGui::Button("Click to resolve")) { - item_aspectRatio = default_aspectRatio; // Set it to Custom - aspectRatioX = aspectRatioPresetsX[2]; // but use the 4:3 defaults - aspectRatioY = aspectRatioPresetsY[2]; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } - } - } - // Vertical Resolution part 2 - if (ImGui::InputInt("Vertical Pixel Count", &verticalPixelCount, 8, 240)) { - item_pixelCount = default_pixelCount; - update[UPDATE_verticalPixelCount] = true; - - // Account for the natural instinct to enter horizontal first. - // Ignore vertical resolutions that are below the lower clamp constant. - if (showHorizontalResField && !(verticalPixelCount < minVerticalPixelCount)) { - item_aspectRatio = default_aspectRatio; - aspectRatioX = horizontalPixelCount; - aspectRatioY = verticalPixelCount; - update[UPDATE_aspectRatioX] = true; - update[UPDATE_aspectRatioY] = true; - } - } - if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. - UIWidgets::ReEnableComponent("disabledTooltipText"); - } - - UIWidgets::Spacer(0); - - // Integer scaling settings group (Pixel-perfect Mode) - static const ImGuiTreeNodeFlags IntegerScalingResolvedImGuiFlag = - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) ? ImGuiTreeNodeFlags_DefaultOpen - : ImGuiTreeNodeFlags_None; - if (ImGui::CollapsingHeader("Integer Scaling Settings", IntegerScalingResolvedImGuiFlag)) { - const bool disabled_pixelPerfectMode = - !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything; - // Pixel-perfect Mode - UIWidgets::PaddedEnhancementCheckbox("Pixel-perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", true, - true, disabled_pixelCount || disabled_everything, "", - UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip("Don't scale image to fill window."); - if (disabled_pixelCount && CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0)) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0); - CVarSave(); - } - - // Integer Scaling - UIWidgets::EnhancementSliderInt( - "Integer scale factor: %d", "##ARSIntScale", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1, - max_integerScaleFactor, "%d", 1, true, - disabled_pixelPerfectMode || CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)); - UIWidgets::Tooltip("Integer scales the image. Only available in pixel-perfect mode."); - // Display warning if size is being clamped or if framebuffer is larger than viewport. - if (!disabled_pixelPerfectMode && - (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1) > integerScale_maximumBounds)) { - ImGui::SameLine(); - ImGui::TextColored(messageColor[MESSAGE_WARNING], ICON_FA_EXCLAMATION_TRIANGLE " Window exceeded."); - } - - UIWidgets::PaddedEnhancementCheckbox( - "Automatically scale image to fit viewport", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", true, - true, disabled_pixelPerfectMode, "", UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode."); - if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)) { - // This is just here to update the value shown on the slider. - // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", integerScale_maximumBounds); - // CVarSave(); - } - } // End of integer scaling settings - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - - // Collapsible panel for additional settings - if (ImGui::CollapsingHeader("Additional Settings")) { - UIWidgets::Spacer(0); - -#if defined(__SWITCH__) || defined(__WIIU__) - // Disable aspect correction, stretching the framebuffer to fill the viewport. - // This option is only really needed on systems limited to 16:9 TV resolutions, such as consoles. - // The associated cvar is still functional on PC platforms if you want to use it though. - UIWidgets::PaddedEnhancementCheckbox("Disable aspect correction and stretch the output image.\n" - "(Might be useful for 4:3 televisions!)\n" - "Not available in Pixel Perfect Mode.", - CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", false, true, - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || - disabled_everything, - "", UIWidgets::CheckboxGraphics::Cross, false); -#else - if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0)) { - // This setting is intentionally not exposed on PC platforms, - // but may be accidentally activated for varying reasons. - // Having this button should hopefully prevent support headaches. - ImGui::TextColored(messageColor[MESSAGE_QUESTION], ICON_FA_QUESTION_CIRCLE - " If the image is stretched and you don't know why, click this."); - if (ImGui::Button("Click to reenable aspect correction.")) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0); - CVarSave(); - } - UIWidgets::Spacer(2); - } -#endif - - // A requested addition; an alternative way of displaying the resolution field. - if (ImGui::Checkbox("Show a horizontal resolution field, instead of aspect ratio.", &showHorizontalResField)) { - if (!showHorizontalResField && (aspectRatioX > 0.0f)) { // when turning this setting off - // Refresh relevant values - aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - } else { // when turning this setting on - item_aspectRatio = default_aspectRatio; - if (aspectRatioX > 0.0f) { - // Refresh relevant values in the opposite order - horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; - aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; - } - } - update[UPDATE_aspectRatioX] = true; - } - - // Beginning of Integer Scaling additional settings. - { - // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - - // Integer Scaling - Never Exceed Bounds. - const bool disabled_neverExceedBounds = - !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0) || disabled_everything; - const bool checkbox_neverExceedBounds = - UIWidgets::PaddedEnhancementCheckbox("Prevent integer scaling from exceeding screen bounds.\n" - "(Makes screen bounds take priority over specified factor.)", - CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", - true, false, disabled_neverExceedBounds, "", - UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip( - "Prevents integer scaling factor from exceeding screen bounds.\n\n" - "Enabled: Will clamp the scaling factor and display a gentle warning in the resolution editor.\n" - "Disabled: Will allow scaling to exceed screen bounds, for users who want to crop overscan.\n\n" - " " ICON_FA_INFO_CIRCLE - " Please note that exceeding screen bounds may show a scroll bar on-screen."); - - // Initialise the (currently unused) "Exceed Bounds By" cvar if it's been changed. - if (checkbox_neverExceedBounds && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); - CVarSave(); - } - - // Integer Scaling - Exceed Bounds By 1x/Offset. - // A popular feature in some retro frontends/upscalers, sometimes called "crop overscan" or "1080p 5x". - /* - UIWidgets::PaddedEnhancementCheckbox("Allow integer scale factor to go +1 above maximum screen bounds.", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", false, false, !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything, "", UIWidgets::CheckboxGraphics::Cross, false); - */ - // It does actually function as expected, but exceeding the bottom of the screen shows a scroll bar. - // I've ended up commenting this one out because of the scroll bar, and for simplicity. - - // Display an info message about the scroll bar. - if (!CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) || - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { - if (disabled_neverExceedBounds) { // Dim this help text accordingly - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - ImGui::TextColored(messageColor[MESSAGE_INFO], - " " ICON_FA_INFO_CIRCLE - " A scroll bar may become visible if screen bounds are exceeded."); - if (disabled_neverExceedBounds) { // Dim this help text accordingly - UIWidgets::ReEnableComponent("disabledTooltipText"); - } - - // Another support helper button, to disable the unused "Exceed Bounds By" cvar. - // (Remove this button if uncommenting the checkbox.) - if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { - if (ImGui::Button("Click to reset a console variable that may be causing this.")) { - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); - CVarSave(); - } - } - } else { - ImGui::Text(" "); - } - // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - } // End of Integer Scaling additional settings. - - } // End of additional settings - - // Clamp and update the cvars that don't use UIWidgets - if (update[UPDATE_aspectRatioX] || update[UPDATE_aspectRatioY] || update[UPDATE_verticalPixelCount]) { - if (update[UPDATE_aspectRatioX]) { - if (aspectRatioX < 0.0f) { - aspectRatioX = 0.0f; - } - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); - } - if (update[UPDATE_aspectRatioY]) { - if (aspectRatioY < 0.0f) { - aspectRatioY = 0.0f; - } - CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); - } - if (update[UPDATE_verticalPixelCount]) { - // There's a upper and lower clamp on the Libultraship side too, - // so clamping it here is entirely visual, so the vertical resolution field reflects it. - if (verticalPixelCount < minVerticalPixelCount) { - verticalPixelCount = minVerticalPixelCount; - } - if (verticalPixelCount > maxVerticalPixelCount) { - verticalPixelCount = maxVerticalPixelCount; - } - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); - } - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); - CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); - CVarSave(); - } -} - -void AdvancedResolutionSettingsWindow::UpdateElement() { -} - -bool AdvancedResolutionSettingsWindow::IsDroppingFrames() { - // a rather imprecise way of checking for frame drops. - // but it's mostly there to inform the player of large drops. - const short targetFPS = CVarGetInteger(CVAR_SETTING("InterpolationFPS"), 20); - const float threshold = targetFPS / 20.0f + 4.1f; - return ImGui::GetIO().Framerate < targetFPS - threshold; -} -} // namespace AdvancedResolutionSettings diff --git a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.h b/soh/soh/Enhancements/resolution-editor/ResolutionEditor.h deleted file mode 100644 index f75931451..000000000 --- a/soh/soh/Enhancements/resolution-editor/ResolutionEditor.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include - -namespace AdvancedResolutionSettings { -class AdvancedResolutionSettingsWindow : public Ship::GuiWindow { - private: - bool IsDroppingFrames(); - - public: - using GuiWindow::GuiWindow; - - void InitElement() override; - void DrawElement() override; - void UpdateElement() override; -}; -} // namespace AdvancedResolutionSettings diff --git a/soh/soh/Enhancements/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index de9e157c3..4340be330 100644 --- a/soh/soh/Enhancements/timesplits/TimeSplits.cpp +++ b/soh/soh/Enhancements/timesplits/TimeSplits.cpp @@ -1,5 +1,4 @@ #include "TimeSplits.h" -#include "soh/SohGui/UIWidgets.hpp" #include "soh/Enhancements/gameplaystats.h" #include "soh/SaveManager.h" #include "soh/util.h" @@ -14,12 +13,16 @@ #include "soh/Enhancements/debugger/debugSaveEditor.h" #include "soh_assets.h" #include "assets/textures/parameter_static/parameter_static.h" +#include +#include "soh/SohGui/UIWidgets.hpp" extern "C" { extern SaveContext gSaveContext; extern PlayState* gPlayState; } +using namespace UIWidgets; + // ImVec4 Colors #define COLOR_WHITE ImVec4(1.00f, 1.00f, 1.00f, 1.00f) #define COLOR_LIGHT_RED ImVec4(1.0f, 0.05f, 0.0f, 1.0f) @@ -636,59 +639,60 @@ void TimeSplitsDrawSplitsList() { uint32_t dragIndex = 0; ImGui::BeginChild("SplitTable", ImVec2(0.0f, ImGui::GetWindowHeight() - 128.0f)); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(4, 0)); - ImGui::BeginTable("Splits", 5, ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable); - ImGui::TableSetupColumn("Item Image", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, 34.0f); - ImGui::TableSetupColumn("Item Name"); - ImGui::TableSetupColumn("Current Time"); - ImGui::TableSetupColumn("+/-"); - ImGui::TableSetupColumn("Prev. Best"); - ImGui::TableHeadersRow(); + if (ImGui::BeginTable("Splits", 5, ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable)) { + ImGui::TableSetupColumn("Item Image", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, 34.0f); + ImGui::TableSetupColumn("Item Name"); + ImGui::TableSetupColumn("Current Time"); + ImGui::TableSetupColumn("+/-"); + ImGui::TableSetupColumn("Prev. Best"); + ImGui::TableHeadersRow(); - SplitsPushImageButtonStyle(); - for (auto& split : splitList) { - ImGui::TableNextColumn(); - TimeSplitsSplitBestTimeDisplay(split); - - ImGui::PushID(split.splitID); - if (split.splitTimeStatus == SPLIT_STATUS_ACTIVE) { - ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(47, 79, 90, 255)); + SplitsPushImageButtonStyle(); + for (auto& split : splitList) { + ImGui::TableNextColumn(); + TimeSplitsSplitBestTimeDisplay(split); + + ImGui::PushID(split.splitID); + if (split.splitTimeStatus == SPLIT_STATUS_ACTIVE) { + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(47, 79, 90, 255)); + } + TimeSplitsGetImageSize(split.splitID); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); + auto ret = ImGui::ImageButton(split.splitImage.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(split.splitImage), + imageSize, ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), split.splitTint); + ImGui::PopStyleVar(); + if (ret) { + TimeSplitsSkipSplit(dragIndex); + } + HandleDragAndDrop(splitList, dragIndex, split.splitName); + ImGui::TableNextColumn(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 5.0f)); + ImGui::AlignTextToFramePadding(); + ImGui::TextWrapped("%s", split.splitName.c_str()); + ImGui::TableNextColumn(); + // Current Time + ImGui::Text("%s", (split.splitTimeStatus == SPLIT_STATUS_ACTIVE) + ? formatTimestampTimeSplit(GAMEPLAYSTAT_TOTAL_TIME).c_str() : (split.splitTimeStatus == SPLIT_STATUS_COLLECTED) + ? formatTimestampTimeSplit(split.splitTimeCurrent).c_str() : "--:--:-"); + ImGui::TableNextColumn(); + // +/- Difference + ImGui::TextColored(splitTimeColor, "%s", formatTimestampTimeSplit(splitBestTimeDisplay).c_str()); + ImGui::TableNextColumn(); + // Previous Best + ImGui::Text("%s", (split.splitTimePreviousBest != 0) ? formatTimestampTimeSplit(split.splitTimePreviousBest).c_str() : "--:--:-"); + ImGui::PopID(); + ImGui::PopStyleVar(1); + + dragIndex++; } - TimeSplitsGetImageSize(split.splitID); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(split.splitImage.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(split.splitImage), - imageSize, ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), split.splitTint); - ImGui::PopStyleVar(); - if (ret) { - TimeSplitsSkipSplit(dragIndex); - } - HandleDragAndDrop(splitList, dragIndex, split.splitName); - ImGui::TableNextColumn(); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 5.0f)); - ImGui::AlignTextToFramePadding(); - ImGui::TextWrapped("%s", split.splitName.c_str()); - ImGui::TableNextColumn(); - // Current Time - ImGui::Text("%s", (split.splitTimeStatus == SPLIT_STATUS_ACTIVE) - ? formatTimestampTimeSplit(GAMEPLAYSTAT_TOTAL_TIME).c_str() : (split.splitTimeStatus == SPLIT_STATUS_COLLECTED) - ? formatTimestampTimeSplit(split.splitTimeCurrent).c_str() : "--:--:-"); - ImGui::TableNextColumn(); - // +/- Difference - ImGui::TextColored(splitTimeColor, "%s", formatTimestampTimeSplit(splitBestTimeDisplay).c_str()); - ImGui::TableNextColumn(); - // Previous Best - ImGui::Text("%s", (split.splitTimePreviousBest != 0) ? formatTimestampTimeSplit(split.splitTimePreviousBest).c_str() : "--:--:-"); - ImGui::PopID(); - ImGui::PopStyleVar(1); + SplitsPopImageButtonStyle(); - dragIndex++; + TimeSplitsPostDragAndDrop(); + + ImGui::EndTable(); } - SplitsPopImageButtonStyle(); - - TimeSplitsPostDragAndDrop(); - - ImGui::PopStyleVar(1); - ImGui::EndTable(); + ImGui::PopStyleVar(); ImGui::EndChild(); } @@ -769,7 +773,7 @@ void TimeSplitsDrawItemList(uint32_t type) { } void TimeSplitsUpdateWindowSize() { - timeSplitsWindowSize = CVarGetFloat(CVAR_ENHANCEMENT("TimeSplits.WindowSize"), 0); + timeSplitsWindowSize = CVarGetFloat(CVAR_ENHANCEMENT("TimeSplits.WindowScale"), 0); if (timeSplitsWindowSize < 1.0f) { timeSplitsWindowSize = 1.0f; } @@ -777,24 +781,13 @@ void TimeSplitsUpdateWindowSize() { void TimeSplitsDrawOptionsMenu() { ImGui::SeparatorText("Window Options"); - if (ImGui::ColorEdit4("Background Color", (float*)&windowColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) { - Color_RGBA8 color; - color.r = windowColor.x * 255.0; - color.g = windowColor.y * 255.0; - color.b = windowColor.z * 255.0; - color.a = windowColor.w * 255.0; - CVarSetColor("TimeSplits.WindowColor", color); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - ImGui::SameLine(); - if (ImGui::Button("Reset")) { - windowColor = { 0.0f, 0.0f, 0.0f, 1.0f }; - CVarSetColor("TimeSplits.WindowColor", {0, 0, 0, 1}); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Color_RGBA8 defaultColor = { 0, 0, 0, 255 }; + if (CVarColorPicker("Background Color", CVAR_ENHANCEMENT("TimeSplits.WindowColor"), defaultColor, true, 0, THEME_COLOR)) { + windowColor = VecFromRGBA8(CVarGetColor(CVAR_ENHANCEMENT("TimeSplits.WindowColor.Value"), defaultColor)); } - if (UIWidgets::PaddedEnhancementSliderFloat("Window Size: %.1fx", "##windowSize", - CVAR_ENHANCEMENT("TimeSplits.WindowSize"), 1.0f, 3.0f, "", 1.0f, false, true, true, false)) { + if (CVarSliderFloat("Window Scale", CVAR_ENHANCEMENT("TimeSplits.WindowScale"), + FloatSliderOptions().Min(1.0f).Max(3.0f).DefaultValue(1.0f).Format("%.1fx").Size({300.0f, 0.0f}).Step(0.1f).Color(THEME_COLOR))) { TimeSplitsUpdateWindowSize(); } @@ -802,55 +795,44 @@ void TimeSplitsDrawOptionsMenu() { ImGui::Text("New List Name: "); ImGui::PushItemWidth(150.0f); + PushStyleInput(THEME_COLOR); ImGui::InputText("##listName", listNameBuf, 25); + PopStyleInput(); ImGui::PopItemWidth(); ImGui::SameLine(); - if (ImGui::Button("Create List")) { + if (Button("Create List", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { TimeSplitsFileManagement(SPLIT_ACTION_SAVE, listNameBuf, splitList); } UIWidgets::PaddedSeparator(); TimeSplitsFileManagement(SPLIT_ACTION_COLLECT, "", emptyList); static uint32_t selectedItem = 0; - static std::string listItem = keys[0]; ImGui::Text("Select List to Load: "); ImGui::PushItemWidth(150.0f); - if (ImGui::BeginCombo("##listEntries", keys[selectedItem].c_str())) { - for (int i = 0; i < keys.size(); i++) { - bool isSelected = (selectedItem == i); - if (ImGui::Selectable(keys[i].c_str(), isSelected)) { - selectedItem = i; - listItem = keys[i].c_str(); - } - if (isSelected) { - ImGui::SetItemDefaultFocus(); - } - } - ImGui::EndCombo(); - } + Combobox("", &selectedItem, keys, ComboboxOptions().Color(THEME_COLOR).LabelPosition(LabelPosition::Near)); ImGui::PopItemWidth(); ImGui::SameLine(); - if (ImGui::Button("Load List")) { + if (Button("Load List", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { TimeSplitsFileManagement(SPLIT_ACTION_LOAD, keys[selectedItem].c_str(), emptyList); } ImGui::SameLine(); - if (ImGui::Button("Save List")) { + if (Button("Save List", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { TimeSplitsFileManagement(SPLIT_ACTION_SAVE, keys[selectedItem].c_str(), splitList); } ImGui::SameLine(); - if (ImGui::Button("Delete List")) { + if (Button("Delete List", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { TimeSplitsFileManagement(SPLIT_ACTION_DELETE, keys[selectedItem].c_str(), emptyList); } - UIWidgets::PaddedSeparator(); + UIWidgets::Separator(true, true, ImGui::GetStyle().ItemSpacing.y, ImGui::GetStyle().ItemSpacing.y); - if (ImGui::Button("New Attempt")) { + if (Button("New Attempt", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { for (auto& data : splitList) { data.splitTimeStatus = SPLIT_STATUS_INACTIVE; } splitList[0].splitTimeStatus = SPLIT_STATUS_ACTIVE; } ImGui::SameLine(); - if (ImGui::Button("Update Splits")) { + if (Button("Update Splits", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { TimeSplitsFileManagement(SPLIT_ACTION_UPDATE, keys[selectedItem].c_str(), splitList); } } @@ -864,75 +846,80 @@ void TimeSplitsRemoveSplitEntry(uint32_t index) { void TimeSplitsDrawManageList() { uint32_t index = 0; - ImGui::BeginTable("List Management", 2, ImGuiTableFlags_BordersInnerV); - ImGui::TableSetupColumn("Preview", ImGuiTableColumnFlags_WidthFixed, 60.0f); - ImGui::TableSetupColumn("Options", ImGuiTableColumnFlags_NoHeaderLabel); + ImGui::BeginChild("SplitTable", ImVec2(0.0f, ImGui::GetWindowHeight() - 128.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(4, 0)); + if (ImGui::BeginTable("List Management", 2, ImGuiTableFlags_BordersInnerV)) { + ImGui::TableSetupColumn("Preview", ImGuiTableColumnFlags_WidthFixed, 120.0f); + ImGui::TableSetupColumn("Options", ImGuiTableColumnFlags_NoHeaderLabel); - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 1.0f, 1.0f, 0.2f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 0.1f)); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 1.0f, 1.0f, 0.2f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 0.1f)); - ImGui::TableNextColumn(); - ImGui::BeginTabBar("List Preview"); - if (ImGui::BeginTabItem("Preview")) { - ImGui::BeginChild("PreviewChild"); - for (auto& data : splitList) { - float availableWidth = ImGui::GetContentRegionAvail().x; - float imageWidth = 38.0f; // Width of your image button - float offsetX = (availableWidth - imageWidth) * 0.5f; // Centering offset + ImGui::TableNextColumn(); + ImGui::BeginTabBar("List Preview"); + if (ImGui::BeginTabItem("Preview")) { + ImGui::BeginChild("PreviewChild"); + for (auto& data : splitList) { + float availableWidth = ImGui::GetContentRegionAvail().x; + float imageWidth = 38.0f; // Width of your image button + float offsetX = (availableWidth - imageWidth) * 0.5f; // Centering offset - if (offsetX > 0.0f) { - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + offsetX); // Apply the offset to center + if (offsetX > 0.0f) { + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + offsetX); // Apply the offset to center + } + TimeSplitsGetImageSize(data.splitID); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); + auto ret = ImGui::ImageButton(data.splitImage.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(data.splitImage), + imageSize, ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), data.splitTint); + ImGui::PopStyleVar(); + if (ret) { + removeIndex = index; + } + HandleDragAndDrop(splitList, index, splitList[index].splitName); + index++; } - TimeSplitsGetImageSize(data.splitID); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(data.splitImage.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(data.splitImage), - imageSize, ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), data.splitTint); - ImGui::PopStyleVar(); - if (ret) { - removeIndex = index; - } - HandleDragAndDrop(splitList, index, splitList[index].splitName); - index++; + TimeSplitsRemoveSplitEntry(removeIndex); + ImGui::EndChild(); + ImGui::EndTabItem(); } - TimeSplitsRemoveSplitEntry(removeIndex); - ImGui::EndChild(); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - - ImGui::PopStyleColor(3); - ImGui::TableNextColumn(); - ImGui::BeginTabBar("List Options"); - if (ImGui::BeginTabItem("Equipment")) { - TimeSplitsDrawItemList(SPLIT_TYPE_EQUIPMENT); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Inventory")) { - TimeSplitsDrawItemList(SPLIT_TYPE_ITEM); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Quest")) { - TimeSplitsDrawItemList(SPLIT_TYPE_QUEST); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Entrances")) { - TimeSplitsDrawItemList(SPLIT_TYPE_ENTRANCE); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Bosses")) { - TimeSplitsDrawItemList(SPLIT_TYPE_BOSS); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Miscellaneous")) { - TimeSplitsDrawItemList(SPLIT_TYPE_MISC); - ImGui::EndTabItem(); - } + ImGui::EndTabBar(); - TimeSplitsPostDragAndDrop(); + ImGui::PopStyleColor(3); + ImGui::TableNextColumn(); + ImGui::BeginTabBar("List Options"); + if (ImGui::BeginTabItem("Equipment")) { + TimeSplitsDrawItemList(SPLIT_TYPE_EQUIPMENT); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Inventory")) { + TimeSplitsDrawItemList(SPLIT_TYPE_ITEM); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Quest")) { + TimeSplitsDrawItemList(SPLIT_TYPE_QUEST); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Entrances")) { + TimeSplitsDrawItemList(SPLIT_TYPE_ENTRANCE); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Bosses")) { + TimeSplitsDrawItemList(SPLIT_TYPE_BOSS); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Miscellaneous")) { + TimeSplitsDrawItemList(SPLIT_TYPE_MISC); + ImGui::EndTabItem(); + } - ImGui::EndTabBar(); - ImGui::EndTable(); + TimeSplitsPostDragAndDrop(); + + ImGui::EndTabBar(); + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + ImGui::EndChild(); } void InitializeSplitDataFile() { @@ -954,14 +941,9 @@ static bool initialized = false; void TimeSplitWindow::DrawElement() { ImGui::SetWindowFontScale(timeSplitsWindowSize); - if (!initialized) { - Color_RGBA8 defaultColour = {0, 0, 0, 255}; - Color_RGBA8 color = CVarGetColor("TimeSplits.WindowColor", defaultColour); - windowColor = {(float)color.r / 255.0f, (float)color.g / 255.0f, (float)color.b / 255.0f, (float)color.a / 255.0f}; - InitializeSplitDataFile(); - initialized = true; - } + ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); + PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Split Tabs")) { if (ImGui::BeginTabItem("Splits")) { TimeSplitsDrawSplitsList(); @@ -977,6 +959,8 @@ void TimeSplitWindow::DrawElement() { } ImGui::EndTabBar(); } + PopStyleTabs(); + ImGui::PopFont(); } void TimeSplitWindow::InitElement() { @@ -984,6 +968,9 @@ void TimeSplitWindow::InitElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("SPECIAL_TRIFORCE_PIECE_WHITE", gWTriforcePieceTex, ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("SPECIAL_SPLIT_ENTRANCE", gSplitEntranceTex, ImVec4(1, 1, 1, 1)); + Color_RGBA8 defaultColour = {0, 0, 0, 255}; + windowColor = VecFromRGBA8(CVarGetColor(CVAR_ENHANCEMENT("TimeSplits.WindowColor.Value"), defaultColour)); + InitializeSplitDataFile(); GameInteractor::Instance->RegisterGameHook([](u8 item) { if (item != ITEM_SKULL_TOKEN) { diff --git a/soh/soh/Network/CrowdControl/CrowdControl.cpp b/soh/soh/Network/CrowdControl/CrowdControl.cpp index 184d6cad2..34532f73b 100644 --- a/soh/soh/Network/CrowdControl/CrowdControl.cpp +++ b/soh/soh/Network/CrowdControl/CrowdControl.cpp @@ -764,69 +764,4 @@ CrowdControl::Effect* CrowdControl::ParseMessage(nlohmann::json dataReceived) { return effect; } - -void CrowdControl::DrawMenu() { - ImGui::PushID("CrowdControl"); - - static std::string host = CVarGetString(CVAR_REMOTE_CROWD_CONTROL("Host"), "127.0.0.1"); - static uint16_t port = CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Port"), 43384); - bool isFormValid = !SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535; - - ImGui::SeparatorText("Crowd Control"); - UIWidgets::Tooltip( - "Crowd Control is a platform that allows viewers to interact " - "with a streamer's game in real time.\n" - "\n" - "Click the question mark to copy the link to the Crowd Control " - "website to your clipboard." - ); - if (ImGui::IsItemClicked()) { - ImGui::SetClipboardText("https://crowdcontrol.live"); - } - - ImGui::BeginDisabled(isEnabled); - ImGui::Text("Host & Port"); - if (UIWidgets::InputString("##Host", &host)) { - CVarSetString(CVAR_REMOTE_CROWD_CONTROL("Host"), host.c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - - ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetFontSize() * 5); - if (ImGui::InputScalar("##Port", ImGuiDataType_U16, &port)) { - CVarSetInteger(CVAR_REMOTE_CROWD_CONTROL("Port"), port); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - ImGui::PopItemWidth(); - ImGui::EndDisabled(); - - ImGui::Spacing(); - - ImGui::BeginDisabled(!isFormValid); - const char* buttonLabel = isEnabled ? "Disable" : "Enable"; - if (ImGui::Button(buttonLabel, ImVec2(-1.0f, 0.0f))) { - if (isEnabled) { - CVarClear(CVAR_REMOTE_CROWD_CONTROL("Enabled")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - Disable(); - } else { - CVarSetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 1); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - Enable(); - } - } - ImGui::EndDisabled(); - - if (isEnabled) { - ImGui::Spacing(); - if (isConnected) { - ImGui::Text("Connected"); - } else { - ImGui::Text("Connecting..."); - } - } - - ImGui::PopID(); -} - #endif diff --git a/soh/soh/Network/CrowdControl/CrowdControl.h b/soh/soh/Network/CrowdControl/CrowdControl.h index 534197807..8aff1c96e 100644 --- a/soh/soh/Network/CrowdControl/CrowdControl.h +++ b/soh/soh/Network/CrowdControl/CrowdControl.h @@ -84,7 +84,6 @@ class CrowdControl : public Network { void OnIncomingJson(nlohmann::json payload); void OnConnected(); void OnDisconnected(); - void DrawMenu(); }; #endif // __cplusplus diff --git a/soh/soh/Network/Sail/Sail.cpp b/soh/soh/Network/Sail/Sail.cpp index f9ae7b313..272214115 100644 --- a/soh/soh/Network/Sail/Sail.cpp +++ b/soh/soh/Network/Sail/Sail.cpp @@ -501,72 +501,4 @@ void Sail::RegisterHooks() { }); } -void Sail::DrawMenu() { - ImGui::PushID("Sail"); - - static std::string host = CVarGetString(CVAR_REMOTE_SAIL("Host"), "127.0.0.1"); - static uint16_t port = CVarGetInteger(CVAR_REMOTE_SAIL("Port"), 43384); - bool isFormValid = !SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535; - - ImGui::SeparatorText("Sail"); - UIWidgets::Tooltip( - "Sail is a networking protocol designed to facilitate remote " - "control of the Ship of Harkinian client. It is intended to " - "be utilized alongside a Sail server, for which we provide a " - "few straightforward implementations on our GitHub. The current " - "implementations available allow integration with Twitch chat " - "and SAMMI Bot, feel free to contribute your own!\n" - "\n" - "Click the question mark to copy the link to the Sail Github " - "page to your clipboard." - ); - if (ImGui::IsItemClicked()) { - ImGui::SetClipboardText("https://github.com/HarbourMasters/sail"); - } - - ImGui::BeginDisabled(isEnabled); - ImGui::Text("Host & Port"); - if (UIWidgets::InputString("##Host", &host)) { - CVarSetString(CVAR_REMOTE_SAIL("Host"), host.c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - - ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetFontSize() * 5); - if (ImGui::InputScalar("##Port", ImGuiDataType_U16, &port)) { - CVarSetInteger(CVAR_REMOTE_SAIL("Port"), port); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - ImGui::PopItemWidth(); - ImGui::EndDisabled(); - - ImGui::Spacing(); - - ImGui::BeginDisabled(!isFormValid); - const char* buttonLabel = isEnabled ? "Disable" : "Enable"; - if (ImGui::Button(buttonLabel, ImVec2(-1.0f, 0.0f))) { - if (isEnabled) { - CVarClear(CVAR_REMOTE_SAIL("Enabled")); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - Disable(); - } else { - CVarSetInteger(CVAR_REMOTE_SAIL("Enabled"), 1); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - Enable(); - } - } - ImGui::EndDisabled(); - - if (isEnabled) { - ImGui::Spacing(); - if (isConnected) { - ImGui::Text("Connected"); - } else { - ImGui::Text("Connecting..."); - } - } - - ImGui::PopID(); -} - #endif // ENABLE_REMOTE_CONTROL diff --git a/soh/soh/Network/Sail/Sail.h b/soh/soh/Network/Sail/Sail.h index 8c7c9d55e..2a41b8723 100644 --- a/soh/soh/Network/Sail/Sail.h +++ b/soh/soh/Network/Sail/Sail.h @@ -18,7 +18,6 @@ class Sail : public Network { void OnIncomingJson(nlohmann::json payload); void OnConnected(); void OnDisconnected(); - void DrawMenu(); }; #endif // __cplusplus diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2acc01d7f..0b8d0030a 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -40,6 +40,7 @@ #include "z64.h" #include "macros.h" #include "Fonts.h" +#include "window/gui/resource/Font.h" #include #include "Enhancements/custom-message/CustomMessageManager.h" #include "Enhancements/presets.h" @@ -345,7 +346,7 @@ OTRGlobals::OTRGlobals() { context->InitCrashHandler(); context->InitConsole(); - auto sohInputEditorWindow = std::make_shared(CVAR_WINDOW("ControllerConfiguration"), "Controller Configuration"); + auto sohInputEditorWindow = std::make_shared(CVAR_WINDOW("ControllerConfiguration"), "Configure Controller"); auto sohFast3dWindow = std::make_shared(std::vector>({sohInputEditorWindow})); context->InitWindow(sohFast3dWindow); @@ -399,9 +400,14 @@ OTRGlobals::OTRGlobals() { hasMasterQuest = hasOriginal = false; previousImGuiScale = defaultImGuiScale; - defaultFontSmaller = CreateDefaultFontWithSize(10.0f); - defaultFontLarger = CreateDefaultFontWithSize(16.0f); - defaultFontLargest = CreateDefaultFontWithSize(20.0f); + + fontMono = CreateFontWithSize(16.0f, "fonts/Inconsolata-Regular.ttf"); + fontMonoLarger = CreateFontWithSize(20.0f, "fonts/Inconsolata-Regular.ttf"); + fontMonoLargest = CreateFontWithSize(24.0f, "fonts/Inconsolata-Regular.ttf"); + fontStandard = CreateFontWithSize(16.0f, "fonts/Montserrat-Regular.ttf"); + fontStandardLarger = CreateFontWithSize(20.0f, "fonts/Montserrat-Regular.ttf"); + fontStandardLargest = CreateFontWithSize(24.0f, "fonts/Montserrat-Regular.ttf"); + ImGui::GetIO().FontDefault = fontMono; ScaleImGui(); // Move the camera strings from read only memory onto the heap (writable memory) @@ -1390,9 +1396,12 @@ void RunCommands(Gfx* Commands, const std::vector // Process window events for resize, mouse, keyboard events wnd->HandleEvents(); + UIWidgets::Colors themeColor = static_cast(CVarGetInteger(CVAR_SETTING("Menu.Theme"), UIWidgets::Colors::LightBlue)); + ImGui::PushStyleColor(ImGuiCol_TitleBgActive, UIWidgets::ColorValues.at(themeColor)); for (const auto& m : mtx_replacements) { wnd->DrawAndRunGraphicsCommands(Commands, m); } + ImGui::PopStyleColor(); } // C->C++ Bridge @@ -1559,6 +1568,37 @@ extern "C" SoundFontSample* ReadCustomSample(const char* path) { */ } +ImFont* OTRGlobals::CreateFontWithSize(float size, std::string fontPath) { + auto mImGuiIo = &ImGui::GetIO(); + ImFont* font; + if (fontPath == "") { + ImFontConfig fontCfg = ImFontConfig(); + fontCfg.OversampleH = fontCfg.OversampleV = 1; + fontCfg.PixelSnapH = true; + fontCfg.SizePixels = size; + font = mImGuiIo->Fonts->AddFontDefault(&fontCfg); + } else { + auto initData = std::make_shared(); + initData->Format = RESOURCE_FORMAT_BINARY; + initData->Type = static_cast(RESOURCE_TYPE_FONT); + initData->ResourceVersion = 0; + initData->Path = fontPath; + std::shared_ptr fontData = std::static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(fontPath, false, initData)); + font = mImGuiIo->Fonts->AddFontFromMemoryTTF(fontData->Data, fontData->DataSize, size); + } + // FontAwesome fonts need to have their sizes reduced by 2.0f/3.0f in order to align correctly + float iconFontSize = size * 2.0f / 3.0f; + static const ImWchar sIconsRanges[] = { ICON_MIN_FA, ICON_MAX_16_FA, 0 }; + ImFontConfig iconsConfig; + iconsConfig.MergeMode = true; + iconsConfig.PixelSnapH = true; + iconsConfig.GlyphMinAdvanceX = iconFontSize; + mImGuiIo->Fonts->AddFontFromMemoryCompressedBase85TTF(fontawesome_compressed_data_base85, iconFontSize, + &iconsConfig, sIconsRanges); + return font; +} + std::filesystem::path GetSaveFile(std::shared_ptr Conf) { const std::string fileName = Conf->GetString("Game.SaveName", Ship::Context::GetPathRelativeToAppDirectory("oot_save.sav")); std::filesystem::path saveFile = std::filesystem::absolute(fileName); diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index f056cad5e..0a8d6595e 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -54,6 +54,13 @@ class OTRGlobals { ImFont* defaultFontLarger; ImFont* defaultFontLargest; + ImFont* fontStandard; + ImFont* fontStandardLarger; + ImFont* fontStandardLargest; + ImFont* fontMono; + ImFont* fontMonoLarger; + ImFont* fontMonoLargest; + OTRGlobals(); ~OTRGlobals(); @@ -69,6 +76,7 @@ class OTRGlobals { bool hasMasterQuest; bool hasOriginal; ImFont* CreateDefaultFontWithSize(float size); + ImFont* CreateFontWithSize(float size, std::string fontPath); }; #endif diff --git a/soh/soh/ShipUtils.cpp b/soh/soh/ShipUtils.cpp new file mode 100644 index 000000000..4760dbcd0 --- /dev/null +++ b/soh/soh/ShipUtils.cpp @@ -0,0 +1,115 @@ +#include "ShipUtils.h" +#include + +extern "C" { +#include "z64.h" +#include "functions.h" +#include "macros.h" + +extern float OTRGetAspectRatio(); + +//extern f32 sNESFontWidths[160]; +extern const char* fontTbl[156]; +//extern TexturePtr gItemIcons[131]; +//extern TexturePtr gQuestIcons[14]; +//extern TexturePtr gBombersNotebookPhotos[24]; +} + +constexpr f32 fourByThree = 4.0f / 3.0f; + +// Gets the additional ratio of the screen compared to the original 4:3 ratio, clamping to 1 if smaller +extern "C" f32 Ship_GetExtendedAspectRatioMultiplier() { + f32 currentRatio = OTRGetAspectRatio(); + return MAX(currentRatio / fourByThree, 1.0f); +} + +// Enables Extended Culling options on specific actors by applying an inverse ratio of the draw distance slider +// to the projected Z value of the actor. This tricks distance checks without having to replace hardcoded values. +// Requires that Ship_ExtendedCullingActorRestoreProjectedPos is called within the same function scope. +extern "C" void Ship_ExtendedCullingActorAdjustProjectedZ(Actor* actor) { + s32 multiplier = CVarGetInteger("gEnhancements.Graphics.IncreaseActorDrawDistance", 1); + multiplier = MAX(multiplier, 1); + if (multiplier > 1) { + actor->projectedPos.z /= multiplier; + } +} + +// Enables Extended Culling options on specific actors by applying an inverse ratio of the widescreen aspect ratio +// to the projected X value of the actor. This tricks distance checks without having to replace hardcoded values. +// Requires that Ship_ExtendedCullingActorRestoreProjectedPos is called within the same function scope. +extern "C" void Ship_ExtendedCullingActorAdjustProjectedX(Actor* actor) { + if (CVarGetInteger("gEnhancements.Graphics.ActorCullingAccountsForWidescreen", 0)) { + f32 ratioAdjusted = Ship_GetExtendedAspectRatioMultiplier(); + actor->projectedPos.x /= ratioAdjusted; + } +} + +// Restores the projectedPos values on the actor after modifications from the Extended Culling hacks +//extern "C" void Ship_ExtendedCullingActorRestoreProjectedPos(PlayState* play, Actor* actor) { +// f32 invW = 0.0f; +// Actor_GetProjectedPos(play, &actor->world.pos, &actor->projectedPos, &invW); +//} + +extern "C" bool Ship_IsCStringEmpty(const char* str) { + return str == NULL || str[0] == '\0'; +} + +// Build vertex coordinates for a quad command +// In order of top left, top right, bottom left, then bottom right +// Supports flipping the texture horizontally +extern "C" void Ship_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH) { + vtxList[0].v.ob[0] = xStart; + vtxList[0].v.ob[1] = yStart; + vtxList[0].v.tc[0] = (flippedH ? width : 0) << 5; + vtxList[0].v.tc[1] = 0 << 5; + + vtxList[1].v.ob[0] = xStart + width; + vtxList[1].v.ob[1] = yStart; + vtxList[1].v.tc[0] = (flippedH ? width * 2 : width) << 5; + vtxList[1].v.tc[1] = 0 << 5; + + vtxList[2].v.ob[0] = xStart; + vtxList[2].v.ob[1] = yStart + height; + vtxList[2].v.tc[0] = (flippedH ? width : 0) << 5; + vtxList[2].v.tc[1] = height << 5; + + vtxList[3].v.ob[0] = xStart + width; + vtxList[3].v.ob[1] = yStart + height; + vtxList[3].v.tc[0] = (flippedH ? width * 2 : width) << 5; + vtxList[3].v.tc[1] = height << 5; +} + +//extern "C" f32 Ship_GetCharFontWidthNES(u8 character) { +// u8 adjustedChar = character - ' '; +// +// if (adjustedChar >= ARRAY_COUNTU(sNESFontWidths)) { +// return 0.0f; +// } +// +// return sNESFontWidths[adjustedChar]; +//} + +//extern "C" TexturePtr Ship_GetCharFontTextureNES(u8 character) { +// u8 adjustedChar = character - ' '; +// +// if (adjustedChar >= ARRAY_COUNTU(sNESFontWidths)) { +// return (TexturePtr)gEmptyTexture; +// } +// +// return (TexturePtr)fontTbl[adjustedChar]; +//} + +//void LoadGuiTextures() { +// for (TexturePtr entry : gItemIcons) { +// const char* path = static_cast(entry); +// Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(path, path, ImVec4(1, 1, 1, 1)); +// } +// for (TexturePtr entry : gQuestIcons) { +// const char* path = static_cast(entry); +// Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(path, path, ImVec4(1, 1, 1, 1)); +// } +// for (TexturePtr entry : gBombersNotebookPhotos) { +// const char* path = static_cast(entry); +// Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(path, path, ImVec4(1, 1, 1, 1)); +// } +//} diff --git a/soh/soh/ShipUtils.h b/soh/soh/ShipUtils.h new file mode 100644 index 000000000..a1ac3081b --- /dev/null +++ b/soh/soh/ShipUtils.h @@ -0,0 +1,31 @@ +#ifndef SHIP_UTILS_H +#define SHIP_UTILS_H + +#include +//#include "PR/ultratypes.h" + +#ifdef __cplusplus + +void LoadGuiTextures(); + +extern "C" { +#endif + +struct PlayState; +struct Actor; + +f32 Ship_GetExtendedAspectRatioMultiplier(); +void Ship_ExtendedCullingActorAdjustProjectedZ(Actor* actor); +void Ship_ExtendedCullingActorAdjustProjectedX(Actor* actor); +void Ship_ExtendedCullingActorRestoreProjectedPos(PlayState* play, Actor* actor); + +bool Ship_IsCStringEmpty(const char* str); +void Ship_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH); +f32 Ship_GetCharFontWidthNES(u8 character); +//TexturePtr Ship_GetCharFontTextureNES(u8 character); + +#ifdef __cplusplus +} +#endif + +#endif // SHIP_UTILS_H diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp new file mode 100644 index 000000000..a10fc4e06 --- /dev/null +++ b/soh/soh/SohGui/Menu.cpp @@ -0,0 +1,819 @@ +#include "Menu.h" +#include "UIWidgets.hpp" +#include "soh/OTRGlobals.h" +#include "soh/Enhancements/controls/SohInputEditorWindow.h" +#include "window/gui/GuiMenuBar.h" +#include "window/gui/GuiElement.h" +#include +#include +#include "variables.h" +#include + +extern "C" { +#include "z64.h" +#include "functions.h" +extern PlayState* gPlayState; +} +std::vector windowTypeSizes = { {} }; + +extern std::unordered_map warpPointSceneList; +extern void Warp(); + +namespace SohGui {} + +namespace Ship { +std::string disabledTempTooltip; +const char* disabledTooltip; +bool disabledValue = false; + +bool operator==(Color_RGB8 const& l, Color_RGB8 const& r) noexcept { + return l.r == r.r && l.g == r.g && l.b == r.b; +} + +bool operator==(Color_RGBA8 const& l, Color_RGBA8 const& r) noexcept { + return l.r == r.r && l.g == r.g && l.b == r.b && l.a == r.a; +} + +bool operator<(Color_RGB8 const& l, Color_RGB8 const& r) noexcept { + return (l.r < r.r && l.g <= r.g && l.b <= r.b) || (l.r <= r.r && l.g < r.g && l.b <= r.b) || + (l.r <= r.r && l.g <= r.g && l.b < r.b); +} + +bool operator<(Color_RGBA8 const& l, Color_RGBA8 const& r) noexcept { + return (l.r < r.r && l.g <= r.g && l.b <= r.b && l.a <= r.a) || + (l.r <= r.r && l.g < r.g && l.b <= r.b && l.a <= r.a) || + (l.r <= r.r && l.g <= r.g && l.b < r.b && l.a <= r.a) || + (l.r <= r.r && l.g <= r.g && l.b <= r.b && l.a < r.a); +} + +bool operator>(Color_RGB8 const& l, Color_RGB8 const& r) noexcept { + return (l.r > r.r && l.g >= r.g && l.b >= r.b) || (l.r >= r.r && l.g > r.g && l.b >= r.b) || + (l.r >= r.r && l.g >= r.g && l.b > r.b); +} + +bool operator>(Color_RGBA8 const& l, Color_RGBA8 const& r) noexcept { + return (l.r > r.r && l.g >= r.g && l.b >= r.b && l.a >= r.a) || + (l.r >= r.r && l.g > r.g && l.b >= r.b && l.a >= r.a) || + (l.r >= r.r && l.g >= r.g && l.b > r.b && l.a >= r.a) || + (l.r >= r.r && l.g >= r.g && l.b >= r.b && l.a > r.a); +} + +uint32_t GetVectorIndexOf(std::vector& vector, std::string value) { + return std::distance(vector.begin(), std::find(vector.begin(), vector.end(), value)); +} + +void Menu::InsertSidebarSearch() { + menuEntries["Settings"].sidebars.emplace("Search", searchSidebarEntry); + uint32_t curIndex = 0; + if (!Ship_IsCStringEmpty(CVarGetString(menuEntries["Settings"].sidebarCvar, ""))) { + curIndex = GetVectorIndexOf(menuEntries["Settings"].sidebarOrder, + CVarGetString(menuEntries["Settings"].sidebarCvar, "")); + } + menuEntries["Settings"].sidebarOrder.insert(menuEntries["Settings"].sidebarOrder.begin() + searchSidebarIndex, + "Search"); + if (curIndex > searchSidebarIndex) { + CVarSetString(menuEntries["Settings"].sidebarCvar, menuEntries["Settings"].sidebarOrder.at(curIndex).c_str()); + } +} + +void Menu::RemoveSidebarSearch() { + uint32_t curIndex = + GetVectorIndexOf(menuEntries["Settings"].sidebarOrder, CVarGetString(menuEntries["Settings"].sidebarCvar, "General")); + menuEntries["Settings"].sidebars.erase("Search"); + std::erase_if(menuEntries["Settings"].sidebarOrder, [](std::string& name) { return name == "Search"; }); + if (curIndex > searchSidebarIndex) { + curIndex--; + } else if (curIndex >= menuEntries["Settings"].sidebarOrder.size()) { + curIndex = menuEntries["Settings"].sidebarOrder.size() - 1; + } + CVarSetString(menuEntries["Settings"].sidebarCvar, menuEntries["Settings"].sidebarOrder.at(curIndex).c_str()); +} + +void Menu::UpdateWindowBackendObjects() { + Ship::WindowBackend runningWindowBackend = Ship::Context::GetInstance()->GetWindow()->GetWindowBackend(); + int32_t configWindowBackendId = Ship::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1); + if (Ship::Context::GetInstance()->GetWindow()->IsAvailableWindowBackend(configWindowBackendId)) { + configWindowBackend = static_cast(configWindowBackendId); + } else { + configWindowBackend = runningWindowBackend; + } + + availableWindowBackends = Ship::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends(); + for (auto& backend : *availableWindowBackends) { + availableWindowBackendsMap[backend] = windowBackendsMap.at(backend); + } +} + +UIWidgets::Colors Menu::GetMenuThemeColor() { + return menuThemeIndex; +} + +Menu::Menu(const std::string& cVar, const std::string& name, uint8_t searchSidebarIndex_, + UIWidgets::Colors defaultThemeIndex_) + : GuiWindow(cVar, name), searchSidebarIndex(searchSidebarIndex_), defaultThemeIndex(defaultThemeIndex_) { +} + +void Menu::InitElement() { + popped = CVarGetInteger(CVAR_SETTING("Menu.Popout"), 0); + poppedSize.x = CVarGetInteger(CVAR_SETTING("Menu.PoppedWidth"), 1280); + poppedSize.y = CVarGetInteger(CVAR_SETTING("Menu.PoppedHeight"), 800); + poppedPos.x = CVarGetInteger(CVAR_SETTING("Menu.PoppedPos.x"), 0); + poppedPos.y = CVarGetInteger(CVAR_SETTING("Menu.PoppedPos.y"), 0); + + UpdateWindowBackendObjects(); +} + +void Menu::UpdateElement() { + menuThemeIndex = static_cast(CVarGetInteger(CVAR_SETTING("Menu.Theme"), defaultThemeIndex)); +} + +bool ModernMenuSidebarEntry(std::string label) { + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStyle& style = ImGui::GetStyle(); + ImVec2 pos = window->DC.CursorPos; + const ImGuiID sidebarId = window->GetID(std::string(label + "##Sidebar").c_str()); + ImVec2 labelSize = ImGui::CalcTextSize(label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true); + pos.y += style.FramePadding.y; + pos.x = window->WorkRect.GetCenter().x - labelSize.x / 2; + ImRect bb = { pos - style.FramePadding, pos + labelSize + style.FramePadding }; + ImGui::ItemSize(bb, style.FramePadding.y); + ImGui::ItemAdd(bb, sidebarId); + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(bb, sidebarId, &hovered, &held); + if (pressed) { + ImGui::MarkItemEdited(sidebarId); + } + window->DrawList->AddRectFilled(pos - style.FramePadding, pos + labelSize + style.FramePadding, + ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive + : hovered ? ImGuiCol_ButtonHovered + : ImGuiCol_Button), + 3.0f); + UIWidgets::RenderText(pos, label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true); + return pressed; +} + +bool ModernMenuHeaderEntry(std::string label) { + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStyle& style = ImGui::GetStyle(); + ImVec2 pos = window->DC.CursorPos; + const ImGuiID headerId = window->GetID(std::string(label + "##Header").c_str()); + ImVec2 labelSize = ImGui::CalcTextSize(label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true); + ImRect bb = { pos, pos + labelSize + style.FramePadding * 2 }; + ImGui::ItemSize(bb, style.FramePadding.y); + ImGui::ItemAdd(bb, headerId); + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(bb, headerId, &hovered, &held); + window->DrawList->AddRectFilled(bb.Min, bb.Max, + ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive + : hovered ? ImGuiCol_ButtonHovered + : ImGuiCol_Button), + 3.0f); + pos += style.FramePadding; + UIWidgets::RenderText(pos, label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true); + return pressed; +} + +uint32_t Menu::DrawSearchResults(std::string& menuSearchText) { + ImGui::BeginChild("Search Results"); + int searchCount = 0; + for (auto& menuLabel : menuOrder) { + auto& menuEntry = menuEntries.at(menuLabel); + for (auto& sidebarLabel : menuEntry.sidebarOrder) { + auto& sidebar = menuEntry.sidebars[sidebarLabel]; + for (int i = 0; i < sidebar.columnWidgets.size(); i++) { + auto& column = sidebar.columnWidgets.at(i); + for (auto& info : column) { + if (info.type == WIDGET_SEARCH || info.type == WIDGET_SEPARATOR || info.type == WIDGET_SEPARATOR_TEXT || + info.isHidden) { + continue; + } + const char* tooltip = info.options->tooltip; + std::string widgetStr = std::string(info.name) + std::string(tooltip != NULL ? tooltip : ""); + std::transform(menuSearchText.begin(), menuSearchText.end(), menuSearchText.begin(), ::tolower); + menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), + menuSearchText.end()); + std::transform(widgetStr.begin(), widgetStr.end(), widgetStr.begin(), ::tolower); + widgetStr.erase(std::remove(widgetStr.begin(), widgetStr.end(), ' '), widgetStr.end()); + if (widgetStr.find(menuSearchText) != std::string::npos) { + MenuDrawItem(info, 90 / sidebar.columnCount, menuThemeIndex); + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(UIWidgets::Colors::Gray)); + std::string origin = fmt::format(" ({} -> {}, Col {})", menuEntry.label, sidebarLabel, i + 1); + ImGui::Text("%s", origin.c_str()); + ImGui::PopStyleColor(); + searchCount++; + } + } + } + } + } + return searchCount; +} + +void Menu::AddMenuEntry(std::string entryName, const char* entryCvar) { + menuEntries.emplace(entryName, MainMenuEntry{ entryName, entryCvar }); + menuOrder.push_back(entryName); +} + +std::unordered_map& Menu::GetDisabledMap() { + return disabledMap; +} + +void Menu::MenuDrawItem(WidgetInfo& widget, uint32_t width, UIWidgets::Colors menuThemeIndex) { + disabledTempTooltip = "This setting is disabled because: \n\n"; + disabledValue = false; + disabledTooltip = " "; + + if (widget.preFunc != nullptr) { + widget.ResetDisables(); + widget.preFunc(widget); + if (widget.isHidden) { + return; + } + if (!widget.activeDisables.empty()) { + widget.options->disabled = true; + for (auto option : widget.activeDisables) { + disabledTempTooltip += std::string("- ") + disabledMap.at(option).reason + std::string("\n"); + } + widget.options->disabledTooltip = disabledTempTooltip.c_str(); + } + } + + if (widget.sameLine) { + ImGui::SameLine(); + } + + try { + switch (widget.type) { + case WIDGET_CHECKBOX: { + bool* pointer = std::get(widget.valuePointer); + if (pointer == nullptr) { + SPDLOG_ERROR("Checkbox Widget requires a value pointer, currently nullptr"); + assert(false); + return; + } + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::Checkbox(UIWidgets::WrappedText(widget.name.c_str(), width).c_str(), pointer, + *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + } + } break; + case WIDGET_CVAR_CHECKBOX: { + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::CVarCheckbox(UIWidgets::WrappedText(widget.name.c_str(), width).c_str(), widget.cVar, + *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + }; + } break; + case WIDGET_AUDIO_BACKEND: { + auto currentAudioBackend = Ship::Context::GetInstance()->GetAudio()->GetCurrentAudioBackend(); + UIWidgets::ComboboxOptions options = {}; + options.color = menuThemeIndex; + options.tooltip = "Sets the audio API used by the game. Requires a relaunch to take effect."; + options.disabled = Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1; + options.disabledTooltip = "Only one audio API is available on this platform."; + if (UIWidgets::Combobox("Audio API", ¤tAudioBackend, audioBackendsMap, options)) { + Ship::Context::GetInstance()->GetAudio()->SetCurrentAudioBackend(currentAudioBackend); + } + } break; + case WIDGET_VIDEO_BACKEND: { + UIWidgets::ComboboxOptions options = {}; + options.color = menuThemeIndex; + options.tooltip = "Sets the renderer API used by the game."; + options.disabled = availableWindowBackends->size() <= 1; + options.disabledTooltip = "Only one renderer API is available on this platform."; + if (UIWidgets::Combobox("Renderer API (Needs reload)", &configWindowBackend, availableWindowBackendsMap, + options)) { + Ship::Context::GetInstance()->GetConfig()->SetInt("Window.Backend.Id", + (int32_t)(configWindowBackend)); + Ship::Context::GetInstance()->GetConfig()->SetString("Window.Backend.Name", + windowBackendsMap.at(configWindowBackend)); + Ship::Context::GetInstance()->GetConfig()->Save(); + UpdateWindowBackendObjects(); + } + } break; + case WIDGET_SEPARATOR: { + ImGui::Separator(); + } break; + case WIDGET_SEPARATOR_TEXT: { + if (widget.options->color != UIWidgets::Colors::NoColor) { + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(widget.options->color)); + } + ImGui::SeparatorText(widget.name.c_str()); + if (widget.options->color != UIWidgets::Colors::NoColor) { + ImGui::PopStyleColor(); + } + } break; + case WIDGET_TEXT: { + if (widget.options->color != UIWidgets::Colors::NoColor) { + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(widget.options->color)); + } + ImGui::AlignTextToFramePadding(); + ImGui::TextWrapped("%s", widget.name.c_str()); + if (widget.options->color != UIWidgets::Colors::NoColor) { + ImGui::PopStyleColor(); + } + } break; + case WIDGET_COMBOBOX: { + int32_t* pointer = std::get(widget.valuePointer); + if (pointer == nullptr) { + SPDLOG_ERROR("Combobox Widget requires a value pointer, currently nullptr"); + assert(false); + return; + } + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::Combobox(widget.name.c_str(), pointer, options->comboMap, *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + }; + } break; + case WIDGET_CVAR_COMBOBOX: { + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::CVarCombobox(widget.name.c_str(), widget.cVar, options->comboMap, *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + } + } break; + case WIDGET_SLIDER_INT: { + int32_t* pointer = std::get(widget.valuePointer); + if (pointer == nullptr) { + SPDLOG_ERROR("int32 Slider Widget requires a value pointer, currently nullptr"); + assert(false); + return; + } + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::SliderInt(widget.name.c_str(), pointer, *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + }; + } break; + case WIDGET_CVAR_SLIDER_INT: { + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::CVarSliderInt(widget.name.c_str(), widget.cVar, *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + }; + } break; + case WIDGET_SLIDER_FLOAT: { + float* pointer = std::get(widget.valuePointer); + + if (pointer == nullptr) { + SPDLOG_ERROR("float Slider Widget requires a value pointer, currently nullptr"); + assert(false); + return; + } + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::SliderFloat(widget.name.c_str(), pointer, *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + } + } break; + case WIDGET_CVAR_SLIDER_FLOAT: { + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::CVarSliderFloat(widget.name.c_str(), widget.cVar, *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + } + } break; + case WIDGET_BUTTON: { + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (UIWidgets::Button(widget.name.c_str(), *options)) { + if (widget.callback != nullptr) { + widget.callback(widget); + } + } + } break; + case WIDGET_CUSTOM: { + if (widget.customFunction != nullptr) { + widget.customFunction(widget); + } + } break; + case WIDGET_WINDOW_BUTTON: { + if (widget.windowName == nullptr || widget.windowName[0] == '\0') { + std::string msg = + fmt::format("Error drawing window contents for {}: windowName not defined", widget.name); + SPDLOG_ERROR(msg.c_str()); + break; + } + auto window = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow(widget.windowName); + if (!window) { + std::string msg = + fmt::format("Error drawing window contents: windowName {} does not exist", widget.windowName); + SPDLOG_ERROR(msg.c_str()); + break; + } + auto options = std::static_pointer_cast(widget.options); + options->color = menuThemeIndex; + if (options->showButton) { + UIWidgets::WindowButton(widget.name.c_str(), widget.cVar, window, *options); + } + if (!window->IsVisible() && options->embedWindow) { + window->DrawElement(); + } + } break; + case WIDGET_SEARCH: { + UIWidgets::PushStyleButton(menuThemeIndex); + if (ImGui::Button("Clear")) { + menuSearch.Clear(); + } + ImGui::SameLine(); + if (CVarGetInteger(CVAR_SETTING("Menu.SearchAutofocus"), 0) && + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && !ImGui::IsAnyItemActive() && + !ImGui::IsMouseClicked(0)) { + ImGui::SetKeyboardFocusHere(0); + } + UIWidgets::PushStyleCombobox(menuThemeIndex); + ImGui::PushStyleColor(ImGuiCol_Border, UIWidgets::ColorValues.at(menuThemeIndex)); + menuSearch.Draw(); + ImGui::PopStyleColor(); + UIWidgets::PopStyleCombobox(); + UIWidgets::PopStyleButton(); + std::string menuSearchText(menuSearch.InputBuf); + + if (menuSearchText == "") { + ImGui::Text("Start typing to see results."); + return; + } + DrawSearchResults(menuSearchText); + ImGui::EndChild(); + } break; + default: + break; + } + if (widget.postFunc != nullptr) { + widget.postFunc(widget); + } + } catch (const std::bad_variant_access& e) { + SPDLOG_ERROR("Failed to draw menu item \"{}\" due to: {}", widget.name, e.what()); + assert(false); + } +} + +void Menu::Draw() { + if (!IsVisible()) { + return; + } + DrawElement(); + // Sync up the IsVisible flag if it was changed by ImGui + SyncVisibilityConsoleVariable(); +} + +void Menu::DrawElement() { + for (auto& [reason, info] : disabledMap) { + info.active = info.evaluation(info); + } + + windowHeight = ImGui::GetMainViewport()->WorkSize.y; + windowWidth = ImGui::GetMainViewport()->WorkSize.x; + auto windowFlags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings; + bool popout = CVarGetInteger(CVAR_SETTING("Menu.Popout"), 0) && allowPopout; + if (popout) { + windowFlags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking; + } + if (popout != popped) { + if (popout) { + windowHeight = poppedSize.y; + windowWidth = poppedSize.x; + ImGui::SetNextWindowSize({ static_cast(windowWidth), static_cast(windowHeight) }, + ImGuiCond_Always); + ImGui::SetNextWindowPos(poppedPos, ImGuiCond_Always); + } else if (popped) { + CVarSetFloat(CVAR_SETTING("Menu.PoppedWidth"), poppedSize.x); + CVarSetFloat(CVAR_SETTING("Menu.PoppedHeight"), poppedSize.y); + CVarSave(); + } + } + popped = popout; + auto windowCond = ImGuiCond_Always; + if (!popout) { + ImGui::SetNextWindowSize({ static_cast(windowWidth), static_cast(windowHeight) }, windowCond); + ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), windowCond, { 0.5f, 0.5f }); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + } + if (!ImGui::Begin("Main Menu", NULL, windowFlags)) { + if (!popout) { + ImGui::PopStyleVar(); + } + ImGui::End(); + return; + } + if (popped != popout) { + if (!popout) { + ImGui::PopStyleVar(); + } + CVarSetInteger(CVAR_SETTING("Menu.Popout"), popped); + CVarSetFloat(CVAR_SETTING("Menu.PoppedWidth"), poppedSize.x); + CVarSetFloat(CVAR_SETTING("Menu.PoppedHeight"), poppedSize.y); + CVarSetFloat(CVAR_SETTING("Menu.PoppedPos.x"), poppedSize.x); + CVarSetFloat(CVAR_SETTING("Menu.PoppedPos.y"), poppedSize.y); + CVarSave(); + ImGui::End(); + return; + } + ImGui::PushFont(OTRGlobals::Instance->fontStandardLargest); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStyle& style = ImGui::GetStyle(); + windowHeight = window->WorkRect.GetHeight(); + windowWidth = window->WorkRect.GetWidth(); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 8.0f)); + const char* headerCvar = CVAR_SETTING("Menu.ActiveHeader"); + std::string headerIndex = CVarGetString(headerCvar, "Settings"); + ImVec2 pos = window->DC.CursorPos; + float centerX = pos.x + windowWidth / 2 - (style.ItemSpacing.x * (menuEntries.size() + 1)); + std::vector headerSizes; + float headerWidth = style.ItemSpacing.x + 20; + bool headerSearch = !CVarGetInteger(CVAR_SETTING("Menu.SidebarSearch"), 0); + if (headerSearch) { + headerWidth += 200.0f + style.ItemSpacing.x + style.FramePadding.x; + } + for (auto& label : menuOrder) { + ImVec2 size = ImGui::CalcTextSize(label.c_str()); + headerSizes.push_back(size); + headerWidth += size.x + style.FramePadding.x * 2; + if (label == headerIndex) { + headerWidth += style.ItemSpacing.x; + } + } + + // Full screen menu with widths below 1280, heights below 800. + // Up to 100 pixel padding when up to 1700 width, 1050 height. + // Everything above that, fixed size of 1600x950. + ImVec2 menuSize = { std::fminf(1280, windowWidth), std::fminf(800, windowHeight) }; + if (windowWidth > 1380) { + menuSize.x = std::fminf(1600, windowWidth - 100); + } + if (windowHeight > 900) { + menuSize.y = std::fminf(950, windowHeight - 100); + } + + pos += window->WorkRect.GetSize() / 2 - menuSize / 2; + ImGui::SetNextWindowPos(pos); + ImGui::BeginChild("Menu Block", menuSize, + ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar); + + std::unordered_map* sidebar; + float headerHeight = headerSizes.at(0).y + style.FramePadding.y * 2; + ImVec2 buttonSize = ImGui::CalcTextSize(ICON_FA_TIMES_CIRCLE) + style.FramePadding * 2; + bool scrollbar = false; + if (headerWidth > menuSize.x - buttonSize.x * 3 - style.ItemSpacing.x * 3) { + headerHeight += style.ScrollbarSize; + scrollbar = true; + } + UIWidgets::ButtonOptions options = {}; + options.size = UIWidgets::Sizes::Inline; + options.tooltip = "Close Menu (Esc)"; + if (UIWidgets::Button(ICON_FA_TIMES_CIRCLE, options)) { + ToggleVisibility(); + + // Update gamepad navigation after close based on if other menus are still visible + auto mImGuiIo = &ImGui::GetIO(); + if (CVarGetInteger(CVAR_IMGUI_CONTROLLER_NAV, 0) && + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetMenuOrMenubarVisible()) { + mImGuiIo->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; + } else { + mImGuiIo->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; + } + } + ImGui::SameLine(); + ImGui::SetNextWindowSizeConstraints({ 0, headerHeight }, { headerWidth, headerHeight }); + ImVec2 headerSelSize = { menuSize.x - buttonSize.x * 3 - style.ItemSpacing.x * 3, headerHeight }; + if (scrollbar) { + headerSelSize.y += style.ScrollbarSize; + } + bool autoFocus = CVarGetInteger(CVAR_SETTING("Menu.SearchAutofocus"), 0); + ImGui::BeginChild("Header Selection", headerSelSize, + ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_HorizontalScrollbar); + uint8_t curIndex = 0; + for (auto& label : menuOrder) { + if (curIndex != 0) { + ImGui::SameLine(); + } + auto& entry = menuEntries.at(label); + std::string nextIndex = label; + UIWidgets::PushStyleButton(menuThemeIndex); + if (headerIndex != label) { + ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 }); + } + if (ModernMenuHeaderEntry(entry.label)) { + if (headerSearch) { + menuSearch.Clear(); + } + CVarSetString(headerCvar, label.c_str()); + CVarSave(); + nextIndex = label; + } + if (headerIndex != label) { + ImGui::PopStyleColor(); + } + UIWidgets::PopStyleButton(); + if (headerIndex == label) { + sidebar = &entry.sidebars; + } + if (nextIndex != label) { + headerIndex = nextIndex; + } + curIndex++; + } + std::string menuSearchText = ""; + if (headerSearch) { + ImGui::SameLine(); + if (autoFocus && ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && !ImGui::IsAnyItemActive() && + !ImGui::IsMouseClicked(0)) { + ImGui::SetKeyboardFocusHere(0); + } + auto color = UIWidgets::ColorValues.at(menuThemeIndex); + color.w = 0.2f; + ImGui::PushStyleColor(ImGuiCol_FrameBg, color); + menuSearch.Draw("##search", 200.0f); + menuSearchText = menuSearch.InputBuf; + menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), menuSearchText.end()); + if (menuSearchText.length() < 1) { + ImGui::SameLine(headerWidth - 200.0f + style.ItemSpacing.x); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Search..."); + } + ImGui::PopStyleColor(); + } + ImGui::EndChild(); + ImGui::SameLine(menuSize.x - (buttonSize.x * 2) - style.ItemSpacing.x); + UIWidgets::ButtonOptions options2 = {}; + options2.color = UIWidgets::Colors::Red; + options2.size = UIWidgets::Sizes::Inline; + options2.tooltip = "Reset" +#ifdef __APPLE__ + " (Command-R)" +#elif !defined(__SWITCH__) && !defined(__WIIU__) + " (Ctrl+R)" +#else + "" +#endif + ; + if (UIWidgets::Button(ICON_FA_UNDO, options2)) { + std::reinterpret_pointer_cast( + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) + ->Dispatch("reset"); + } + ImGui::SameLine(); + UIWidgets::ButtonOptions options3 = {}; + options3.color = UIWidgets::Colors::Red; + options3.size = UIWidgets::Sizes::Inline; + options3.tooltip = "Quit SoH"; + if (UIWidgets::Button(ICON_FA_POWER_OFF, options3)) { + if (!popped) { + ToggleVisibility(); + } + Ship::Context::GetInstance()->GetWindow()->Close(); + } + ImGui::PopStyleVar(); + + pos.y += headerHeight + style.ItemSpacing.y; + pos.x = centerX - menuSize.x / 2 + (style.ItemSpacing.x * (menuEntries.size() + 1)); + window->DrawList->AddRectFilled(pos, pos + ImVec2{ menuSize.x, 4 }, ImGui::GetColorU32({ 255, 255, 255, 255 }), + true, style.WindowRounding); + pos.y += style.ItemSpacing.y; + float sectionHeight = menuSize.y - headerHeight - 4 - style.ItemSpacing.y * 2; + float columnHeight = sectionHeight - style.ItemSpacing.y * 4; + ImGui::SetNextWindowPos(pos + style.ItemSpacing * 2); + float sidebarWidth = 200 - style.ItemSpacing.x; + + const char* sidebarCvar = menuEntries.at(headerIndex).sidebarCvar; + + std::string sectionIndex = CVarGetString(sidebarCvar, ""); + if (!sidebar->contains(sectionIndex)) { + sectionIndex = sidebar->begin()->first; + } + float sectionCenterX = pos.x + (sidebarWidth / 2); + float topY = pos.y; + ImGui::SetNextWindowSizeConstraints({ sidebarWidth, 0 }, { sidebarWidth, columnHeight }); + ImGui::BeginChild((menuEntries.at(headerIndex).label + " Section").c_str(), { sidebarWidth, columnHeight * 3 }, + ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize, ImGuiWindowFlags_NoTitleBar); + for (auto& sidebarLabel : menuEntries.at(headerIndex).sidebarOrder) { + std::string nextIndex = ""; + UIWidgets::PushStyleButton(menuThemeIndex); + if (sectionIndex != sidebarLabel) { + ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 }); + } + if (ModernMenuSidebarEntry(sidebarLabel)) { + if (headerSearch) { + menuSearch.Clear(); + } + CVarSetString(sidebarCvar, sidebarLabel.c_str()); + CVarSave(); + nextIndex = sidebarLabel; + } + if (sectionIndex != sidebarLabel) { + ImGui::PopStyleColor(); + } + UIWidgets::PopStyleButton(); + if (nextIndex != "") { + sectionIndex = nextIndex; + } + } + ImGui::EndChild(); + + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + pos = ImVec2{ sectionCenterX + (sidebarWidth / 2), topY } + style.ItemSpacing * 2; + window->DrawList->AddRectFilled(pos, pos + ImVec2{ 4, sectionHeight - style.FramePadding.y * 2 }, + ImGui::GetColorU32({ 255, 255, 255, 255 }), true, style.WindowRounding); + pos.x += 4 + style.ItemSpacing.x; + ImGui::SetNextWindowPos(pos + style.ItemSpacing); + float sectionWidth = menuSize.x - sidebarWidth - 4 - style.ItemSpacing.x * 4; + std::string sectionMenuId = sectionIndex + " Settings"; + int columns = sidebar->at(sectionIndex).columnCount; + size_t columnFuncs = sidebar->at(sectionIndex).columnWidgets.size(); + if (windowWidth < 800) { + columns = 1; + } + float columnWidth = (sectionWidth - style.ItemSpacing.x * columns) / columns; + bool useColumns = columns > 1; + if (!useColumns || (headerSearch && menuSearchText.length() > 0)) { + ImGui::SameLine(); + ImGui::SetNextWindowSizeConstraints({ sectionWidth, 0 }, { sectionWidth, columnHeight }); + ImGui::BeginChild(sectionMenuId.c_str(), { sectionWidth, windowHeight * 4 }, ImGuiChildFlags_AutoResizeY, + ImGuiWindowFlags_NoTitleBar); + } + if (headerSearch && menuSearchText.length() > 0) { + uint32_t searchCount = DrawSearchResults(menuSearchText); + if (searchCount == 0) { + ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::CalcTextSize("No results found").x) / 2); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10.0f); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "No results found"); + } + ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::CalcTextSize("Clear Search").x) / 2 - 10.0f); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10.0f); + UIWidgets::ButtonOptions clearBtnOpts = {}; + clearBtnOpts.size = UIWidgets::Sizes::Inline; + if (UIWidgets::Button("Clear Search", clearBtnOpts)) { + menuSearch.Clear(); + } + + ImGui::EndChild(); + } else { + std::string menuLabel = menuEntries.at(headerIndex).label; + if (MenuInit::GetUpdateFuncs().contains(menuLabel)) { + if (MenuInit::GetUpdateFuncs()[menuLabel].contains(sectionIndex)) { + for (auto& updateFunc : MenuInit::GetUpdateFuncs()[menuLabel][sectionIndex]) { + updateFunc(); + } + } + } + for (int i = 0; i < columnFuncs; i++) { + std::string sectionId = fmt::format("{} Column {}", sectionMenuId, i); + if (useColumns) { + ImGui::SetNextWindowSizeConstraints({ columnWidth, 0 }, { columnWidth, columnHeight }); + ImGui::BeginChild(sectionId.c_str(), { columnWidth, windowHeight * 4 }, ImGuiChildFlags_AutoResizeY, + ImGuiWindowFlags_NoTitleBar); + } + // for (auto& entryName : sidebar->at(sectionIndex).sidebarOrder) { + for (auto& entry : sidebar->at(sectionIndex).columnWidgets.at(i)) { + MenuDrawItem(entry, 90 / sidebar->at(sectionIndex).columnCount, menuThemeIndex); + } + //} + if (useColumns) { + ImGui::EndChild(); + } + if (i < columns - 1) { + ImGui::SameLine(); + } + } + } + if (!useColumns || menuSearchText.length() > 0) { + ImGui::EndChild(); + } + ImGui::PopFont(); + ImGui::PopFont(); + + if (!popout) { + ImGui::PopStyleVar(); + } + ImGui::EndChild(); + if (popout) { + poppedSize = ImGui::GetWindowSize(); + poppedPos = ImGui::GetWindowPos(); + } + ImGui::End(); +} +} // namespace Ship diff --git a/soh/soh/SohGui/Menu.h b/soh/soh/SohGui/Menu.h new file mode 100644 index 000000000..d7007bb1e --- /dev/null +++ b/soh/soh/SohGui/Menu.h @@ -0,0 +1,65 @@ +#ifndef MENU_H +#define MENU_H + +#include +#include "graphic/Fast3D/gfx_rendering_api.h" +#include "MenuTypes.h" + +namespace Ship { +uint32_t GetVectorIndexOf(std::vector& vector, std::string value); +class Menu : public GuiWindow { + public: + using GuiWindow::GuiWindow; + + Menu(const std::string& cVar, const std::string& name, uint8_t searchSidebarIndex_ = 0, + UIWidgets::Colors menuThemeIndex_ = UIWidgets::Colors::LightBlue); + + void InitElement() override; + void DrawElement() override; + void UpdateElement() override; + void Draw() override; + void InsertSidebarSearch(); + void RemoveSidebarSearch(); + void UpdateWindowBackendObjects(); + UIWidgets::Colors GetMenuThemeColor(); + + void MenuDrawItem(WidgetInfo& widget, uint32_t width, UIWidgets::Colors menuThemeIndex); + void AddMenuEntry(std::string entryName, const char* entryCvar); + std::unordered_map& GetDisabledMap(); + + protected: + ImVec2 mOriginalSize; + std::string mName; + uint32_t mWindowFlags; + std::unordered_map menuEntries; + std::vector menuOrder; + uint32_t DrawSearchResults(std::string& menuSearchText); + ImGuiTextFilter menuSearch; + uint8_t searchSidebarIndex; + UIWidgets::Colors defaultThemeIndex; + std::shared_ptr> availableWindowBackends; + std::unordered_map availableWindowBackendsMap; + Ship::WindowBackend configWindowBackend; + + std::unordered_map disabledMap; + std::vector disabledVector; + const SidebarEntry searchSidebarEntry = { + .columnCount = 1, + .columnWidgets = { { { .name = "Sidebar Search", + .type = WIDGET_SEARCH, + .options = std::make_shared(UIWidgets::WidgetOptions{}.Tooltip( + "Searches all menus for the given text, including tooltips.")) } } } + }; + + private: + bool allowPopout = true; // PortNote: should be set to false on small screen ports + bool popped; + ImVec2 poppedSize; + ImVec2 poppedPos; + float windowHeight; + float windowWidth; + UIWidgets::Colors menuThemeIndex; +}; +} // namespace Ship + +#endif // MENU_H diff --git a/soh/soh/SohGui/MenuTypes.h b/soh/soh/SohGui/MenuTypes.h new file mode 100644 index 000000000..7b979a824 --- /dev/null +++ b/soh/soh/SohGui/MenuTypes.h @@ -0,0 +1,280 @@ +#ifndef MENUTYPES_H +#define MENUTYPES_H + +#include +#include "UIWidgets.hpp" + +typedef enum { + DISABLE_FOR_NO_VSYNC, + DISABLE_FOR_NO_WINDOWED_FULLSCREEN, + DISABLE_FOR_NO_MULTI_VIEWPORT, + DISABLE_FOR_NOT_DIRECTX, + DISABLE_FOR_DIRECTX, + DISABLE_FOR_MATCH_REFRESH_RATE_ON, + DISABLE_FOR_ADVANCED_RESOLUTION_ON, + DISABLE_FOR_VERTICAL_RES_TOGGLE_ON, + DISABLE_FOR_LOW_RES_MODE_ON, + DISABLE_FOR_NULL_PLAY_STATE, + DISABLE_FOR_DEBUG_MODE_OFF, + DISABLE_FOR_FRAME_ADVANCE_OFF, + DISABLE_FOR_ADVANCED_RESOLUTION_OFF, + DISABLE_FOR_VERTICAL_RESOLUTION_OFF, +} DisableOption; + +struct WidgetInfo; +struct disabledInfo; +using VoidFunc = void (*)(); +using DisableInfoFunc = bool (*)(disabledInfo&); +using DisableVec = std::vector; +using WidgetFunc = void (*)(WidgetInfo&); + +typedef enum { + WIDGET_CHECKBOX, + WIDGET_COMBOBOX, + WIDGET_SLIDER_INT, + WIDGET_SLIDER_FLOAT, + WIDGET_CVAR_CHECKBOX, + WIDGET_CVAR_COMBOBOX, + WIDGET_CVAR_SLIDER_INT, + WIDGET_CVAR_SLIDER_FLOAT, + WIDGET_BUTTON, + WIDGET_INPUT, + WIDGET_CVAR_INPUT, + WIDGET_COLOR_24, // color picker without alpha + WIDGET_COLOR_32, // color picker with alpha + WIDGET_SEARCH, + WIDGET_SEPARATOR, + WIDGET_SEPARATOR_TEXT, + WIDGET_TEXT, + WIDGET_WINDOW_BUTTON, + WIDGET_AUDIO_BACKEND, // needed for special operations that can't be handled easily with the normal combobox widget + WIDGET_VIDEO_BACKEND, // same as above + WIDGET_CUSTOM, +} WidgetType; + +typedef enum { + SECTION_COLUMN_1, + SECTION_COLUMN_2, + SECTION_COLUMN_3, +} SectionColumns; + +typedef enum { + DEBUG_LOG_TRACE, + DEBUG_LOG_DEBUG, + DEBUG_LOG_INFO, + DEBUG_LOG_WARN, + DEBUG_LOG_ERROR, + DEBUG_LOG_CRITICAL, + DEBUG_LOG_OFF, +} DebugLogOption; + +// holds the widget values for a widget, contains all CVar types available from LUS. int32_t is used for boolean +// evaluation +using CVarVariant = std::variant; +using OptionsVariant = + std::variant; + +// All the info needed for display and search of all widgets in the menu. +// `name` is the label displayed, +// `cVar` is the string representation of the CVar used to store the widget value +// `tooltip` is what is displayed when hovering (except when disabled, more on that later) +// `type` is the WidgetType for the widget, which is what determines how the information is used in the draw func +// `options` is a variant that holds the UIWidgetsOptions struct for the widget type +// blank objects need to be initialized with specific typing matching the expected Options struct for the widget +// `callback` is a lambda used for running code on widget change. may need `SohGui::GetMenu()` for specific menu actions +// `preFunc` is a lambda called before drawing code starts. It can be used to determine a widget's status, +// whether disabled or hidden, as well as update pointers for non-CVar widget types. +// `postFunc` is a lambda called after all drawing code is finished, for reacting to states other than +// widgets having been changed, like holding buttons. +// All three lambdas accept a `widgetInfo` reference in case it needs information on the widget for these operations +// `activeDisables` is a vector of DisableOptions for specifying what reasons a widget is disabled, which are displayed +// in the disabledTooltip for the widget. Can display multiple reasons. Handling the reasons is done in `preFunc`. +// It is recommended to utilize `disabledInfo`/`DisableReason` to list out all reasons for disabling and isHidden so +// the info can be shown. +// `windowName` is what is displayed and searched for `windowButton` type and window interactions +// `isHidden` just prevents the widget from being drawn under whatever circumstances you specify in the `preFunc` +// `sameLine` allows for specifying that the widget should be on the same line as the previous widget +struct WidgetInfo { + std::string name; // Used by all widgets + const char* cVar; // Used by all widgets except + WidgetType type; + std::shared_ptr options; + std::variant valuePointer; + WidgetFunc callback = nullptr; + WidgetFunc preFunc = nullptr; + WidgetFunc postFunc = nullptr; + WidgetFunc customFunction = nullptr; + DisableVec activeDisables = {}; + const char* windowName = ""; + bool isHidden = false; + bool sameLine = false; + + WidgetInfo& CVar(const char* cVar_) { + cVar = cVar_; + return *this; + } + WidgetInfo& Options(OptionsVariant options_) { + switch (type) { + case WIDGET_AUDIO_BACKEND: + case WIDGET_VIDEO_BACKEND: + case WIDGET_COMBOBOX: + case WIDGET_CVAR_COMBOBOX: + options = std::make_shared(std::get(options_)); + break; + case WIDGET_CHECKBOX: + case WIDGET_CVAR_CHECKBOX: + options = std::make_shared(std::get(options_)); + break; + case WIDGET_SLIDER_FLOAT: + case WIDGET_CVAR_SLIDER_FLOAT: + options = + std::make_shared(std::get(options_)); + break; + case WIDGET_SLIDER_INT: + case WIDGET_CVAR_SLIDER_INT: + options = + std::make_shared(std::get(options_)); + break; + case WIDGET_BUTTON: + options = std::make_shared(std::get(options_)); + break; + case WIDGET_WINDOW_BUTTON: + options = std::make_shared(std::get(options_)); + break; + case WIDGET_TEXT: + case WIDGET_SEPARATOR_TEXT: + case WIDGET_SEPARATOR: + default: + options = std::make_shared(std::get(options_)); + } + return *this; + } + void ResetDisables() { + isHidden = false; + options->disabled = false; + options->disabledTooltip = ""; + activeDisables.clear(); + } + WidgetInfo& Options(std::shared_ptr options_) { + options = options_; + return *this; + } + WidgetInfo& Callback(WidgetFunc callback_) { + callback = callback_; + return *this; + } + WidgetInfo& PreFunc(WidgetFunc preFunc_) { + preFunc = preFunc_; + return *this; + } + WidgetInfo& PostFunc(WidgetFunc postFunc_) { + postFunc = postFunc_; + return *this; + } + WidgetInfo& WindowName(const char* windowName_) { + windowName = windowName_; + return *this; + } + WidgetInfo& ValuePointer(std::variant valuePointer_) { + valuePointer = valuePointer_; + return *this; + } + WidgetInfo& SameLine(bool sameLine_) { + sameLine = sameLine_; + return *this; + } + WidgetInfo& CustomFunction(WidgetFunc customFunction_) { + customFunction = customFunction_; + return *this; + } +}; + +struct WidgetPath { + std::string sectionName; + std::string sidebarName; + SectionColumns column; +}; + +// `disabledInfo` holds information on reasons for hiding or disabling a widget, as well as an evaluation lambda that +// is run once per frame to update its status (this is done to prevent dozens of redundant CVarGets in each frame loop) +// `evaluation` returns a bool which can be determined by whatever code you want that changes its status +// `reason` is the text displayed in the disabledTooltip when a widget is disabled by a particular DisableReason +// `active` is what's referenced when determining disabled status for a widget that uses this This can also be used to +// hold reasons to hide widgets so that their evaluations are also only run once per frame +struct disabledInfo { + DisableInfoFunc evaluation; + const char* reason; + bool active = false; + int32_t value = 0; +}; + +// Contains the name displayed in the sidebar (label), the number of columns to use in drawing (columnCount; for visual +// separation, 1-3), and nested vectors of the widgets, grouped by column (columnWidgets). The number of widget vectors +// added to the column groups does not need to match the specified columnCount, e.g. you can have one vector added to +// the sidebar, but still separate the window into 3 columns and display only in the first column +struct SidebarEntry { + uint32_t columnCount; + std::vector> columnWidgets; +}; + +// Contains entries for what's listed in the header at the top, including the name displayed on the top bar (label), +// a vector of the SidebarEntries for that header entry, and the name of the cvar used to track what sidebar entry is +// the last viewed for that header. +struct MainMenuEntry { + std::string label; + const char* sidebarCvar; + std::unordered_map sidebars = {}; + std::vector sidebarOrder = {}; +}; + +static const std::unordered_map audioBackendsMap = { + { Ship::AudioBackend::WASAPI, "Windows Audio Session API" }, + { Ship::AudioBackend::SDL, "SDL" }, +}; + +static const std::unordered_map windowBackendsMap = { + { Ship::WindowBackend::FAST3D_DXGI_DX11, "DirectX" }, + { Ship::WindowBackend::FAST3D_SDL_OPENGL, "OpenGL" }, + { Ship::WindowBackend::FAST3D_SDL_METAL, "Metal" }, +}; + +struct MenuInit { + static std::vector>& GetInitFuncs() { + static std::vector> menuInitFuncs; + return menuInitFuncs; + } + + static std::unordered_map>>>& + GetUpdateFuncs() { + static std::unordered_map>>> + menuUpdateFuncs; + return menuUpdateFuncs; + } + + static void InitAll() { + auto& menuInitFuncs = MenuInit::GetInitFuncs(); + for (const auto& initFunc : menuInitFuncs) { + initFunc(); + } + } +}; + +struct RegisterMenuInitFunc { + RegisterMenuInitFunc(std::function initFunc) { + auto& menuInitFuncs = MenuInit::GetInitFuncs(); + + menuInitFuncs.push_back(initFunc); + } +}; + +struct RegisterMenuUpdateFunc { + RegisterMenuUpdateFunc(std::function updateFunc, std::string sectionName, std::string sidebarName) { + auto& menuUpdateFuncs = MenuInit::GetUpdateFuncs(); + + menuUpdateFuncs[sectionName][sidebarName].push_back(updateFunc); + } +}; + +#endif // MENUTYPES_H diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp new file mode 100644 index 000000000..8e850682c --- /dev/null +++ b/soh/soh/SohGui/ResolutionEditor.cpp @@ -0,0 +1,528 @@ +#include "ResolutionEditor.h" +#include +#include + +#include "soh/SohGui/UIWidgets.hpp" +#include +#include "soh/OTRGlobals.h" +#include "soh/SohGui/SohMenu.h" +#include "soh/SohGui/SohGui.hpp" + +/* Console Variables are grouped under gAdvancedResolution. (e.g. CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled") + + The following cvars are used in Libultraship and can be edited here: + - Enabled - Turns Advanced Resolution Mode on. + - AspectRatioX, AspectRatioY - Aspect ratio controls. To toggle off, set either to zero. + - VerticalPixelCount, VerticalResolutionToggle - Resolution controls. + - PixelPerfectMode, IntegerScale.Factor - Pixel Perfect Mode a.k.a. integer scaling controls. + - IntegerScale.FitAutomatically - Automatic resizing for Pixel Perfect Mode. + - IntegerScale.NeverExceedBounds - Prevents manual resizing from exceeding screen bounds. + + The following cvars are also implemented in LUS for niche use cases: + - IgnoreAspectCorrection - Stretch framebuffer to fill screen. + This is something of a power-user setting for niche setups that most people won't need or care about, + but may be useful if playing the Switch/Wii U ports on a 4:3 television. + - IntegerScale.ExceedBoundsBy - Offset the max screen bounds, usually by +1. + This isn't that useful at the moment, so it's unused here. +*/ + +namespace SohGui { +extern std::shared_ptr mSohMenu; +enum setting { UPDATE_aspectRatioX, UPDATE_aspectRatioY, UPDATE_verticalPixelCount }; + +std::unordered_map aspectRatioPresetLabels = { { 0, "Off" }, + { 1, "Custom" }, + { 2, "Original (4:3)" }, + { 3, "Widescreen (16:9)" }, + { 4, "Nintendo 3DS (5:3)" }, + { 5, "16:10 (8:5)" }, + { 6, "Ultrawide (21:9)" } }; +const float aspectRatioPresetsX[] = { 0.0f, 16.0f, 4.0f, 16.0f, 5.0f, 16.0f, 21.0f }; +const float aspectRatioPresetsY[] = { 0.0f, 9.0f, 3.0f, 9.0f, 3.0f, 10.0f, 9.0f }; +const int default_aspectRatio = 1; // Default combo list option + +const char* pixelCountPresetLabels[] = { "Custom", "Native N64 (240p)", "2x (480p)", "3x (720p)", "4x (960p)", + "5x (1200p)", "6x (1440p)", "Full HD (1080p)", "4K (2160p)" }; +const int pixelCountPresets[] = { 480, 240, 480, 720, 960, 1200, 1440, 1080, 2160 }; +const int default_pixelCount = 0; // Default combo list option + +// Resolution clamp values as hardcoded in LUS::Gui::ApplyResolutionChanges() +const uint32_t minVerticalPixelCount = SCREEN_HEIGHT; +const uint32_t maxVerticalPixelCount = 4320; // 18x native, or 8K TV resolution + +const unsigned short default_maxIntegerScaleFactor = 6; // Default size of Integer scale factor slider. + +enum messageType { MESSAGE_ERROR, MESSAGE_WARNING, MESSAGE_QUESTION, MESSAGE_INFO, MESSAGE_GRAY_75 }; +const ImVec4 messageColor[]{ + { 0.85f, 0.0f, 0.0f, 1.0f }, // MESSAGE_ERROR + { 0.85f, 0.85f, 0.0f, 1.0f }, // MESSAGE_WARNING + { 0.0f, 0.85f, 0.85f, 1.0f }, // MESSAGE_QUESTION + { 0.0f, 0.85f, 0.55f, 1.0f }, // MESSAGE_INFO + { 0.75f, 0.75f, 0.75f, 1.0f } // MESSAGE_GRAY_75 +}; +static const float enhancementSpacerHeight = 19.0f; +// Initialise update flags. +static bool update[3]; + +// Initialise integer scale bounds. +static short max_integerScaleFactor = default_maxIntegerScaleFactor; // default value, which may or may not get + // overridden depending on viewport res + +static short integerScale_maximumBounds = 1; // can change when window is resized + +// Combo List defaults +static int32_t item_aspectRatio; +static int32_t item_pixelCount; +// Stored Values for non-UIWidgets elements +static float aspectRatioX; +static float aspectRatioY; +static int32_t verticalPixelCount; +// Additional settings +static bool showHorizontalResField; +static int32_t horizontalPixelCount; +// Disabling flags +static bool disabled_everything; +static bool disabled_pixelCount; + +using namespace UIWidgets; + +void ResolutionCustomWidget(WidgetInfo& info) { + ImGui::BeginDisabled(disabled_everything); + // Vertical Resolution + UIWidgets::CVarCheckbox("Set fixed vertical resolution (disables Resolution slider)", CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", + UIWidgets::CheckboxOptions({ {.disabled = disabled_everything} }).Tooltip("Override the resolution scale slider and use the settings below, irrespective of window size.") + .Color(THEME_COLOR)); + //if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. + // UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + //} + UIWidgets::PushStyleCombobox(THEME_COLOR); + if (ImGui::Combo("Pixel Count Presets", &item_pixelCount, pixelCountPresetLabels, + IM_ARRAYSIZE(pixelCountPresetLabels)) && + item_pixelCount != default_pixelCount) { // don't change anything if "Custom" is selected. + verticalPixelCount = pixelCountPresets[item_pixelCount]; + + if (showHorizontalResField) { + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } + + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + UIWidgets::PopStyleCombobox(); + // Horizontal Resolution, if visibility is enabled for it. + if (showHorizontalResField) { + // Only show the field if Aspect Ratio is being enforced. + if ((aspectRatioX > 0.0f) && (aspectRatioY > 0.0f)) { + // So basically we're "faking" this one by setting aspectRatioX instead. + UIWidgets::PushStyleInput(THEME_COLOR); + if (ImGui::InputInt("Horiz. Pixel Count", &horizontalPixelCount, 8, 320)) { + item_aspectRatio = default_aspectRatio; + if (horizontalPixelCount < SCREEN_WIDTH) { + horizontalPixelCount = SCREEN_WIDTH; + } + aspectRatioX = horizontalPixelCount; + aspectRatioY = verticalPixelCount; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + } + UIWidgets::PopStyleInput(); + } else { // Display a notice instead. + ImGui::TextColored(messageColor[MESSAGE_QUESTION], + ICON_FA_QUESTION_CIRCLE " \"Force aspect ratio\" required."); + // ImGui::Text(" "); + ImGui::SameLine(); + if (UIWidgets::Button("Click to resolve", UIWidgets::ButtonOptions().Color(THEME_COLOR))) { + item_aspectRatio = default_aspectRatio; // Set it to Custom + aspectRatioX = aspectRatioPresetsX[2]; // but use the 4:3 defaults + aspectRatioY = aspectRatioPresetsY[2]; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } + } + } + // Vertical Resolution part 2 + UIWidgets::PushStyleInput(THEME_COLOR); + if (ImGui::InputInt("Vertical Pixel Count", &verticalPixelCount, 8, 240)) { + item_pixelCount = default_pixelCount; + update[UPDATE_verticalPixelCount] = true; + + // Account for the natural instinct to enter horizontal first. + // Ignore vertical resolutions that are below the lower clamp constant. + if (showHorizontalResField && !(verticalPixelCount < minVerticalPixelCount)) { + item_aspectRatio = default_aspectRatio; + aspectRatioX = horizontalPixelCount; + aspectRatioY = verticalPixelCount; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + } + } + ImGui::EndDisabled(); + UIWidgets::PopStyleInput(); + + // Integer scaling settings group (Pixel-perfect Mode) + static const ImGuiTreeNodeFlags IntegerScalingResolvedImGuiFlag = + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) ? ImGuiTreeNodeFlags_DefaultOpen + : ImGuiTreeNodeFlags_None; + UIWidgets::PushStyleHeader(THEME_COLOR); + if (ImGui::CollapsingHeader("Integer Scaling Settings", IntegerScalingResolvedImGuiFlag)) { + const bool disabled_pixelPerfectMode = + !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything; + // Pixel-perfect Mode + UIWidgets::CVarCheckbox("Pixel-perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", + UIWidgets::CheckboxOptions({{ .disabled = disabled_pixelCount || disabled_everything }}).Tooltip("Don't scale image to fill window.") + .Color(THEME_COLOR)); + if (disabled_pixelCount && CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0)) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + + // Integer Scaling + UIWidgets::CVarSliderInt(fmt::format("Integer scale factor: {}", max_integerScaleFactor).c_str(), CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", + UIWidgets::IntSliderOptions({ {.disabled = disabled_pixelPerfectMode || CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)} }) + .Min(1).Max(max_integerScaleFactor).DefaultValue(1).Tooltip("Integer scales the image. Only available in pixel-perfect mode.").Color(THEME_COLOR)); + // Display warning if size is being clamped or if framebuffer is larger than viewport. + if (!disabled_pixelPerfectMode && + (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) && + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", 1) > + integerScale_maximumBounds)) { + ImGui::SameLine(); + ImGui::TextColored(messageColor[MESSAGE_WARNING], ICON_FA_EXCLAMATION_TRIANGLE " Window exceeded."); + } + + UIWidgets::CVarCheckbox("Automatically scale image to fit viewport", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", + UIWidgets::CheckboxOptions({ {.disabled = disabled_pixelPerfectMode} }).DefaultValue(true).Color(THEME_COLOR) + .Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode.")); + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)) { + // This is just here to update the value shown on the slider. + // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", integerScale_maximumBounds); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + } // End of integer scaling settings + UIWidgets::PopStyleHeader(); + + // Collapsible panel for additional settings + UIWidgets::PushStyleHeader(THEME_COLOR); + if (ImGui::CollapsingHeader("Additional Settings")) { + #if defined(__SWITCH__) || defined(__WIIU__) + // Disable aspect correction, stretching the framebuffer to fill the viewport. + // This option is only really needed on systems limited to 16:9 TV resolutions, such as consoles. + // The associated cvar is still functional on PC platforms if you want to use it though. + UIWidgets::CVarCheckbox("Disable aspect correction and stretch the output image.\n" + "(Might be useful for 4:3 televisions!)\n" + "Not available in Pixel Perfect Mode.", + CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", + UIWidgets::CheckboxOptions({{ .disabled = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything}}) + .Color(THEME_COLOR)); + #else + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0)) { + // This setting is intentionally not exposed on PC platforms, + // but may be accidentally activated for varying reasons. + // Having this button should hopefully prevent support headaches. + ImGui::TextColored(messageColor[MESSAGE_QUESTION], ICON_FA_QUESTION_CIRCLE + " If the image is stretched and you don't know why, click this."); + if (ImGui::Button("Click to reenable aspect correction.")) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IgnoreAspectCorrection", 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + UIWidgets::Spacer(2); + } + #endif + + // A requested addition; an alternative way of displaying the resolution field. + if (UIWidgets::Checkbox("Show a horizontal resolution field, instead of aspect ratio.", + &showHorizontalResField, UIWidgets::CheckboxOptions().Color(THEME_COLOR))) { + if (!showHorizontalResField && (aspectRatioX > 0.0f)) { // when turning this setting off + // Refresh relevant values + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } else { // when turning this setting on + item_aspectRatio = default_aspectRatio; + if (aspectRatioX > 0.0f) { + // Refresh relevant values in the opposite order + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + aspectRatioX = aspectRatioY * horizontalPixelCount / verticalPixelCount; + } + } + update[UPDATE_aspectRatioX] = true; + } + + // Beginning of Integer Scaling additional settings. + { + // UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); + + // Integer Scaling - Never Exceed Bounds. + const bool disabled_neverExceedBounds = + !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0) || + disabled_everything; + if (UIWidgets::CVarCheckbox("Prevent integer scaling from exceeding screen bounds.\n" + "(Makes screen bounds take priority over specified factor.)", + CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", UIWidgets::CheckboxOptions({{ .disabled = disabled_neverExceedBounds}}) + .Tooltip( + "Prevents integer scaling factor from exceeding screen bounds.\n\n" + "Enabled: Will clamp the scaling factor and display a gentle warning in the resolution editor.\n" + "Disabled: Will allow scaling to exceed screen bounds, for users who want to crop overscan.\n\n" + " " ICON_FA_INFO_CIRCLE + " Please note that exceeding screen bounds may show a scroll bar on-screen.").Color(THEME_COLOR).DefaultValue(true))) { + + // Initialise the (currently unused) "Exceed Bounds By" cvar if it's been changed. + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + } + + // Integer Scaling - Exceed Bounds By 1x/Offset. + // A popular feature in some retro frontends/upscalers, sometimes called "crop overscan" or "1080p 5x". + UIWidgets::CVarCheckbox("Allow integer scale factor to go +1 above maximum screen bounds.", + CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", + UIWidgets::CheckboxOptions({{ .disabled = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything }}).Color(THEME_COLOR)); + + // It does actually function as expected, but exceeding the bottom of the screen shows a scroll bar. + // I've ended up commenting this one out because of the scroll bar, and for simplicity. + + // Display an info message about the scroll bar. + if (!CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) || + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { + ImGui::TextColored(messageColor[MESSAGE_INFO], + " " ICON_FA_INFO_CIRCLE + " A scroll bar may become visible if screen bounds are exceeded."); + + // Another support helper button, to disable the unused "Exceed Bounds By" cvar. + // (Remove this button if uncommenting the checkbox.) + if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0)) { + if (UIWidgets::Button("Click to reset a console variable that may be causing this.", UIWidgets::ButtonOptions().Color(THEME_COLOR))) { + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + } + } else { + ImGui::Text(" "); + } + } // End of Integer Scaling additional settings. + + } // End of additional settings + UIWidgets::PopStyleHeader(); + + // Clamp and update the cvars that don't use UIWidgets + if (update[UPDATE_aspectRatioX] || update[UPDATE_aspectRatioY] || update[UPDATE_verticalPixelCount]) { + if (update[UPDATE_aspectRatioX]) { + if (aspectRatioX < 0.0f) { + aspectRatioX = 0.0f; + } + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); + } + if (update[UPDATE_aspectRatioY]) { + if (aspectRatioY < 0.0f) { + aspectRatioY = 0.0f; + } + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); + } + if (update[UPDATE_verticalPixelCount]) { + // There's a upper and lower clamp on the Libultraship side too, + // so clamping it here is entirely visual, so the vertical resolution field reflects it. + if (verticalPixelCount < minVerticalPixelCount) { + verticalPixelCount = minVerticalPixelCount; + } + if (verticalPixelCount > maxVerticalPixelCount) { + verticalPixelCount = maxVerticalPixelCount; + } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); + } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } +} + +void RegisterResolutionWidgets() { + WidgetPath path = { "Settings", "Graphics", SECTION_COLUMN_2 }; + + // Resolution visualiser + mSohMenu->AddWidget(path, "Viewport dimensions: {} x {}", WIDGET_TEXT).PreFunc([](WidgetInfo& info) { + info.name = fmt::format("Viewport dimensions: {} x {}", gfx_current_game_window_viewport.width, + gfx_current_game_window_viewport.height); + }); + mSohMenu->AddWidget(path, "Internal resolution: {} x {}", WIDGET_TEXT).PreFunc([](WidgetInfo& info) { + info.name = + fmt::format("Internal resolution: {} x {}", gfx_current_dimensions.width, gfx_current_dimensions.height); + }); + + // Activator + mSohMenu->AddWidget(path, "Enable advanced settings.", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled"); + // Error/Warning display + mSohMenu + ->AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " Significant frame rate (FPS) drops may be occuring.", + WIDGET_TEXT) + .PreFunc( + [](WidgetInfo& info) { info.isHidden = !(!CVarGetInteger(CVAR_LOW_RES_MODE, 0) && IsDroppingFrames()); }) + .Options(WidgetOptions().Color(Colors::Orange)); + mSohMenu->AddWidget(path, ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings.", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_LOW_RES_MODE, 0); }) + .Options(WidgetOptions().Color(Colors::LightBlue)); + mSohMenu->AddWidget(path, "Click to disable N64 mode", WIDGET_BUTTON) + .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_LOW_RES_MODE, 0); }) + .Callback([](WidgetInfo& info) { + CVarSetInteger(CVAR_LOW_RES_MODE, 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + + // Aspect Ratio + mSohMenu->AddWidget(path, "AspectSep", WIDGET_SEPARATOR) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) { + info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF); + } + }); + mSohMenu->AddWidget(path, "Force aspect ratio:", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) { + info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF); + } + }); + mSohMenu->AddWidget(path, "(Select \"Off\" to disable.)", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) { + info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF); + } + }) + .SameLine(true) + .Options(WidgetOptions().Color(Colors::Gray)); + // Presets + mSohMenu->AddWidget(path, "Aspect Ratio", WIDGET_COMBOBOX) + .ValuePointer(&item_aspectRatio) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->GetDisabledMap().at(DISABLE_FOR_ADVANCED_RESOLUTION_OFF).active) { + info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_OFF); + } + }) + .Callback([](WidgetInfo& info) { + if (item_aspectRatio != default_aspectRatio) { // don't change anything if "Custom" is selected. + aspectRatioX = aspectRatioPresetsX[item_aspectRatio]; + aspectRatioY = aspectRatioPresetsY[item_aspectRatio]; + + if (showHorizontalResField) { + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + } + + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); + } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }) + .Options(ComboboxOptions().ComboMap(aspectRatioPresetLabels)); + mSohMenu->AddWidget(path, "AspectRatioCustom", WIDGET_CUSTOM).CustomFunction([](WidgetInfo& info) { + // Hide aspect ratio input fields if using one of the presets. + if (item_aspectRatio == default_aspectRatio && !showHorizontalResField) { + // Declare input interaction bools outside of IF statement to prevent Y field from disappearing. + const bool input_X = UIWidgets::SliderFloat("X", &aspectRatioX, + UIWidgets::FloatSliderOptions({{ .disabled = disabled_everything }}).Min(0.1f).Max(32.0f).Step(0.001f).Format("%3f") + .Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::Near).ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + const bool input_Y = UIWidgets::SliderFloat("Y", &aspectRatioY, + UIWidgets::FloatSliderOptions({{ .disabled = disabled_everything }}).Min(0.1f).Max(24.0f).Step(0.001f).Format("%3f") + .Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::Near).ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + if (input_X || input_Y) { + item_aspectRatio = default_aspectRatio; + update[UPDATE_aspectRatioX] = true; + update[UPDATE_aspectRatioY] = true; + } + } else if (showHorizontalResField) { // Show calculated aspect ratio + if (item_aspectRatio) { + ImGui::Dummy({ 0, 2 }); + const float resolvedAspectRatio = (float)gfx_current_dimensions.width / gfx_current_dimensions.height; + ImGui::Text("Aspect ratio: %.2f:1", resolvedAspectRatio); + } + } + }); + mSohMenu->AddWidget(path, "MoreResolutionSettings", WIDGET_CUSTOM).CustomFunction(ResolutionCustomWidget); +} + +void UpdateResolutionVars() { + // Clamp and update the cvars that don't use UIWidgets + if (update[UPDATE_aspectRatioX] || update[UPDATE_aspectRatioY] || update[UPDATE_verticalPixelCount]) { + if (update[UPDATE_aspectRatioX]) { + if (aspectRatioX < 0.0f) { + aspectRatioX = 0.0f; + } + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioX); + } + if (update[UPDATE_aspectRatioY]) { + if (aspectRatioY < 0.0f) { + aspectRatioY = 0.0f; + } + CVarSetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioY); + } + if (update[UPDATE_verticalPixelCount]) { + // There's a upper and lower clamp on the Libultraship side too, + // so clamping it here is entirely visual, so the vertical resolution field reflects it. + if (verticalPixelCount < minVerticalPixelCount) { + verticalPixelCount = minVerticalPixelCount; + } + if (verticalPixelCount > maxVerticalPixelCount) { + verticalPixelCount = maxVerticalPixelCount; + } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", verticalPixelCount); + } + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", item_aspectRatio); + CVarSetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", item_pixelCount); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + // Initialise update flags. + for (uint8_t i = 0; i < sizeof(update); i++) { + update[i] = false; + } + + // Initialise integer scale bounds. + short max_integerScaleFactor = default_maxIntegerScaleFactor; // default value, which may or may not get + // overridden depending on viewport res + + short integerScale_maximumBounds = 1; // can change when window is resized + // This is mostly just for UX purposes, as Fit Automatically logic is part of LUS. + if (((float)gfx_current_game_window_viewport.width / gfx_current_game_window_viewport.height) > + ((float)gfx_current_dimensions.width / gfx_current_dimensions.height)) { + // Scale to window height + integerScale_maximumBounds = gfx_current_game_window_viewport.height / gfx_current_dimensions.height; + } else { + // Scale to window width + integerScale_maximumBounds = gfx_current_game_window_viewport.width / gfx_current_dimensions.width; + } + // Lower-clamping maximum bounds value to 1 is no-longer necessary as that's accounted for in LUS. + // Letting it go below 1 in this Editor will even allow for checking if screen bounds are being exceeded. + if (default_maxIntegerScaleFactor < integerScale_maximumBounds) { + max_integerScaleFactor = integerScale_maximumBounds + + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.ExceedBoundsBy", 0); + } + + // Combo List defaults + item_aspectRatio = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.AspectRatio", 3); + item_pixelCount = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".UIComboItem.PixelCount", default_pixelCount); + // Stored Values for non-UIWidgets elements + aspectRatioX = CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioX", aspectRatioPresetsX[item_aspectRatio]); + aspectRatioY = CVarGetFloat(CVAR_PREFIX_ADVANCED_RESOLUTION ".AspectRatioY", aspectRatioPresetsY[item_aspectRatio]); + verticalPixelCount = + CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", pixelCountPresets[item_pixelCount]); + // Additional settings + showHorizontalResField = false; + horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; + // Disabling flags + disabled_everything = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); + disabled_pixelCount = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); +} + +bool IsDroppingFrames() { + // a rather imprecise way of checking for frame drops. + // but it's mostly there to inform the player of large drops. + const short targetFPS = CVarGetInteger("gInterpolationFPS", 20); + const float threshold = targetFPS / 20.0f + 4.1f; + return ImGui::GetIO().Framerate < targetFPS - threshold; +} + + static RegisterMenuUpdateFunc updateFunc(UpdateResolutionVars, "Settings", "Graphics"); + static RegisterMenuInitFunc initFunc(RegisterResolutionWidgets); + +} // namespace BenGui diff --git a/soh/soh/SohGui/ResolutionEditor.h b/soh/soh/SohGui/ResolutionEditor.h new file mode 100644 index 000000000..20d613b3b --- /dev/null +++ b/soh/soh/SohGui/ResolutionEditor.h @@ -0,0 +1,12 @@ +#ifndef RESOLUTIONEDITOR_H +#define RESOLUTIONEDITOR_H + +#include + +namespace SohGui { +bool IsDroppingFrames(); +void RegisterResolutionWidgets(); +void UpdateResolutionVars(); +} // namespace BenGui + +#endif // RESOLUTIONEDITOR_H diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 8d7a4ba45..ef8e40e8c 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -20,8 +20,7 @@ #ifdef __SWITCH__ #include #endif - -#include "UIWidgets.hpp" +#include "SohMenu.h" #include "include/global.h" #include "include/z64audio.h" #include "soh/SaveManager.h" @@ -32,48 +31,14 @@ #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" -bool isBetaQuestEnabled = false; - -extern "C" { - void enableBetaQuest() { isBetaQuestEnabled = true; } - void disableBetaQuest() { isBetaQuestEnabled = false; } -} - - namespace SohGui { // MARK: - Properties - - static const char* chestSizeAndTextureMatchesContentsOptions[4] = { "Disabled", "Both", "Texture Only", "Size Only" }; static const char* bunnyHoodOptions[3] = { "Disabled", "Faster Run & Longer Jump", "Faster Run" }; - static const char* allPowers[9] = { - "Vanilla (1x)", - "Double (2x)", - "Quadruple (4x)", - "Octuple (8x)", - "Foolish (16x)", - "Ridiculous (32x)", - "Merciless (64x)", - "Pure Torture (128x)", - "OHKO (256x)" }; - static const char* subPowers[8] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6], allPowers[7] }; - 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* bonkDamageValues[8] = { - "No Damage", - "0.25 Heart", - "0.5 Heart", - "1 Heart", - "2 Hearts", - "4 Hearts", - "8 Hearts", - "OHKO" - }; static const inline std::vector> audioBackends = { #ifdef _WIN32 @@ -98,7 +63,6 @@ namespace SohGui { return buttonText; } - // MARK: - Delegates std::shared_ptr mSohMenuBar; @@ -107,7 +71,8 @@ namespace SohGui { std::shared_ptr mStatsWindow; std::shared_ptr mGfxDebuggerWindow; std::shared_ptr mInputEditorWindow; - + + std::shared_ptr mSohMenu; std::shared_ptr mAudioEditorWindow; std::shared_ptr mInputViewer; std::shared_ptr mInputViewerSettings; @@ -129,25 +94,30 @@ namespace SohGui { std::shared_ptr mTimeSplitWindow; std::shared_ptr mPlandomizerWindow; std::shared_ptr mRandomizerSettingsWindow; - std::shared_ptr mAdvancedResolutionSettingsWindow; std::shared_ptr mModalWindow; std::shared_ptr mNotificationWindow; std::shared_ptr mTimeDisplayWindow; - std::shared_ptr mAboutWindow; + + UIWidgets::Colors GetMenuThemeColor() { + return mSohMenu->GetMenuThemeColor(); + } void SetupGuiElements() { auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); - mSohMenuBar = std::make_shared(CVAR_MENU_BAR_OPEN, CVarGetInteger(CVAR_MENU_BAR_OPEN, 0)); + /*mSohMenuBar = std::make_shared(CVAR_MENU_BAR_OPEN, CVarGetInteger(CVAR_MENU_BAR_OPEN, 0)); gui->SetMenuBar(std::reinterpret_pointer_cast(mSohMenuBar)); - if (gui->GetMenuBar() && !gui->GetMenuBar()->IsVisible()) { + if (!gui->GetMenuBar() && !CVarGetInteger("gSettings.DisableMenuShortcutNotify", 0)) { #if defined(__SWITCH__) || defined(__WIIU__) - Notification::Emit({ .message = "Press - to access enhancements menu", .remainingTime = 10.0f }); + gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press - to access enhancements menu"); #else - Notification::Emit({ .message = "Press F1 to access enhancements menu", .remainingTime = 10.0f }); + gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press F1 to access enhancements menu"); #endif - } + }*/ + + mSohMenu = std::make_shared(CVAR_WINDOW("Menu"), "Port Menu"); + gui->SetMenu(mSohMenu); mStatsWindow = gui->GetGuiWindow("Stats"); if (mStatsWindow == nullptr) { @@ -159,9 +129,9 @@ namespace SohGui { SPDLOG_ERROR("Could not find console window"); } - mGfxDebuggerWindow = gui->GetGuiWindow("GfxDebuggerWindow"); + mGfxDebuggerWindow = gui->GetGuiWindow("Gfx Debugger"); if (mGfxDebuggerWindow == nullptr) { - SPDLOG_ERROR("Could not find input GfxDebuggerWindow"); + SPDLOG_ERROR("Could not find Gfx Debugger window"); } mInputEditorWindow = gui->GetGuiWindow("Controller Configuration"); @@ -185,7 +155,7 @@ namespace SohGui { gui->AddGuiWindow(mSaveEditorWindow); mHookDebuggerWindow = std::make_shared(CVAR_WINDOW("HookDebugger"), "Hook Debugger", ImVec2(1250, 850)); gui->AddGuiWindow(mHookDebuggerWindow); - mDLViewerWindow = std::make_shared(CVAR_WINDOW("DLViewer"), "Display List Viewer", ImVec2(520, 600)); + mDLViewerWindow = std::make_shared(CVAR_WINDOW("DisplayListViewer"), "Display List Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mDLViewerWindow); mValueViewerWindow = std::make_shared(CVAR_WINDOW("ValueViewer"), "Value Viewer", ImVec2(520, 600)); gui->AddGuiWindow(mValueViewerWindow); @@ -193,26 +163,24 @@ namespace SohGui { gui->AddGuiWindow(mMessageViewerWindow); mGameplayStatsWindow = std::make_shared(CVAR_WINDOW("GameplayStats"), "Gameplay Stats", ImVec2(480, 550)); gui->AddGuiWindow(mGameplayStatsWindow); - mCheckTrackerWindow = std::make_shared(CVAR_WINDOW("CheckTracker"), "Check Tracker"); + mCheckTrackerWindow = std::make_shared(CVAR_WINDOW("CheckTracker"), "Check Tracker", ImVec2(400, 540)); gui->AddGuiWindow(mCheckTrackerWindow); mCheckTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("CheckTrackerSettings"), "Check Tracker Settings", ImVec2(600, 375)); gui->AddGuiWindow(mCheckTrackerSettingsWindow); - mEntranceTrackerWindow = std::make_shared(CVAR_WINDOW("EntranceTracker"), "Entrance Tracker"); + mEntranceTrackerWindow = std::make_shared(CVAR_WINDOW("EntranceTracker"), "Entrance Tracker", ImVec2(500, 750)); gui->AddGuiWindow(mEntranceTrackerWindow); mEntranceTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("EntranceTrackerSettings"), "Entrance Tracker Settings", ImVec2(600, 375)); gui->AddGuiWindow(mEntranceTrackerSettingsWindow); - mItemTrackerWindow = std::make_shared(CVAR_WINDOW("ItemTracker"), "Item Tracker"); + mItemTrackerWindow = std::make_shared(CVAR_WINDOW("ItemTracker"), "Item Tracker", ImVec2(350, 600)); gui->AddGuiWindow(mItemTrackerWindow); mItemTrackerSettingsWindow = std::make_shared(CVAR_WINDOW("ItemTrackerSettings"), "Item Tracker Settings", ImVec2(733, 472)); gui->AddGuiWindow(mItemTrackerSettingsWindow); mRandomizerSettingsWindow = std::make_shared(CVAR_WINDOW("RandomizerSettings"), "Randomizer Settings", ImVec2(920, 600)); gui->AddGuiWindow(mRandomizerSettingsWindow); - mTimeSplitWindow = std::make_shared(CVAR_WINDOW("TimeSplitEnabled"), "Time Splits", ImVec2(450, 660)); + mTimeSplitWindow = std::make_shared(CVAR_WINDOW("TimeSplits"), "Time Splits", ImVec2(450, 660)); gui->AddGuiWindow(mTimeSplitWindow); - mPlandomizerWindow = std::make_shared(CVAR_WINDOW("PlandomizerWindow"), "Plandomizer Editor", ImVec2(850, 760)); + mPlandomizerWindow = std::make_shared(CVAR_WINDOW("PlandomizerEditor"), "Plandomizer Editor", ImVec2(850, 760)); gui->AddGuiWindow(mPlandomizerWindow); - mAdvancedResolutionSettingsWindow = std::make_shared(CVAR_WINDOW("AdvancedResolutionEditor"), "Advanced Resolution Settings", ImVec2(497, 599)); - gui->AddGuiWindow(mAdvancedResolutionSettingsWindow); mModalWindow = std::make_shared(CVAR_WINDOW("ModalWindow"), "Modal Window"); gui->AddGuiWindow(mModalWindow); mModalWindow->Show(); @@ -221,8 +189,6 @@ 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() { @@ -231,7 +197,6 @@ namespace SohGui { mNotificationWindow = nullptr; mModalWindow = nullptr; - mAdvancedResolutionSettingsWindow = nullptr; mRandomizerSettingsWindow = nullptr; mItemTrackerWindow = nullptr; mItemTrackerSettingsWindow = nullptr; @@ -259,7 +224,6 @@ 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 index 4544c13e9..f465d1d1b 100644 --- a/soh/soh/SohGui/SohGui.hpp +++ b/soh/soh/SohGui/SohGui.hpp @@ -26,18 +26,8 @@ #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(); @@ -45,6 +35,9 @@ namespace SohGui { 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(); + UIWidgets::Colors GetMenuThemeColor(); } +#define THEME_COLOR SohGui::GetMenuThemeColor() + #endif /* SohGui_hpp */ diff --git a/soh/soh/SohGui/SohMenu.cpp b/soh/soh/SohGui/SohMenu.cpp new file mode 100644 index 000000000..d4aee295a --- /dev/null +++ b/soh/soh/SohGui/SohMenu.cpp @@ -0,0 +1,168 @@ +#include "SohMenu.h" +#include "soh/OTRGlobals.h" +#include "soh/Enhancements/controls/SohInputEditorWindow.h" +#include "window/gui/GuiMenuBar.h" +#include "window/gui/GuiElement.h" +#include +#include "StringHelper.h" +#include +#include + +extern std::unordered_map warpPointSceneList; + +namespace SohGui { +extern std::shared_ptr mSohMenu; + +using namespace UIWidgets; + +void SohMenu::AddSidebarEntry(std::string sectionName, std::string sidebarName, uint32_t columnCount) { + assert(!sectionName.empty()); + assert(!sidebarName.empty()); + menuEntries.at(sectionName).sidebars.emplace(sidebarName, SidebarEntry{ .columnCount = columnCount }); + menuEntries.at(sectionName).sidebarOrder.push_back(sidebarName); +} + +WidgetInfo& SohMenu::AddWidget(WidgetPath& pathInfo, std::string widgetName, WidgetType widgetType) { + assert(!widgetName.empty()); // Must be unique + assert(menuEntries.contains(pathInfo.sectionName)); // Section/header must already exist + assert(menuEntries.at(pathInfo.sectionName).sidebars.contains(pathInfo.sidebarName)); // Sidebar must already exist + std::unordered_map& sidebar = menuEntries.at(pathInfo.sectionName).sidebars; + uint8_t column = pathInfo.column; + if (sidebar.contains(pathInfo.sidebarName)) { + while (sidebar.at(pathInfo.sidebarName).columnWidgets.size() < column + 1) { + sidebar.at(pathInfo.sidebarName).columnWidgets.push_back({}); + } + } + SidebarEntry& entry = sidebar.at(pathInfo.sidebarName); + entry.columnWidgets.at(column).push_back({ .name = widgetName, .type = widgetType }); + WidgetInfo& widget = entry.columnWidgets.at(column).back(); + switch (widgetType) { + case WIDGET_CHECKBOX: + case WIDGET_CVAR_CHECKBOX: + widget.options = std::make_shared(); + break; + case WIDGET_SLIDER_FLOAT: + case WIDGET_CVAR_SLIDER_FLOAT: + widget.options = std::make_shared(); + break; + case WIDGET_SLIDER_INT: + case WIDGET_CVAR_SLIDER_INT: + widget.options = std::make_shared(); + break; + case WIDGET_COMBOBOX: + case WIDGET_CVAR_COMBOBOX: + case WIDGET_AUDIO_BACKEND: + case WIDGET_VIDEO_BACKEND: + widget.options = std::make_shared(); + break; + case WIDGET_BUTTON: + widget.options = std::make_shared(); + break; + case WIDGET_WINDOW_BUTTON: + widget.options = std::make_shared(); + break; + case WIDGET_COLOR_24: + case WIDGET_COLOR_32: + break; + case WIDGET_SEARCH: + case WIDGET_SEPARATOR: + case WIDGET_SEPARATOR_TEXT: + case WIDGET_TEXT: + default: + widget.options = std::make_shared(); + } + return widget; +} + +SohMenu::SohMenu(const std::string& consoleVariable, const std::string& name) + : Menu(consoleVariable, name, 0, UIWidgets::Colors::LightBlue) { +} + +void SohMenu::InitElement() { + Ship::Menu::InitElement(); + AddMenuSettings(); + AddMenuEnhancements(); + AddMenuRandomizer(); +#ifdef ENABLE_REMOTE_CONTROL + AddMenuNetwork(); +#endif + AddMenuDevTools(); + + if (CVarGetInteger(CVAR_SETTING("Menu.SidebarSearch"), 0)) { + InsertSidebarSearch(); + } + + for (auto& initFunc : MenuInit::GetInitFuncs()) { + initFunc(); + } + + disabledMap = { + { DISABLE_FOR_NO_VSYNC, + { [](disabledInfo& info) -> bool { + return !Ship::Context::GetInstance()->GetWindow()->CanDisableVerticalSync(); + }, + "Disabling VSync not supported" } }, + { DISABLE_FOR_NO_WINDOWED_FULLSCREEN, + { [](disabledInfo& info) -> bool { + return !Ship::Context::GetInstance()->GetWindow()->SupportsWindowedFullscreen(); + }, + "Windowed Fullscreen not supported" } }, + { DISABLE_FOR_NO_MULTI_VIEWPORT, + { [](disabledInfo& info) -> bool { + return !Ship::Context::GetInstance()->GetWindow()->GetGui()->SupportsViewports(); + }, + "Multi-viewports not supported" } }, + { DISABLE_FOR_NOT_DIRECTX, + { [](disabledInfo& info) -> bool { + return Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() != + Ship::WindowBackend::FAST3D_DXGI_DX11; + }, + "Available Only on DirectX" } }, + { DISABLE_FOR_DIRECTX, + { [](disabledInfo& info) -> bool { + return Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == + Ship::WindowBackend::FAST3D_DXGI_DX11; + }, + "Not Available on DirectX" } }, + { DISABLE_FOR_MATCH_REFRESH_RATE_ON, + { [](disabledInfo& info) -> bool { return CVarGetInteger(CVAR_SETTING("gMatchRefreshRate"), 0); }, + "Match Refresh Rate is Enabled" } }, + { DISABLE_FOR_ADVANCED_RESOLUTION_ON, + { [](disabledInfo& info) -> bool { return CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); }, + "Advanced Resolution Enabled" } }, + { DISABLE_FOR_VERTICAL_RES_TOGGLE_ON, + { [](disabledInfo& info) -> bool { + return CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); + }, + "Vertical Resolution Toggle Enabled" } }, + { DISABLE_FOR_LOW_RES_MODE_ON, + { [](disabledInfo& info) -> bool { return CVarGetInteger(CVAR_LOW_RES_MODE, 0); }, "N64 Mode Enabled" } }, + { DISABLE_FOR_NULL_PLAY_STATE, + { [](disabledInfo& info) -> bool { return gPlayState == NULL; }, "Save Not Loaded" } }, + { DISABLE_FOR_DEBUG_MODE_OFF, + { [](disabledInfo& info) -> bool { return !CVarGetInteger("gDeveloperTools.DebugEnabled", 0); }, + "Debug Mode is Disabled" } }, + { DISABLE_FOR_FRAME_ADVANCE_OFF, + { [](disabledInfo& info) -> bool { return !(gPlayState != nullptr && gPlayState->frameAdvCtx.enabled); }, + "Frame Advance is Disabled" } }, + { DISABLE_FOR_ADVANCED_RESOLUTION_OFF, + { [](disabledInfo& info) -> bool { return !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); }, + "Advanced Resolution is Disabled" } }, + { DISABLE_FOR_VERTICAL_RESOLUTION_OFF, + { [](disabledInfo& info) -> bool { return !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); }, + "Vertical Resolution Toggle is Off" } }, + }; +} + +void SohMenu::UpdateElement() { + Ship::Menu::UpdateElement(); +} + +void SohMenu::Draw() { + Ship::Menu::Draw(); +} + +void SohMenu::DrawElement() { + Ship::Menu::DrawElement(); +} +} // namespace SohGui diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h new file mode 100644 index 000000000..3e5f7a555 --- /dev/null +++ b/soh/soh/SohGui/SohMenu.h @@ -0,0 +1,227 @@ +#ifndef SOHMENU_H +#define SOHMENU_H + +#include +#include "UIWidgets.hpp" +#include "Menu.h" +#include "graphic/Fast3D/gfx_rendering_api.h" +#include "soh/cvar_prefixes.h" +#include "soh/Enhancements/enhancementTypes.h" +#include "soh/Enhancements/presets.h" + +extern "C" { +#include "z64.h" +#include "functions.h" +#include "variables.h" +#include "macros.h" +extern PlayState* gPlayState; +} + +#ifdef __cplusplus +extern "C" { +#endif + void enableBetaQuest(); + void disableBetaQuest(); +#ifdef __cplusplus +} +#endif + +namespace SohGui { + +static const std::unordered_map menuThemeOptions = { + { UIWidgets::Colors::Red, "Red" }, + { UIWidgets::Colors::DarkRed, "Dark Red" }, + { UIWidgets::Colors::Orange, "Orange" }, + { UIWidgets::Colors::Green, "Green" }, + { UIWidgets::Colors::DarkGreen, "Dark Green" }, + { UIWidgets::Colors::LightBlue, "Light Blue" }, + { UIWidgets::Colors::Blue, "Blue" }, + { UIWidgets::Colors::DarkBlue, "Dark Blue" }, + { UIWidgets::Colors::Indigo, "Indigo" }, + { UIWidgets::Colors::Violet, "Violet" }, + { UIWidgets::Colors::Purple, "Purple" }, + { UIWidgets::Colors::Brown, "Brown" }, + { UIWidgets::Colors::Gray, "Gray" }, + { UIWidgets::Colors::DarkGray, "Dark Gray" }, +}; + +static const std::unordered_map textureFilteringMap = { + { FILTER_THREE_POINT, "Three-Point" }, + { FILTER_LINEAR, "Linear" }, + { FILTER_NONE, "None" }, +}; + +static const std::unordered_map logLevels = { + { DEBUG_LOG_TRACE, "Trace" }, { DEBUG_LOG_DEBUG, "Debug" }, { DEBUG_LOG_INFO, "Info" }, + { DEBUG_LOG_WARN, "Warn" }, { DEBUG_LOG_ERROR, "Error" }, { DEBUG_LOG_CRITICAL, "Critical" }, + { DEBUG_LOG_OFF, "Off" }, +}; + +static const std::unordered_map notificationPosition = { + { 0, "Top Left" }, { 1, "Top Right" }, { 2, "Bottom Left" }, { 3, "Bottom Right" }, { 4, "Hidden" }, +}; + +static const std::unordered_map dekuStickCheat = { + { DEKU_STICK_NORMAL, "Normal" }, + { DEKU_STICK_UNBREAKABLE, "Unbreakable" }, + { DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, "Unbreakable + Always on Fire" } +}; + +static const std::unordered_map skipGetItemAnimationOptions = { + { SGIA_DISABLED, "Disabled" }, + { SGIA_JUNK, "Junk Items" }, + { SGIA_ALL, "All Items" } +}; + +static const std::unordered_map chestStyleMatchesContentsOptions = { + { CSMC_DISABLED, "Disabled" }, + { CSMC_BOTH, "Both" }, + { CSMC_TEXTURE, "Texture Only" }, + { CSMC_SIZE, "Size Only" } +}; + +static const std::unordered_map timeTravelOptions = { + { TIME_TRAVEL_DISABLED, "Disabled" }, + { TIME_TRAVEL_OOT, "Ocarina of Time" }, + { TIME_TRAVEL_ANY, "Any Ocarina" } +}; + +static const std::unordered_map sleepingWaterfallOptions = { + { WATERFALL_ALWAYS, "Always" }, + { WATERFALL_ONCE, "Once" }, + { WATERFALL_NEVER, "Never" } +}; + +static const std::unordered_map allPowers = { + { DAMAGE_VANILLA, "Vanilla (1x)" }, + { DAMAGE_DOUBLE, "Double (2x)" }, + { DAMAGE_QUADRUPLE, "Quadruple (4x)" }, + { DAMAGE_OCTUPLE, "Octuple (8x)" }, + { DAMAGE_FOOLISH, "Foolish (16x)" }, + { DAMAGE_RIDICULOUS, "Ridiculous (32x)" }, + { DAMAGE_MERCILESS, "Merciless (64x)" }, + { DAMAGE_TORTURE, "Pure Torture (128x)" }, + { DAMAGE_OHKO, "OHKO (256x)" } +}; + +static const std::unordered_map subPowers = { + { DAMAGE_VANILLA, "Vanilla (1x)" }, + { DAMAGE_DOUBLE, "Double (2x)" }, + { DAMAGE_QUADRUPLE, "Quadruple (4x)" }, + { DAMAGE_OCTUPLE, "Octuple (8x)" }, + { DAMAGE_FOOLISH, "Foolish (16x)" }, + { DAMAGE_RIDICULOUS, "Ridiculous (32x)" }, + { DAMAGE_MERCILESS, "Merciless (64x)" }, + { DAMAGE_TORTURE, "Pure Torture (128x)" }, +}; + +static const std::unordered_map subSubPowers = { + { DAMAGE_VANILLA, "Vanilla (1x)" }, + { DAMAGE_DOUBLE, "Double (2x)" }, + { DAMAGE_QUADRUPLE, "Quadruple (4x)" }, + { DAMAGE_OCTUPLE, "Octuple (8x)" }, + { DAMAGE_FOOLISH, "Foolish (16x)" }, + { DAMAGE_RIDICULOUS, "Ridiculous (32x)" }, + { DAMAGE_MERCILESS, "Merciless (64x)" }, +}; + +static const std::unordered_map bonkDamageValues = { + { BONK_DAMAGE_NONE, "No Damage" }, + { BONK_DAMAGE_QUARTER_HEART, "0.25 Hearts" }, + { BONK_DAMAGE_HALF_HEART, "0.5 Hearts" }, + { BONK_DAMAGE_1_HEART, "1 Heart" }, + { BONK_DAMAGE_2_HEARTS, "2 Hearts" }, + { BONK_DAMAGE_4_HEARTS, "4 Hearts" }, + { BONK_DAMAGE_8_HEARTS, "8 Hearts" }, + { BONK_DAMAGE_OHKO, "OHKO" } +}; + +static const std::unordered_map cursorAnywhereValues = { + { PAUSE_ANY_CURSOR_RANDO_ONLY, "Only in Rando" }, + { PAUSE_ANY_CURSOR_ALWAYS_ON, "Always" }, + { PAUSE_ANY_CURSOR_ALWAYS_OFF, "Never" } +}; + +static const std::unordered_map swordToggleModes = { + { SWORD_TOGGLE_NONE, "None" }, + { SWORD_TOGGLE_CHILD, "Child Toggle" }, + { SWORD_TOGGLE_BOTH_AGES, "Both Ages" } +}; + +static const std::unordered_map zFightingOptions = { + { ZFIGHT_FIX_DISABLED, "Disabled" }, + { ZFIGHT_FIX_CONSISTENT_VANISH, "Consistent Vanish" }, + { ZFIGHT_FIX_NO_VANISH, "No Vanish" } +}; + +static const std::unordered_map mirroredWorldModes = { + { MIRRORED_WORLD_OFF, "Disabled" }, + { MIRRORED_WORLD_ALWAYS, "Always" }, + { MIRRORED_WORLD_RANDOM, "Random" }, + { MIRRORED_WORLD_RANDOM_SEEDED, "Random (Seeded)" }, + { MIRRORED_WORLD_DUNGEONS_ALL, "Dungeons" }, + { MIRRORED_WORLD_DUNGEONS_VANILLA, "Dungeons (Vanilla)" }, + { MIRRORED_WORLD_DUNGEONS_MQ, "Dungeons (MQ)" }, + { MIRRORED_WORLD_DUNGEONS_RANDOM, "Dungeons Random" }, + { MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED, "Dungeons Random (Seeded)"} +}; + +static const std::unordered_map enemyRandomizerModes = { + { ENEMY_RANDOMIZER_OFF, "Disabled" }, + { ENEMY_RANDOMIZER_RANDOM, "Random" }, + { ENEMY_RANDOMIZER_RANDOM_SEEDED, "Random (Seeded)"} +}; + +static const std::unordered_map debugSaveFileModes = { + { 0, "Off" }, { 1, "Vanilla" }, { 2, "Maxed" }, +}; + +static const std::unordered_map bootSequenceLabels = { + { BOOTSEQUENCE_DEFAULT, "Default" }, + { BOOTSEQUENCE_AUTHENTIC, "Authentic" }, + { BOOTSEQUENCE_FILESELECT, "File Select" } +}; + +static const std::unordered_map enhancementPresetList = { + { ENHANCEMENT_PRESET_DEFAULT, "Default" }, + { ENHANCEMENT_PRESET_VANILLA_PLUS, "Vanilla Plus" }, + { ENHANCEMENT_PRESET_ENHANCED, "Enhanced" }, + { ENHANCEMENT_PRESET_RANDOMIZER, "Randomizer" } +}; + +static const char* itemCountMessageCVars[3] = { + CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), + CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), + CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), +}; + +static const char* itemCountMessageOptions[ARRAY_COUNT(itemCountMessageCVars)] = { + "Gold Skulltula Tokens", + "Pieces of Heart", + "Heart Containers", +}; + +class SohMenu : public Ship::Menu { + public: + SohMenu(const std::string& consoleVariable, const std::string& name); + + void InitElement() override; + void DrawElement() override; + void UpdateElement() override; + void Draw() override; + + void AddSidebarEntry(std::string sectionName, std::string sidbarName, uint32_t columnCount); + WidgetInfo& AddWidget(WidgetPath& pathInfo, std::string widgetName, WidgetType widgetType); + void AddMenuSettings(); + void AddMenuEnhancements(); + void AddMenuDevTools(); + void AddMenuRandomizer(); + void AddMenuNetwork(); + + private: + char mGitCommitHashTruncated[8]; + bool mIsTaggedVersion; +}; +} // namespace SohGui + +#endif // SOHMENU_H diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index 5fd7324fb..18fa8b53d 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -39,12 +39,10 @@ #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 @@ -81,55 +79,6 @@ static const char* imguiScaleOptions[4] = { "Small", "Normal", "Large", "X-Large "Linear", "None" }; - static const char* chestStyleMatchesContentsOptions[4] = { "Disabled", "Both", "Texture Only", "Size Only" }; - static const char* skipGetItemAnimationOptions[3] = { "Disabled", "Junk Items", "All Items" }; - static const char* skipForcedDialogOptions[4] = { "None", "Navi Only", "NPCs Only", "All" }; - static const char* sleepingWaterfallOptions[3] = { "Always", "Once", "Never" }; - static const char* bunnyHoodOptions[3] = { "Disabled", "Faster Run & Longer Jump", "Faster Run" }; - static const char* mirroredWorldModes[9] = { - "Disabled", "Always", "Random", "Random (Seeded)", "Dungeons", - "Dungeons (Vanilla)", "Dungeons (MQ)", "Dungeons Random", "Dungeons Random (Seeded)", - }; - static const char* enemyRandomizerModes[3] = { "Disabled", "Random", "Random (Seeded)" }; - static const char* allPowers[9] = { - "Vanilla (1x)", - "Double (2x)", - "Quadruple (4x)", - "Octuple (8x)", - "Foolish (16x)", - "Ridiculous (32x)", - "Merciless (64x)", - "Pure Torture (128x)", - "OHKO (256x)" }; - static const char* subPowers[8] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6], allPowers[7] }; - 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* bootSequenceLabels[3] = { "Default", "Authentic", "File Select" }; - static const char* DebugSaveFileModes[3] = { "Off", "Vanilla", "Maxed" }; - static const char* DekuStickCheat[3] = { "Normal", "Unbreakable", "Unbreakable + Always on Fire" }; - static const char* bonkDamageValues[8] = { - "No Damage", - "0.25 Heart", - "0.5 Heart", - "1 Heart", - "2 Hearts", - "4 Hearts", - "8 Hearts", - "OHKO" - }; - static const char* timeTravelOptions[3] = { "Disabled", "Ocarina of Time", "Any Ocarina" }; - static const char* swordToggleModes[3] = { "Disabled", "Child Toggle", "Both Ages (May lead to unintended behaviour)"}; - static const char* itemCountMessageCVars[3] = { - CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), - CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), - CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), - }; - static const char* itemCountMessageOptions[ARRAY_COUNT(itemCountMessageCVars)] = { - "Gold Skulltula Tokens", - "Pieces of Heart", - "Heart Containers", - }; - extern "C" SaveContext gSaveContext; namespace SohGui { @@ -137,2058 +86,43 @@ namespace SohGui { std::unordered_map availableWindowBackendsMap; Ship::WindowBackend configWindowBackend; -void UpdateWindowBackendObjects() { - Ship::WindowBackend runningWindowBackend = Ship::Context::GetInstance()->GetWindow()->GetWindowBackend(); - int32_t configWindowBackendId = Ship::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1); - if (Ship::Context::GetInstance()->GetWindow()->IsAvailableWindowBackend(configWindowBackendId)) { - configWindowBackend = static_cast(configWindowBackendId); - } else { - configWindowBackend = runningWindowBackend; - } - - auto availableWindowBackends = Ship::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends(); - for (auto& backend : *availableWindowBackends) { - availableWindowBackendsMap[backend] = windowBackendNames[backend]; - } -} - -void DrawMenuBarIcon() { - static bool gameIconLoaded = false; - if (!gameIconLoaded) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Game_Icon", "textures/icons/gIcon.png"); - gameIconLoaded = true; - } - - if (Ship::Context::GetInstance()->GetWindow()->GetGui()->HasTextureByName("Game_Icon")) { -#ifdef __SWITCH__ - ImVec2 iconSize = ImVec2(20.0f, 20.0f); - float posScale = 1.0f; -#elif defined(__WIIU__) - ImVec2 iconSize = ImVec2(16.0f * 2, 16.0f * 2); - float posScale = 2.0f; -#else - ImVec2 iconSize = ImVec2(16.0f, 16.0f); - float posScale = 1.0f; -#endif - ImGui::SetCursorPos(ImVec2(5, 2.5f) * posScale); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Game_Icon"), iconSize); - ImGui::SameLine(); - ImGui::SetCursorPos(ImVec2(25, 0) * posScale); - } -} - -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" -#else - "[-]" -#endif - )) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->GetMenuBar()->ToggleVisibility(); - } - UIWidgets::Spacer(0); -#if !defined(__SWITCH__) && !defined(__WIIU__) - if (ImGui::MenuItem("Toggle Fullscreen", "F11")) { - Ship::Context::GetInstance()->GetWindow()->ToggleFullscreen(); - } - UIWidgets::Spacer(0); -#endif - if (ImGui::MenuItem("Reset", -#ifdef __APPLE__ - "Command-R" -#elif !defined(__SWITCH__) && !defined(__WIIU__) - "Ctrl+R" -#else - "" -#endif - )) { - std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); - } -#if !defined(__SWITCH__) && !defined(__WIIU__) - UIWidgets::Spacer(0); - if (ImGui::MenuItem("Open App Files Folder")) { - std::string filesPath = Ship::Context::GetInstance()->GetAppDirectoryPath(); - SDL_OpenURL(std::string("file:///" + std::filesystem::absolute(filesPath).string()).c_str()); - } - UIWidgets::Spacer(0); - - if (ImGui::MenuItem("Quit")) { - Ship::Context::GetInstance()->GetWindow()->Close(); - } -#endif - ImGui::EndMenu(); - } -} - -extern std::shared_ptr mInputEditorWindow; extern std::shared_ptr mGfxDebuggerWindow; -extern std::shared_ptr mInputViewer; -extern std::shared_ptr mInputViewerSettings; -extern std::shared_ptr mAdvancedResolutionSettingsWindow; void DrawSettingsMenu() { - if (ImGui::BeginMenu("Settings")) - { - if (ImGui::BeginMenu("Audio")) { - UIWidgets::PaddedEnhancementSliderInt("Master Volume: %d %%", "##Master_Vol", CVAR_SETTING("Volume.Master"), 0, 100, "", 100, true, false, true); - if (UIWidgets::PaddedEnhancementSliderInt("Main Music Volume: %d %%", "##Main_Music_Vol", CVAR_SETTING("Volume.MainMusic"), 0, 100, "", 100, true, false, true)) { - Audio_SetGameVolume(SEQ_PLAYER_BGM_MAIN, ((float)CVarGetInteger(CVAR_SETTING("Volume.MainMusic"), 100) / 100.0f)); - } - if (UIWidgets::PaddedEnhancementSliderInt("Sub Music Volume: %d %%", "##Sub_Music_Vol", CVAR_SETTING("Volume.SubMusic"), 0, 100, "", 100, true, false, true)) { - Audio_SetGameVolume(SEQ_PLAYER_BGM_SUB, ((float)CVarGetInteger(CVAR_SETTING("Volume.SubMusic"), 100) / 100.0f)); - } - if (UIWidgets::PaddedEnhancementSliderInt("Fanfare Volume: %d %%", "##Fanfare_Vol", CVAR_SETTING("Volume.Fanfare"), 0, 100, "", 100, true, false, true)) { - Audio_SetGameVolume(SEQ_PLAYER_FANFARE, ((float)CVarGetInteger(CVAR_SETTING("Volume.Fanfare"), 100) / 100.0f)); - } - if (UIWidgets::PaddedEnhancementSliderInt("Sound Effects Volume: %d %%", "##Sound_Effect_Vol", CVAR_SETTING("Volume.SFX"), 0, 100, "", 100, true, false, true)) { - Audio_SetGameVolume(SEQ_PLAYER_SFX, ((float)CVarGetInteger(CVAR_SETTING("Volume.SFX"), 100) / 100.0f)); - } - - static std::unordered_map audioBackendNames = { - { Ship::AudioBackend::WASAPI, "Windows Audio Session API" }, - { Ship::AudioBackend::SDL, "SDL" } - }; - - ImGui::Text("Audio API (Needs reload)"); - auto currentAudioBackend = Ship::Context::GetInstance()->GetAudio()->GetCurrentAudioBackend(); - - if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { - for (uint8_t i = 0; i < Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { - auto backend = Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; - if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { - Ship::Context::GetInstance()->GetAudio()->SetCurrentAudioBackend(backend); - } - } - ImGui::EndCombo(); - } - if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - UIWidgets::ReEnableComponent(""); - } - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Controller")) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2 (12.0f, 6.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - if (mInputEditorWindow) { - if (ImGui::Button(GetWindowButtonText("Controller Mapping", CVarGetInteger(CVAR_WINDOW("ControllerConfiguration"), 0)).c_str(), ImVec2 (-1.0f, 0.0f))) { - mInputEditorWindow->ToggleVisibility(); - } - } - UIWidgets::PaddedSeparator(); - ImGui::PopStyleColor(1); - ImGui::PopStyleVar(3); - #ifndef __SWITCH__ - UIWidgets::EnhancementCheckbox("Menubar Controller Navigation", CVAR_IMGUI_CONTROLLER_NAV); - UIWidgets::Tooltip("Allows controller navigation of the SOH menu bar (Settings, Enhancements,...)\nCAUTION: This will disable game inputs while the menubar is visible.\n\nD-pad to move between items, A to select, and X to grab focus on the menu bar"); - UIWidgets::PaddedSeparator(); - #endif - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2 (12.0f, 6.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - if (mInputViewer) { - if (ImGui::Button(GetWindowButtonText("Input Viewer", CVarGetInteger(CVAR_WINDOW("InputViewer"), 0)).c_str(), ImVec2 (-1.0f, 0.0f))) { - mInputViewer->ToggleVisibility(); - } - } - if (mInputViewerSettings) { - if (ImGui::Button(GetWindowButtonText("Input Viewer Settings", CVarGetInteger(CVAR_WINDOW("InputViewerSettings"), 0)).c_str(), ImVec2 (-1.0f, 0.0f))) { - mInputViewerSettings->ToggleVisibility(); - } - } - ImGui::PopStyleColor(1); - ImGui::PopStyleVar(3); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Graphics")) { - #ifndef __APPLE__ - const bool disabled_resolutionSlider = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0) && - CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); - if (UIWidgets::EnhancementSliderFloat("Internal Resolution: %.1f %%", "##IMul", CVAR_INTERNAL_RESOLUTION, 0.5f, - 2.0f, "", 1.0f, true, true, disabled_resolutionSlider)) { - Ship::Context::GetInstance()->GetWindow()->SetResolutionMultiplier(CVarGetFloat(CVAR_INTERNAL_RESOLUTION, 1)); - } - UIWidgets::Tooltip("Resolution scale. Multiplies output resolution by this value, on each axis relative to window size.\n" - "Lower values may improve performance.\n" - "Values above 100% can be used for super-sampling, as an intensive but highly effective form of anti-aliasing.\n\n" - "Default: 100%"); - - if (mAdvancedResolutionSettingsWindow) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(12.0f, 6.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - UIWidgets::Spacer(0); - if (ImGui::Button(GetWindowButtonText("Advanced Resolution", CVarGetInteger(CVAR_WINDOW("AdvancedResolutionEditor"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mAdvancedResolutionSettingsWindow->ToggleVisibility(); - } - ImGui::PopStyleColor(1); - ImGui::PopStyleVar(3); - } - #else - // macOS: Internal resolution is currently disabled in libultraship. - ImGui::BeginGroup(); - ImGui::Text("Internal Resolution: 100.0%%"); - UIWidgets::Spacer(0); - ImGui::Text(" " ICON_FA_INFO_CIRCLE " Not available on this system."); - UIWidgets::Spacer(0); - ImGui::EndGroup(); - #endif - - #ifndef __WIIU__ - if (UIWidgets::PaddedEnhancementSliderInt( - (CVarGetInteger(CVAR_MSAA_VALUE, 1) == 1) ? "Anti-aliasing (MSAA): Off" : "Anti-aliasing (MSAA): %d", - "##IMSAA", CVAR_MSAA_VALUE, 1, 8, "", 1, true, true, false)) { - Ship::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger(CVAR_MSAA_VALUE, 1)); - } - UIWidgets::Tooltip("Activates MSAA (multi-sample anti-aliasing) from 2x up to 8x, to smooth the edges of rendered geometry.\n" - "Higher sample count will result in smoother edges on models, but may reduce performance.\n\n" - "Recommended: 2x or 4x"); - #endif - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - { // FPS Slider - const int minFps = 20; - static int maxFps; - if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { - maxFps = 360; - } else { - maxFps = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); - } - int currentFps = fmax(fmin(OTRGlobals::Instance->GetInterpolationFPS(), maxFps), minFps); - #ifdef __WIIU__ - UIWidgets::Spacer(0); - // only support divisors of 60 on the Wii U - if (currentFps > 60) { - currentFps = 60; - } else { - currentFps = 60 / (60 / currentFps); - } - - int fpsSlider = 1; - if (currentFps == 20) { - ImGui::Text("FPS: Original (20)"); - } else { - ImGui::Text("FPS: %d", currentFps); - if (currentFps == 30) { - fpsSlider = 2; - } else { // currentFps == 60 - fpsSlider = 3; - } - } - if (CVarGetInteger(CVAR_SETTING("MatchRefreshRate"), 0)) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - if (ImGui::Button(" - ##WiiUFPS")) { - fpsSlider--; - } - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - - UIWidgets::Spacer(0); - - ImGui::PushItemWidth(std::min((ImGui::GetContentRegionAvail().x - 60.0f), 260.0f)); - ImGui::SliderInt("##WiiUFPSSlider", &fpsSlider, 1, 3, "", ImGuiSliderFlags_AlwaysClamp); - ImGui::PopItemWidth(); - - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::Button(" + ##WiiUFPS")) { - fpsSlider++; - } - - if (CVarGetInteger(CVAR_SETTING("MatchRefreshRate"), 0)) { - UIWidgets::ReEnableComponent(""); - } - if (fpsSlider > 3) { - fpsSlider = 3; - } else if (fpsSlider < 1) { - fpsSlider = 1; - } - - if (fpsSlider == 1) { - currentFps = 20; - } else if (fpsSlider == 2) { - currentFps = 30; - } else if (fpsSlider == 3) { - currentFps = 60; - } - CVarSetInteger(CVAR_SETTING("InterpolationFPS"), currentFps); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - #else - bool matchingRefreshRate = - CVarGetInteger(CVAR_SETTING("MatchRefreshRate"), 0) && Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() != Ship::WindowBackend::FAST3D_DXGI_DX11; - UIWidgets::PaddedEnhancementSliderInt( - (currentFps == 20) ? "Frame Rate: Original (20 fps)" : "Frame Rate: %d fps", - "##FPSInterpolation", CVAR_SETTING("InterpolationFPS"), minFps, maxFps, "", 20, true, true, false, matchingRefreshRate); - #endif - if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { - UIWidgets::Tooltip( - "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics.\n" - "This is purely visual and does not impact game logic, execution of glitches etc.\n" - "Higher frame rate settings may impact CPU performance." - "\n\n " ICON_FA_INFO_CIRCLE - " There is no need to set this above your monitor's refresh rate. Doing so will waste resources and may give a worse result."); - } else { - UIWidgets::Tooltip( - "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics.\n" - "This is purely visual and does not impact game logic, execution of glitches etc.\n" - "Higher frame rate settings may impact CPU performance."); - } - } // END FPS Slider - - if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { - UIWidgets::Spacer(0); - if (ImGui::Button("Match Frame Rate to Refresh Rate")) { - int hz = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); - if (hz >= 20 && hz <= 360) { - CVarSetInteger(CVAR_SETTING("InterpolationFPS"), hz); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - } - } else { - UIWidgets::PaddedEnhancementCheckbox("Match Frame Rate to Refresh Rate", CVAR_SETTING("MatchRefreshRate"), true, false); - } - UIWidgets::Tooltip("Matches interpolation value to the game window's current refresh rate."); - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - - ImGui::Text("ImGui Menu Scale"); - ImGui::SameLine(); - ImGui::TextColored({ 0.85f, 0.35f, 0.0f, 1.0f }, "(Experimental)"); - if (UIWidgets::EnhancementCombobox(CVAR_SETTING("ImGuiScale"), imguiScaleOptions, 1)) { - OTRGlobals::Instance->ScaleImGui(); - } - UIWidgets::Tooltip("Changes the scaling of the ImGui menu elements."); - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - - ImGui::Text("Renderer API (Needs reload)"); - - if (availableWindowBackendsMap.size() <= 1) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - if (ImGui::BeginCombo("##RApi", availableWindowBackendsMap[configWindowBackend])) { - for (auto backend : availableWindowBackendsMap) { - if (ImGui::Selectable(backend.second, backend.first == configWindowBackend)) { - Ship::Context::GetInstance()->GetConfig()->SetInt("Window.Backend.Id", static_cast(backend.first)); - Ship::Context::GetInstance()->GetConfig()->SetString("Window.Backend.Name", backend.second); - Ship::Context::GetInstance()->GetConfig()->Save(); - UpdateWindowBackendObjects(); - } - } - ImGui::EndCombo(); - } - if (availableWindowBackendsMap.size() <= 1) { - UIWidgets::ReEnableComponent(""); - } - - if (Ship::Context::GetInstance()->GetWindow()->CanDisableVerticalSync()) { - UIWidgets::PaddedEnhancementCheckbox("Enable Vsync", CVAR_VSYNC_ENABLED, true, false); - UIWidgets::Tooltip("Activate vertical sync, to prevent screen tearing."); - } - - if (Ship::Context::GetInstance()->GetWindow()->SupportsWindowedFullscreen()) { - UIWidgets::PaddedEnhancementCheckbox("Windowed fullscreen", CVAR_SDL_WINDOWED_FULLSCREEN, true, false); - } - - if (Ship::Context::GetInstance()->GetWindow()->GetGui()->SupportsViewports()) { - UIWidgets::PaddedEnhancementCheckbox("Allow multi-windows (Needs reload)", CVAR_ENABLE_MULTI_VIEWPORTS, true, false, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Allows windows to be able to be dragged off of the main game window. Requires a reload to take effect."); - } - - // If more filters are added to LUS, make sure to add them to the filters list here - ImGui::Text("Texture Filtering (Needs reload)"); - UIWidgets::EnhancementCombobox(CVAR_TEXTURE_FILTER, filters, FILTER_THREE_POINT); - UIWidgets::Tooltip("Texture filtering, aka texture smoothing. Requires a reload to take effect.\n\n" - "Three-Point: Replicates real N64 texture filtering.\n" - "Bilinear: If Three-Point causes poor performance, try this.\n" - "Nearest: Disables texture smoothing. (Not recommended)"); - - UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - - // Draw LUS settings menu (such as Overlays Text Font) - Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGameOverlay()->DrawSettings(); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Languages")) { - UIWidgets::PaddedEnhancementCheckbox("Translate Title Screen", CVAR_SETTING("TitleScreenTranslation")); - if (UIWidgets::EnhancementRadioButton("English", CVAR_SETTING("Languages"), LANGUAGE_ENG)) { - GameInteractor::Instance->ExecuteHooks(); - } - if (UIWidgets::EnhancementRadioButton("German", CVAR_SETTING("Languages"), LANGUAGE_GER)) { - GameInteractor::Instance->ExecuteHooks(); - } - if (UIWidgets::EnhancementRadioButton("French", CVAR_SETTING("Languages"), LANGUAGE_FRA)) { - GameInteractor::Instance->ExecuteHooks(); - } - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Accessibility")) { - #if defined(_WIN32) || defined(__APPLE__) - UIWidgets::PaddedEnhancementCheckbox("Text to Speech", CVAR_SETTING("A11yTTS")); - UIWidgets::Tooltip("Enables text to speech for in game dialog"); - #endif - UIWidgets::PaddedEnhancementCheckbox("Disable Idle Camera Re-Centering", CVAR_SETTING("A11yDisableIdleCam")); - UIWidgets::Tooltip("Disables the automatic re-centering of the camera when idle."); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Notifications")) { - static const char* notificationPosition[] = { - "Top Left", - "Top Right", - "Bottom Left", - "Bottom Right", - "Hidden", - }; - - ImGui::Text("Position"); - UIWidgets::EnhancementCombobox(CVAR_SETTING("Notifications.Position"), notificationPosition, 0); - UIWidgets::EnhancementSliderFloat("Duration: %.1f seconds", "##NotificationDuration", CVAR_SETTING("Notifications.Duration"), 3.0f, 30.0f, "", 10.0f, false, true, false); - UIWidgets::EnhancementSliderFloat("BG Opacity: %.1f %%", "##NotificaitonBgOpacity", CVAR_SETTING("Notifications.BgOpacity"), 0.0f, 1.0f, "", 0.5f, true, true, false); - UIWidgets::EnhancementSliderFloat("Size: %.1f", "##NotificaitonSize", CVAR_SETTING("Notifications.Size"), 1.0f, 20.0f, "", 1.8f, false, true, false); - - UIWidgets::Spacer(0); - - if (ImGui::Button("Test Notification", ImVec2(-1.0f, 0.0f))) { - Notification::Emit({ - .message = (gPlayState != NULL ? SohUtils::GetSceneName(gPlayState->sceneNum) : "Hyrule") + " looks beautiful today!", - }); - } - - ImGui::EndMenu(); - } - - ImGui::EndMenu(); - } -} - -extern std::shared_ptr mAudioEditorWindow; -extern std::shared_ptr mCosmeticsEditorWindow; -extern std::shared_ptr mGameplayStatsWindow; -extern std::shared_ptr mTimeSplitWindow; -extern std::shared_ptr mTimeDisplayWindow; - -void DrawEnhancementsMenu() { - if (ImGui::BeginMenu("Enhancements")) - { - ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - - DrawPresetSelector(PRESET_TYPE_ENHANCEMENTS); - - UIWidgets::PaddedSeparator(); - - if (ImGui::BeginMenu("Gameplay")) - { - if (ImGui::BeginMenu("Time Savers")) - { - ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 8.0f); - ImGui::BeginTable("##timeSaversMenu", 2, ImGuiTableFlags_SizingFixedFit); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableNextColumn(); - UIWidgets::Spacer(0); - ImGui::Text("Speed-ups:"); - UIWidgets::PaddedSeparator(); - bool allSkipsChecked = - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), IS_RANDO); - bool someSkipsChecked = - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), IS_RANDO); - - ImGuiContext* g = ImGui::GetCurrentContext(); - ImGuiItemFlags backup_item_flags = g->CurrentItemFlags; - if (!allSkipsChecked && someSkipsChecked) g->CurrentItemFlags |= ImGuiItemFlags_MixedValue; - if (ImGui::Checkbox("All", &allSkipsChecked)) { - int32_t newValue = allSkipsChecked ? 1 : 0; - - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), newValue); - - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - g->CurrentItemFlags = backup_item_flags; - UIWidgets::PaddedEnhancementCheckbox("Skip Intro", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip Entrance Cutscenes", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip Story Cutscenes", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip Song Cutscenes", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip Boss Introductions", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Quick Boss Deaths", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip One Point Cutscenes (Chests, Door Unlocks, etc)", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip Owl Interactions", CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Skip Misc Interactions", CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Disable Title Card", CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, IS_RANDO); - UIWidgets::PaddedEnhancementCheckbox("Exclude Glitch-Aiding Cutscenes", CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, 0); - UIWidgets::Tooltip("Don't skip cutscenes that are associated with useful glitches, currently this is only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS and the Box Skip One Point in Jabu"); - UIWidgets::PaddedEnhancementCheckbox("Skip Child Stealth", CVAR_ENHANCEMENT("TimeSavers.SkipChildStealth"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip("The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards."); - UIWidgets::PaddedEnhancementCheckbox("Skip Tower Escape", CVAR_ENHANCEMENT("TimeSavers.SkipTowerEscape"), false, false, false, "", UIWidgets::CheckboxGraphics::Cross, false); - UIWidgets::Tooltip("Skip the tower escape sequence between Ganondorf and Ganon."); - - UIWidgets::PaddedText("Skip Get Item Animations", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), skipGetItemAnimationOptions, SGIA_DISABLED); - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) != SGIA_DISABLED) { - UIWidgets::EnhancementSliderFloat("Item Scale: %f", "##ItemScale", CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale"), 5.0f, 15.0f, "", 10.0f, false); - UIWidgets::Tooltip("The size of the item when it is picked up"); - } - - UIWidgets::PaddedText("Skip Forced Dialog", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("TimeSavers.SkipForcedDialog"), skipForcedDialogOptions, FORCED_DIALOG_SKIP_NONE); - UIWidgets::Tooltip("Prevent forced conversations with Navi or other NPCs"); - - UIWidgets::PaddedEnhancementSliderInt("Text Speed: %dx", "##TEXTSPEED", CVAR_ENHANCEMENT("TextSpeed"), 1, 5, "", 1, true, false, true); - UIWidgets::PaddedEnhancementCheckbox("Skip Text", CVAR_ENHANCEMENT("SkipText"), false, true); - UIWidgets::Tooltip("Holding down B skips text"); - UIWidgets::PaddedEnhancementSliderInt("Slow Text Speed: %dx", "##SLOWTEXTSPEED", CVAR_ENHANCEMENT("SlowTextSpeed"), 1, 5, "", 1, true, false, true); - UIWidgets::Tooltip("Changes the speed of sections of text that normally are paced slower than the text surrounding it."); - if (ImGui::Button("Match Normal Text")) { - CVarSetInteger(CVAR_ENHANCEMENT("SlowTextSpeed"), CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 1)); - } - UIWidgets::Tooltip("Makes the speed of slow text match the normal text speed above."); - UIWidgets::PaddedEnhancementSliderFloat("King Zora Speed: %.2fx", "##MWEEPSPEED", CVAR_ENHANCEMENT("MweepSpeed"), 0.1f, 5.0f, "", 1.0f, false, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Vine/Ladder Climb speed +%d", "##CLIMBSPEED", CVAR_ENHANCEMENT("ClimbSpeed"), 0, 12, "", 0, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Block pushing speed +%d", "##BLOCKSPEED", CVAR_ENHANCEMENT("FasterBlockPush"), 0, 5, "", 0, true, false, true); - UIWidgets::PaddedEnhancementSliderInt("Crawl speed %dx", "##CRAWLSPEED", CVAR_ENHANCEMENT("CrawlSpeed"), 1, 4, "", 1, true, false, true); - UIWidgets::PaddedEnhancementCheckbox("Faster Heavy Block Lift", CVAR_ENHANCEMENT("FasterHeavyBlockLift"), false, false); - UIWidgets::Tooltip("Speeds up lifting silver rocks and obelisks"); - UIWidgets::PaddedEnhancementCheckbox("Skip Pickup Messages", CVAR_ENHANCEMENT("FastDrops"), true, false); - UIWidgets::Tooltip("Skip pickup messages for new consumable items and bottle swipes"); - UIWidgets::PaddedEnhancementCheckbox("Fast Ocarina Playback", CVAR_ENHANCEMENT("FastOcarinaPlayback"), true, false); - UIWidgets::Tooltip("Skip the part where the Ocarina playback is called when you play a song"); - UIWidgets::PaddedEnhancementCheckbox("Skip Magic Arrow Equip Animation", CVAR_ENHANCEMENT("SkipArrowAnimation"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Skip save confirmation", CVAR_ENHANCEMENT("SkipSaveConfirmation"), true, false); - UIWidgets::Tooltip("Skip the \"Game saved.\" confirmation screen"); - UIWidgets::PaddedEnhancementCheckbox("Faster Farore's Wind", CVAR_ENHANCEMENT("FastFarores"), true, false); - UIWidgets::Tooltip("Greatly decreases cast time of Farore's Wind magic spell."); - - ImGui::TableNextColumn(); - UIWidgets::Spacer(0); - ImGui::Text("Changes:"); - UIWidgets::PaddedSeparator(); - - UIWidgets::PaddedEnhancementSliderInt("Biggoron Forge Time: %d days", "##FORGETIME", CVAR_ENHANCEMENT("ForgeTime"), 0, 3, "", 3, true, false, true); - UIWidgets::Tooltip("Allows you to change the number of days it takes for Biggoron to forge the Biggoron Sword"); - UIWidgets::PaddedEnhancementCheckbox("Remember Save Location", CVAR_ENHANCEMENT("RememberSaveLocation"), false, false); - UIWidgets::Tooltip("When loading a save, places Link at the last entrance he went through.\n" - "This doesn't work if the save was made in grottos/fairy fountains or dungeons."); - UIWidgets::PaddedEnhancementCheckbox("Navi Timer Resets", CVAR_ENHANCEMENT("ResetNaviTimer"), true, false); - UIWidgets::Tooltip("Resets the Navi timer on scene change. If you have already talked to her, she will try and talk to you again, instead of needing a save warp or death. "); - UIWidgets::PaddedEnhancementCheckbox("No Skulltula Freeze", CVAR_ENHANCEMENT("SkulltulaFreeze"), true, false); - UIWidgets::Tooltip("Stops the game from freezing the player when picking up Gold Skulltulas"); - UIWidgets::PaddedEnhancementCheckbox("Nighttime GS Always Spawn", CVAR_ENHANCEMENT("NightGSAlwaysSpawn"), true, false); - UIWidgets::Tooltip("Nighttime Skulltulas will spawn during both day and night."); - UIWidgets::PaddedEnhancementCheckbox("Dampe Appears All Night", CVAR_ENHANCEMENT("DampeAllNight"), true, false); - UIWidgets::Tooltip("Makes Dampe appear anytime during the night, not just his usual working hours."); - UIWidgets::PaddedEnhancementCheckbox("Fast Chests", CVAR_ENHANCEMENT("FastChests"), true, false); - UIWidgets::Tooltip("Kick open every chest"); - UIWidgets::PaddedText("Chest size & texture matches contents", true, false); - if (UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), chestStyleMatchesContentsOptions, CSMC_DISABLED)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) == CSMC_DISABLED) { - CVarSetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); - } - } - UIWidgets::Tooltip( - "Chest sizes and textures are changed to help identify the item inside.\n" - " - Major items: Large gold chests\n" - " - Lesser items: Large brown chests\n" - " - Junk items: Small brown chests\n" - " - Small keys: Small silver chest\n" - " - Boss keys: Vanilla size and texture\n" - " - Skulltula Tokens: Small skulltula chest\n" - "\n" - "NOTE: Textures will not apply if you are using a mod pack with a custom chest model." - ); - if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) != CSMC_DISABLED) { - UIWidgets::PaddedEnhancementCheckbox("Chests of Agony", CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), true, false); - UIWidgets::Tooltip("Only change the size/texture of chests if you have the Stone of Agony."); - } - UIWidgets::PaddedEnhancementCheckbox("Ask to Equip New Items", CVAR_ENHANCEMENT("AskToEquip"), true, false); - UIWidgets::Tooltip("Adds a prompt to equip newly-obtained swords, shields and tunics"); - UIWidgets::PaddedEnhancementCheckbox("Better Owl", CVAR_ENHANCEMENT("BetterOwl"), true, false); - 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."); - 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"); - UIWidgets::PaddedEnhancementCheckbox("Quit Fishing At Door", CVAR_ENHANCEMENT("QuitFishingAtDoor"), true, false); - UIWidgets::Tooltip("Fisherman asks if you want to quit at the door when you still have the rod"); - UIWidgets::PaddedText("Time Travel with the Song of Time", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("TimeTravel"), timeTravelOptions, 0); - UIWidgets::Tooltip("Allows Link to freely change age by playing the Song of Time.\n" - "Time Blocks can still be used properly.\n\n" - "Requirements:\n" - "- Obtained the Ocarina of Time (depends on selection)\n" - "- Obtained the Song of Time\n" - "- Obtained the Master Sword\n" - "- Not within range of Time Block\n" - "- Not within range of Ocarina playing spots"); - UIWidgets::PaddedEnhancementCheckbox("Pause Warp", CVAR_ENHANCEMENT("PauseWarp"), true, false); - UIWidgets::Tooltip("Selection of warp song in pause menu initiates warp. Disables song playback."); - UIWidgets::PaddedEnhancementCheckbox("Skip water take breath animation", CVAR_ENHANCEMENT("SkipSwimDeepEndAnim"), true, false); - UIWidgets::Tooltip("Skips Link's taking breath animation after coming up from water. This setting does not interfere with getting items from underwater."); - bool forceSkipScarecrow = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SKIP_SCARECROWS_SONG); - static const char* forceSkipScarecrowText = "This setting is forcefully enabled because a savefile\nwith \"Skip Scarecrow Song\" is loaded"; - UIWidgets::PaddedEnhancementCheckbox("Skip Scarecrow Song", CVAR_ENHANCEMENT("InstantScarecrow"), true, false, - forceSkipScarecrow, forceSkipScarecrowText, UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Pierre appears when Ocarina is pulled out. Requires learning scarecrow song."); - bool forceSleepingWaterfallEnhancement = - IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SLEEPING_WATERFALL) == RO_WATERFALL_OPEN; - uint8_t forceSleepingWaterfallValue = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SLEEPING_WATERFALL) + 1; - static const char* forceSleepingWaterfallText = - "This setting is forcefully enabled because a randomizer savefile with \"Sleeping Waterfall: Open\" is loaded."; - UIWidgets::PaddedText("Play Zelda's Lullaby to open Sleeping Waterfall", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), - sleepingWaterfallOptions, 0, forceSleepingWaterfallEnhancement, - forceSleepingWaterfallText, forceSleepingWaterfallValue); - UIWidgets::Tooltip( - "Always: Link must always play Zelda's Lullaby to open " - "the waterfall entrance to Zora's Domain.\n" - "Once: Link only needs to play Zelda's Lullaby once to " - "open the waterfall; after that, it stays open permanently.\n" - "Never: Link never needs to play Zelda's Lullaby to open the " - "waterfall; he only needs to have learned it and have an ocarina." - ); - - ImGui::EndTable(); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Items")) - { - UIWidgets::PaddedEnhancementCheckbox("Equip Items on D-pad", CVAR_ENHANCEMENT("DpadEquips"), true, false); - UIWidgets::Tooltip("Equip items and equipment on the D-pad\nIf used with \"D-pad on Pause Screen\", you " - "must hold C-Up to equip instead of navigate"); - UIWidgets::PaddedEnhancementCheckbox("Instant Putaway", CVAR_ENHANCEMENT("InstantPutaway"), true, false); - UIWidgets::Tooltip("Allow Link to put items away without having to wait around"); - UIWidgets::PaddedEnhancementCheckbox("Instant Boomerang Recall", CVAR_ENHANCEMENT("FastBoomerang"), true, false); - UIWidgets::Tooltip("Instantly return the boomerang to Link by pressing its item button while it's in the air"); - UIWidgets::PaddedEnhancementCheckbox("Prevent Dropped Ocarina Inputs", CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), true, false); - UIWidgets::Tooltip("Prevent dropping inputs when playing the ocarina quickly"); - UIWidgets::PaddedText("Bunny Hood Effect", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("MMBunnyHood"), bunnyHoodOptions, BUNNY_HOOD_VANILLA); - UIWidgets::Tooltip( - "Wearing the Bunny Hood grants a speed increase like in Majora's Mask. The longer jump option is not accounted for in randomizer logic.\n\n" - "Also disables NPC's reactions to wearing the Bunny Hood." - ); - UIWidgets::PaddedEnhancementCheckbox("Masks Equippable as Adult", CVAR_ENHANCEMENT("AdultMasks"), true, false); - UIWidgets::Tooltip("Allows masks to be equipped normally from the pause menu as adult."); - UIWidgets::PaddedEnhancementCheckbox("Persistent masks", CVAR_ENHANCEMENT("PersistentMasks"), true, false); - UIWidgets::Tooltip( - "Stops masks from automatically unequipping on certain situations:\n" - "- When entering a new scene\n" - "- When not in any C button or the D-Pad\n" - "- When saving and quitting\n" - "- When dying\n" - "- When traveling thru time (if \"Masks Equippable as Adult\" is activated)" - ); - UIWidgets::PaddedEnhancementCheckbox("Mask Select in Inventory", CVAR_ENHANCEMENT("MaskSelect"), true, false); - UIWidgets::Tooltip("After completing the mask trading sub-quest, press A and any direction on the mask slot to change masks"); - UIWidgets::PaddedEnhancementCheckbox("Nuts explode bombs", CVAR_ENHANCEMENT("NutsExplodeBombs"), true, false); - UIWidgets::Tooltip("Makes nuts explode bombs, similar to how they interact with bombchus. This does not affect bombflowers."); - UIWidgets::PaddedEnhancementCheckbox("Equip Multiple Arrows at Once", CVAR_ENHANCEMENT("SeparateArrows"), true, false); - UIWidgets::Tooltip("Allow the bow and magic arrows to be equipped at the same time on different slots. (Note this will disable the behaviour of the 'Equip Dupe' glitch)"); - UIWidgets::PaddedEnhancementCheckbox("Bow as Child/Slingshot as Adult", CVAR_ENHANCEMENT("BowSlingshotAmmoFix"), true, false); - UIWidgets::Tooltip("Allows child to use bow with arrows.\nAllows adult to use slingshot with seeds.\n\nRequires glitches or 'Timeless Equipment' cheat to equip."); - UIWidgets::PaddedEnhancementCheckbox("Better Farore's Wind", CVAR_ENHANCEMENT("BetterFarore"), true, false); - UIWidgets::Tooltip("Helps FW persist between ages, gives child and adult separate FW points, and can be used in more places."); - UIWidgets::PaddedEnhancementCheckbox("Remove Explosive Limit", CVAR_ENHANCEMENT("RemoveExplosiveLimit"), true, false); - UIWidgets::Tooltip("Removes the cap of 3 active explosives being deployed at once."); - UIWidgets::PaddedEnhancementCheckbox("Static Explosion Radius", CVAR_ENHANCEMENT("StaticExplosionRadius"), true, false); - UIWidgets::Tooltip("Explosions are now a static size, like in Majora's Mask and OoT3D. Makes bombchu hovering much easier."); - UIWidgets::PaddedEnhancementCheckbox("Prevent Bombchus Forcing First-Person", CVAR_ENHANCEMENT("DisableFirstPersonChus"), true, false); - UIWidgets::Tooltip("Prevent bombchus from forcing the camera into first-person mode when released."); - UIWidgets::PaddedEnhancementCheckbox("Better Bombchu Shopping", CVAR_ENHANCEMENT("BetterBombchuShopping"), true, false, - IS_RANDO, "This setting is forcefully enabled when you are playing a randomizer.", UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Bombchus do not sell out when bought, and a 10 pack of bombchus costs 99 rupees instead of 100." - "\n" - "Toggling while inside the shop will not change prices or restock any SOLD OUTs"); - UIWidgets::PaddedEnhancementCheckbox("Aiming reticle for the bow/slingshot", CVAR_ENHANCEMENT("BowReticle"), true, false); - UIWidgets::Tooltip("Aiming with a bow or slingshot will display a reticle as with the hookshot when the projectile is ready to fire."); - if (UIWidgets::PaddedEnhancementCheckbox("Aim boomerang in first-person mode", CVAR_ENHANCEMENT("BoomerangFirstPerson"), true, false)) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0)) { - CVarSetInteger(CVAR_ENHANCEMENT("BoomerangReticle"), 0); - } - } - UIWidgets::Tooltip( - "Change aiming for the boomerang from third person to first person to see past Link's head"); - if (CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0)) { - UIWidgets::PaddedEnhancementCheckbox("Aiming reticle for boomerang", CVAR_ENHANCEMENT("BoomerangReticle"), true, false); - UIWidgets::Tooltip("Aiming with the boomerang will display a reticle as with the hookshot"); - } - if (UIWidgets::PaddedEnhancementCheckbox("Allow strength equipment to be toggled", CVAR_ENHANCEMENT("ToggleStrength"), true, false)) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ToggleStrength"), 0)) { - CVarSetInteger(CVAR_ENHANCEMENT("StrengthDisabled"), 0); - } - } - UIWidgets::Tooltip("Allows strength to be toggled on and off by pressing A on the strength upgrade in the equipment subscreen of the pause menu (This allows performing some glitches that require the player to not have strength)."); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Item Count Messages")) { - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - bool allItemCountsChecked = std::all_of(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [](const char* cvar) { return CVarGetInteger(cvar, 0); }); - bool someItemCountsChecked = std::any_of(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [](const char* cvar) { return CVarGetInteger(cvar, 0); }); - - ImGuiContext* g = ImGui::GetCurrentContext(); - ImGuiItemFlags backup_item_flags = g->CurrentItemFlags; - if (!allItemCountsChecked && someItemCountsChecked) g->CurrentItemFlags |= ImGuiItemFlags_MixedValue; - if (ImGui::Checkbox("All", &allItemCountsChecked)) { - int32_t newValue = allItemCountsChecked ? 1 : 0; - - std::for_each(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [newValue](const char* cvar) { CVarSetInteger(cvar, newValue); }); - - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - g->CurrentItemFlags = backup_item_flags; - - for (int i = 0; i < numOptions; i++) { - UIWidgets::PaddedEnhancementCheckbox(itemCountMessageOptions[i], itemCountMessageCVars[i], true, false); - } - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Difficulty Options")) - { - if (ImGui::BeginMenu("Shooting Gallery")) { - UIWidgets::EnhancementCheckbox("Customize Behavior", CVAR_ENHANCEMENT("CustomizeShootingGallery")); - UIWidgets::Tooltip("Turn on/off changes to the shooting gallery behavior"); - bool disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeShootingGallery"), 0); - static const char* disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; - UIWidgets::PaddedEnhancementCheckbox("Instant Win", CVAR_ENHANCEMENT("InstantShootingGalleryWin"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Skips the shooting gallery minigame"); - UIWidgets::PaddedEnhancementCheckbox("No Rupee Randomization", CVAR_ENHANCEMENT("ConstantAdultGallery"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Forces the rupee order to not be randomized as adult, making it the same as chlid"); - UIWidgets::PaddedEnhancementSliderInt("Child Starting Ammunition: %d", "##cShootingGalleryAmmunition", CVAR_ENHANCEMENT("ShootingGalleryAmmoChild"), 10, 30, "", 15, true, true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("The ammunition at the start of the shooting gallery minigame as a child"); - UIWidgets::PaddedEnhancementSliderInt("Adult Starting Ammunition: %d", "##aShootingGalleryAmmunition", CVAR_ENHANCEMENT("ShootingGalleryAmmoAdult"), 10, 30, "", 15, true, true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("The ammunition at the start of the shooting gallery minigame as an adult"); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Bombchu Bowling")) { - UIWidgets::EnhancementCheckbox("Customize Behavior", CVAR_ENHANCEMENT("CustomizeBombchuBowling")); - UIWidgets::Tooltip("Turn on/off changes to the bombchu bowling behavior"); - bool disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeBombchuBowling"), 0) == 0; - static const char* disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; - UIWidgets::PaddedEnhancementCheckbox("Remove Small Cucco", CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Prevents the small cucco from appearing in the bombchu bowling minigame"); - UIWidgets::PaddedEnhancementCheckbox("Remove Big Cucco", CVAR_ENHANCEMENT("BombchuBowlingNoBigCucco"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Prevents the big cucco from appearing in the bombchu bowling minigame"); - UIWidgets::PaddedEnhancementSliderInt("Bombchu Count: %d", "##cBombchuBowlingAmmunition", CVAR_ENHANCEMENT("BombchuBowlingAmmo"), 3, 20, "", 10, true, true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("The number of bombchus available at the start of the bombchu bowling minigame"); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - if (ImGui::BeginMenu("Fishing")) { - UIWidgets::EnhancementCheckbox("Customize Behavior", CVAR_ENHANCEMENT("CustomizeFishing")); - UIWidgets::Tooltip("Turn on/off changes to the fishing behavior"); - bool disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0); - static const char* disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; - UIWidgets::PaddedEnhancementCheckbox("Instant Fishing", CVAR_ENHANCEMENT("InstantFishing"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("All fish will be caught instantly"); - UIWidgets::PaddedEnhancementCheckbox("Guarantee Bite", CVAR_ENHANCEMENT("GuaranteeFishingBite"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("When a line is stable, guarantee bite. Otherwise use default logic"); - UIWidgets::PaddedEnhancementCheckbox("Fish Never Escape", CVAR_ENHANCEMENT("FishNeverEscape"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Once a hook has been set, fish will never let go while being reeled in."); - UIWidgets::PaddedEnhancementCheckbox("Loaches Always Appear", CVAR_ENHANCEMENT("LoachesAlwaysAppear"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Loaches will always appear in the fishing pond instead of every four visits."); - UIWidgets::PaddedEnhancementCheckbox("Skip Keep Confirmation", CVAR_ENHANCEMENT("SkipKeepConfirmation"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("The pond owner will not ask to confirm if you want to keep a smaller fish."); - UIWidgets::PaddedEnhancementSliderInt("Child Minimum Weight: %d", "##cMinimumWeight", CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3, 10, "", 10, true, true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("The minimum weight for the unique fishing reward as a child"); - UIWidgets::PaddedEnhancementSliderInt("Adult Minimum Weight: %d", "##aMinimumWeight", CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6, 13, "", 13, true, true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("The minimum weight for the unique fishing reward as an adult"); - UIWidgets::PaddedEnhancementCheckbox("All fish are Hyrule Loaches", CVAR_ENHANCEMENT("AllHyruleLoaches"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Every fish in the fishing pond will always be a Hyrule Loach\n\nNote: This requires reloading the area"); - ImGui::EndMenu(); - } - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Lost Woods Ocarina Game")) { - UIWidgets::EnhancementCheckbox("Customize Behavior", CVAR_ENHANCEMENT("CustomizeOcarinaGame")); - UIWidgets::Tooltip("Turn on/off changes to the lost woods ocarina game behavior"); - bool disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 0); - static const char* disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; - UIWidgets::PaddedEnhancementCheckbox("Instant Win", CVAR_ENHANCEMENT("InstantOcarinaGameWin"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Skips the lost woods ocarina game"); - UIWidgets::PaddedEnhancementSliderInt("Note Play Speed: %dx", "##OcarinaGameNoteSpeed", CVAR_ENHANCEMENT("OcarinaGame.NoteSpeed"), 1, 5, "", 1, true, true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Adjust the speed that the skull kids play notes"); - UIWidgets::PaddedEnhancementCheckbox("Unlimited Playback Time", CVAR_ENHANCEMENT("OcarinaUnlimitedFailTime"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Removes the timer to play back the song"); - UIWidgets::PaddedEnhancementSliderInt("Number of Starting Notes: %d", "##OcarinaGameStartingNotes", CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 1, 8, "", 3, true, true, false, - disabled, disabledTooltip); - UIWidgets::Tooltip("Adjust the number of notes the skull kids play to start the first round"); - int roundMin = CVarGetInteger(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 3); - UIWidgets::PaddedEnhancementSliderInt("Round One Notes: %d", "##OcarinaGameRoundOne", - CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes"), roundMin, 8, "", 5, true, true, - false, - disabled, disabledTooltip); - UIWidgets::Tooltip("Adjust the number of notes you need to play to end the first round"); - UIWidgets::PaddedEnhancementSliderInt("Round Two Notes: %d", "##OcarinaGameRoundTwoNotes", - CVAR_ENHANCEMENT("OcarinaGame.RoundTwoNotes"), roundMin, 8, "", 6, true, true, - false, - disabled, disabledTooltip); - UIWidgets::Tooltip("Adjust the number of notes you need to play to end the second round"); - UIWidgets::PaddedEnhancementSliderInt("Round Three Notes: %d", "##OcarinaGameRoundThreeNotes", - CVAR_ENHANCEMENT("OcarinaGame.RoundThreeNotes"), roundMin, 8, "", 8, true, true, - false, - disabled, disabledTooltip); - UIWidgets::Tooltip("Adjust the number of notes you need to play to end the third round"); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Frogs Ocarina Game")) { - UIWidgets::EnhancementCheckbox("Customize Behavior", CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame")); - UIWidgets::Tooltip("Turn on/off changes to the frogs ocarina game behavior"); - bool disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0); - static const char* disabledTooltip = - "This option is disabled because \"Customize Behavior\" is turned off"; - UIWidgets::PaddedEnhancementCheckbox("Instant Win", CVAR_ENHANCEMENT("InstantFrogsGameWin"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Skips the frogs ocarina game"); - UIWidgets::PaddedEnhancementCheckbox("Unlimited Playback Time", CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), true, false, disabled, disabledTooltip); - UIWidgets::Tooltip("Removes the timer to play back the song"); - bool disabledFrog = 0; - static const char* disabledFrogTooltip = - "This option is disabled because \"Customize Behavior\" is turned off or \"Unlimited Playback Time\" is on"; - if (!CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0)) { - disabledFrog = 1; - } else { - disabledFrog = 0; - } - UIWidgets::PaddedEnhancementSliderInt("Modify note timer: %dx", "##FrogsFailTimer", CVAR_ENHANCEMENT("FrogsModifyFailTime"), 1, 5, "", 1, true, true, false, - disabledFrog, disabledFrogTooltip); - UIWidgets::Tooltip("Adjusts the time allowed for playback before failing"); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - UIWidgets::PaddedEnhancementCheckbox("Delete File On Death", CVAR_ENHANCEMENT("DeleteFileOnDeath"), true, false); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f)); - UIWidgets::Tooltip("Dying will delete your file\n\n " ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE "\nTHIS IS NOT REVERSABLE\nUSE AT YOUR OWN RISK!"); - ImGui::PopStyleColor(); - if (UIWidgets::PaddedEnhancementCheckbox("Permanent heart loss", CVAR_ENHANCEMENT("PermanentHeartLoss"), true, false)) { - UpdatePermanentHeartLossState(); - } - UIWidgets::Tooltip("When you lose 4 quarters of a heart you will permanently lose that heart container.\n\nDisabling this after the fact will restore your heart containers."); - ImGui::Text("Damage Multiplier"); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("DamageMult"), allPowers, 0); - UIWidgets::Tooltip( - "Modifies all sources of damage not affected by other sliders\n" - "2x: Can survive all common attacks from the start of the game\n" - "4x: Dies in 1 hit to any substantial attack from the start of the game\n" - "8x: Can only survive trivial damage from the start of the game\n" - "16x: Can survive all common attacks with max health without double defense\n" - "32x: Can survive all common attacks with max health and double defense\n" - "64x: Can survive trivial damage with max health without double defense\n" - "128x: Can survive trivial damage with max health and double defense\n" - "256x: Cannot survive damage" - ); - UIWidgets::PaddedText("Fall Damage Multiplier", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("FallDamageMult"), subPowers, 0); - UIWidgets::Tooltip( - "Modifies all fall damage\n" - "2x: Can survive all fall damage from the start of the game\n" - "4x: Can only survive short fall damage from the start of the game\n" - "8x: Cannot survive any fall damage from the start of the game\n" - "16x: Can survive all fall damage with max health without double defense\n" - "32x: Can survive all fall damage with max health and double defense\n" - "64x: Can survive short fall damage with double defense\n" - "128x: Cannot survive fall damage" - ); - UIWidgets::PaddedText("Void Damage Multiplier", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("VoidDamageMult"), subSubPowers, 0); - UIWidgets::Tooltip( - "Modifies damage taken after falling into a void\n" - "2x: Can survive void damage from the start of the game\n" - "4x: Cannot survive void damage from the start of the game\n" - "8x: Can survive void damage twice with max health without double defense\n" - "16x: Can survive void damage with max health without double defense\n" - "32x: Can survive void damage with max health and double defense\n" - "64x: Cannot survive void damage" - ); - UIWidgets::PaddedText("Bonk Damage Multiplier", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("BonkDamageMult"), bonkDamageValues, BONK_DAMAGE_NONE); - UIWidgets::Tooltip("Modifies damage taken after bonking."); - UIWidgets::PaddedEnhancementCheckbox("Spawn with full health", CVAR_ENHANCEMENT("FullHealthSpawn"), true, false); - UIWidgets::Tooltip("Respawn with full health instead of 3 Hearts"); - UIWidgets::PaddedEnhancementCheckbox("No Random Drops", CVAR_ENHANCEMENT("NoRandomDrops"), true, false); - UIWidgets::Tooltip("Disables random drops, except from the Goron Pot, Dampe, and bosses"); - bool forceEnableBombchuDrops = IS_RANDO && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_ENABLE_BOMBCHU_DROPS) == 1; - static const char* forceEnableBombchuDropsText = - "This setting is forcefully enabled because a savefile\nwith \"Enable Bombchu Drops\" is loaded."; - UIWidgets::PaddedEnhancementCheckbox("Enable Bombchu Drops", CVAR_ENHANCEMENT("EnableBombchuDrops"), true, false, - forceEnableBombchuDrops, forceEnableBombchuDropsText, UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Bombchus will sometimes drop in place of bombs"); - UIWidgets::PaddedEnhancementCheckbox("Trees Drop Sticks", CVAR_ENHANCEMENT("TreesDropSticks"), true, false); - UIWidgets::Tooltip("Bonking into trees will have a chance to drop up to 3 sticks. Must already have obtained sticks."); - UIWidgets::PaddedEnhancementCheckbox("No Heart Drops", CVAR_ENHANCEMENT("NoHeartDrops"), true, false); - UIWidgets::Tooltip("Disables heart drops, but not heart placements, like from a Deku Scrub running off\nThis simulates Hero Mode from other games in the series"); - if (UIWidgets::PaddedEnhancementCheckbox("Hyper Bosses", CVAR_ENHANCEMENT("HyperBosses"), true, false)) { - UpdateHyperBossesState(); - } - UIWidgets::Tooltip("All major bosses move and act twice as fast."); - if (UIWidgets::PaddedEnhancementCheckbox("Hyper Enemies", CVAR_ENHANCEMENT("HyperEnemies"), true, false)) { - UpdateHyperEnemiesState(); - } - UIWidgets::Tooltip("All regular enemies and mini-bosses move and act twice as fast."); - UIWidgets::PaddedEnhancementCheckbox("Always Win Goron Pot", CVAR_ENHANCEMENT("GoronPot"), true, false); - UIWidgets::Tooltip("Always get the heart piece/purple rupee from the spinning Goron pot"); - UIWidgets::PaddedEnhancementCheckbox("Always Win Dampe Digging Game", CVAR_ENHANCEMENT("DampeWin"), true, false); - UIWidgets::Tooltip("Always win the heart piece/purple rupee on the first dig in Dampe's grave digging game, just like in rando\nIn a rando file, this is unconditionally enabled"); - UIWidgets::PaddedEnhancementCheckbox("All Dogs are Richard", CVAR_ENHANCEMENT("AllDogsRichard"), true, false); - UIWidgets::Tooltip("All dogs can be traded in and will count as Richard."); - UIWidgets::PaddedEnhancementSliderInt("Cuccos Stay Put Multiplier: %dx", "##CuccoStayDurationMultiplier", CVAR_ENHANCEMENT("CuccoStayDurationMult"), 1, 5, "", 1, true, true, false); - UIWidgets::Tooltip("Cuccos will stay in place longer after putting them down, by a multiple of the value of the slider."); - UIWidgets::PaddedEnhancementSliderInt("Leever Spawn Rate: %d seconds", "##LeeverSpawnRate", CVAR_ENHANCEMENT("LeeverSpawnRate"), 0, 10, "", 0, true, true, false); - UIWidgets::Tooltip("The time between leever groups spawning."); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Reduced Clutter")) - { - UIWidgets::EnhancementCheckbox("Mute Low HP Alarm", CVAR_ENHANCEMENT("LowHpAlarm")); - UIWidgets::Tooltip("Disable the low HP beeping sound"); - UIWidgets::PaddedEnhancementCheckbox("Minimal UI", CVAR_ENHANCEMENT("MinimalUI"), true, false); - UIWidgets::Tooltip("Hides most of the UI when not needed\nNote: Doesn't activate until after loading a new scene"); - UIWidgets::PaddedEnhancementCheckbox("Disable Navi Call Audio", CVAR_ENHANCEMENT("DisableNaviCallAudio"), true, false); - UIWidgets::Tooltip("Disables the voice audio when Navi calls you"); - UIWidgets::PaddedEnhancementCheckbox("Disable Hot/Underwater Warning Text", CVAR_ENHANCEMENT("DisableTunicWarningText"), true, false); - UIWidgets::Tooltip("Disables warning text when you don't have on the Goron/Zora Tunic in Hot/Underwater conditions."); - UIWidgets::PaddedEnhancementCheckbox("Remember Minimap State Between Areas", CVAR_ENHANCEMENT("RememberMapToggleState")); - UIWidgets::Tooltip("Preserves the minimap visibility state when going between areas rather than defaulting it to \"on\" when going through loading zones."); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - UIWidgets::EnhancementCheckbox("Visual Stone of Agony", CVAR_ENHANCEMENT("VisualAgony")); - UIWidgets::Tooltip("Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble"); - static const char* cursorOnAnySlot[3] = { "Only in Rando", "Always", "Never" }; - UIWidgets::PaddedText("Allow the cursor to be on any slot", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("PauseAnyCursor"), cursorOnAnySlot, PAUSE_ANY_CURSOR_RANDO_ONLY); - UIWidgets::Tooltip("Allows the cursor on the pause menu to be over any slot. Sometimes required in rando to select certain items."); - UIWidgets::PaddedEnhancementCheckbox("Assignable Tunics and Boots", CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), true, false); - UIWidgets::Tooltip("Allows equipping the tunic and boots to c-buttons"); - UIWidgets::PaddedEnhancementCheckbox("Equipment Toggle", CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), true, false); - UIWidgets::Tooltip("Allows equipment to be removed by toggling it off on\nthe equipment subscreen."); - if (CVarGetInteger(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 0)) { - UIWidgets::PaddedText("Sword Toggle Options", true, false); - UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("SwordToggle"), swordToggleModes, SWORD_TOGGLE_NONE); - UIWidgets::Tooltip( - "Introduces Options for unequipping Link's sword\n\n" - "None: Only Biggoron's Sword/Giant's Knife can be toggled. Doing so will equip the Master Sword.\n\n" - "Child Toggle: This will allow for completely unequipping any sword as child link.\n\n" - "Both Ages: Any sword can be unequipped as either age. This may lead to swordless glitches as Adult.\n" - ); - } - - UIWidgets::PaddedEnhancementCheckbox("Link's Cow in Both Time Periods", CVAR_ENHANCEMENT("CowOfTime"), true, false); - UIWidgets::Tooltip("Allows the Lon Lon Ranch obstacle course reward to be shared across time periods"); - UIWidgets::PaddedEnhancementCheckbox("Enable visible guard vision", CVAR_ENHANCEMENT("GuardVision"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Enable passage of time on file select", CVAR_ENHANCEMENT("TimeFlowFileSelect"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Pull grave during the day", CVAR_ENHANCEMENT("DayGravePull"), true, false); - UIWidgets::Tooltip("Allows graves to be pulled when child during the day"); - UIWidgets::PaddedEnhancementCheckbox("Dogs follow you everywhere", CVAR_ENHANCEMENT("DogFollowsEverywhere"), true, false); - UIWidgets::Tooltip("Allows dogs to follow you anywhere you go, even if you leave the market"); - UIWidgets::PaddedEnhancementCheckbox("Don't require input for Credits sequence", CVAR_ENHANCEMENT("NoInputForCredits"), true, false); - UIWidgets::Tooltip("Removes the input requirement on textboxes after defeating Ganon, allowing Credits sequence to continue to progress"); - UIWidgets::PaddedEnhancementCheckbox("Answer Navi Prompt with L Button", CVAR_ENHANCEMENT("NaviOnL"), true, false); - UIWidgets::Tooltip("Speak to Navi with L but enter first-person camera with C-Up"); - - // Blue Fire Arrows - bool forceEnableBlueFireArrows = IS_RANDO && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BLUE_FIRE_ARROWS); - static const char* forceEnableBlueFireArrowsText = - "This setting is forcefully enabled because a savefile\nwith \"Blue Fire Arrows\" is loaded."; - UIWidgets::PaddedEnhancementCheckbox("Blue Fire Arrows", CVAR_ENHANCEMENT("BlueFireArrows"), true, false, - forceEnableBlueFireArrows, forceEnableBlueFireArrowsText, UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Allows Ice Arrows to melt red ice.\nMay require a room reload if toggled during gameplay."); - - // Sunlight Arrows - bool forceEnableSunLightArrows = IS_RANDO && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SUNLIGHT_ARROWS); - static const char* forceEnableSunLightArrowsText = - "This setting is forcefully enabled because a savefile\nwith \"Sunlight Arrows\" is loaded."; - UIWidgets::PaddedEnhancementCheckbox("Sunlight Arrows", CVAR_ENHANCEMENT("SunlightArrows"), true, false, - forceEnableSunLightArrows, forceEnableSunLightArrowsText, UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Allows Light Arrows to activate sun switches.\nMay require a room reload if toggled during gameplay."); - - UIWidgets::PaddedEnhancementCheckbox("Disable Crit wiggle", CVAR_ENHANCEMENT("DisableCritWiggle"), true, false); - UIWidgets::Tooltip("Disable random camera wiggle at low health"); - UIWidgets::PaddedEnhancementCheckbox("Enemy Health Bars", CVAR_ENHANCEMENT("EnemyHealthBar"), true, false); - UIWidgets::Tooltip("Renders a health bar for enemies when Z-Targeted"); - - UIWidgets::PaddedEnhancementCheckbox("Targetable Hookshot Reticle", CVAR_ENHANCEMENT("HookshotableReticle"), true, false); - UIWidgets::Tooltip("Use a different color when aiming at hookshotable collision"); - - UIWidgets::PaddedEnhancementCheckbox("Faster Rupee Accumulator", CVAR_ENHANCEMENT("TimeSavers.FasterRupeeAccumulator"), true, false); - UIWidgets::Tooltip("Causes your wallet to fill and empty faster when you gain or lose money."); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Graphics")) - { - if (ImGui::BeginMenu("Mods")) { - UIWidgets::PaddedEnhancementCheckbox("Use Alternate Assets", CVAR_ENHANCEMENT("AltAssets"), false, false); - UIWidgets::Tooltip("Toggle between standard assets and alternate assets. Usually mods will indicate if this setting has to be used or not."); - UIWidgets::PaddedEnhancementCheckbox("Disable Bomb Billboarding", CVAR_ENHANCEMENT("DisableBombBillboarding"), true, false); - UIWidgets::Tooltip("Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to replace bombs with 3D objects."); - UIWidgets::PaddedEnhancementCheckbox("Disable Grotto Fixed Rotation", CVAR_ENHANCEMENT("DisableGrottoRotation"), true, false); - UIWidgets::Tooltip("Disables grottos rotating with the camera. To be used in conjunction with mods that want to replace grottos with 3D objects."); - UIWidgets::PaddedEnhancementCheckbox("Invisible Bunny Hood", CVAR_ENHANCEMENT("HideBunnyHood"), true, false); - UIWidgets::Tooltip("Turns Bunny Hood invisible while still maintaining its effects."); - UIWidgets::PaddedEnhancementCheckbox("Disable HUD Heart animations", CVAR_ENHANCEMENT("NoHUDHeartAnimation"), true, false); - UIWidgets::Tooltip("Disables the beating animation of the hearts on the HUD."); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - UIWidgets::PaddedEnhancementCheckbox("Animated Link in Pause Menu", CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), false, false); - UIWidgets::PaddedEnhancementCheckbox("Disable LOD", CVAR_ENHANCEMENT("DisableLOD"), true, false); - UIWidgets::Tooltip( - "Turns off the Level of Detail setting, making models use their higher-poly variants at any distance"); - if (UIWidgets::EnhancementSliderInt("Increase Actor Draw Distance: %dx", "##IncreaseActorDrawDistance", - CVAR_ENHANCEMENT("DisableDrawDistance"), 1, 5, "", 1, true, false)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1) { - CVarSetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0); - } - } - UIWidgets::Tooltip("Increases the range in which actors/objects are drawn"); - if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1) { - UIWidgets::PaddedEnhancementCheckbox("Kokiri Draw Distance", - CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), true, false); - UIWidgets::Tooltip("The Kokiri are mystical beings that fade into view when approached\nEnabling this " - "will remove their draw distance"); - } - UIWidgets::PaddedEnhancementCheckbox("Widescreen Actor Culling", CVAR_ENHANCEMENT("WidescreenActorCulling"), - true, false); - UIWidgets::Tooltip("Adjusts the horizontal culling plane to account for widescreen resolutions"); - UIWidgets::PaddedEnhancementCheckbox( - "Cull Glitch Useful Actors", CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors"), true, false, - !CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0) && - CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1, - "Requires Actor Draw Distance to be increased or Widescreen Actor Culling enabled"); - UIWidgets::Tooltip( - "Exclude actors that are useful for glitches from the extended culling ranges.\n" - "Some actors may still draw in the extended ranges, but will not \"update\" so that certain " - "glitches that leverage the original culling requirements will still work.\n" - "\n" - "The following actors are excluded:\n" - "- White clothed Gerudos\n" - "- King Zora\n" - "- Gossip Stones\n" - "- Boulders\n" - "- Blue Warps\n" - "- Darunia\n" - "- Gold Skulltulas"); - if (UIWidgets::PaddedEnhancementCheckbox("Show Age-Dependent Equipment", CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), true, - false)) { - UpdatePatchHand(); - } - UIWidgets::Tooltip("Makes all equipment visible, regardless of Age."); - if (CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0) == 1) { - UIWidgets::PaddedEnhancementCheckbox("Scale Adult Equipment as Child", CVAR_ENHANCEMENT("ScaleAdultEquipmentAsChild"), true, false); - UIWidgets::Tooltip("Scales all of the Adult Equipment, as well and moving some a bit, to fit on Child Link Better. May not work properly with some mods."); - } - UIWidgets::PaddedEnhancementCheckbox("N64 Mode", CVAR_LOW_RES_MODE, true, false); - UIWidgets::Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution"); - UIWidgets::PaddedEnhancementCheckbox("Glitch line-up tick", CVAR_ENHANCEMENT("DrawLineupTick"), true, false); - UIWidgets::Tooltip("Displays a tick in the top center of the screen to help with glitch line-ups in SoH, as traditional UI based line-ups do not work outside of 4:3"); - UIWidgets::PaddedEnhancementCheckbox("Enable 3D Dropped items/projectiles", CVAR_ENHANCEMENT("NewDrops"), true, false); - UIWidgets::Tooltip("Change most 2D items and projectiles on the overworld to their 3D versions"); - UIWidgets::PaddedEnhancementCheckbox("Disable Black Bar Letterboxes", CVAR_ENHANCEMENT("DisableBlackBars"), true, false); - UIWidgets::Tooltip("Disables Black Bar Letterboxes during cutscenes and Z-targeting\nNote: there may be minor visual glitches that were covered up by the black bars\nPlease disable this setting before reporting a bug"); - UIWidgets::PaddedEnhancementCheckbox("Dynamic Wallet Icon", CVAR_ENHANCEMENT("DynamicWalletIcon"), true, false); - UIWidgets::Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have"); - UIWidgets::PaddedEnhancementCheckbox("Always show dungeon entrances", CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), true, false); - UIWidgets::Tooltip("Always shows dungeon entrance icons on the minimap"); - UIWidgets::PaddedEnhancementCheckbox("Show Gauntlets in First Person", CVAR_ENHANCEMENT("FirstPersonGauntlets"), true, false); - UIWidgets::Tooltip("Renders Gauntlets when using the Bow and Hookshot like in OOT3D"); - if (UIWidgets::PaddedEnhancementCheckbox("Color Temple of Time's Medallions", CVAR_ENHANCEMENT("ToTMedallionsColors"), true, false)) { - PatchToTMedallions(); - } - UIWidgets::Tooltip("When medallions are collected, the medallion imprints around the Master Sword pedestal in the Temple of Time will become colored"); - UIWidgets::PaddedEnhancementCheckbox("Show locked door chains on both sides of locked doors", CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides"), true, false); - UIWidgets::PaddedText("Fix Vanishing Paths", true, false); - if (UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), zFightingOptions, ZFIGHT_FIX_DISABLED) && gPlayState != NULL) { - UpdateDirtPathFixState(gPlayState->sceneNum); - } - UIWidgets::Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" - "Consistent: Certain paths vanish the same way in all resolutions\n" - "No Vanish: Paths do not vanish, Link seems to sink in to some paths\n" - "This might affect other decal effects\n"); - UIWidgets::PaddedEnhancementSliderInt("Text Spacing: %d", "##TEXTSPACING", CVAR_ENHANCEMENT("TextSpacing"), 4, 6, "", 6, true, true, true); - UIWidgets::Tooltip("Space between text characters (useful for HD font textures)"); - UIWidgets::PaddedEnhancementCheckbox("More info in file select", CVAR_ENHANCEMENT("FileSelectMoreInfo"), true, false); - UIWidgets::Tooltip("Shows what items you have collected in the file select screen, like in N64 randomizer"); - UIWidgets::PaddedEnhancementCheckbox("Better ammo rendering in pause menu", CVAR_ENHANCEMENT("BetterAmmoRendering"), true, false); - UIWidgets::Tooltip("Ammo counts in the pause menu will work correctly regardless of the position of items in the inventory"); - UIWidgets::PaddedEnhancementCheckbox("Remove spin attack darkness", CVAR_ENHANCEMENT("RemoveSpinAttackDarkness"), true, false); - UIWidgets::Tooltip("Remove the darkness that appears when charging a spin attack"); - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Fixes")) - { - UIWidgets::EnhancementCheckbox("Fix L&R Pause menu", CVAR_ENHANCEMENT("FixMenuLR")); - UIWidgets::Tooltip("Makes the L and R buttons in the pause menu the same color"); - UIWidgets::PaddedEnhancementCheckbox("Fix L&Z Page switch in Pause menu", CVAR_ENHANCEMENT("NGCKaleidoSwitcher"), true, false); - UIWidgets::Tooltip("Makes L and R switch pages like on the GameCube\nZ opens the Debug Menu instead"); - UIWidgets::PaddedEnhancementCheckbox("Fix Dungeon entrances", CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), true, false); - UIWidgets::Tooltip("Removes the dungeon entrance icon on the top-left corner of the screen when no dungeon is present on the current map"); - UIWidgets::PaddedEnhancementCheckbox("Fix Two Handed idle animations", CVAR_ENHANCEMENT("TwoHandedIdle"), true, false); - UIWidgets::Tooltip("Re-enables the two-handed idle animation, a seemingly finished animation that was disabled on accident in the original game"); - UIWidgets::PaddedEnhancementCheckbox("Fix the Gravedigging Tour Glitch", CVAR_ENHANCEMENT("GravediggingTourFix"), true, false, SaveManager::Instance->IsRandoFile(), - "This setting is always enabled in randomizer files", UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Fixes a bug where the Gravedigging Tour Heart Piece disappears if the area reloads"); - UIWidgets::PaddedEnhancementCheckbox( - "Fix Deku Nut upgrade", CVAR_ENHANCEMENT("DekuNutUpgradeFix"), true, false, IS_RANDO, - "This setting is forcefully enabled when you are playing a randomizer.", - UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw"); - UIWidgets::PaddedEnhancementCheckbox("Fix Navi text HUD position", CVAR_ENHANCEMENT("NaviTextFix"), true, false); - UIWidgets::Tooltip("Correctly centers the Navi text prompt on the HUD's C-Up button"); - UIWidgets::PaddedEnhancementCheckbox("Fix Anubis fireballs", CVAR_ENHANCEMENT("AnubisFix"), true, false); - UIWidgets::Tooltip("Make Anubis fireballs do fire damage when reflected back at them with the Mirror Shield"); - if (UIWidgets::PaddedEnhancementCheckbox("Fix Megaton Hammer crouch stab", CVAR_ENHANCEMENT("CrouchStabHammerFix"), true, false)) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0)) { - CVarClear(CVAR_ENHANCEMENT("CrouchStabFix")); - } - } - UIWidgets::Tooltip("Make the Megaton Hammer's crouch stab able to destroy rocks without first swinging it normally"); - if (CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0)) { - UIWidgets::PaddedEnhancementCheckbox("Remove power crouch stab", CVAR_ENHANCEMENT("CrouchStabFix"), true, false); - UIWidgets::Tooltip("Make crouch stabbing always do the same damage as a regular slash"); - } - UIWidgets::PaddedEnhancementCheckbox("Fix credits timing", CVAR_ENHANCEMENT("CreditsFix"), true, false); - UIWidgets::Tooltip("Extend certain credits scenes so the music lines up properly with the visuals"); - UIWidgets::PaddedEnhancementCheckbox("Fix Gerudo Warrior's clothing colors", CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), true, false); - UIWidgets::Tooltip("Prevent the Gerudo Warrior's clothes changing color when changing Link's tunic or using bombs in front of her"); - UIWidgets::PaddedEnhancementCheckbox("Fix Camera Drift", CVAR_ENHANCEMENT("FixCameraDrift"), true, false); - UIWidgets::Tooltip("Fixes camera slightly drifting to the left when standing still due to a math error"); - UIWidgets::PaddedEnhancementCheckbox("Fix Camera Swing", CVAR_ENHANCEMENT("FixCameraSwing"), true, false); - UIWidgets::Tooltip("Fixes camera getting stuck on collision when standing still, also fixes slight shift back in camera when stop moving"); - UIWidgets::PaddedEnhancementCheckbox("Fix Hanging Ledge Swing Rate", CVAR_ENHANCEMENT("FixHangingLedgeSwingRate"), true, false); - UIWidgets::Tooltip("Fixes camera swing rate when player falls off a ledge and camera swings around"); - UIWidgets::PaddedEnhancementCheckbox("Fix Missing Jingle after 5 Silver Rupees", CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), true, false); - UIWidgets::Tooltip( - "Adds 5 higher pitches for the Silver Rupee Jingle for the rooms with more than 5 Silver Rupees. " - "Currently only relevant in Master Quest."); - if (UIWidgets::PaddedEnhancementCheckbox("Fix out of bounds textures", CVAR_ENHANCEMENT("FixTexturesOOB"), true, false)) { - ApplyAuthenticGfxPatches(); - } - UIWidgets::Tooltip("Fixes authentic out of bounds texture reads, instead loading textures with the correct size"); - UIWidgets::PaddedEnhancementCheckbox("Fix Poacher's Saw Softlock", CVAR_ENHANCEMENT("FixSawSoftlock"), true, false, CVarGetInteger(CVAR_ENHANCEMENT("SkipText"), 0), - "This is disabled because it is forced on when Skip Text is enabled.", UIWidgets::CheckboxGraphics::Checkmark); - UIWidgets::Tooltip("Prevents the Poacher's Saw softlock from mashing through the text, or with Skip Text enabled."); - UIWidgets::PaddedEnhancementCheckbox("Fix enemies not spawning near water", CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), true, false); - UIWidgets::Tooltip("Causes respawning enemies, like stalchildren, to appear on land near bodies of water. " - "Fixes an incorrect calculation that acted like water underneath ground was above it."); - UIWidgets::PaddedEnhancementCheckbox("Fix Bush Item Drops", CVAR_ENHANCEMENT("BushDropFix"), true, false); - UIWidgets::Tooltip("Fixes the bushes to drop items correctly rather than spawning undefined items."); - UIWidgets::PaddedEnhancementCheckbox("Fix falling from vine edges", CVAR_ENHANCEMENT("FixVineFall"), true, false); - UIWidgets::Tooltip("Prevents immediately falling off climbable surfaces if climbing on the edges."); - UIWidgets::PaddedEnhancementCheckbox("Fix Link's eyes open while sleeping", CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping"), true, false); - UIWidgets::Tooltip("Fixes Link's eyes being open in the opening cutscene when he is supposed to be sleeping."); - UIWidgets::PaddedEnhancementCheckbox("Fix Darunia dancing too fast", CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), - true, false, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip("Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in vanilla."); - UIWidgets::PaddedEnhancementCheckbox("Fix raised Floor Switches", CVAR_ENHANCEMENT("FixFloorSwitches"), true, false); - UIWidgets::Tooltip("Fixes the two raised floor switches, the one in Forest Temple Basement and the one at the top of Fire Temple. \n" - "This will lower them, making activating them easier"); - UIWidgets::PaddedEnhancementCheckbox("Fix Zora hint dialogue", CVAR_ENHANCEMENT("FixZoraHintDialogue"), true, false); - UIWidgets::Tooltip("Fixes one Zora's dialogue giving a hint about bringing Ruto's Letter to King Zora to properly occur before moving King Zora rather than after"); - if (UIWidgets::PaddedEnhancementCheckbox("Fix hand holding Hammer", CVAR_ENHANCEMENT("FixHammerHand"), true, false)) { - UpdatePatchHand(); - } - UIWidgets::Tooltip("Fixes Adult Link having a backwards left hand when holding the Megaton Hammer."); - if (UIWidgets::PaddedEnhancementCheckbox( - "Fix Broken Giant's Knife bug", CVAR_ENHANCEMENT("FixBrokenGiantsKnife"), true, false, IS_RANDO, - "This setting is forcefully enabled when you are playing a randomizer.", - UIWidgets::CheckboxGraphics::Checkmark)) { - bool hasGiantsKnife = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON); - bool hasBrokenKnife = CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); - bool knifeIsBroken = gSaveContext.swordHealth == 0.0f; - - if (hasGiantsKnife && (hasBrokenKnife != knifeIsBroken)) { - func_800849EC(gPlayState); - } - } - UIWidgets::Tooltip("Fixes the Broken Giant's Knife flag not being reset when Medigoron fixes it"); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Restoration")) - { - 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); - UIWidgets::Tooltip("Restore a bug from NTSC 1.0 that allows casting the Fishing Rod while using the Hover Boots"); - UIWidgets::PaddedEnhancementCheckbox("N64 Weird Frames", CVAR_ENHANCEMENT("N64WeirdFrames"), true, false); - UIWidgets::Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64"); - UIWidgets::PaddedEnhancementCheckbox("Bombchus out of bounds", CVAR_ENHANCEMENT("BombchusOOB"), true, false); - UIWidgets::Tooltip("Allows bombchus to explode out of bounds\nSimilar to GameCube and Wii VC"); - UIWidgets::PaddedEnhancementCheckbox("Quick Putaway", CVAR_ENHANCEMENT("QuickPutaway"), true, false); - UIWidgets::Tooltip("Restore a bug from NTSC 1.0 that allows putting away an item without an animation and performing Putaway Ocarina Items"); - UIWidgets::PaddedEnhancementCheckbox("Restore old Gold Skulltula cutscene", CVAR_ENHANCEMENT("GSCutscene"), true, false); - UIWidgets::Tooltip("Restore pre-release behavior where defeating a Gold Skulltula will play a cutscene showing it die."); - UIWidgets::PaddedEnhancementCheckbox("Quick Bongo Kill", CVAR_ENHANCEMENT("QuickBongoKill"), true, false); - UIWidgets::Tooltip("Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him"); - UIWidgets::PaddedEnhancementCheckbox("Original RBA Values", CVAR_ENHANCEMENT("RestoreRBAValues"), true, false); - UIWidgets::Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure."); - UIWidgets::PaddedEnhancementCheckbox("Early Eyeball Frog", CVAR_ENHANCEMENT("EarlyEyeballFrog"), true, false); - 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(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Extra Modes")) { - UIWidgets::PaddedText("Mirrored World", true, false); - if (UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("MirroredWorldMode"), mirroredWorldModes, MIRRORED_WORLD_OFF) && gPlayState != NULL) { - UpdateMirrorModeState(gPlayState->sceneNum); - } - UIWidgets::Tooltip( - "Mirrors the world horizontally\n\n" - "- Always: Always mirror the world\n" - "- Random: Randomly decide to mirror the world on each scene change\n" - "- Random (Seeded): Scenes are mirrored based on the current randomizer seed/file\n" - "- Dungeons: Mirror the world in Dungeons\n" - "- Dungeons (Vanilla): Mirror the world in vanilla Dungeons\n" - "- Dungeons (MQ): Mirror the world in MQ Dungeons\n" - "- Dungeons Random: Randomly decide to mirror the world in Dungeons\n" - "- Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file\n" - ); - - UIWidgets::PaddedText("Enemy Randomizer", true, false); - if (UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("RandomizedEnemies"), enemyRandomizerModes, ENEMY_RANDOMIZER_OFF)) { - GetSelectedEnemies(); - } - UIWidgets::Tooltip( - "Replaces fixed enemies throughout the game with a random enemy. Bosses, mini-bosses and a few specific regular enemies are excluded.\n" - "Enemies that need more than Deku Nuts + either Deku Sticks or a sword to kill are excluded from spawning in \"clear enemy\" rooms.\n\n" - "- Random: Enemies are randomized every time you load a room\n" - "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file\n" - ); - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) == ENEMY_RANDOMIZER_RANDOM) { - ImGui::Separator(); - if (ImGui::BeginMenu("Enemy List")) { - UIWidgets::PaddedEnhancementCheckbox("Select All Enemies", CVAR_ENHANCEMENT("RandomizedEnemyList.All"), true, false); - bool disabledEnemyList = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0); - ImGui::Separator(); - - ImGui::BeginDisabled(CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)); - - ImGui::BeginTable("Enemy Table", 2); - ImGui::TableNextColumn(); - for (int i = 0; i < RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE; i++) { - if (UIWidgets::PaddedEnhancementCheckbox(enemyNameList[i], enemyCVarList[i], true, false, disabledEnemyList, - "These options are disabled because \"Select All Enemies\" is enabled.", - UIWidgets::CheckboxGraphics::Checkmark)) { - GetSelectedEnemies(); - } - if (i == RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE / 2) { - ImGui::TableNextColumn(); - } - } - ImGui::EndTable(); - ImGui::EndDisabled(); - - ImGui::EndMenu(); - } - }; - ImGui::Separator(); - - UIWidgets::PaddedEnhancementCheckbox("Randomized Enemy Sizes", CVAR_ENHANCEMENT("RandomizedEnemySizes"), true, false); - UIWidgets::Tooltip("Enemies and Bosses spawn with random sizes."); - - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0)) { - UIWidgets::EnhancementCheckbox("Scale Health with Size", CVAR_ENHANCEMENT("EnemySizeScalesHealth")); - UIWidgets::Tooltip("Scales normal enemies health with their randomized size. *This will NOT affect bosses*"); - } - - UIWidgets::PaddedEnhancementCheckbox("Ivan the Fairy (Coop Mode)", CVAR_ENHANCEMENT("IvanCoopModeEnabled"), true, false); - UIWidgets::Tooltip("Enables Ivan the Fairy upon the next map change. Player 2 can control Ivan and " - "press the C-Buttons to use items and mess with Player 1!"); - - UIWidgets::PaddedEnhancementCheckbox("Rupee Dash Mode", CVAR_ENHANCEMENT("RupeeDash"), true, false); - UIWidgets::Tooltip("Rupees reduced over time, Link suffers damage when the count hits 0."); - - if (CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0)) { - UIWidgets::PaddedEnhancementSliderInt( - "Rupee Dash Interval: %d", "##DashInterval", CVAR_ENHANCEMENT("RupeeDashInterval"), 1, 10, "", 5, true, true, false, - !CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0), - "This option is disabled because \"Rupee Dash Mode\" is turned off"); - UIWidgets::Tooltip("Interval between Rupee reduction in Rupee Dash Mode"); - } - - UIWidgets::PaddedEnhancementCheckbox("Shadow Tag Mode", CVAR_ENHANCEMENT("ShadowTag"), true, false); - UIWidgets::Tooltip("A wallmaster follows Link everywhere, don't get caught!"); - - UIWidgets::PaddedEnhancementCheckbox("Additional Traps", CVAR_ENHANCEMENT("ExtraTraps.Enabled"), true, false); - UIWidgets::Tooltip("Enables additional Trap variants."); - - if (CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0)) { - UIWidgets::PaddedSeparator(); - if (ImGui::BeginMenu("Trap Options")) { - ImGui::Text("Tier 1 Traps:"); - UIWidgets::Spacer(0); - UIWidgets::PaddedEnhancementCheckbox("Freeze Traps", CVAR_ENHANCEMENT("ExtraTraps.Ice"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Burn Traps", CVAR_ENHANCEMENT("ExtraTraps.Burn"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Shock Traps", CVAR_ENHANCEMENT("ExtraTraps.Shock"), true, false); - - UIWidgets::PaddedSeparator(); - ImGui::Text("Tier 2 Traps:"); - UIWidgets::Spacer(0); - UIWidgets::PaddedEnhancementCheckbox("Knockback Traps", CVAR_ENHANCEMENT("ExtraTraps.Knockback"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Speed Traps", CVAR_ENHANCEMENT("ExtraTraps.Speed"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Bomb Traps", CVAR_ENHANCEMENT("ExtraTraps.Bomb"), true, false); - - UIWidgets::PaddedSeparator(); - ImGui::Text("Tier 3 Traps:"); - UIWidgets::Spacer(0); - UIWidgets::PaddedEnhancementCheckbox("Void Traps", CVAR_ENHANCEMENT("ExtraTraps.Void"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Ammo Traps", CVAR_ENHANCEMENT("ExtraTraps.Ammo"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Death Traps", CVAR_ENHANCEMENT("ExtraTraps.Kill"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Teleport Traps", CVAR_ENHANCEMENT("ExtraTraps.Teleport"), true, false); - - ImGui::EndMenu(); - } - } - - UIWidgets::Spacer(0); - if (UIWidgets::PaddedEnhancementCheckbox("Hurt Container Mode", CVAR_ENHANCEMENT("HurtContainer"), true, false)) { - UpdateHurtContainerModeState(CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)); - } - UIWidgets::Tooltip("Changes Heart Piece and Heart Container functionality.\n\n" - "- Each Heart Container or full Heart Piece reduces Links hearts by 1.\n" - "- Can be enabled retroactively after a File has already started."); - - ImGui::EndMenu(); - } - - UIWidgets::PaddedSeparator(); - - UIWidgets::EnhancementCheckbox("Autosave", CVAR_ENHANCEMENT("Autosave")); - UIWidgets::Tooltip("Save the game automatically on a 3 minute interval and when soft-resetting the game.\n\n" - "The interval autosave will wait if the game is paused in any way (dialogue, pause screen up, cutscenes)."); - - 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)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - - if (mCosmeticsEditorWindow) { - if (ImGui::Button(GetWindowButtonText("Cosmetics Editor", CVarGetInteger(CVAR_WINDOW("CosmeticsEditor"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mCosmeticsEditorWindow->ToggleVisibility(); - } - } - - if (mAudioEditorWindow) { - if (ImGui::Button(GetWindowButtonText("Audio Editor", CVarGetInteger(CVAR_WINDOW("AudioEditor"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mAudioEditorWindow->ToggleVisibility(); - } - } - - if (mGameplayStatsWindow) { - if (ImGui::Button(GetWindowButtonText("Gameplay Stats", CVarGetInteger(CVAR_WINDOW("GameplayStats"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mGameplayStatsWindow->ToggleVisibility(); - } - } - - if (mTimeSplitWindow) { - if (ImGui::Button(GetWindowButtonText("Time Splits", CVarGetInteger(CVAR_WINDOW("TimeSplitEnabled"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mTimeSplitWindow->ToggleVisibility(); - } - } - - if (mTimeDisplayWindow) { - if (ImGui::Button(GetWindowButtonText("Additional Timers", CVarGetInteger(CVAR_WINDOW("TimeDisplayEnabled"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mTimeDisplayWindow->ToggleVisibility(); - } - } - if (mTimeDisplayWindow->IsVisible()) { - ImGui::SeparatorText("Timer Display Options"); - - if (!gPlayState) { - ImGui::Text("Additional Timer options\n" - "available when a file is\n" - "loaded..."); - } else { - if (UIWidgets::PaddedEnhancementSliderFloat("Font Scale: %.2fx", "##FontScale", CVAR_ENHANCEMENT("TimeDisplay.FontScale"), - 1.0f, 5.0f, "", 1.0f, false, true, false, true)) { - TimeDisplayInitSettings(); - } - if (UIWidgets::PaddedEnhancementCheckbox("Hide Background", CVAR_ENHANCEMENT("TimeDisplay.ShowWindowBG"), - false, false)) { - TimeDisplayInitSettings(); - } - ImGui::Separator(); - for (auto& timer : timeDisplayList) { - if (UIWidgets::PaddedEnhancementCheckbox(timer.timeLabel.c_str(), timer.timeEnable, false, false)) { - TimeDisplayUpdateDisplayOptions(); - } - } - } - } - ImGui::PopStyleVar(3); - ImGui::PopStyleColor(1); - - #ifdef __SWITCH__ - UIWidgets::Spacer(0); - ImGui::Text("Switch performance mode"); - if (UIWidgets::EnhancementCombobox(CVAR_ENHANCEMENT("SwitchPerfMode"), SWITCH_CPU_PROFILES, (int)Ship::SwitchProfiles::STOCK)) { - SPDLOG_INFO("Profile:: %s", SWITCH_CPU_PROFILES[CVarGetInteger(CVAR_ENHANCEMENT("SwitchPerfMode"), (int)Ship::SwitchProfiles::STOCK)]); - Ship::Switch::ApplyOverclock(); - } - #endif - - ImGui::EndMenu(); - } -} - -void DrawCheatsMenu() { - if (ImGui::BeginMenu("Cheats")) - { - ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 8.0f); - ImGui::BeginTable("##cheatsMenu", 2, ImGuiTableFlags_SizingFixedFit); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableNextColumn(); - UIWidgets::Spacer(2.0f); - ImGui::Text("Inventory:"); - UIWidgets::PaddedSeparator(); - - UIWidgets::PaddedEnhancementCheckbox("Super Tunic", CVAR_CHEAT("SuperTunic"), true, false); - UIWidgets::Tooltip("Makes every tunic have the effects of every other tunic"); - UIWidgets::PaddedEnhancementCheckbox("Easy ISG", CVAR_CHEAT("EasyISG"), true, false); - UIWidgets::Tooltip("Passive Infinite Sword Glitch\nIt makes your sword's swing effect and hitbox stay active indefinitely"); - UIWidgets::PaddedEnhancementCheckbox("Easy QPA", CVAR_CHEAT("EasyQPA"), true, false); - UIWidgets::Tooltip("Gives you the glitched damage value of the quick put away glitch."); - UIWidgets::PaddedEnhancementCheckbox("Timeless Equipment", CVAR_CHEAT("TimelessEquipment"), true, false); - UIWidgets::Tooltip("Allows any item to be equipped, regardless of age\nAlso allows Child to use Adult strength upgrades"); - UIWidgets::PaddedEnhancementCheckbox("Unrestricted Items", CVAR_CHEAT("NoRestrictItems"), true, false); - UIWidgets::Tooltip("Allows you to use any item at any location"); - UIWidgets::PaddedEnhancementCheckbox("Fireproof Deku Shield", CVAR_CHEAT("FireproofDekuShield"), true, false); - UIWidgets::Tooltip("Prevents the Deku Shield from burning on contact with fire"); - UIWidgets::PaddedEnhancementCheckbox("Shield with Two-Handed Weapons", CVAR_CHEAT("ShieldTwoHanded"), true, false); - UIWidgets::Tooltip("This allows you to put up your shield with any two-handed weapon in hand except for Deku Sticks"); - UIWidgets::Spacer(2.0f); - ImGui::Text("Deku Sticks:"); - UIWidgets::EnhancementCombobox(CVAR_CHEAT("DekuStick"), DekuStickCheat, DEKU_STICK_NORMAL); - UIWidgets::Spacer(2.0f); - UIWidgets::EnhancementSliderFloat("Bomb Timer Multiplier: %.2fx", "##gBombTimerMultiplier", CVAR_CHEAT("BombTimerMultiplier"), 0.1f, 5.0f, "", 1.0f, false); - UIWidgets::PaddedEnhancementCheckbox("Hookshot Everything", CVAR_CHEAT("HookshotEverything"), true, false); - UIWidgets::Tooltip("Makes every surface in the game hookshot-able"); - UIWidgets::Spacer(0); - UIWidgets::EnhancementSliderFloat("Hookshot Reach Multiplier: %.2fx", "##gCheatHookshotReachMultiplier", CVAR_CHEAT("HookshotReachMultiplier"), 1.0f, 5.0f, "", 1.0f, false); - UIWidgets::Spacer(2.0f); - if (ImGui::Button("Change Age")) { - SwitchAge(); - } - UIWidgets::Tooltip("Switches Link's age and reloads the area."); - UIWidgets::Spacer(2.0f); - if (ImGui::Button("Clear Cutscene Pointer")) { - GameInteractor::RawAction::ClearCutscenePointer(); - } - UIWidgets::Tooltip("Clears the cutscene pointer to a value safe for wrong warps."); - - ImGui::TableNextColumn(); - UIWidgets::Spacer(2.0f); - - if (ImGui::BeginMenu("Infinite...")) { - UIWidgets::EnhancementCheckbox("Money", CVAR_CHEAT("InfiniteMoney")); - UIWidgets::PaddedEnhancementCheckbox("Health", CVAR_CHEAT("InfiniteHealth"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Ammo", CVAR_CHEAT("InfiniteAmmo"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Magic", CVAR_CHEAT("InfiniteMagic"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Nayru's Love", CVAR_CHEAT("InfiniteNayru"), true, false); - UIWidgets::PaddedEnhancementCheckbox("Epona Boost", CVAR_CHEAT("InfiniteEponaBoost"), true, false); - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(0); - - if (ImGui::BeginMenu("Save States")) { - ImGui::TextColored({ 0.85f, 0.85f, 0.0f, 1.0f }, " " ICON_FA_EXCLAMATION_TRIANGLE); - ImGui::SameLine(); - ImGui::TextColored({ 0.85f, 0.35f, 0.0f, 1.0f }, " WARNING!!!! "); - ImGui::SameLine(); - ImGui::TextColored({ 0.85f, 0.85f, 0.0f, 1.0f }, ICON_FA_EXCLAMATION_TRIANGLE); - UIWidgets::PaddedText("These are NOT like emulator states.", true, false); - UIWidgets::PaddedText("They do not save your game progress, and", true, false); - UIWidgets::PaddedText("they WILL break across transitions and", true, false); - UIWidgets::PaddedText("load zones (like doors). Support for", true, false); - UIWidgets::PaddedText("related issues will not be provided.", true, false); - if (UIWidgets::PaddedEnhancementCheckbox("I promise I have read the warning", CVAR_CHEAT("SaveStatePromise"), true, - false)) { - CVarSetInteger(CVAR_CHEAT("SaveStatesEnabled"), 0); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - if (CVarGetInteger(CVAR_CHEAT("SaveStatePromise"), 0) == 1) { - UIWidgets::PaddedEnhancementCheckbox("I understand, enable save states", CVAR_CHEAT("SaveStatesEnabled"), true, - false); - UIWidgets::Tooltip("F5 to save, F6 to change slots, F7 to load"); - } - - ImGui::EndMenu(); - } - - UIWidgets::Spacer(2.0f); - ImGui::Text("Behavior:"); - UIWidgets::PaddedSeparator(); - - UIWidgets::PaddedEnhancementCheckbox("No Clip", CVAR_CHEAT("NoClip"), true, false); - UIWidgets::Tooltip("Allows you to walk through walls"); - UIWidgets::PaddedEnhancementCheckbox("Climb Everything", CVAR_CHEAT("ClimbEverything"), true, false); - 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("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); - UIWidgets::Tooltip("Prevents fish from automatically despawning after a while when dropped"); - UIWidgets::PaddedEnhancementCheckbox("Bugs Don't despawn", CVAR_CHEAT("NoBugsDespawn"), true, false); - UIWidgets::Tooltip("Prevents bugs from automatically despawning after a while when dropped"); - UIWidgets::PaddedEnhancementCheckbox("Freeze Time", CVAR_CHEAT("FreezeTime"), true, false); - UIWidgets::Tooltip("Freezes the time of day"); - UIWidgets::PaddedEnhancementCheckbox("Time Sync", CVAR_CHEAT("TimeSync"), true, false); - UIWidgets::Tooltip("This syncs the ingame time with the real world time"); - UIWidgets::PaddedEnhancementCheckbox("No ReDead/Gibdo Freeze", CVAR_CHEAT("NoRedeadFreeze"), true, false); - UIWidgets::Tooltip("Prevents ReDeads and Gibdos from being able to freeze you with their scream"); - UIWidgets::PaddedEnhancementCheckbox("Keese/Guay don't target you", CVAR_CHEAT("NoKeeseGuayTarget"), true, false); - UIWidgets::Tooltip("Keese and Guay no longer target you and simply ignore you as if you were wearing the skull mask"); - { - static int32_t betaQuestEnabled = CVarGetInteger(CVAR_CHEAT("EnableBetaQuest"), 0); - static int32_t lastBetaQuestEnabled = betaQuestEnabled; - static int32_t betaQuestWorld = CVarGetInteger(CVAR_CHEAT("BetaQuestWorld"), 0xFFEF); - static int32_t lastBetaQuestWorld = betaQuestWorld; - - if (!isBetaQuestEnabled) { - UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - UIWidgets::PaddedEnhancementCheckbox("Enable Beta Quest", CVAR_CHEAT("EnableBetaQuest"), true, false); - UIWidgets::Tooltip("Turns on OoT Beta Quest. *WARNING* This will reset your game."); - betaQuestEnabled = CVarGetInteger(CVAR_CHEAT("EnableBetaQuest"), 0); - if (betaQuestEnabled) { - if (betaQuestEnabled != lastBetaQuestEnabled) { - betaQuestWorld = 0; - } - - ImGui::Text("Beta Quest World: %d", betaQuestWorld); - - if (ImGui::Button(" - ##BetaQuest")) { - betaQuestWorld--; - } - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - - ImGui::SliderInt("##BetaQuest", &betaQuestWorld, 0, 8, "", ImGuiSliderFlags_AlwaysClamp); - UIWidgets::Tooltip("Set the Beta Quest world to explore. *WARNING* Changing this will reset your game.\nCtrl+Click to type in a value."); - - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::Button(" + ##BetaQuest")) { - betaQuestWorld++; - } - - if (betaQuestWorld > 8) { - betaQuestWorld = 8; - } - else if (betaQuestWorld < 0) { - betaQuestWorld = 0; - } - } - else { - lastBetaQuestWorld = betaQuestWorld = 0xFFEF; - CVarClear(CVAR_CHEAT("BetaQuestWorld")); - } - if (betaQuestEnabled != lastBetaQuestEnabled || betaQuestWorld != lastBetaQuestWorld) - { - // Reset the game if the beta quest state or world changed because beta quest happens on redirecting the title screen cutscene. - lastBetaQuestEnabled = betaQuestEnabled; - lastBetaQuestWorld = betaQuestWorld; - CVarSetInteger(CVAR_CHEAT("EnableBetaQuest"), betaQuestEnabled); - CVarSetInteger(CVAR_CHEAT("BetaQuestWorld"), betaQuestWorld); - - std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - - if (!isBetaQuestEnabled) { - UIWidgets::ReEnableComponent(""); - } - } - - ImGui::EndTable(); - ImGui::EndDisabled(); - ImGui::EndMenu(); - } -} - -extern std::shared_ptr mStatsWindow; -extern std::shared_ptr mConsoleWindow; -extern std::shared_ptr mSaveEditorWindow; -extern std::shared_ptr mHookDebuggerWindow; -extern std::shared_ptr mColViewerWindow; -extern std::shared_ptr mActorViewerWindow; -extern std::shared_ptr mDLViewerWindow; -extern std::shared_ptr mValueViewerWindow; -extern std::shared_ptr mMessageViewerWindow; - -void DrawDeveloperToolsMenu() { - if (ImGui::BeginMenu("Developer Tools")) { - ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - - UIWidgets::EnhancementCheckbox("OoT Debug Mode", CVAR_DEVELOPER_TOOLS("DebugEnabled")); - UIWidgets::Tooltip("Enables Debug Mode, allowing you to select maps with L + R + Z, noclip with L + D-pad Right, and open the debug menu with L on the pause screen"); - if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0)) { - UIWidgets::EnhancementCheckbox("OoT Registry Editor", CVAR_DEVELOPER_TOOLS("RegEditEnabled")); - UIWidgets::Tooltip("Enables the registry editor"); - ImGui::Text("Debug Save File Mode:"); - UIWidgets::EnhancementCombobox(CVAR_DEVELOPER_TOOLS("DebugSaveFileMode"), DebugSaveFileModes, 1); - UIWidgets::Tooltip( - "Changes the behaviour of debug file select creation (creating a save file on slot 1 with debug mode on)\n" - "- Off: The debug save file will be a normal savefile\n" - "- Vanilla: The debug save file will be the debug save file from the original game\n" - "- Maxed: The debug save file will be a save file with all of the items & upgrades" - ); - } - 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("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); - UIWidgets::Tooltip("Translate the Debug Warp Screen based on the game language"); - UIWidgets::PaddedEnhancementCheckbox("Resource logging", CVAR_DEVELOPER_TOOLS("ResourceLogging"), true, false); - UIWidgets::Tooltip("Logs some resources as XML when they're loaded in binary format"); - if (gPlayState != NULL) { - UIWidgets::PaddedSeparator(); - ImGui::Checkbox("Frame Advance##frameAdvance", (bool*)&gPlayState->frameAdvCtx.enabled); - if (gPlayState->frameAdvCtx.enabled) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(12.0f, 6.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0,0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - if (ImGui::Button("Advance 1", ImVec2(ImGui::GetContentRegionAvail().x / 2.0f, 0.0f))) { - CVarSetInteger(CVAR_GENERAL("FrameAdvance"), 1); - } - ImGui::SameLine(); - ImGui::Button("Advance (Hold)"); - if (ImGui::IsItemActive()) { - CVarSetInteger(CVAR_GENERAL("FrameAdvance"), 1); - } - ImGui::PopStyleVar(3); - ImGui::PopStyleColor(1); - } - } - UIWidgets::PaddedSeparator(); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(12.0f, 6.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0,0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - if (mStatsWindow) { - if (ImGui::Button(GetWindowButtonText("Stats", CVarGetInteger(CVAR_STATS_WINDOW_OPEN, 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mStatsWindow->ToggleVisibility(); - } - UIWidgets::Tooltip("Shows the stats window, with your FPS and frametimes, and the OS you're playing on"); - } - UIWidgets::Spacer(0); - if (mConsoleWindow) { - if (ImGui::Button(GetWindowButtonText("Console", CVarGetInteger(CVAR_CONSOLE_WINDOW_OPEN, 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mConsoleWindow->ToggleVisibility(); - } - UIWidgets::Tooltip("Enables the console window, allowing you to input commands, type help for some examples"); - } - UIWidgets::Spacer(0); - if (mSaveEditorWindow) { - if (ImGui::Button(GetWindowButtonText("Save Editor", CVarGetInteger(CVAR_WINDOW("SaveEditor"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mSaveEditorWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mHookDebuggerWindow) { - if (ImGui::Button(GetWindowButtonText("Hook Debugger", CVarGetInteger(CVAR_WINDOW("HookDebugger"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mHookDebuggerWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mColViewerWindow) { - if (ImGui::Button(GetWindowButtonText("Collision Viewer", CVarGetInteger(CVAR_WINDOW("CollisionViewer"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mColViewerWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mActorViewerWindow) { - if (ImGui::Button(GetWindowButtonText("Actor Viewer", CVarGetInteger(CVAR_WINDOW("ActorViewer"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mActorViewerWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mDLViewerWindow) { - if (ImGui::Button(GetWindowButtonText("Display List Viewer", CVarGetInteger(CVAR_WINDOW("DLViewer"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mDLViewerWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mValueViewerWindow) { - if (ImGui::Button(GetWindowButtonText("Value Viewer", CVarGetInteger(CVAR_WINDOW("ValueViewer"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mValueViewerWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mMessageViewerWindow) { - if (ImGui::Button(GetWindowButtonText("Message Viewer", CVarGetInteger(CVAR_WINDOW("MessageViewer"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mMessageViewerWindow->ToggleVisibility(); - } - } - UIWidgets::Spacer(0); - if (mGfxDebuggerWindow) { - if (ImGui::Button(GetWindowButtonText("Gfx Debugger", CVarGetInteger(CVAR_WINDOW("GfxDebugger"), 0)).c_str(), ImVec2(-1.0f, 0.0f))) { - mGfxDebuggerWindow->ToggleVisibility(); - } - } - - ImGui::PopStyleVar(3); - ImGui::PopStyleColor(1); - - ImGui::EndDisabled(); - - ImGui::EndMenu(); - } -} - -#ifdef ENABLE_REMOTE_CONTROL -void DrawRemoteControlMenu() { - if (ImGui::BeginMenu("Network")) { - Sail::Instance->DrawMenu(); - CrowdControl::Instance->DrawMenu(); - ImGui::EndMenu(); - } -} -#endif - -extern std::shared_ptr mRandomizerSettingsWindow; -extern std::shared_ptr mPlandomizerWindow; -extern std::shared_ptr mItemTrackerWindow; -extern std::shared_ptr mItemTrackerSettingsWindow; -extern std::shared_ptr mEntranceTrackerWindow; -extern std::shared_ptr mEntranceTrackerSettingsWindow; -extern std::shared_ptr mCheckTrackerWindow; -extern std::shared_ptr mCheckTrackerSettingsWindow; -extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); - -void DrawRandomizerMenu() { - if (ImGui::BeginMenu("Randomizer")) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(12.0f, 6.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.22f, 0.38f, 0.56f, 1.0f)); - - #ifdef __WIIU__ - static ImVec2 buttonSize(200.0f * 2.0f, 0.0f); - static ImVec2 buttonWithOptionsSize(170.0f * 2.0f, 0.0f); - static ImVec2 optionsButtonSize(25.0f * 2.0f, 0.0f); - static float separationToOptionsButton = 5.0f * 2.0f; - #else - static ImVec2 buttonSize(200.0f, 0.0f); - static ImVec2 buttonWithOptionsSize(170.0f, 0.0f); - static ImVec2 optionsButtonSize(25.0f, 0.0f); - static float separationToOptionsButton = 5.0f; - #endif - - if (mRandomizerSettingsWindow) { - if (ImGui::Button(GetWindowButtonText("Randomizer Settings", CVarGetInteger(CVAR_WINDOW("RandomizerSettings"), 0)).c_str(), buttonSize)) { - mRandomizerSettingsWindow->ToggleVisibility(); - } - } - - UIWidgets::Spacer(0); - - if (mPlandomizerWindow) { - if (ImGui::Button(GetWindowButtonText("Plandomizer Editor", CVarGetInteger(CVAR_WINDOW("PlandomizerWindow"), 0)).c_str(), buttonSize)) { - mPlandomizerWindow->ToggleVisibility(); - } - } - - UIWidgets::Spacer(0); - - if (mItemTrackerWindow) { - if (ImGui::Button(GetWindowButtonText("Item Tracker", CVarGetInteger(CVAR_WINDOW("ItemTracker"), 0)).c_str(), buttonWithOptionsSize)) { - mItemTrackerWindow->ToggleVisibility(); - } - } - - ImGui::SameLine(0, 0); - ImVec2 cursor = ImGui::GetCursorPos(); - ImGui::SetCursorPos(ImVec2(cursor.x + separationToOptionsButton, cursor.y)); - - if (mItemTrackerSettingsWindow) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(FA_ICON_BUTTON_FRAME_PADDING_X(ICON_FA_COG), 6.0f)); - if (ImGui::Button(ICON_FA_COG "##ItemTrackerSettings", optionsButtonSize)) { - mItemTrackerSettingsWindow->ToggleVisibility(); - } - ImGui::PopStyleVar(); - } - - UIWidgets::Spacer(0); - if (mEntranceTrackerWindow) { - if (ImGui::Button(GetWindowButtonText("Entrance Tracker", CVarGetInteger(CVAR_WINDOW("EntranceTracker"), 0)).c_str(), buttonWithOptionsSize)) { - mEntranceTrackerWindow->ToggleVisibility(); - } - } - - ImGui::SameLine(0, 0); - cursor = ImGui::GetCursorPos(); - ImGui::SetCursorPos(ImVec2(cursor.x + separationToOptionsButton, cursor.y)); - - if (mEntranceTrackerSettingsWindow) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(FA_ICON_BUTTON_FRAME_PADDING_X(ICON_FA_COG), 6.0f)); - if (ImGui::Button(ICON_FA_COG "##EntranceTrackerSettings", optionsButtonSize)) { - mEntranceTrackerSettingsWindow->ToggleVisibility(); - } - ImGui::PopStyleVar(); - } - - UIWidgets::Spacer(0); - - if (mCheckTrackerWindow) { - if (ImGui::Button(GetWindowButtonText("Check Tracker", CVarGetInteger(CVAR_WINDOW("CheckTracker"), 0)).c_str(), buttonWithOptionsSize)) { - mCheckTrackerWindow->ToggleVisibility(); - } - } - - ImGui::SameLine(0, 0); - cursor = ImGui::GetCursorPos(); - ImGui::SetCursorPos(ImVec2(cursor.x + separationToOptionsButton, cursor.y)); - - if (mCheckTrackerSettingsWindow) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(FA_ICON_BUTTON_FRAME_PADDING_X(ICON_FA_COG), 6.0f)); - if (ImGui::Button(ICON_FA_COG "##CheckTrackerSettings", optionsButtonSize)) { - mCheckTrackerSettingsWindow->ToggleVisibility(); - } - ImGui::PopStyleVar(); - } - - ImGui::PopStyleVar(3); - ImGui::PopStyleColor(1); - - UIWidgets::PaddedSeparator(); - - if (ImGui::BeginMenu("Rando Enhancements")) - { - UIWidgets::EnhancementCheckbox("Rando-Relevant Navi Hints", CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip( - "Replace Navi's overworld quest hints with rando-related gameplay hints." - ); - UIWidgets::PaddedEnhancementCheckbox("Random Rupee Names", CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), true, false, false, "", UIWidgets::CheckboxGraphics::Cross, true); - UIWidgets::Tooltip( - "When obtaining rupees, randomize what the rupee is called in the textbox." - ); - - 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); - - static const char* disableCompassColorsText = - "This setting is disabled because a savefile is loaded without the compass\n" - "shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\""; - - if (UIWidgets::PaddedEnhancementCheckbox("Compass Colors Match Dungeon", CVAR_RANDOMIZER_ENHANCEMENT("MatchCompassColors"), true, false, - disableCompassColors, disableCompassColorsText, UIWidgets::CheckboxGraphics::Cross, true)) { - PatchCompasses(); - } - UIWidgets::Tooltip( - "Matches the color of compasses to the dungeon they belong to. " - "This helps identify compasses from afar and adds a little bit of flair.\n\nThis only " - "applies to seeds with compasses shuffled to \"Any Dungeon\", \"Overworld\", or \"Anywhere\"."); - - UIWidgets::PaddedEnhancementCheckbox("Quest Item Fanfares", CVAR_RANDOMIZER_ENHANCEMENT("QuestItemFanfares"), true, false); - UIWidgets::Tooltip( - "Play unique fanfares when obtaining quest items " - "(medallions/stones/songs). Note that these fanfares are longer than usual." - ); - UIWidgets::PaddedEnhancementCheckbox("Mysterious Shuffled Items", CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), true, false); - UIWidgets::Tooltip( - "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(); - } - - ImGui::EndMenu(); - } + //if (ImGui::BeginMenu("Settings")) + //{ + // if (ImGui::BeginMenu("Graphics")) { + // ImGui::Text("ImGui Menu Scale"); + // ImGui::SameLine(); + // ImGui::TextColored({ 0.85f, 0.35f, 0.0f, 1.0f }, "(Experimental)"); + // if (UIWidgets::EnhancementCombobox(CVAR_SETTING("ImGuiScale"), imguiScaleOptions, 1)) { + // OTRGlobals::Instance->ScaleImGui(); + // } + // UIWidgets::Tooltip("Changes the scaling of the ImGui menu elements."); + + // // Draw LUS settings menu (such as Overlays Text Font) + // Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGameOverlay()->DrawSettings(); + + // ImGui::EndMenu(); + // } + // ImGui::EndMenu(); + //} } void SohMenuBar::InitElement() { - UpdateWindowBackendObjects(); + } void SohMenuBar::DrawElement() { if (ImGui::BeginMenuBar()) { - DrawMenuBarIcon(); - static ImVec2 sWindowPadding(8.0f, 8.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, sWindowPadding); - DrawShipMenu(); - - ImGui::SetCursorPosY(0.0f); - DrawSettingsMenu(); ImGui::SetCursorPosY(0.0f); - DrawEnhancementsMenu(); - - ImGui::SetCursorPosY(0.0f); - - DrawCheatsMenu(); - - ImGui::SetCursorPosY(0.0f); - - DrawDeveloperToolsMenu(); - - ImGui::SetCursorPosY(0.0f); - - #ifdef ENABLE_REMOTE_CONTROL - DrawRemoteControlMenu(); - - ImGui::SetCursorPosY(0.0f); - #endif - - DrawRandomizerMenu(); - ImGui::PopStyleVar(1); ImGui::EndMenuBar(); } diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp new file mode 100644 index 000000000..917635f34 --- /dev/null +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -0,0 +1,170 @@ +#include "SohMenu.h" + +namespace SohGui { + +extern std::shared_ptr mSohMenu; +using namespace UIWidgets; + +void SohMenu::AddMenuDevTools() { + // Add Dev Tools Menu + AddMenuEntry("Dev Tools", CVAR_SETTING("Menu.DevToolsSidebarSection")); + + // General + AddSidebarEntry("Dev Tools", "General", 3); + WidgetPath path = { "Dev Tools", "General", SECTION_COLUMN_1 }; + + AddWidget(path, "Popout Menu", WIDGET_CVAR_CHECKBOX) + .CVar("gSettings.Menu.Popout") + .Options(CheckboxOptions().Tooltip("Changes the menu display from overlay to windowed.")); + AddWidget(path, "Debug Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("DebugEnabled")) + .Options(CheckboxOptions().Tooltip("Enables Debug Mode, allowing you to select maps with L + R + Z, noclip " + "with L + D-pad Right, and open the debug menu with L on the pause screen.")); + AddWidget(path, "OoT Registry Editor", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("RegEditEnabled")) + .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }) + .Options(CheckboxOptions().Tooltip("Enables the registry editor.")); + AddWidget(path, "Debug Save File Mode", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_DEVELOPER_TOOLS("DebugSaveFileMode")) + .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }) + .Options(ComboboxOptions() + .Tooltip("Changes the behaviour of debug file select creation (creating a save file on slot 1 " + "with debug mode on)\n" + "- Off: The debug save file will be a normal savefile\n" + "- Vanilla: The debug save file will be the debug save file from the original game\n" + "- Maxed: The debug save file will be a save file with all of the items & upgrades") + .ComboMap(debugSaveFileModes)); + AddWidget(path, "OoT Skulltula Debug", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("SkulltulaDebugEnabled")) + .Options(CheckboxOptions().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.")); + AddWidget(path, "Better Debug Warp Screen", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen")) + .Options(CheckboxOptions().Tooltip( + "Optimized debug warp screen, with the added ability to chose entrances and time of day")); + AddWidget(path, "Debug Warp Screen Translation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation")) + .Options(CheckboxOptions() + .Tooltip("Translate the Debug Warp Screen based on the game language.") + .DefaultValue(true)); + AddWidget(path, "Resource logging", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("ResourceLogging")) + .Options(CheckboxOptions().Tooltip("Logs some resources as XML when they're loaded in binary format")); + + AddWidget(path, "Frame Advance", WIDGET_CHECKBOX) + .Options(CheckboxOptions().Tooltip( + "This allows you to advance through the game one frame at a time on command. " + "To advance a frame, hold Z and tap R on the second controller. Holding Z " + "and R will advance a frame every half second. You can also use the buttons below.")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NULL_PLAY_STATE).active || + mSohMenu->disabledMap.at(DISABLE_FOR_DEBUG_MODE_OFF).active; + if (gPlayState != nullptr) { + info.valuePointer = (bool*)&gPlayState->frameAdvCtx.enabled; + } else { + info.valuePointer = (bool*)nullptr; + } + }); + AddWidget(path, "Advance 1", WIDGET_BUTTON) + .Options(ButtonOptions().Tooltip("Advance 1 frame.").Size(Sizes::Inline)) + .Callback([](WidgetInfo& info) { CVarSetInteger(CVAR_DEVELOPER_TOOLS("FrameAdvanceTick"), 1); }) + .PreFunc([](WidgetInfo& info) { + info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_FRAME_ADVANCE_OFF).active || + mSohMenu->disabledMap.at(DISABLE_FOR_DEBUG_MODE_OFF).active; + }); + AddWidget(path, "Advance (Hold)", WIDGET_BUTTON) + .Options(ButtonOptions().Tooltip("Advance frames while the button is held.").Size(Sizes::Inline)) + .PreFunc([](WidgetInfo& info) { + info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_FRAME_ADVANCE_OFF).active || + mSohMenu->disabledMap.at(DISABLE_FOR_DEBUG_MODE_OFF).active; + }) + .PostFunc([](WidgetInfo& info) { + if (ImGui::IsItemActive()) { + CVarSetInteger(CVAR_DEVELOPER_TOOLS("FrameAdvanceTick"), 1); + } + }) + .SameLine(true); + + // Stats + path.sidebarName = "Stats"; + AddSidebarEntry("Dev Tools", path.sidebarName, 1); + AddWidget(path, "Popout Stats Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("Stats")) + .WindowName("Stats") + .Options(WindowButtonOptions().Tooltip("Enables the separate Stats Window.")); + + // Console + path.sidebarName = "Console"; + AddSidebarEntry("Dev Tools", path.sidebarName, 1); + AddWidget(path, "Popout Console", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("Console")) + .WindowName("Console") + .Options(WindowButtonOptions().Tooltip("Enables the separate Console Window.")); + + // Save Editor + path.sidebarName = "Save Editor"; + AddSidebarEntry("Dev Tools", path.sidebarName, 1); + AddWidget(path, "Popout Save Editor", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("SaveEditor")) + .WindowName("Save Editor") + .Options(WindowButtonOptions().Tooltip("Enables the separate Save Editor Window.")); + + // Hook Debugger + path.sidebarName = "Hook Debugger"; + AddSidebarEntry("Dev Tools", path.sidebarName, 1); + AddWidget(path, "Popout Hook Debugger", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("HookDebugger")) + .WindowName("Hook Debugger") + .Options(WindowButtonOptions().Tooltip("Enables the separate Hook Debugger Window.")); + + // Collision Viewer + path.sidebarName = "Collision Viewer"; + AddSidebarEntry("Dev Tools", path.sidebarName, 2); + AddWidget(path, "Popout Collision Viewer", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("CollisionViewer")) + .WindowName("Collision Viewer") + .Options(WindowButtonOptions().Tooltip("Enables the separate Collision Viewer Window.")); + + // Actor Viewer + path.sidebarName = "Actor Viewer"; + AddSidebarEntry("Dev Tools", path.sidebarName, 2); + AddWidget(path, "Popout Actor Viewer", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("ActorViewer")) + .WindowName("Actor Viewer") + .Options(WindowButtonOptions().Tooltip("Enables the separate Actor Viewer Window.")); + + // Display List Viewer + path.sidebarName = "DList Viewer"; + AddSidebarEntry("Dev Tools", path.sidebarName, 2); + AddWidget(path, "Popout Display List Viewer", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("DisplayListViewer")) + .WindowName("Display List Viewer") + .Options(WindowButtonOptions().Tooltip("Enables the separate Display List Viewer Window.")); + + // Value Viewer + path.sidebarName = "Value Viewer"; + AddSidebarEntry("Dev Tools", path.sidebarName, 2); + AddWidget(path, "Popout Value Viewer", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("ValueViewer")) + .WindowName("Value Viewer") + .Options(WindowButtonOptions().Tooltip("Enables the separate Value Viewer Window.")); + + // Message Viewer + path.sidebarName = "Message Viewer"; + AddSidebarEntry("Dev Tools", path.sidebarName, 2); + AddWidget(path, "Popout Message Viewer", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("MessageViewer")) + .WindowName("Message Viewer") + .Options(WindowButtonOptions().Tooltip("Enables the separate Message Viewer Window.")); + + // Gfx Debugger + path.sidebarName = "Gfx Debugger"; + AddSidebarEntry("Dev Tools", path.sidebarName, 1); + AddWidget(path, "Popout Gfx Debugger", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("GfxDebugger")) + .WindowName("GfxDebuggerWindow") + .Options(WindowButtonOptions().Tooltip("Enables the separate Gfx Debugger Window.")); +} + +} // namespace SohGui diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp new file mode 100644 index 000000000..21a90d70b --- /dev/null +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -0,0 +1,2146 @@ +#include "SohMenu.h" +#include +#include +#include +#include +#include +#include +#include + +static std::string comboboxTooltip = ""; +static int32_t enhancementPresetSelected = ENHANCEMENT_PRESET_DEFAULT; +bool isBetaQuestEnabled = false; + +extern "C" { + void enableBetaQuest() { isBetaQuestEnabled = true; } + void disableBetaQuest() { isBetaQuestEnabled = false; } +} + +namespace SohGui { + +extern std::shared_ptr mSohMenu; +using namespace UIWidgets; + +void SohMenu::AddMenuEnhancements() { + // Add Enhancements Menu + AddMenuEntry("Enhancements", CVAR_SETTING("Menu.EnhancementsSidebarSection")); + + // Enhancements + WidgetPath path = { "Enhancements", "Presets", SECTION_COLUMN_1 }; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + + const PresetTypeDefinition presetTypeDef = presetTypes.at(PRESET_TYPE_ENHANCEMENTS); + for (auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter) { + if (iter->first != 0) comboboxTooltip += "\n\n"; + comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); + } + AddWidget(path, "Enhancement Presets", WIDGET_COMBOBOX) + .ValuePointer(&enhancementPresetSelected) + .Callback([](WidgetInfo& info) { + const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(PRESET_TYPE_ENHANCEMENTS); + CVarSetInteger(presetTypeCvar.c_str(), *std::get(info.valuePointer)); + }) + .Options(ComboboxOptions() + .ComboMap(enhancementPresetList) + .DefaultIndex(ENHANCEMENT_PRESET_DEFAULT) + .Tooltip(comboboxTooltip.c_str()) + ); + AddWidget(path, "Apply Preset##Enhancemnts", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(PRESET_TYPE_ENHANCEMENTS); + const PresetTypeDefinition presetTypeDef = presetTypes.at(PRESET_TYPE_ENHANCEMENTS); + uint16_t selectedPresetId = CVarGetInteger(presetTypeCvar.c_str(), 0); + if(selectedPresetId >= presetTypeDef.presets.size()){ + selectedPresetId = 0; + } + const PresetDefinition selectedPresetDef = presetTypeDef.presets.at(selectedPresetId); + for(const char* block : presetTypeDef.blocksToClear) { + CVarClearBlock(block); + } + if (selectedPresetId != 0) { + applyPreset(selectedPresetDef.entries); + } + CVarSetInteger(presetTypeCvar.c_str(), selectedPresetId); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + + path.sidebarName = "Gameplay"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + + AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("BootSequence")) + .Options(ComboboxOptions() + .DefaultIndex(BOOTSEQUENCE_DEFAULT) + .ComboMap(bootSequenceLabels) + .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" + ) + ); + AddWidget(path, "Autosave", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("Autosave")) + .Options(CheckboxOptions().Tooltip( + "Save the game automatically on a 3 minute interval and when soft-resetting the game. The interval " + "autosave will wait if the game is paused in any way (dialogue, pause screen up, cutscenes, " + "etc.).\n\n" + "The soft-reset save will *not* trigger in cutscene maps like the Chamber of Sages!" + )); + + AddWidget(path, "Audio", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Mute Low HP Alarm", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("LowHPAlarm")) + .Options(CheckboxOptions().Tooltip( + "Disable the low HP beeping sound." + )); + AddWidget(path, "Disable Navi Call Audio", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableNaviCallAudio")) + .Options(CheckboxOptions().Tooltip( + "Disables the voice audio when Navi calls you." + )); + + AddWidget(path, "Pause Menu", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Allow the Cursor to be on any slot", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("PauseAnyCursor")) + .Options(ComboboxOptions() + .ComboMap(cursorAnywhereValues) + .DefaultIndex(PAUSE_ANY_CURSOR_RANDO_ONLY) + .Tooltip( + "Allows the cursor on the pause menu to be over any slot. Sometimes required in Randomizer " + "to select certain items." + ) + ); + AddWidget(path, "Assignable Tunics and Boots", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AssignableTunicsAndBoots")) + .Options(CheckboxOptions().Tooltip( + "Allows equipping the Tunics and Boots to C-Buttons/D-Pad." + )); + // TODO: Revist strength toggle, it's currently separate but should probably go here and be locked behind the + // Equipment toggle settings. Also maybe these should all be in Items sidebar? + AddWidget(path, "Equipment Toggle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EquipmentCanBeRemoved")) + .Options(CheckboxOptions().Tooltip( + "Allows equipment to be removed by toggling it off on\n the equipment subscreen." + )); + AddWidget(path, "Sword Toggle Options", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("SwordToggle")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 0) == 0; + }) + .Options(ComboboxOptions() + .ComboMap(swordToggleModes) + .DefaultIndex(SWORD_TOGGLE_NONE) + .Tooltip( + "Introduces Options for unequipping Link's sword\n\n" + "None: Only Biggoron's Sword/Giant's Knife can be toggled. Doing so will equip the Master Sword.\n\n" + "Child Toggle: This will allow for completely unequipping any sword as child link.\n\n" + "Both Ages: Any sword can be unequipped as either age. This may lead to swordless glitches as Adult." + ) + ); + + AddWidget(path, "Quality of Life", WIDGET_SEPARATOR_TEXT); + // Maybe should be in Timesavers somewhere? + AddWidget(path, "Link's Cow in Both Time Periods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CowOfTime")) + .Options(CheckboxOptions().Tooltip( + "Allows the Lon Lon Ranch Obstacle Course reward to be shared across time periods." + )); + // Maybe should be in Difficulty Options somewhere? + AddWidget(path, "Enable Visual Guard Vision", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GuardVision")); + // Maybe should be in TImesavers somewhere? + AddWidget(path, "Pull Grave during the day", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DayGravePull")) + .Options(CheckboxOptions().Tooltip( + "Allows graves to be pulled when child during the day." + )); + AddWidget(path, "Don't Require Input for Credits Sequence", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NoInputForCredits")) + .Options(CheckboxOptions().Tooltip( + "Removes the Input Requirement on Text boxes after defeating Ganon, allowing the Credits " + "Sequence to continue to progress." + )); + AddWidget(path, "Answer Navi Prompt with L Button", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NaviOnL")) + .Options(CheckboxOptions().Tooltip( + "Speak to Navi with L but enter First-Person Camera with C-Up" + )); + AddWidget(path, "Disable Crit Wiggle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableCritWiggle")) + .Options(CheckboxOptions().Tooltip( + "Disable Random Camera Wiggle at Low Health." + )); + AddWidget(path, "Targetable Hookshot Reticle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HookshotableReticle")) + .Options(CheckboxOptions().Tooltip( + "Makes the Hookshot Reticle use a different color when aiming at Hookshotable Collision." + )); + AddWidget(path, "Faster Rupee Accumulator", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterRupeeAccumulator")) + .Options(CheckboxOptions().Tooltip( + "Causes your Wallet to fill and empty faster when you gain or lose money." + )); + AddWidget(path, "Fun/Aesthetic Options", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Enable Passage of Time on File Select", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeFlowFileSelect")); + AddWidget(path, "Dogs Follow you Everywhere", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DogFollowsEverywhere")) + .Options(CheckboxOptions().Tooltip( + "Allows dogs to follow you anywhere you go, even if you leave the Market." + )); + AddWidget(path, "Enemy Health Bars", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnemyHealthBar")) + .Options(CheckboxOptions().Tooltip( + "Renders a health bar for Enemies when Z-Targeted." + )); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Authentic Bug Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix L&R Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixMenuLR")) + .Options(CheckboxOptions().Tooltip( + "Makes the L and R buttons in the pause menu the same color" + )); + AddWidget(path, "Fix L&Z Page Switch in Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NGCKaleidoSwitcher")) + .Options(CheckboxOptions().Tooltip( + "Makes L and R switch pages like on the Gamecube. Z opens the Debug Menu instead." + )); + AddWidget(path, "Fix Dungeon Entrances", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixDungeonMinimapIcon")) + .Options(CheckboxOptions().Tooltip( + "Removes the Dungeon Entrance icon on the top-left corner of the screen when no dungeon is present on the " + "current map." + )); + AddWidget(path, "Fix Two-Handled Idle Animations", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TwoHandedIdle")) + .Options(CheckboxOptions().Tooltip( + "Re-Enables the two-handed idle animation, a seemingly finished animation that was disabled on accident " + "in the original game." + )); + AddWidget(path, "Fix the Gravedigging Tour Glitch", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GravediggingTourFix")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = "This setting is always enabled in randomized save files."; + }) + .Options(CheckboxOptions().Tooltip( + "Fixes a bug where the Gravedigging Tour Heart Piece disappears if the area reloads." + )); + AddWidget(path, "Fix Deku Nut Upgrade", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DekuNutUpgradeFix")) + .Options(CheckboxOptions().Tooltip( + "Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw." + )); + AddWidget(path, "Fix Navi Text HUD Position", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NaviTextFix")) + .Options(CheckboxOptions().Tooltip( + "Correctly centers the Navi text prompt on the HUD's C-Up button." + )); + AddWidget(path, "Fix Anubis Fireballs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AnubisFix")) + .Options(CheckboxOptions().Tooltip( + "Make Anubis Fireballs do Fire damage when reflected back at them with the Mirror Shield." + )); + AddWidget(path, "Fix Megaton Hammer Crouch Stab", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CrouchStabHammerFix")) + .Callback([](WidgetInfo& info) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0)) { + CVarClear(CVAR_ENHANCEMENT("CrouchStabFix")); + } + }) + .Options(CheckboxOptions().Tooltip( + "Make the Megaton Hammer's crouch stab able to destroy rocks without first swinging it normally." + )); + AddWidget(path, "Remove Power Crouch Stab", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CrouchStabFix")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0) == 0; + }) + .Options(CheckboxOptions().Tooltip( + "Make crouch stabbing always do the same damage as a regular slash." + )); + AddWidget(path, "Fix Credits Timing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CreditsFix")) + .Options(CheckboxOptions().Tooltip( + "Extend certain credits scenes so the music lines up properly with the visuals." + )); + AddWidget(path, "Fix Gerudo Warrior's Clothing Colors", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GerudoWarriorClothingFix")) + .Options(CheckboxOptions().Tooltip( + "Prevent the Gerudo Warrior's clothes changign color when changing Link's tunic or " + "using Bombs in front of her." + )); + AddWidget(path, "Fix Camera Drift", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixCameraDrift")) + .Options(CheckboxOptions().Tooltip( + "Fixes camera slightly drifting to the left when standing still due to a math error." + )); + AddWidget(path, "Fix Camera Swing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixCameraSwing")) + .Options(CheckboxOptions().Tooltip( + "Fixes camera getting stuck on collision when standing still. Also fixes slight shift " + "back in camera when Link stops moving." + )); + AddWidget(path, "Fix Hanging Ledge Swing Rate", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixHangingLedgeSwingRate")) + .Options(CheckboxOptions().Tooltip( + "Fixes camera swing rate when the player falls off a ledge and the camera swings around." + )); + AddWidget(path, "Fix Missing Jingle after 5 Silver Rupees", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SilverRupeeJingleExtend")) + .Options(CheckboxOptions().Tooltip( + "Adds 5 higher pitches for the Silver Rupee Jingle for the rooms with more than 5 Silver Rupees. " + "Only relevant for playthroughs involving Master Quest Dungeons." + )); + AddWidget(path, "Fix Out of Bounds Textures", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixTexturesOOB")) + .Callback([](WidgetInfo& info) { + ApplyAuthenticGfxPatches(); + }) + .Options(CheckboxOptions().Tooltip( + "Fixes authentic out of bounds texture reads, instead loading textures with the correct size." + )); + AddWidget(path, "Fix Poacher's Saw Softlock", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixSawSoftlock")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("SkipText"), 0) == 1; + info.options->disabledTooltip = "This option is forced on when Skip Text is enabled."; + }) + .Options(CheckboxOptions().Tooltip( + "Prevents the Poacher's Saw softlock from mashing through the text, or with Skip Text enabled." + )); + AddWidget(path, "Fix Enemies not Spawning Near Water", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes")) + .Options(CheckboxOptions().Tooltip( + "Causes respanwing enemies, like Stalchildren, to appear on land near bodies of water. " + "Fixes an incorrect calculation that acted like water underneath ground was above it." + )); + AddWidget(path, "Fix Bush Item Drops", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BushDropFix")) + .Options(CheckboxOptions().Tooltip( + "Fixes the bushes to drop items correctly rather than spawning undefined items." + )); + AddWidget(path, "Fix Falling from Vine Edges", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixVineFall")) + .Options(CheckboxOptions().Tooltip( + "Prevents immediately falling off climbable surfaces if climbing on the edges." + )); + AddWidget(path, "Fix Link's Eyes Open while Sleeping", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping")) + .Options(CheckboxOptions().Tooltip( + "Fixes Link's eyes being open in the openeing cutscene when he is supposed to be sleeping." + )); + AddWidget(path, "Fix Darunia Dancing Too Fast", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed")) + .Options(CheckboxOptions().Tooltip( + "Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in the Original Game." + )); + AddWidget(path, "Fix Raised Floor Switches", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixFloorSwitches")) + .Options(CheckboxOptions().Tooltip( + "Fixes the two raised floor switches, the one in Forest Temple Basement and the one at the top of Fire " + "Temple. This will lower them, making activating them easier." + )); + AddWidget(path, "Fix Zora Hint Dialogue", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixZoraHintDialogue")) + .Options(CheckboxOptions().Tooltip( + "Fixes one Zora's dialogue giving a hint about bringing Ruto's Letter to King Zora to properly occur " + "before moving King Zora rather than after." + )); + AddWidget(path, "Fix Hand Holding Hammer", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixHammerHand")) + .Callback([](WidgetInfo& info) { + UpdatePatchHand(); + }) + .Options(CheckboxOptions().Tooltip( + "Fixes Adult Link having a backwards Left hand when holding the Megaton Hammer." + )); + AddWidget(path, "Fix Broken Giant's Knife Bug", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixGrokenGiantsKnife")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a Randomizer."; + }) + .Callback([](WidgetInfo& info) { + bool hasGiantsKnife = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON); + bool hasBrokenKnife = CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); + bool knifeIsBroken = gSaveContext.swordHealth == 0.0f; + + if (hasGiantsKnife && (hasBrokenKnife != knifeIsBroken)) { + func_800849EC(gPlayState); + } + }) + .Options(CheckboxOptions().Tooltip( + "Fixes the Broken Giant's Knife flag not being reset when Medigoron fixes it." + )); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Restorations", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Red Ganon Blood", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RedGanonBlood")) + .Options(CheckboxOptions().Tooltip( + "Restore the original red blood from NTSC 1.0/1.1. Disable for Green blood." + )); + AddWidget(path, "Fish while Hovering", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HoverFishing")) + .Options(CheckboxOptions().Tooltip( + "Restore a bug from NSTC 1.0 that allows casting the Fishing Rod while using the Hover Boots." + )); + AddWidget(path, "N64 Weird Frames", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("N64WeirdFrames")) + .Options(CheckboxOptions().Tooltip( + "Restores N64 Weird Frames allwing weirdshots to behave the same as N64." + )); + AddWidget(path, "Bombchus Out of Bounds", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BombchusOOB")) + .Options(CheckboxOptions().Tooltip( + "Allows Bombchus to explode out of bounds. Similar to Gamecube and Wii VC" + )); + AddWidget(path, "Quick Putaway", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("QuickPutaway")) + .Options(CheckboxOptions().Tooltip( + "Restore a bug from NTSC 1.0 that allows putting away an item without an animation and performing " + "Putaway Ocarina Items." + )); + AddWidget(path, "Restore Old Gold Skulltula Cutscene", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GSCutscene")) + .Options(CheckboxOptions().Tooltip( + "Restore pre-release behavior where defeating a Gold Skulltula will play a cutscene showing it die." + )); + AddWidget(path, "Quick Bongo Kill", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("QuickBongoKill")) + .Options(CheckboxOptions().Tooltip( + "Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him." + )); + AddWidget(path, "Original RBA Values", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RestoreRBAValues")) + .Options(CheckboxOptions().Tooltip( + "Restores the original outcomes when performing Reverse Bottle Adventure." + )); + AddWidget(path, "Early Eyeball Frog", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EarlyEyeballFrog")) + .Options(CheckboxOptions().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." + )); + AddWidget(path, "Pulsate Boss Icon", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("Pulsate Boss Icon")) + .Options(CheckboxOptions().Tooltip( + "Restores an unfinished feature to pulsate the boss room icon when you are in the boss room." + )); + AddWidget(path, "Pause Buffer Input Window: %d frames", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("PauseBufferWindow")) + .Options(IntSliderOptions() + .Min(0) + .Max(40) + .DefaultValue(0) + .Format("%d frames") + ); + AddWidget(path, "Include Held Inputs at the Start of Buffer Input Window", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("IncludeHeldInputsBufferWindow")) + .Options(CheckboxOptions().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." + )); + AddWidget(path, "Simulated Input Lag: %d frames", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SIMULATED_INPUT_LAG) + .Options(IntSliderOptions() + .Min(0) + .Max(6) + .DefaultValue(0) + .Format("%d frames") + .Tooltip( + "Buffers your inputs to be executed a specified amount of frames later." + ) + ); + + path.sidebarName = "Time Savers"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Cutscenes", WIDGET_SEPARATOR_TEXT); + bool allSkipsChecked = false; + AddWidget(path, "Skip All", WIDGET_CHECKBOX) + .ValuePointer(&allSkipsChecked) + .PreFunc([](WidgetInfo& info) { + *std::get(info.valuePointer) = + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), IS_RANDO); + }) + .Callback([](WidgetInfo& info) { + int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; + + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), newValue); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), newValue); + + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + AddWidget(path, "Skip Intro", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip Entrance Cutscenes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip Story Cutscenes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip Song Cutscenes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip Boss Introductions", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Quick Boss Deaths", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip One Point Cutscenes (Chests, Door Unlocks, etc.)", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip Owl Interactions", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Skip Misc Interactions", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Disable Title Card", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard")) + .Options(CheckboxOptions().DefaultValue(IS_RANDO)); + AddWidget(path, "Exclude Glitch-Aiding Cutscenes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding")) + .Options(CheckboxOptions().Tooltip( + "Don't skip cutscenes that are associated wiht useful glitches. Currently, it is " + "only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, and the Box Skip One " + "Point in Jabu." + )); + AddWidget(path, "Skip Child Stealth", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipChildStealth")) + .Options(CheckboxOptions().Tooltip( + "The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards." + )); + AddWidget(path, "Skip Tower Escape", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipTowerEscape")) + .Options(CheckboxOptions().Tooltip( + "Skip the tower escape sequence between Ganondorf and Ganon." + )); + AddWidget(path, "Item Scale: %.2f", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_DISABLED; + }) + .Options(FloatSliderOptions() + .Min(5.0f) + .Max(15.0f) + .Format("%.2f") + .DefaultValue(10.0f) + .Tooltip( + "The size of the item when it is picked up" + )); + + AddWidget(path, "Text", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Skip Forced Dialog", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipForcedDialog")) + .Options(CheckboxOptions().Tooltip( + "Prevent forced conversations with Navi or other NPCs." + )); + AddWidget(path, "Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("TextSpeed")) + .Options(IntSliderOptions() + .Min(1) + .Max(5) + .DefaultValue(1) + .Format("%dx") + ); + AddWidget(path, "Skip Text", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipText")) + .Options(CheckboxOptions().Tooltip("Holding down B skips text.")); + AddWidget(path, "Slow Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("SlowTextSpeed")) + .Options(IntSliderOptions() + .Min(1) + .Max(5) + .DefaultValue(1) + .Format("%dx") + .Tooltip( + "Changes the speed of sections of text that normally are paced slower than the text surrounding it." + ) + ); + AddWidget(path, "Match Normal Text", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + CVarSetInteger(CVAR_ENHANCEMENT("SlowTextSpeed"), CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 1)); + }) + .Options(ButtonOptions().Tooltip( + "Makes the speed of the slow text match the normal text speed above." + )); + AddWidget(path, "Skip Pickup Messages", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastDrops")) + .Options(CheckboxOptions().Tooltip( + "Skip Pickup Messages for new Consumable Items and Bottle Swipes." + )); + AddWidget(path, "Better Owl", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterOwl")) + .Options(CheckboxOptions().Tooltip( + "The default response to Kaepora Gaebora is always that you understood what he said." + )); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Gameplay", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Skip Save Confirmation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipSaveConfirmation")) + .Options(CheckboxOptions().Tooltip("Skip the \"Game Saved\" confirmation screen.")); + AddWidget(path, "Biggoron Forge Time: %d days", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ForgeTime")) + .Options(IntSliderOptions() + .Min(0) + .Max(3) + .DefaultValue(3) + .Format("%d days") + .Tooltip( + "Allows you to change the number of days it takes for " + "Biggoron to forge the Biggoron's Sword." + ) + ); + AddWidget(path, "Remember Save Location", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RememberSaveLocation")) + .Options(CheckboxOptions().Tooltip( + "When loading a save, places Link at the last entrance he went through.\n" + "This doesn't work if the save was made in grottos, fairy fountains, or dungeons." + )); + AddWidget(path, "Navi Timer Resets", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ResetNaviTimer")) + .Options(CheckboxOptions().Tooltip( + "Resets the Navi timer on scene change. If you have already talked to her, " + "she will try and talk to you again, instead of needing a save warp or death." + )); + AddWidget(path, "No Skulltula Freeze", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkulltulaFreeze")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = + "This setting is disabled because a randomizer savefile is loaded. Please use the " + "\"Skip Get Item Animation\" option within the randomizer enhancements instead."; + }) + .Options(CheckboxOptions().Tooltip( + "Stops the game from freezing the player when picking up Gold Skulltula Tokens. Does not" + "apply in randomizer savefiles." + )); + AddWidget(path, "Ask to Equip New Items", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AskToEquip")) + .Options(CheckboxOptions().Tooltip( + "Adds a prompt to equip newly-obtained Swords, Shields, and Tunics." + )); + AddWidget(path, "Link as Default File Name", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("LinkDefaultName")) + .Options(CheckboxOptions().Tooltip( + "Allows you to have \"Link\" as a premade file name." + )); + AddWidget(path, "Quit Fishing At Door", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("QuitFishingAtDoor")) + .Options(CheckboxOptions().Tooltip( + "Fisherman asks if you want to quit at the door if you try to leave the Fishing Pond " + "while still holding the Fishing Rod." + )); + AddWidget(path, "Time Travel with Song of Time", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("TimeTravel")) + .Options(ComboboxOptions() + .ComboMap(timeTravelOptions) + .DefaultIndex(0) + .Tooltip( + "Allows Link to freely change age by playing the Song of Time.\n" + "Time Blocks can still be used properly.\n\n" + "Requirements:\n" + " - Obtained the Ocarina of Time (depends on selection)\n" + " - Obtained the Song of Time\n" + " - Obtained the Master Sword\n" + " - Not within range of a Time Block\n" + " - Not within range of Ocarina Playing spots." + ) + ); + AddWidget(path, "Pause Warp", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("PauseWarp")) + .Options(CheckboxOptions().Tooltip( + "Selection of warp song in pause menu initiates a warp. Disables song playback." + )); + AddWidget(path, "Skip Scarecrow's Song", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantScarecrow")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SKIP_SCARECROWS_SONG); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomized " + "save file with the option \"Skip Scarecrow Song\" is currently loaded."; + }) + .Options(CheckboxOptions().Tooltip( + "Pierre appears when an Ocarina is pulled out. Requires learning the Scarecrow's Song first." + )); + AddWidget(path, "Time of Day", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Nighttime GS Always Spawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NightGSAlwaysSpawn")) + .Options(CheckboxOptions().Tooltip( + "Nighttime Skulltulas will spawn during both day and night." + )); + AddWidget(path, "Dampe Appears All Night", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DampeAllNight")) + .Options(CheckboxOptions().Tooltip( + "Makes Dampe appear anytime during the night, not just his usual working hours." + )); + AddWidget(path, "Exit Market at Night", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MarketSneak")) + .Options(CheckboxOptions().Tooltip( + "Allows exiting Hyrule Castle Market Town to Hyrule Field at night by speaking to the guard " + "next to the gate." + )); + AddWidget(path, "Shops and Games Always Open", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("OpenAllHours")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_LOCK_OVERWORLD_DOORS).Is(RO_GENERIC_ON); + }) + .Options(CheckboxOptions().Tooltip( + "Shops and Minigames are open both day and night. Requires a scene reload to take effect." + ).DisabledTooltip( + "This is not compatible with the Locked Overworld Doors Randomizer option." + )); + path.column = SECTION_COLUMN_3; + AddWidget(path, "Animations", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "King Zora Speed: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_ENHANCEMENT("MweepSpeed")) + .Options(FloatSliderOptions() + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Format("%.2fx") + ); + AddWidget(path, "Vine/Ladder Climb Speed +%d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("Climb Speed")) + .Options(IntSliderOptions() + .Min(0) + .Max(12) + .DefaultValue(0) + .Format("+%d") + ); + AddWidget(path, "Block Pushing Speed +%d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("FasterBlockPush")) + .Options(IntSliderOptions() + .Min(0) + .Max(5) + .DefaultValue(0) + .Format("+%d") + ); + AddWidget(path, "Crawl Speed %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("CrawlSpeed")) + .Options(IntSliderOptions() + .Min(1) + .Max(4) + .DefaultValue(1) + .Format("%dx") + ); + AddWidget(path, "Faster Heavy Block Lift", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterHeavyBlockLift")) + .Options(CheckboxOptions().Tooltip( + "Speeds up lifting Silver Rocks and Obelisks." + )); + AddWidget(path, "Fast Ocarina Playback", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastOcarinaPlayback")) + .Options(CheckboxOptions().Tooltip( + "Skip the part where the Ocarina Playback is called when you play a song." + )); + AddWidget(path, "Skip Magic Arrow Equip Animation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipArrowAnimation")); + AddWidget(path, "Faster Farore's Wind", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastFarores")) + .Options(CheckboxOptions().Tooltip("Greatly decreases cast time of Farore's Wind magic spell.")); + AddWidget(path, "Fast Chests", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastChests")) + .Options(CheckboxOptions().Tooltip( + "Makes Link always kick the chest to open it, instead of doing the longer " + "chest opening animation for major items." + )); + AddWidget(path, "Skip Water Take Breath Animation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim")) + .Options(CheckboxOptions().Tooltip( + "Skips Link's taking breath animation after coming up from water. " + "This setting does not interfere with getting items from underwater." + )); + AddWidget(path, "Play Zelda's Lullaby to Open Sleeping Waterfall", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomizer savefile with \"Sleeping Waterfall: Open\" is loaded."; + }) + .Options(ComboboxOptions() + .ComboMap(sleepingWaterfallOptions) + .DefaultIndex(WATERFALL_ALWAYS) + .Tooltip( + "Always: Link must always play Zelda's Lullaby to open the waterfall entrance to Zora's Domain.\n" + "Once: Link only needs to play Zelda's Lullaby once to open the waterfall; after that, it stays " + "open permanently.\n" + "Never: Link never needs to play Zelda's Lullaby to open the waterfall. He only needs to have " + "learned it and have an Ocarina." + ) + ); + + path.sidebarName = "Graphics"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Mods", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Use Alternate Assets", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AltAssets")) + .Options(CheckboxOptions().Tooltip( + "Toggle between standard assets and alternate assets. Usually mods will indicate if " + "this setting has to be used or not." + )); + AddWidget(path, "Disable Bomb Billboarding", WIDGET_CVAR_CHECKBOX) + .CVar("DisableBombBillboarding") + .Options(CheckboxOptions().Tooltip( + "Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to " + "replace bombs with 3D objects." + )); + AddWidget(path, "Disable Grotto Fixed Rotation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableGrottoRotation")) + .Options(CheckboxOptions().Tooltip( + "Disables Grottos rotating with the Camera. To be used in conjuction with mods that want to " + "replace grottos with 3D objects." + )); + + + AddWidget(path, "UI", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Minimal UI", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MinimalUI")) + .Options(CheckboxOptions().Tooltip( + "Hides most of the UI when not needed.\n" + "NOTE: Doesn't activate until scene transition." + )); + AddWidget(path, "Disable Hot/Underwater Warning Text", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableTunicWarningText")) + .Options(CheckboxOptions().Tooltip( + "Disables warning text when you don't have on the Goron/Zora Tunic " + "in Hot/Underwater conditions." + )); + AddWidget(path, "Remember Minimap State Between Areas", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RememberMapToggleState")) + .Options(CheckboxOptions().Tooltip( + "Preverse the minimap visibility state when going between areas rather than default it to \"on\" " + "when going through loading zones." + )); + AddWidget(path, "Visual Stone of Agony", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("VisualAgony")) + .Options(CheckboxOptions().Tooltip( + "Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble." + )); + AddWidget(path, "Disable HUD Heart Animations", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NoHUDHeartAnimation")) + .Options(CheckboxOptions().Tooltip( + "Disables the Beating Animation of the Hearts on the HUD." + )); + AddWidget(path, "Glitch line-up tick", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DrawLineupTick")) + .Options(CheckboxOptions().Tooltip( + "Displays a tick in the top center of the screen to help with glitch line-ups in SoH, since traditional " + "UI based line-ups do not work outside of 4:3" + )); + AddWidget(path, "Disable Black Bar Letterboxes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableBlackBars")) + .Options(CheckboxOptions().Tooltip( + "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: there may be minor visual " + "glitches that were covered up by the black bars. Please disable this setting before reporting a bug." + )); + AddWidget(path, "Dynamic Wallet Icon", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DynamicWalletIcon")) + .Options(CheckboxOptions().Tooltip( + "Changes the Rupee in the Wallet icon to match the wallet size you currently have." + )); + AddWidget(path, "Always Show Dungeon Entrances", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon")) + .Options(CheckboxOptions().Tooltip( + "Always shows dungeon entrance icons on the Minimap." + )); + AddWidget(path, "More Info in File Select", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FileSelectMoreInfo")) + .Options(CheckboxOptions().Tooltip( + "Shows what items you have collected in the File Select screen, like in N64 Randomizer." + )); + AddWidget(path, "Better Ammo Rendering in Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterAmmoRendering")) + .Options(CheckboxOptions().Tooltip( + "Ammo counts in the pause menu will work correctly regardless of the position of items in the Inventory." + )); + + AddWidget(path, "Models", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Invisible Bunny Hood", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HideBunnyHood")) + .Options(CheckboxOptions().Tooltip( + "Turns Bunny Hood Invisible while still maintaining its effects." + )); + AddWidget(path, "Animated Link in Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("PauseMenuAnimatedLink")) + .Options(CheckboxOptions().Tooltip( + "Turns the Static Image of Link in the Pause Menu's Equipment Subsceen " + "into a model cycling through his idle animations." + )); + AddWidget(path, "Show Age-Dependent Equipment", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EquipmentAlwaysVisible")) + .Callback([](WidgetInfo& info) { + UpdatePatchHand(); + }) + .Options(CheckboxOptions().Tooltip( + "Makes all equipment visible, regardless of Age." + )); + AddWidget(path, "Scale Adult Equipment as Child", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ScaleAdultEquipmentAsChild")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0) == 0; + }) + .Options(CheckboxOptions().Tooltip( + "Scales all of the Adult Equipment, as well as moving some a bit, to fit on Child Link better. May " + "not work properly with some mods." + )); + AddWidget(path, "Enable 3D Dropped Items/Projectiles", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NewDrops")) + .Options(CheckboxOptions().Tooltip( + "Replaces most 2D items and projectiles on the overworld with their equivalent 3D models." + )); + AddWidget(path, "Show Gauntlets in First Person", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FirstPersonGauntlets")) + .Options(CheckboxOptions().Tooltip( + "Renders Guantlets when using the Bow and Hookshot like in OoT3D." + )); + AddWidget(path, "Show Chains on Both Sides of Locked Doors", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides")); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Textures", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Chest Size & Texture Matches Contents", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents")) + .Callback([](WidgetInfo& info) { + if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) == CSMC_DISABLED) { + CVarSetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + } + }) + .Options(ComboboxOptions() + .ComboMap(chestStyleMatchesContentsOptions) + .DefaultIndex(CSMC_DISABLED) + .Tooltip( + "Chest sizes and textures are changed to help identify the item inside.\n" + " - Major items: Large gold chests\n" + " - Lesser items: Large brown chests\n" + " - Junk items: Small brown chests\n" + " - Small keys: Small silver chests\n" + " - Boss keys: Vanilla size and texture\n" + " - Skulltula Tokens: Small skulltula chest\n" + "\n" + "NOTE: Textures will not apply if you are using a mod pack with a custom chest model." + ) + ); + AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchesContents"), CSMC_DISABLED); + }) + .Options(CheckboxOptions().Tooltip( + "Only change the size/texture of chests if you have the Stone of Agony." + )); + AddWidget(path, "Color Temple of Time's Medallions", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ToTMedallionsColors")) + .Callback([](WidgetInfo& info) { + PatchToTMedallions(); + }) + .Options(CheckboxOptions().Tooltip( + "When Medallions are collected, the Medallion imprints around the Master Sword Pedestal in the Temple " + "of Time will become colored-in." + )); + AddWidget(path, "Fix Vanishing Paths", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix")) + .Callback([](WidgetInfo& info) { + if (gPlayState != NULL) { + UpdateDirtPathFixState(gPlayState->sceneNum); + } + }) + .Options(ComboboxOptions() + .ComboMap(zFightingOptions) + .DefaultIndex(ZFIGHT_FIX_DISABLED) + .Tooltip( + "Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" + "Consistent: Certain paths vanish the same way in all resolutions\n" + "No Vanish: Paths do not vanish, Link seems to sink in to some paths\n" + "This might affect other decal effects\n" + ) + ); + AddWidget(path, "Text Spacing: %d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("TextSpacing")) + .Options(IntSliderOptions() + .Min(4) + .Max(6) + .DefaultValue(6) + .Tooltip( + "Space between text characters (useful for HD font textures)." + ) + ); + + AddWidget(path, "Rendering", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Disable LOD", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableLOD")) + .Options(CheckboxOptions().Tooltip( + "Turns off the Level of Detail setting, making models use their Higher-Poly variants at any distance." + )); + AddWidget(path, "Increase Actor Draw Distance: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("DisableDrawDistance")) + .Callback([](WidgetInfo& info) { + if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1) { + CVarSetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0); + } + }) + .Options(IntSliderOptions() + .Min(1) + .Max(5) + .DefaultValue(1) + .Format("%dx") + .Tooltip( + "Increases the range in which Actors/Objects are drawn." + ) + ); + AddWidget(path, "Kokiri Draw Distance", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1; + }) + .Options(CheckboxOptions().Tooltip( + "The Kokiri are mystical beings that fade into view when approached. Enabling this will remove their " + "draw distance." + )); + AddWidget(path, "Widescreen Actor Culling", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("WidescreenActorCulling")) + .Options(CheckboxOptions().Tooltip( + "Adjusts the Horizontal Culling Plane to account for Widescreen Resolutions." + )); + AddWidget(path, "Cull Glitch Useful Actors", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0) && + CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1; + info.options->disabledTooltip = "Requires Actor Draw Distance to be increased or Widscreen Actor Culling to be enabled."; + }) + .Options(CheckboxOptions().Tooltip( + "Exclude Actors that are useful for Glitches from the extended culling ranges. Some actors may still draw " + "in the extended ranges, but will not \"update\" so that certain glitches that leverage the original " + "culling requirements will still work.\n\nThe following actors are excluded:\n" + " - White clothed Gerudos\n" + " - King Zora\n" + " - Gossip Stones\n" + " - Boulders\n" + " - Blue Warps\n" + " - Darunia\n" + " - Gold SKulltulas\n" + )); + + // TODO: Find a better home for these. + path.column = SECTION_COLUMN_3; + AddWidget(path, "Misc.", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "N64 Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_LOW_RES_MODE) + .Options(CheckboxOptions().Tooltip( + "Sets the aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution." + )); + AddWidget(path, "Remove Spin Attack Darkness", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RemoveSpinAttackDarkness")) + .Options(CheckboxOptions().Tooltip( + "Remove the Darkness that appears when charging a Spin Attack" + )); + + path.sidebarName = "Items"; + AddSidebarEntry("Enhancements", path.sidebarName, 2); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Equip Items on Dpad", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DpadEquips")) + .Options(CheckboxOptions().Tooltip( + "Equip items and equipment on the D-Pad. If used with \"D-Pad on Pause Screen\", you must " + "hold C-Up to equip instead of navgiate." + )); + AddWidget(path, "Instant Putaway", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantPutaway")) + .Options(CheckboxOptions().Tooltip( + "Allow Link to put items away without having to wait around." + )); + AddWidget(path, "Instant Boomerang Recall", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastBoomerang")) + .Options(CheckboxOptions().Tooltip( + "Instantly return the boomerang to Link by pressing its item button while " + "it's in the air." + )); + AddWidget(path, "Prevent Dropped Ocarina Inputs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput")) + .Options(CheckboxOptions().Tooltip( + "Prevent dropping inputs when playing the Ocarina too quickly." + )); + AddWidget(path, "Masks", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MMBunnyHood")) + .Options(CheckboxOptions().Tooltip( + "Wearing the Bunny Hood grants a speed increase link in Majora's Mask. " + "The longer jump option is not accounted for in Randomizer logic.\n\n" + "Also disables NPC's reactions to wearing the Bunny Hood." + )); + AddWidget(path, "Masks Equippable as Adult", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AdultMasks")) + .Options(CheckboxOptions().Tooltip( + "Allows masks to be equipped normally from the pause menu as adult." + )); + AddWidget(path, "Persistent Masks", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("PersistentMasks")) + .Options(CheckboxOptions().Tooltip( + "Stops masks from automatically unequipping on certain situations:\n" + "- When entering a new scene\n" + "- When not in any C button or the D-Pad\n" + "- When saving and quitting\n" + "- When dying\n" + "- When traveling thru time (if \"Masks Equippable as Adult\" is activated)." + )); + AddWidget(path, "Mask Select in Inventory", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MaskSelect")) + .Options(CheckboxOptions().Tooltip( + "After completing the mask trading sub-quest, press A and any direction on the mask " + "slog to change masks" + )); + AddWidget(path, "Item Count Messages", WIDGET_SEPARATOR_TEXT); + int numOptions = ARRAY_COUNT(itemCountMessageCVars); + bool allItemCountsChecked = false; + AddWidget(path, "All", WIDGET_CHECKBOX) + .ValuePointer(&allItemCountsChecked) + .PreFunc([](WidgetInfo& info) { + int numOptions = ARRAY_COUNT(itemCountMessageCVars); + *std::get(info.valuePointer) = std::all_of(itemCountMessageCVars, itemCountMessageCVars + numOptions, + [](const char* cvar) { return CVarGetInteger(cvar, 0); }); + }) + .Callback([](WidgetInfo& info) { + int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; + int numOptions = ARRAY_COUNT(itemCountMessageCVars); + std::for_each(itemCountMessageCVars, itemCountMessageCVars + numOptions, + [newValue](const char* cvar) { CVarSetInteger(cvar, newValue); }); + + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + for (int i = 0; i < numOptions; i++) { + AddWidget(path, itemCountMessageOptions[i], WIDGET_CVAR_CHECKBOX) + .CVar(itemCountMessageCVars[i]); + } + path.column = SECTION_COLUMN_2; + AddWidget(path, "Equipment", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Deku Nuts Explode Bombs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NutsExplodeBombs")) + .Options(CheckboxOptions().Tooltip( + "Make Deku Nuts explode Bombs, similar to how they interact with Bombchus. " + "This does not affect Bombflowers." + )); + AddWidget(path, "Equip Multiple Arrows at Once", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SeparateArrows")) + .Options(CheckboxOptions().Tooltip( + "Allow the Bow and Magic Arrows to be equipped at the same time on different slots. " + "NOTE: This will disable the behavior of the 'Equip Dupe' glitch." + )); + AddWidget(path, "Bow and Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BowSlingshotAmmoFix")) + .Options(CheckboxOptions().Tooltip( + "Allows Child to use a Bow with Arrows.\n" + "Allows Adult to use a Slingshot with Seeds.\n\n" + "Requires glitches or the 'Timeless Equipment' cheat to equip." + )); + AddWidget(path, "Better Farore's Wind", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterFarore")) + .Options(CheckboxOptions().Tooltip( + "Helps FW persist between ages, gives Child and Adult separate FW points, and can " + "be used in more places." + )); + AddWidget(path, "Remove Explosive Limit", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RemoveExplosiveLimit")) + .Options(CheckboxOptions().Tooltip( + "Removes the cap of 3 active explosives being deployed at once." + )); + AddWidget(path, "Static Explosion Radius", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("StaticExplosionRadius")) + .Options(CheckboxOptions().Tooltip( + "Explosions are now a static size, like in Majora's Mask and OoT3D. Makes Bombchu " + "hovering much easier." + )); + AddWidget(path, "Prevent Bombchus Forcing Firs-Person", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableFirstPersonChus")) + .Options(CheckboxOptions().Tooltip( + "Prevent Bombchus from forcing the camera into first-person mode when released." + )); + AddWidget(path, "Better Bombchu Shopping", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterBombchuShopping")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a randomizer."; + }) + .Options(CheckboxOptions().Tooltip( + "Bombchus do not sell out when bought, and a 10 pack of Bombchus costs 99 rupees " + "instead of 100." + )); + AddWidget(path, "Aiming Reticle for the Bow/Slingshot", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BowReticle")) + .Options(CheckboxOptions().Tooltip( + "Aiming with a Bow or Slingshot will display a reticle as with the Hookshot " + "when the projectile is ready to fire." + )); + AddWidget(path, "Aim Boomerang in First-Person Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) + .Callback([](WidgetInfo& info) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0)) { + CVarSetInteger(CVAR_ENHANCEMENT("BoomerangReticle"), 0); + } + }) + .Options(CheckboxOptions().Tooltip( + "Change aiming for the Boomerang from Third-Person to First-Person to see past Link's head." + )); + AddWidget(path, "Aiming Reticle for Boomerang", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0) != 0; + }) + .Options(CheckboxOptions().Tooltip( + "Aiming with the Boomerang will display a reticle as with the Hookshot." + )); + AddWidget(path, "Allow Strength Equipement to be Toggled", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ToggleStrength")) + .Callback([](WidgetInfo& info) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("ToggleStrength"), 0)) { + CVarSetInteger(CVAR_ENHANCEMENT("StrengthDisabled"), 0); + } + }) + .Options(CheckboxOptions().Tooltip( + "Allows Strength to be toggled on and off by pressing A on the Strength Upgrade " + "in the Equipment Subscreen of the Pause Menu. This allows performing some glitches " + "that require the player to not have Strength." + )); + // TODO: See if a Callback could be registered to avoid the need to reload scenes for the next two options. + AddWidget(path, "Blue Fire Arrows", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BlueFireArrows")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_BLUE_FIRE_ARROWS).Is(RO_GENERIC_ON); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " + "\"Blue Fire Arrows\" is currently loaded."; + }) + .Options(CheckboxOptions().Tooltip( + "Allows Ice Arrows to melt Red Ice. May require a room reload if toggled during gameplay." + )); + AddWidget(path, "Sunlight Arrows", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SunlightArrows")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SUNLIGHT_ARROWS).Is(RO_GENERIC_ON); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " + "\"Sunlight Arrows\" enabled is currently loaded."; + }) + .Options(CheckboxOptions().Tooltip( + "Allows Light Arrows to activate Sun Switches. May require a room reload if toggled during gameplay." + )); + + // Difficulty Options + path.sidebarName = "Difficulty"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Shooting Gallery", WIDGET_SEPARATOR_TEXT); + auto shootingGalleryDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeShootingGallery"), 0); + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Customize Behavior##Shooting", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeShootingGallery")) + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior")); + AddWidget(path, "Instant Win", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantShootingGalleryWin")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame")); + AddWidget(path, "No Rupee Randomization", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ConstantAdultGallery")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Forces the rupee order to not be randomized as adult, making it the same as child." + )); + AddWidget(path, "Child Starting Ammunition: %d seeds", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ShootingGalleryAmmoChild")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(IntSliderOptions() + .Min(10) + .Max(30) + .DefaultValue(15) + .Format("%d seeds") + .Tooltip( + "The ammunition at the start of the Shooting Gallery minigame as Child." + ) + ); + AddWidget(path, "Adult Starting Ammunition: %d arrows", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ShootingGalleryAmmoAdult")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(IntSliderOptions() + .Min(10) + .Max(30) + .DefaultValue(15) + .Format("%d arrows") + .Tooltip( + "The ammunition at the start of the Shooting Gallery minigame as Adult." + ) + ); + + AddWidget(path, "Bombchu Bowling", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##Bowling", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeBombchuBowling")) + .Options(CheckboxOptions().Tooltip( + "Turn on/off changes to the Bombchu Bowling behavior." + )); + auto bombchuBowlingDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeBombchuBowling"), 0) == 0; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; + }; + AddWidget(path, "Remove Small Cucco", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco")) + .PreFunc(bombchuBowlingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Prevents the small Cucco from appearing in the Bombchu Bowling minigame." + )); + AddWidget(path, "Remove Big Cucco", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoBigCucco")) + .PreFunc(bombchuBowlingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Prevents the big Cucco from appearing in the Bombchu Bowling minigame." + )); + AddWidget(path, "Bombchu Count: %d bombchus", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("BombchuBowlingAmmo")) + .PreFunc(bombchuBowlingDisabledFunc) + .Options(IntSliderOptions() + .Min(3) + .Max(20) + .DefaultValue(10) + .Format("%d bombchus") + .Tooltip("The number of Bombchus available at the start of the Bombchu Bowling minigame.") + ); + + AddWidget(path, "Fishing", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##Fishing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeFishing")) + .Options(CheckboxOptions().Tooltip( + "Turn on/off changes to the Fishing behavior" + )); + auto fishingDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) == 0; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Instant Fishing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantFishing")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "All fish will be caught instantly." + )); + AddWidget(path, "Guarantee Bite", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GuaranteeFishingBite")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "When a line is stable, guarantee bite. Otherwise use Default logic." + )); + AddWidget(path, "Fish Never Escape", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FishNeverEscape")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Once a hook as been set, Fish will never let go while being reeled in." + )); + AddWidget(path, "Loaches Always Appear", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("LoachesAlwaysAppear")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Loaches will always appear in the fishing pond instead of every four visits." + )); + AddWidget(path, "Skip Keep Confirmation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipKeepConfirmation")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "The Pond Owner will not ask to confirm if you want to keep a smaller Fish." + )); + AddWidget(path, "Child Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("MinimumFishWeightChild")) + .PreFunc(fishingDisabledFunc) + .Options(IntSliderOptions() + .Min(3) + .Max(10) + .DefaultValue(10) + .Format("%d lbs.") + .Tooltip( + "The minimum weight for the unique Fishing Reward as a Child." + ) + ); + AddWidget(path, "Adult Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("MinimumFishWeightAdult")) + .PreFunc(fishingDisabledFunc) + .Options(IntSliderOptions() + .Min(6) + .Max(13) + .DefaultValue(13) + .Format("%d lbs.") + .Tooltip( + "The minimum weight for the unique fishing reward as an Adult." + ) + ); + AddWidget(path, "All Fish are Hyrule Loaches", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("AllHyruleLoaches")) + .PreFunc(fishingDisabledFunc) + .Options(IntSliderOptions().Tooltip( + "Every fish in the Fishing Pond will always be a Hyrule Loach.\n\n" + "NOTE: This requires reloading the area." + )); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Lost Woods Ocarina Game", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##LostWoods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeOcarinaGame")) + .Options(CheckboxOptions().Tooltip( + "Turn on/off changes to the Lost Woods Ocarina Game behavior." + )); + auto ocarinaMemoryGameDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 0) == 0; + info.options->disabledTooltip = "This options is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Instant Win##LostWoods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantOcarinaGameWin")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Skips the Lost Woods Ocarina Memory Game." + )); + AddWidget(path, "Note Play Speed: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.NoteSpeed")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(1) + .Max(5) + .DefaultValue(1) + .Format("%dx") + .Tooltip( + "Adjust the speed that the Skull Kids play the notes." + ) + ); + AddWidget(path, "Unlimited Playback Time##LostWoods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("OcarinaUnlimitedFailTime")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Removes the timer to play back the song." + )); + AddWidget(path, "Number of Starting Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(1) + .Max(8) + .DefaultValue(3) + .Format("%d notes") + .Tooltip( + "Adjust the number of notes the Skull Kids play to start the first round." + ) + ); + int roundMin = CVarGetInteger(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 3); + AddWidget(path, "Round One Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(roundMin) + .Max(8) + .DefaultValue(5) + .Format("%d notes") + .Tooltip( + "Adjust the number of notes you need to play to end the first round." + ) + ); + AddWidget(path, "Round Two Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundTwoNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(roundMin) + .Max(8) + .DefaultValue(6) + .Format("%d notes") + .Tooltip( + "Adjust the number of notes you need to play to end the second round." + ) + ); + AddWidget(path, "Round Three Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundThreeNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(roundMin) + .Max(8) + .DefaultValue(8) + .Format("%d notes") + .Tooltip( + "Adjust the number of notes you need to play to end the third round." + ) + ); + + AddWidget(path, "Frogs' Ocarina Game", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##Frogs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame")) + .Options(CheckboxOptions().Tooltip( + "Turn on/off changes to the Frogs' Ocarina Game behavior." + )); + auto frogsOcarinaGameDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) == 0; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Instant Win##Frogs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantFrogsGameWin")) + .PreFunc(frogsOcarinaGameDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Skips the Frogs' Ocarina Game." + )); + AddWidget(path, "Unlimited Playback Time##Frogs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime")) + .PreFunc(frogsOcarinaGameDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Removes the timer to play back the song." + )); + AddWidget(path, "Modify note timer: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("FrogsModifyFailTime")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0); + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off or \"Unlimited Playback Time\" is on"; + }) + .Options(IntSliderOptions() + .Min(1) + .Max(5) + .DefaultValue(1) + .Format("%dx") + .Tooltip( + "Adjusts the time allowed for playback before failing." + ) + ); + + AddWidget(path, "Health", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Permanent Heart Loss", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("PermanentHeartLoss")) + .Callback([](WidgetInfo& info) { + UpdatePermanentHeartLossState(); + }) + .Options(CheckboxOptions().Tooltip( + "When you lose 4 quarters of a heart you will permanently lose that Heart Container.\n\n" + "Disabling this after the fact will restore your Heart Containers." + )); + AddWidget(path, "Damage Multiplier", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("DamageMult")) + .Options(ComboboxOptions() + .ComboMap(allPowers) + .DefaultIndex(0) + .Tooltip( + "Modifies all sources of damage not affected by other sliders\n" + "2x: Can survive all common attacks from the start of the game\n" + "4x: Dies in 1 hit to any substantial attack from the start of the game\n" + "8x: Can only survive trivial damage from the start of the game\n" + "16x: Can survive all common attacks with max health without double defense\n" + "32x: Can survive all common attacks with max health and double defense\n" + "64x: Can survive trivial damage with max health without double defense\n" + "128x: Can survive trivial damage with max health and double defense\n" + "256x: Cannot survive damage" + ) + ); + AddWidget(path, "Fall Damage Multiplier", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("FallDamageMult")) + .Options(ComboboxOptions() + .ComboMap(subPowers) + .Tooltip( + "Modifies all fall damage\n" + "2x: Can survive all fall damage from the start of the game\n" + "4x: Can only survive short fall damage from the start of the game\n" + "8x: Cannot survive any fall damage from the start of the game\n" + "16x: Can survive all fall damage with max health without double defense\n" + "32x: Can survive all fall damage with max health and double defense\n" + "64x: Can survive short fall damage with double defense\n" + "128x: Cannot survive fall damage" + ) + ); + AddWidget(path, "Void Damage Multiplier", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("VoidDamageMult")) + .Options(ComboboxOptions() + .ComboMap(subSubPowers) + .DefaultIndex(0) + .Tooltip( + "Modifies damage taken after falling into a void\n" + "2x: Can survive void damage from the start of the game\n" + "4x: Cannot survive void damage from the start of the game\n" + "8x: Can survive void damage twice with max health without double defense\n" + "16x: Can survive void damage with max health without double defense\n" + "32x: Can survive void damage with max health and double defense\n" + "64x: Cannot survive void damage" + ) + ); + AddWidget(path, "Bonk Damage Multiplier", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("BonkDamageMult")) + .Options(ComboboxOptions() + .ComboMap(bonkDamageValues) + .DefaultIndex(BONK_DAMAGE_NONE) + .Tooltip("Modifies Damage taken after Bonking.") + ); + AddWidget(path, "Spawn with Full Health", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FullHealthSpawn")) + .Options(CheckboxOptions().Tooltip( + "Respawn with Full Health instead of 3 hearts." + )); + AddWidget(path, "No Heart Drops", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NoHeartDrops")) + .Options(CheckboxOptions().Tooltip( + "Disables Heart Drops, but not Heart Placements, like from a Deku Scrub running off.\n" + "This simulates Hero Mode from other games in the series." + )); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Drops", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "No Random Drops", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NoRandomDrops")) + .Options(CheckboxOptions().Tooltip( + "Disables Random Drops, except from the Goron Pot, Dampe, and Bosses." + )); + AddWidget(path, "Enable Bombchu Drops", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnableBombchuDrops")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_GENERIC_ON); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " + "\"Enable Bombchu Drops\" is loaded."; + }) + .Options(CheckboxOptions().Tooltip( + "Bombchus will sometimes drop in place of Bombs." + )); + AddWidget(path, "Trees Drop Sticks", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TreesDropSticks")) + .Options(CheckboxOptions().Tooltip( + "Bonking into Trees will have a chance to drop up to 3 Sticks. Must have obtained sticks previously." + )); + + AddWidget(path, "Miscellaneous", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Delete File on Death", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DeleteFileOnDeath")) + .Options(CheckboxOptions().Tooltip( + "Dying will delete your file.\n\n" + ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE + "\nTHIS IS NOT REVERSABLE\nUSE AT YOUR OWN RISK!" + )); + AddWidget(path, "Hyper Bosses", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HyperBosses")) + .Callback([](WidgetInfo& info) { + UpdateHyperBossesState(); + }) + .Options(CheckboxOptions().Tooltip( + "All Major Bosses move and act twice as fast." + )); + AddWidget(path, "Hyper Enemies", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HyperEnemies")) + .Callback([](WidgetInfo& info) { + UpdateHyperEnemiesState(); + }) + .Options(CheckboxOptions().Tooltip( + "All Regular Enemies and Mini-Bosses move and act twice as fast." + )); + AddWidget(path, "Always Win Goron Pot", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GoronPot")) + .Options(CheckboxOptions().Tooltip( + "Always get the Heart Piece/Purple Rupee from the Spinning Goron Pot." + )); + AddWidget(path, "Always Win Dampe Digging Game", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DampeWin")) + .Options(CheckboxOptions().Tooltip( + "Always win the Heart Piece/Purple Rupee on the first dig in Dampe's Grave Digging game. " + "In a Randomizer file, this is always enabled." + )); + AddWidget(path, "All Dogs are Richard", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AllDogsRichard")) + .Options(CheckboxOptions().Tooltip( + "All dogs can be traded in and will count as Richard." + )); + AddWidget(path, "Cuccos Stay Put Multiplier: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("CuccoStayDurationMult")) + .Options(IntSliderOptions() + .Min(1) + .Max(5) + .DefaultValue(1) + .Format("%dx") + .Tooltip( + "Cuccos will stay in place longer after putting them down, by a multiple of the value of the slider." + ) + ); + AddWidget(path, "Leever Spawn Rate: %d seconds", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("LeeverSpawnRate")) + .Options(IntSliderOptions() + .Min(0) + .Max(10) + .DefaultValue(0) + .Format("%d seconds") + .Tooltip( + "The time between groups of Leevers spawning." + ) + ); + + path.sidebarName = "Extra Modes"; + AddSidebarEntry("Enhancements", path.sidebarName, 2); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Mirrored World", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("MirroredWorldMode")) + .Callback([](WidgetInfo& info) { + if (gPlayState != NULL) { + UpdateMirrorModeState(gPlayState->sceneNum); + } + }) + .Options(ComboboxOptions() + .DefaultIndex(MIRRORED_WORLD_OFF) + .ComboMap(mirroredWorldModes) + .Tooltip( + "Mirrors the world horizontally\n\n" + " - Always: Always mirror the world\n" + " - Random: Randomly decide to mirror the world on each scene change\n" + " - Random (Seeded): Scenes are mirrored based on the current randomizer seed/file\n" + " - Dungeons: Mirror the world in Dungeons\n" + " - Dungeons (Vanilla): Mirror the world in vanilla Dungeons\n" + " - Dungeons (MQ): Mirror the world in MQ Dungeons\n" + " - Dungeons Random: Randomly decide to mirror the world in Dungeons\n" + " - Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file\n" + ) + ); + AddWidget(path, "Randomized Enemy Sizes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RandomizedEnemySizes")) + .Options(CheckboxOptions().Tooltip( + "Enemies and Bosses spawn with random sizes." + )); + AddWidget(path, "Scale Health with Size", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnemySizeScalesHealth")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0) == 0; + }) + .Options(CheckboxOptions().Tooltip( + "Scales normal enemies Health with their randomized size. *This will NOT affect bosses*" + )); + AddWidget(path, "Ivan the Fairy (Coop Mode)", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("IvanCoopModeEnabled")) + .Options(CheckboxOptions().Tooltip( + "Enables Ivan the Fairy upon the next map change. Player 2 can control Ivan and press the C-Buttons to " + "use items and mess with Player 1!" + )); + AddWidget(path, "Rupee Dash Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RupeeDash")) + .Options(CheckboxOptions().Tooltip( + "Rupees reduce over time, Link suffers damage when the count hits 0." + )); + AddWidget(path, "Rupee Dash Interval %d seconds", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("RupeeDashInterval")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0) == 0; + }) + .Options(IntSliderOptions() + .Min(1) + .Max(10) + .DefaultValue(5) + .Format("%d seconds") + .Tooltip( + "Interval between Rupee reduction in Rupee Dash Mode." + ) + ); + AddWidget(path, "Shadow Tag Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ShadowTag")) + .Options(CheckboxOptions().Tooltip( + "A Wallmaster follows Link everywhere, don't get caught!" + )); + AddWidget(path, "Hurt Container Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HurtContainer")) + .Callback([](WidgetInfo& info) { + UpdateHurtContainerModeState(CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)); + }) + .Options(CheckboxOptions().Tooltip( + "Changes Heart Piece and Heart Container functionality.\n\n" + " - Each Heart Container or full Heart Piece reduces Link's Hearts by 1.\n" + " - Can be enabled retroactively after a File has already started." + )); + AddWidget(path, "Additional Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Enabled")) + .Options(CheckboxOptions().Tooltip( + "Enables additional Trap variants." + )); + AddWidget(path, "Trap Options", WIDGET_SEPARATOR_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Tier 1 Traps:", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Freeze Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Ice")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Burn Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Burn")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Shock Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Shock")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Tier 2 Traps:", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Knockback Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Knockback")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Speed Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Speed")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Bomb Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Bomb")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Tier 3 Traps:", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Void Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Void")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Ammo Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Ammo")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Death Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Kill")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + AddWidget(path, "Teleport Traps", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtraTraps.Teleport")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; + }); + path.column = SECTION_COLUMN_2; + AddWidget(path, "Enemy Randomizer", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("RandomizedEnemies")) + .Callback([](WidgetInfo& info) { + GetSelectedEnemies(); + }) + .Options(ComboboxOptions() + .DefaultIndex(ENEMY_RANDOMIZER_OFF) + .ComboMap(enemyRandomizerModes) + .Tooltip( + "Replaces fixed enemies throughout the game with a random enemy. Bosses, mini-bosses and a few specific regular enemies are excluded.\n" + "Enemies that need more than Deku Nuts + either Deku Sticks or a sword to kill are excluded from spawning in \"clear enemy\" rooms.\n\n" + "- Random: Enemies are randomized every time you load a room\n" + "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file\n" + ) + ); + AddWidget(path, "Enemy List", WIDGET_SEPARATOR_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) != ENEMY_RANDOMIZER_RANDOM; + }); + AddWidget(path, "Select All Enemies", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RandomizedEnemyList.All")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) != ENEMY_RANDOMIZER_RANDOM; + }); + AddWidget(path, "Enemy List", WIDGET_SEPARATOR); + for (int i = 0; i < RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE; i++) { + AddWidget(path, enemyNameList[i], WIDGET_CVAR_CHECKBOX) + .CVar(enemyCVarList[i]) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) != ENEMY_RANDOMIZER_RANDOM; + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0) == 1; + info.options->disabledTooltip = "These options are disabled because \"Select All Enemies\" is enabled."; + }) + .Callback([](WidgetInfo& info) { + GetSelectedEnemies(); + }); + } + + // Cheats + path.sidebarName = "Cheats"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Inventory", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Super Tunic", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("SuperTunic")) + .Options(CheckboxOptions().Tooltip( + "Makes every tunic have the effects of every other tunic." + )); + AddWidget(path, "Easy ISG", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EasyISG")) + .Options(CheckboxOptions().Tooltip( + "Passive Infinite Sword Glitch\n" + "It makes your sword's swing effect and hitbox stay active indefinitely." + )); + AddWidget(path, "Easy QPA", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EasyQPA")) + .Options(CheckboxOptions().Tooltip( + "Gives you the glitched damage value of the quick put away glitch." + )); + AddWidget(path, "Timeless Equipment", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("TimelessEquipment")) + .Options(CheckboxOptions().Tooltip( + "Allows any item to be equipped, regardless of age.\n" + "Also allows Child to use Adult strength upgrades." + )); + AddWidget(path, "Unrestricted Items", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("Unrestricted Items")) + .Options(CheckboxOptions().Tooltip( + "Allows you to use any item at any location" + )); + AddWidget(path, "Fireproof Deku Shield", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("FireproofDekuShield")) + .Options(CheckboxOptions().Tooltip( + "Prevents the Deku Shield from burning on contact with fire." + )); + AddWidget(path, "Shield with Two-Handed Weapons", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("ShieldTwoHanded")) + .Options(CheckboxOptions().Tooltip( + "This allows you to put up for shield with any two-handed weapon in hand except for Deku Sticks." + )); + AddWidget(path, "Deku Sticks:", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_CHEAT("DekuStick")) + .Options(ComboboxOptions().ComboMap( + dekuStickCheat + ).DefaultIndex(DEKU_STICK_NORMAL)); + AddWidget(path, "Bomb Timer Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("BombTimerMultiplier")) + .Options(FloatSliderOptions() + .Format("%.2f") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f)); + AddWidget(path, "Hookshot Everything", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("HookshotEverything")) + .Options(CheckboxOptions().Tooltip( + "Makes every surface in the game hookshot-able." + )); + AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("HookshotReachMultiplier")) + .Options(FloatSliderOptions() + .Format("%.2f") + .Min(1.0f) + .Max(5.0f)); + AddWidget(path, "Change Age", WIDGET_BUTTON) + .Options(ButtonOptions().Tooltip("Switches Link's age and reloads the area.")) + .Callback([](WidgetInfo& info){ + SwitchAge(); + }); + AddWidget(path, "Clear Cutscene Pointer", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + GameInteractor::RawAction::ClearCutscenePointer(); + }) + .Options(ButtonOptions().Tooltip( + "Clears the cutscene pointer to a value safe for wrong warps." + )); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Infinite...", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Money", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteMoney")); + AddWidget(path, "Health", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteHealth")); + AddWidget(path, "Ammo", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteAmmo")); + AddWidget(path, "Magic", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteMagic")); + AddWidget(path, "Nayru's Love", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteNayru")); + AddWidget(path, "Epona Boost", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteEponaBoost")); + + AddWidget(path, "Save States", WIDGET_SEPARATOR_TEXT); + AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " WARNING!!!! " ICON_FA_EXCLAMATION_TRIANGLE, WIDGET_TEXT) + .Options(WidgetOptions().Color(Colors::Orange)); + AddWidget(path, + "These are NOT like emulator states. They do not save your game progress " + "and they WILL break across transitions and load zones (like doors). " + "Support for related issues will not be provided.", WIDGET_TEXT + ); + AddWidget(path, "I promise I have read the warning", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("SaveStatePromise")) + .Callback([](WidgetInfo& info) { + CVarSetInteger(CVAR_CHEAT("SaveStatesEnabled"), 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + AddWidget(path, "I understand, enable save states", WIDGET_CVAR_CHECKBOX) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_CHEAT("SaveStatePromise"), 0) == 0; + }) + .CVar(CVAR_CHEAT("SaveStatesEnabled")) + .Options(CheckboxOptions().Tooltip( + "F5 to save, F6 to change slots, F7 to load" + )); + + AddWidget(path, "Behavior", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "No Clip", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoClip")) + .Options(CheckboxOptions().Tooltip("Allows you to walk through walls.")); + AddWidget(path, "Climb Everything", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("ClimbEverything")) + .Options(CheckboxOptions().Tooltip("Makes every surface in the game climbable.")); + AddWidget(path, "Moon Jump on L", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("MoonJumpOnL")) + .Options(CheckboxOptions().Tooltip("Holding L makes you float into the air.")); + AddWidget(path, "New Easy Frame Advancing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EasyFrameAdvance")) + .Options(CheckboxOptions().Tooltip( + "Continue holding START button when unpausing to only advance a single frame and then re-pause." + )); + AddWidget(path, "Drops Don't Despawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("DropsDontDie")) + .Options(CheckboxOptions().Tooltip( + "Drops from enemies, grass, etc. don't disappear after a set amount of time." + )); + AddWidget(path, "Fish Don't Despawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoFishDespawn")) + .Options(CheckboxOptions().Tooltip( + "Prevents fish from automatically despawning after a while when dropped." + )); + AddWidget(path, "Bugs Don't Despawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoBugsDespawn")) + .Options(CheckboxOptions().Tooltip( + "Prevents bugs from automatically despawning after a while when dropped." + )); + AddWidget(path, "Freeze Time", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("FreezeTime")) + .Options(CheckboxOptions().Tooltip("Freezes the time of day")); + AddWidget(path, "Time Sync", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("TimeSync")) + .Options(CheckboxOptions().Tooltip("Syncs the in-game time with the real world time.")); + AddWidget(path, "No ReDead/Gibdo Freeze", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoRedeadFreeze")) + .Options(CheckboxOptions().Tooltip( + "Prevents ReDeads and Gibdos from being able to freeze you with their scream." + )); + AddWidget(path, "Keese/Guay Don't Target You", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoKeeseGuayTarget")) + .Options(CheckboxOptions().Tooltip( + "Keese and Guay no longer target you and simply ignore you as if you were wearing the " + "Skull Mask." + )); + path.column = SECTION_COLUMN_3; + AddWidget(path, "Beta Quest", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Enable Beta Quest", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EnableBetaQuest")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = !isBetaQuestEnabled; + }) + .Callback([](WidgetInfo& info) { + if (CVarGetInteger(CVAR_CHEAT("EnableBetaQuest"), 0) == 0) { + CVarClear(CVAR_CHEAT("BetaQuestWorld")); + } else { + CVarSetInteger(CVAR_CHEAT("BetaQuestWorld"), 0); + } + std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }) + .Options(CheckboxOptions().Tooltip( + "Turns on OoT Beta Quest. *WARNING* This will reset your game." + )); + AddWidget(path, "Beta Quest World: %d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_CHEAT("BetaQuestWorld")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = info.isHidden = CVarGetInteger(CVAR_CHEAT("EnableBetaQuest"), 0) == 0; + }) + .Callback([](WidgetInfo& info) { + std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }) + .Options(IntSliderOptions() + .DefaultValue(0) + .Min(0) + .Max(8) + .Tooltip( + "Set the Beta Quest world to explore. *WARNING* Changing this will reset your game.\n" + "Ctrl+Click to type in a value." + )); + + // Cosmetics Editor + path.sidebarName = "Cosmetics Editor"; + AddSidebarEntry("Enhancements", path.sidebarName, 1); + path.column = SECTION_COLUMN_1; + AddWidget(path, "Popout Cosmetics Editor Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("CosmeticsEditor")) + .WindowName("Cosmetics Editor") + .Options(WindowButtonOptions().Tooltip("Enables the separate Cosmetics Editor Window.")); + + + // Audio Editor + path.sidebarName = "Audio Editor"; + AddSidebarEntry("Enhancements", path.sidebarName, 1); + AddWidget(path, "Popout Audio Editor Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("AudioEditor")) + .WindowName("Audio Editor") + .Options(WindowButtonOptions().Tooltip("Enables the separate Audio Editor Window.")); + + + // Gameplay Stats + path.sidebarName = "Gameplay Stats"; + AddSidebarEntry("Enhancements", path.sidebarName, 2); + AddWidget(path, "Popout Gameplay Stats Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("GameplayStats")) + .WindowName("Gameplay Stats") + .Options(WindowButtonOptions().Tooltip("Enables the separate Gameplay Stats Window.")); + + + // Time Splits + path.sidebarName = "Time Splits"; + AddSidebarEntry("Enhancements", path.sidebarName, 1); + AddWidget(path, "Popout Time Splits Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("TimeSplits")) + .WindowName("Time Splits") + .Options(WindowButtonOptions().Tooltip("Enables the separate Time Splits Window.")); + + + // Timers + path.sidebarName = "Timers"; + AddSidebarEntry("Enhancements", path.sidebarName, 1); + AddWidget(path, "Toggle Timers Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("TimeDisplayEnabled")) + .WindowName("Additional Timers") + .Options(WindowButtonOptions().Tooltip("Enables the separate Additional Timers Window.")); + AddWidget(path, "Font Scale: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_ENHANCEMENT("TimeDisplay.FontScale")) + .Callback([](WidgetInfo& info) { + TimeDisplayInitSettings(); + }) + .Options(FloatSliderOptions() + .Min(1.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .Format("%.2fx") + ); + AddWidget(path, "Hide Background", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeDisplay.ShowWindowBG")) + .Callback([](WidgetInfo& info) { + TimeDisplayInitSettings(); + }); + for (auto& timer : timeDisplayList) { + AddWidget(path, timer.timeLabel, WIDGET_CVAR_CHECKBOX) + .CVar(timer.timeEnable) + .Callback([](WidgetInfo& info) { + TimeDisplayUpdateDisplayOptions(); + }); + } +} + +} // namespace SohGui diff --git a/soh/soh/SohGui/SohMenuNetwork.cpp b/soh/soh/SohGui/SohMenuNetwork.cpp new file mode 100644 index 000000000..29511a9e9 --- /dev/null +++ b/soh/soh/SohGui/SohMenuNetwork.cpp @@ -0,0 +1,148 @@ +#ifdef ENABLE_REMOTE_CONTROL +#include "SohMenu.h" +#include +#include +#include "SohGui.hpp" +#include +#include + +namespace SohGui { + +extern std::shared_ptr mSohMenu; +using namespace UIWidgets; + +void SohMenu::AddMenuNetwork() { + // Add Network Menu + AddMenuEntry("Network", CVAR_SETTING("Menu.NetworkSidebarSection")); + + // Sail + WidgetPath path = { "Network", "Sail", SECTION_COLUMN_1 }; + AddSidebarEntry("Network", path.sidebarName, 3); + + AddWidget(path, "Sail is a networking protocol designed to facilitate remote " + "control of the Ship of Harkinian client. It is intended to " + "be utilized alongside a Sail server, for which we provide a " + "few straightforward implementations on our GitHub. The current " + "implementations available allow integration with Twitch chat " + "and SAMMI Bot, feel free to contribute your own!\n" + "\n" + "Click this button to copy the link to the Sail Github " + "page to your clipboard.", WIDGET_TEXT); + AddWidget(path, ICON_FA_CLIPBOARD "##Sail", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + ImGui::SetClipboardText("https://github.com/HarbourMasters/sail"); + Notification::Emit({ + .message = "Copied to clipboard", + }); + }) + .Options(ButtonOptions() + .Tooltip("https://github.com/HarbourMasters/sail") + ); + AddWidget(path, "Host & Port", WIDGET_CUSTOM) + .CustomFunction([](WidgetInfo& info) { + ImGui::BeginDisabled(Sail::Instance->isEnabled); + ImGui::Text("%s", info.name.c_str()); + CVarInputString("##HostSail", CVAR_REMOTE_SAIL("Host"), InputOptions().Color(THEME_COLOR).PlaceholderText("127.0.0.1").DefaultValue("127.0.0.1").Size(ImVec2(ImGui::GetFontSize() * 15, 0)).LabelPosition(LabelPosition::None)); + ImGui::SameLine(); + ImGui::Text(":"); + ImGui::SameLine(); + CVarInputInt("##PortSail", CVAR_REMOTE_SAIL("Port"), InputOptions().Color(THEME_COLOR).PlaceholderText("43384").DefaultValue("43384").Size(ImVec2(ImGui::GetFontSize() * 5, 0)).LabelPosition(LabelPosition::None)); + ImGui::EndDisabled(); + }); + AddWidget(path, "Enable##Sail", WIDGET_BUTTON) + .PreFunc([](WidgetInfo& info) { + std::string host = CVarGetString(CVAR_REMOTE_SAIL("Host"), "127.0.0.1"); + uint16_t port = CVarGetInteger(CVAR_REMOTE_SAIL("Port"), 43384); + info.options->disabled = !(!SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535); + if (Sail::Instance->isEnabled) { + info.name = "Disable##Sail"; + } else { + info.name = "Enable##Sail"; + } + }) + .Callback([](WidgetInfo& info) { + if (Sail::Instance->isEnabled) { + CVarClear(CVAR_REMOTE_SAIL("Enabled")); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Sail::Instance->Disable(); + } else { + CVarSetInteger(CVAR_REMOTE_SAIL("Enabled"), 1); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Sail::Instance->Enable(); + } + }); + AddWidget(path, "Connecting...##Sail", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = !Sail::Instance->isEnabled; + if (Sail::Instance->isConnected) { + info.name = "Connected##Sail"; + } else { + info.name = "Connecting...##Sail"; + } + }); + + path.sidebarName = "Crowd Control"; + AddSidebarEntry("Network", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Crowd Control is a platform that allows viewers to interact " + "with a streamer's game in real time.\n" + "\n" + "Click the question mark to copy the link to the Crowd Control " + "website to your clipboard.", WIDGET_TEXT); + AddWidget(path, ICON_FA_CLIPBOARD "##CrowdControl", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + ImGui::SetClipboardText("https://crowdcontrol.live"); + Notification::Emit({ + .message = "Copied to clipboard", + }); + }) + .Options(ButtonOptions() + .Tooltip("https://crowdcontrol.live") + ); + AddWidget(path, "Host & Port", WIDGET_CUSTOM) + .CustomFunction([](WidgetInfo& info) { + ImGui::BeginDisabled(CrowdControl::Instance->isEnabled); + ImGui::Text("%s", info.name.c_str()); + CVarInputString("##HostCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Host"), InputOptions().Color(THEME_COLOR).PlaceholderText("127.0.0.1").DefaultValue("127.0.0.1").Size(ImVec2(ImGui::GetFontSize() * 15, 0)).LabelPosition(LabelPosition::None)); + ImGui::SameLine(); + ImGui::Text(":"); + ImGui::SameLine(); + CVarInputInt("##PortCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Port"), InputOptions().Color(THEME_COLOR).PlaceholderText("43384").DefaultValue("43384").Size(ImVec2(ImGui::GetFontSize() * 5, 0)).LabelPosition(LabelPosition::None)); + ImGui::EndDisabled(); + }); + AddWidget(path, "Enable##CrowdControl", WIDGET_BUTTON) + .PreFunc([](WidgetInfo& info) { + std::string host = CVarGetString(CVAR_REMOTE_CROWD_CONTROL("Host"), "127.0.0.1"); + uint16_t port = CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Port"), 43384); + info.options->disabled = !(!SohUtils::IsStringEmpty(host) && port > 1024 && port < 65535); + if (CrowdControl::Instance->isEnabled) { + info.name = "Disable##CrowdControl"; + } else { + info.name = "Enable##CrowdControl"; + } + }) + .Callback([](WidgetInfo& info) { + if (CrowdControl::Instance->isEnabled) { + CVarClear(CVAR_REMOTE_CROWD_CONTROL("Enabled")); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + CrowdControl::Instance->Disable(); + } else { + CVarSetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 1); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + CrowdControl::Instance->Enable(); + } + }); + AddWidget(path, "Connecting...##CrowdControl", WIDGET_TEXT) + .PreFunc([](WidgetInfo& info) { + info.isHidden = !CrowdControl::Instance->isEnabled; + if (CrowdControl::Instance->isConnected) { + info.name = "Connected##CrowdControl"; + } else { + info.name = "Connecting...##CrowdControl"; + } + }); +} + +} // namespace SohGui +#endif \ No newline at end of file diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp new file mode 100644 index 000000000..e6399baab --- /dev/null +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -0,0 +1,133 @@ +#include "SohMenu.h" +#include + +namespace SohGui { + +extern std::shared_ptr mSohMenu; +using namespace UIWidgets; + +void SohMenu::AddMenuRandomizer() { + // Add Randomizer Menu + AddMenuEntry("Randomizer", CVAR_SETTING("Menu.RandomizerSidebarSection")); + + // Seed Settings + WidgetPath path = { "Randomizer", "Seed Settings", SECTION_COLUMN_1 }; + AddSidebarEntry("Randomizer", path.sidebarName, 1); + AddWidget(path, "Popout Randomizer Settings Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("RandomizerSettings")) + .WindowName("Randomizer Settings") + .Options(WindowButtonOptions().Tooltip("Enables the separate Randomizer Settings Window.")); + path.sidebarName = "Enhancements"; + AddSidebarEntry("Randomizer", path.sidebarName, 1); + AddWidget(path, "Rando-Relevant Navi Hints", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi")) + .Options(CheckboxOptions().Tooltip( + "Replace Navi's overworld quest hints with rando-related gameplay hints." + ).DefaultValue(true)); + AddWidget(path, "Random Rupee Names", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames")) + .Options(CheckboxOptions().Tooltip( + "When obtaining Rupees, randomize what the Rupee is called in the textbox." + ).DefaultValue(true)); + AddWidget(path, "Use Custom Key Models", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels")) + .Options(CheckboxOptions().Tooltip( + "Use Custom graphics for Dungeon Keys, Big and Small, so that they can be easily told apart." + ).DefaultValue(true)); + AddWidget(path, "Compass Colors Match Dungeon", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("MatchCompassColors")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = !( + OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_STARTWITH) && + OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_VANILLA) && + OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) + ); + info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without " + "the compass shuffle settings set to Any Dungeon, Overworld, or Anywhere."; + }) + .Options(CheckboxOptions().Tooltip( + "Matches the color of compasses to the dungeon they belong to. " + "This helps identify compasses from afar and adds a little bit of flair.\n\nThis only " + "applies to seeds with compasses shuffled to \"Any Dungeon\", \"Overworld\", or \"Anywhere\"." + ).DefaultValue(true)); + AddWidget(path, "Quest Item Fanfares", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("QuestItemFanfares")) + .Options(CheckboxOptions().Tooltip( + "Play unique fanfares when obtaining quest items (medallions/stones/songs). Note that these " + "fanfares can be longer than usual." + )); + AddWidget(path, "Mysterious Shuffled Items", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle")) + .Options(CheckboxOptions().Tooltip( + "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." + )); + AddWidget(path, "Simpler Boss Soul Models", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("SimplerBossSoulModels")) + .Options(CheckboxOptions().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." + )); + AddWidget(path, "Skip Get Item Animations", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation")) + .Options(ComboboxOptions().ComboMap(skipGetItemAnimationOptions).DefaultIndex(SGIA_JUNK)); + + // Plandomizer + path.sidebarName = "Plandomizer"; + AddSidebarEntry("Randomizer", path.sidebarName, 1); + AddWidget(path, "Popout Plandomizer Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("PlandomizerEditor")) + .WindowName("Plandomizer Editor") + .Options(WindowButtonOptions().Tooltip("Enables the separate Randomizer Settings Window.")); + + // Item Tracker + path.sidebarName = "Item Tracker"; + AddSidebarEntry("Randomizer", path.sidebarName, 1); + + AddWidget(path, "Item Tracker", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Toggle Item Tracker", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("ItemTracker")) + .WindowName("Item Tracker") + .Options(WindowButtonOptions().Tooltip("Toggles the Item Tracker.").EmbedWindow(false)); + + AddWidget(path, "Item Tracker Settings", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Popout Item Tracker Settings", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("ItemTrackerSettings")) + .WindowName("Item Tracker Settings") + .Options(WindowButtonOptions().Tooltip("Enables the separate Item Tracker Settings Window.")); + + // Entrance Tracker + path.sidebarName = "Entrance Tracker"; + AddSidebarEntry("Randomizer", path.sidebarName, 1); + + AddWidget(path, "Entrance Tracker", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Toggle Entrance Tracker", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("EntranceTracker")) + .WindowName("Entrance Tracker") + .Options(WindowButtonOptions().Tooltip("Toggles the Entrance Tracker.").EmbedWindow(false)); + + AddWidget(path, "Entrance Tracker Settings", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Popout Entrance Tracker Settings", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("EntranceTrackerSettings")) + .WindowName("Entrance Tracker Settings") + .Options(WindowButtonOptions().Tooltip("Enables the separate Entrance Tracker Settings Window.")); + + // Check Tracker + path.sidebarName = "Check Tracker"; + AddSidebarEntry("Randomizer", path.sidebarName, 1); + + AddWidget(path, "Check Tracker", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Toggle Check Tracker", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("CheckTracker")) + .WindowName("Check Tracker") + .Options(WindowButtonOptions().Tooltip("Toggles the Check Tracker.").EmbedWindow(false)); + + AddWidget(path, "Check Tracker Settings", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Popout Check Tracker Settings", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("CheckTrackerSettings")) + .WindowName("Check Tracker Settings") + .Options(WindowButtonOptions().Tooltip("Enables the separate Check Tracker Settings Window.")); +} + +} // namespace SohGui diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp new file mode 100644 index 000000000..a9103377b --- /dev/null +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -0,0 +1,373 @@ +#include "SohMenu.h" +#include "soh/Notification/Notification.h" +#include +#include "soh/ResourceManagerHelpers.h" +#include "UIWidgets.hpp" +#include + +extern "C" { +#include "include/z64audio.h" +#include "variables.h" +} + +namespace SohGui { + +extern std::shared_ptr mSohMenu; +using namespace UIWidgets; +static std::unordered_map languages = {{ LANGUAGE_ENG, "English" }, { LANGUAGE_GER, "German" }, { LANGUAGE_FRA, "French" }}; + +const char* 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 SohMenu::AddMenuSettings() { + // Add Settings Menu + AddMenuEntry("Settings", CVAR_SETTING("Menu.SettingsSidebarSection")); + AddSidebarEntry("Settings", "General", 3); + WidgetPath path = { "Settings", "General", SECTION_COLUMN_1 }; + + // General - Settings + AddWidget(path, "Menu Theme", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_SETTING("Menu.Theme")) + .Options(ComboboxOptions() + .Tooltip("Changes the Theme of the Menu Widgets.") + .ComboMap(menuThemeOptions) + .DefaultIndex(Colors::LightBlue)); +#if not defined(__SWITCH__) and not defined(__WIIU__) + AddWidget(path, "Menu Controller Navigation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_IMGUI_CONTROLLER_NAV) + .Options(CheckboxOptions().Tooltip( + "Allows controller navigation of the 2Ship menu (Settings, Enhancements,...)\nCAUTION: " + "This will disable game inputs while the menu is visible.\n\nD-pad to move between " + "items, A to select, B to move up in scope.")); + AddWidget(path, "Cursor Always Visible", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("CursorVisibility")) + .Callback([](WidgetInfo& info) { + Ship::Context::GetInstance()->GetWindow()->SetForceCursorVisibility( + CVarGetInteger(CVAR_SETTING("CursorVisibility"), 0)); + }) + .Options(CheckboxOptions().Tooltip("Makes the cursor always visible, even in full screen.")); +#endif + AddWidget(path, "Search In Sidebar", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("Menu.SidebarSearch")) + .Callback([](WidgetInfo& info) { + if (CVarGetInteger(CVAR_SETTING("Menu.SidebarSearch"), 0)) { + mSohMenu->InsertSidebarSearch(); + } else { + mSohMenu->RemoveSidebarSearch(); + } + }) + .Options(CheckboxOptions().Tooltip( + "Displays the Search menu as a sidebar entry in Settings instead of in the header.")); + AddWidget(path, "Search Input Autofocus", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("Menu.SearchAutofocus")) + .Options(CheckboxOptions().Tooltip( + "Search input box gets autofocus when visible. Does not affect using other widgets.")); + AddWidget(path, "Alt Assets Tab hotkey", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("Mods.AlternateAssetsHotkey")) + .Options( + CheckboxOptions().Tooltip("Allows pressing the Tab key to toggle alternate assets").DefaultValue(true)); + AddWidget(path, "Open App Files Folder", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + std::string filesPath = Ship::Context::GetInstance()->GetAppDirectoryPath(); + SDL_OpenURL(std::string("file:///" + std::filesystem::absolute(filesPath).string()).c_str()); + }) + .Options(ButtonOptions().Tooltip("Opens the folder that contains the save and mods folders, etc.")); + AddWidget(path, "Languages", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Translate Title Screen", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("TitleScreenTranslation")); + AddWidget(path, "Menu Language", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_SETTING("Languages")) + .Options(ComboboxOptions().LabelPosition(LabelPosition::Far).ComponentAlignment(ComponentAlignment::Right).ComboMap(languages).DefaultIndex(LANGUAGE_ENG)); + AddWidget(path, "Accessibility", WIDGET_SEPARATOR_TEXT); + #if defined(_WIN32) || defined(__APPLE__) + AddWidget(path, "Text to Speech", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("A11yTTS")) + .Options(CheckboxOptions().Tooltip("Enables text to speech for in game dialog")); + #endif + AddWidget(path, "Disable Idle Camera Re-Centering", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("A11yDisableIdleCam")) + .Options(CheckboxOptions().Tooltip("Disables the automatic re-centering of the camera when idle.")); + + // General - About + path.column = SECTION_COLUMN_2; + + AddWidget(path, "About", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Ship Of Harkinian", WIDGET_TEXT); + if (gGitCommitTag[0] != 0) { + AddWidget(path, gBuildVersion, WIDGET_TEXT); + } else { + AddWidget(path, ("Branch: " + std::string(gGitBranch)), WIDGET_TEXT); + AddWidget(path, ("Commit: " + std::string(gGitCommitHash)), WIDGET_TEXT); + } + for (uint32_t i = 0; i < ResourceMgr_GetNumGameVersions(); i++) { + AddWidget(path, GetGameVersionString(i), WIDGET_TEXT); + } + + // Audio Settings + path.sidebarName = "Audio"; + path.column = SECTION_COLUMN_1; + AddSidebarEntry("Settings", "Audio", 3); + + AddWidget(path, "Master Volume: %d %%", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SETTING("Volume.Master")) + .Options(IntSliderOptions() + .Min(0) + .Max(100) + .DefaultValue(40) + .ShowButtons(true) + .Format("")); + AddWidget(path, "Main Music Volume: %d %%", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SETTING("Volume.MainMusic")) + .Options(IntSliderOptions() + .Min(0) + .Max(100) + .DefaultValue(100) + .ShowButtons(true) + .Format("")) + .Callback([](WidgetInfo& info) { + Audio_SetGameVolume(SEQ_PLAYER_BGM_MAIN, ((float)CVarGetInteger(CVAR_SETTING("Volume.MainMusic"), 100) / 100.0f)); + }); + AddWidget(path, "Sub Music Volume: %d %%", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SETTING("Volume.SubMusic")) + .Options(IntSliderOptions() + .Min(0) + .Max(100) + .DefaultValue(100) + .ShowButtons(true) + .Format("")) + .Callback([](WidgetInfo& info) { + Audio_SetGameVolume(SEQ_PLAYER_BGM_SUB, ((float)CVarGetInteger(CVAR_SETTING("Volume.SubMusic"), 100) / 100.0f)); + }); + AddWidget(path, "Fanfare Volume: %d %%", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SETTING("Volume.Fanfare")) + .Options(IntSliderOptions() + .Min(0) + .Max(100) + .DefaultValue(100) + .ShowButtons(true) + .Format("")) + .Callback([](WidgetInfo& info) { + Audio_SetGameVolume(SEQ_PLAYER_FANFARE, ((float)CVarGetInteger(CVAR_SETTING("Volume.Fanfare"), 100) / 100.0f)); + }); + AddWidget(path, "Sound Effects Volume: %d %%", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SETTING("Volume.SFX")) + .Options(IntSliderOptions() + .Min(0) + .Max(100) + .DefaultValue(100) + .ShowButtons(true) + .Format("")) + .Callback([](WidgetInfo& info) { + Audio_SetGameVolume(SEQ_PLAYER_SFX, ((float)CVarGetInteger(CVAR_SETTING("Volume.SFX"), 100) / 100.0f)); + }); + AddWidget(path, "Audio API (Needs reload)", WIDGET_AUDIO_BACKEND); + + // Graphics Settings + static int32_t maxFps; + const char* tooltip = ""; + if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { + maxFps = 360; + tooltip = "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is " + "purely visual and does not impact game logic, execution of glitches etc.\n\nA higher target " + "FPS than your monitor's refresh rate will waste resources, and might give a worse result."; + } else { + maxFps = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); + tooltip = "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is " + "purely visual and does not impact game logic, execution of glitches etc."; + } + path.sidebarName = "Graphics"; + AddSidebarEntry("Settings", "Graphics", 3); + AddWidget(path, "Toggle Fullscreen", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SETTING("Fullscreen")) + .Callback([](WidgetInfo& info) { Ship::Context::GetInstance()->GetWindow()->ToggleFullscreen(); }) + .Options(CheckboxOptions().Tooltip("Toggles Fullscreen On/Off.")); + AddWidget(path, "Internal Resolution", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_INTERNAL_RESOLUTION) + .Callback([](WidgetInfo& info) { + Ship::Context::GetInstance()->GetWindow()->SetResolutionMultiplier( + CVarGetFloat(CVAR_INTERNAL_RESOLUTION, 1)); + }) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->disabledMap.at(DISABLE_FOR_ADVANCED_RESOLUTION_ON).active && + mSohMenu->disabledMap.at(DISABLE_FOR_VERTICAL_RES_TOGGLE_ON).active) { + info.activeDisables.push_back(DISABLE_FOR_ADVANCED_RESOLUTION_ON); + info.activeDisables.push_back(DISABLE_FOR_VERTICAL_RES_TOGGLE_ON); + } else if (mSohMenu->disabledMap.at(DISABLE_FOR_LOW_RES_MODE_ON).active) { + info.activeDisables.push_back(DISABLE_FOR_LOW_RES_MODE_ON); + } + }) + .Options( + FloatSliderOptions() + .Tooltip("Multiplies your output resolution by the value inputted, as a more intensive but effective " + "form of anti-aliasing.") + .ShowButtons(false) + .IsPercentage() + .Min(0.5f) + .Max(2.0f)); +#ifndef __WIIU__ + AddWidget(path, "Anti-aliasing (MSAA)", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_MSAA_VALUE) + .Callback([](WidgetInfo& info) { + Ship::Context::GetInstance()->GetWindow()->SetMsaaLevel(CVarGetInteger(CVAR_MSAA_VALUE, 1)); + }) + .Options( + IntSliderOptions() + .Tooltip("Activates MSAA (multi-sample anti-aliasing) from 2x up to 8x, to smooth the edges of " + "rendered geometry.\n" + "Higher sample count will result in smoother edges on models, but may reduce performance.") + .Min(1) + .Max(8) + .DefaultValue(1)); +#endif + auto fps = CVarGetInteger(CVAR_SETTING("InterpolationFPS"), 20); + const char* fpsFormat = fps == 20 ? "Original (%d)" : "%d"; + AddWidget(path, "Current FPS", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_SETTING("InterpolationFPS")) + .Callback([](WidgetInfo& info) { + auto options = std::static_pointer_cast(info.options); + int32_t defaultValue = options->defaultValue; + if (CVarGetInteger(info.cVar, defaultValue) == defaultValue) { + options->format = "Original (%d)"; + } + else { + options->format = "%d"; + } + }) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->disabledMap.at(DISABLE_FOR_MATCH_REFRESH_RATE_ON).active) + info.activeDisables.push_back(DISABLE_FOR_MATCH_REFRESH_RATE_ON); + }) + .Options(IntSliderOptions().Tooltip(tooltip).Min(20).Max(maxFps).DefaultValue(20).Format(fpsFormat)); + AddWidget(path, "Match Refresh Rate", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + int hz = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); + if (hz >= 20 && hz <= 360) { + CVarSetInteger(CVAR_SETTING("InterpolationFPS"), hz); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + }) + .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NOT_DIRECTX).active; }) + .Options(ButtonOptions().Tooltip("Matches interpolation value to the current game's window refresh rate.")); + AddWidget(path, "Match Refresh Rate", WIDGET_CVAR_CHECKBOX) + .CVar("gMatchRefreshRate") + .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_DIRECTX).active; }) + .Options(CheckboxOptions().Tooltip("Matches interpolation value to the current game's window refresh rate.")); + AddWidget(path, "Renderer API (Needs reload)", WIDGET_VIDEO_BACKEND); + AddWidget(path, "Enable Vsync", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_VSYNC_ENABLED) + .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_VSYNC).active; }) + .Options(CheckboxOptions().Tooltip("Enables Vsync.")); + AddWidget(path, "Windowed Fullscreen", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_SDL_WINDOWED_FULLSCREEN) + .PreFunc([](WidgetInfo& info) { + info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_WINDOWED_FULLSCREEN).active; + }) + .Options(CheckboxOptions().Tooltip("Enables Windowed Fullscreen Mode.")); + AddWidget(path, "Allow multi-windows", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENABLE_MULTI_VIEWPORTS) + .PreFunc( + [](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_MULTI_VIEWPORT).active; }) + .Options(CheckboxOptions().Tooltip( + "Allows multiple windows to be opened at once. Requires a reload to take effect.")); + AddWidget(path, "Texture Filter (Needs reload)", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_TEXTURE_FILTER) + .Options(ComboboxOptions().Tooltip("Sets the applied Texture Filtering.").ComboMap(textureFilteringMap)); + + + // Controls + path.sidebarName = "Controls"; + AddSidebarEntry("Settings", "Controls", 2); + AddWidget(path, "Controller Bindings", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Popout Bindings Window", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("ControllerConfiguration")) + .WindowName("Configure Controller") + .Options(WindowButtonOptions().Tooltip("Enables the separate Bindings Window.")); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Input Viewer", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Toggle Input Viewer", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("InputViewer")) + .WindowName("Input Viewer") + .Options(WindowButtonOptions().Tooltip("Toggles the Input Viewer.").EmbedWindow(false)); + + AddWidget(path, "Input Viewer Settings", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Popout Input Viewer Settings", WIDGET_WINDOW_BUTTON) + .CVar(CVAR_WINDOW("InputViewerSettings")) + .WindowName("Input Viewer Settings") + .Options(WindowButtonOptions().Tooltip("Enables the separate Input Viewer Settings Window.")); + + // Notifications + path.sidebarName = "Notifications"; + path.column = SECTION_COLUMN_1; + AddSidebarEntry("Settings", "Notifications", 3); + AddWidget(path, "Position", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_SETTING("Notifications.Position")) + .Options(ComboboxOptions() + .Tooltip("Which corner of the screen notifications appear in.") + .ComboMap(notificationPosition) + .DefaultIndex(3)); + AddWidget(path, "Duration: %.0f seconds", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_SETTING("Notifications.Duration")) + .Options(FloatSliderOptions() + .Tooltip("How long notifications are displayed for.") + .Format("%.1f") + .Step(0.1f) + .Min(3.0f) + .Max(30.0f) + .DefaultValue(10.0f)); + AddWidget(path, "Background Opacity: %.0f%%", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_SETTING("Notifications.BgOpacity")) + .Options(FloatSliderOptions() + .Tooltip("How opaque the background of notifications is.") + .DefaultValue(0.5f) + .IsPercentage()); + AddWidget(path, "Size %.1f", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_SETTING("Notifications.Size")) + .Options(FloatSliderOptions() + .Tooltip("How large notifications are.") + .Format("%.1f") + .Step(0.1f) + .Min(1.0f) + .Max(5.0f) + .DefaultValue(1.8f)); + AddWidget(path, "Test Notification", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { + Notification::Emit({ + .itemIcon = "__OTR__textures/icon_item_24_static/gQuestIconGoldSkulltulaTex", + .prefix = "This", + .message = "is a", + .suffix = "test.", + }); + }) + .Options(ButtonOptions().Tooltip("Displays a test notification.")); +} + +} // namespace SohGui diff --git a/soh/soh/SohGui/SohModals.cpp b/soh/soh/SohGui/SohModals.cpp index 642fedf15..c810d52e6 100644 --- a/soh/soh/SohGui/SohModals.cpp +++ b/soh/soh/SohGui/SohModals.cpp @@ -5,6 +5,7 @@ #include #include #include "UIWidgets.hpp" +#include "SohGui.hpp" #include "soh/OTRGlobals.h" #include "z64.h" @@ -29,6 +30,7 @@ void SohModalWindow::Draw() { } void SohModalWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); if (modals.size() > 0) { SohModal curModal = modals.at(0); if (!ImGui::IsPopupOpen(curModal.title_.c_str())) { @@ -36,6 +38,7 @@ void SohModalWindow::DrawElement() { } if (ImGui::BeginPopupModal(curModal.title_.c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings)) { ImGui::Text("%s", curModal.message_.c_str()); + UIWidgets::PushStyleButton(THEME_COLOR); if (ImGui::Button(curModal.button1_.c_str())) { if (curModal.button1callback_ != nullptr) { curModal.button1callback_(); @@ -43,8 +46,10 @@ void SohModalWindow::DrawElement() { ImGui::CloseCurrentPopup(); modals.erase(modals.begin()); } - ImGui::SameLine(); + UIWidgets::PopStyleButton(); if (curModal.button2_ != "") { + ImGui::SameLine(); + UIWidgets::PushStyleButton(THEME_COLOR); if (ImGui::Button(curModal.button2_.c_str())) { if (curModal.button2callback_ != nullptr) { curModal.button2callback_(); @@ -52,10 +57,12 @@ void SohModalWindow::DrawElement() { ImGui::CloseCurrentPopup(); modals.erase(modals.begin()); } + UIWidgets::PopStyleButton(); } } ImGui::EndPopup(); } + ImGui::PopFont(); } void SohModalWindow::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/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp index 6d9ca7a65..7fbad6705 100644 --- a/soh/soh/SohGui/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -1,836 +1,1139 @@ -// -// UIWidgets.cpp -// soh -// -// Created by David Chavez on 25.08.22. -// - #include "UIWidgets.hpp" - -#include +#define IMGUI_DEFINE_MATH_OPERATORS #include +#include #include - +#include +#include +#include +#include #include -#include "soh/Enhancements/cosmetics/CosmeticsEditor.h" +#include namespace UIWidgets { - // MARK: - Layout Helper - - // Automatically adds newlines to break up text longer than a specified number of characters - // Manually included newlines will still be respected and reset the line length - // If line is midword when it hits the limit, text should break at the last encountered space - std::string WrappedText(const char* text, unsigned int charactersPerLine) { - std::string newText(text); - const size_t tipLength = newText.length(); - int lastSpace = -1; - int currentLineLength = 0; - for (unsigned int currentCharacter = 0; currentCharacter < tipLength; currentCharacter++) { - if (newText[currentCharacter] == '\n') { - currentLineLength = 0; - lastSpace = -1; - continue; - } else if (newText[currentCharacter] == ' ') { - lastSpace = currentCharacter; - } - - if ((currentLineLength >= charactersPerLine) && (lastSpace >= 0)) { - newText[lastSpace] = '\n'; - currentLineLength = currentCharacter - lastSpace - 1; - lastSpace = -1; - } - currentLineLength++; +// Automatically adds newlines to break up text longer than a specified number of characters +// Manually included newlines will still be respected and reset the line length +// If line is midword when it hits the limit, text should break at the last encountered space +std::string WrappedText(const char* text, unsigned int charactersPerLine) { + std::string newText(text); + const size_t tipLength = newText.length(); + int lastSpace = -1; + int currentLineLength = 0; + for (unsigned int currentCharacter = 0; currentCharacter < tipLength; currentCharacter++) { + if (newText[currentCharacter] == '\n') { + currentLineLength = 0; + lastSpace = -1; + continue; + } else if (newText[currentCharacter] == ' ') { + lastSpace = currentCharacter; } - return newText; + if ((currentLineLength >= charactersPerLine) && (lastSpace >= 0)) { + newText[lastSpace] = '\n'; + currentLineLength = currentCharacter - lastSpace - 1; + lastSpace = -1; + } + currentLineLength++; } - std::string WrappedText(const std::string& text, unsigned int charactersPerLine) { - return WrappedText(text.c_str(), charactersPerLine); + return newText; +} + +std::string WrappedText(const std::string& text, unsigned int charactersPerLine) { + return WrappedText(text.c_str(), charactersPerLine); +} + +void PaddedSeparator(bool padTop, bool padBottom, float extraVerticalTopPadding, float extraVerticalBottomPadding) { + if (padTop) { + Spacer(extraVerticalTopPadding); } - - void SetLastItemHoverText(const std::string& text) { - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60).c_str()); - ImGui::EndTooltip(); - } - } - - void SetLastItemHoverText(const char* text) { - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60).c_str()); - ImGui::EndTooltip(); - } - } - - // Adds a "?" next to the previous ImGui item with a custom tooltip - void InsertHelpHoverText(const std::string& text) { - ImGui::SameLine(); - ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60).c_str()); - ImGui::EndTooltip(); - } - } - - void InsertHelpHoverText(const char* text) { - ImGui::SameLine(); - ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60).c_str()); - ImGui::EndTooltip(); - } - } - - - // MARK: - UI Elements - - void Tooltip(const char* text) { - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("%s", WrappedText(text).c_str()); - } - } - - void Spacer(float height) { - ImGui::Dummy(ImVec2(0.0f, height)); - } - - void PaddedSeparator(bool padTop, bool padBottom, float extraVerticalTopPadding, float extraVerticalBottomPadding) { - if (padTop) { - Spacer(extraVerticalTopPadding); - } - ImGui::Separator(); - if (padBottom) { - Spacer(extraVerticalBottomPadding); - } - } - - void RenderCross(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz) { - float thickness = ImMax(sz / 5.0f, 1.0f); - sz -= thickness * 0.5f; - pos += ImVec2(thickness * 0.25f, thickness * 0.25f); - - draw_list->PathLineTo(ImVec2(pos.x, pos.y)); - draw_list->PathLineTo(ImVec2(pos.x + sz, pos.y + sz)); - draw_list->PathStroke(col, 0, thickness); - - draw_list->PathLineTo(ImVec2(pos.x + sz, pos.y)); - draw_list->PathLineTo(ImVec2(pos.x, pos.y + sz)); - draw_list->PathStroke(col, 0, thickness); - } - - bool CustomCheckbox(const char* label, bool* v, bool disabled, CheckboxGraphics disabledGraphic, bool renderCrossWhenOff) { - ImGuiWindow* window = ImGui::GetCurrentWindow(); - if (window->SkipItems) { - return false; - } - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); - - const float square_sz = ImGui::GetFrameHeight(); - const ImVec2 pos = window->DC.CursorPos; - const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); - ImGui::ItemSize(total_bb, style.FramePadding.y); - if (!ImGui::ItemAdd(total_bb, id)) { - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); - return false; - } - - bool hovered, held; - bool pressed = ImGui::ButtonBehavior(total_bb, id, &hovered, &held); - if (pressed) { - *v = !(*v); - ImGui::MarkItemEdited(id); - } - - const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); - ImGui::RenderNavHighlight(total_bb, id); - ImGui::RenderFrame(check_bb.Min, check_bb.Max, ImGui::GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); - ImU32 check_col = ImGui::GetColorU32(ImGuiCol_CheckMark); - ImU32 cross_col = ImGui::GetColorU32(ImVec4(0.50f, 0.50f, 0.50f, 1.00f)); - bool mixed_value = (g.LastItemData.ItemFlags & ImGuiItemFlags_MixedValue) != 0; - if (mixed_value) { - // Undocumented tristate/mixed/indeterminate checkbox (#2644) - // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) - ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); - window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); - } else if ((!disabled && *v) || (disabled && disabledGraphic == CheckboxGraphics::Checkmark)) { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); - ImGui::RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); - } else if ((!disabled && !*v && renderCrossWhenOff) || (disabled && disabledGraphic == CheckboxGraphics::Cross)) { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); - //RenderCross(window->DrawList, check_bb.Min + ImVec2(pad, pad), disabled ? cross_col : check_col, square_sz - pad * 2.0f); // Caused confusion as to status - } - - ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); - if (g.LogEnabled) { - ImGui::LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]"); - } - if (label_size.x > 0.0f) { - ImGui::RenderText(label_pos, label); - } - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); - return pressed; - } - - bool CustomCheckboxTristate(const char* label, int* v, bool disabled, CheckboxGraphics disabledGraphic) { - bool ret; - if (*v == 0) { - bool b = false; - ret = CustomCheckbox(label, &b, disabled, disabledGraphic, true); - if (ret) { - *v = 1; - } - } else if (*v == 1) { - ImGui::PushItemFlag(ImGuiItemFlags_MixedValue, true); - bool b = true; - ret = CustomCheckbox(label, &b, disabled, disabledGraphic, true); - if (ret) { - *v = 2; - } - ImGui::PopItemFlag(); - } else if (*v == 2) { - bool b = true; - ret = CustomCheckbox(label, &b, disabled, disabledGraphic, true); - if (ret) { - *v = 0; - } - } else { - SPDLOG_INFO("Invalid CheckBoxTristate value: {}", *v); - *v = 0; - return false; - } - return ret; - } - - void ReEnableComponent(const char* disabledTooltipText) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && strcmp(disabledTooltipText, "") != 0) { - ImGui::SetTooltip("%s", disabledTooltipText); - } - // End of disable region of previous component - ImGui::PopStyleVar(1); - ImGui::PopItemFlag(); - } - - void DisableComponent(const float alpha) { - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha); - } - - bool EnhancementCheckbox(const char* text, const char* cvarName, bool disabled, const char* disabledTooltipText, CheckboxGraphics disabledGraphic, bool defaultValue) { - bool changed = false; - if (disabled) { - DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - bool val = (bool)CVarGetInteger(cvarName, defaultValue); - if (CustomCheckbox(text, &val, disabled, disabledGraphic)) { - CVarSetInteger(cvarName, val); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - ShipInit::Init(cvarName); - changed = true; - } - - if (disabled) { - ReEnableComponent(disabledTooltipText); - } - return changed; - } - - bool EnhancementCheckboxTristate(const char* text, const char* cvarName, bool disabled, const char* disabledTooltipText, CheckboxGraphics disabledGraphic, bool defaultValue) { - bool changed = false; - if (disabled) { - DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - int val = CVarGetInteger(cvarName, defaultValue); - if (CustomCheckboxTristate(text, &val, disabled, disabledGraphic)) { - CVarSetInteger(cvarName, val); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - changed = true; - } - - if (disabled) { - ReEnableComponent(disabledTooltipText); - } - return changed; - } - - bool PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop, bool padBottom, bool disabled, const char* disabledTooltipText, CheckboxGraphics disabledGraphic, bool defaultValue) { - ImGui::BeginGroup(); - if (padTop) Spacer(0); - - bool changed = EnhancementCheckbox(text, cvarName, disabled, disabledTooltipText, disabledGraphic, defaultValue); - - if (padBottom) Spacer(0); - ImGui::EndGroup(); - return changed; - } - - bool EnhancementCombobox(const char* cvarName, std::span comboArray, uint8_t defaultIndex, bool disabled, const char* disabledTooltipText, uint8_t disabledValue) { - bool changed = false; - if (defaultIndex <= 0) { - defaultIndex = 0; - } - - if (disabled) { - DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - uint8_t selected = CVarGetInteger(cvarName, defaultIndex); - std::string comboName = std::string("##") + std::string(cvarName); - if (ImGui::BeginCombo(comboName.c_str(), comboArray[selected])) { - for (uint8_t i = 0; i < comboArray.size(); i++) { - if (strlen(comboArray[i]) > 0) { - if (ImGui::Selectable(comboArray[i], i == selected)) { - CVarSetInteger(cvarName, i); - selected = i; - changed = true; - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - ShipInit::Init(cvarName); - } - } - } - ImGui::EndCombo(); - } - - if (disabled) { - ReEnableComponent(disabledTooltipText); - - if (disabledValue >= 0 && selected != disabledValue) { - CVarSetInteger(cvarName, disabledValue); - changed = true; - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - } - - return changed; - } - - bool LabeledRightAlignedEnhancementCombobox(const char* label, const char* cvarName, std::span comboArray, uint8_t defaultIndex, bool disabled, const char* disabledTooltipText, uint8_t disabledValue) { - ImGui::Text("%s", label); - s32 currentValue = CVarGetInteger(cvarName, defaultIndex); - -#ifdef __WIIU__ - ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(comboArray[currentValue]).x + 40.0f)); - ImGui::PushItemWidth(ImGui::CalcTextSize(comboArray[currentValue]).x + 60.0f); -#else - ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(comboArray[currentValue]).x + 20.0f)); - ImGui::PushItemWidth(ImGui::CalcTextSize(comboArray[currentValue]).x + 30.0f); -#endif - - bool changed = EnhancementCombobox(cvarName, comboArray, defaultIndex, disabled, disabledTooltipText, disabledValue); - - ImGui::PopItemWidth(); - return changed; - } - - void PaddedText(const char* text, bool padTop, bool padBottom) { - if (padTop) Spacer(0); - - ImGui::Text("%s", text); - - if (padBottom) Spacer(0); - } - - bool EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue, bool PlusMinusButton, bool disabled, const char* disabledTooltipText) { - bool changed = false; - int val = CVarGetInteger(cvarName, defaultValue); - const int oldVal = val; - - if (disabled) { - DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - ImGui::Text(text, val); - Spacer(0); - - ImGui::BeginGroup(); - if (PlusMinusButton) { - std::string MinusBTNName = " - ##" + std::string(cvarName); - if (ImGui::Button(MinusBTNName.c_str())) { - val--; - changed = true; - } - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - } - - ImGui::PushItemWidth(std::min((ImGui::GetContentRegionAvail().x - (PlusMinusButton ? sliderButtonWidth : 0.0f)), maxSliderWidth)); - if (ImGui::SliderInt(id, &val, min, max, format, ImGuiSliderFlags_AlwaysClamp)) - { - changed = true; - } - ImGui::PopItemWidth(); - - if (PlusMinusButton) { - std::string PlusBTNName = " + ##" + std::string(cvarName); - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::Button(PlusBTNName.c_str())) { - val++; - changed = true; - } - } - ImGui::EndGroup(); - - if (disabled) { - ReEnableComponent(disabledTooltipText); - } - - if (val < min) { - val = min; - changed = true; - } - - if (val > max) { - val = max; - changed = true; - } - - if (changed && (oldVal != val)) { - CVarSetInteger(cvarName, val); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - ShipInit::Init(cvarName); - } else { - changed = false; - } - - return changed; - } - - bool EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton, bool disabled, const char* disabledTooltipText) { - bool changed = false; - float val = CVarGetFloat(cvarName, defaultValue); - const float oldVal = val; - if (disabled) { - DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - } - - // Calculate how much precision to save based on the given range of the slider, limited to 6 decimal places - // Precision is also used when adding/subtracting using the +/- buttons - const float sliderWidth = std::min((ImGui::GetContentRegionAvail().x - 2.0f * (PlusMinusButton ? sliderButtonWidth : 0.0f)), maxSliderWidth); - const float diff = (max - min) / sliderWidth; - int ticks = 0; - float increment = 1.0f; - if (diff < 1.0f) { - ticks++; - increment = 0.1f; - } - if (diff < 0.1f) { - ticks++; - increment = 0.01f; - } - if (diff < 0.01f) { - ticks++; - increment = 0.001f; - } - if (diff < 0.001f) { - ticks++; - increment = 0.0001f; - } - if (diff < 0.0001f) { - ticks++; - increment = 0.00001f; - } - if (diff < 0.00001f) { - ticks++; - increment = 0.000001f; - } - - if (!isPercentage) { - ImGui::Text(text, val); - } else { - ImGui::Text(text, val * 100.0f); - } - Spacer(0); - - ImGui::BeginGroup(); - if (PlusMinusButton) { - std::string MinusBTNName = " - ##" + std::string(cvarName); - if (ImGui::Button(MinusBTNName.c_str())) { - val -= increment; - changed = true; - } - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - } - - ImGui::PushItemWidth(sliderWidth); - if (ImGui::SliderFloat(id, &val, min, max, format, ImGuiSliderFlags_AlwaysClamp)) { - changed = true; - } - ImGui::PopItemWidth(); - - if (PlusMinusButton) { - std::string PlusBTNName = " + ##" + std::string(cvarName); - ImGui::SameLine(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 7.0f); - if (ImGui::Button(PlusBTNName.c_str())) { - val += increment; - changed = true; - } - } - ImGui::EndGroup(); - - if (disabled) { - ReEnableComponent(disabledTooltipText); - } - - if (val < min) { - val = min; - changed = true; - } - - if (val > max) { - val = max; - changed = true; - } - - if (changed && !(abs(oldVal - val) < 0.000001f)) { - std::stringstream ss; - ss << std::setprecision(ticks + 1) << std::setiosflags(std::ios_base::fixed) << val; - val = std::stof(ss.str()); - CVarSetFloat(cvarName, val); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } else { - changed = false; - } - - return changed; - } - - bool PaddedEnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue, bool PlusMinusButton, bool padTop, bool padBottom, bool disabled, const char* disabledTooltipText) { - bool changed = false; - ImGui::BeginGroup(); - if (padTop) Spacer(0); - - changed = EnhancementSliderInt(text, id, cvarName, min, max, format, defaultValue, PlusMinusButton, disabled, disabledTooltipText); - - if (padBottom) Spacer(0); - ImGui::EndGroup(); - return changed; - } - - bool PaddedEnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton, bool padTop, bool padBottom, bool disabled, const char* disabledTooltipText) { - bool changed = false; - ImGui::BeginGroup(); - if (padTop) Spacer(0); - - changed = EnhancementSliderFloat(text, id, cvarName, min, max, format, defaultValue, isPercentage, PlusMinusButton, disabled, disabledTooltipText); - - if (padBottom) Spacer(0); - ImGui::EndGroup(); - return changed; - } - - bool EnhancementRadioButton(const char* text, const char* cvarName, int id) { - /*Usage : - EnhancementRadioButton("My Visible Name",CVAR_GROUP("MyCVarName"), MyID); - First arg is the visible name of the Radio button - Second is the cvar name where MyID will be saved. - Note: the CVar name should be the same to each Buddies. - Example : - EnhancementRadioButton("English", CVAR_SETTING("Languages"), LANGUAGE_ENG); - EnhancementRadioButton("German", CVAR_SETTING("Languages"), LANGUAGE_GER); - EnhancementRadioButton("French", CVAR_SETTING("Languages"), LANGUAGE_FRA); - */ - std::string make_invisible = "##" + std::string(text) + std::string(cvarName); - - bool ret = false; - int val = CVarGetInteger(cvarName, 0); - if (ImGui::RadioButton(make_invisible.c_str(), id == val)) { - CVarSetInteger(cvarName, id); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - ret = true; - } - ImGui::SameLine(); - ImGui::Text("%s", text); - - return ret; - } - - bool DrawResetColorButton(const char* cvarName, ImVec4* colors, ImVec4 defaultcolors, bool has_alpha) { - bool changed = false; - std::string Cvar_RBM = std::string(cvarName) + "RBM"; - std::string MakeInvisible = "Reset##" + std::string(cvarName) + "Reset"; - if (ImGui::Button(MakeInvisible.c_str())) { - colors->x = defaultcolors.x; - colors->y = defaultcolors.y; - colors->z = defaultcolors.z; - colors->w = has_alpha ? defaultcolors.w : 255.0f; - - Color_RGBA8 colorsRGBA; - colorsRGBA.r = defaultcolors.x; - colorsRGBA.g = defaultcolors.y; - colorsRGBA.b = defaultcolors.z; - colorsRGBA.a = has_alpha ? defaultcolors.w : 255.0f; - - CVarSetColor(cvarName, colorsRGBA); - CVarSetInteger(Cvar_RBM.c_str(), 0); //On click disable rainbow mode. - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - changed = true; - } - Tooltip("Revert colors to the game's original colors (GameCube version)\nOverwrites previously chosen color"); - return changed; - } - - bool DrawRandomizeColorButton(const char* cvarName, ImVec4* colors) { - bool changed = false; - Color_RGBA8 NewColors = {0,0,0,255}; - std::string Cvar_RBM = std::string(cvarName) + "RBM"; - std::string FullName = "Random##" + std::string(cvarName) + "Random"; - if (ImGui::Button(FullName.c_str())) { -#if defined(__SWITCH__) || defined(__WIIU__) - srand(time(NULL)); -#endif - ImVec4 color = GetRandomValue(); - colors->x = color.x; - colors->y = color.y; - colors->z = color.z; - NewColors.r = fmin(fmax(colors->x * 255, 0), 255); - NewColors.g = fmin(fmax(colors->y * 255, 0), 255); - NewColors.b = fmin(fmax(colors->z * 255, 0), 255); - CVarSetColor(cvarName, NewColors); - CVarSetInteger(Cvar_RBM.c_str(), 0); // On click disable rainbow mode. - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - changed = true; - } - Tooltip("Chooses a random color\nOverwrites previously chosen color"); - return changed; - } - - void DrawLockColorCheckbox(const char* cvarName) { - std::string Cvar_Lock = std::string(cvarName) + "Lock"; - s32 lock = CVarGetInteger(Cvar_Lock.c_str(), 0); - std::string FullName = "Lock##" + Cvar_Lock; - EnhancementCheckbox(FullName.c_str(), Cvar_Lock.c_str()); - Tooltip("Prevents this color from being changed upon selecting \"Randomize all\""); - } - - void RainbowColor(const char* cvarName, ImVec4* colors) { - std::string Cvar_RBM = std::string(cvarName) + "RBM"; - std::string MakeInvisible = "Rainbow##" + std::string(cvarName) + "Rainbow"; - - EnhancementCheckbox(MakeInvisible.c_str(), Cvar_RBM.c_str()); - Tooltip("Cycles through colors on a timer\nOverwrites previously chosen color"); - } - - void LoadPickersColors(ImVec4& ColorArray, const char* cvarname, const ImVec4& default_colors, bool has_alpha) { - Color_RGBA8 defaultColors; - defaultColors.r = default_colors.x; - defaultColors.g = default_colors.y; - defaultColors.b = default_colors.z; - defaultColors.a = default_colors.w; - - Color_RGBA8 cvarColor = CVarGetColor(cvarname, defaultColors); - - ColorArray.x = cvarColor.r / 255.0; - ColorArray.y = cvarColor.g / 255.0; - ColorArray.z = cvarColor.b / 255.0; - ColorArray.w = cvarColor.a / 255.0; - } - - bool EnhancementColor(const char* text, const char* cvarName, ImVec4 ColorRGBA, ImVec4 default_colors, bool allow_rainbow, bool has_alpha, bool TitleSameLine) { - bool changed = false; - LoadPickersColors(ColorRGBA, cvarName, default_colors, has_alpha); - - ImGuiColorEditFlags flags = ImGuiColorEditFlags_None; - - if (!TitleSameLine) { - ImGui::Text("%s", text); - flags = ImGuiColorEditFlags_NoLabel; - } - - ImGui::PushID(cvarName); - - if (!has_alpha) { - if (ImGui::ColorEdit3(text, (float*)&ColorRGBA, flags)) - { - Color_RGBA8 colors; - colors.r = ColorRGBA.x * 255.0; - colors.g = ColorRGBA.y * 255.0; - colors.b = ColorRGBA.z * 255.0; - colors.a = 255.0; - - CVarSetColor(cvarName, colors); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - changed = true; - } - } - else - { - flags |= ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_AlphaPreview; - if (ImGui::ColorEdit4(text, (float*)&ColorRGBA, flags)) - { - Color_RGBA8 colors; - colors.r = ColorRGBA.x * 255.0; - colors.g = ColorRGBA.y * 255.0; - colors.b = ColorRGBA.z * 255.0; - colors.a = ColorRGBA.w * 255.0; - - CVarSetColor(cvarName, colors); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - changed = true; - } - } - - ImGui::PopID(); - - //ImGui::SameLine(); // Removing that one to gain some width spacing on the HUD editor - ImGui::PushItemWidth(-FLT_MIN); - if (DrawResetColorButton(cvarName, &ColorRGBA, default_colors, has_alpha)) { - changed = true; - } - ImGui::SameLine(); - if (DrawRandomizeColorButton(cvarName, &ColorRGBA)) { - changed = true; - } - if (allow_rainbow) { - if (ImGui::GetContentRegionAvail().x > 185) { - ImGui::SameLine(); - } - RainbowColor(cvarName, &ColorRGBA); - } - DrawLockColorCheckbox(cvarName); - ImGui::NewLine(); - ImGui::PopItemWidth(); - - return changed; - } - - void DrawFlagArray32(const std::string& name, uint32_t& flags) { - ImGui::PushID(name.c_str()); - for (int32_t flagIndex = 0; flagIndex < 32; flagIndex++) { - if ((flagIndex % 8) != 0) { - ImGui::SameLine(); - } - ImGui::PushID(flagIndex); - uint32_t bitMask = 1 << flagIndex; - bool flag = (flags & bitMask) != 0; - if (ImGui::Checkbox("##check", &flag)) { - if (flag) { - flags |= bitMask; - } else { - flags &= ~bitMask; - } - } - ImGui::PopID(); - } - ImGui::PopID(); - } - - void DrawFlagArray16(const std::string& name, uint16_t& flags) { - ImGui::PushID(name.c_str()); - for (int16_t flagIndex = 0; flagIndex < 16; flagIndex++) { - if ((flagIndex % 8) != 0) { - ImGui::SameLine(); - } - ImGui::PushID(flagIndex); - uint16_t bitMask = 1 << flagIndex; - bool flag = (flags & bitMask) != 0; - if (ImGui::Checkbox("##check", &flag)) { - if (flag) { - flags |= bitMask; - } else { - flags &= ~bitMask; - } - } - ImGui::PopID(); - } - ImGui::PopID(); - } - - void DrawFlagArray8(const std::string& name, uint8_t& flags) { - ImGui::PushID(name.c_str()); - for (int8_t flagIndex = 0; flagIndex < 8; flagIndex++) { - if ((flagIndex % 8) != 0) { - ImGui::SameLine(); - } - ImGui::PushID(flagIndex); - uint8_t bitMask = 1 << flagIndex; - bool flag = (flags & bitMask) != 0; - if (ImGui::Checkbox("##check", &flag)) { - if (flag) { - flags |= bitMask; - } else { - flags &= ~bitMask; - } - } - ImGui::PopID(); - } - ImGui::PopID(); - } - - bool StateButtonEx(const char* str_id, const char* label, ImVec2 size, ImGuiButtonFlags flags) { - ImGuiContext& g = *GImGui; - ImGuiWindow* window = ImGui::GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImGuiStyle& style = g.Style; - const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); - - const ImGuiID id = window->GetID(str_id); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - const float default_size = ImGui::GetFrameHeight(); - ImGui::ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f); - if (!ImGui::ItemAdd(bb, id)) - return false; - - if (g.LastItemData.ItemFlags & ImGuiItemFlags_ButtonRepeat) { - ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat, true); - } - - bool hovered, held; - bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, flags); - - if (g.LastItemData.ItemFlags & ImGuiItemFlags_ButtonRepeat) { - ImGui::PopItemFlag(); // ImGuiItemFlags_ButtonRepeat; - } - - // Render - const ImU32 bg_col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive - : hovered ? ImGuiCol_ButtonHovered - : ImGuiCol_Button); - //const ImU32 text_col = ImGui::GetColorU32(ImGuiCol_Text); - ImGui::RenderNavHighlight(bb, id); - ImGui::RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding); - ImGui::RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, {0.55f, 0.45f}, &bb); - /*ImGui::RenderArrow(window->DrawList, - bb.Min + - ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), - text_col, dir);*/ - - IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); - return pressed; - } - - bool StateButton(const char* str_id, const char* label) { - float sz = ImGui::GetFrameHeight(); - return StateButtonEx(str_id, label, ImVec2(sz, sz), ImGuiButtonFlags_None); - } - - // Reference: imgui-src/misc/cpp/imgui_stdlib.cpp - int InputTextResizeCallback(ImGuiInputTextCallbackData* data) { - std::string* value = (std::string*)data->UserData; - if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { - value->resize(data->BufTextLen); - data->Buf = (char*)value->c_str(); - } - return 0; - } - - bool InputString(const char* label, std::string* value) { - return ImGui::InputText(label, (char*)value->c_str(), value->capacity() + 1, ImGuiInputTextFlags_CallbackResize, InputTextResizeCallback, value); + ImGui::Separator(); + if (padBottom) { + Spacer(extraVerticalBottomPadding); } } + +void Tooltip(const char* text) { + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", WrappedText(text).c_str()); + } +} + +void PushStyleMenu(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(color.x, color.y, color.z, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_PopupBg, ColorValues.at(Colors::DarkGray)); + ImGui::PushStyleColor(ImGuiCol_Border, ColorValues.at(Colors::DarkGray)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8.0f, 15.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 3.0f); +} + +void PushStyleMenu(Colors color) { + PushStyleMenu(ColorValues.at(color)); +} + +void PopStyleMenu() { + ImGui::PopStyleVar(2); + ImGui::PopStyleColor(4); +} + +bool BeginMenu(const char* label, Colors color) { + bool dirty = false; + PushStyleMenu(color); + ImGui::SetNextWindowSizeConstraints(ImVec2(200.0f, 0.0f), ImVec2(FLT_MAX, FLT_MAX)); + if (ImGui::BeginMenu(label)) { + dirty = true; + } + PopStyleMenu(); + return dirty; +} + +void PushStyleMenuItem(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, color); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(20.0f, 15.0f)); +} + +void PushStyleMenuItem(Colors color) { + PushStyleMenuItem(ColorValues.at(color)); +} + +void PopStyleMenuItem() { + ImGui::PopStyleVar(1); + ImGui::PopStyleColor(1); +} + +bool MenuItem(const char* label, const char* shortcut, Colors color) { + bool dirty = false; + PushStyleMenuItem(color); + if (ImGui::MenuItem(label, shortcut)) { + dirty = true; + } + PopStyleMenuItem(); + return dirty; +} + +void PushStyleButton(const ImVec4& color, const ImVec2 padding) { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, padding); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); +} + +void PushStyleButton(Colors color, ImVec2 padding) { + PushStyleButton(ColorValues.at(color), padding); +} + +void PopStyleButton() { + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(4); +} + +void PushStyleInput(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 6.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); +} + +void PushStyleInput(Colors color) { + PushStyleInput(ColorValues.at(color)); +} + +void PopStyleInput() { + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(7); +} + +void PushStyleHeader(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(color.x, color.y, color.z, 0.6f)); +} + +void PushStyleHeader(Colors color) { + PushStyleHeader(ColorValues.at(color)); +} + +void PopStyleHeader() { + ImGui::PopStyleColor(3); +} + +bool Button(const char* label, const ButtonOptions& options) { + ImGui::BeginDisabled(options.disabled); + PushStyleButton(options.color, options.padding); + bool dirty = ImGui::Button(label, options.size); + PopStyleButton(); + ImGui::EndDisabled(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + return dirty; +} + +bool WindowButton(const char* label, const char* cvarName, std::shared_ptr windowPtr, + const WindowButtonOptions& options) { + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0, 0)); + std::string buttonText = label; + bool dirty = false; + if (CVarGetInteger(cvarName, 0)) { + buttonText = ICON_FA_WINDOW_CLOSE " " + buttonText; + } else { + buttonText = ICON_FA_EXTERNAL_LINK_SQUARE " " + buttonText; + } + if (Button(buttonText.c_str(), {{ options.tooltip, options.disabled, options.disabledTooltip, options.color }, + options.size, options.padding })) { + windowPtr->ToggleVisibility(); + dirty = true; + } + ImGui::PopStyleVar(); + return dirty; +} + +void PushStyleCheckbox(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); + ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(1.0f, 1.0f, 1.0f, 0.7f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 6.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 5.0f); +} + +void PushStyleCheckbox(Colors color) { + PushStyleCheckbox(ColorValues.at(color)); +} + +void PopStyleCheckbox() { + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(5); +} + +void Spacer(float height) { + ImGui::Dummy(ImVec2(0.0f, height)); +} + +void Separator(bool padTop, bool padBottom, float extraVerticalTopPadding, float extraVerticalBottomPadding) { + if (padTop) { + Spacer(extraVerticalTopPadding); + } + ImGui::Separator(); + if (padBottom) { + Spacer(extraVerticalBottomPadding); + } +} + +// Adds a "?" next to the previous ImGui item with a custom tooltip +void InsertHelpHoverText(const std::string& text) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("%s", WrappedText(text, 60).c_str()); + ImGui::EndTooltip(); + } +} + +void InsertHelpHoverText(const char* text) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("%s", WrappedText(text, 60).c_str()); + ImGui::EndTooltip(); + } +} + +void RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash) { + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Hide anything after a '##' string + const char* text_display_end; + if (hide_text_after_hash) { + text_display_end = ImGui::FindRenderedTextEnd(text, text_end); + } else { + if (!text_end) + text_end = text + strlen(text); // FIXME-OPT + text_display_end = text_end; + } + + if (text != text_display_end) { + window->DrawList->AddText(g.Font, g.FontSize, pos, ImGui::GetColorU32(ImGuiCol_Text), text, text_display_end); + if (g.LogEnabled) + ImGui::LogRenderedText(&pos, text, text_display_end); + } +} + +bool Checkbox(const char* _label, bool* value, const CheckboxOptions& options) { + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGui::BeginDisabled(options.disabled); + + bool above = options.labelPosition == LabelPosition::Above; + bool lpFar = options.labelPosition == LabelPosition::Far; + bool right = options.alignment == ComponentAlignment::Right; + bool none = options.labelPosition == LabelPosition::None; + + std::string labelStr = (none ? "##" : ""); + labelStr.append(_label); + + const char* label = labelStr.c_str(); + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); + const float square_sz = ImGui::GetFrameHeight(); + ImVec2 pos = window->DC.CursorPos; + + if (right) { + float labelOffsetX = (above ? 0 : (style.ItemInnerSpacing.x * 2.0f) + square_sz); + if (!lpFar) { + pos.x += ImGui::GetContentRegionAvail().x - (label_size.x + labelOffsetX); + } + } + float bbAboveX = lpFar ? ImGui::GetContentRegionAvail().x + : (label_size.x + (above ? 0 : (style.ItemInnerSpacing.x * 2.0f) + square_sz)); + float bbAboveY = label_size.y + (above ? square_sz : 0) + (style.FramePadding.y * 2.0f); + const ImRect total_bb(pos, pos + ImVec2(bbAboveX, bbAboveY)); + + ImGui::ItemSize(total_bb, style.FramePadding.y); + if (!ImGui::ItemAdd(total_bb, id)) { + ImGui::EndDisabled(); + return false; + } + bool hovered, held, pressed; + pressed = ImGui::ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) { + *value = !(*value); + ImGui::MarkItemEdited(id); + } + PushStyleCheckbox(options.color); + ImVec2 checkPos = pos; + ImVec2 labelPos = pos; + if (options.labelPosition == LabelPosition::Above) { + checkPos.y += label_size.y + (style.ItemInnerSpacing.y * 2.0f); + } else { + labelPos.y += (square_sz / 2) - (label_size.y / 2); + } + if (options.alignment == ComponentAlignment::Right) { + checkPos.x = total_bb.Max.x - square_sz; + } else { + float labelFarOffset = ImGui::GetContentRegionAvail().x - label_size.x; + float labelOffsetX = above ? 0 : (lpFar ? labelFarOffset : (style.ItemInnerSpacing.x * 2.0f) + square_sz); + labelPos.x += labelOffsetX; + } + const ImRect check_bb(checkPos, checkPos + ImVec2(square_sz, square_sz)); + ImGui::RenderNavHighlight(total_bb, id); + ImGui::RenderFrame(check_bb.Min, check_bb.Max, + ImGui::GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive + : hovered ? ImGuiCol_FrameBgHovered + : ImGuiCol_FrameBg), + true, style.FrameRounding); + ImU32 check_col = ImGui::GetColorU32(ImGuiCol_CheckMark); + bool mixed_value = (g.LastItemData.ItemFlags & ImGuiItemFlags_MixedValue) != 0; + if (mixed_value) { + // Undocumented tristate/mixed/indeterminate checkbox (#2644) + // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all + // widgets (not just checkbox) + ImVec2 pad(ImMax(1.0f, IM_TRUNC(square_sz / 3.6f)), ImMax(1.0f, IM_TRUNC(square_sz / 3.6f))); + window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); + } else if (*value) { + const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f)); + ImGui::RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); + } + RenderText(labelPos, label, ImGui::FindRenderedTextEnd(label), true); + PopStyleCheckbox(); + ImGui::EndDisabled(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + return pressed; +} + +bool CVarCheckbox(const char* label, const char* cvarName, const CheckboxOptions& options) { + bool dirty = false; + bool value = (bool)CVarGetInteger(cvarName, options.defaultValue); + if (Checkbox(label, &value, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; +} + +bool StateButton(const char* str_id, const char* label, ImVec2 size, ButtonOptions options, ImGuiButtonFlags flags) { + + ImGuiContext& g = *GImGui; + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) { + return false; + } + + const ImGuiStyle& style = g.Style; + const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); + + const ImGuiID id = window->GetID(str_id); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + const float default_size = ImGui::GetFrameHeight(); + ImGui::ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f); + if (!ImGui::ItemAdd(bb, id)) + return false; + + if (g.LastItemData.ItemFlags & ImGuiItemFlags_ButtonRepeat) { + ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat, true); + } + + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, flags); + + if (g.LastItemData.ItemFlags & ImGuiItemFlags_ButtonRepeat) { + ImGui::PopItemFlag(); // ImGuiItemFlags_ButtonRepeat; + } + PushStyleButton(options.color); + // Render + const ImU32 bg_col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive + : hovered ? ImGuiCol_ButtonHovered + : ImGuiCol_Button); + //const ImU32 text_col = ImGui::GetColorU32(ImGuiCol_Text); + ImGui::RenderNavHighlight(bb, id); + ImGui::RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding); + ImGui::RenderTextClipped(bb.Min + (style.FramePadding * 0.35f), bb.Max - (style.FramePadding / 4), label, NULL, &label_size, style.ButtonTextAlign, &bb); + PopStyleButton(); + /*ImGui::RenderArrow(window->DrawList, + bb.Min + + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), + text_col, dir);*/ + + IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); + return pressed; +} + +float CalcComboWidth(const char* preview_value, ImGuiComboFlags flags) { + ImGuiContext& g = *GImGui; + + const ImGuiStyle& style = g.Style; + IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together + if (flags & ImGuiComboFlags_WidthFitPreview) + IM_ASSERT((flags & (ImGuiComboFlags_NoPreview | (ImGuiComboFlags)ImGuiComboFlags_CustomPreview)) == 0); + + const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : ImGui::GetFrameHeight(); + const float preview_width = ImGui::CalcTextSize(preview_value, NULL, true).x; + float w = arrow_size + preview_width + (style.FramePadding.x * 2.0f); + return w; +} + +void PushStyleCombobox(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(color.x, color.y, color.z, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 6.0f)); +} + +void PushStyleCombobox(Colors color) { + PushStyleCombobox(ColorValues.at(color)); +} + +void PopStyleCombobox() { + ImGui::PopStyleVar(4); + ImGui::PopStyleColor(9); +} + +void PushStyleTabs(const ImVec4& color) { + ImGui::PushStyleColor(ImGuiCol_Tab, ImVec4(color.x, color.y, color.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_TabHovered, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_TabActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(color.x, color.y, color.z, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(color.x, color.y, color.z, 0.6f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 6.0f)); +} + +void PushStyleTabs(Colors color) { + PushStyleTabs(ColorValues.at(color)); +} + +void PopStyleTabs() { + ImGui::PopStyleColor(6); + ImGui::PopStyleVar(4); +} + +void PushStyleSlider(Colors color_) { + const ImVec4& color = ColorValues.at(color_); + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(color.x, color.y, color.z, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrab, ImVec4(1.0, 1.0, 1.0, 0.4f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrabActive, ImVec4(1.0, 1.0, 1.0, 0.5f)); + ImGui::PushStyleVar(ImGuiStyleVar_GrabRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 8.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); +} + +void PopStyleSlider() { + ImGui::PopStyleVar(4); + ImGui::PopStyleColor(6); +} + +bool SliderInt(const char* label, int32_t* value, const IntSliderOptions& options) { + bool dirty = false; + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleSlider(options.color); + float width = (options.size == ImVec2(0,0)) ? ImGui::GetContentRegionAvail().x : options.size.x; + if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { + width = width - (ImGui::CalcTextSize(label).x + ImGui::GetStyle().FramePadding.x); + } + ImGui::AlignTextToFramePadding(); + if (options.alignment == ComponentAlignment::Right) { + ImGui::Text(label, *value); + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label, *value); + } + } + if (options.showButtons) { + if (Button("-", ButtonOptions{ .color = options.color }.Size(Sizes::Inline)) && *value > options.min) { + *value -= options.step; + if (options.clamp) { + if (*value < options.min) { + *value = options.min; + } + } + dirty = true; + } + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(width - (ImGui::CalcTextSize("+").x + ImGui::GetStyle().FramePadding.x * 2 + 3) * 2); + } else { + ImGui::SetNextItemWidth(width); + } + if (ImGui::SliderScalar(invisibleLabel, ImGuiDataType_S32, value, &options.min, &options.max, options.format, + options.flags)) { + if (options.clamp) { + if (*value < options.min) { + *value = options.min; + } + if (*value > options.max) + *value = options.max; + } + dirty = true; + } + if (options.showButtons) { + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (Button("+", ButtonOptions{ .color = options.color }.Size(Sizes::Inline)) && *value < options.max) { + *value += options.step; + if (options.clamp) { + if (*value > options.max) + *value = options.max; + } + dirty = true; + } + } + + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text(label, *value); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x); + ImGui::Text(label, *value); + } + } + PopStyleSlider(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; +} + +bool CVarSliderInt(const char* label, const char* cvarName, const IntSliderOptions& options) { + bool dirty = false; + int32_t value = CVarGetInteger(cvarName, options.defaultValue); + if (SliderInt(label, &value, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; +} + +void ClampFloat(float* value, float min, float max, float step) { + int ticks = 0; + float increment = 1.0f; + if (step < 1.0f) { + ticks++; + increment = 0.1f; + } + if (step < 0.1f) { + ticks++; + increment = 0.01f; + } + if (step < 0.01f) { + ticks++; + increment = 0.001f; + } + if (step < 0.001f) { + ticks++; + increment = 0.0001f; + } + if (step < 0.0001f) { + ticks++; + increment = 0.00001f; + } + if (step < 0.00001f) { + ticks++; + increment = 0.000001f; + } + int factor = 1 * std::pow(10, ticks); + if (*value < min) { + *value = min; + } else if (*value > max) { + *value = max; + } else { + int trunc = (int)std::round(*value * factor); + *value = (float)trunc / factor; + } +} + +bool SliderFloat(const char* label, float* value, const FloatSliderOptions& options) { + bool dirty = false; + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + float valueToDisplay = options.isPercentage ? *value * 100.0f : *value; + float maxToDisplay = options.isPercentage ? options.max * 100.0f : options.max; + float minToDisplay = options.isPercentage ? options.min * 100.0f : options.min; + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleSlider(options.color); + float labelSpacing = ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x; + float width = (options.size == ImVec2(0, 0)) ? ImGui::GetContentRegionAvail().x : options.size.x; + if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { + width = width - (ImGui::CalcTextSize(label).x + ImGui::GetStyle().FramePadding.x); + } + ImGui::AlignTextToFramePadding(); + if (options.alignment == ComponentAlignment::Right) { + ImGui::Text(label, *value); + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + } else if (options.labelPosition == LabelPosition::Near) { + width -= labelSpacing; + ImGui::SameLine(); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + width -= labelSpacing; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label, *value); + } + } + if (options.showButtons) { + if (Button("-", ButtonOptions{ .color = options.color }.Size(Sizes::Inline)) && *value > options.min) { + *value -= options.step; + if (options.clamp) { + ClampFloat(value, options.min, options.max, options.step); + } + dirty = true; + } + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(width - (ImGui::CalcTextSize("+").x + ImGui::GetStyle().FramePadding.x * 2 + 3) * 2); + } else { + ImGui::SetNextItemWidth(width); + } + if (ImGui::SliderScalar(invisibleLabel, ImGuiDataType_Float, &valueToDisplay, &minToDisplay, &maxToDisplay, + options.format, options.flags)) { + *value = options.isPercentage ? valueToDisplay / 100.0f : valueToDisplay; + if (options.clamp) { + ClampFloat(value, options.min, options.max, options.step); + } + dirty = true; + } + if (options.showButtons) { + ImGui::SameLine(0, 3.0f); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (Button("+", ButtonOptions{ .color = options.color }.Size(Sizes::Inline)) && *value < options.max) { + *value += options.step; + if (options.clamp) { + ClampFloat(value, options.min, options.max, options.step); + } + dirty = true; + } + } + + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text(label, *value); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - labelSpacing); + ImGui::Text(label, *value); + } + } + PopStyleSlider(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; +} + +bool CVarSliderFloat(const char* label, const char* cvarName, const FloatSliderOptions& options) { + bool dirty = false; + float value = CVarGetFloat(cvarName, options.defaultValue); + if (SliderFloat(label, &value, options)) { + CVarSetFloat(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; +} + +int InputTextResizeCallback(ImGuiInputTextCallbackData* data) { + std::string* value = (std::string*)data->UserData; + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { + value->resize(data->BufTextLen); + data->Buf = (char*)value->c_str(); + } + return 0; +} + +bool InputString(const char* label, std::string* value, const InputOptions& options) { + bool dirty = false; + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleInput(options.color); + float width = (options.size == ImVec2(0, 0)) ? ImGui::GetContentRegionAvail().x : options.size.x; + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label, *value->c_str()); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(width - ImGui::CalcTextSize(label).x); + ImGui::Text(label, *value->c_str()); + } + } + ImGui::SetNextItemWidth(width); + if (ImGui::InputText(label, (char*)value->c_str(), value->capacity() + 1, ImGuiInputTextFlags_CallbackResize, InputTextResizeCallback, value)) { + dirty = true; + } + if (value->empty() && !options.placeholder.empty()) { + ImGui::SameLine(17.0f); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "%s", options.placeholder.c_str()); + } + PopStyleInput(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; +} + +bool CVarInputString(const char* label, const char* cvarName, const InputOptions& options) { + bool dirty = false; + std::string value = CVarGetString(cvarName, options.defaultValue.c_str()); + if (InputString(label, &value, options)) { + CVarSetString(cvarName, value.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; +} + +bool InputInt(const char* label, int32_t* value, const InputOptions& options) { + bool dirty = false; + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleInput(options.color); + float width = (options.size == ImVec2(0, 0)) ? ImGui::GetContentRegionAvail().x : options.size.x; + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label, *value); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(width - ImGui::CalcTextSize(label).x); + ImGui::Text(label, *value); + } + } + ImGui::SetNextItemWidth(width); + if (ImGui::InputScalar(label, ImGuiDataType_S32, value)) { + dirty = true; + } + if ((ImGui::GetItemStatusFlags() & ImGuiItemStatusFlags_Edited) && !options.placeholder.empty()) { + ImGui::SameLine(17.0f); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "%s", options.placeholder.c_str()); + } + PopStyleInput(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && + !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; +} + +bool CVarInputInt(const char* label, const char* cvarName, const InputOptions& options) { + bool dirty = false; + int32_t defaultValue = std::stoi(options.defaultValue); + int32_t value = CVarGetInteger(cvarName, defaultValue); + if (InputInt(label, &value, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; +} + +bool CVarColorPicker(const char* label, const char* cvarName, Color_RGBA8 defaultColor, bool hasAlpha, uint8_t modifiers, UIWidgets::Colors themeColor) { + std::string valueCVar = std::string(cvarName) + ".Value"; + std::string rainbowCVar = std::string(cvarName) + ".Rainbow"; + std::string lockedCVar = std::string(cvarName) + ".Locked"; + Color_RGBA8 color = CVarGetColor(valueCVar.c_str(), defaultColor); + ImVec4 colorVec = ImVec4(color.r / 255.0f, color.g / 255.0f, color.b / 255.0f, color.a / 255.0f); + bool changed = false; + bool showReset = modifiers & ColorPickerResetButton; + bool showRandom = modifiers & ColorPickerRandomButton; + bool showRainbow = modifiers & ColorPickerRainbowCheck; + bool showLock = modifiers & ColorPickerLockCheck; + bool locked = CVarGetInteger(lockedCVar.c_str(), 0); + ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoInputs; + ImGui::BeginDisabled(locked); + PushStyleCombobox(UIWidgets::Colors::DarkGray); + if (hasAlpha) { + changed = ImGui::ColorEdit4(label, (float*)&colorVec, flags | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_AlphaPreview); + } else { + changed = ImGui::ColorEdit3(label, (float*)&colorVec, flags | ImGuiColorEditFlags_NoAlpha); + } + PopStyleCombobox(); + ImGui::AlignTextToFramePadding(); + if (showReset) { + ImGui::SameLine(); + std::string uniqueTag = "Reset##" + std::string(label); + if (UIWidgets::Button(uniqueTag.c_str(), UIWidgets::ButtonOptions({{ .tooltip = "Resets this color to its default value" }} ).Color(themeColor).Size(UIWidgets::Sizes::Inline))) { + CVarClearBlock(valueCVar.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + } + if (showRandom) { + ImGui::SameLine(); + std::string uniqueTag = "Random##" + std::string(label); + if (UIWidgets::Button(uniqueTag.c_str(), UIWidgets::ButtonOptions({{ .tooltip = "Generates a random color value to use" }}).Color(themeColor).Size(UIWidgets::Sizes::Inline))) { + colorVec = GetRandomValue(); + color.r = fmin(fmax(colorVec.x * 255, 0), 255); + color.g = fmin(fmax(colorVec.y * 255, 0), 255); + color.b = fmin(fmax(colorVec.z * 255, 0), 255); + CVarSetColor(valueCVar.c_str(), color); + CVarSetInteger(rainbowCVar.c_str(), 0); // On click disable rainbow mode. + ShipInit::Init(rainbowCVar.c_str()); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + } + } + if (showRainbow) { + ImGui::SameLine(); + std::string uniqueTag = "Rainbow##" + std::string(cvarName) + "Rainbow"; + + UIWidgets::CVarCheckbox(uniqueTag.c_str(), rainbowCVar.c_str(), UIWidgets::CheckboxOptions({{ .tooltip = "Cycles through colors on a timer\nOverwrites previously chosen color" }}).Color(themeColor)); + } + ImGui::EndDisabled(); + if (showLock) { + ImGui::SameLine(); + std::string uniqueTag = "Lock##" + std::string(cvarName) + "Locked"; + + UIWidgets::CVarCheckbox(uniqueTag.c_str(), lockedCVar.c_str(), UIWidgets::CheckboxOptions({{ .tooltip = "Prevents this color from being changed" }}).Color(themeColor)); + } + if (changed) { + color.r = (uint8_t)(colorVec.x * 255.0f); + color.g = (uint8_t)(colorVec.y * 255.0f); + color.b = (uint8_t)(colorVec.z * 255.0f); + color.a = (uint8_t)(colorVec.w * 255.0f); + CVarSetColor(valueCVar.c_str(), color); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(valueCVar.c_str()); + changed = true; + } + + return changed; +} + +bool RadioButton(const char* label, bool active, const RadioButtonsOptions& options) { + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); + + const float square_sz = ImGui::GetFrameHeight(); + const ImVec2 pos = window->DC.CursorPos; + const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); + const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); + ImGui::ItemSize(total_bb, style.FramePadding.y); + if (!ImGui::ItemAdd(total_bb, id)) + return false; + + ImVec2 center = check_bb.GetCenter(); + center.x = IM_ROUND(center.x); + center.y = IM_ROUND(center.y); + const float radius = (square_sz - 1.0f) * 0.5f; + + bool hovered, held; + bool pressed = ImGui::ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + ImGui::MarkItemEdited(id); + + ImGui::RenderNavCursor(total_bb, id); + const int num_segment = window->DrawList->_CalcCircleAutoSegmentCount(radius); + window->DrawList->AddCircleFilled(center, radius, ImGui::GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), num_segment); + if (active) + { + const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f)); + window->DrawList->AddCircleFilled(center, radius - pad, ImGui::GetColorU32(ImGuiCol_CheckMark)); + } + + if (style.FrameBorderSize > 0.0f) + { + window->DrawList->AddCircle(center + ImVec2(1, 1), radius, ImGui::GetColorU32(ImGuiCol_BorderShadow), num_segment, style.FrameBorderSize); + window->DrawList->AddCircle(center, radius, ImGui::GetColorU32(ImGuiCol_Border), num_segment, style.FrameBorderSize); + } + + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); + if (g.LogEnabled) + ImGui::LogRenderedText(&label_pos, active ? "(x)" : "( )"); + if (label_size.x > 0.0f) + RenderText(label_pos, label, ImGui::FindRenderedTextEnd(label), true); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + +bool CVarRadioButton(const char* text, const char* cvarName, int32_t id, const RadioButtonsOptions& options) { + std::string make_invisible = "##" + std::string(text) + std::string(cvarName); + + bool ret = false; + int val = CVarGetInteger(cvarName, 0); + PushStyleCheckbox(options.color); + if (ImGui::RadioButton(make_invisible.c_str(), id == val)) { + CVarSetInteger(cvarName, id); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ret = true; + } + ImGui::SameLine(); + ImGui::Text("%s", text); + PopStyleCheckbox(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + + return ret; +} + +void DrawFlagArray32(const std::string& name, uint32_t& flags, Colors color) { + ImGui::PushID(name.c_str()); + for (int32_t flagIndex = 0; flagIndex < 32; flagIndex++) { + if ((flagIndex % 8) != 0) { + ImGui::SameLine(); + } + ImGui::PushID(flagIndex); + uint32_t bitMask = 1 << flagIndex; + bool flag = (flags & bitMask) != 0; + PushStyleCheckbox(color); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); + std::string id = fmt::format("##{}{}", name, flagIndex); + if (ImGui::Checkbox(id.c_str(), &flag)) { + if (flag) { + flags |= bitMask; + } else { + flags &= ~bitMask; + } + } + ImGui::PopStyleVar(); + PopStyleCheckbox(); + ImGui::PopID(); + } + ImGui::PopID(); +} + +void DrawFlagArray16(const std::string& name, uint16_t& flags, Colors color) { + ImGui::PushID(name.c_str()); + for (int16_t flagIndex = 0; flagIndex < 16; flagIndex++) { + if ((flagIndex % 8) != 0) { + ImGui::SameLine(); + } + ImGui::PushID(flagIndex); + uint16_t bitMask = 1 << flagIndex; + bool flag = (flags & bitMask) != 0; + PushStyleCheckbox(color); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); + std::string id = fmt::format("##{}{}", name, flagIndex); + if (ImGui::Checkbox(id.c_str(), &flag)) { + if (flag) { + flags |= bitMask; + } else { + flags &= ~bitMask; + } + } + ImGui::PopStyleVar(); + PopStyleCheckbox(); + ImGui::PopID(); + } + ImGui::PopID(); +} + +void DrawFlagArray8(const std::string& name, uint8_t& flags, Colors color) { + ImGui::PushID(name.c_str()); + for (int8_t flagIndex = 0; flagIndex < 8; flagIndex++) { + if ((flagIndex % 8) != 0) { + ImGui::SameLine(); + } + ImGui::PushID(flagIndex); + uint8_t bitMask = 1 << flagIndex; + bool flag = (flags & bitMask) != 0; + PushStyleCheckbox(color); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); + std::string id = fmt::format("##{}{}", name, flagIndex); + if (ImGui::Checkbox(id.c_str(), &flag)) { + if (flag) { + flags |= bitMask; + } else { + flags &= ~bitMask; + } + } + ImGui::PopStyleVar(); + PopStyleCheckbox(); + ImGui::PopID(); + } + ImGui::PopID(); +} + +void DrawFlagArray8Mask(const std::string& name, uint8_t& flags, Colors color) { + ImGui::PushID(name.c_str()); + for (int8_t flagIndex = 0; flagIndex < 8; flagIndex++) { + if ((flagIndex % 8) != 0) { + ImGui::SameLine(); + } + ImGui::PushID(flagIndex); + uint8_t bitMask = 1 << flagIndex; + bool flag = (flags & bitMask) != 0; + PushStyleCheckbox(color); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); + std::string id = fmt::format("##{}{}", name, flagIndex); + if (ImGui::Checkbox(id.c_str(), &flag)) { + if (flag) { + flags |= bitMask; + } else { + flags &= ~bitMask; + } + } + ImGui::PopStyleVar(); + PopStyleCheckbox(); + ImGui::PopID(); + } + ImGui::PopID(); +} +} // namespace UIWidgets + +ImVec4 GetRandomValue() { +#if !defined(__SWITCH__) && !defined(__WIIU__) + std::random_device rd; + std::mt19937 rng(rd()); +#else + size_t seed = std::hash{}(std::to_string(rand())); + std::mt19937_64 rng(seed); +#endif + std::uniform_int_distribution dist(0, 255 - 1); + + ImVec4 NewColor; + NewColor.x = (float)(dist(rng)) / 255.0f; + NewColor.y = (float)(dist(rng)) / 255.0f; + NewColor.z = (float)(dist(rng)) / 255.0f; + return NewColor; +} + +Color_RGBA8 RGBA8FromVec(ImVec4 vec) { + Color_RGBA8 color = { vec.x * 255, vec.y * 255, vec.z * 255, vec.w * 255 }; + return color; +} + +ImVec4 VecFromRGBA8(Color_RGBA8 color) { + ImVec4 vec = { color.r / 255.0f, color.g / 255.0f, color.b / 255.0f, color.a / 255.0f }; + return vec; +} diff --git a/soh/soh/SohGui/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp index 97a367270..ebf483194 100644 --- a/soh/soh/SohGui/UIWidgets.hpp +++ b/soh/soh/SohGui/UIWidgets.hpp @@ -1,16 +1,21 @@ -#ifndef UIWidgets_hpp -#define UIWidgets_hpp +#ifndef UIWidgets2_hpp +#define UIWidgets2_hpp #include -#include #include #include #include +#define IMGUI_DEFINE_MATH_OPERATORS #include +#include +#include +#include "soh/ShipUtils.h" #include "soh/ShipInit.hpp" namespace UIWidgets { + using SectionFunc = void(*)(); + struct TextFilters { static int FilterNumbers(ImGuiInputTextCallbackData* data) { if (data->EventChar < 256 && strchr("1234567890", (char)data->EventChar)) { @@ -26,74 +31,963 @@ namespace UIWidgets { } return 1; } + }; + + std::string WrappedText(const char* text, unsigned int charactersPerLine = 80); + std::string WrappedText(const std::string& text, unsigned int charactersPerLine = 80); + void PaddedSeparator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, float extraVerticalBottomPadding = 0.0f); + void Tooltip(const char* text); + + typedef enum ColorPickerModifiers { + ColorPickerResetButton = 1, + ColorPickerRandomButton = 2, + ColorPickerRainbowCheck = 4, + ColorPickerLockCheck = 8, + } ColorPickerModifiers; + + // mostly in order for colors usable by the menu without custom text color + enum Colors { + Red, + DarkRed, + Orange, + Green, + DarkGreen, + LightBlue, + Blue, + DarkBlue, + Indigo, + Violet, + Purple, + Brown, + Gray, + DarkGray, + // not suitable for menu theme use + Pink, + Yellow, + Cyan, + Black, + LightGray, + White, + NoColor + }; + + enum InputTypes { + String, + Scalar + }; + + const std::unordered_map ColorValues = { + { Colors::Pink, ImVec4(0.87f, 0.3f, 0.87f, 1.0f) }, + { Colors::Red, ImVec4(0.55f, 0.0f, 0.0f, 1.0f) }, + { Colors::DarkRed, ImVec4(0.3f, 0.0f, 0.0f, 1.0f) }, + { Colors::Orange, ImVec4(0.85f, 0.55f, 0.0f, 1.0f) }, + { Colors::Yellow, ImVec4(0.95f, 0.95f, 0.0f, 1.0f) }, + { Colors::Green, ImVec4(0.0f, 0.55f, 0.0f, 1.0f) }, + { Colors::DarkGreen, ImVec4(0.0f, 0.3f, 0.0f, 1.0f) }, + { Colors::Cyan, ImVec4(0.0f, 0.9f, 0.9f, 1.0f) }, + { Colors::LightBlue, ImVec4(0.0f, 0.24f, 0.8f, 1.0f) }, + { Colors::Blue, ImVec4(0.08f, 0.03f, 0.65f, 1.0f) }, + { Colors::DarkBlue, ImVec4(0.03f, 0.0f, 0.5f, 1.0f) }, + { Colors::Indigo, ImVec4(0.35f, 0.0f, 0.87f, 1.0f) }, + { Colors::Violet, ImVec4(0.5f, 0.0f, 0.9f, 1.0f) }, + { Colors::Purple, ImVec4(0.31f, 0.0f, 0.67f, 1.0f) }, + { Colors::Brown, ImVec4(0.37f, 0.18f, 0.0f, 1.0f) }, + { Colors::LightGray, ImVec4(0.75f, 0.75f, 0.75f, 1.0f) }, + { Colors::Gray, ImVec4(0.45f, 0.45f, 0.45f, 1.0f) }, + { Colors::DarkGray, ImVec4(0.15f, 0.15f, 0.15f, 1.0f) }, + { Colors::Black, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)}, + { Colors::White, ImVec4(1.0f, 1.0f, 1.0f, 1.0f) }, + { Colors::NoColor, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)}, + }; + + namespace Sizes { + const ImVec2 Inline = ImVec2(0.0f, 0.0f); + const ImVec2 Fill = ImVec2(-1.0f, 0.0f); + } + + enum LabelPosition { + Near, + Far, + Above, + None, + Within, + }; + + enum ComponentAlignment { + Left, + Right, + }; + + struct WidgetOptions{ + const char* tooltip = ""; + bool disabled = false; + const char* disabledTooltip = ""; + Colors color = Colors::NoColor; + + WidgetOptions& Color(Colors color_) { + color = color = color_; + return *this; + } + WidgetOptions& Tooltip(const char* tooltip_) { + tooltip = tooltip_; + return *this; + } + WidgetOptions& Disabled(bool disabled_) { + disabled = disabled_; + return *this; + } + WidgetOptions& DisabledTooltip(const char* disabledTooltip_) { + disabledTooltip = disabledTooltip_; + return *this; + } + }; + + struct ButtonOptions : WidgetOptions { + ImVec2 size = Sizes::Fill; + ImVec2 padding = ImVec2(10.0f, 8.0f); + Colors color = Colors::Gray; + + ButtonOptions& Size(ImVec2 size_) { + size = size_; + return *this; + } + ButtonOptions& Padding(ImVec2 padding_) { + padding = padding_; + return *this; + } + ButtonOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + ButtonOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + }; + + struct WindowButtonOptions : WidgetOptions { + ImVec2 size = Sizes::Inline; + ImVec2 padding = ImVec2(10.0f, 8.0f); + Colors color = Colors::Gray; + bool showButton = true; + bool embedWindow = true; + + WindowButtonOptions& Size(ImVec2 size_) { + size = size_; + return *this; + } + WindowButtonOptions& Padding(ImVec2 padding_) { + padding = padding_; + return *this; + } + WindowButtonOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + WindowButtonOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + WindowButtonOptions& ShowButton(bool showButton_) { + showButton = showButton_; + return *this; + } + WindowButtonOptions& EmbedWindow(bool embedWindow_) { + embedWindow = embedWindow_; + return *this; + } + }; + + struct CheckboxOptions : WidgetOptions { + bool defaultValue = false; // Only applicable to CVarCheckbox + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Near; + Colors color = WidgetOptions::color = Colors::LightBlue; + + CheckboxOptions& DefaultValue(bool defaultValue_) { + defaultValue = defaultValue_; + return *this; + } + CheckboxOptions& ComponentAlignment(ComponentAlignment alignment_) { + alignment = alignment_; + return *this; + } + CheckboxOptions& LabelPosition(LabelPosition labelPosition_) { + labelPosition = labelPosition_; + return *this; + } + CheckboxOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + CheckboxOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + CheckboxOptions& DisabledTooltip(const char* disabledTooltip_) { + WidgetOptions::disabledTooltip = disabledTooltip_; + return *this; + } + }; + + struct ComboboxOptions : WidgetOptions { + std::unordered_map comboMap = {}; + uint32_t defaultIndex = 0; // Only applicable to CVarCombobox + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + ImGuiComboFlags flags = 0; + Colors color = Colors::LightBlue; + + ComboboxOptions& ComboMap(std::unordered_map comboMap_) { + comboMap = comboMap_; + return *this; + } + ComboboxOptions& DefaultIndex(uint32_t defaultIndex_) { + defaultIndex = defaultIndex_; + return *this; + } + ComboboxOptions& ComponentAlignment(ComponentAlignment alignment_) { + alignment = alignment_; + return *this; + } + ComboboxOptions& LabelPosition(LabelPosition labelPosition_) { + labelPosition = labelPosition_; + return *this; + } + ComboboxOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + ComboboxOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + }; + + struct IntSliderOptions : WidgetOptions { + bool showButtons = true; + const char* format = "%d"; + int32_t step = 1; + int32_t min = 1; + int32_t max = 10; + int32_t defaultValue = 1; + bool clamp = true; + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + Colors color = Colors::Gray; + ImGuiSliderFlags flags = 0; + ImVec2 size = {0,0}; + + IntSliderOptions& ShowButtons(bool showButtons_) { + showButtons = showButtons_; + return *this; + } + IntSliderOptions& Format(const char* format_) { + format = format_; + return *this; + } + IntSliderOptions& Step(int32_t step_) { + step = step_; + return *this; + } + IntSliderOptions& Min(int32_t min_) { + min = min_; + return *this; + } + IntSliderOptions& Max(int32_t max_) { + max = max_; + return *this; + } + IntSliderOptions& DefaultValue(int32_t defaultValue_) { + defaultValue = defaultValue_; + return *this; + } + IntSliderOptions& ComponentAlignment(ComponentAlignment alignment_) { + alignment = alignment_; + return *this; + } + IntSliderOptions& LabelPosition(LabelPosition labelPosition_) { + labelPosition = labelPosition_; + return *this; + } + IntSliderOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + IntSliderOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + IntSliderOptions& Size(ImVec2 size_) { + size = size_; + return *this; + } + IntSliderOptions& Clamp(bool clamp_) { + clamp = clamp_; + return *this; + } + }; + + struct FloatSliderOptions : WidgetOptions { + bool showButtons = true; + const char* format = "%f"; + float step = 0.01f; + float min = 0.01f; + float max = 10.0f; + float defaultValue = 1.0f; + bool clamp = true; + bool isPercentage = false; // Multiplies visual value by 100 + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + Colors color = Colors::Gray; + ImGuiSliderFlags flags = 0; + ImVec2 size = {0,0}; + + FloatSliderOptions& ShowButtons(bool showButtons_) { + showButtons = showButtons_; + return *this; + } + FloatSliderOptions& Format(const char* format_) { + format = format_; + return *this; + } + FloatSliderOptions& Step(float step_) { + step = step_; + return *this; + } + FloatSliderOptions& Min(float min_) { + min = min_; + return *this; + } + FloatSliderOptions& Max(float max_) { + max = max_; + return *this; + } + FloatSliderOptions& DefaultValue(float defaultValue_) { + defaultValue = defaultValue_; + return *this; + } + FloatSliderOptions& ComponentAlignment(ComponentAlignment alignment_) { + alignment = alignment_; + return *this; + } + FloatSliderOptions& LabelPosition(LabelPosition labelPosition_) { + labelPosition = labelPosition_; + return *this; + } + FloatSliderOptions& IsPercentage(bool isPercentage_ = true) { + isPercentage = isPercentage_; + format = "%.0f%%"; + min = 0.0f; + max = 1.0f; + return *this; + } + FloatSliderOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + FloatSliderOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + FloatSliderOptions& Size(ImVec2 size_) { + size = size_; + return *this; + } + FloatSliderOptions& Clamp(bool clamp_) { + clamp = clamp_; + return *this; + } + }; + + struct RadioButtonsOptions : WidgetOptions { + std::unordered_map buttonMap; + RadioButtonsOptions& ButtonMap(std::unordered_map buttonMap_) { + buttonMap = buttonMap_; + return *this; + } + RadioButtonsOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + RadioButtonsOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } }; - // MARK: - Enums + struct InputOptions : WidgetOptions { + ComponentAlignment alignment = ComponentAlignment::Left; + LabelPosition labelPosition = LabelPosition::Above; + Colors color = Colors::Gray; + ImVec2 size = {0,0}; + std::string placeholder = ""; + InputTypes type = InputTypes::String; + std::string defaultValue = ""; - enum class CheckboxGraphics { - Cross, - Checkmark, - None + InputOptions& Tooltip(const char* tooltip_) { + WidgetOptions::tooltip = tooltip_; + return *this; + } + InputOptions& Color(Colors color_) { + WidgetOptions::color = color = color_; + return *this; + } + InputOptions& Size(ImVec2 size_) { + size = size_; + return *this; + } + + InputOptions& LabelPosition(LabelPosition labelPosition_) { + labelPosition = labelPosition_; + return *this; + } + + InputOptions& PlaceholderText(std::string&& placeholder_) { + placeholder = std::move(placeholder_); + return *this; + } + + InputOptions& PlaceholderText(std::string& placeholder_) { + placeholder = placeholder_; + return *this; + } + + InputOptions& InputType(InputTypes type_) { + type = type_; + return *this; + } + + InputOptions& DefaultValue(std::string defaultValue_) { + defaultValue = defaultValue_; + return *this; + } }; - constexpr float maxSliderWidth = 260.0f; -#ifdef __SWITCH__ - constexpr float sliderButtonWidth = 42.0f; -#elif defined(__WIIU__) - constexpr float sliderButtonWidth = 60.0f; -#else - constexpr float sliderButtonWidth = 30.0f; -#endif - std::string WrappedText(const char* text, unsigned int charactersPerLine = 60); - std::string WrappedText(const std::string& text, unsigned int charactersPerLine); + void PushStyleMenu(const ImVec4& color); + void PushStyleMenu(Colors color = Colors::LightBlue); + void PopStyleMenu(); + bool BeginMenu(const char* label, Colors color = Colors::LightBlue); - void SetLastItemHoverText(const std::string& text); - void SetLastItemHoverText(const char* text); + void PushStyleMenuItem(const ImVec4& color); + void PushStyleMenuItem(Colors color = Colors::LightBlue); + void PopStyleMenuItem(); + bool MenuItem(const char* label, const char* shortcut = NULL, Colors color = Colors::LightBlue); + + void PushStyleButton(const ImVec4& color, ImVec2 padding = ImVec2(10.0f, 8.0f)); + void PushStyleButton(Colors color = Colors::Gray, ImVec2 padding = ImVec2(10.0f, 8.0f)); + void PopStyleButton(); + bool Button(const char* label, const ButtonOptions& options = {}); + bool WindowButton(const char* label, const char* cvarName, std::shared_ptr windowPtr, const WindowButtonOptions& options = {}); + + void PushStyleCheckbox(const ImVec4& color); + void PushStyleCheckbox(Colors color = Colors::LightBlue); + void PopStyleCheckbox(); + void RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash); + bool Checkbox(const char* label, bool* v, const CheckboxOptions& options = {}); + bool CVarCheckbox(const char* label, const char* cvarName, const CheckboxOptions& options = {}); + + void PushStyleCombobox(const ImVec4& color); + void PushStyleCombobox(Colors color = Colors::LightBlue); + void PopStyleCombobox(); + + void PushStyleTabs(const ImVec4& color); + void PushStyleTabs(Colors color = Colors::LightBlue); + void PopStyleTabs(); + + void PushStyleInput(const ImVec4& color); + void PushStyleInput(Colors color = Colors::LightBlue); + void PopStyleInput(); + + void PushStyleHeader(const ImVec4& color); + void PushStyleHeader(Colors color = Colors::LightBlue); + void PopStyleHeader(); + + void Spacer(float height = 0.0f); + void Separator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, + float extraVerticalBottomPadding = 0.0f); + + /*using ComboVariant = std::variant&, const std::vector&>; + + bool Combobox(const char* label, int32_t* value, ComboVariant comboSource, const ComboboxOptions& options = {}) { + bool dirty = false; + float startX = ImGui::GetCursorPosX(); + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleCombobox(options.color); + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text("%s", label); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x - ImGui::GetStyle().ItemSpacing.x * 2); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + ImGui::SetNextItemWidth(ImGui::CalcTextSize(comboMap.at(*value)).x + ImGui::GetStyle().FramePadding.x * 4 + ImGui::GetStyle().ItemSpacing.x); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text("%s", label); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x * 2); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + float width = ImGui::CalcTextSize(comboMap.at(*value)).x + ImGui::GetStyle().FramePadding.x * 4; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + } + } + if (ImGui::BeginCombo(invisibleLabel, comboMap.at(*value), options.flags)) { + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); + for (const auto& pair : comboMap) { + if (strlen(pair.second) > 1) { + if (ImGui::Selectable(pair.second, pair.first == *value)) { + *value = pair.first; + dirty = true; + } + } + } + ImGui::PopStyleVar(); + ImGui::EndCombo(); + } + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text("%s", label); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); + ImGui::Text("%s", label); + } + } else if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(startX); + ImGui::Text("%s", label); + } + } + PopStyleCombobox(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; + } + + bool CVarCombobox(const char* label, const char* cvarName, ComboVariant comboSource, const ComboboxOptions& options = {}) { + bool dirty = false; + int32_t value = CVarGetInteger(cvarName, options.defaultIndex); + if (Combobox(label, &value, comboSource, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; + }*/ + + float CalcComboWidth(const char* preview_value, ImGuiComboFlags flags); + + template + bool Combobox(const char* label, T* value, const std::unordered_map& comboMap, const ComboboxOptions& options = {}) { + bool dirty = false; + float startX = ImGui::GetCursorPosX(); + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleCombobox(options.color); + + const char* longest; + int length = 0; + for (auto& [index, string] : comboMap) { + int len = strlen(string); + if (len > length) { + longest = string; + length = len; + } + } + float comboWidth = CalcComboWidth(longest, options.flags); + + ImGui::AlignTextToFramePadding(); + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Right) { + ImGui::Text(label); + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text(label); + } + } + } + + ImGui::SetNextItemWidth(comboWidth); + if (ImGui::BeginCombo(invisibleLabel, comboMap.at(*value), options.flags)) { + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); + for (const auto& pair : comboMap) { + if (strlen(pair.second) > 1) { + if (ImGui::Selectable(pair.second, pair.first == *value)) { + *value = pair.first; + dirty = true; + } + } + } + ImGui::PopStyleVar(); + ImGui::EndCombo(); + } + + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text("%s", label); + } else if (options.labelPosition == LabelPosition::Far) { + float width = ImGui::CalcTextSize(comboMap.at(*value)).x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + ImGui::Text("%s", label); + } + } + } + PopStyleCombobox(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; + } + + template + bool Combobox(const char* label, T* value, const std::vector& comboVector, const ComboboxOptions& options = {}) { + bool dirty = false; + size_t currentValueIndex = static_cast(*value); + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleCombobox(options.color); + + const char* longest; + int length = 0; + for (auto& string : comboVector) { + int len = strlen(string); + if (len > length) { + longest = string; + length = len; + } + } + float comboWidth = CalcComboWidth(longest, options.flags); + + ImGui::AlignTextToFramePadding(); + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Right) { + ImGui::Text("%s", label); + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text("%s", label); + } + } + } + + ImGui::SetNextItemWidth(comboWidth); + if (ImGui::BeginCombo(invisibleLabel, comboVector.at(currentValueIndex), options.flags)) { + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); + for (size_t i = 0; i < comboVector.size(); ++i) { + auto newValue = static_cast(i); + if (strlen(comboVector.at(i)) > 1) { + if (ImGui::Selectable(comboVector.at(i), newValue == *value)) { + *value = newValue; + dirty = true; + } + } + } + ImGui::PopStyleVar(); + ImGui::EndCombo(); + } + + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text("%s", label); + } else if (options.labelPosition == LabelPosition::Far) { + float width = ImGui::CalcTextSize(comboVector.at(*value)).x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + ImGui::Text("%s", label); + } + } + } + + PopStyleCombobox(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; + } + + template + bool Combobox(const char* label, T* value, const std::vector& comboVector, const ComboboxOptions& options = {}) { + bool dirty = false; + size_t currentValueIndex = static_cast(*value); + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleCombobox(options.color); + + const char* longest; + int length = 0; + for (auto& string : comboVector) { + int len = string.length(); + if (len > length) { + longest = string.c_str(); + length = len; + } + } + float comboWidth = CalcComboWidth(longest, options.flags); + + ImGui::AlignTextToFramePadding(); + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Right) { + ImGui::Text("%s", label); + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text("%s", label); + } + } + } + + ImGui::SetNextItemWidth(comboWidth); + if (ImGui::BeginCombo(invisibleLabel, comboVector.at(currentValueIndex).c_str(), options.flags)) { + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); + for (size_t i = 0; i < comboVector.size(); ++i) { + auto newValue = static_cast(i); + if (comboVector.at(i).length() > 1) { + if (ImGui::Selectable(comboVector.at(i).c_str(), newValue == *value)) { + *value = newValue; + dirty = true; + } + } + } + ImGui::PopStyleVar(); + ImGui::EndCombo(); + } + + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text("%s", label); + } else if (options.labelPosition == LabelPosition::Far) { + float width = ImGui::CalcTextSize(comboVector.at(*value).c_str()).x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + ImGui::Text("%s", label); + } + } + } + + PopStyleCombobox(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; + } + + template + bool Combobox(const char* label, T* value, const char* (&comboArray)[N], const ComboboxOptions& options = {}) { + bool dirty = false; + size_t currentValueIndex = static_cast(*value); + if (currentValueIndex >= N) { + currentValueIndex = 0; + } + std::string invisibleLabelStr = "##" + std::string(label); + const char* invisibleLabel = invisibleLabelStr.c_str(); + ImGui::PushID(label); + ImGui::BeginGroup(); + ImGui::BeginDisabled(options.disabled); + PushStyleCombobox(options.color); + + const char* longest; + int length = 0; + for (size_t i = 0; i < N; i++) { + int len = strlen(comboArray[i]); + if (len > length) { + longest = comboArray[i]; + length = len; + } + } + float comboWidth = CalcComboWidth(longest, options.flags); + + ImGui::AlignTextToFramePadding(); + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Right) { + ImGui::Text("%s", label); + if (options.labelPosition == LabelPosition::Above) { + ImGui::NewLine(); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } else if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + } else if (options.labelPosition == LabelPosition::Far) { + ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); + } + } else if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Above) { + ImGui::Text("%s", label); + } + } + } + + ImGui::SetNextItemWidth(comboWidth); + if (ImGui::BeginCombo(invisibleLabel, comboArray[currentValueIndex], options.flags)) { + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); + for (size_t i = 0; i < N; ++i) { + auto newValue = static_cast(i); + if (strlen(comboArray[i]) > 1) { + if (ImGui::Selectable(comboArray[i], newValue == *value)) { + *value = newValue; + dirty = true; + } + } + } + ImGui::PopStyleVar(); + ImGui::EndCombo(); + } + + if (options.labelPosition != LabelPosition::None) { + if (options.alignment == ComponentAlignment::Left) { + if (options.labelPosition == LabelPosition::Near) { + ImGui::SameLine(); + ImGui::Text("%s", label); + } else if (options.labelPosition == LabelPosition::Far) { + float width = ImGui::CalcTextSize(comboArray[*value]).x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); + ImGui::Text("%s", label); + } + } + } + PopStyleCombobox(); + ImGui::EndDisabled(); + ImGui::EndGroup(); + if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.disabledTooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); + } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { + ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); + } + ImGui::PopID(); + return dirty; + } + + template + bool CVarCombobox(const char* label, const char* cvarName, const std::unordered_map& comboMap, const ComboboxOptions& options = {}) { + bool dirty = false; + int32_t value = CVarGetInteger(cvarName, options.defaultIndex); + if (Combobox(label, &value, comboMap, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; + } + + template + bool CVarCombobox(const char* label, const char* cvarName, const std::vector& comboVector, const ComboboxOptions& options = {}) { + bool dirty = false; + int32_t value = CVarGetInteger(cvarName, options.defaultIndex); + if (Combobox(label, &value, comboVector, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; + } + + template + bool CVarCombobox(const char* label, const char* cvarName, const char* (&comboArray)[N], const ComboboxOptions& options = {}) { + bool dirty = false; + int32_t value = CVarGetInteger(cvarName, options.defaultIndex); + if (Combobox(label, &value, comboArray, options)) { + CVarSetInteger(cvarName, value); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + ShipInit::Init(cvarName); + dirty = true; + } + return dirty; + } + + void PushStyleSlider(Colors color = Colors::LightBlue); + void PopStyleSlider(); + bool SliderInt(const char* label, int32_t* value, const IntSliderOptions& options = {}); + bool CVarSliderInt(const char* label, const char* cvarName, const IntSliderOptions& options = {}); + bool SliderFloat(const char* label, float* value, const FloatSliderOptions& options = {}); + bool CVarSliderFloat(const char* label, const char* cvarName, const FloatSliderOptions& options = {}); + bool InputString(const char* label, std::string* value, const InputOptions& options = {}); + bool CVarInputString(const char* label, const char* cvarName, const InputOptions& options = {}); + bool InputInt(const char* label, int32_t* value, const InputOptions& options = {}); + bool CVarInputInt(const char* label, const char* cvarName, const InputOptions& options = {}); + bool CVarColorPicker(const char* label, const char* cvarName, Color_RGBA8 defaultColor, bool hasAlpha = false, uint8_t modifiers = 0, UIWidgets::Colors themeColor = UIWidgets::Colors::LightBlue); + bool RadioButton(const char* label, bool active); + bool CVarRadioButton(const char* text, const char* cvarName, int32_t id, const RadioButtonsOptions& options); + bool StateButton(const char* str_id, const char* label, ImVec2 size, UIWidgets::ButtonOptions options, ImGuiButtonFlags flags = ImGuiButtonFlags_None); + void DrawFlagArray32(const std::string& name, uint32_t& flags, Colors color = Colors::LightBlue); + void DrawFlagArray16(const std::string& name, uint16_t& flags, Colors color = Colors::LightBlue); + void DrawFlagArray8(const std::string& name, uint8_t& flags, Colors color = Colors::LightBlue); + void DrawFlagArray8Mask(const std::string& name, uint8_t& flags, Colors color = Colors::LightBlue); void InsertHelpHoverText(const std::string& text); void InsertHelpHoverText(const char* text); - - void Tooltip(const char* text); - void Spacer(float height); - void PaddedSeparator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, float extraVerticalBottomPadding = 0.0f); - - void RenderCross(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz); - bool CustomCheckbox(const char* label, bool* v, bool disabled, CheckboxGraphics disabledGraphic, bool renderCrossWhenOff = false); - bool CustomCheckboxTristate(const char* label, int* v, bool disabled, CheckboxGraphics disabledGraphic); - - void ReEnableComponent(const char* disabledTooltipText); - void DisableComponent(const float alpha); - - bool EnhancementCheckbox(const char* text, const char* cvarName, bool disabled = false, const char* disabledTooltipText = "", CheckboxGraphics disabledGraphic = CheckboxGraphics::Cross, bool defaultValue = false); - bool EnhancementCheckboxTristate(const char* text, const char* cvarName, bool disabled = false, const char* disabledTooltipText = "", CheckboxGraphics disabledGraphic = CheckboxGraphics::Cross, bool defaultValue = false); - bool PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop = true, bool padBottom = true, bool disabled = false, const char* disabledTooltipText = "", CheckboxGraphics disabledGraphic = CheckboxGraphics::Cross, bool defaultValue = false); - - bool EnhancementCombobox(const char* cvarName, std::span comboArray, uint8_t defaultIndex, bool disabled = false, const char* disabledTooltipText = "", uint8_t disabledValue = -1); - bool LabeledRightAlignedEnhancementCombobox(const char* label, const char* cvarName, std::span comboArray, uint8_t defaultIndex, bool disabled = false, const char* disabledTooltipText = "", uint8_t disabledValue = -1); - - void PaddedText(const char* text, bool padTop = true, bool padBottom = true); - - bool EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = true, bool disabled = false, const char* disabledTooltipText = ""); - bool PaddedEnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = true, bool padTop = true, bool padBottom = true, bool disabled = false, const char* disabledTooltipText = ""); - bool EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton = true, bool disabled = false, const char* disabledTooltipText = ""); - bool PaddedEnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton = true, bool padTop = true, bool padBottom = true, bool disabled = false, const char* disabledTooltipText = ""); - - bool EnhancementRadioButton(const char* text, const char* cvarName, int id); - - bool DrawResetColorButton(const char* cvarName, ImVec4* colors, ImVec4 defaultcolors, bool has_alpha); - bool DrawRandomizeColorButton(const char* cvarName, ImVec4* colors); - void DrawLockColorCheckbox(const char* cvarName); - void RainbowColor(const char* cvarName, ImVec4* colors); - - void LoadPickersColors(ImVec4& ColorArray, const char* cvarname, const ImVec4& default_colors, bool has_alpha); - bool EnhancementColor(const char* text, const char* cvarName, ImVec4 ColorRGBA, ImVec4 default_colors, bool allow_rainbow = true, bool has_alpha = false, bool TitleSameLine = false); - - void DrawFlagArray32(const std::string& name, uint32_t& flags); - void DrawFlagArray16(const std::string& name, uint16_t& flags); - void DrawFlagArray8(const std::string& name, uint8_t& flags); - bool StateButton(const char* str_id, const char* label); - bool InputString(const char* label, std::string* value); } +ImVec4 GetRandomValue(); + +Color_RGBA8 RGBA8FromVec(ImVec4 vec); +ImVec4 VecFromRGBA8(Color_RGBA8 color); #endif /* UIWidgets_hpp */ diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index 29cbb0774..008d5692a 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -16,7 +16,7 @@ namespace SOH { std::vector version3Migrations = { { MigrationAction::Rename, "gSwitchAge", "gGeneral.SwitchAge" }, - { MigrationAction::Rename, "gFrameAdvance", "gGeneral.FrameAdvance" }, + { MigrationAction::Rename, "gFrameAdvance", "gDeveloperTools.FrameAdvanceTick" }, { MigrationAction::Rename, "gRandoGenerating", "gGeneral.RandoGenerating" }, { MigrationAction::Rename, "gNewSeedGenerated", "gGeneral.NewSeedGenerated" }, { MigrationAction::Rename, "gOnFileSelectNameEntry", "gGeneral.OnFileSelectNameEntry" }, @@ -42,14 +42,12 @@ namespace SOH { { MigrationAction::Rename, "gCheckTrackerSettingsEnabled", "gOpenWindows.CheckTrackerSettings" }, { MigrationAction::Rename, "gCollisionViewerEnabled", "gOpenWindows.CollisionViewer" }, { MigrationAction::Rename, "gCosmeticsEditorEnabled", "gOpenWindows.CosmeticsEditor" }, - { MigrationAction::Rename, "gDLViewerEnabled", "gOpenWindows.DLViewer" }, + { MigrationAction::Rename, "gDLViewerEnabled", "gOpenWindows.DisplayListViewer" }, { MigrationAction::Rename, "gEntranceTrackerEnabled", "gOpenWindows.EntranceTracker" }, { MigrationAction::Rename, "gGameplayStatsEnabled", "gOpenWindows.GameplayStats" }, { MigrationAction::Rename, "gItemTrackerEnabled", "gOpenWindows.ItemTracker" }, { MigrationAction::Rename, "gItemTrackerSettingsEnabled", "gOpenWindows.ItemTrackerSettings" }, { MigrationAction::Rename, "gMessageViewerEnabled", "gOpenWindows.MessageViewer" }, - { MigrationAction::Rename, "gOpenWindows.InputViewer", "gOpenWindows.InputViewer" }, - { MigrationAction::Rename, "gOpenWindows.InputViewerSettings", "gOpenWindows.InputViewerSettings" }, { MigrationAction::Rename, "gRandomizerSettingsEnabled", "gOpenWindows.RandomizerSettings" }, { MigrationAction::Rename, "gSaveEditorEnabled", "gOpenWindows.SaveEditor" }, { MigrationAction::Rename, "gValueViewer.WindowOpen", "gOpenWindows.ValueViewer" }, diff --git a/soh/soh/cvar_prefixes.h b/soh/soh/cvar_prefixes.h index 6ddde97bd..4b8d9f93a 100644 --- a/soh/soh/cvar_prefixes.h +++ b/soh/soh/cvar_prefixes.h @@ -7,11 +7,11 @@ #define CVAR_SETTING(var) CVAR_PREFIX_SETTING "." var #define CVAR_WINDOW(var) CVAR_PREFIX_WINDOW "." var #define CVAR_TRACKER(var) CVAR_PREFIX_TRACKER "." var -#define CVAR_TRACKER_ITEM(var) CVAR_TRACKER(".ItemTracker." var) -#define CVAR_TRACKER_CHECK(var) CVAR_TRACKER(".CheckTracker." var) -#define CVAR_TRACKER_ENTRANCE(var) CVAR_TRACKER(".EntranceTracker." var) +#define CVAR_TRACKER_ITEM(var) CVAR_TRACKER("ItemTracker." var) +#define CVAR_TRACKER_CHECK(var) CVAR_TRACKER("CheckTracker." var) +#define CVAR_TRACKER_ENTRANCE(var) CVAR_TRACKER("EntranceTracker." var) #define CVAR_DEVELOPER_TOOLS(var) CVAR_PREFIX_DEVELOPER_TOOLS "." var #define CVAR_GENERAL(var) CVAR_PREFIX_GENERAL "." var #define CVAR_REMOTE(var) CVAR_PREFIX_REMOTE "." var -#define CVAR_REMOTE_CROWD_CONTROL(var) CVAR_REMOTE(".CrowdControl." var) -#define CVAR_REMOTE_SAIL(var) CVAR_REMOTE(".Sail." var) \ No newline at end of file +#define CVAR_REMOTE_CROWD_CONTROL(var) CVAR_REMOTE("CrowdControl." var) +#define CVAR_REMOTE_SAIL(var) CVAR_REMOTE("Sail." var) \ No newline at end of file diff --git a/soh/src/code/audio_playback.c b/soh/src/code/audio_playback.c index 430c463f8..7e334a919 100644 --- a/soh/src/code/audio_playback.c +++ b/soh/src/code/audio_playback.c @@ -95,7 +95,7 @@ void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { vel = 0.0f > vel ? 0.0f : vel; vel = 1.0f < vel ? 1.0f : vel; - float master_vol = (float)CVarGetInteger(CVAR_SETTING("Volume.Master"), 100) / 100.0f; + float master_vol = (float)CVarGetInteger(CVAR_SETTING("Volume.Master"), 40) / 100.0f; sub->targetVolLeft = (s32)((vel * volLeft) * (0x1000 - 0.001f)) * master_vol; sub->targetVolRight = (s32)((vel * volRight) * (0x1000 - 0.001f)) * master_vol; diff --git a/soh/src/code/z_frame_advance.c b/soh/src/code/z_frame_advance.c index 6fcd76ae7..7f9f26fda 100644 --- a/soh/src/code/z_frame_advance.c +++ b/soh/src/code/z_frame_advance.c @@ -18,10 +18,11 @@ s32 FrameAdvance_Update(FrameAdvanceContext* frameAdvCtx, Input* input) { frameAdvCtx->enabled = !frameAdvCtx->enabled; } - if (!frameAdvCtx->enabled || CVarGetInteger(CVAR_GENERAL("FrameAdvance"), 0) || (CHECK_BTN_ALL(input->cur.button, BTN_Z) && + if (!frameAdvCtx->enabled || CVarGetInteger(CVAR_DEVELOPER_TOOLS("FrameAdvanceTick"), 0) || + (CHECK_BTN_ALL(input->cur.button, BTN_Z) && (CHECK_BTN_ALL(input->press.button, BTN_R) || (CHECK_BTN_ALL(input->cur.button, BTN_R) && (++frameAdvCtx->timer >= 9))))) { - CVarClear(CVAR_GENERAL("FrameAdvance")); + CVarClear(CVAR_DEVELOPER_TOOLS("FrameAdvanceTick")); frameAdvCtx->timer = 0; return true; } From 5b622683f4a24cfbdf2b43617dac5de64e9aff5d Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 16 Mar 2025 13:51:52 -0700 Subject: [PATCH 072/267] Clean up Push/Pop font calls in check and item trackers by adding them instead to Begin/EndFloatWindows functions. (#5122) Add missing PopFont call to entrance tracker. --- .../Enhancements/randomizer/randomizer_check_tracker.cpp | 8 ++------ .../randomizer/randomizer_entrance_tracker.cpp | 1 + .../Enhancements/randomizer/randomizer_item_tracker.cpp | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index cc139fbfd..a60865de4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -876,8 +876,6 @@ void CheckTrackerWindow::DrawElement() { hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 1); alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); - - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { return; @@ -901,7 +899,6 @@ void CheckTrackerWindow::DrawElement() { if (!GameInteractor::IsSaveLoaded() || !initialized) { ImGui::Text("Waiting for file load..."); //TODO Language - ImGui::PopFont(); EndFloatWindows(); return; } @@ -920,7 +917,6 @@ void CheckTrackerWindow::DrawElement() { ImVec2 size = ImGui::GetContentRegionMax(); size.y -= headerHeight; if (!ImGui::BeginTable("Check Tracker", 1, 0, size)) { - ImGui::PopFont(); EndFloatWindows(); return; } @@ -965,7 +961,6 @@ void CheckTrackerWindow::DrawElement() { size = ImGui::GetContentRegionAvail(); if (!ImGui::BeginTable("CheckTracker##Checks", 1, ImGuiTableFlags_ScrollY, size)) { ImGui::EndTable(); - ImGui::PopFont(); EndFloatWindows(); return; } @@ -1081,7 +1076,6 @@ void CheckTrackerWindow::DrawElement() { ImGui::EndTable(); //Checks Lead-out ImGui::EndTable(); //Quick Options Lead-out - ImGui::PopFont(); EndFloatWindows(); if (doingCollapseOrExpand) { optCollapseAll = false; @@ -1147,12 +1141,14 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag Color_Background.b / 255.0f, Color_Background.a / 255.0f)); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::Begin(UniqueName.c_str(), &open, windowFlags); } void EndFloatWindows() { ImGui::PopStyleVar(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + ImGui::PopFont(); ImGui::End(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 7a151a983..49755ff06 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -740,6 +740,7 @@ void EntranceTrackerWindow::DrawElement() { if (!ImGui::Begin("Entrance Tracker", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); + ImGui::PopFont(); return; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 828fcda2d..9bb562b31 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -952,12 +952,14 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { ImGui::PushStyleColor(ImGuiCol_WindowBg, VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), {0, 0, 0, 0}))); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); } void EndFloatingWindows() { ImGui::PopStyleVar(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + ImGui::PopFont(); ImGui::End(); } @@ -1222,7 +1224,6 @@ void ItemTrackerWindow::Draw() { } void ItemTrackerWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); UpdateVectors(); int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); @@ -1353,7 +1354,6 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } } - ImGui::PopFont(); } static std::unordered_map itemTrackerCapacityTrackOptions = { From a97f853a140b06cd344a855edaec543f08b46b9c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 16 Mar 2025 16:55:14 -0400 Subject: [PATCH 073/267] Prevent Big Octo one point cutscene from playing twice. (#5113) --- .../SkipMiscInteractions/SkipChildRutoInteractions.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp index 7d676e6f8..2894cb914 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp @@ -65,7 +65,12 @@ void SkipChildRutoInteractions_Register() { enRu1->action = 42; Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); - enRu1->unk_28C->cameraSetting = 1; + // If we aren't skipping one point cutscenes and BgBdan objects has set the camera setting + // to CAM_SET_NORMAL1 (2), don't reset the camera setting to 1. This prevents the One Point + // Cutscene of Ruto getting lifted up from getting queued up twice. + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || enRu1->unk_28C->cameraSetting != 2) { + enRu1->unk_28C->cameraSetting = 1; + } Actor* sapphire = func_80AEB124(gPlayState); if (sapphire != NULL) { Actor_Kill(sapphire); From 797fe2d9893ad58b51162b6a16a413ee78d17ef5 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Sun, 16 Mar 2025 21:58:04 +0100 Subject: [PATCH 074/267] Fix Ganon's Tower entrance logic (#5115) * Fix tower * Update fire_temple.cpp --- .../location_access/dungeons/fire_temple.cpp | 2 +- .../location_access/dungeons/ganons_castle.cpp | 15 +++++++++++---- soh/soh/Enhancements/randomizer/randomizerTypes.h | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 1e7214a3d..a17cfc598 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -357,7 +357,7 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER] = Region("Fire Temple MQ First Room Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return true;}), - Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return logic->HasFireSource();}), + Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, []{return logic->HasFireSource();}), Entrance(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);});}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index 2a7301701..982ac16fc 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -28,7 +28,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_SHADOW_TRIAL, []{return true;}), Entrance(RR_GANONS_CASTLE_SPIRIT_TRIAL, []{return true;}), Entrance(RR_GANONS_CASTLE_LIGHT_TRIAL, []{return logic->CanUse(RG_GOLDEN_GAUNTLETS);}), - Entrance(RR_GANONS_TOWER_FLOOR_1, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && @@ -162,7 +162,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_MAIN, []{return logic->CanUse(RG_GOLDEN_GAUNTLETS);});}), //RANDOTODO could we just set these events automatically based on the setting? - Entrance(RR_GANONS_TOWER_FLOOR_1, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && @@ -431,10 +431,17 @@ void RegionTable_Init_GanonsCastle() { #pragma region Tower and Escape + areaTable[RR_GANONS_TOWER_ENTRYWAY] = Region("Ganon's Tower Entryway", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + //Exits + Entrance(RR_GANONS_CASTLE_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsVanilla();}), + Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return ctx->GetDungeon(GANONS_CASTLE)->IsMQ();}), + Entrance(RR_GANONS_TOWER_FLOOR_1, []{return true;}), + }); + areaTable[RR_GANONS_TOWER_FLOOR_1] = Region("Ganon's Tower Floor 1", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(RR_GANONS_CASTLE_LOBBY, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), - Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), + Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), }); areaTable[RR_GANONS_TOWER_FLOOR_2] = Region("Ganon's Tower Floor 2", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 155b31db1..a418627ef 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -988,7 +988,6 @@ typedef enum { RR_GANONS_CASTLE_SHADOW_TRIAL, RR_GANONS_CASTLE_SPIRIT_TRIAL, RR_GANONS_CASTLE_LIGHT_TRIAL, - RR_GANONS_CASTLE_TOWER, RR_GANONS_CASTLE_MQ_LOBBY, RR_GANONS_CASTLE_MQ_MAIN, @@ -1017,6 +1016,7 @@ typedef enum { RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK, RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM, + RR_GANONS_TOWER_ENTRYWAY, RR_GANONS_TOWER_FLOOR_1, RR_GANONS_TOWER_FLOOR_2, RR_GANONS_TOWER_FLOOR_3, From 112fab503ff0d427ee211a04d012bb3beec649fe Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Sun, 16 Mar 2025 21:00:31 +0000 Subject: [PATCH 075/267] Fix oversight in HC storms grotto (#5120) --- .../randomizer/location_access/overworld/castle_grounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index c4dcf4f02..b4b77056b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -79,7 +79,7 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_STORMS_GROTTO_POT_4, logic->CanBreakPots()), }, { //Exits - Entrance(RR_CASTLE_GROUNDS, []{return true;}), + Entrance(RR_HC_STORMS_GROTTO, []{return true;}), }); areaTable[RR_GANONS_CASTLE_GROUNDS] = Region("Ganon's Castle Grounds", "Castle Grounds", {RA_OUTSIDE_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { From 05ab17d3a8fe26600ee4cee032de1c54d2c024f4 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 16 Mar 2025 15:00:30 -0700 Subject: [PATCH 076/267] Reimplement ImGui Scaling option. (#5124) --- soh/soh/SohGui/SohMenuBar.cpp | 20 -------------------- soh/soh/SohGui/SohMenuSettings.cpp | 10 ++++++++++ 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index 18fa8b53d..ed63fea7b 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -68,8 +68,6 @@ static std::unordered_map windowBackendNames = { Ship::WindowBackend::FAST3D_SDL_METAL, "Metal" }, }; -static const char* imguiScaleOptions[4] = { "Small", "Normal", "Large", "X-Large" }; - static const char* filters[3] = { #ifdef __WIIU__ "", @@ -89,24 +87,6 @@ Ship::WindowBackend configWindowBackend; extern std::shared_ptr mGfxDebuggerWindow; void DrawSettingsMenu() { - //if (ImGui::BeginMenu("Settings")) - //{ - // if (ImGui::BeginMenu("Graphics")) { - // ImGui::Text("ImGui Menu Scale"); - // ImGui::SameLine(); - // ImGui::TextColored({ 0.85f, 0.35f, 0.0f, 1.0f }, "(Experimental)"); - // if (UIWidgets::EnhancementCombobox(CVAR_SETTING("ImGuiScale"), imguiScaleOptions, 1)) { - // OTRGlobals::Instance->ScaleImGui(); - // } - // UIWidgets::Tooltip("Changes the scaling of the ImGui menu elements."); - - // // Draw LUS settings menu (such as Overlays Text Font) - // Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGameOverlay()->DrawSettings(); - - // ImGui::EndMenu(); - // } - // ImGui::EndMenu(); - //} } void SohMenuBar::InitElement() { diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index a9103377b..5a186b0ae 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -15,6 +15,7 @@ namespace SohGui { extern std::shared_ptr mSohMenu; using namespace UIWidgets; static std::unordered_map languages = {{ LANGUAGE_ENG, "English" }, { LANGUAGE_GER, "German" }, { LANGUAGE_FRA, "French" }}; +static std::unordered_map imguiScaleOptions = {{ 0, "Small" }, { 1, "Normal" }, { 2, "Large" }, { 3, "X-Large" }}; const char* GetGameVersionString(uint32_t index) { uint32_t gameVersion = ResourceMgr_GetGameVersion(index); @@ -115,6 +116,15 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Disable Idle Camera Re-Centering", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SETTING("A11yDisableIdleCam")) .Options(CheckboxOptions().Tooltip("Disables the automatic re-centering of the camera when idle.")); + AddWidget(path, "EXPERIMENTAL", WIDGET_SEPARATOR_TEXT) + .Options(WidgetOptions().Color(Colors::Orange)); + AddWidget(path, "ImGui Menu Scaling", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_SETTING("ImGuiScale")) + .Options(ComboboxOptions().ComboMap(imguiScaleOptions).Tooltip("Changes the scaling of the ImGui menu elements.").DefaultIndex(1) + .ComponentAlignment(ComponentAlignment::Right).LabelPosition(LabelPosition::Far)) + .Callback([](WidgetInfo& info) { + OTRGlobals::Instance->ScaleImGui(); + }); // General - About path.column = SECTION_COLUMN_2; From f3b3e0f5ebfaa5e9160edc23e9ba2c7d80c1cb2c Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 16 Mar 2025 23:00:47 +0100 Subject: [PATCH 077/267] Use percentage of screen size as padding (#5123) --- soh/soh/SohGui/Menu.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index a10fc4e06..e130d5b75 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -558,14 +558,13 @@ void Menu::DrawElement() { } // Full screen menu with widths below 1280, heights below 800. - // Up to 100 pixel padding when up to 1700 width, 1050 height. - // Everything above that, fixed size of 1600x950. + // 5% of screen width/height padding on both sides above those resolutions. ImVec2 menuSize = { std::fminf(1280, windowWidth), std::fminf(800, windowHeight) }; - if (windowWidth > 1380) { - menuSize.x = std::fminf(1600, windowWidth - 100); + if (windowWidth > 1280) { + menuSize.x = floor(windowWidth * 0.9); } - if (windowHeight > 900) { - menuSize.y = std::fminf(950, windowHeight - 100); + if (windowHeight > 800) { + menuSize.y = floor(windowHeight * 0.9); } pos += window->WorkRect.GetSize() / 2 - menuSize / 2; From a6163ca2e815c98e348f8f316653eaf049e6c0d6 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 16 Mar 2025 23:36:06 -0700 Subject: [PATCH 078/267] Fixes skip get item prefix in hook handlers and the space in ClimbSpeed CVar. (#5127) Also moves Item Scale option into rando enhancements to match skip get item animation, as it's directly tied. --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 8 ++++---- soh/soh/SohGui/SohMenuEnhancements.cpp | 15 +-------------- soh/soh/SohGui/SohMenuRandomizer.cpp | 13 +++++++++++++ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index f48b7da5a..aa7bf806c 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -298,9 +298,9 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { // Always show ItemGet animation for ice traps !(getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.getItemId == RG_ICE_TRAP) && ( - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_ALL || + CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_ALL || ( - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_JUNK && + CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_JUNK && ( getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || @@ -411,7 +411,7 @@ void EnExItem_WaitForObjectRandomized(EnExItem* enExItem, PlayState* play) { } void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play) { - f32 mtxScale = CVarGetFloat(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale"), 10.0f); + f32 mtxScale = CVarGetFloat(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale"), 10.0f); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); GetItemEntry randoItem = enItem00->itemEntry; if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0) && @@ -783,7 +783,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_PLAY_SLOW_CHEST_CS: { // We force fast chests if SkipGetItemAnimation is enabled because the camera in the CS looks pretty wonky otherwise - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED)) { + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED)) { *should = false; } break; diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 21a90d70b..5f4961279 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -541,19 +541,6 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Skip the tower escape sequence between Ganondorf and Ganon." )); - AddWidget(path, "Item Scale: %.2f", WIDGET_CVAR_SLIDER_FLOAT) - .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_DISABLED; - }) - .Options(FloatSliderOptions() - .Min(5.0f) - .Max(15.0f) - .Format("%.2f") - .DefaultValue(10.0f) - .Tooltip( - "The size of the item when it is picked up" - )); AddWidget(path, "Text", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Skip Forced Dialog", WIDGET_CVAR_CHECKBOX) @@ -727,7 +714,7 @@ void SohMenu::AddMenuEnhancements() { .Format("%.2fx") ); AddWidget(path, "Vine/Ladder Climb Speed +%d", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("Climb Speed")) + .CVar(CVAR_ENHANCEMENT("ClimbSpeed")) .Options(IntSliderOptions() .Min(0) .Max(12) diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index e6399baab..a022d6c40 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -72,6 +72,19 @@ void SohMenu::AddMenuRandomizer() { AddWidget(path, "Skip Get Item Animations", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation")) .Options(ComboboxOptions().ComboMap(skipGetItemAnimationOptions).DefaultIndex(SGIA_JUNK)); + AddWidget(path, "Item Scale: %.2f", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_DISABLED; + }) + .Options(FloatSliderOptions() + .Min(5.0f) + .Max(15.0f) + .Format("%.2f") + .DefaultValue(10.0f) + .Tooltip( + "The size of the item when it is picked up" + )); // Plandomizer path.sidebarName = "Plandomizer"; From c18d42761926143c278b05bc6306adb6e1d57a91 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Mon, 17 Mar 2025 12:13:35 -0700 Subject: [PATCH 079/267] Setup F11 to toggle the fullscreen CVar to keep it synced with fullscreen state. (#5128) --- soh/soh/OTRGlobals.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 0b8d0030a..86d7d9382 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1369,6 +1369,10 @@ extern "C" void Graph_StartFrame() { break; } #endif + case KbScancode::LUS_KB_F11: { + CVarSetInteger(CVAR_SETTING("Fullscreen"), !CVarGetInteger(CVAR_SETTING("Fullscreen"), 0)); + break; + } case KbScancode::LUS_KB_TAB: { CVarSetInteger(CVAR_ENHANCEMENT("AltAssets"), !CVarGetInteger(CVAR_ENHANCEMENT("AltAssets"), 0)); break; From a95883b6b3c1c64ca9b57dd28ccd70086c3c5167 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Mon, 17 Mar 2025 20:15:53 +0100 Subject: [PATCH 080/267] Multiple Rando Text related stuff (#5125) * Multiple Rando Text related stuff - Mostly french rework / completion of missing lines - Removal of a duplicate entry for Richard's house overworld key - Correct naming for the English pond - Addition of missing text in English and french * Txeak uncessary spaces --- .../3drando/hint_list/hint_list_item.cpp | 26 +-- soh/soh/Enhancements/randomizer/item_list.cpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 220 +++++++++--------- 3 files changed, 122 insertions(+), 126 deletions(-) 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 867da2b2c..c786dd8de 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 @@ -2070,23 +2070,23 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a rightward tone", /*german*/"ein rechtsseitiger Ton", /*french*/"une tonalité vers la droite")}); // /*spanish*/un tono hacia la derecha - hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"canne à pêche"), + hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"une canne à pêche"), // /*spanish*/caña de pescar { - CustomMessage("the pond owner's property", /*german*/"der Besitz des Teicheigners", /*french*/"(canne à pêche)") + CustomMessage("the pond owner's property", /*german*/"der Besitz des Teicheigners", /*french*/"(un truc qui appartient au propriétaire de l'étang)") // /*spanish*/(caña de pescar) }, { - CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(canne à pêche)")}); + CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(un aimant à poisson)")}); // /*spanish*/(caña de pescar) - hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("Bombchu Bag", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("Bombchu Bag", /*german*/"!!!", /*french*/"un Sac de Missiles Teigneux"), { 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*/"!!!")}); + CustomMessage("sack of mice", /*german*/"!!!", /*french*/"un Sac rempli de souris")}); hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "ein Universalschlüssel", /*french*/ "une Clé Squelette"), // /*spanish*/una Llave Maestra @@ -2096,49 +2096,49 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a master unlocker", /*german*/ "ein Meisterentsperrer", /*french*/ "un Kit de Déverrouillage") }); // /*spanish*/un desbloqueador maestro - hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"!!!", /*french*/"un Carquois Infini"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"!!!", /*french*/"un Sac de Bombe sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"!!!", /*french*/"un Sac de Graine sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"!!!", /*french*/" des Bâtons Mojo illimités"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nut", /*german*/"!!!", /*french*/"des Noix Mojo illimitées"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"!!!", /*french*/"de la Magie infinie"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"!!!", /*french*/"des Missiles Teigneux illimités"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("", /*german*/"!!!", /*french*/"!!!"), + hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"!!!", /*french*/"une Bourse sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 0b94aab39..c31a1c4a6 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -339,7 +339,7 @@ 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] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "!!!", "Sac de Missiles Teigneux" }, 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); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 85ddc6c50..1cc7363e8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3469,251 +3469,247 @@ void Randomizer::CreateCustomMessages() { 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!"), + "Vous obtenez la %rClé %wde 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!"), + "Vous obtenez la %rClé %wdu %gBazar&de la Place du Marché%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!"), + "Vous obtenez la %rClé %wde la&%gPlace du Marché%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!"), + "Vous obtenez la %rClé %wde la&%gFoire aux 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!"), + "Vous obtenez la %rClé %wdu %gStand de&Tir de la Place du Marché%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!"), + "Vous obtenez la %rClé %wdu %gBowling&Teigneux%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!"), + "Vous obtenez la %rClé %wdu %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!"), + "Vous obtenez la %rClé %wdu %gMagasin&de Missiles%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!"), + "Vous obtenez la %rClé %wde la %gMaison&de Kiki%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!"), + "Vous obtenez la %rClé %wde 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!"), + "Vous obtenez la %rClé %wdu %gBazar&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!"), + "Vous obtenez la %rClé %wdu %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!"), + "Vous obtenez la %rClé %wde la %gMaison&du chef des ouvriers%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!"), + "Vous obtenez la %rClé %wde&l'%gApothicaire%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!"), + "Vous obtenez la %rClé %wde la %gMaison&des Araignées%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!"), + "Vous obtenez la %rClé %wde 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!"), + "Vous obtenez la %rClé %w du %gMoulin%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!"), + "Vous obtenez la %rClé %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!"), + "Vous obtenez la %rClé %wde la %gCabane&d'Igor%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!"), + "Vous obtenez la %rClé %wde 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!"), + "Vous obtenez la %rClé %wdes %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!"), + "Vous obtenez la %rClé %wdu %gSilo%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!"), + "Vous obtenez la %rClé %wdu %gLaboratoire&du Lac Hylia%w!"), GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gFishing Hole%w!", + "You found the key to the&%gPond%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!"), + "Vous obtenez la %rClé %wde l'%gÉtang%w!"), GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, - "You found a %yThieves Hideout &%wKeyring!", + "You found a %yThieves Hideout&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für das %yDiebesversteck%w!", - "Vous obtenez un trousseau de&clés du %yRepaire des Voleurs%w!"), + "Vous obtenez le trousseau de&clés du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %gForest Temple &%wKeyring!", + "You found a %gForest Temple&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %gWaldtempel%w!", - "Vous obtenez un trousseau de&clés du %gTemple de la Forêt%w!"), + "Vous obtenez le trousseau de&clés du %gTemple de la Forêt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %rFire Temple &%wKeyring!", + "You found a %rFire Temple&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %rFeuertempel%w!", - "Vous obtenez un trousseau de&clés du %rTemple du Feu%w!"), + "Vous obtenez le trousseau de&clés du %rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %bWater Temple &%wKeyring!", + "You found a %bWater Temple&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %bWassertempel%w!", - "Vous obtenez un trousseau de&clés du %bTemple de l'Eau%w!"), + "Vous obtenez le trousseau de&clés du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %ySpirit Temple &%wKeyring!", + "You found a %ySpirit Temple&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %yGeistertempel%w!", - "Vous obtenez un trousseau de&clés du %yTemple de l'Esprit%w!"), + "Vous obtenez le trousseau de&clés du %yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %pShadow Temple &%wKeyring!", + "You found a %pShadow Temple&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %pSchattentempel%w!", - "Vous obtenez un trousseau de&clés du %pTemple de l'Ombre%w!"), + "Vous obtenez le trousseau de&clés du %pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_KEY_RING, ITEM_KEY_SMALL, - "You found a %pBottom of the &Well %wKeyring!", + "You found a %pBottom of the&Well %wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", - "Vous obtenez un trousseau de&clés du %pPuits%w!"), + "Vous obtenez le trousseau de&clés du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, - "You found a %yGerudo Training &Grounds %wKeyring!", + "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!"), + "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %rGanon's Castle &%wKeyring!", + "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!"), + "Vous obtenez le 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!", + "You found a %rTreasure Chest Game&%wKeyring!", "!!!", - "!!!"), + "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"), GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %gForest Temple &%wBoss Key!", + "You found the %gForest Temple&%wBoss Key!", "Du erhältst den %rMaster-Schlüssel%w&für den %gWaldtempel%w!", "Vous obtenez la %rClé d'or %wdu&%gTemple de la Forêt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %rFire Temple &%wBoss Key!", + "You found the %rFire Temple&%wBoss Key!", "Du erhältst den %rMaster-Schlüssel%w&für den %rFeuertempel%w!", "Vous obtenez la %rClé d'or %wdu&%rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %bWater Temple &%wBoss Key!", + "You found the %bWater Temple&%wBoss Key!", "Du erhältst den %rMaster-Schlüssel%w&für den %bWassertempel%w!", "Vous obtenez la %rClé d'or %wdu&%bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %ySpirit Temple &%wBoss Key!", + "You found the %ySpirit Temple&%wBoss Key!", "Du erhältst den %rMaster-Schlüssel%w&für den %yGeistertempel%w!", "Vous obtenez la %rClé d'or %wdu&%yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %pShadow Temple &%wBoss Key!", + "You found the %pShadow Temple&%wBoss Key!", "Du erhältst den %rMaster-Schlüssel%w&für den %pSchattentempel%w!", "Vous obtenez la %rClé d'or %wdu&%pTemple de l'Ombre%w!"), GIMESSAGE(RG_GANONS_CASTLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %rGanon's Castle &%wBoss Key!", + "You found the %rGanon's Castle&%wBoss Key!", "Du erhältst den %rMaster-Schlüssel%w&für %rGanons Schloß%w!", "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, - "You found the %gDeku Tree &%wMap![[typeHint]]", + "You found the %gDeku Tree&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]", "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %rDodongo's Cavern &%wMap![[typeHint]]", + "You found the %rDodongo's Cavern&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]", "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, - "You found the %bJabu Jabu's Belly &%wMap![[typeHint]]", + "You found the %bJabu Jabu's Belly&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%bVentre de Jabu-Jabu%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"), GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %gForest Temple &%wMap![[typeHint]]", + "You found the %gForest Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%gTemple de la Forêt%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%gTemple de la Forêt%w![[typeHint]]"), GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %rFire Temple &%wMap![[typeHint]]", + "You found the %rFire Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%rTemple du Feu%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"), GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %bWater Temple &%wMap![[typeHint]]", + "You found the %bWater Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%bWassertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%bTemple de l'Eau%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"), GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %ySpirit Temple &%wMap![[typeHint]]", + "You found the %ySpirit Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%yTemple de l'Esprit%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"), GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %pShadow Temple &%wMap![[typeHint]]", + "You found the %pShadow Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%pSchattentempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%pTemple de l'Ombre%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%pTemple de l'Ombre%w![[typeHint]]"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, - "You found the %pBottom of the &Well %wMap![[typeHint]]", + "You found the %pBottom of the&Well %wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu &%pPuits%w![[typeHint]]"), + "Vous obtenez la %rCarte %wdu&%pPuits%w![[typeHint]]"), GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %cIce Cavern &%wMap![[typeHint]]", + "You found the %cIce Cavern&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für die&%cEishöhle%w![[typeHint]]", - "Vous obtenez la %rCarte %wde &la %cCaverne Polaire%w![[typeHint]]"), + "Vous obtenez la %rCarte %wde&la %cCaverne Polaire%w![[typeHint]]"), GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, - "You found the %gDeku Tree &%wCompass!", + "You found the %gDeku Tree&%wCompass!", "Du erhältst den %rKompaß%w für den&%gDeku-Baum%w!", "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, - "You found the %rDodongo's Cavern &%wCompass!", + "You found the %rDodongo's Cavern&%wCompass!", "Du erhältst den %rKompaß%w für&%rDodongos Höhle%w!", "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, - "You found the %bJabu Jabu's Belly &%wCompass!", + "You found the %bJabu Jabu's Belly&%wCompass!", "Du erhältst den %rKompaß%w für den&%bJabu-Jabus Bauch%w!", - "Vous obtenez la %rBoussole %wdu &%bVentre de Jabu-Jabu%w!"), + "Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"), GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %gForest Temple &%wCompass!", + "You found the %gForest Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%gWaldtempel%w!", - "Vous obtenez la %rBoussole %wdu &%gTemple de la Forêt%w!"), + "Vous obtenez la %rBoussole %wdu&%gTemple de la Forêt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %rFire Temple &%wCompass!", + "You found the %rFire Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%rFeuertempel%w!", - "Vous obtenez la %rBoussole %wdu &%rTemple du Feu%w!"), + "Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %bWater Temple &%wCompass!", + "You found the %bWater Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%bWassertempel%w!", - "Vous obtenez la %rBoussole %wdu &%bTemple de l'Eau%w!"), + "Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %ySpirit Temple &%wCompass!", + "You found the %ySpirit Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%yGeistertempel%w!", - "Vous obtenez la %rBoussole %wdu &%yTemple de l'Esprit%w!"), + "Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %pShadow Temple &%wCompass!", + "You found the %pShadow Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%pSchattentempel%w!", - "Vous obtenez la %rBoussole %wdu &%pTemple de l'Ombre%w!"), + "Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_COMPASS, ITEM_COMPASS, - "You found the %pBottom of the &Well %wCompass!", + "You found the %pBottom of the&Well %wCompass!", "Du erhältst den %rKompaß%w für den&%pGrund des Brunnens%w!", - "Vous obtenez la %rBoussole %wdu &%pPuits%w!"), + "Vous obtenez la %rBoussole %wdu&%pPuits%w!"), GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, - "You found the %cIce Cavern &%wCompass!", + "You found the %cIce Cavern&%wCompass!", "Du erhältst den %rKompaß%w für die&%cEishöhle%w!", - "Vous obtenez la %rBoussole %wde &la %cCaverne Polaire%w!"), + "Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"), GIMESSAGE(RG_MAGIC_BEAN_PACK, ITEM_BEAN, "You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait for&something fun to happen!", @@ -3739,7 +3735,7 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez l'âme de %bBarinade%w!"), GIMESSAGE_NO_GERMAN(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %gPhantom&Ganon%w!", - "Vous obtenez l'âme de %gGanon Spectral%w!"), + "Vous obtenez l'âme de %gGanon&Spectral%w!"), GIMESSAGE_NO_GERMAN(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, "You found the soul for %rVolvagia%w!", "Vous obtenez l'âme de %rVulcania%w!"), @@ -3748,10 +3744,10 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez l'âme de %bMorpha%w!"), GIMESSAGE_NO_GERMAN(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, "You found the soul for %pBongo&Bongo%w!", - "Vous obtenez l'âme de %pBongo Bongo%w!"), + "Vous obtenez l'âme de %pBongo&Bongo%w!"), GIMESSAGE_NO_GERMAN(RG_TWINROVA_SOUL, ITEM_BIG_POE, "You found the soul for %yTwinrova%w!", - "Vous obtenez l'âme du %yDuo Maléfique%w!"), + "Vous obtenez l'âme du %yDuo&Maléfique%w!"), GIMESSAGE_NO_GERMAN(RG_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %cGanon%w!", "Vous obtenez l'âme de %cGanon%w!"), @@ -3759,66 +3755,66 @@ void Randomizer::CreateCustomMessages() { GIMESSAGE(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, "You got the %b\x9f%r button for the&Ocarina%w! You can now use it&while playing songs!", "Der %b\x9f%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %b\x9f%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "Vous obtenez la %rtouche %b\x9f%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), GIMESSAGE(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, "You got the %y\xa7%r button for the&Ocarina%w! You can now use it&while playing songs!", "Der %y\xa7%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa7%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "Vous obtenez la %rtouche %y\xa7%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), GIMESSAGE(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, "You got the %y\xa8%r button for the&Ocarina%w! You can now use it&while playing songs!", "Der %y\xa8%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa8%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "Vous obtenez la %rtouche %y\xa8%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), GIMESSAGE(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, "You got the %y\xa5%r button for the&Ocarina%w! You can now use it&while playing songs!", "Der %y\xa5%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa5%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "Vous obtenez la %rtouche %y\xa5%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), GIMESSAGE(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, "You got the %y\xa6%r button for the&Ocarina%w! You can now use it&while playing songs!", "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous trouvez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), GIMESSAGE_NO_GERMAN(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", - "Vous avez obtenu l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est à vous!"), + "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), 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!"), + "Vous obtenez une %rCanne à pêche%w&perdue!&Il est temps d'aller à %gl'étang%w!"), GIMESSAGE_NO_GERMAN(RG_BOMBCHU_BAG, ITEM_BOMBCHU, "You found the %rBombchu Bag%w!", - "!!!"), + "Vous obtenez un %rSac de Missiles&Teigneux%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!"), + "Vous obtenez un %rSac de Bombes&sans fond%w!&Vous avez maintenant des %ybombes&en quantité illimitée%w!"), GIMESSAGE_NO_GERMAN(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", - "Vous avez obtenu un %rCarquois à l'infini%w!&Vous avez maintenant des %yflèches à l'infini%w!"), + "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflèches&de manière illimitée%w!"), GIMESSAGE_NO_GERMAN(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", - "Vous avez obtenu un %rSac de Graine à l'infini%w!&Vous avez maintenant des %ygraines de lance-pierres à l'infini%w!"), + "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres à l'infini%w!"), GIMESSAGE_NO_GERMAN(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!", - "Vous avez maintenant des %yBâtons Mojo à l'infini%w!"), + "Vous avez maintenant des %yBâtons&Mojo de manière illimitée%w!"), GIMESSAGE_NO_GERMAN(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!", - "Vous avez maintenant des %yNoix Mojo à l'infini%w!"), + "Vous avez maintenant des %yNoix&Mojo de manière illimitée%w!"), GIMESSAGE_NO_GERMAN(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!", - "Vous avez maintenant de la %ymagie à l'infini%w!"), + "Vous avez maintenant une quantité&de %ymagie illimitée%w!"), GIMESSAGE_NO_GERMAN(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!", - "Vous avez maintenant des %Missiles Teigneux à l'infini%w!"), + "Vous avez maintenant des %yMissiles&Teigneux en quantité illimités%w!"), GIMESSAGE_NO_GERMAN(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!", - "Vous avez maintenant de l'%yargent à l'infini%w!"), + "Vous avez maintenant des %yRubis en& quantité illimitée%w!"), GIMESSAGE_NO_GERMAN(RG_SKELETON_KEY, ITEM_KEY_SMALL, "You found the %rSkeleton Key%w!", "Vous avez trouvé la %rClé Squelette%w!"), GIMESSAGE_NO_GERMAN(RG_DEKU_STICK_BAG, ITEM_STICK, "You found the %rDeku Stick Bag%w!&You can now hold deku sticks!", - "Vous avez trouvé le %rSac de Bâtons Mojo%w!&Vous pouvez maintenant porter des Bâtons Mojo!"), + "Vous avez trouvé le %rSac de Bâtons&Mojo%w!&Vous pouvez maintenant porter des&Bâtons Mojo!"), GIMESSAGE_NO_GERMAN(RG_DEKU_NUT_BAG, ITEM_NUT, "You found the %rDeku Nut Bag%w!&You can now hold deku nuts!", - "Vous avez trouvé le %rSac de Noix Mojo%w!&Vous pouvez maintenant porter des Noix Mojo!"), + "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), }}; CreateGetItemMessages(&getItemMessages); CreateRupeeMessages(); From 63ae14cc3020de559ff12c56fd5e4ecd2defa205 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 18 Mar 2025 01:24:32 -0700 Subject: [PATCH 081/267] Menu Header Button Reorder (#5134) * Move close menu button to right side, farthest right, and move Quit SoH to the left of the Reset button. Also remove last reference to 2ship in tooltips. * Change Resolution Editor's use of CVarGet to `GetInterpolationFPS()` in OTRGlobals. --- soh/soh/SohGui/Menu.cpp | 52 ++++++++++++++--------------- soh/soh/SohGui/ResolutionEditor.cpp | 2 +- soh/soh/SohGui/SohMenuSettings.cpp | 2 +- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index e130d5b75..4dd939df8 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -581,22 +581,6 @@ void Menu::DrawElement() { headerHeight += style.ScrollbarSize; scrollbar = true; } - UIWidgets::ButtonOptions options = {}; - options.size = UIWidgets::Sizes::Inline; - options.tooltip = "Close Menu (Esc)"; - if (UIWidgets::Button(ICON_FA_TIMES_CIRCLE, options)) { - ToggleVisibility(); - - // Update gamepad navigation after close based on if other menus are still visible - auto mImGuiIo = &ImGui::GetIO(); - if (CVarGetInteger(CVAR_IMGUI_CONTROLLER_NAV, 0) && - Ship::Context::GetInstance()->GetWindow()->GetGui()->GetMenuOrMenubarVisible()) { - mImGuiIo->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; - } else { - mImGuiIo->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; - } - } - ImGui::SameLine(); ImGui::SetNextWindowSizeConstraints({ 0, headerHeight }, { headerWidth, headerHeight }); ImVec2 headerSelSize = { menuSize.x - buttonSize.x * 3 - style.ItemSpacing.x * 3, headerHeight }; if (scrollbar) { @@ -657,7 +641,19 @@ void Menu::DrawElement() { ImGui::PopStyleColor(); } ImGui::EndChild(); - ImGui::SameLine(menuSize.x - (buttonSize.x * 2) - style.ItemSpacing.x); + ImGui::SameLine(menuSize.x - (buttonSize.x * 3) - (style.ItemSpacing.x * 2)); + UIWidgets::ButtonOptions options3 = {}; + options3.color = UIWidgets::Colors::Red; + options3.size = UIWidgets::Sizes::Inline; + options3.tooltip = "Quit SoH"; + if (UIWidgets::Button(ICON_FA_POWER_OFF, options3)) { + if (!popped) { + ToggleVisibility(); + } + Ship::Context::GetInstance()->GetWindow()->Close(); + } + ImGui::PopStyleVar(); + ImGui::SameLine(); UIWidgets::ButtonOptions options2 = {}; options2.color = UIWidgets::Colors::Red; options2.size = UIWidgets::Sizes::Inline; @@ -676,17 +672,21 @@ void Menu::DrawElement() { ->Dispatch("reset"); } ImGui::SameLine(); - UIWidgets::ButtonOptions options3 = {}; - options3.color = UIWidgets::Colors::Red; - options3.size = UIWidgets::Sizes::Inline; - options3.tooltip = "Quit SoH"; - if (UIWidgets::Button(ICON_FA_POWER_OFF, options3)) { - if (!popped) { - ToggleVisibility(); + UIWidgets::ButtonOptions options = {}; + options.size = UIWidgets::Sizes::Inline; + options.tooltip = "Close Menu (Esc)"; + if (UIWidgets::Button(ICON_FA_TIMES_CIRCLE, options)) { + ToggleVisibility(); + + // Update gamepad navigation after close based on if other menus are still visible + auto mImGuiIo = &ImGui::GetIO(); + if (CVarGetInteger(CVAR_IMGUI_CONTROLLER_NAV, 0) && + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetMenuOrMenubarVisible()) { + mImGuiIo->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; + } else { + mImGuiIo->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; } - Ship::Context::GetInstance()->GetWindow()->Close(); } - ImGui::PopStyleVar(); pos.y += headerHeight + style.ItemSpacing.y; pos.x = centerX - menuSize.x / 2 + (style.ItemSpacing.x * (menuEntries.size() + 1)); diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp index 8e850682c..e4f504ccd 100644 --- a/soh/soh/SohGui/ResolutionEditor.cpp +++ b/soh/soh/SohGui/ResolutionEditor.cpp @@ -517,7 +517,7 @@ void UpdateResolutionVars() { bool IsDroppingFrames() { // a rather imprecise way of checking for frame drops. // but it's mostly there to inform the player of large drops. - const short targetFPS = CVarGetInteger("gInterpolationFPS", 20); + const short targetFPS = OTRGlobals::Instance->GetInterpolationFPS(); const float threshold = targetFPS / 20.0f + 4.1f; return ImGui::GetIO().Framerate < targetFPS - threshold; } diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 5a186b0ae..81d5b5244 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -65,7 +65,7 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Menu Controller Navigation", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_IMGUI_CONTROLLER_NAV) .Options(CheckboxOptions().Tooltip( - "Allows controller navigation of the 2Ship menu (Settings, Enhancements,...)\nCAUTION: " + "Allows controller navigation of the port menu (Settings, Enhancements,...)\nCAUTION: " "This will disable game inputs while the menu is visible.\n\nD-pad to move between " "items, A to select, B to move up in scope.")); AddWidget(path, "Cursor Always Visible", WIDGET_CVAR_CHECKBOX) From 546b91510619989de3c7fc751cc647343e556e55 Mon Sep 17 00:00:00 2001 From: Spodi Date: Tue, 18 Mar 2025 09:24:50 +0100 Subject: [PATCH 082/267] Unify FPS and V-Sync controls and behavior between renderer (#5132) * FPS and refresh rate logic changes Changes FPS behavior on all renderer (despite the actual set FPS): - Clamp FPS to refresh rate when V-Sync on (or can't be disabled) - Stick to refresh rate when "MatchRefreshRate" is toggled on * Max 360 FPS for slider on all renderers * "Match Refresh Rate" unification Checkbox for all renderer. Was a button for DirectX. * Fix wrong CVAR for Match Refresh Rate * More descriptive V-Sync tooltip * Fix wrong CVar for DISABLE_FOR_DEBUG_MODE_OFF --- soh/soh/OTRGlobals.cpp | 9 +++----- soh/soh/SohGui/SohMenu.cpp | 4 ++-- soh/soh/SohGui/SohMenuSettings.cpp | 33 +++++++----------------------- 3 files changed, 12 insertions(+), 34 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 86d7d9382..70d12a78b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -499,15 +499,12 @@ bool OTRGlobals::HasOriginal() { } uint32_t OTRGlobals::GetInterpolationFPS() { - if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { - return CVarGetInteger(CVAR_SETTING("InterpolationFPS"), 20); - } - if (CVarGetInteger(CVAR_SETTING("MatchRefreshRate"), 0)) { return Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); + } else if (CVarGetInteger(CVAR_VSYNC_ENABLED, 1) || !Ship::Context::GetInstance()->GetWindow()->CanDisableVerticalSync()) { + return std::min(Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(), CVarGetInteger(CVAR_SETTING("InterpolationFPS"), 20)); } - - return std::min(Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(), CVarGetInteger(CVAR_SETTING("InterpolationFPS"), 20)); + return CVarGetInteger(CVAR_SETTING("InterpolationFPS"), 20); } extern "C" void OTRMessage_Init(); diff --git a/soh/soh/SohGui/SohMenu.cpp b/soh/soh/SohGui/SohMenu.cpp index d4aee295a..780aa51f2 100644 --- a/soh/soh/SohGui/SohMenu.cpp +++ b/soh/soh/SohGui/SohMenu.cpp @@ -125,7 +125,7 @@ void SohMenu::InitElement() { }, "Not Available on DirectX" } }, { DISABLE_FOR_MATCH_REFRESH_RATE_ON, - { [](disabledInfo& info) -> bool { return CVarGetInteger(CVAR_SETTING("gMatchRefreshRate"), 0); }, + { [](disabledInfo& info) -> bool { return CVarGetInteger(CVAR_SETTING("MatchRefreshRate"), 0); }, "Match Refresh Rate is Enabled" } }, { DISABLE_FOR_ADVANCED_RESOLUTION_ON, { [](disabledInfo& info) -> bool { return CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); }, @@ -140,7 +140,7 @@ void SohMenu::InitElement() { { DISABLE_FOR_NULL_PLAY_STATE, { [](disabledInfo& info) -> bool { return gPlayState == NULL; }, "Save Not Loaded" } }, { DISABLE_FOR_DEBUG_MODE_OFF, - { [](disabledInfo& info) -> bool { return !CVarGetInteger("gDeveloperTools.DebugEnabled", 0); }, + { [](disabledInfo& info) -> bool { return !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }, "Debug Mode is Disabled" } }, { DISABLE_FOR_FRAME_ADVANCE_OFF, { [](disabledInfo& info) -> bool { return !(gPlayState != nullptr && gPlayState->frameAdvCtx.enabled); }, diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 81d5b5244..b88065281 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -201,18 +201,10 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Audio API (Needs reload)", WIDGET_AUDIO_BACKEND); // Graphics Settings - static int32_t maxFps; - const char* tooltip = ""; - if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { - maxFps = 360; - tooltip = "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is " - "purely visual and does not impact game logic, execution of glitches etc.\n\nA higher target " - "FPS than your monitor's refresh rate will waste resources, and might give a worse result."; - } else { - maxFps = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); - tooltip = "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is " - "purely visual and does not impact game logic, execution of glitches etc."; - } + static int32_t maxFps = 360; + const char* tooltip = "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is " + "purely visual and does not impact game logic, execution of glitches etc.\n\nA higher target " + "FPS than your monitor's refresh rate will waste resources, and might give a worse result."; path.sidebarName = "Graphics"; AddSidebarEntry("Settings", "Graphics", 3); AddWidget(path, "Toggle Fullscreen", WIDGET_CVAR_CHECKBOX) @@ -276,25 +268,14 @@ void SohMenu::AddMenuSettings() { info.activeDisables.push_back(DISABLE_FOR_MATCH_REFRESH_RATE_ON); }) .Options(IntSliderOptions().Tooltip(tooltip).Min(20).Max(maxFps).DefaultValue(20).Format(fpsFormat)); - AddWidget(path, "Match Refresh Rate", WIDGET_BUTTON) - .Callback([](WidgetInfo& info) { - int hz = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); - if (hz >= 20 && hz <= 360) { - CVarSetInteger(CVAR_SETTING("InterpolationFPS"), hz); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - }) - .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NOT_DIRECTX).active; }) - .Options(ButtonOptions().Tooltip("Matches interpolation value to the current game's window refresh rate.")); AddWidget(path, "Match Refresh Rate", WIDGET_CVAR_CHECKBOX) - .CVar("gMatchRefreshRate") - .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_DIRECTX).active; }) - .Options(CheckboxOptions().Tooltip("Matches interpolation value to the current game's window refresh rate.")); + .CVar(CVAR_SETTING("MatchRefreshRate")) + .Options(CheckboxOptions().Tooltip("Matches interpolation value to the refresh rate of your display.")); AddWidget(path, "Renderer API (Needs reload)", WIDGET_VIDEO_BACKEND); AddWidget(path, "Enable Vsync", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_VSYNC_ENABLED) .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_VSYNC).active; }) - .Options(CheckboxOptions().Tooltip("Enables Vsync.")); + .Options(CheckboxOptions().Tooltip("Removes tearing, but clamps your max FPS to your displays refresh rate.")); AddWidget(path, "Windowed Fullscreen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SDL_WINDOWED_FULLSCREEN) .PreFunc([](WidgetInfo& info) { From 9e883ece96bd4cad524bed518e9dd93d1d94502f Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 18 Mar 2025 04:26:09 -0400 Subject: [PATCH 083/267] Fix/modern menu/secret flag (#5131) * Adds ability to set InputString fields as "secret" Meaning it shows the text as dots like a password field. Currently nothing that is merged into the main branch uses this but Anchor will need it. * Adds an `addedFlags` field to InputOptions. --- soh/soh/SohGui/UIWidgets.cpp | 9 +++++++-- soh/soh/SohGui/UIWidgets.hpp | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/soh/soh/SohGui/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp index 7fbad6705..18abb0094 100644 --- a/soh/soh/SohGui/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -777,7 +777,12 @@ bool InputString(const char* label, std::string* value, const InputOptions& opti } } ImGui::SetNextItemWidth(width); - if (ImGui::InputText(label, (char*)value->c_str(), value->capacity() + 1, ImGuiInputTextFlags_CallbackResize, InputTextResizeCallback, value)) { + ImGuiInputTextFlags flags = ImGuiInputTextFlags_CallbackResize; + if (options.secret) { + flags |= ImGuiInputTextFlags_Password; + } + flags |= options.addedFlags; + if (ImGui::InputText(label, (char*)value->c_str(), value->capacity() + 1, flags, InputTextResizeCallback, value)) { dirty = true; } if (value->empty() && !options.placeholder.empty()) { @@ -828,7 +833,7 @@ bool InputInt(const char* label, int32_t* value, const InputOptions& options) { } } ImGui::SetNextItemWidth(width); - if (ImGui::InputScalar(label, ImGuiDataType_S32, value)) { + if (ImGui::InputScalar(label, ImGuiDataType_S32, value, nullptr, nullptr, nullptr, options.addedFlags)) { dirty = true; } if ((ImGui::GetItemStatusFlags() & ImGuiItemStatusFlags_Edited) && !options.placeholder.empty()) { diff --git a/soh/soh/SohGui/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp index ebf483194..649395b43 100644 --- a/soh/soh/SohGui/UIWidgets.hpp +++ b/soh/soh/SohGui/UIWidgets.hpp @@ -425,6 +425,8 @@ namespace UIWidgets { std::string placeholder = ""; InputTypes type = InputTypes::String; std::string defaultValue = ""; + bool secret = false; + ImGuiInputFlags addedFlags = 0; InputOptions& Tooltip(const char* tooltip_) { WidgetOptions::tooltip = tooltip_; @@ -463,6 +465,11 @@ namespace UIWidgets { defaultValue = defaultValue_; return *this; } + + InputOptions& IsSecret(bool secret_ = false) { + secret = secret_; + return *this; + } }; void PushStyleMenu(const ImVec4& color); From ab5ea0e8ee896cfced2cc88e263890cd0af00cca Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 18 Mar 2025 10:12:45 +0100 Subject: [PATCH 084/267] Further Menu Improvements (#5129) * Menu improvements * Update calc for button offsets * Fix enemy rando UI --- soh/soh/Enhancements/controls/InputViewer.cpp | 2 - .../cosmetics/CosmeticsEditor.cpp | 10 +- .../Enhancements/debugger/MessageViewer.cpp | 2 - soh/soh/Enhancements/debugger/actorViewer.cpp | 3 - soh/soh/Enhancements/debugger/dlViewer.cpp | 5 - soh/soh/Enhancements/debugger/valueViewer.cpp | 2 - soh/soh/Enhancements/enemyrandomizer.cpp | 2 +- .../randomizer/randomizer_check_tracker.cpp | 4 - .../randomizer_entrance_tracker.cpp | 5 - .../randomizer/randomizer_item_tracker.cpp | 6 +- .../Enhancements/timesplits/TimeSplits.cpp | 2 - soh/soh/OTRGlobals.cpp | 2 +- soh/soh/SohGui/Menu.cpp | 18 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 158 ++++++++---------- soh/soh/SohGui/SohMenuSettings.cpp | 11 +- soh/soh/SohGui/SohModals.cpp | 2 - soh/soh/SohGui/UIWidgets.hpp | 86 ---------- 17 files changed, 100 insertions(+), 220 deletions(-) diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index 3eb18c0e2..c354e0319 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -428,7 +428,6 @@ InputViewerSettingsWindow::~InputViewerSettingsWindow() { } void InputViewerSettingsWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); // gInputViewer.Scale CVarSliderFloat("Input Viewer Scale: %.2f", CVAR_INPUT_VIEWER("Scale"), FloatSliderOptions().Color(THEME_COLOR).DefaultValue(1.0f).Min(0.1f).Max(5.0f).ShowButtons(true).Tooltip("Sets the on screen size of the input viewer")); @@ -640,5 +639,4 @@ void InputViewerSettingsWindow::DrawElement() { } } PopStyleHeader(); - ImGui::PopFont(); } diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 93c866eb3..f63c95e30 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -1523,7 +1523,7 @@ void Draw_Placements(){ CVarSetInteger(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed"), 1); } ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button("Reset##EnemyHealthBarWidth", UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value")); @@ -1537,7 +1537,7 @@ void Draw_Placements(){ void Reset_Option_Single(const char* Button_Title, const char* name) { ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button(Button_Title, UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(name); @@ -1546,7 +1546,7 @@ void Reset_Option_Single(const char* Button_Title, const char* name) { void Reset_Option_Double(const char* Button_Title, const char* name) { ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button(Button_Title, UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear((std::string(name) + ".Value").c_str()); @@ -1578,7 +1578,7 @@ void DrawSillyTab() { CVarSetInteger(CVAR_COSMETIC("Link.BodySize.Changed"), 1); } ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button("Reset##Link_BodySize", UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("Link.BodySize.Value")); @@ -2194,7 +2194,7 @@ void CosmeticsEditorWindow::DrawElement() { CVarSetInteger(CVAR_COSMETIC("Trails.Duration.Changed"), 1); } ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 24); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button("Reset##Trails_Duration", UIWidgets::ButtonOptions() .Size(ImVec2(80, 36)) .Padding(ImVec2(5.0f, 0.0f)))) { diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 49764374f..aabe9ad61 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -26,7 +26,6 @@ void MessageViewer::InitElement() { } void MessageViewer::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); ImGui::Text("Table ID"); ImGui::SameLine(); PushStyleInput(THEME_COLOR); @@ -86,7 +85,6 @@ void MessageViewer::DrawElement() { mDisplayCustomMessageClicked = true; } PopStyleButton(); - ImGui::PopFont(); } void MessageViewer::UpdateElement() { diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index a154df65b..767ff2723 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -934,8 +934,6 @@ void ActorViewerWindow::DrawElement() { static s16 currentSelectedInDropdown; static std::vector actors; - ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); - if (gPlayState != nullptr) { needs_reset = lastSceneId != gPlayState->sceneNum; if (needs_reset) { @@ -1234,7 +1232,6 @@ void ActorViewerWindow::DrawElement() { actors.clear(); } } - ImGui::PopFont(); } void ActorViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index 1459d2809..a591cf948 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -91,7 +91,6 @@ void PerformDisplayListSearch() { } void DLViewerWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); // Debounce the search field as listing otr files is expensive UIWidgets::PushStyleInput(THEME_COLOR); if (ImGui::InputText("Search Display Lists", searchString, ARRAY_COUNT(searchString))) { @@ -122,7 +121,6 @@ void DLViewerWindow::DrawElement() { UIWidgets::PopStyleCombobox(); if (activeDisplayList == "") { - ImGui::PopFont(); return; } @@ -131,7 +129,6 @@ void DLViewerWindow::DrawElement() { if (res->GetInitData()->Type != static_cast(Fast::ResourceType::DisplayList)) { ImGui::Text("Resource type is not a Display List. Please choose another."); - ImGui::PopFont(); return; } @@ -329,10 +326,8 @@ void DLViewerWindow::DrawElement() { } } catch (const std::exception& e) { ImGui::Text("Error displaying DL instructions."); - ImGui::PopFont(); return; } - ImGui::PopFont(); } void DLViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index 40ec77f71..23ce4e26c 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -143,7 +143,6 @@ void RegisterValueViewerHooks() { RegisterShipInitFunc initFunc(RegisterValueViewerHooks, { CVAR_NAME }); void ValueViewerWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); UIWidgets::CVarCheckbox("Enable Printing", CVAR_NAME, UIWidgets::CheckboxOptions().Color(THEME_COLOR)); ImGui::BeginGroup(); @@ -264,7 +263,6 @@ void ValueViewerWindow::DrawElement() { } ImGui::EndGroup(); } - ImGui::PopFont(); } void ValueViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index a2b72ca07..e638d04ad 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -286,7 +286,7 @@ void GetSelectedEnemies() { for (int i = 0; i < 49; i++) { if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)) { selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); - } else if (CVarGetInteger(enemyCVarList[i], 0)) { + } else if (CVarGetInteger(enemyCVarList[i], 1)) { selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index a60865de4..832276e65 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -1141,14 +1141,12 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag Color_Background.b / 255.0f, Color_Background.a / 255.0f)); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::Begin(UniqueName.c_str(), &open, windowFlags); } void EndFloatWindows() { ImGui::PopStyleVar(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); - ImGui::PopFont(); ImGui::End(); } @@ -1760,7 +1758,6 @@ static std::unordered_map buttonStrings = { { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }}; void CheckTrackerSettingsWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); if (ImGui::BeginTable("CheckTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -1827,7 +1824,6 @@ void CheckTrackerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); } ImGui::EndTable(); - ImGui::PopFont(); } void CheckTrackerWindow::InitElement() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 49755ff06..a6e1c6d07 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -660,7 +660,6 @@ void InitEntranceTrackingData() { void EntranceTrackerSettingsWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::TextWrapped("The entrance tracker will only track shuffled entrances"); UIWidgets::Spacer(0); @@ -722,7 +721,6 @@ void EntranceTrackerSettingsWindow::DrawElement() { ImGui::TextColored(ImColor(COLOR_GRAY), "Undiscovered Entrances"); ImGui::TreePop(); } - ImGui::PopFont(); } void EntranceTrackerWindow::Draw() { @@ -735,12 +733,10 @@ void EntranceTrackerWindow::Draw() { } void EntranceTrackerWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::SetNextWindowSize(ImVec2(600, 375), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Entrance Tracker", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); - ImGui::PopFont(); return; } @@ -938,7 +934,6 @@ void EntranceTrackerWindow::DrawElement() { } ImGui::EndChild(); ImGui::End(); - ImGui::PopFont(); } void EntranceTrackerWindow::InitElement() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 9bb562b31..de214c131 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -469,6 +469,7 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { if (!GameInteractor::IsSaveLoaded()) { return; } + ImGui::PushFont(OTRGlobals::Instance->fontMono); int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); int textSize = CVarGetInteger(CVAR_TRACKER_ITEM("TextSize"), 13); ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item); @@ -611,6 +612,7 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImGui::SetCursorScreenPos(ImVec2(p.x, p.y - 14)); ImGui::Text(""); } + ImGui::PopFont(); } void DrawEquip(ItemTrackerItem item) { @@ -952,14 +954,12 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { ImGui::PushStyleColor(ImGuiCol_WindowBg, VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), {0, 0, 0, 0}))); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); } void EndFloatingWindows() { ImGui::PopStyleVar(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); - ImGui::PopFont(); ImGui::End(); } @@ -1375,7 +1375,6 @@ static std::unordered_map extendedDisplayTypes = {{ SECTIO static std::unordered_map minimalDisplayTypes = {{ SECTION_DISPLAY_MINIMAL_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MINIMAL_SEPARATE, "Separate" }}; void ItemTrackerSettingsWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontStandardLarger); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); @@ -1541,7 +1540,6 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::PopStyleVar(1); ImGui::EndTable(); - ImGui::PopFont(); } void ItemTrackerWindow::InitElement() { diff --git a/soh/soh/Enhancements/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index 4340be330..a16a98f9e 100644 --- a/soh/soh/Enhancements/timesplits/TimeSplits.cpp +++ b/soh/soh/Enhancements/timesplits/TimeSplits.cpp @@ -941,7 +941,6 @@ static bool initialized = false; void TimeSplitWindow::DrawElement() { ImGui::SetWindowFontScale(timeSplitsWindowSize); - ImGui::PushFont(OTRGlobals::Instance->fontMonoLargest); PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("Split Tabs")) { @@ -960,7 +959,6 @@ void TimeSplitWindow::DrawElement() { ImGui::EndTabBar(); } PopStyleTabs(); - ImGui::PopFont(); } void TimeSplitWindow::InitElement() { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 70d12a78b..ed5a1169d 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -407,7 +407,7 @@ OTRGlobals::OTRGlobals() { fontStandard = CreateFontWithSize(16.0f, "fonts/Montserrat-Regular.ttf"); fontStandardLarger = CreateFontWithSize(20.0f, "fonts/Montserrat-Regular.ttf"); fontStandardLargest = CreateFontWithSize(24.0f, "fonts/Montserrat-Regular.ttf"); - ImGui::GetIO().FontDefault = fontMono; + ImGui::GetIO().FontDefault = fontStandardLarger; ScaleImGui(); // Move the camera strings from read only memory onto the heap (writable memory) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index 4dd939df8..be4bbdc89 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -530,13 +530,13 @@ void Menu::DrawElement() { ImGui::End(); return; } - ImGui::PushFont(OTRGlobals::Instance->fontStandardLargest); ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; ImGuiStyle& style = ImGui::GetStyle(); windowHeight = window->WorkRect.GetHeight(); windowWidth = window->WorkRect.GetWidth(); + ImGui::PushFont(OTRGlobals::Instance->fontStandardLargest); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 8.0f)); const char* headerCvar = CVAR_SETTING("Menu.ActiveHeader"); std::string headerIndex = CVarGetString(headerCvar, "Settings"); @@ -559,12 +559,13 @@ void Menu::DrawElement() { // Full screen menu with widths below 1280, heights below 800. // 5% of screen width/height padding on both sides above those resolutions. - ImVec2 menuSize = { std::fminf(1280, windowWidth), std::fminf(800, windowHeight) }; + // Menu width will never exceed a 16:9 aspect ratio. + ImVec2 menuSize = { windowWidth, windowHeight }; if (windowWidth > 1280) { - menuSize.x = floor(windowWidth * 0.9); + menuSize.x = std::fminf(windowWidth * 0.9f, (windowHeight * 1.77f)); } if (windowHeight > 800) { - menuSize.y = floor(windowHeight * 0.9); + menuSize.y = windowHeight * 0.9f; } pos += window->WorkRect.GetSize() / 2 - menuSize / 2; @@ -696,7 +697,12 @@ void Menu::DrawElement() { float sectionHeight = menuSize.y - headerHeight - 4 - style.ItemSpacing.y * 2; float columnHeight = sectionHeight - style.ItemSpacing.y * 4; ImGui::SetNextWindowPos(pos + style.ItemSpacing * 2); + + // Increase sidebar width on larger screens to accomodate people scaling their menus. float sidebarWidth = 200 - style.ItemSpacing.x; + if (menuSize.x > 1600) { + sidebarWidth = menuSize.x * 0.15f; + } const char* sidebarCvar = menuEntries.at(headerIndex).sidebarCvar; @@ -732,8 +738,8 @@ void Menu::DrawElement() { } } ImGui::EndChild(); + ImGui::PopFont(); - ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); pos = ImVec2{ sectionCenterX + (sidebarWidth / 2), topY } + style.ItemSpacing * 2; window->DrawList->AddRectFilled(pos, pos + ImVec2{ 4, sectionHeight - style.FramePadding.y * 2 }, ImGui::GetColorU32({ 255, 255, 255, 255 }), true, style.WindowRounding); @@ -802,8 +808,6 @@ void Menu::DrawElement() { if (!useColumns || menuSearchText.length() > 0) { ImGui::EndChild(); } - ImGui::PopFont(); - ImGui::PopFont(); if (!popout) { ImGui::PopStyleVar(); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 5f4961279..1adf34f5e 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -34,7 +34,8 @@ void SohMenu::AddMenuEnhancements() { if (iter->first != 0) comboboxTooltip += "\n\n"; comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); } - AddWidget(path, "Enhancement Presets", WIDGET_COMBOBOX) + AddWidget(path, "Enhancement Presets", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Select Preset", WIDGET_COMBOBOX) .ValuePointer(&enhancementPresetSelected) .Callback([](WidgetInfo& info) { const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(PRESET_TYPE_ENHANCEMENTS); @@ -46,6 +47,7 @@ void SohMenu::AddMenuEnhancements() { .Tooltip(comboboxTooltip.c_str()) ); AddWidget(path, "Apply Preset##Enhancemnts", WIDGET_BUTTON) + .Options(ButtonOptions().Size(UIWidgets::Sizes::Inline)) .Callback([](WidgetInfo& info) { const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(PRESET_TYPE_ENHANCEMENTS); const PresetTypeDefinition presetTypeDef = presetTypes.at(PRESET_TYPE_ENHANCEMENTS); @@ -1051,7 +1053,7 @@ void SohMenu::AddMenuEnhancements() { )); path.sidebarName = "Items"; - AddSidebarEntry("Enhancements", path.sidebarName, 2); + AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT); @@ -1678,7 +1680,7 @@ void SohMenu::AddMenuEnhancements() { ); path.sidebarName = "Extra Modes"; - AddSidebarEntry("Enhancements", path.sidebarName, 2); + AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; AddWidget(path, "Mirrored World", WIDGET_CVAR_COMBOBOX) @@ -1703,19 +1705,6 @@ void SohMenu::AddMenuEnhancements() { " - Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file\n" ) ); - AddWidget(path, "Randomized Enemy Sizes", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RandomizedEnemySizes")) - .Options(CheckboxOptions().Tooltip( - "Enemies and Bosses spawn with random sizes." - )); - AddWidget(path, "Scale Health with Size", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("EnemySizeScalesHealth")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0) == 0; - }) - .Options(CheckboxOptions().Tooltip( - "Scales normal enemies Health with their randomized size. *This will NOT affect bosses*" - )); AddWidget(path, "Ivan the Fairy (Coop Mode)", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("IvanCoopModeEnabled")) .Options(CheckboxOptions().Tooltip( @@ -1827,6 +1816,7 @@ void SohMenu::AddMenuEnhancements() { .PreFunc([](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ExtraTraps.Enabled"), 0) == 0; }); + path.column = SECTION_COLUMN_2; AddWidget(path, "Enemy Randomizer", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_ENHANCEMENT("RandomizedEnemies")) @@ -1843,22 +1833,34 @@ void SohMenu::AddMenuEnhancements() { "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file\n" ) ); + AddWidget(path, "Randomized Enemy Sizes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RandomizedEnemySizes")) + .Options(CheckboxOptions().Tooltip("Enemies and Bosses spawn with random sizes.")); + AddWidget(path, "Scale Health with Size", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnemySizeScalesHealth")) + .PreFunc( + [](WidgetInfo& info) { info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0); }) + .Options(CheckboxOptions().Tooltip( + "Scales normal enemies Health with their randomized size. *This will NOT affect bosses*")); AddWidget(path, "Enemy List", WIDGET_SEPARATOR_TEXT) .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) != ENEMY_RANDOMIZER_RANDOM; + info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); }); AddWidget(path, "Select All Enemies", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RandomizedEnemyList.All")) .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) != ENEMY_RANDOMIZER_RANDOM; + info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); }); - AddWidget(path, "Enemy List", WIDGET_SEPARATOR); + AddWidget(path, "Enemy List", WIDGET_SEPARATOR).PreFunc([](WidgetInfo& info) { + info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); + }); for (int i = 0; i < RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE; i++) { AddWidget(path, enemyNameList[i], WIDGET_CVAR_CHECKBOX) .CVar(enemyCVarList[i]) + .Options(CheckboxOptions().DefaultValue(true)) .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) != ENEMY_RANDOMIZER_RANDOM; - info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0) == 1; + info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0); info.options->disabledTooltip = "These options are disabled because \"Select All Enemies\" is enabled."; }) .Callback([](WidgetInfo& info) { @@ -1871,6 +1873,14 @@ void SohMenu::AddMenuEnhancements() { AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; + AddWidget(path, "Infinite...", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Money", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteMoney")); + AddWidget(path, "Health", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteHealth")); + AddWidget(path, "Ammo", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteAmmo")); + AddWidget(path, "Magic", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteMagic")); + AddWidget(path, "Nayru's Love", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteNayru")); + AddWidget(path, "Epona Boost", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteEponaBoost")); + AddWidget(path, "Inventory", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Super Tunic", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("SuperTunic")) @@ -1909,73 +1919,8 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "This allows you to put up for shield with any two-handed weapon in hand except for Deku Sticks." )); - AddWidget(path, "Deku Sticks:", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_CHEAT("DekuStick")) - .Options(ComboboxOptions().ComboMap( - dekuStickCheat - ).DefaultIndex(DEKU_STICK_NORMAL)); - AddWidget(path, "Bomb Timer Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) - .CVar(CVAR_CHEAT("BombTimerMultiplier")) - .Options(FloatSliderOptions() - .Format("%.2f") - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f)); - AddWidget(path, "Hookshot Everything", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("HookshotEverything")) - .Options(CheckboxOptions().Tooltip( - "Makes every surface in the game hookshot-able." - )); - AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) - .CVar(CVAR_CHEAT("HookshotReachMultiplier")) - .Options(FloatSliderOptions() - .Format("%.2f") - .Min(1.0f) - .Max(5.0f)); - AddWidget(path, "Change Age", WIDGET_BUTTON) - .Options(ButtonOptions().Tooltip("Switches Link's age and reloads the area.")) - .Callback([](WidgetInfo& info){ - SwitchAge(); - }); - AddWidget(path, "Clear Cutscene Pointer", WIDGET_BUTTON) - .Callback([](WidgetInfo& info) { - GameInteractor::RawAction::ClearCutscenePointer(); - }) - .Options(ButtonOptions().Tooltip( - "Clears the cutscene pointer to a value safe for wrong warps." - )); path.column = SECTION_COLUMN_2; - AddWidget(path, "Infinite...", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Money", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteMoney")); - AddWidget(path, "Health", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteHealth")); - AddWidget(path, "Ammo", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteAmmo")); - AddWidget(path, "Magic", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteMagic")); - AddWidget(path, "Nayru's Love", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteNayru")); - AddWidget(path, "Epona Boost", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteEponaBoost")); - - AddWidget(path, "Save States", WIDGET_SEPARATOR_TEXT); - AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " WARNING!!!! " ICON_FA_EXCLAMATION_TRIANGLE, WIDGET_TEXT) - .Options(WidgetOptions().Color(Colors::Orange)); - AddWidget(path, - "These are NOT like emulator states. They do not save your game progress " - "and they WILL break across transitions and load zones (like doors). " - "Support for related issues will not be provided.", WIDGET_TEXT - ); - AddWidget(path, "I promise I have read the warning", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("SaveStatePromise")) - .Callback([](WidgetInfo& info) { - CVarSetInteger(CVAR_CHEAT("SaveStatesEnabled"), 0); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - }); - AddWidget(path, "I understand, enable save states", WIDGET_CVAR_CHECKBOX) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_CHEAT("SaveStatePromise"), 0) == 0; - }) - .CVar(CVAR_CHEAT("SaveStatesEnabled")) - .Options(CheckboxOptions().Tooltip( - "F5 to save, F6 to change slots, F7 to load" - )); AddWidget(path, "Behavior", WIDGET_SEPARATOR_TEXT); AddWidget(path, "No Clip", WIDGET_CVAR_CHECKBOX) @@ -2024,7 +1969,46 @@ void SohMenu::AddMenuEnhancements() { "Keese and Guay no longer target you and simply ignore you as if you were wearing the " "Skull Mask." )); + + AddWidget(path, "Deku Sticks:", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_CHEAT("DekuStick")) + .Options(ComboboxOptions().ComboMap(dekuStickCheat).DefaultIndex(DEKU_STICK_NORMAL)); + AddWidget(path, "Bomb Timer Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("BombTimerMultiplier")) + .Options(FloatSliderOptions().Format("%.2f").Min(0.1f).Max(5.0f).DefaultValue(1.0f)); + AddWidget(path, "Hookshot Everything", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("HookshotEverything")) + .Options(CheckboxOptions().Tooltip("Makes every surface in the game hookshot-able.")); + AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("HookshotReachMultiplier")) + .Options(FloatSliderOptions().Format("%.2f").Min(1.0f).Max(5.0f)); + AddWidget(path, "Change Age", WIDGET_BUTTON) + .Options(ButtonOptions().Tooltip("Switches Link's age and reloads the area.")) + .Callback([](WidgetInfo& info) { SwitchAge(); }); + AddWidget(path, "Clear Cutscene Pointer", WIDGET_BUTTON) + .Callback([](WidgetInfo& info) { GameInteractor::RawAction::ClearCutscenePointer(); }) + .Options(ButtonOptions().Tooltip("Clears the cutscene pointer to a value safe for wrong warps.")); + path.column = SECTION_COLUMN_3; + AddWidget(path, "Save States", WIDGET_SEPARATOR_TEXT); + AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " WARNING!!!! " ICON_FA_EXCLAMATION_TRIANGLE, WIDGET_TEXT) + .Options(WidgetOptions().Color(Colors::Orange)); + AddWidget(path, + "These are NOT like emulator states. They do not save your game progress " + "and they WILL break across transitions and load zones (like doors). " + "Support for related issues will not be provided.", + WIDGET_TEXT); + AddWidget(path, "I promise I have read the warning", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("SaveStatePromise")) + .Callback([](WidgetInfo& info) { + CVarSetInteger(CVAR_CHEAT("SaveStatesEnabled"), 0); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + AddWidget(path, "I understand, enable save states", WIDGET_CVAR_CHECKBOX) + .PreFunc([](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_CHEAT("SaveStatePromise"), 0) == 0; }) + .CVar(CVAR_CHEAT("SaveStatesEnabled")) + .Options(CheckboxOptions().Tooltip("F5 to save, F6 to change slots, F7 to load")); + AddWidget(path, "Beta Quest", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Enable Beta Quest", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("EnableBetaQuest")) @@ -2100,7 +2084,7 @@ void SohMenu::AddMenuEnhancements() { // Timers path.sidebarName = "Timers"; - AddSidebarEntry("Enhancements", path.sidebarName, 1); + AddSidebarEntry("Enhancements", path.sidebarName, 3); AddWidget(path, "Toggle Timers Window", WIDGET_WINDOW_BUTTON) .CVar(CVAR_WINDOW("TimeDisplayEnabled")) .WindowName("Additional Timers") diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index b88065281..eec4c8674 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -55,6 +55,7 @@ void SohMenu::AddMenuSettings() { WidgetPath path = { "Settings", "General", SECTION_COLUMN_1 }; // General - Settings + AddWidget(path, "General Settings", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Menu Theme", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("Menu.Theme")) .Options(ComboboxOptions() @@ -207,6 +208,7 @@ void SohMenu::AddMenuSettings() { "FPS than your monitor's refresh rate will waste resources, and might give a worse result."; path.sidebarName = "Graphics"; AddSidebarEntry("Settings", "Graphics", 3); + AddWidget(path, "Graphics Options", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Toggle Fullscreen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SETTING("Fullscreen")) .Callback([](WidgetInfo& info) { Ship::Context::GetInstance()->GetWindow()->ToggleFullscreen(); }) @@ -292,9 +294,12 @@ void SohMenu::AddMenuSettings() { .CVar(CVAR_TEXTURE_FILTER) .Options(ComboboxOptions().Tooltip("Sets the applied Texture Filtering.").ComboMap(textureFilteringMap)); + path.column = SECTION_COLUMN_2; + AddWidget(path, "Advanced Graphics Options", WIDGET_SEPARATOR_TEXT); // Controls path.sidebarName = "Controls"; + path.column = SECTION_COLUMN_1; AddSidebarEntry("Settings", "Controls", 2); AddWidget(path, "Controller Bindings", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Popout Bindings Window", WIDGET_WINDOW_BUTTON) @@ -302,7 +307,9 @@ void SohMenu::AddMenuSettings() { .WindowName("Configure Controller") .Options(WindowButtonOptions().Tooltip("Enables the separate Bindings Window.")); - path.column = SECTION_COLUMN_2; + // Input Viewer + path.sidebarName = "Input Viewer"; + AddSidebarEntry("Settings", path.sidebarName, 3); AddWidget(path, "Input Viewer", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Toggle Input Viewer", WIDGET_WINDOW_BUTTON) .CVar(CVAR_WINDOW("InputViewer")) @@ -318,7 +325,7 @@ void SohMenu::AddMenuSettings() { // Notifications path.sidebarName = "Notifications"; path.column = SECTION_COLUMN_1; - AddSidebarEntry("Settings", "Notifications", 3); + AddSidebarEntry("Settings", path.sidebarName, 3); AddWidget(path, "Position", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("Notifications.Position")) .Options(ComboboxOptions() diff --git a/soh/soh/SohGui/SohModals.cpp b/soh/soh/SohGui/SohModals.cpp index c810d52e6..b1fe0b43b 100644 --- a/soh/soh/SohGui/SohModals.cpp +++ b/soh/soh/SohGui/SohModals.cpp @@ -30,7 +30,6 @@ void SohModalWindow::Draw() { } void SohModalWindow::DrawElement() { - ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); if (modals.size() > 0) { SohModal curModal = modals.at(0); if (!ImGui::IsPopupOpen(curModal.title_.c_str())) { @@ -62,7 +61,6 @@ void SohModalWindow::DrawElement() { } ImGui::EndPopup(); } - ImGui::PopFont(); } void SohModalWindow::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/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp index 649395b43..b9e69292e 100644 --- a/soh/soh/SohGui/UIWidgets.hpp +++ b/soh/soh/SohGui/UIWidgets.hpp @@ -515,92 +515,6 @@ namespace UIWidgets { void Separator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, float extraVerticalBottomPadding = 0.0f); - /*using ComboVariant = std::variant&, const std::vector&>; - - bool Combobox(const char* label, int32_t* value, ComboVariant comboSource, const ComboboxOptions& options = {}) { - bool dirty = false; - float startX = ImGui::GetCursorPosX(); - std::string invisibleLabelStr = "##" + std::string(label); - const char* invisibleLabel = invisibleLabelStr.c_str(); - ImGui::PushID(label); - ImGui::BeginGroup(); - ImGui::BeginDisabled(options.disabled); - PushStyleCombobox(options.color); - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { - ImGui::Text("%s", label); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); - } else if (options.labelPosition == LabelPosition::Near) { - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x - ImGui::GetStyle().ItemSpacing.x * 2); - } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { - ImGui::SetNextItemWidth(ImGui::CalcTextSize(comboMap.at(*value)).x + ImGui::GetStyle().FramePadding.x * 4 + ImGui::GetStyle().ItemSpacing.x); - } - } else if (options.alignment == ComponentAlignment::Right) { - if (options.labelPosition == LabelPosition::Above) { - ImGui::NewLine(); - ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); - ImGui::Text("%s", label); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); - } else if (options.labelPosition == LabelPosition::Near) { - ImGui::SameLine(ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x * 2); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); - } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { - float width = ImGui::CalcTextSize(comboMap.at(*value)).x + ImGui::GetStyle().FramePadding.x * 4; - ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); - } - } - if (ImGui::BeginCombo(invisibleLabel, comboMap.at(*value), options.flags)) { - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10.0f, 10.0f)); - for (const auto& pair : comboMap) { - if (strlen(pair.second) > 1) { - if (ImGui::Selectable(pair.second, pair.first == *value)) { - *value = pair.first; - dirty = true; - } - } - } - ImGui::PopStyleVar(); - ImGui::EndCombo(); - } - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { - ImGui::SameLine(); - ImGui::Text("%s", label); - } else if (options.labelPosition == LabelPosition::Far) { - ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x); - ImGui::Text("%s", label); - } - } else if (options.alignment == ComponentAlignment::Right) { - if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { - ImGui::SameLine(startX); - ImGui::Text("%s", label); - } - } - PopStyleCombobox(); - ImGui::EndDisabled(); - ImGui::EndGroup(); - if (options.disabled && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.disabledTooltip)) { - ImGui::SetTooltip("%s", WrappedText(options.disabledTooltip).c_str()); - } else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && !Ship_IsCStringEmpty(options.tooltip)) { - ImGui::SetTooltip("%s", WrappedText(options.tooltip).c_str()); - } - ImGui::PopID(); - return dirty; - } - - bool CVarCombobox(const char* label, const char* cvarName, ComboVariant comboSource, const ComboboxOptions& options = {}) { - bool dirty = false; - int32_t value = CVarGetInteger(cvarName, options.defaultIndex); - if (Combobox(label, &value, comboSource, options)) { - CVarSetInteger(cvarName, value); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick(); - ShipInit::Init(cvarName); - dirty = true; - } - return dirty; - }*/ - float CalcComboWidth(const char* preview_value, ImGuiComboFlags flags); template From 233c07d16aae1bfae44b9b530c67d77f4ff057d2 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:32:54 +0000 Subject: [PATCH 085/267] Fix entrance oversight in shield grave (#5137) --- .../randomizer/location_access/overworld/graveyard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 87a2e3b48..28d272711 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -50,7 +50,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, true), }, { //Exits - Entrance(RR_THE_GRAVEYARD, []{return true;}), + Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return true;}), }); areaTable[RR_GRAVEYARD_HEART_PIECE_GRAVE] = Region("Graveyard Heart Piece Grave", "Graveyard Heart Piece Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { From c72efd08a97b56f80e87d32f545024b9fd4ee651 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 08:43:14 +0100 Subject: [PATCH 086/267] Menu - Enhancements and cheats re-organisation (#5142) * First pass cheats, extra modes, minigames, difficulty, fixes, graphics * More progress. One tab left * Enhancements & cheats done and fix for item tracker font --- soh/soh/Enhancements/audio/AudioEditor.cpp | 151 +- soh/soh/Enhancements/presets.h | 8 +- .../randomizer/randomizer_item_tracker.cpp | 4 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 2356 +++++++---------- soh/soh/SohGui/SohMenuSettings.cpp | 14 + soh/soh/config/ConfigMigrators.h | 4 +- soh/src/code/z_lifemeter.c | 2 +- soh/src/code/z_parameter.c | 2 +- 8 files changed, 1127 insertions(+), 1414 deletions(-) diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index 0149aa148..efbcd5c28 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -488,6 +488,85 @@ void AudioEditor::DrawElement() { UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("SfxContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { + + static ImVec2 cellPadding(8.0f, 8.0f); + if (ImGui::BeginTabItem("Audio Options")) { + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); + ImGui::BeginTable("Audio Options", 1, ImGuiTableFlags_SizingStretchSame); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + if (ImGui::BeginChild("SfxOptions", ImVec2(0, -8))) { + UIWidgets::CVarCheckbox( + "Mute Low HP Alarm", CVAR_AUDIO("LowHPAlarm"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip("Disable the low HP beeping sound.")); + UIWidgets::CVarCheckbox("Disable Navi Call Audio", CVAR_AUDIO("DisableNaviCallAudio"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the voice audio when Navi calls you.")); + UIWidgets::CVarCheckbox( + "Disable Enemy Proximity Music", CVAR_AUDIO("EnemyBGMDisable"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the music change when getting close to enemies. Useful for hearing " + "your custom music for each scene more often.")); + UIWidgets::CVarCheckbox( + "Disable Leading Music in Lost Woods", CVAR_AUDIO("LostWoodsConsistentVolume"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Disables the volume shifting in the Lost Woods. Useful for hearing " + "your custom music in the Lost Woods if you don't need the navigation assitance " + "the volume changing provides. If toggling this while in the Lost Woods, reload " + "the area for the effect to kick in.")); + UIWidgets::CVarCheckbox( + "Display Sequence Name on Overlay", CVAR_AUDIO("SeqNameOverlay"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Displays the name of the current sequence in the corner of the screen whenever a new " + "sequence " + "is loaded to the main sequence player (does not apply to fanfares or enemy BGM).")); + UIWidgets::CVarSliderInt("Overlay Duration: %d seconds", CVAR_AUDIO("SeqNameOverlayDuration"), + UIWidgets::IntSliderOptions() + .Min(1) + .Max(10) + .DefaultValue(5) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + UIWidgets::CVarSliderFloat("Link's voice pitch multiplier", CVAR_AUDIO("LinkVoiceFreqMultiplier"), + UIWidgets::FloatSliderOptions() + .IsPercentage() + .Min(0.4f) + .Max(2.5f) + .DefaultValue(1.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); + ImGui::SameLine(); + ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 40.f); + if (UIWidgets::Button("Reset##linkVoiceFreqMultiplier", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + CVarSetFloat(CVAR_AUDIO("LinkVoiceFreqMultiplier"), 1.0f); + } + UIWidgets::CVarCheckbox( + "Randomize All Music and Sound Effects on New Scene", CVAR_AUDIO("RandomizeAllOnNewScene"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "Enables randomizing all unlocked music and sound effects when you enter a new scene.")); + UIWidgets::CVarCheckbox( + "Lower Octaves of Unplayable High Notes", CVAR_AUDIO("ExperimentalOctaveDrop"), + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Some custom sequences may have notes that are too high for the game's audio " + "engine to play. Enabling this checkbox will cause these notes to drop a " + "couple of octaves so they can still harmonize with the other notes of the " + "sequence.")); + } + ImGui::EndChild(); + ImGui::EndTable(); + ImGui::PopStyleVar(1); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Background Music")) { Draw_SfxTab("backgroundMusic", SEQ_BGM_WORLD, "Background Music"); ImGui::EndTabItem(); @@ -518,78 +597,6 @@ void AudioEditor::DrawElement() { ImGui::EndTabItem(); } - static ImVec2 cellPadding(8.0f, 8.0f); - if (ImGui::BeginTabItem("Options")) { - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - ImGui::BeginTable("Options", 1, ImGuiTableFlags_SizingStretchSame); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - if (ImGui::BeginChild("SfxOptions", ImVec2(0, -8))) { - UIWidgets::CVarCheckbox( - "Disable Enemy Proximity Music", CVAR_AUDIO("EnemyBGMDisable"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip("Disables the music change when getting close to enemies. Useful for hearing " - "your custom music for each scene more often.")); - UIWidgets::CVarCheckbox( - "Disable Leading Music in Lost Woods", CVAR_AUDIO("LostWoodsConsistentVolume"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip("Disables the volume shifting in the Lost Woods. Useful for hearing " - "your custom music in the Lost Woods if you don't need the navigation assitance " - "the volume changing provides. If toggling this while in the Lost Woods, reload " - "the area for the effect to kick in.")); - UIWidgets::CVarCheckbox( - "Display Sequence Name on Overlay", CVAR_AUDIO("SeqNameOverlay"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip("Displays the name of the current sequence in the corner of the screen whenever a new " - "sequence " - "is loaded to the main sequence player (does not apply to fanfares or enemy BGM).")); - UIWidgets::CVarSliderInt("Overlay Duration: %d seconds", CVAR_AUDIO("SeqNameOverlayDuration"), - UIWidgets::IntSliderOptions() - .Min(1) - .Max(10) - .DefaultValue(5) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); - UIWidgets::CVarSliderFloat("Link's voice pitch multiplier", - CVAR_AUDIO("LinkVoiceFreqMultiplier"), - UIWidgets::FloatSliderOptions() - .IsPercentage() - .Min(0.4f) - .Max(2.5f) - .DefaultValue(1.0f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); - ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 40.f); - if (UIWidgets::Button("Reset##linkVoiceFreqMultiplier", - UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { - CVarSetFloat(CVAR_AUDIO("LinkVoiceFreqMultiplier"), 1.0f); - } - UIWidgets::CVarCheckbox( - "Randomize All Music and Sound Effects on New Scene", CVAR_AUDIO("RandomizeAllOnNewScene"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip( - "Enables randomizing all unlocked music and sound effects when you enter a new scene.")); - UIWidgets::CVarCheckbox( - "Lower Octaves of Unplayable High Notes", CVAR_AUDIO("ExperimentalOctaveDrop"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip("Some custom sequences may have notes that are too high for the game's audio " - "engine to play. Enabling this checkbox will cause these notes to drop a " - "couple of octaves so they can still harmonize with the other notes of the " - "sequence.")); - } - ImGui::EndChild(); - ImGui::EndTable(); - ImGui::PopStyleVar(1); - ImGui::EndTabItem(); - } - static bool excludeTabOpen = false; if (ImGui::BeginTabItem("Audio Shuffle Pool Management")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 2922ec589..a7bca4e66 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -242,7 +242,7 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), // Disable Navi Call Audio - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), + PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), // Equipment Toggle PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), @@ -373,7 +373,7 @@ const std::vector randomizerPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), // Disable Navi Call Audio - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), + PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), // Equipment Toggle PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), @@ -436,7 +436,7 @@ const std::vector spockRacePresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), + PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), @@ -531,7 +531,7 @@ const std::vector spockRaceNoLogicPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeAllNight"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 1), + PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index de214c131..51f161def 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -469,7 +469,6 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { if (!GameInteractor::IsSaveLoaded()) { return; } - ImGui::PushFont(OTRGlobals::Instance->fontMono); int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); int textSize = CVarGetInteger(CVAR_TRACKER_ITEM("TextSize"), 13); ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item); @@ -612,7 +611,6 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImGui::SetCursorScreenPos(ImVec2(p.x, p.y - 14)); ImGui::Text(""); } - ImGui::PopFont(); } void DrawEquip(ItemTrackerItem item) { @@ -1218,9 +1216,11 @@ void ItemTrackerWindow::Draw() { if (!IsVisible()) { return; } + ImGui::PushFont(OTRGlobals::Instance->fontMono); DrawElement(); // Sync up the IsVisible flag if it was changed by ImGui SyncVisibilityConsoleVariable(); + ImGui::PopFont(); } void ItemTrackerWindow::DrawElement() { diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 1adf34f5e..6f0caff61 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -66,400 +66,193 @@ void SohMenu::AddMenuEnhancements() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); }); - path.sidebarName = "Gameplay"; + // Quality of Life + path.sidebarName = "Quality of Life"; AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; - AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("BootSequence")) - .Options(ComboboxOptions() - .DefaultIndex(BOOTSEQUENCE_DEFAULT) - .ComboMap(bootSequenceLabels) - .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" - ) - ); + AddWidget(path, "Saving", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Autosave", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("Autosave")) .Options(CheckboxOptions().Tooltip( "Save the game automatically on a 3 minute interval and when soft-resetting the game. The interval " "autosave will wait if the game is paused in any way (dialogue, pause screen up, cutscenes, " "etc.).\n\n" - "The soft-reset save will *not* trigger in cutscene maps like the Chamber of Sages!" - )); + "The soft-reset save will *not* trigger in cutscene maps like the Chamber of Sages!")); + AddWidget(path, "Remember Save Location", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RememberSaveLocation")) + .Options(CheckboxOptions().Tooltip( + "When loading a save, places Link at the last entrance he went through.\n" + "This doesn't work if the save was made in grottos, fairy fountains, or dungeons.")); - AddWidget(path, "Audio", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Mute Low HP Alarm", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("LowHPAlarm")) + AddWidget(path, "Containers Match Contents", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Chest Size & Texture Matches Contents", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents")) + .Callback([](WidgetInfo& info) { + if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) == CSMC_DISABLED) { + CVarSetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + } + }) + .Options(ComboboxOptions() + .ComboMap(chestStyleMatchesContentsOptions) + .DefaultIndex(CSMC_DISABLED) + .Tooltip("Chest sizes and textures are changed to help identify the item inside.\n" + " - Major items: Large gold chests\n" + " - Lesser items: Large brown chests\n" + " - Junk items: Small brown chests\n" + " - Small keys: Small silver chests\n" + " - Boss keys: Vanilla size and texture\n" + " - Skulltula Tokens: Small skulltula chest\n" + "\n" + "NOTE: Textures will not apply if you are using a mod pack with a custom chest model.")); + AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony")) + .PreFunc([](WidgetInfo& info) { + info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchesContents"), CSMC_DISABLED); + }) + .Options(CheckboxOptions().Tooltip("Only change the size/texture of chests if you have the Stone of Agony.")); + + AddWidget(path, "Time of Day", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Nighttime GS Always Spawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NightGSAlwaysSpawn")) + .Options(CheckboxOptions().Tooltip("Nighttime Skulltulas will spawn during both day and night.")); + AddWidget(path, "Pull Grave during the day", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DayGravePull")) + .Options(CheckboxOptions().Tooltip("Allows graves to be pulled when child during the day.")); + AddWidget(path, "Dampe Appears All Night", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DampeAllNight")) .Options(CheckboxOptions().Tooltip( - "Disable the low HP beeping sound." - )); - AddWidget(path, "Disable Navi Call Audio", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableNaviCallAudio")) + "Makes Dampe appear anytime during the night, not just his usual working hours.")); + AddWidget(path, "Exit Market at Night", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MarketSneak")) .Options(CheckboxOptions().Tooltip( - "Disables the voice audio when Navi calls you." - )); + "Allows exiting Hyrule Castle Market Town to Hyrule Field at night by speaking to the guard " + "next to the gate.")); + AddWidget(path, "Shops and Games Always Open", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("OpenAllHours")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = + IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_LOCK_OVERWORLD_DOORS).Is(RO_GENERIC_ON); + }) + .Options( + CheckboxOptions() + .Tooltip("Shops and Minigames are open both day and night. Requires a scene reload to take effect.") + .DisabledTooltip("This is not compatible with the Locked Overworld Doors Randomizer option.")); AddWidget(path, "Pause Menu", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Allow the Cursor to be on any slot", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_ENHANCEMENT("PauseAnyCursor")) - .Options(ComboboxOptions() - .ComboMap(cursorAnywhereValues) - .DefaultIndex(PAUSE_ANY_CURSOR_RANDO_ONLY) - .Tooltip( - "Allows the cursor on the pause menu to be over any slot. Sometimes required in Randomizer " - "to select certain items." - ) - ); - AddWidget(path, "Assignable Tunics and Boots", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("AssignableTunicsAndBoots")) + .Options( + ComboboxOptions() + .ComboMap(cursorAnywhereValues) + .DefaultIndex(PAUSE_ANY_CURSOR_RANDO_ONLY) + .Tooltip("Allows the cursor on the pause menu to be over any slot. Sometimes required in Randomizer " + "to select certain items.")); + AddWidget(path, "Pause Warp", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("PauseWarp")) .Options(CheckboxOptions().Tooltip( - "Allows equipping the Tunics and Boots to C-Buttons/D-Pad." - )); - // TODO: Revist strength toggle, it's currently separate but should probably go here and be locked behind the - // Equipment toggle settings. Also maybe these should all be in Items sidebar? - AddWidget(path, "Equipment Toggle", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("EquipmentCanBeRemoved")) - .Options(CheckboxOptions().Tooltip( - "Allows equipment to be removed by toggling it off on\n the equipment subscreen." - )); - AddWidget(path, "Sword Toggle Options", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("SwordToggle")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 0) == 0; - }) - .Options(ComboboxOptions() - .ComboMap(swordToggleModes) - .DefaultIndex(SWORD_TOGGLE_NONE) - .Tooltip( - "Introduces Options for unequipping Link's sword\n\n" - "None: Only Biggoron's Sword/Giant's Knife can be toggled. Doing so will equip the Master Sword.\n\n" - "Child Toggle: This will allow for completely unequipping any sword as child link.\n\n" - "Both Ages: Any sword can be unequipped as either age. This may lead to swordless glitches as Adult." - ) - ); - - AddWidget(path, "Quality of Life", WIDGET_SEPARATOR_TEXT); - // Maybe should be in Timesavers somewhere? - AddWidget(path, "Link's Cow in Both Time Periods", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CowOfTime")) - .Options(CheckboxOptions().Tooltip( - "Allows the Lon Lon Ranch Obstacle Course reward to be shared across time periods." - )); - // Maybe should be in Difficulty Options somewhere? - AddWidget(path, "Enable Visual Guard Vision", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("GuardVision")); - // Maybe should be in TImesavers somewhere? - AddWidget(path, "Pull Grave during the day", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DayGravePull")) - .Options(CheckboxOptions().Tooltip( - "Allows graves to be pulled when child during the day." - )); + "Selection of warp song in pause menu initiates a warp. Disables song playback.")); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Answer Navi Prompt with L Button", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NaviOnL")) + .Options(CheckboxOptions().Tooltip("Speak to Navi with L but enter First-Person Camera with C-Up")); AddWidget(path, "Don't Require Input for Credits Sequence", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NoInputForCredits")) .Options(CheckboxOptions().Tooltip( "Removes the Input Requirement on Text boxes after defeating Ganon, allowing the Credits " - "Sequence to continue to progress." - )); - AddWidget(path, "Answer Navi Prompt with L Button", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NaviOnL")) - .Options(CheckboxOptions().Tooltip( - "Speak to Navi with L but enter First-Person Camera with C-Up" - )); - AddWidget(path, "Disable Crit Wiggle", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableCritWiggle")) - .Options(CheckboxOptions().Tooltip( - "Disable Random Camera Wiggle at Low Health." - )); - AddWidget(path, "Targetable Hookshot Reticle", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("HookshotableReticle")) - .Options(CheckboxOptions().Tooltip( - "Makes the Hookshot Reticle use a different color when aiming at Hookshotable Collision." - )); - AddWidget(path, "Faster Rupee Accumulator", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FasterRupeeAccumulator")) - .Options(CheckboxOptions().Tooltip( - "Causes your Wallet to fill and empty faster when you gain or lose money." - )); - AddWidget(path, "Fun/Aesthetic Options", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Enable Passage of Time on File Select", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("TimeFlowFileSelect")); - AddWidget(path, "Dogs Follow you Everywhere", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DogFollowsEverywhere")) - .Options(CheckboxOptions().Tooltip( - "Allows dogs to follow you anywhere you go, even if you leave the Market." - )); - AddWidget(path, "Enemy Health Bars", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("EnemyHealthBar")) - .Options(CheckboxOptions().Tooltip( - "Renders a health bar for Enemies when Z-Targeted." - )); - - path.column = SECTION_COLUMN_2; - AddWidget(path, "Authentic Bug Fixes", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Fix L&R Pause Menu", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixMenuLR")) - .Options(CheckboxOptions().Tooltip( - "Makes the L and R buttons in the pause menu the same color" - )); - AddWidget(path, "Fix L&Z Page Switch in Pause Menu", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NGCKaleidoSwitcher")) - .Options(CheckboxOptions().Tooltip( - "Makes L and R switch pages like on the Gamecube. Z opens the Debug Menu instead." - )); - AddWidget(path, "Fix Dungeon Entrances", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixDungeonMinimapIcon")) - .Options(CheckboxOptions().Tooltip( - "Removes the Dungeon Entrance icon on the top-left corner of the screen when no dungeon is present on the " - "current map." - )); - AddWidget(path, "Fix Two-Handled Idle Animations", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("TwoHandedIdle")) - .Options(CheckboxOptions().Tooltip( - "Re-Enables the two-handed idle animation, a seemingly finished animation that was disabled on accident " - "in the original game." - )); - AddWidget(path, "Fix the Gravedigging Tour Glitch", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("GravediggingTourFix")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); - info.options->disabledTooltip = "This setting is always enabled in randomized save files."; - }) - .Options(CheckboxOptions().Tooltip( - "Fixes a bug where the Gravedigging Tour Heart Piece disappears if the area reloads." - )); - AddWidget(path, "Fix Deku Nut Upgrade", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DekuNutUpgradeFix")) - .Options(CheckboxOptions().Tooltip( - "Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw." - )); - AddWidget(path, "Fix Navi Text HUD Position", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NaviTextFix")) - .Options(CheckboxOptions().Tooltip( - "Correctly centers the Navi text prompt on the HUD's C-Up button." - )); - AddWidget(path, "Fix Anubis Fireballs", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("AnubisFix")) - .Options(CheckboxOptions().Tooltip( - "Make Anubis Fireballs do Fire damage when reflected back at them with the Mirror Shield." - )); - AddWidget(path, "Fix Megaton Hammer Crouch Stab", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CrouchStabHammerFix")) - .Callback([](WidgetInfo& info) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0)) { - CVarClear(CVAR_ENHANCEMENT("CrouchStabFix")); - } - }) - .Options(CheckboxOptions().Tooltip( - "Make the Megaton Hammer's crouch stab able to destroy rocks without first swinging it normally." - )); - AddWidget(path, "Remove Power Crouch Stab", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CrouchStabFix")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0) == 0; - }) - .Options(CheckboxOptions().Tooltip( - "Make crouch stabbing always do the same damage as a regular slash." - )); - AddWidget(path, "Fix Credits Timing", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CreditsFix")) - .Options(CheckboxOptions().Tooltip( - "Extend certain credits scenes so the music lines up properly with the visuals." - )); - AddWidget(path, "Fix Gerudo Warrior's Clothing Colors", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("GerudoWarriorClothingFix")) - .Options(CheckboxOptions().Tooltip( - "Prevent the Gerudo Warrior's clothes changign color when changing Link's tunic or " - "using Bombs in front of her." - )); - AddWidget(path, "Fix Camera Drift", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixCameraDrift")) - .Options(CheckboxOptions().Tooltip( - "Fixes camera slightly drifting to the left when standing still due to a math error." - )); - AddWidget(path, "Fix Camera Swing", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixCameraSwing")) - .Options(CheckboxOptions().Tooltip( - "Fixes camera getting stuck on collision when standing still. Also fixes slight shift " - "back in camera when Link stops moving." - )); - AddWidget(path, "Fix Hanging Ledge Swing Rate", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixHangingLedgeSwingRate")) - .Options(CheckboxOptions().Tooltip( - "Fixes camera swing rate when the player falls off a ledge and the camera swings around." - )); - AddWidget(path, "Fix Missing Jingle after 5 Silver Rupees", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("SilverRupeeJingleExtend")) - .Options(CheckboxOptions().Tooltip( - "Adds 5 higher pitches for the Silver Rupee Jingle for the rooms with more than 5 Silver Rupees. " - "Only relevant for playthroughs involving Master Quest Dungeons." - )); - AddWidget(path, "Fix Out of Bounds Textures", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixTexturesOOB")) - .Callback([](WidgetInfo& info) { - ApplyAuthenticGfxPatches(); - }) - .Options(CheckboxOptions().Tooltip( - "Fixes authentic out of bounds texture reads, instead loading textures with the correct size." - )); - AddWidget(path, "Fix Poacher's Saw Softlock", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixSawSoftlock")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("SkipText"), 0) == 1; - info.options->disabledTooltip = "This option is forced on when Skip Text is enabled."; - }) - .Options(CheckboxOptions().Tooltip( - "Prevents the Poacher's Saw softlock from mashing through the text, or with Skip Text enabled." - )); - AddWidget(path, "Fix Enemies not Spawning Near Water", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes")) - .Options(CheckboxOptions().Tooltip( - "Causes respanwing enemies, like Stalchildren, to appear on land near bodies of water. " - "Fixes an incorrect calculation that acted like water underneath ground was above it." - )); - AddWidget(path, "Fix Bush Item Drops", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BushDropFix")) - .Options(CheckboxOptions().Tooltip( - "Fixes the bushes to drop items correctly rather than spawning undefined items." - )); - AddWidget(path, "Fix Falling from Vine Edges", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixVineFall")) - .Options(CheckboxOptions().Tooltip( - "Prevents immediately falling off climbable surfaces if climbing on the edges." - )); - AddWidget(path, "Fix Link's Eyes Open while Sleeping", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping")) - .Options(CheckboxOptions().Tooltip( - "Fixes Link's eyes being open in the openeing cutscene when he is supposed to be sleeping." - )); - AddWidget(path, "Fix Darunia Dancing Too Fast", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed")) - .Options(CheckboxOptions().Tooltip( - "Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in the Original Game." - )); - AddWidget(path, "Fix Raised Floor Switches", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixFloorSwitches")) - .Options(CheckboxOptions().Tooltip( - "Fixes the two raised floor switches, the one in Forest Temple Basement and the one at the top of Fire " - "Temple. This will lower them, making activating them easier." - )); - AddWidget(path, "Fix Zora Hint Dialogue", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixZoraHintDialogue")) - .Options(CheckboxOptions().Tooltip( - "Fixes one Zora's dialogue giving a hint about bringing Ruto's Letter to King Zora to properly occur " - "before moving King Zora rather than after." - )); - AddWidget(path, "Fix Hand Holding Hammer", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixHammerHand")) - .Callback([](WidgetInfo& info) { - UpdatePatchHand(); - }) - .Options(CheckboxOptions().Tooltip( - "Fixes Adult Link having a backwards Left hand when holding the Megaton Hammer." - )); - AddWidget(path, "Fix Broken Giant's Knife Bug", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FixGrokenGiantsKnife")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); - info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a Randomizer."; - }) - .Callback([](WidgetInfo& info) { - bool hasGiantsKnife = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON); - bool hasBrokenKnife = CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); - bool knifeIsBroken = gSaveContext.swordHealth == 0.0f; - - if (hasGiantsKnife && (hasBrokenKnife != knifeIsBroken)) { - func_800849EC(gPlayState); - } - }) - .Options(CheckboxOptions().Tooltip( - "Fixes the Broken Giant's Knife flag not being reset when Medigoron fixes it." - )); - - path.column = SECTION_COLUMN_3; - AddWidget(path, "Restorations", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Red Ganon Blood", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RedGanonBlood")) - .Options(CheckboxOptions().Tooltip( - "Restore the original red blood from NTSC 1.0/1.1. Disable for Green blood." - )); - AddWidget(path, "Fish while Hovering", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("HoverFishing")) - .Options(CheckboxOptions().Tooltip( - "Restore a bug from NSTC 1.0 that allows casting the Fishing Rod while using the Hover Boots." - )); - AddWidget(path, "N64 Weird Frames", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("N64WeirdFrames")) - .Options(CheckboxOptions().Tooltip( - "Restores N64 Weird Frames allwing weirdshots to behave the same as N64." - )); - AddWidget(path, "Bombchus Out of Bounds", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BombchusOOB")) - .Options(CheckboxOptions().Tooltip( - "Allows Bombchus to explode out of bounds. Similar to Gamecube and Wii VC" - )); - AddWidget(path, "Quick Putaway", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("QuickPutaway")) - .Options(CheckboxOptions().Tooltip( - "Restore a bug from NTSC 1.0 that allows putting away an item without an animation and performing " - "Putaway Ocarina Items." - )); - AddWidget(path, "Restore Old Gold Skulltula Cutscene", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("GSCutscene")) - .Options(CheckboxOptions().Tooltip( - "Restore pre-release behavior where defeating a Gold Skulltula will play a cutscene showing it die." - )); - AddWidget(path, "Quick Bongo Kill", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("QuickBongoKill")) - .Options(CheckboxOptions().Tooltip( - "Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him." - )); - AddWidget(path, "Original RBA Values", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RestoreRBAValues")) - .Options(CheckboxOptions().Tooltip( - "Restores the original outcomes when performing Reverse Bottle Adventure." - )); - AddWidget(path, "Early Eyeball Frog", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("EarlyEyeballFrog")) - .Options(CheckboxOptions().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." - )); - AddWidget(path, "Pulsate Boss Icon", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("Pulsate Boss Icon")) - .Options(CheckboxOptions().Tooltip( - "Restores an unfinished feature to pulsate the boss room icon when you are in the boss room." - )); - AddWidget(path, "Pause Buffer Input Window: %d frames", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("PauseBufferWindow")) - .Options(IntSliderOptions() - .Min(0) - .Max(40) - .DefaultValue(0) - .Format("%d frames") - ); + "Sequence to continue to progress.")); AddWidget(path, "Include Held Inputs at the Start of Buffer Input Window", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("IncludeHeldInputsBufferWindow")) .Options(CheckboxOptions().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." - )); + "undesireably, for instance Z-Targetting something you might not want to.")); + AddWidget(path, "Pause Buffer Input Window: %d frames", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("PauseBufferWindow")) + .Options(IntSliderOptions().Min(0).Max(40).DefaultValue(0).Format("%d frames")); AddWidget(path, "Simulated Input Lag: %d frames", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_SIMULATED_INPUT_LAG) .Options(IntSliderOptions() - .Min(0) - .Max(6) - .DefaultValue(0) - .Format("%d frames") - .Tooltip( - "Buffers your inputs to be executed a specified amount of frames later." - ) - ); + .Min(0) + .Max(6) + .DefaultValue(0) + .Format("%d frames") + .Tooltip("Buffers your inputs to be executed a specified amount of frames later.")); - path.sidebarName = "Time Savers"; + AddWidget(path, "Item Count Messages", WIDGET_SEPARATOR_TEXT); + int numOptions = ARRAY_COUNT(itemCountMessageCVars); + bool allItemCountsChecked = false; + AddWidget(path, "All", WIDGET_CHECKBOX) + .ValuePointer(&allItemCountsChecked) + .PreFunc([](WidgetInfo& info) { + int numOptions = ARRAY_COUNT(itemCountMessageCVars); + *std::get(info.valuePointer) = std::all_of(itemCountMessageCVars, itemCountMessageCVars + numOptions, + [](const char* cvar) { return CVarGetInteger(cvar, 0); }); + }) + .Callback([](WidgetInfo& info) { + int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; + int numOptions = ARRAY_COUNT(itemCountMessageCVars); + std::for_each(itemCountMessageCVars, itemCountMessageCVars + numOptions, + [newValue](const char* cvar) { CVarSetInteger(cvar, newValue); }); + + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + for (int i = 0; i < numOptions; i++) { + AddWidget(path, itemCountMessageOptions[i], WIDGET_CVAR_CHECKBOX).CVar(itemCountMessageCVars[i]); + } + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Misc", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Disable Crit Wiggle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableCritWiggle")) + .Options(CheckboxOptions().Tooltip("Disable Random Camera Wiggle at Low Health.")); + AddWidget(path, "Better Owl", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterOwl")) + .Options(CheckboxOptions().Tooltip( + "The default response to Kaepora Gaebora is always that you understood what he said.")); + + AddWidget(path, "Convenience", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Quit Fishing At Door", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("QuitFishingAtDoor")) + .Options(CheckboxOptions().Tooltip( + "Fisherman asks if you want to quit at the door if you try to leave the Fishing Pond " + "while still holding the Fishing Rod.")); + AddWidget(path, "Instant Putaway", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantPutaway")) + .Options(CheckboxOptions().Tooltip("Allow Link to put items away without having to wait around.")); + AddWidget(path, "Navi Timer Resets", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ResetNaviTimer")) + .Options( + CheckboxOptions().Tooltip("Resets the Navi timer on scene change. If you have already talked to her, " + "she will try and talk to you again, instead of needing a save warp or death.")); + AddWidget(path, "Link's Cow in Both Time Periods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CowOfTime")) + .Options(CheckboxOptions().Tooltip( + "Allows the Lon Lon Ranch Obstacle Course reward to be shared across time periods.")); + AddWidget(path, "Play Zelda's Lullaby to Open Sleeping Waterfall", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = + IS_RANDO && + OTRGlobals::Instance->gRandoContext->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomizer savefile with " + "\"Sleeping Waterfall: Open\" is loaded."; + }) + .Options( + ComboboxOptions() + .ComboMap(sleepingWaterfallOptions) + .DefaultIndex(WATERFALL_ALWAYS) + .Tooltip( + "Always: Link must always play Zelda's Lullaby to open the waterfall entrance to Zora's Domain.\n" + "Once: Link only needs to play Zelda's Lullaby once to open the waterfall; after that, it stays " + "open permanently.\n" + "Never: Link never needs to play Zelda's Lullaby to open the waterfall. He only needs to have " + "learned it and have an Ocarina.")); + + // Skips & Speed-ups + path.sidebarName = "Skips & Speed-ups"; AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; @@ -469,16 +262,16 @@ void SohMenu::AddMenuEnhancements() { .ValuePointer(&allSkipsChecked) .PreFunc([](WidgetInfo& info) { *std::get(info.valuePointer) = - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), IS_RANDO); + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), IS_RANDO); }) .Callback([](WidgetInfo& info) { int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; @@ -531,259 +324,98 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Don't skip cutscenes that are associated wiht useful glitches. Currently, it is " "only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, and the Box Skip One " - "Point in Jabu." - )); - AddWidget(path, "Skip Child Stealth", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipChildStealth")) - .Options(CheckboxOptions().Tooltip( - "The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards." - )); - AddWidget(path, "Skip Tower Escape", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipTowerEscape")) - .Options(CheckboxOptions().Tooltip( - "Skip the tower escape sequence between Ganondorf and Ganon." - )); - + "Point in Jabu.")); + AddWidget(path, "Text", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Skip Pickup Messages", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastDrops")) + .Options(CheckboxOptions().Tooltip("Skip Pickup Messages for new Consumable Items and Bottle Swipes.")); AddWidget(path, "Skip Forced Dialog", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipForcedDialog")) - .Options(CheckboxOptions().Tooltip( - "Prevent forced conversations with Navi or other NPCs." - )); - AddWidget(path, "Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("TextSpeed")) - .Options(IntSliderOptions() - .Min(1) - .Max(5) - .DefaultValue(1) - .Format("%dx") - ); + .Options(CheckboxOptions().Tooltip("Prevent forced conversations with Navi or other NPCs.")); AddWidget(path, "Skip Text", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SkipText")) .Options(CheckboxOptions().Tooltip("Holding down B skips text.")); + AddWidget(path, "Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("TextSpeed")) + .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx")); AddWidget(path, "Slow Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("SlowTextSpeed")) - .Options(IntSliderOptions() - .Min(1) - .Max(5) - .DefaultValue(1) - .Format("%dx") - .Tooltip( - "Changes the speed of sections of text that normally are paced slower than the text surrounding it." - ) - ); - AddWidget(path, "Match Normal Text", WIDGET_BUTTON) - .Callback([](WidgetInfo& info) { - CVarSetInteger(CVAR_ENHANCEMENT("SlowTextSpeed"), CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 1)); - }) - .Options(ButtonOptions().Tooltip( - "Makes the speed of the slow text match the normal text speed above." - )); - AddWidget(path, "Skip Pickup Messages", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FastDrops")) - .Options(CheckboxOptions().Tooltip( - "Skip Pickup Messages for new Consumable Items and Bottle Swipes." - )); - AddWidget(path, "Better Owl", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BetterOwl")) - .Options(CheckboxOptions().Tooltip( - "The default response to Kaepora Gaebora is always that you understood what he said." - )); + .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( + "Changes the speed of sections of text that normally are paced slower than the text surrounding it.")); path.column = SECTION_COLUMN_2; - AddWidget(path, "Gameplay", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Skip Save Confirmation", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("SkipSaveConfirmation")) - .Options(CheckboxOptions().Tooltip("Skip the \"Game Saved\" confirmation screen.")); - AddWidget(path, "Biggoron Forge Time: %d days", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("ForgeTime")) - .Options(IntSliderOptions() - .Min(0) - .Max(3) - .DefaultValue(3) - .Format("%d days") - .Tooltip( - "Allows you to change the number of days it takes for " - "Biggoron to forge the Biggoron's Sword." - ) - ); - AddWidget(path, "Remember Save Location", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RememberSaveLocation")) + AddWidget(path, "Animations", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Faster Heavy Block Lift", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterHeavyBlockLift")) + .Options(CheckboxOptions().Tooltip("Speeds up lifting Silver Rocks and Obelisks.")); + AddWidget(path, "Fast Chests", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastChests")) + .Options(CheckboxOptions().Tooltip("Makes Link always kick the chest to open it, instead of doing the longer " + "chest opening animation for major items.")); + AddWidget(path, "Skip Water Take Breath Animation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim")) + .Options(CheckboxOptions().Tooltip("Skips Link's taking breath animation after coming up from water. " + "This setting does not interfere with getting items from underwater.")); + AddWidget(path, "Vine/Ladder Climb Speed +%d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ClimbSpeed")) + .Options(IntSliderOptions().Min(0).Max(12).DefaultValue(0).Format("+%d")); + AddWidget(path, "Block Pushing Speed +%d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("FasterBlockPush")) + .Options(IntSliderOptions().Min(0).Max(5).DefaultValue(0).Format("+%d")); + AddWidget(path, "Crawl Speed %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("CrawlSpeed")) + .Options(IntSliderOptions().Min(1).Max(4).DefaultValue(1).Format("%dx")); + AddWidget(path, "King Zora Speed: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_ENHANCEMENT("MweepSpeed")) + .Options(FloatSliderOptions().Min(0.1f).Max(5.0f).DefaultValue(1.0f).Format("%.2fx")); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Misc", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Skip Child Stealth", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipChildStealth")) .Options(CheckboxOptions().Tooltip( - "When loading a save, places Link at the last entrance he went through.\n" - "This doesn't work if the save was made in grottos, fairy fountains, or dungeons." - )); - AddWidget(path, "Navi Timer Resets", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("ResetNaviTimer")) + "The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards.")); + AddWidget(path, "Skip Tower Escape", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipTowerEscape")) + .Options(CheckboxOptions().Tooltip("Skip the tower escape sequence between Ganondorf and Ganon.")); + AddWidget(path, "Skip Scarecrow's Song", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantScarecrow")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = + IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SKIP_SCARECROWS_SONG); + info.options->disabledTooltip = "This setting is forcefully enabled because a randomized " + "save file with the option \"Skip Scarecrow Song\" is currently loaded."; + }) .Options(CheckboxOptions().Tooltip( - "Resets the Navi timer on scene change. If you have already talked to her, " - "she will try and talk to you again, instead of needing a save warp or death." - )); + "Pierre appears when an Ocarina is pulled out. Requires learning the Scarecrow's Song first.")); + AddWidget(path, "Faster Rupee Accumulator", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterRupeeAccumulator")) + .Options(CheckboxOptions().Tooltip("Causes your Wallet to fill and empty faster when you gain or lose money.")); AddWidget(path, "No Skulltula Freeze", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SkulltulaFreeze")) .PreFunc([](WidgetInfo& info) { info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); - info.options->disabledTooltip = + info.options->disabledTooltip = "This setting is disabled because a randomizer savefile is loaded. Please use the " "\"Skip Get Item Animation\" option within the randomizer enhancements instead."; }) .Options(CheckboxOptions().Tooltip( "Stops the game from freezing the player when picking up Gold Skulltula Tokens. Does not" - "apply in randomizer savefiles." - )); - AddWidget(path, "Ask to Equip New Items", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("AskToEquip")) - .Options(CheckboxOptions().Tooltip( - "Adds a prompt to equip newly-obtained Swords, Shields, and Tunics." - )); + "apply in randomizer savefiles.")); + AddWidget(path, "Skip Save Confirmation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipSaveConfirmation")) + .Options(CheckboxOptions().Tooltip("Skip the \"Game Saved\" confirmation screen.")); AddWidget(path, "Link as Default File Name", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("LinkDefaultName")) - .Options(CheckboxOptions().Tooltip( - "Allows you to have \"Link\" as a premade file name." - )); - AddWidget(path, "Quit Fishing At Door", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("QuitFishingAtDoor")) - .Options(CheckboxOptions().Tooltip( - "Fisherman asks if you want to quit at the door if you try to leave the Fishing Pond " - "while still holding the Fishing Rod." - )); - AddWidget(path, "Time Travel with Song of Time", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("TimeTravel")) - .Options(ComboboxOptions() - .ComboMap(timeTravelOptions) - .DefaultIndex(0) - .Tooltip( - "Allows Link to freely change age by playing the Song of Time.\n" - "Time Blocks can still be used properly.\n\n" - "Requirements:\n" - " - Obtained the Ocarina of Time (depends on selection)\n" - " - Obtained the Song of Time\n" - " - Obtained the Master Sword\n" - " - Not within range of a Time Block\n" - " - Not within range of Ocarina Playing spots." - ) - ); - AddWidget(path, "Pause Warp", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("PauseWarp")) - .Options(CheckboxOptions().Tooltip( - "Selection of warp song in pause menu initiates a warp. Disables song playback." - )); - AddWidget(path, "Skip Scarecrow's Song", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("InstantScarecrow")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SKIP_SCARECROWS_SONG); - info.options->disabledTooltip = "This setting is forcefully enabled because a randomized " - "save file with the option \"Skip Scarecrow Song\" is currently loaded."; - }) - .Options(CheckboxOptions().Tooltip( - "Pierre appears when an Ocarina is pulled out. Requires learning the Scarecrow's Song first." - )); - AddWidget(path, "Time of Day", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Nighttime GS Always Spawn", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NightGSAlwaysSpawn")) - .Options(CheckboxOptions().Tooltip( - "Nighttime Skulltulas will spawn during both day and night." - )); - AddWidget(path, "Dampe Appears All Night", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DampeAllNight")) - .Options(CheckboxOptions().Tooltip( - "Makes Dampe appear anytime during the night, not just his usual working hours." - )); - AddWidget(path, "Exit Market at Night", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("MarketSneak")) - .Options(CheckboxOptions().Tooltip( - "Allows exiting Hyrule Castle Market Town to Hyrule Field at night by speaking to the guard " - "next to the gate." - )); - AddWidget(path, "Shops and Games Always Open", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("OpenAllHours")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_LOCK_OVERWORLD_DOORS).Is(RO_GENERIC_ON); - }) - .Options(CheckboxOptions().Tooltip( - "Shops and Minigames are open both day and night. Requires a scene reload to take effect." - ).DisabledTooltip( - "This is not compatible with the Locked Overworld Doors Randomizer option." - )); - path.column = SECTION_COLUMN_3; - AddWidget(path, "Animations", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "King Zora Speed: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) - .CVar(CVAR_ENHANCEMENT("MweepSpeed")) - .Options(FloatSliderOptions() - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f) - .Format("%.2fx") - ); - AddWidget(path, "Vine/Ladder Climb Speed +%d", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("ClimbSpeed")) - .Options(IntSliderOptions() - .Min(0) - .Max(12) - .DefaultValue(0) - .Format("+%d") - ); - AddWidget(path, "Block Pushing Speed +%d", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("FasterBlockPush")) - .Options(IntSliderOptions() - .Min(0) - .Max(5) - .DefaultValue(0) - .Format("+%d") - ); - AddWidget(path, "Crawl Speed %dx", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("CrawlSpeed")) - .Options(IntSliderOptions() - .Min(1) - .Max(4) - .DefaultValue(1) - .Format("%dx") - ); - AddWidget(path, "Faster Heavy Block Lift", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FasterHeavyBlockLift")) - .Options(CheckboxOptions().Tooltip( - "Speeds up lifting Silver Rocks and Obelisks." - )); - AddWidget(path, "Fast Ocarina Playback", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FastOcarinaPlayback")) - .Options(CheckboxOptions().Tooltip( - "Skip the part where the Ocarina Playback is called when you play a song." - )); - AddWidget(path, "Skip Magic Arrow Equip Animation", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("SkipArrowAnimation")); - AddWidget(path, "Faster Farore's Wind", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FastFarores")) - .Options(CheckboxOptions().Tooltip("Greatly decreases cast time of Farore's Wind magic spell.")); - AddWidget(path, "Fast Chests", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FastChests")) - .Options(CheckboxOptions().Tooltip( - "Makes Link always kick the chest to open it, instead of doing the longer " - "chest opening animation for major items." - )); - AddWidget(path, "Skip Water Take Breath Animation", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim")) - .Options(CheckboxOptions().Tooltip( - "Skips Link's taking breath animation after coming up from water. " - "This setting does not interfere with getting items from underwater." - )); - AddWidget(path, "Play Zelda's Lullaby to Open Sleeping Waterfall", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN); - info.options->disabledTooltip = "This setting is forcefully enabled because a randomizer savefile with \"Sleeping Waterfall: Open\" is loaded."; - }) - .Options(ComboboxOptions() - .ComboMap(sleepingWaterfallOptions) - .DefaultIndex(WATERFALL_ALWAYS) - .Tooltip( - "Always: Link must always play Zelda's Lullaby to open the waterfall entrance to Zora's Domain.\n" - "Once: Link only needs to play Zelda's Lullaby once to open the waterfall; after that, it stays " - "open permanently.\n" - "Never: Link never needs to play Zelda's Lullaby to open the waterfall. He only needs to have " - "learned it and have an Ocarina." - ) - ); + .Options(CheckboxOptions().Tooltip("Allows you to have \"Link\" as a premade file name.")); + AddWidget(path, "Biggoron Forge Time: %d days", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ForgeTime")) + .Options(IntSliderOptions().Min(0).Max(3).DefaultValue(3).Format("%d days").Tooltip( + "Allows you to change the number of days it takes for " + "Biggoron to forge the Biggoron's Sword.")); + // Graphics path.sidebarName = "Graphics"; AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; @@ -807,71 +439,23 @@ void SohMenu::AddMenuEnhancements() { "Disables Grottos rotating with the Camera. To be used in conjuction with mods that want to " "replace grottos with 3D objects." )); + AddWidget(path, "Ingame Text Spacing: %d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("TextSpacing")) + .Options(IntSliderOptions().Min(4).Max(6).DefaultValue(6).Tooltip( + "Space between text characters (useful for HD font textures).")); - - AddWidget(path, "UI", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Minimal UI", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("MinimalUI")) + AddWidget(path, "Models & Textures", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Disable LOD", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableLOD")) .Options(CheckboxOptions().Tooltip( - "Hides most of the UI when not needed.\n" - "NOTE: Doesn't activate until scene transition." - )); - AddWidget(path, "Disable Hot/Underwater Warning Text", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableTunicWarningText")) + "Turns off the Level of Detail setting, making models use their Higher-Poly variants at any distance.")); + AddWidget(path, "Enemy Health Bars", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnemyHealthBar")) + .Options(CheckboxOptions().Tooltip("Renders a health bar for Enemies when Z-Targeted.")); + AddWidget(path, "Enable 3D Dropped Items/Projectiles", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NewDrops")) .Options(CheckboxOptions().Tooltip( - "Disables warning text when you don't have on the Goron/Zora Tunic " - "in Hot/Underwater conditions." - )); - AddWidget(path, "Remember Minimap State Between Areas", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RememberMapToggleState")) - .Options(CheckboxOptions().Tooltip( - "Preverse the minimap visibility state when going between areas rather than default it to \"on\" " - "when going through loading zones." - )); - AddWidget(path, "Visual Stone of Agony", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("VisualAgony")) - .Options(CheckboxOptions().Tooltip( - "Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble." - )); - AddWidget(path, "Disable HUD Heart Animations", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NoHUDHeartAnimation")) - .Options(CheckboxOptions().Tooltip( - "Disables the Beating Animation of the Hearts on the HUD." - )); - AddWidget(path, "Glitch line-up tick", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DrawLineupTick")) - .Options(CheckboxOptions().Tooltip( - "Displays a tick in the top center of the screen to help with glitch line-ups in SoH, since traditional " - "UI based line-ups do not work outside of 4:3" - )); - AddWidget(path, "Disable Black Bar Letterboxes", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableBlackBars")) - .Options(CheckboxOptions().Tooltip( - "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: there may be minor visual " - "glitches that were covered up by the black bars. Please disable this setting before reporting a bug." - )); - AddWidget(path, "Dynamic Wallet Icon", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DynamicWalletIcon")) - .Options(CheckboxOptions().Tooltip( - "Changes the Rupee in the Wallet icon to match the wallet size you currently have." - )); - AddWidget(path, "Always Show Dungeon Entrances", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon")) - .Options(CheckboxOptions().Tooltip( - "Always shows dungeon entrance icons on the Minimap." - )); - AddWidget(path, "More Info in File Select", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FileSelectMoreInfo")) - .Options(CheckboxOptions().Tooltip( - "Shows what items you have collected in the File Select screen, like in N64 Randomizer." - )); - AddWidget(path, "Better Ammo Rendering in Pause Menu", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BetterAmmoRendering")) - .Options(CheckboxOptions().Tooltip( - "Ammo counts in the pause menu will work correctly regardless of the position of items in the Inventory." - )); - - AddWidget(path, "Models", WIDGET_SEPARATOR_TEXT); + "Replaces most 2D items and projectiles on the overworld with their equivalent 3D models.")); AddWidget(path, "Invisible Bunny Hood", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HideBunnyHood")) .Options(CheckboxOptions().Tooltip( @@ -900,11 +484,6 @@ void SohMenu::AddMenuEnhancements() { "Scales all of the Adult Equipment, as well as moving some a bit, to fit on Child Link better. May " "not work properly with some mods." )); - AddWidget(path, "Enable 3D Dropped Items/Projectiles", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NewDrops")) - .Options(CheckboxOptions().Tooltip( - "Replaces most 2D items and projectiles on the overworld with their equivalent 3D models." - )); AddWidget(path, "Show Gauntlets in First Person", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FirstPersonGauntlets")) .Options(CheckboxOptions().Tooltip( @@ -912,133 +491,63 @@ void SohMenu::AddMenuEnhancements() { )); AddWidget(path, "Show Chains on Both Sides of Locked Doors", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides")); - - path.column = SECTION_COLUMN_2; - AddWidget(path, "Textures", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Chest Size & Texture Matches Contents", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents")) - .Callback([](WidgetInfo& info) { - if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) == CSMC_DISABLED) { - CVarSetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); - } - }) - .Options(ComboboxOptions() - .ComboMap(chestStyleMatchesContentsOptions) - .DefaultIndex(CSMC_DISABLED) - .Tooltip( - "Chest sizes and textures are changed to help identify the item inside.\n" - " - Major items: Large gold chests\n" - " - Lesser items: Large brown chests\n" - " - Junk items: Small brown chests\n" - " - Small keys: Small silver chests\n" - " - Boss keys: Vanilla size and texture\n" - " - Skulltula Tokens: Small skulltula chest\n" - "\n" - "NOTE: Textures will not apply if you are using a mod pack with a custom chest model." - ) - ); - AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchesContents"), CSMC_DISABLED); - }) - .Options(CheckboxOptions().Tooltip( - "Only change the size/texture of chests if you have the Stone of Agony." - )); AddWidget(path, "Color Temple of Time's Medallions", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ToTMedallionsColors")) - .Callback([](WidgetInfo& info) { - PatchToTMedallions(); - }) + .Callback([](WidgetInfo& info) { PatchToTMedallions(); }) .Options(CheckboxOptions().Tooltip( "When Medallions are collected, the Medallion imprints around the Master Sword Pedestal in the Temple " - "of Time will become colored-in." - )); - AddWidget(path, "Fix Vanishing Paths", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix")) - .Callback([](WidgetInfo& info) { - if (gPlayState != NULL) { - UpdateDirtPathFixState(gPlayState->sceneNum); - } - }) - .Options(ComboboxOptions() - .ComboMap(zFightingOptions) - .DefaultIndex(ZFIGHT_FIX_DISABLED) - .Tooltip( - "Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" - "Consistent: Certain paths vanish the same way in all resolutions\n" - "No Vanish: Paths do not vanish, Link seems to sink in to some paths\n" - "This might affect other decal effects\n" - ) - ); - AddWidget(path, "Text Spacing: %d", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("TextSpacing")) - .Options(IntSliderOptions() - .Min(4) - .Max(6) - .DefaultValue(6) - .Tooltip( - "Space between text characters (useful for HD font textures)." - ) - ); + "of Time will become colored-in.")); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "UI", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Minimal UI", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MinimalUI")) + .Options(CheckboxOptions().Tooltip("Hides most of the UI when not needed.\n" + "NOTE: Doesn't activate until scene transition.")); + AddWidget(path, "Disable Hot/Underwater Warning Text", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableTunicWarningText")) + .Options(CheckboxOptions().Tooltip("Disables warning text when you don't have on the Goron/Zora Tunic " + "in Hot/Underwater conditions.")); + AddWidget(path, "Remember Minimap State Between Areas", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RememberMapToggleState")) + .Options(CheckboxOptions().Tooltip( + "Preverse the minimap visibility state when going between areas rather than default it to \"on\" " + "when going through loading zones.")); + AddWidget(path, "Visual Stone of Agony", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("VisualAgony")) + .Options(CheckboxOptions().Tooltip( + "Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble.")); + AddWidget(path, "Disable HUD Heart Animations", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NoHUDHeartAnimation")) + .Options(CheckboxOptions().Tooltip("Disables the Beating Animation of the Hearts on the HUD.")); + AddWidget(path, "Glitch line-up tick", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DrawLineupTick")) + .Options(CheckboxOptions().Tooltip( + "Displays a tick in the top center of the screen to help with glitch line-ups in SoH, since traditional " + "UI based line-ups do not work outside of 4:3")); + AddWidget(path, "Disable Black Bar Letterboxes", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableBlackBars")) + .Options(CheckboxOptions().Tooltip( + "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: there may be minor visual " + "glitches that were covered up by the black bars. Please disable this setting before reporting a bug.")); + AddWidget(path, "Dynamic Wallet Icon", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DynamicWalletIcon")) + .Options(CheckboxOptions().Tooltip( + "Changes the Rupee in the Wallet icon to match the wallet size you currently have.")); + AddWidget(path, "Always Show Dungeon Entrances", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon")) + .Options(CheckboxOptions().Tooltip("Always shows dungeon entrance icons on the Minimap.")); + AddWidget(path, "More Info in File Select", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FileSelectMoreInfo")) + .Options(CheckboxOptions().Tooltip( + "Shows what items you have collected in the File Select screen, like in N64 Randomizer.")); + AddWidget(path, "Better Ammo Rendering in Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterAmmoRendering")) + .Options(CheckboxOptions().Tooltip( + "Ammo counts in the pause menu will work correctly regardless of the position of items in the Inventory.")); + AddWidget(path, "Enable Passage of Time on File Select", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TimeFlowFileSelect")); - AddWidget(path, "Rendering", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Disable LOD", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableLOD")) - .Options(CheckboxOptions().Tooltip( - "Turns off the Level of Detail setting, making models use their Higher-Poly variants at any distance." - )); - AddWidget(path, "Increase Actor Draw Distance: %dx", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("DisableDrawDistance")) - .Callback([](WidgetInfo& info) { - if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1) { - CVarSetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0); - } - }) - .Options(IntSliderOptions() - .Min(1) - .Max(5) - .DefaultValue(1) - .Format("%dx") - .Tooltip( - "Increases the range in which Actors/Objects are drawn." - ) - ); - AddWidget(path, "Kokiri Draw Distance", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1; - }) - .Options(CheckboxOptions().Tooltip( - "The Kokiri are mystical beings that fade into view when approached. Enabling this will remove their " - "draw distance." - )); - AddWidget(path, "Widescreen Actor Culling", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("WidescreenActorCulling")) - .Options(CheckboxOptions().Tooltip( - "Adjusts the Horizontal Culling Plane to account for Widescreen Resolutions." - )); - AddWidget(path, "Cull Glitch Useful Actors", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0) && - CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1; - info.options->disabledTooltip = "Requires Actor Draw Distance to be increased or Widscreen Actor Culling to be enabled."; - }) - .Options(CheckboxOptions().Tooltip( - "Exclude Actors that are useful for Glitches from the extended culling ranges. Some actors may still draw " - "in the extended ranges, but will not \"update\" so that certain glitches that leverage the original " - "culling requirements will still work.\n\nThe following actors are excluded:\n" - " - White clothed Gerudos\n" - " - King Zora\n" - " - Gossip Stones\n" - " - Boulders\n" - " - Blue Warps\n" - " - Darunia\n" - " - Gold SKulltulas\n" - )); - - // TODO: Find a better home for these. path.column = SECTION_COLUMN_3; AddWidget(path, "Misc.", WIDGET_SEPARATOR_TEXT); AddWidget(path, "N64 Mode", WIDGET_CVAR_CHECKBOX) @@ -1051,163 +560,67 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Remove the Darkness that appears when charging a Spin Attack" )); - + AddWidget(path, "Draw Distance", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Increase Actor Draw Distance: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("DisableDrawDistance")) + .Callback([](WidgetInfo& info) { + if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1) { + CVarSetInteger(CVAR_ENHANCEMENT("DisableKokiriDrawDistance"), 0); + } + }) + .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( + "Increases the range in which Actors/Objects are drawn.")); + AddWidget(path, "Kokiri Draw Distance", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableKokiriDrawDistance")) + .PreFunc( + [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1; }) + .Options(CheckboxOptions().Tooltip( + "The Kokiri are mystical beings that fade into view when approached. Enabling this will remove their " + "draw distance.")); + AddWidget(path, "Widescreen Actor Culling", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("WidescreenActorCulling")) + .Options( + CheckboxOptions().Tooltip("Adjusts the Horizontal Culling Plane to account for Widescreen Resolutions.")); + AddWidget(path, "Cull Glitch Useful Actors", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0) && + CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) <= 1; + info.options->disabledTooltip = + "Requires Actor Draw Distance to be increased or Widscreen Actor Culling to be enabled."; + }) + .Options(CheckboxOptions().Tooltip( + "Exclude Actors that are useful for Glitches from the extended culling ranges. Some actors may still draw " + "in the extended ranges, but will not \"update\" so that certain glitches that leverage the original " + "culling requirements will still work.\n\nThe following actors are excluded:\n" + " - White clothed Gerudos\n" + " - King Zora\n" + " - Gossip Stones\n" + " - Boulders\n" + " - Blue Warps\n" + " - Darunia\n" + " - Gold SKulltulas\n")); + path.sidebarName = "Items"; AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; - AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Equipment", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Equip Items on Dpad", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DpadEquips")) .Options(CheckboxOptions().Tooltip( "Equip items and equipment on the D-Pad. If used with \"D-Pad on Pause Screen\", you must " - "hold C-Up to equip instead of navgiate." - )); - AddWidget(path, "Instant Putaway", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("InstantPutaway")) + "hold C-Up to equip instead of navgiate.")); + AddWidget(path, "Assignable Tunics and Boots", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AssignableTunicsAndBoots")) + .Options(CheckboxOptions().Tooltip("Allows equipping the Tunics and Boots to C-Buttons/D-Pad.")); + // TODO: Revist strength toggle, it's currently separate but should probably be locked behind the + // Equipment toggle settings or be absorbed by it completely. + AddWidget(path, "Equipment Toggle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EquipmentCanBeRemoved")) .Options(CheckboxOptions().Tooltip( - "Allow Link to put items away without having to wait around." - )); - AddWidget(path, "Instant Boomerang Recall", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FastBoomerang")) - .Options(CheckboxOptions().Tooltip( - "Instantly return the boomerang to Link by pressing its item button while " - "it's in the air." - )); - AddWidget(path, "Prevent Dropped Ocarina Inputs", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput")) - .Options(CheckboxOptions().Tooltip( - "Prevent dropping inputs when playing the Ocarina too quickly." - )); - AddWidget(path, "Masks", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("MMBunnyHood")) - .Options(CheckboxOptions().Tooltip( - "Wearing the Bunny Hood grants a speed increase link in Majora's Mask. " - "The longer jump option is not accounted for in Randomizer logic.\n\n" - "Also disables NPC's reactions to wearing the Bunny Hood." - )); - AddWidget(path, "Masks Equippable as Adult", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("AdultMasks")) - .Options(CheckboxOptions().Tooltip( - "Allows masks to be equipped normally from the pause menu as adult." - )); - AddWidget(path, "Persistent Masks", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("PersistentMasks")) - .Options(CheckboxOptions().Tooltip( - "Stops masks from automatically unequipping on certain situations:\n" - "- When entering a new scene\n" - "- When not in any C button or the D-Pad\n" - "- When saving and quitting\n" - "- When dying\n" - "- When traveling thru time (if \"Masks Equippable as Adult\" is activated)." - )); - AddWidget(path, "Mask Select in Inventory", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("MaskSelect")) - .Options(CheckboxOptions().Tooltip( - "After completing the mask trading sub-quest, press A and any direction on the mask " - "slog to change masks" - )); - AddWidget(path, "Item Count Messages", WIDGET_SEPARATOR_TEXT); - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - bool allItemCountsChecked = false; - AddWidget(path, "All", WIDGET_CHECKBOX) - .ValuePointer(&allItemCountsChecked) - .PreFunc([](WidgetInfo& info) { - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - *std::get(info.valuePointer) = std::all_of(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [](const char* cvar) { return CVarGetInteger(cvar, 0); }); - }) - .Callback([](WidgetInfo& info) { - int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - std::for_each(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [newValue](const char* cvar) { CVarSetInteger(cvar, newValue); }); - - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - }); - for (int i = 0; i < numOptions; i++) { - AddWidget(path, itemCountMessageOptions[i], WIDGET_CVAR_CHECKBOX) - .CVar(itemCountMessageCVars[i]); - } - path.column = SECTION_COLUMN_2; - AddWidget(path, "Equipment", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Deku Nuts Explode Bombs", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("NutsExplodeBombs")) - .Options(CheckboxOptions().Tooltip( - "Make Deku Nuts explode Bombs, similar to how they interact with Bombchus. " - "This does not affect Bombflowers." - )); - AddWidget(path, "Equip Multiple Arrows at Once", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("SeparateArrows")) - .Options(CheckboxOptions().Tooltip( - "Allow the Bow and Magic Arrows to be equipped at the same time on different slots. " - "NOTE: This will disable the behavior of the 'Equip Dupe' glitch." - )); - AddWidget(path, "Bow and Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BowSlingshotAmmoFix")) - .Options(CheckboxOptions().Tooltip( - "Allows Child to use a Bow with Arrows.\n" - "Allows Adult to use a Slingshot with Seeds.\n\n" - "Requires glitches or the 'Timeless Equipment' cheat to equip." - )); - AddWidget(path, "Better Farore's Wind", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BetterFarore")) - .Options(CheckboxOptions().Tooltip( - "Helps FW persist between ages, gives Child and Adult separate FW points, and can " - "be used in more places." - )); - AddWidget(path, "Remove Explosive Limit", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RemoveExplosiveLimit")) - .Options(CheckboxOptions().Tooltip( - "Removes the cap of 3 active explosives being deployed at once." - )); - AddWidget(path, "Static Explosion Radius", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("StaticExplosionRadius")) - .Options(CheckboxOptions().Tooltip( - "Explosions are now a static size, like in Majora's Mask and OoT3D. Makes Bombchu " - "hovering much easier." - )); - AddWidget(path, "Prevent Bombchus Forcing Firs-Person", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("DisableFirstPersonChus")) - .Options(CheckboxOptions().Tooltip( - "Prevent Bombchus from forcing the camera into first-person mode when released." - )); - AddWidget(path, "Better Bombchu Shopping", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BetterBombchuShopping")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); - info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a randomizer."; - }) - .Options(CheckboxOptions().Tooltip( - "Bombchus do not sell out when bought, and a 10 pack of Bombchus costs 99 rupees " - "instead of 100." - )); - AddWidget(path, "Aiming Reticle for the Bow/Slingshot", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BowReticle")) - .Options(CheckboxOptions().Tooltip( - "Aiming with a Bow or Slingshot will display a reticle as with the Hookshot " - "when the projectile is ready to fire." - )); - AddWidget(path, "Aim Boomerang in First-Person Mode", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) - .Callback([](WidgetInfo& info) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0)) { - CVarSetInteger(CVAR_ENHANCEMENT("BoomerangReticle"), 0); - } - }) - .Options(CheckboxOptions().Tooltip( - "Change aiming for the Boomerang from Third-Person to First-Person to see past Link's head." - )); - AddWidget(path, "Aiming Reticle for Boomerang", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) - .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0) != 0; - }) - .Options(CheckboxOptions().Tooltip( - "Aiming with the Boomerang will display a reticle as with the Hookshot." - )); - AddWidget(path, "Allow Strength Equipement to be Toggled", WIDGET_CVAR_CHECKBOX) + "Allows equipment to be removed by toggling it off on\n the equipment subscreen.")); + AddWidget(path, "Allow Strength Equipment to be Toggled", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ToggleStrength")) .Callback([](WidgetInfo& info) { if (!CVarGetInteger(CVAR_ENHANCEMENT("ToggleStrength"), 0)) { @@ -1217,305 +630,398 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Allows Strength to be toggled on and off by pressing A on the Strength Upgrade " "in the Equipment Subscreen of the Pause Menu. This allows performing some glitches " - "that require the player to not have Strength." - )); + "that require the player to not have Strength.")); + AddWidget(path, "Sword Toggle Options", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("SwordToggle")) + .PreFunc( + [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 0) == 0; }) + .Options(ComboboxOptions() + .ComboMap(swordToggleModes) + .DefaultIndex(SWORD_TOGGLE_NONE) + .Tooltip("Introduces Options for unequipping Link's sword\n\n" + "None: Only Biggoron's Sword/Giant's Knife can be toggled. Doing so will equip the " + "Master Sword.\n\n" + "Child Toggle: This will allow for completely unequipping any sword as child link.\n\n" + "Both Ages: Any sword can be unequipped as either age. This may lead to swordless " + "glitches as Adult.")); + AddWidget(path, "Ask to Equip New Items", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AskToEquip")) + .Options(CheckboxOptions().Tooltip("Adds a prompt to equip newly-obtained Swords, Shields, and Tunics.")); + + AddWidget(path, "Ocarina", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Prevent Dropped Ocarina Inputs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput")) + .Options(CheckboxOptions().Tooltip("Prevent dropping inputs when playing the Ocarina too quickly.")); + AddWidget(path, "Fast Ocarina Playback", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastOcarinaPlayback")) + .Options(CheckboxOptions().Tooltip("Skip the part where the Ocarina Playback is called when you play a song.")); + AddWidget(path, "Time Travel with Song of Time", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("TimeTravel")) + .Options(ComboboxOptions() + .ComboMap(timeTravelOptions) + .DefaultIndex(0) + .Tooltip("Allows Link to freely change age by playing the Song of Time.\n" + "Time Blocks can still be used properly.\n\n" + "Requirements:\n" + " - Obtained the Ocarina of Time (depends on selection)\n" + " - Obtained the Song of Time\n" + " - Obtained the Master Sword\n" + " - Not within range of a Time Block\n" + " - Not within range of Ocarina Playing spots.")); + + AddWidget(path, "Masks", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MMBunnyHood")) + .Options(CheckboxOptions().Tooltip("Wearing the Bunny Hood grants a speed increase link in Majora's Mask. " + "The longer jump option is not accounted for in Randomizer logic.\n\n" + "Also disables NPC's reactions to wearing the Bunny Hood.")); + AddWidget(path, "Masks Equippable as Adult", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AdultMasks")) + .Options(CheckboxOptions().Tooltip("Allows masks to be equipped normally from the pause menu as adult.")); + AddWidget(path, "Persistent Masks", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("PersistentMasks")) + .Options( + CheckboxOptions().Tooltip("Stops masks from automatically unequipping on certain situations:\n" + "- When entering a new scene\n" + "- When not in any C button or the D-Pad\n" + "- When saving and quitting\n" + "- When dying\n" + "- When traveling thru time (if \"Masks Equippable as Adult\" is activated).")); + AddWidget(path, "Mask Select in Inventory", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("MaskSelect")) + .Options(CheckboxOptions().Tooltip( + "After completing the mask trading sub-quest, press A and any direction on the mask " + "slog to change masks")); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Explosives", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Deku Nuts Explode Bombs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NutsExplodeBombs")) + .Options(CheckboxOptions().Tooltip("Make Deku Nuts explode Bombs, similar to how they interact with Bombchus. " + "This does not affect Bombflowers.")); + AddWidget(path, "Remove Explosive Limit", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RemoveExplosiveLimit")) + .Options(CheckboxOptions().Tooltip("Removes the cap of 3 active explosives being deployed at once.")); + AddWidget(path, "Static Explosion Radius", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("StaticExplosionRadius")) + .Options(CheckboxOptions().Tooltip( + "Explosions are now a static size, like in Majora's Mask and OoT3D. Makes Bombchu " + "hovering much easier.")); + AddWidget(path, "Prevent Bombchus Forcing First-Person", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DisableFirstPersonChus")) + .Options(CheckboxOptions().Tooltip( + "Prevent Bombchus from forcing the camera into first-person mode when released.")); + AddWidget(path, "Better Bombchu Shopping", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterBombchuShopping")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a randomizer."; + }) + .Options( + CheckboxOptions().Tooltip("Bombchus do not sell out when bought, and a 10 pack of Bombchus costs 99 rupees " + "instead of 100.")); + + AddWidget(path, "Bow / Slingshot", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Equip Multiple Arrows at Once", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SeparateArrows")) + .Options(CheckboxOptions().Tooltip( + "Allow the Bow and Magic Arrows to be equipped at the same time on different slots. " + "NOTE: This will disable the behavior of the 'Equip Dupe' glitch.")); + AddWidget(path, "Skip Magic Arrow Equip Animation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipArrowAnimation")); // TODO: See if a Callback could be registered to avoid the need to reload scenes for the next two options. AddWidget(path, "Blue Fire Arrows", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BlueFireArrows")) .PreFunc([](WidgetInfo& info) { - info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_BLUE_FIRE_ARROWS).Is(RO_GENERIC_ON); + info.options->disabled = + OTRGlobals::Instance->gRandoContext->GetOption(RSK_BLUE_FIRE_ARROWS).Is(RO_GENERIC_ON); info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " - "\"Blue Fire Arrows\" is currently loaded."; + "\"Blue Fire Arrows\" is currently loaded."; }) .Options(CheckboxOptions().Tooltip( - "Allows Ice Arrows to melt Red Ice. May require a room reload if toggled during gameplay." - )); + "Allows Ice Arrows to melt Red Ice. May require a room reload if toggled during gameplay.")); AddWidget(path, "Sunlight Arrows", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SunlightArrows")) .PreFunc([](WidgetInfo& info) { - info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SUNLIGHT_ARROWS).Is(RO_GENERIC_ON); + info.options->disabled = + OTRGlobals::Instance->gRandoContext->GetOption(RSK_SUNLIGHT_ARROWS).Is(RO_GENERIC_ON); info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " - "\"Sunlight Arrows\" enabled is currently loaded."; + "\"Sunlight Arrows\" enabled is currently loaded."; }) .Options(CheckboxOptions().Tooltip( - "Allows Light Arrows to activate Sun Switches. May require a room reload if toggled during gameplay." - )); + "Allows Light Arrows to activate Sun Switches. May require a room reload if toggled during gameplay.")); + AddWidget(path, "Bow and Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BowSlingshotAmmoFix")) + .Options(CheckboxOptions().Tooltip("Allows Child to use a Bow with Arrows.\n" + "Allows Adult to use a Slingshot with Seeds.\n\n" + "Requires glitches or the 'Timeless Equipment' cheat to equip.")); + AddWidget(path, "Aiming Reticle for the Bow/Slingshot", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BowReticle")) + .Options(CheckboxOptions().Tooltip("Aiming with a Bow or Slingshot will display a reticle as with the Hookshot " + "when the projectile is ready to fire.")); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Hookshot", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Targetable Hookshot Reticle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HookshotableReticle")) + .Options(CheckboxOptions().Tooltip( + "Makes the Hookshot Reticle use a different color when aiming at Hookshotable Collision.")); + + AddWidget(path, "Boomerang", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Instant Boomerang Recall", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastBoomerang")) + .Options(CheckboxOptions().Tooltip("Instantly return the boomerang to Link by pressing its item button while " + "it's in the air.")); + AddWidget(path, "Aim Boomerang in First-Person Mode", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) + .Callback([](WidgetInfo& info) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0)) { + CVarSetInteger(CVAR_ENHANCEMENT("BoomerangReticle"), 0); + } + }) + .Options(CheckboxOptions().Tooltip( + "Change aiming for the Boomerang from Third-Person to First-Person to see past Link's head.")); + AddWidget(path, "Aiming Reticle for Boomerang", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) + .PreFunc( + [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("BoomerangFirstPerson"), 0) != 0; }) + .Options(CheckboxOptions().Tooltip("Aiming with the Boomerang will display a reticle as with the Hookshot.")); + + AddWidget(path, "Magic Spells", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Better Farore's Wind", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BetterFarore")) + .Options(CheckboxOptions().Tooltip( + "Helps FW persist between ages, gives Child and Adult separate FW points, and can " + "be used in more places.")); + AddWidget(path, "Faster Farore's Wind", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FastFarores")) + .Options(CheckboxOptions().Tooltip("Greatly decreases cast time of Farore's Wind magic spell.")); + + // Fixes + path.sidebarName = "Fixes"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + AddWidget(path, "Gameplay Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix the Gravedigging Tour Glitch", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GravediggingTourFix")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = "This setting is always enabled in randomized save files."; + }) + .Options(CheckboxOptions().Tooltip( + "Fixes a bug where the Gravedigging Tour Heart Piece disappears if the area reloads.")); + AddWidget(path, "Fix Raised Floor Switches", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixFloorSwitches")) + .Options(CheckboxOptions().Tooltip( + "Fixes the two raised floor switches, the one in Forest Temple Basement and the one at the top of Fire " + "Temple. This will lower them, making activating them easier.")); + AddWidget(path, "Fix Zora Hint Dialogue", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixZoraHintDialogue")) + .Options(CheckboxOptions().Tooltip( + "Fixes one Zora's dialogue giving a hint about bringing Ruto's Letter to King Zora to properly occur " + "before moving King Zora rather than after.")); + AddWidget(path, "Fix Falling from Vine Edges", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixVineFall")) + .Options( + CheckboxOptions().Tooltip("Prevents immediately falling off climbable surfaces if climbing on the edges.")); + AddWidget(path, "Fix Bush Item Drops", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BushDropFix")) + .Options(CheckboxOptions().Tooltip( + "Fixes the bushes to drop items correctly rather than spawning undefined items.")); + AddWidget(path, "Fix Enemies not Spawning Near Water", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes")) + .Options(CheckboxOptions().Tooltip( + "Causes respanwing enemies, like Stalchildren, to appear on land near bodies of water. " + "Fixes an incorrect calculation that acted like water underneath ground was above it.")); + AddWidget(path, "Fix Poacher's Saw Softlock", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixSawSoftlock")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("SkipText"), 0) == 1; + info.options->disabledTooltip = "This option is forced on when Skip Text is enabled."; + }) + .Options(CheckboxOptions().Tooltip( + "Prevents the Poacher's Saw softlock from mashing through the text, or with Skip Text enabled.")); + AddWidget(path, "Fix Anubis Fireballs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AnubisFix")) + .Options(CheckboxOptions().Tooltip( + "Make Anubis Fireballs do Fire damage when reflected back at them with the Mirror Shield.")); + + AddWidget(path, "Item-related Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix Deku Nut Upgrade", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DekuNutUpgradeFix")) + .Options(CheckboxOptions().Tooltip("Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable " + "after receiving the Poacher's Saw.")); + AddWidget(path, "Fix Megaton Hammer Crouch Stab", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CrouchStabHammerFix")) + .Callback([](WidgetInfo& info) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0)) { + CVarClear(CVAR_ENHANCEMENT("CrouchStabFix")); + } + }) + .Options(CheckboxOptions().Tooltip( + "Make the Megaton Hammer's crouch stab able to destroy rocks without first swinging it normally.")); + AddWidget(path, "Remove Power Crouch Stab", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CrouchStabFix")) + .PreFunc( + [](WidgetInfo& info) { info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("CrouchStabHammerFix"), 0) == 0; }) + .Options(CheckboxOptions().Tooltip("Make crouch stabbing always do the same damage as a regular slash.")); + AddWidget(path, "Fix Broken Giant's Knife Bug", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixGrokenGiantsKnife")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = IS_RANDO && GameInteractor::IsSaveLoaded(true); + info.options->disabledTooltip = "This setting is forcefully enabled when you are playing a Randomizer."; + }) + .Callback([](WidgetInfo& info) { + bool hasGiantsKnife = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON); + bool hasBrokenKnife = CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE); + bool knifeIsBroken = gSaveContext.swordHealth == 0.0f; + + if (hasGiantsKnife && (hasBrokenKnife != knifeIsBroken)) { + func_800849EC(gPlayState); + } + }) + .Options( + CheckboxOptions().Tooltip("Fixes the Broken Giant's Knife flag not being reset when Medigoron fixes it.")); + + AddWidget(path, "Camera Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix Camera Drift", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixCameraDrift")) + .Options(CheckboxOptions().Tooltip( + "Fixes camera slightly drifting to the left when standing still due to a math error.")); + AddWidget(path, "Fix Camera Swing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixCameraSwing")) + .Options(CheckboxOptions().Tooltip( + "Fixes camera getting stuck on collision when standing still. Also fixes slight shift " + "back in camera when Link stops moving.")); + AddWidget(path, "Fix Hanging Ledge Swing Rate", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixHangingLedgeSwingRate")) + .Options(CheckboxOptions().Tooltip( + "Fixes camera swing rate when the player falls off a ledge and the camera swings around.")); + path.column = SECTION_COLUMN_2; + AddWidget(path, "Graphical Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix L&R Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixMenuLR")) + .Options(CheckboxOptions().Tooltip("Makes the L and R buttons in the pause menu the same color")); + AddWidget(path, "Fix Dungeon Entrances", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixDungeonMinimapIcon")) + .Options(CheckboxOptions().Tooltip( + "Removes the Dungeon Entrance icon on the top-left corner of the screen when no dungeon is present on the " + "current map.")); + AddWidget(path, "Fix Two-Handled Idle Animations", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("TwoHandedIdle")) + .Options(CheckboxOptions().Tooltip( + "Re-Enables the two-handed idle animation, a seemingly finished animation that was disabled on accident " + "in the original game.")); + AddWidget(path, "Fix Navi Text HUD Position", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NaviTextFix")) + .Options(CheckboxOptions().Tooltip("Correctly centers the Navi text prompt on the HUD's C-Up button.")); + AddWidget(path, "Fix Gerudo Warrior's Clothing Colors", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GerudoWarriorClothingFix")) + .Options(CheckboxOptions().Tooltip( + "Prevent the Gerudo Warrior's clothes changing color when changing Link's tunic or " + "using Bombs in front of her.")); + AddWidget(path, "Fix Out of Bounds Textures", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixTexturesOOB")) + .Callback([](WidgetInfo& info) { ApplyAuthenticGfxPatches(); }) + .Options(CheckboxOptions().Tooltip( + "Fixes authentic out of bounds texture reads, instead loading textures with the correct size.")); + AddWidget(path, "Fix Link's Eyes Open while Sleeping", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping")) + .Options(CheckboxOptions().Tooltip( + "Fixes Link's eyes being open in the openeing cutscene when he is supposed to be sleeping.")); + AddWidget(path, "Fix Hand Holding Hammer", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixHammerHand")) + .Callback([](WidgetInfo& info) { UpdatePatchHand(); }) + .Options(CheckboxOptions().Tooltip( + "Fixes Adult Link having a backwards Left hand when holding the Megaton Hammer.")); + AddWidget(path, "Fix Vanishing Paths", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix")) + .Callback([](WidgetInfo& info) { + if (gPlayState != NULL) { + UpdateDirtPathFixState(gPlayState->sceneNum); + } + }) + .Options( + ComboboxOptions() + .ComboMap(zFightingOptions) + .DefaultIndex(ZFIGHT_FIX_DISABLED) + .Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" + "Consistent: Certain paths vanish the same way in all resolutions\n" + "No Vanish: Paths do not vanish, Link seems to sink in to some paths\n" + "This might affect other decal effects\n")); + + AddWidget(path, "Audio Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix Missing Jingle after 5 Silver Rupees", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SilverRupeeJingleExtend")) + .Options(CheckboxOptions().Tooltip( + "Adds 5 higher pitches for the Silver Rupee Jingle for the rooms with more than 5 Silver Rupees. " + "Only relevant for playthroughs involving Master Quest Dungeons.")); + + AddWidget(path, "Desync Fixes", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix Darunia Dancing Too Fast", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed")) + .Options(CheckboxOptions().Tooltip( + "Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in the Original Game.")); + AddWidget(path, "Fix Credits Timing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CreditsFix")) + .Options(CheckboxOptions().Tooltip( + "Extend certain credits scenes so the music lines up properly with the visuals.")); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Graphical Restorations", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Red Ganon Blood", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RedGanonBlood")) + .Options( + CheckboxOptions().Tooltip("Restore the original red blood from NTSC 1.0/1.1. Disable for Green blood.")); + AddWidget(path, "Restore Old Gold Skulltula Cutscene", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GSCutscene")) + .Options(CheckboxOptions().Tooltip( + "Restore pre-release behavior where defeating a Gold Skulltula will play a cutscene showing it die.")); + AddWidget(path, "Pulsate Boss Icon", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("Pulsate Boss Icon")) + .Options(CheckboxOptions().Tooltip( + "Restores an unfinished feature to pulsate the boss room icon when you are in the boss room.")); + + AddWidget(path, "Glitch Restorations", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fish while Hovering", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HoverFishing")) + .Options(CheckboxOptions().Tooltip( + "Restore a bug from NSTC 1.0 that allows casting the Fishing Rod while using the Hover Boots.")); + AddWidget(path, "N64 Weird Frames", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("N64WeirdFrames")) + .Options(CheckboxOptions().Tooltip("Restores N64 Weird Frames allwing weirdshots to behave the same as N64.")); + AddWidget(path, "Bombchus Out of Bounds", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BombchusOOB")) + .Options(CheckboxOptions().Tooltip("Allows Bombchus to explode out of bounds. Similar to Gamecube and Wii VC")); + AddWidget(path, "Quick Putaway", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("QuickPutaway")) + .Options(CheckboxOptions().Tooltip( + "Restore a bug from NTSC 1.0 that allows putting away an item without an animation and performing " + "Putaway Ocarina Items.")); + AddWidget(path, "Quick Bongo Kill", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("QuickBongoKill")) + .Options(CheckboxOptions().Tooltip( + "Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him.")); + AddWidget(path, "Original RBA Values", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RestoreRBAValues")) + .Options(CheckboxOptions().Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure.")); + AddWidget(path, "Early Eyeball Frog", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("EarlyEyeballFrog")) + .Options(CheckboxOptions().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.")); + + AddWidget(path, "Misc Restorations", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Fix L&Z Page Switch in Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("NGCKaleidoSwitcher")) + .Options(CheckboxOptions().Tooltip( + "Makes L and R switch pages like on the Gamecube. Z opens the Debug Menu instead.")); + // Difficulty Options path.sidebarName = "Difficulty"; AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; - - AddWidget(path, "Shooting Gallery", WIDGET_SEPARATOR_TEXT); - auto shootingGalleryDisabledFunc = [](WidgetInfo& info) { - info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeShootingGallery"), 0); - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; - }; - AddWidget(path, "Customize Behavior##Shooting", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CustomizeShootingGallery")) - .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior")); - AddWidget(path, "Instant Win", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("InstantShootingGalleryWin")) - .PreFunc(shootingGalleryDisabledFunc) - .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame")); - AddWidget(path, "No Rupee Randomization", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("ConstantAdultGallery")) - .PreFunc(shootingGalleryDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Forces the rupee order to not be randomized as adult, making it the same as child." - )); - AddWidget(path, "Child Starting Ammunition: %d seeds", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("ShootingGalleryAmmoChild")) - .PreFunc(shootingGalleryDisabledFunc) - .Options(IntSliderOptions() - .Min(10) - .Max(30) - .DefaultValue(15) - .Format("%d seeds") - .Tooltip( - "The ammunition at the start of the Shooting Gallery minigame as Child." - ) - ); - AddWidget(path, "Adult Starting Ammunition: %d arrows", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("ShootingGalleryAmmoAdult")) - .PreFunc(shootingGalleryDisabledFunc) - .Options(IntSliderOptions() - .Min(10) - .Max(30) - .DefaultValue(15) - .Format("%d arrows") - .Tooltip( - "The ammunition at the start of the Shooting Gallery minigame as Adult." - ) - ); - - AddWidget(path, "Bombchu Bowling", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Customize Behavior##Bowling", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CustomizeBombchuBowling")) - .Options(CheckboxOptions().Tooltip( - "Turn on/off changes to the Bombchu Bowling behavior." - )); - auto bombchuBowlingDisabledFunc = [](WidgetInfo& info) { - info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeBombchuBowling"), 0) == 0; - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; - }; - AddWidget(path, "Remove Small Cucco", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco")) - .PreFunc(bombchuBowlingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Prevents the small Cucco from appearing in the Bombchu Bowling minigame." - )); - AddWidget(path, "Remove Big Cucco", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoBigCucco")) - .PreFunc(bombchuBowlingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Prevents the big Cucco from appearing in the Bombchu Bowling minigame." - )); - AddWidget(path, "Bombchu Count: %d bombchus", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("BombchuBowlingAmmo")) - .PreFunc(bombchuBowlingDisabledFunc) - .Options(IntSliderOptions() - .Min(3) - .Max(20) - .DefaultValue(10) - .Format("%d bombchus") - .Tooltip("The number of Bombchus available at the start of the Bombchu Bowling minigame.") - ); - - AddWidget(path, "Fishing", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Customize Behavior##Fishing", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CustomizeFishing")) - .Options(CheckboxOptions().Tooltip( - "Turn on/off changes to the Fishing behavior" - )); - auto fishingDisabledFunc = [](WidgetInfo& info) { - info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) == 0; - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; - }; - AddWidget(path, "Instant Fishing", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("InstantFishing")) - .PreFunc(fishingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "All fish will be caught instantly." - )); - AddWidget(path, "Guarantee Bite", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("GuaranteeFishingBite")) - .PreFunc(fishingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "When a line is stable, guarantee bite. Otherwise use Default logic." - )); - AddWidget(path, "Fish Never Escape", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FishNeverEscape")) - .PreFunc(fishingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Once a hook as been set, Fish will never let go while being reeled in." - )); - AddWidget(path, "Loaches Always Appear", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("LoachesAlwaysAppear")) - .PreFunc(fishingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Loaches will always appear in the fishing pond instead of every four visits." - )); - AddWidget(path, "Skip Keep Confirmation", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("SkipKeepConfirmation")) - .PreFunc(fishingDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "The Pond Owner will not ask to confirm if you want to keep a smaller Fish." - )); - AddWidget(path, "Child Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("MinimumFishWeightChild")) - .PreFunc(fishingDisabledFunc) - .Options(IntSliderOptions() - .Min(3) - .Max(10) - .DefaultValue(10) - .Format("%d lbs.") - .Tooltip( - "The minimum weight for the unique Fishing Reward as a Child." - ) - ); - AddWidget(path, "Adult Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("MinimumFishWeightAdult")) - .PreFunc(fishingDisabledFunc) - .Options(IntSliderOptions() - .Min(6) - .Max(13) - .DefaultValue(13) - .Format("%d lbs.") - .Tooltip( - "The minimum weight for the unique fishing reward as an Adult." - ) - ); - AddWidget(path, "All Fish are Hyrule Loaches", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("AllHyruleLoaches")) - .PreFunc(fishingDisabledFunc) - .Options(IntSliderOptions().Tooltip( - "Every fish in the Fishing Pond will always be a Hyrule Loach.\n\n" - "NOTE: This requires reloading the area." - )); - - path.column = SECTION_COLUMN_2; - AddWidget(path, "Lost Woods Ocarina Game", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Customize Behavior##LostWoods", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CustomizeOcarinaGame")) - .Options(CheckboxOptions().Tooltip( - "Turn on/off changes to the Lost Woods Ocarina Game behavior." - )); - auto ocarinaMemoryGameDisabledFunc = [](WidgetInfo& info) { - info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 0) == 0; - info.options->disabledTooltip = "This options is disabled because \"Customize Behavior\" is turned off."; - }; - AddWidget(path, "Instant Win##LostWoods", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("InstantOcarinaGameWin")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Skips the Lost Woods Ocarina Memory Game." - )); - AddWidget(path, "Note Play Speed: %dx", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("OcarinaGame.NoteSpeed")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(IntSliderOptions() - .Min(1) - .Max(5) - .DefaultValue(1) - .Format("%dx") - .Tooltip( - "Adjust the speed that the Skull Kids play the notes." - ) - ); - AddWidget(path, "Unlimited Playback Time##LostWoods", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("OcarinaUnlimitedFailTime")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Removes the timer to play back the song." - )); - AddWidget(path, "Number of Starting Notes: %d notes", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(IntSliderOptions() - .Min(1) - .Max(8) - .DefaultValue(3) - .Format("%d notes") - .Tooltip( - "Adjust the number of notes the Skull Kids play to start the first round." - ) - ); - int roundMin = CVarGetInteger(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 3); - AddWidget(path, "Round One Notes: %d notes", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(IntSliderOptions() - .Min(roundMin) - .Max(8) - .DefaultValue(5) - .Format("%d notes") - .Tooltip( - "Adjust the number of notes you need to play to end the first round." - ) - ); - AddWidget(path, "Round Two Notes: %d notes", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundTwoNotes")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(IntSliderOptions() - .Min(roundMin) - .Max(8) - .DefaultValue(6) - .Format("%d notes") - .Tooltip( - "Adjust the number of notes you need to play to end the second round." - ) - ); - AddWidget(path, "Round Three Notes: %d notes", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundThreeNotes")) - .PreFunc(ocarinaMemoryGameDisabledFunc) - .Options(IntSliderOptions() - .Min(roundMin) - .Max(8) - .DefaultValue(8) - .Format("%d notes") - .Tooltip( - "Adjust the number of notes you need to play to end the third round." - ) - ); - - AddWidget(path, "Frogs' Ocarina Game", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Customize Behavior##Frogs", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame")) - .Options(CheckboxOptions().Tooltip( - "Turn on/off changes to the Frogs' Ocarina Game behavior." - )); - auto frogsOcarinaGameDisabledFunc = [](WidgetInfo& info) { - info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) == 0; - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; - }; - AddWidget(path, "Instant Win##Frogs", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("InstantFrogsGameWin")) - .PreFunc(frogsOcarinaGameDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Skips the Frogs' Ocarina Game." - )); - AddWidget(path, "Unlimited Playback Time##Frogs", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime")) - .PreFunc(frogsOcarinaGameDisabledFunc) - .Options(CheckboxOptions().Tooltip( - "Removes the timer to play back the song." - )); - AddWidget(path, "Modify note timer: %dx", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("FrogsModifyFailTime")) - .PreFunc([](WidgetInfo& info) { - info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0); - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off or \"Unlimited Playback Time\" is on"; - }) - .Options(IntSliderOptions() - .Min(1) - .Max(5) - .DefaultValue(1) - .Format("%dx") - .Tooltip( - "Adjusts the time allowed for playback before failing." - ) - ); AddWidget(path, "Health", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Permanent Heart Loss", WIDGET_CVAR_CHECKBOX) @@ -1593,7 +1099,7 @@ void SohMenu::AddMenuEnhancements() { "This simulates Hero Mode from other games in the series." )); - path.column = SECTION_COLUMN_3; + path.column = SECTION_COLUMN_2; AddWidget(path, "Drops", WIDGET_SEPARATOR_TEXT); AddWidget(path, "No Random Drops", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NoRandomDrops")) @@ -1603,7 +1109,9 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Enable Bombchu Drops", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EnableBombchuDrops")) .PreFunc([](WidgetInfo& info) { - info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_GENERIC_ON); + info.options->disabled = + IS_RANDO && GameInteractor::IsSaveLoaded(true) && + OTRGlobals::Instance->gRandoContext->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_GENERIC_ON); info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " "\"Enable Bombchu Drops\" is loaded."; }) @@ -1624,22 +1132,6 @@ void SohMenu::AddMenuEnhancements() { ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE "\nTHIS IS NOT REVERSABLE\nUSE AT YOUR OWN RISK!" )); - AddWidget(path, "Hyper Bosses", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("HyperBosses")) - .Callback([](WidgetInfo& info) { - UpdateHyperBossesState(); - }) - .Options(CheckboxOptions().Tooltip( - "All Major Bosses move and act twice as fast." - )); - AddWidget(path, "Hyper Enemies", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("HyperEnemies")) - .Callback([](WidgetInfo& info) { - UpdateHyperEnemiesState(); - }) - .Options(CheckboxOptions().Tooltip( - "All Regular Enemies and Mini-Bosses move and act twice as fast." - )); AddWidget(path, "Always Win Goron Pot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("GoronPot")) .Options(CheckboxOptions().Tooltip( @@ -1667,18 +1159,228 @@ void SohMenu::AddMenuEnhancements() { "Cuccos will stay in place longer after putting them down, by a multiple of the value of the slider." ) ); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Enemies", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Hyper Bosses", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HyperBosses")) + .Callback([](WidgetInfo& info) { UpdateHyperBossesState(); }) + .Options(CheckboxOptions().Tooltip("All Major Bosses move and act twice as fast.")); + AddWidget(path, "Hyper Enemies", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HyperEnemies")) + .Callback([](WidgetInfo& info) { UpdateHyperEnemiesState(); }) + .Options(CheckboxOptions().Tooltip("All Regular Enemies and Mini-Bosses move and act twice as fast.")); + AddWidget(path, "Enable Visual Guard Vision", WIDGET_CVAR_CHECKBOX).CVar(CVAR_ENHANCEMENT("GuardVision")); AddWidget(path, "Leever Spawn Rate: %d seconds", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("LeeverSpawnRate")) .Options(IntSliderOptions() - .Min(0) - .Max(10) - .DefaultValue(0) - .Format("%d seconds") - .Tooltip( - "The time between groups of Leevers spawning." - ) - ); + .Min(0) + .Max(10) + .DefaultValue(0) + .Format("%d seconds") + .Tooltip("The time between groups of Leevers spawning.")); + // Minigames + path.sidebarName = "Minigames"; + AddSidebarEntry("Enhancements", path.sidebarName, 3); + path.column = SECTION_COLUMN_1; + + AddWidget(path, "Shooting Gallery", WIDGET_SEPARATOR_TEXT); + auto shootingGalleryDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeShootingGallery"), 0); + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Customize Behavior##Shooting", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeShootingGallery")) + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior")); + AddWidget(path, "Instant Win", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantShootingGalleryWin")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame")); + AddWidget(path, "No Rupee Randomization", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("ConstantAdultGallery")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(CheckboxOptions().Tooltip( + "Forces the rupee order to not be randomized as adult, making it the same as child.")); + AddWidget(path, "Child Starting Ammunition: %d seeds", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ShootingGalleryAmmoChild")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(IntSliderOptions() + .Min(10) + .Max(30) + .DefaultValue(15) + .Format("%d seeds") + .Tooltip("The ammunition at the start of the Shooting Gallery minigame as Child.")); + AddWidget(path, "Adult Starting Ammunition: %d arrows", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("ShootingGalleryAmmoAdult")) + .PreFunc(shootingGalleryDisabledFunc) + .Options(IntSliderOptions() + .Min(10) + .Max(30) + .DefaultValue(15) + .Format("%d arrows") + .Tooltip("The ammunition at the start of the Shooting Gallery minigame as Adult.")); + + AddWidget(path, "Bombchu Bowling", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##Bowling", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeBombchuBowling")) + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Bombchu Bowling behavior.")); + auto bombchuBowlingDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeBombchuBowling"), 0) == 0; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; + }; + AddWidget(path, "Remove Small Cucco", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco")) + .PreFunc(bombchuBowlingDisabledFunc) + .Options(CheckboxOptions().Tooltip("Prevents the small Cucco from appearing in the Bombchu Bowling minigame.")); + AddWidget(path, "Remove Big Cucco", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoBigCucco")) + .PreFunc(bombchuBowlingDisabledFunc) + .Options(CheckboxOptions().Tooltip("Prevents the big Cucco from appearing in the Bombchu Bowling minigame.")); + AddWidget(path, "Bombchu Count: %d bombchus", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("BombchuBowlingAmmo")) + .PreFunc(bombchuBowlingDisabledFunc) + .Options(IntSliderOptions() + .Min(3) + .Max(20) + .DefaultValue(10) + .Format("%d bombchus") + .Tooltip("The number of Bombchus available at the start of the Bombchu Bowling minigame.")); + AddWidget(path, "Frogs' Ocarina Game", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##Frogs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame")) + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Frogs' Ocarina Game behavior.")); + auto frogsOcarinaGameDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) == 0; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Instant Win##Frogs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantFrogsGameWin")) + .PreFunc(frogsOcarinaGameDisabledFunc) + .Options(CheckboxOptions().Tooltip("Skips the Frogs' Ocarina Game.")); + AddWidget(path, "Unlimited Playback Time##Frogs", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime")) + .PreFunc(frogsOcarinaGameDisabledFunc) + .Options(CheckboxOptions().Tooltip("Removes the timer to play back the song.")); + AddWidget(path, "Modify note timer: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("FrogsModifyFailTime")) + .PreFunc([](WidgetInfo& info) { + info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || + CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0); + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off or " + "\"Unlimited Playback Time\" is on"; + }) + .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( + "Adjusts the time allowed for playback before failing.")); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Lost Woods Ocarina Game", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##LostWoods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeOcarinaGame")) + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Lost Woods Ocarina Game behavior.")); + auto ocarinaMemoryGameDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 0) == 0; + info.options->disabledTooltip = "This options is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Instant Win##LostWoods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantOcarinaGameWin")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(CheckboxOptions().Tooltip("Skips the Lost Woods Ocarina Memory Game.")); + AddWidget(path, "Note Play Speed: %dx", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.NoteSpeed")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( + "Adjust the speed that the Skull Kids play the notes.")); + AddWidget(path, "Unlimited Playback Time##LostWoods", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("OcarinaUnlimitedFailTime")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(CheckboxOptions().Tooltip("Removes the timer to play back the song.")); + AddWidget(path, "Number of Starting Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(1) + .Max(8) + .DefaultValue(3) + .Format("%d notes") + .Tooltip("Adjust the number of notes the Skull Kids play to start the first round.")); + int roundMin = CVarGetInteger(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 3); + AddWidget(path, "Round One Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(roundMin) + .Max(8) + .DefaultValue(5) + .Format("%d notes") + .Tooltip("Adjust the number of notes you need to play to end the first round.")); + AddWidget(path, "Round Two Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundTwoNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(roundMin) + .Max(8) + .DefaultValue(6) + .Format("%d notes") + .Tooltip("Adjust the number of notes you need to play to end the second round.")); + AddWidget(path, "Round Three Notes: %d notes", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("OcarinaGame.RoundThreeNotes")) + .PreFunc(ocarinaMemoryGameDisabledFunc) + .Options(IntSliderOptions() + .Min(roundMin) + .Max(8) + .DefaultValue(8) + .Format("%d notes") + .Tooltip("Adjust the number of notes you need to play to end the third round.")); + + path.column = SECTION_COLUMN_3; + AddWidget(path, "Fishing", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Customize Behavior##Fishing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("CustomizeFishing")) + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Fishing behavior")); + auto fishingDisabledFunc = [](WidgetInfo& info) { + info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) == 0; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; + }; + AddWidget(path, "Instant Fishing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("InstantFishing")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip("All fish will be caught instantly.")); + AddWidget(path, "Guarantee Bite", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("GuaranteeFishingBite")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip("When a line is stable, guarantee bite. Otherwise use Default logic.")); + AddWidget(path, "Fish Never Escape", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FishNeverEscape")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip("Once a hook as been set, Fish will never let go while being reeled in.")); + AddWidget(path, "Loaches Always Appear", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("LoachesAlwaysAppear")) + .PreFunc(fishingDisabledFunc) + .Options( + CheckboxOptions().Tooltip("Loaches will always appear in the fishing pond instead of every four visits.")); + AddWidget(path, "Skip Keep Confirmation", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipKeepConfirmation")) + .PreFunc(fishingDisabledFunc) + .Options( + CheckboxOptions().Tooltip("The Pond Owner will not ask to confirm if you want to keep a smaller Fish.")); + AddWidget(path, "Child Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("MinimumFishWeightChild")) + .PreFunc(fishingDisabledFunc) + .Options(IntSliderOptions().Min(3).Max(10).DefaultValue(10).Format("%d lbs.").Tooltip( + "The minimum weight for the unique Fishing Reward as a Child.")); + AddWidget(path, "Adult Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("MinimumFishWeightAdult")) + .PreFunc(fishingDisabledFunc) + .Options(IntSliderOptions().Min(6).Max(13).DefaultValue(13).Format("%d lbs.").Tooltip( + "The minimum weight for the unique fishing reward as an Adult.")); + AddWidget(path, "All Fish are Hyrule Loaches", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("AllHyruleLoaches")) + .PreFunc(fishingDisabledFunc) + .Options(IntSliderOptions().Tooltip("Every fish in the Fishing Pond will always be a Hyrule Loach.\n\n" + "NOTE: This requires reloading the area.")); + + // Extra Modes path.sidebarName = "Extra Modes"; AddSidebarEntry("Enhancements", path.sidebarName, 3); path.column = SECTION_COLUMN_1; @@ -1711,6 +1413,9 @@ void SohMenu::AddMenuEnhancements() { "Enables Ivan the Fairy upon the next map change. Player 2 can control Ivan and press the C-Buttons to " "use items and mess with Player 1!" )); + AddWidget(path, "Dogs Follow you Everywhere", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("DogFollowsEverywhere")) + .Options(CheckboxOptions().Tooltip("Allows dogs to follow you anywhere you go, even if you leave the Market.")); AddWidget(path, "Rupee Dash Mode", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RupeeDash")) .Options(CheckboxOptions().Tooltip( @@ -1881,95 +1586,24 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Nayru's Love", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteNayru")); AddWidget(path, "Epona Boost", WIDGET_CVAR_CHECKBOX).CVar(CVAR_CHEAT("InfiniteEponaBoost")); - AddWidget(path, "Inventory", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Super Tunic", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("SuperTunic")) - .Options(CheckboxOptions().Tooltip( - "Makes every tunic have the effects of every other tunic." - )); - AddWidget(path, "Easy ISG", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("EasyISG")) - .Options(CheckboxOptions().Tooltip( - "Passive Infinite Sword Glitch\n" - "It makes your sword's swing effect and hitbox stay active indefinitely." - )); - AddWidget(path, "Easy QPA", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("EasyQPA")) - .Options(CheckboxOptions().Tooltip( - "Gives you the glitched damage value of the quick put away glitch." - )); + AddWidget(path, "Items", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Timeless Equipment", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("TimelessEquipment")) - .Options(CheckboxOptions().Tooltip( - "Allows any item to be equipped, regardless of age.\n" - "Also allows Child to use Adult strength upgrades." - )); + .Options(CheckboxOptions().Tooltip("Allows any item to be equipped, regardless of age.\n" + "Also allows Child to use Adult strength upgrades.")); AddWidget(path, "Unrestricted Items", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("Unrestricted Items")) - .Options(CheckboxOptions().Tooltip( - "Allows you to use any item at any location" - )); + .Options(CheckboxOptions().Tooltip("Allows you to use any item at any location")); + AddWidget(path, "Super Tunic", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("SuperTunic")) + .Options(CheckboxOptions().Tooltip("Makes every tunic have the effects of every other tunic.")); AddWidget(path, "Fireproof Deku Shield", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("FireproofDekuShield")) - .Options(CheckboxOptions().Tooltip( - "Prevents the Deku Shield from burning on contact with fire." - )); + .Options(CheckboxOptions().Tooltip("Prevents the Deku Shield from burning on contact with fire.")); AddWidget(path, "Shield with Two-Handed Weapons", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("ShieldTwoHanded")) .Options(CheckboxOptions().Tooltip( - "This allows you to put up for shield with any two-handed weapon in hand except for Deku Sticks." - )); - - path.column = SECTION_COLUMN_2; - - AddWidget(path, "Behavior", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "No Clip", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("NoClip")) - .Options(CheckboxOptions().Tooltip("Allows you to walk through walls.")); - AddWidget(path, "Climb Everything", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("ClimbEverything")) - .Options(CheckboxOptions().Tooltip("Makes every surface in the game climbable.")); - AddWidget(path, "Moon Jump on L", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("MoonJumpOnL")) - .Options(CheckboxOptions().Tooltip("Holding L makes you float into the air.")); - AddWidget(path, "New Easy Frame Advancing", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("EasyFrameAdvance")) - .Options(CheckboxOptions().Tooltip( - "Continue holding START button when unpausing to only advance a single frame and then re-pause." - )); - AddWidget(path, "Drops Don't Despawn", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("DropsDontDie")) - .Options(CheckboxOptions().Tooltip( - "Drops from enemies, grass, etc. don't disappear after a set amount of time." - )); - AddWidget(path, "Fish Don't Despawn", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("NoFishDespawn")) - .Options(CheckboxOptions().Tooltip( - "Prevents fish from automatically despawning after a while when dropped." - )); - AddWidget(path, "Bugs Don't Despawn", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("NoBugsDespawn")) - .Options(CheckboxOptions().Tooltip( - "Prevents bugs from automatically despawning after a while when dropped." - )); - AddWidget(path, "Freeze Time", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("FreezeTime")) - .Options(CheckboxOptions().Tooltip("Freezes the time of day")); - AddWidget(path, "Time Sync", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("TimeSync")) - .Options(CheckboxOptions().Tooltip("Syncs the in-game time with the real world time.")); - AddWidget(path, "No ReDead/Gibdo Freeze", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("NoRedeadFreeze")) - .Options(CheckboxOptions().Tooltip( - "Prevents ReDeads and Gibdos from being able to freeze you with their scream." - )); - AddWidget(path, "Keese/Guay Don't Target You", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("NoKeeseGuayTarget")) - .Options(CheckboxOptions().Tooltip( - "Keese and Guay no longer target you and simply ignore you as if you were wearing the " - "Skull Mask." - )); - + "This allows you to put up for shield with any two-handed weapon in hand except for Deku Sticks.")); AddWidget(path, "Deku Sticks:", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_CHEAT("DekuStick")) .Options(ComboboxOptions().ComboMap(dekuStickCheat).DefaultIndex(DEKU_STICK_NORMAL)); @@ -1982,12 +1616,70 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_CHEAT("HookshotReachMultiplier")) .Options(FloatSliderOptions().Format("%.2f").Min(1.0f).Max(5.0f)); - AddWidget(path, "Change Age", WIDGET_BUTTON) - .Options(ButtonOptions().Tooltip("Switches Link's age and reloads the area.")) - .Callback([](WidgetInfo& info) { SwitchAge(); }); + + path.column = SECTION_COLUMN_2; + AddWidget(path, "Misc", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "No Clip", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoClip")) + .Options(CheckboxOptions().Tooltip("Allows you to walk through walls.")); + AddWidget(path, "Climb Everything", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("ClimbEverything")) + .Options(CheckboxOptions().Tooltip("Makes every surface in the game climbable.")); + AddWidget(path, "Moon Jump on L", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("MoonJumpOnL")) + .Options(CheckboxOptions().Tooltip("Holding L makes you float into the air.")); + AddWidget(path, "No ReDead/Gibdo Freeze", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoRedeadFreeze")) + .Options( + CheckboxOptions().Tooltip("Prevents ReDeads and Gibdos from being able to freeze you with their scream.")); + AddWidget(path, "Keese/Guay Don't Target You", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoKeeseGuayTarget")) + .Options(CheckboxOptions().Tooltip( + "Keese and Guay no longer target you and simply ignore you as if you were wearing the " + "Skull Mask.")); + + AddWidget(path, "Glitch Aids", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Easy Frame Advancing", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EasyFrameAdvance")) + .Options(CheckboxOptions().Tooltip( + "Continue holding START button when unpausing to only advance a single frame and then re-pause.")); + AddWidget(path, "Easy ISG", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EasyISG")) + .Options(CheckboxOptions().Tooltip("Passive Infinite Sword Glitch\n" + "It makes your sword's swing effect and hitbox stay active indefinitely.")); + AddWidget(path, "Easy QPA", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("EasyQPA")) + .Options(CheckboxOptions().Tooltip("Gives you the glitched damage value of the quick put away glitch.")); AddWidget(path, "Clear Cutscene Pointer", WIDGET_BUTTON) .Callback([](WidgetInfo& info) { GameInteractor::RawAction::ClearCutscenePointer(); }) - .Options(ButtonOptions().Tooltip("Clears the cutscene pointer to a value safe for wrong warps.")); + .Options(ButtonOptions() + .Tooltip("Clears the cutscene pointer to a value safe for wrong warps.") + .Size(UIWidgets::Sizes::Inline)); + + AddWidget(path, "Despawn Timers", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Drops Don't Despawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("DropsDontDie")) + .Options( + CheckboxOptions().Tooltip("Drops from enemies, grass, etc. don't disappear after a set amount of time.")); + AddWidget(path, "Fish Don't Despawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoFishDespawn")) + .Options(CheckboxOptions().Tooltip("Prevents fish from automatically despawning after a while when dropped.")); + AddWidget(path, "Bugs Don't Despawn", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("NoBugsDespawn")) + .Options(CheckboxOptions().Tooltip("Prevents bugs from automatically despawning after a while when dropped.")); + + AddWidget(path, "Time of Day", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Freeze Time", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("FreezeTime")) + .Options(CheckboxOptions().Tooltip("Freezes the time of day")); + AddWidget(path, "Time Sync", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_CHEAT("TimeSync")) + .Options(CheckboxOptions().Tooltip("Syncs the in-game time with the real world time.")); + + AddWidget(path, "Instant Age Change", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Change Age", WIDGET_BUTTON) + .Options(ButtonOptions().Tooltip("Switches Link's age and reloads the area.").Size(UIWidgets::Sizes::Inline)) + .Callback([](WidgetInfo& info) { SwitchAge(); }); path.column = SECTION_COLUMN_3; AddWidget(path, "Save States", WIDGET_SEPARATOR_TEXT); diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index eec4c8674..cd1ba339d 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -102,6 +102,20 @@ void SohMenu::AddMenuSettings() { SDL_OpenURL(std::string("file:///" + std::filesystem::absolute(filesPath).string()).c_str()); }) .Options(ButtonOptions().Tooltip("Opens the folder that contains the save and mods folders, etc.")); + + AddWidget(path, "Boot", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX) + .CVar(CVAR_ENHANCEMENT("BootSequence")) + .Options(ComboboxOptions() + .DefaultIndex(BOOTSEQUENCE_DEFAULT) + .LabelPosition(LabelPosition::Far) + .ComponentAlignment(ComponentAlignment::Right) + .ComboMap(bootSequenceLabels) + .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")); + AddWidget(path, "Languages", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Translate Title Screen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SETTING("TitleScreenTranslation")); diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index 008d5692a..f3c663f66 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -186,7 +186,7 @@ namespace SOH { { MigrationAction::Rename, "gDisableGrottoRotation", "gEnhancements.DisableGrottoRotation" }, { MigrationAction::Rename, "gDisableKokiriDrawDistance", "gEnhancements.DisableKokiriDrawDistance" }, { MigrationAction::Rename, "gDisableLOD", "gEnhancements.DisableLOD" }, - { MigrationAction::Rename, "gDisableNaviCallAudio", "gEnhancements.DisableNaviCallAudio" }, + { MigrationAction::Rename, "gDisableNaviCallAudio", "gAudioEditor.DisableNaviCallAudio" }, { MigrationAction::Rename, "gDisableTunicWarningText", "gEnhancements.DisableTunicWarningText" }, { MigrationAction::Rename, "gDogFollowsEverywhere", "gEnhancements.DogFollowsEverywhere" }, { MigrationAction::Rename, "gDpadNoDropOcarinaInput", "gEnhancements.DpadNoDropOcarinaInput" }, @@ -236,7 +236,7 @@ namespace SOH { { MigrationAction::Rename, "gInstantShootingGalleryWin", "gEnhancements.InstantShootingGalleryWin" }, { MigrationAction::Rename, "gIvanCoopModeEnabled", "gEnhancements.IvanCoopModeEnabled" }, { MigrationAction::Rename, "gLinkDefaultName", "gEnhancements.LinkDefaultName" }, - { MigrationAction::Rename, "gLowHpAlarm", "gEnhancements.LowHpAlarm" }, + { MigrationAction::Rename, "gLowHpAlarm", "gAudioEditor.LowHpAlarm" }, { MigrationAction::Rename, "gMMBunnyHood", "gEnhancements.MMBunnyHood" }, { MigrationAction::Rename, "gMarketSneak", "gEnhancements.MarketSneak" }, { MigrationAction::Rename, "gMaskSelect", "gEnhancements.MaskSelect" }, diff --git a/soh/src/code/z_lifemeter.c b/soh/src/code/z_lifemeter.c index 726e8d44d..0deab1a70 100644 --- a/soh/src/code/z_lifemeter.c +++ b/soh/src/code/z_lifemeter.c @@ -651,7 +651,7 @@ void HealthMeter_HandleCriticalAlarm(PlayState* play) { if (interfaceCtx->unk_22A <= 0) { interfaceCtx->unk_22A = 0; interfaceCtx->unk_22C = 0; - if (CVarGetInteger(CVAR_ENHANCEMENT("LowHpAlarm"), 0) == 0 && !Player_InCsMode(play) && (play->pauseCtx.state == 0) && + if (CVarGetInteger(CVAR_AUDIO("LowHpAlarm"), 0) == 0 && !Player_InCsMode(play) && (play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && HealthMeter_IsCritical() && !Play_InCsMode(play)) { Sfx_PlaySfxCentered(NA_SE_SY_HITPOINT_ALARM); } diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index f424b9fcd..8c93b8a57 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2832,7 +2832,7 @@ void Interface_SetNaviCall(PlayState* play, u16 naviCallState) { if (((naviCallState == 0x1D) || (naviCallState == 0x1E)) && !interfaceCtx->naviCalling && (play->csCtx.state == CS_STATE_IDLE)) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("DisableNaviCallAudio"), 0)) { + if (!CVarGetInteger(CVAR_AUDIO("DisableNaviCallAudio"), 0)) { // clang-format off if (naviCallState == 0x1E) { Audio_PlaySoundGeneral(NA_SE_VO_NAVY_CALL, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } From 0f81e6d82bae9be04f31fffb083242ee9f02b74c Mon Sep 17 00:00:00 2001 From: xxAtrain223 Date: Wed, 19 Mar 2025 05:11:26 -0500 Subject: [PATCH 087/267] Initialize the RegionTable when loading a file. (#5144) --- soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 832276e65..6c4177198 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -822,6 +822,7 @@ void LoadFile() { SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled, (uint32_t)0); UpdateAllOrdering(); UpdateAllAreas(); + RegionTable_Init(); } void Teardown() { From 7c227dcc42aa7cd8ea4add6ddf440e02cd316a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 19 Mar 2025 10:11:47 +0000 Subject: [PATCH 088/267] remove color from UIWidgets::WidgetOptions (#5141) --- soh/soh/SohGui/Menu.cpp | 14 ++++++----- soh/soh/SohGui/MenuTypes.h | 4 +++- soh/soh/SohGui/ResolutionEditor.cpp | 6 ++--- soh/soh/SohGui/SohMenu.cpp | 6 +++-- soh/soh/SohGui/SohMenuEnhancements.cpp | 2 +- soh/soh/SohGui/SohMenuSettings.cpp | 2 +- soh/soh/SohGui/UIWidgets.cpp | 4 ++-- soh/soh/SohGui/UIWidgets.hpp | 33 +++++++++++++++----------- 8 files changed, 41 insertions(+), 30 deletions(-) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index be4bbdc89..dc7970bc1 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -303,21 +303,23 @@ void Menu::MenuDrawItem(WidgetInfo& widget, uint32_t width, UIWidgets::Colors me ImGui::Separator(); } break; case WIDGET_SEPARATOR_TEXT: { - if (widget.options->color != UIWidgets::Colors::NoColor) { - ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(widget.options->color)); + auto options = std::static_pointer_cast(widget.options); + if (options->color != UIWidgets::Colors::NoColor) { + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(options->color)); } ImGui::SeparatorText(widget.name.c_str()); - if (widget.options->color != UIWidgets::Colors::NoColor) { + if (options->color != UIWidgets::Colors::NoColor) { ImGui::PopStyleColor(); } } break; case WIDGET_TEXT: { - if (widget.options->color != UIWidgets::Colors::NoColor) { - ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(widget.options->color)); + auto options = std::static_pointer_cast(widget.options); + if (options->color != UIWidgets::Colors::NoColor) { + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(options->color)); } ImGui::AlignTextToFramePadding(); ImGui::TextWrapped("%s", widget.name.c_str()); - if (widget.options->color != UIWidgets::Colors::NoColor) { + if (options->color != UIWidgets::Colors::NoColor) { ImGui::PopStyleColor(); } } break; diff --git a/soh/soh/SohGui/MenuTypes.h b/soh/soh/SohGui/MenuTypes.h index 7b979a824..28a89820d 100644 --- a/soh/soh/SohGui/MenuTypes.h +++ b/soh/soh/SohGui/MenuTypes.h @@ -73,7 +73,7 @@ typedef enum { using CVarVariant = std::variant; using OptionsVariant = std::variant; // All the info needed for display and search of all widgets in the menu. @@ -145,6 +145,8 @@ struct WidgetInfo { break; case WIDGET_TEXT: case WIDGET_SEPARATOR_TEXT: + options = std::make_shared(std::get(options_)); + break; case WIDGET_SEPARATOR: default: options = std::make_shared(std::get(options_)); diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp index e4f504ccd..c270444fb 100644 --- a/soh/soh/SohGui/ResolutionEditor.cpp +++ b/soh/soh/SohGui/ResolutionEditor.cpp @@ -360,10 +360,10 @@ void RegisterResolutionWidgets() { WIDGET_TEXT) .PreFunc( [](WidgetInfo& info) { info.isHidden = !(!CVarGetInteger(CVAR_LOW_RES_MODE, 0) && IsDroppingFrames()); }) - .Options(WidgetOptions().Color(Colors::Orange)); + .Options(TextOptions().Color(Colors::Orange)); mSohMenu->AddWidget(path, ICON_FA_QUESTION_CIRCLE " \"N64 Mode\" is overriding these settings.", WIDGET_TEXT) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_LOW_RES_MODE, 0); }) - .Options(WidgetOptions().Color(Colors::LightBlue)); + .Options(TextOptions().Color(Colors::LightBlue)); mSohMenu->AddWidget(path, "Click to disable N64 mode", WIDGET_BUTTON) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_LOW_RES_MODE, 0); }) .Callback([](WidgetInfo& info) { @@ -391,7 +391,7 @@ void RegisterResolutionWidgets() { } }) .SameLine(true) - .Options(WidgetOptions().Color(Colors::Gray)); + .Options(TextOptions().Color(Colors::Gray)); // Presets mSohMenu->AddWidget(path, "Aspect Ratio", WIDGET_COMBOBOX) .ValuePointer(&item_aspectRatio) diff --git a/soh/soh/SohGui/SohMenu.cpp b/soh/soh/SohGui/SohMenu.cpp index 780aa51f2..26770c986 100644 --- a/soh/soh/SohGui/SohMenu.cpp +++ b/soh/soh/SohGui/SohMenu.cpp @@ -64,10 +64,12 @@ WidgetInfo& SohMenu::AddWidget(WidgetPath& pathInfo, std::string widgetName, Wid case WIDGET_COLOR_24: case WIDGET_COLOR_32: break; - case WIDGET_SEARCH: - case WIDGET_SEPARATOR: case WIDGET_SEPARATOR_TEXT: case WIDGET_TEXT: + widget.options = std::make_shared(); + break; + case WIDGET_SEARCH: + case WIDGET_SEPARATOR: default: widget.options = std::make_shared(); } diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 6f0caff61..1f3066806 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1684,7 +1684,7 @@ void SohMenu::AddMenuEnhancements() { path.column = SECTION_COLUMN_3; AddWidget(path, "Save States", WIDGET_SEPARATOR_TEXT); AddWidget(path, ICON_FA_EXCLAMATION_TRIANGLE " WARNING!!!! " ICON_FA_EXCLAMATION_TRIANGLE, WIDGET_TEXT) - .Options(WidgetOptions().Color(Colors::Orange)); + .Options(TextOptions().Color(Colors::Orange)); AddWidget(path, "These are NOT like emulator states. They do not save your game progress " "and they WILL break across transitions and load zones (like doors). " diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index cd1ba339d..dc821ecc4 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -132,7 +132,7 @@ void SohMenu::AddMenuSettings() { .CVar(CVAR_SETTING("A11yDisableIdleCam")) .Options(CheckboxOptions().Tooltip("Disables the automatic re-centering of the camera when idle.")); AddWidget(path, "EXPERIMENTAL", WIDGET_SEPARATOR_TEXT) - .Options(WidgetOptions().Color(Colors::Orange)); + .Options(TextOptions().Color(Colors::Orange)); AddWidget(path, "ImGui Menu Scaling", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("ImGuiScale")) .Options(ComboboxOptions().ComboMap(imguiScaleOptions).Tooltip("Changes the scaling of the ImGui menu elements.").DefaultIndex(1) diff --git a/soh/soh/SohGui/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp index 18abb0094..7b6883628 100644 --- a/soh/soh/SohGui/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -193,8 +193,8 @@ bool WindowButton(const char* label, const char* cvarName, std::shared_ptrToggleVisibility(); dirty = true; } diff --git a/soh/soh/SohGui/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp index b9e69292e..4e30de6d1 100644 --- a/soh/soh/SohGui/UIWidgets.hpp +++ b/soh/soh/SohGui/UIWidgets.hpp @@ -122,12 +122,7 @@ namespace UIWidgets { const char* tooltip = ""; bool disabled = false; const char* disabledTooltip = ""; - Colors color = Colors::NoColor; - WidgetOptions& Color(Colors color_) { - color = color = color_; - return *this; - } WidgetOptions& Tooltip(const char* tooltip_) { tooltip = tooltip_; return *this; @@ -142,6 +137,15 @@ namespace UIWidgets { } }; + struct TextOptions : WidgetOptions { + Colors color = Colors::NoColor; + + TextOptions& Color(Colors color_) { + color = color_; + return *this; + } + }; + struct ButtonOptions : WidgetOptions { ImVec2 size = Sizes::Fill; ImVec2 padding = ImVec2(10.0f, 8.0f); @@ -160,7 +164,7 @@ namespace UIWidgets { return *this; } ButtonOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } }; @@ -185,7 +189,7 @@ namespace UIWidgets { return *this; } WindowButtonOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } WindowButtonOptions& ShowButton(bool showButton_) { @@ -202,7 +206,7 @@ namespace UIWidgets { bool defaultValue = false; // Only applicable to CVarCheckbox ComponentAlignment alignment = ComponentAlignment::Left; LabelPosition labelPosition = LabelPosition::Near; - Colors color = WidgetOptions::color = Colors::LightBlue; + Colors color = Colors::LightBlue; CheckboxOptions& DefaultValue(bool defaultValue_) { defaultValue = defaultValue_; @@ -221,7 +225,7 @@ namespace UIWidgets { return *this; } CheckboxOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } CheckboxOptions& DisabledTooltip(const char* disabledTooltip_) { @@ -259,7 +263,7 @@ namespace UIWidgets { return *this; } ComboboxOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } }; @@ -315,7 +319,7 @@ namespace UIWidgets { return *this; } IntSliderOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } IntSliderOptions& Size(ImVec2 size_) { @@ -387,7 +391,7 @@ namespace UIWidgets { return *this; } FloatSliderOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } FloatSliderOptions& Size(ImVec2 size_) { @@ -402,6 +406,7 @@ namespace UIWidgets { struct RadioButtonsOptions : WidgetOptions { std::unordered_map buttonMap; + Colors color = Colors::LightBlue; RadioButtonsOptions& ButtonMap(std::unordered_map buttonMap_) { buttonMap = buttonMap_; @@ -412,7 +417,7 @@ namespace UIWidgets { return *this; } RadioButtonsOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } }; @@ -433,7 +438,7 @@ namespace UIWidgets { return *this; } InputOptions& Color(Colors color_) { - WidgetOptions::color = color = color_; + color = color_; return *this; } InputOptions& Size(ImVec2 size_) { From 9795f696c8392696614859a528d74ca3a73574fb Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 19 Mar 2025 06:14:43 -0400 Subject: [PATCH 089/267] Hook unregister fixes and hook debugger tweaks (#5139) * clang-format before * Hook unregister fixes and hook debugger tweaks --- .../Enhancements/debugger/hookDebugger.cpp | 70 ++--- .../game-interactor/GameInteractor.h | 256 +++++++++++++----- .../game-interactor/GameInteractor_Hooks.cpp | 3 + 3 files changed, 217 insertions(+), 112 deletions(-) diff --git a/soh/soh/Enhancements/debugger/hookDebugger.cpp b/soh/soh/Enhancements/debugger/hookDebugger.cpp index 782cf4f7a..a9d6ca891 100644 --- a/soh/soh/Enhancements/debugger/hookDebugger.cpp +++ b/soh/soh/Enhancements/debugger/hookDebugger.cpp @@ -4,28 +4,29 @@ #include #include -static std::unordered_map*> hookData; +static std::map*> hookData; const ImVec4 grey = ImVec4(0.75, 0.75, 0.75, 1); const ImVec4 yellow = ImVec4(1, 1, 0, 1); const ImVec4 red = ImVec4(1, 0, 0, 1); void DrawHookRegisteringInfos(const char* hookName) { - if ((*hookData[hookName]).size() == 0) { + size_t numHooks = (*hookData[hookName]).size(); + + if (numHooks == 0) { ImGui::TextColored(grey, "No hooks found"); return; } - if (ImGui::BeginTable( - ("Table##" + std::string(hookName)).c_str(), - 4, - ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit - )) { - ImGui::TableSetupColumn("Id"); - ImGui::TableSetupColumn("Type"); - ImGui::TableSetupColumn("Registration Info"); - //ImGui::TableSetupColumn("Stub"); - ImGui::TableSetupColumn("Number of Calls"); + ImGui::Text("Total Registered: %d", numHooks); + + if (ImGui::BeginTable(("Table##" + std::string(hookName)).c_str(), 4, + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | + ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) { + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Registration Info", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("# Calls", ImGuiTableColumnFlags_WidthFixed); ImGui::TableHeadersRow(); for (auto& [id, hookInfo] : (*hookData[hookName])) { ImGui::TableNextRow(); @@ -39,7 +40,7 @@ void DrawHookRegisteringInfos(const char* hookName) { ImGui::Text("Normal"); break; case HOOK_TYPE_ID: - ImGui::Text("Id"); + ImGui::Text("ID"); break; case HOOK_TYPE_PTR: ImGui::Text("Ptr"); @@ -54,27 +55,19 @@ void DrawHookRegisteringInfos(const char* hookName) { ImGui::TableNextColumn(); if (hookInfo.registering.valid) { - ImGui::Text("%s(%d:%d) %s", hookInfo.registering.file, hookInfo.registering.line, hookInfo.registering.column, hookInfo.registering.function); + // Replace the space after the return type of the parent function with a non-breaking space + std::string parentFunction = std::string(hookInfo.registering.function); + size_t pos = parentFunction.find_first_of(" "); + if (pos != std::string::npos) { + parentFunction.replace(pos, 1, "\u00A0"); + } + // Non breaking space to keep the arrow with the parent function + ImGui::TextWrapped("%s(%d:%d) <-\u00A0%s", hookInfo.registering.file, hookInfo.registering.line, + hookInfo.registering.column, parentFunction.c_str()); } else { - ImGui::TextColored(yellow, "[Unavaliable]"); + ImGui::TextColored(yellow, "[Unavailable]"); } - //TODO: not currently possible - /* - ImGui::TableNextColumn(); - - ImGui::BeginDisabled(); - - bool stubButtonPressed = ImGui::Button(("Stub##" + std::to_string(id)).c_str()); - UIWidgets::SetLastItemHoverText("Stub this hook.\nThis is not possible to automatically undo."); - - if (stubButtonPressed) { - //stub - } - - ImGui::EndDisabled(); - */ - ImGui::TableNextColumn(); ImGui::Text("%d", hookInfo.calls); } @@ -84,12 +77,9 @@ void DrawHookRegisteringInfos(const char* hookName) { void HookDebuggerWindow::DrawElement() { #ifndef __cpp_lib_source_location - ImGui::TextColored( - yellow, - "Some features of the Hook Debugger are unavaliable because SoH was compiled " - "without \"\" support " - "(\"__cpp_lib_source_location\" not defined in \"\")." - ); + ImGui::TextColored(yellow, "Some features of the Hook Debugger are unavailable because SoH was compiled " + "without \"\" support " + "(\"__cpp_lib_source_location\" not defined in \"\")."); #endif for (auto& [hookName, _] : hookData) { @@ -101,9 +91,9 @@ void HookDebuggerWindow::DrawElement() { } void HookDebuggerWindow::InitElement() { - #define DEFINE_HOOK(name, _) hookData.insert({#name, GameInteractor::Instance->GetHookData()}); +#define DEFINE_HOOK(name, _) hookData.insert({ #name, GameInteractor::Instance->GetHookData() }); - #include "../game-interactor/GameInteractor_HookTable.h" +#include "../game-interactor/GameInteractor_HookTable.h" - #undef DEFINE_HOOK +#undef DEFINE_HOOK } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 8c6be086f..4d8e6dcb4 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -92,19 +92,20 @@ void GameInteractor_SetTriforceHuntCreditsWarpActive(uint8_t state); } #endif - #ifdef __cplusplus #include #include +#include #include #include #include #include + #include #ifdef __cpp_lib_source_location #include #else -#pragma message("Compiling without support, the Hook Debugger will not be avaliable") +#pragma message("Compiling without support, the Hook Debugger will not be available") #endif typedef uint32_t HOOK_ID; @@ -124,24 +125,31 @@ struct HookRegisteringInfo { const char* function; HookType type; - HookRegisteringInfo() : valid(false), file("unknown file"), line(0), column(0), function("unknown function"), type(HOOK_TYPE_NORMAL) {} + HookRegisteringInfo() + : valid(false), file("unknown file"), line(0), column(0), function("unknown function"), type(HOOK_TYPE_NORMAL) { + } - HookRegisteringInfo(const char* _file, std::uint_least32_t _line, std::uint_least32_t _column, const char* _function, HookType _type) : - valid(true), file(_file), line(_line), column(_column), function(_function), type(_type) {} + HookRegisteringInfo(const char* _file, std::uint_least32_t _line, std::uint_least32_t _column, + const char* _function, HookType _type) + : valid(true), file(_file), line(_line), column(_column), function(_function), type(_type) { + // Trim off user parent directories + const char* trimmed = strstr(_file, "soh/soh/"); + if (trimmed != nullptr) { + file = trimmed; + } + } }; struct HookInfo { uint32_t calls; HookRegisteringInfo registering; - - HookInfo() : calls(0), registering(HookRegisteringInfo{}) {} - HookInfo(HookRegisteringInfo _registering) : calls(0), registering(_registering) {} }; #ifdef __cpp_lib_source_location -#define GET_CURRENT_REGISTERING_INFO(type) HookRegisteringInfo{location.file_name(), location.line(), location.column(), location.function_name(), type} +#define GET_CURRENT_REGISTERING_INFO(type) \ + (HookRegisteringInfo{ location.file_name(), location.line(), location.column(), location.function_name(), type }) #else -#define GET_CURRENT_REGISTERING_INFO(type) HookRegisteringInfo{} +#define GET_CURRENT_REGISTERING_INFO(type) (HookRegisteringInfo{}) #endif #define REGISTER_VB_SHOULD(flag, body) \ @@ -171,23 +179,23 @@ struct HookInfo { hookId = GameInteractor::Instance->RegisterGameHookForID(id, body); \ } \ } -#define COND_VB_SHOULD(id, condition, body) \ - { \ - static HOOK_ID hookId = 0; \ +#define COND_VB_SHOULD(id, condition, body) \ + { \ + static HOOK_ID hookId = 0; \ GameInteractor::Instance->UnregisterGameHookForID(hookId); \ - hookId = 0; \ - if (condition) { \ - hookId = REGISTER_VB_SHOULD(id, body); \ - } \ + hookId = 0; \ + if (condition) { \ + hookId = REGISTER_VB_SHOULD(id, body); \ + } \ } class GameInteractor { -public: + public: static GameInteractor* Instance; // Game State class State { - public: + public: static bool NoUIActive; static GILinkSize LinkSize; static bool InvisibleLinkActive; @@ -219,14 +227,15 @@ public: // Game Hooks HOOK_ID nextHookId = 1; + template struct RegisteredGameHooks { inline static std::unordered_map functions; inline static std::unordered_map> functionsForID; inline static std::unordered_map> functionsForPtr; inline static std::unordered_map> functionsForFilter; - //Used for the hook debugger - inline static std::unordered_map hookData; + // Used for the hook debugger + inline static std::map hookData; }; template struct HooksToUnregister { @@ -236,39 +245,43 @@ public: inline static std::vector hooksForFilter; }; - template std::unordered_map* GetHookData() { + template std::map* GetHookData() { return &RegisteredGameHooks::hookData; } // General Hooks - template HOOK_ID RegisterGameHook( - typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHook(typename H::fn h, const std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHook(typename H::fn h) { #endif - ) { - // Ensure hook id is unique and not 0, which is reserved for invalid hooks - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; while (RegisteredGameHooks::functions.find(this->nextHookId) != RegisteredGameHooks::functions.end()) { this->nextHookId++; } RegisteredGameHooks::functions[this->nextHookId] = h; - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_NORMAL)}; + RegisteredGameHooks::hookData[this->nextHookId] = + HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_NORMAL) }; return this->nextHookId++; } template void UnregisterGameHook(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooks.push_back(hookId); } template void ExecuteHooks(Args&&... args) { + // Remove pending hooks for this type for (auto& hookId : HooksToUnregister::hooks) { RegisteredGameHooks::functions.erase(hookId); RegisteredGameHooks::hookData.erase(hookId); } HooksToUnregister::hooks.clear(); + // Execute hooks for (auto& hook : RegisteredGameHooks::functions) { hook.second(std::forward(args)...); RegisteredGameHooks::hookData[hook.first].calls += 1; @@ -276,39 +289,60 @@ public: } // ID based Hooks - template HOOK_ID RegisterGameHookForID( - int32_t id, typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHookForID(int32_t id, typename H::fn h, + std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHookForID(int32_t id, typename H::fn h) { #endif - ) { - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; - while (RegisteredGameHooks::functionsForID[id].find(this->nextHookId) != RegisteredGameHooks::functionsForID[id].end()) { + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; + while (RegisteredGameHooks::functionsForID[id].find(this->nextHookId) != + RegisteredGameHooks::functionsForID[id].end()) { this->nextHookId++; } RegisteredGameHooks::functionsForID[id][this->nextHookId] = h; - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_ID)}; + RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_ID) }; return this->nextHookId++; } template void UnregisterGameHookForID(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooksForID.push_back(hookId); } template void ExecuteHooksForID(int32_t id, Args&&... args) { - for (auto& hookId : HooksToUnregister::hooksForID) { - for (auto it = RegisteredGameHooks::functionsForID[id].begin(); it != RegisteredGameHooks::functionsForID[id].end(); ) { - if (it->first == hookId) { + // Remove pending hooks for this type + for (auto hookIdIt = HooksToUnregister::hooksForID.begin(); + hookIdIt != HooksToUnregister::hooksForID.end();) { + bool remove = false; + + if (RegisteredGameHooks::functionsForID[id].size() == 0) { + break; + } + + for (auto it = RegisteredGameHooks::functionsForID[id].begin(); + it != RegisteredGameHooks::functionsForID[id].end();) { + if (it->first == *hookIdIt) { it = RegisteredGameHooks::functionsForID[id].erase(it); - HooksToUnregister::hooksForID.erase(std::remove(HooksToUnregister::hooksForID.begin(), HooksToUnregister::hooksForID.end(), hookId), HooksToUnregister::hooksForID.end()); - RegisteredGameHooks::hookData.erase(hookId); + RegisteredGameHooks::hookData.erase(*hookIdIt); + remove = true; + break; } else { ++it; } } + + if (remove) { + hookIdIt = HooksToUnregister::hooksForID.erase(hookIdIt); + } else { + ++hookIdIt; + } } + // Execute hooks for (auto& hook : RegisteredGameHooks::functionsForID[id]) { hook.second(std::forward(args)...); RegisteredGameHooks::hookData[hook.first].calls += 1; @@ -316,39 +350,60 @@ public: } // PTR based Hooks - template HOOK_ID RegisterGameHookForPtr( - uintptr_t ptr, typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHookForPtr(uintptr_t ptr, typename H::fn h, + const std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHookForPtr(uintptr_t ptr, typename H::fn h) { #endif - ) { - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; - while (RegisteredGameHooks::functionsForPtr[ptr].find(this->nextHookId) != RegisteredGameHooks::functionsForPtr[ptr].end()) { + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; + while (RegisteredGameHooks::functionsForPtr[ptr].find(this->nextHookId) != + RegisteredGameHooks::functionsForPtr[ptr].end()) { this->nextHookId++; } RegisteredGameHooks::functionsForPtr[ptr][this->nextHookId] = h; - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_PTR)}; + RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_PTR) }; return this->nextHookId++; } template void UnregisterGameHookForPtr(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooksForPtr.push_back(hookId); } template void ExecuteHooksForPtr(uintptr_t ptr, Args&&... args) { - for (auto& hookId : HooksToUnregister::hooksForPtr) { - for (auto it = RegisteredGameHooks::functionsForPtr[ptr].begin(); it != RegisteredGameHooks::functionsForPtr[ptr].end(); ) { - if (it->first == hookId) { + // Remove pending hooks for this type + for (auto hookIdIt = HooksToUnregister::hooksForPtr.begin(); + hookIdIt != HooksToUnregister::hooksForPtr.end();) { + bool remove = false; + + if (RegisteredGameHooks::functionsForPtr[ptr].size() == 0) { + break; + } + + for (auto it = RegisteredGameHooks::functionsForPtr[ptr].begin(); + it != RegisteredGameHooks::functionsForPtr[ptr].end();) { + if (it->first == *hookIdIt) { it = RegisteredGameHooks::functionsForPtr[ptr].erase(it); - HooksToUnregister::hooksForPtr.erase(std::remove(HooksToUnregister::hooksForPtr.begin(), HooksToUnregister::hooksForPtr.end(), hookId), HooksToUnregister::hooksForPtr.end()); - RegisteredGameHooks::hookData.erase(hookId); + RegisteredGameHooks::hookData.erase(*hookIdIt); + remove = true; + break; } else { ++it; } } + + if (remove) { + hookIdIt = HooksToUnregister::hooksForPtr.erase(hookIdIt); + } else { + ++hookIdIt; + } } + // Execute hooks for (auto& hook : RegisteredGameHooks::functionsForPtr[ptr]) { hook.second(std::forward(args)...); RegisteredGameHooks::hookData[hook.first].calls += 1; @@ -356,33 +411,40 @@ public: } // Filter based Hooks - template HOOK_ID RegisterGameHookForFilter( - typename H::filter f, typename H::fn h + template #ifdef __cpp_lib_source_location - , const std::source_location location = std::source_location::current() + HOOK_ID RegisterGameHookForFilter(typename H::filter f, typename H::fn h, + const std::source_location location = std::source_location::current()) { +#else + HOOK_ID RegisterGameHookForFilter(typename H::filter f, typename H::fn h) { #endif - ) { - if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) this->nextHookId = 1; - while (RegisteredGameHooks::functionsForFilter.find(this->nextHookId) != RegisteredGameHooks::functionsForFilter.end()) { + if (this->nextHookId == 0 || this->nextHookId >= UINT32_MAX) + this->nextHookId = 1; + while (RegisteredGameHooks::functionsForFilter.find(this->nextHookId) != + RegisteredGameHooks::functionsForFilter.end()) { this->nextHookId++; } RegisteredGameHooks::functionsForFilter[this->nextHookId] = std::make_pair(f, h); - RegisteredGameHooks::hookData[this->nextHookId] = HookInfo{GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_FILTER)}; + RegisteredGameHooks::hookData[this->nextHookId] = + HookInfo{ 0, GET_CURRENT_REGISTERING_INFO(HOOK_TYPE_FILTER) }; return this->nextHookId++; } template void UnregisterGameHookForFilter(HOOK_ID hookId) { - if (hookId == 0) return; + if (hookId == 0) + return; HooksToUnregister::hooksForFilter.push_back(hookId); } template void ExecuteHooksForFilter(Args&&... args) { + // Remove pending hooks for this type for (auto& hookId : HooksToUnregister::hooksForFilter) { RegisteredGameHooks::functionsForFilter.erase(hookId); RegisteredGameHooks::hookData.erase(hookId); } HooksToUnregister::hooksForFilter.clear(); + // Execute hooks for (auto& hook : RegisteredGameHooks::functionsForFilter) { if (hook.second.first(std::forward(args)...)) { hook.second.second(std::forward(args)...); @@ -391,8 +453,62 @@ public: } } + template void ProcessUnregisteredHooks() { + // Normal + for (auto& hookId : HooksToUnregister::hooks) { + RegisteredGameHooks::functions.erase(hookId); + RegisteredGameHooks::hookData.erase(hookId); + } + HooksToUnregister::hooks.clear(); + + // ID + for (auto& hookId : HooksToUnregister::hooksForID) { + for (auto& idGroup : RegisteredGameHooks::functionsForID) { + for (auto it = idGroup.second.begin(); it != idGroup.second.end();) { + if (it->first == hookId) { + it = idGroup.second.erase(it); + RegisteredGameHooks::hookData.erase(hookId); + } else { + ++it; + } + } + } + } + HooksToUnregister::hooksForID.clear(); + + // Ptr + for (auto& hookId : HooksToUnregister::hooksForPtr) { + for (auto& ptrGroup : RegisteredGameHooks::functionsForPtr) { + for (auto it = ptrGroup.second.begin(); it != ptrGroup.second.end();) { + if (it->first == hookId) { + it = ptrGroup.second.erase(it); + RegisteredGameHooks::hookData.erase(hookId); + } else { + ++it; + } + } + } + } + HooksToUnregister::hooksForPtr.clear(); + + // Filter + for (auto& hookId : HooksToUnregister::hooksForFilter) { + RegisteredGameHooks::functionsForFilter.erase(hookId); + RegisteredGameHooks::hookData.erase(hookId); + } + HooksToUnregister::hooksForFilter.clear(); + } + + void RemoveAllQueuedHooks() { +#define DEFINE_HOOK(name, _) ProcessUnregisteredHooks(); + +#include "GameInteractor_HookTable.h" + +#undef DEFINE_HOOK + } + class HookFilter { - public: + public: static auto ActorNotPlayer(Actor* actor) { return actor->id != ACTOR_PLAYER; } @@ -401,15 +517,11 @@ public: return actor->id != ACTOR_PLAYER; } static auto ActorMatchIdAndParams(int16_t id, int16_t params) { - return [id, params](Actor* actor) { - return actor->id == id && actor->params == params; - }; + return [id, params](Actor* actor) { return actor->id == id && actor->params == params; }; } // For use with Should hooks static auto SActorMatchIdAndParams(int16_t id, int16_t params) { - return [id, params](Actor* actor, bool* result) { - return actor->id == id && actor->params == params; - }; + return [id, params](Actor* actor, bool* result) { return actor->id == id && actor->params == params; }; } }; @@ -430,7 +542,7 @@ public: static bool CanAddOrTakeAmmo(int16_t amount, int16_t item); class RawAction { - public: + public: static void SetSceneFlag(int16_t sceneNum, int16_t flagType, int16_t flag); static void UnsetSceneFlag(int16_t sceneNum, int16_t flagType, int16_t flag); static bool CheckFlag(int16_t flagType, int16_t flag); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index b41030cfa..9c861062b 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -19,6 +19,9 @@ void GameInteractor_ExecuteOnExitGame(int32_t fileNum) { } void GameInteractor_ExecuteOnGameStateMainStart() { + // Cleanup all hooks at the start of each frame + GameInteractor::Instance->RemoveAllQueuedHooks(); + GameInteractor::Instance->ExecuteHooks(); } From 37a2730df241da847279a6fa61e9e51fec10b387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 19 Mar 2025 10:15:43 +0000 Subject: [PATCH 090/267] remove unused 3drando custom message code (#5138) --- .../randomizer/3drando/custom_messages.cpp | 251 +----------------- .../randomizer/3drando/custom_messages.hpp | 39 --- .../Enhancements/randomizer/3drando/fill.cpp | 2 - .../randomizer/3drando/playthrough.cpp | 2 - .../Enhancements/randomizer/randomizer.cpp | 6 +- 5 files changed, 4 insertions(+), 296 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp index 179987dcc..fcab083b4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp @@ -2,258 +2,9 @@ #include "../../custom-message/CustomMessageManager.h" #include "z64item.h" -#include -#include -#include - namespace CustomMessages { - using namespace std::literals::string_literals; -class MessageEntryComp { -public: - bool operator()(const MessageEntry& lhs, const MessageEntry& rhs) const { - return lhs.id < rhs.id; - } -}; - -constexpr std::array EnglishDungeonNames = { - "Deku Tree", - "Dodongo's Cavern", - "Jabu Jabu's Belly", - "Forest Temple", - "Fire Temple", - "Water Temple", - "Spirit Temple", - "Shadow Temple", - "Bottom of the Well", - "Ice Cavern", - "Ganon's Tower", - "Gerudo Training Ground", - "Gerudo Fortress", - "Ganon's Castle", -}; - -constexpr std::array FrenchDungeonNames = { - "Vénérable Arbre Mojo", - "Caverne Dodongo", - "Ventre de Jabu-Jabu", - "Temple de la Forêt", - "Temple du Feu", - "Temple de l'Eau", - "Temple de l'Esprit", - "Temple de l'Ombre", - "Puits", - "Caverne Polaire", - "Tour de Ganon", - "Gymnase Gerudo", - "Repaire des Voleurs", - "Château de Ganon", -}; - -constexpr std::array FrenchDungeonArticles = { - "du ", - "de la ", - "du ", - "du ", - "du ", - "du ", - "du ", - "du ", - "du ", - "de la ", - "", - "du ", - "de la ", - "du ", -}; - -constexpr std::array SpanishDungeonNames = { - "Gran Árbol Deku", - "Cueva de los Dodongos", - "Tripa de Jabu-Jabu", - "Templo del Bosque", - "Templo del Fuego", - "Templo del Agua", - "Templo del Espíritu", - "Templo de las Sombras", - "Fondo del pozo", - "Caverna de hielo", - "Torre de Ganon", - "Centro de Instrucción Gerudo", - "Fortaleza Gerudo", - "Castillo de Ganon", -}; - -constexpr std::array SpanishDungeonArticles = { - "del", - "de la", - "de la", - "del", - "del", - "del", - "del", - "del", - "del", - "de la", - "de la", - "del", - "de la", - "del", -}; - -constexpr std::array DungeonColors = { - QM_GREEN, - QM_RED, - QM_BLUE, - QM_GREEN, - QM_RED, - QM_BLUE, - QM_YELLOW, - QM_PINK, - QM_PINK, - QM_LBLUE, - QM_BLACK, - QM_YELLOW, - QM_YELLOW, - QM_RED, -}; - - std::set messageEntries; - std::stringstream messageData; - - //textBoxType and textBoxPosition are defined here: https://wiki.cloudmodding.com/oot/Text_Format#Message_Id - void CreateMessage(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, - std::string englishText, std::string frenchText, std::string spanishText) { - MessageEntry newEntry = { textId, unk_04, textBoxType, textBoxPosition, { 0 } }; - - while ((englishText.size() % 4) != 0) { - englishText += "\0"s; - } - messageData.seekg(0, messageData.end); - newEntry.info[ENGLISH_U].offset = (char*)((int)messageData.tellg()); - newEntry.info[ENGLISH_U].length = englishText.size(); - messageData << englishText; - - while ((frenchText.size() % 4) != 0) { - frenchText += "\0"s; - } - messageData.seekg(0, messageData.end); - newEntry.info[FRENCH_U].offset = (char*)((int)messageData.tellg()); - newEntry.info[FRENCH_U].length = frenchText.size(); - messageData << frenchText; - - while ((spanishText.size() % 4) != 0) { - spanishText += "\0"s; - } - messageData.seekg(0, messageData.end); - newEntry.info[SPANISH_U].offset = (char*)((int)messageData.tellg()); - newEntry.info[SPANISH_U].length = spanishText.size(); - messageData << spanishText; - - messageEntries.insert(newEntry); - } - - void CreateMessageFromTextObject(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, const Text& text) { - CreateMessage(textId, unk_04, textBoxType, textBoxPosition, text.GetEnglish(), text.GetFrench(), text.GetSpanish()); - } - - Text AddColorsAndFormat(Text text, const std::vector& colors /*= {}*/) { - - //for each language - for (std::string* textStr : {&text.english, &text.french, &text.spanish}) { - - //insert playername - size_t atSymbol = textStr->find('@'); - while (atSymbol != std::string::npos) { - textStr->replace(atSymbol, 1, PLAYER_NAME()); - atSymbol = textStr->find('@'); - } - //insert newlines either manually or when encountering a '&' - constexpr size_t lineLength = 44; - size_t lastNewline = 0; - while (lastNewline + lineLength < textStr->length()) { - size_t carrot = textStr->find('^', lastNewline); - size_t ampersand = textStr->find('&', lastNewline); - size_t lastSpace = textStr->rfind(' ', lastNewline + lineLength); - size_t lastPeriod = textStr->rfind('.', lastNewline + lineLength); - //replace '&' first if it's within the newline range - if (ampersand < lastNewline + lineLength) { - textStr->replace(ampersand, 1, NEWLINE()); - lastNewline = ampersand + NEWLINE().length(); - //or move the lastNewline cursor to the next line if a '^' is encountered - } else if (carrot < lastNewline + lineLength) { - lastNewline = carrot + 1; - //some lines need to be split but don't have spaces, look for periods instead - } else if (lastSpace == std::string::npos) { - textStr->replace(lastPeriod, 1, "."+NEWLINE()); - lastNewline = lastPeriod + NEWLINE().length() + 1; - } else { - textStr->replace(lastSpace, 1, NEWLINE()); - lastNewline = lastSpace + NEWLINE().length(); - } - } - //clean up any remaining '&' characters - size_t ampersand = textStr->find('&'); - while (ampersand != std::string::npos) { - textStr->replace(ampersand, 1, NEWLINE()); - ampersand = textStr->find('&'); - } - - //insert box break - size_t carrotSymbol = textStr->find('^'); - while (carrotSymbol != std::string::npos) { - textStr->replace(carrotSymbol, 1, INSTANT_TEXT_OFF()+WAIT_FOR_INPUT()+INSTANT_TEXT_ON()); - carrotSymbol = textStr->find('^'); - } - - //If there's a two-way choice and only 1 newline before it in the same text box, add another one - size_t choice = textStr->find(TWO_WAY_CHOICE()); - if (choice != std::string::npos) { - size_t newLinesCount = 0; - size_t lastBoxBreak = textStr->rfind(WAIT_FOR_INPUT(), choice); - lastNewline = choice; - - if (lastBoxBreak == std::string::npos) { - lastBoxBreak = 0; - } - - while ((lastNewline != std::string::npos)) { - lastNewline = textStr->rfind(NEWLINE(), lastNewline - 1); - if (lastNewline != std::string::npos && lastNewline > lastBoxBreak) { - newLinesCount++; - } else { - break; - } - } - - if (newLinesCount <= 1) { - textStr->replace(choice, TWO_WAY_CHOICE().length(), NEWLINE()+TWO_WAY_CHOICE()); - } - } - - //add colors - for (auto color : colors) { - size_t firstHashtag = textStr->find('#'); - if (firstHashtag != std::string::npos) { - textStr->replace(firstHashtag, 1, COLOR(color)); - size_t secondHashtag = textStr->find('#'); - if (secondHashtag == std::string::npos) { - //CitraPrint("ERROR: Couldn't find second '#' in " + (*textStr)); - } else { - textStr->replace(secondHashtag, 1, COLOR(QM_WHITE)); - } - } - } - } - return Text{"","",""}+UNSKIPPABLE()+INSTANT_TEXT_ON()+text+INSTANT_TEXT_OFF()+MESSAGE_END(); - } - - void ClearMessages() { - messageEntries.clear(); - messageData.str(""); - } - std::string MESSAGE_END() { return "\x7F\x00"s; } std::string WAIT_FOR_INPUT() { return "\x7F\x01"s; } std::string HORIZONTAL_SPACE(uint8_t x) { @@ -280,7 +31,7 @@ constexpr std::array DungeonColors = { std::string SET_SPEED(uint8_t x) { return "\x7F\x10"s + char(x); } - std::string SKULLTULAS_DESTROYED() { return "\x7F\x15"s; } //RANDOTODO just refernce the versions in CustomMessage + std::string SKULLTULAS_DESTROYED() { return "\x7F\x15"s; } std::string CURRENT_TIME() { return "\x7F\x17"s; } std::string UNSKIPPABLE() { return "\x7F\x19"s; } std::string TWO_WAY_CHOICE() { return "\x1B"s; } diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp index b9d2a08c6..4daacf51a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp @@ -1,50 +1,11 @@ #pragma once #include -#include -#include #include #include "text.hpp" namespace CustomMessages { -typedef struct { - // In the true file format, offset is the offset into the QM file. - // In randomizer, offset will be a pointer to the text in the game's address space. - // Since these pointers will be much larger as u32 than the original script's offsets, - // We will be able to distinguish between original and custom text using their numerical value. - const char* offset; - uint32_t length; -} MessageLanguageInfo; - -typedef enum { - /* 0x00 */ JAPANESE_J, - /* 0x01 */ ENGLISH_U, - /* 0x02 */ ENGLISH_E, - /* 0x03 */ GERMAN_E, - /* 0x04 */ FRENCH_E, - /* 0x05 */ FRENCH_U, - /* 0x06 */ SPANISH_E, - /* 0x07 */ SPANISH_U, - /* 0x08 */ ITALIAN_E, - /* 0x09 */ DUTCH_E, -} MessageLanguage; - -typedef struct { - uint32_t id; - uint32_t unk_04; - uint32_t unk_08; - uint32_t unk_0C; - MessageLanguageInfo info[10]; -} MessageEntry; // size = 0x60 - - void CreateMessage(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, - std::string englishText, std::string frenchText, std::string spanishText); - void CreateMessageFromTextObject(uint32_t textId, uint32_t unk_04, uint32_t textBoxType, uint32_t textBoxPosition, const Text& text); - - Text AddColorsAndFormat(Text text, const std::vector& colors = {}); - void ClearMessages(); - std::string MESSAGE_END(); std::string WAIT_FOR_INPUT(); std::string HORIZONTAL_SPACE(uint8_t x); diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 351c57fd2..b0548f5ee 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -1,6 +1,5 @@ #include "fill.hpp" -#include "custom_messages.hpp" #include "../dungeon.h" #include "../context.h" #include "item_pool.hpp" @@ -19,7 +18,6 @@ #include #include -using namespace CustomMessages; using namespace Rando; diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index 144dee80a..d8fd302c1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -2,7 +2,6 @@ #include #include -#include "custom_messages.hpp" #include "fill.hpp" #include "../location_access.h" #include "random.hpp" @@ -23,7 +22,6 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, auto ctx = Rando::Context::GetInstance(); ctx->overrides.clear(); - CustomMessages::ClearMessages(); ctx->ItemReset(); ctx->HintReset(); ctx->GetLogic()->Reset(); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 1cc7363e8..95710078c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2749,10 +2749,10 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { } template -void CreateGetItemMessages(const std::array* messageEntries) { +void CreateGetItemMessages(const std::array& messageEntries) { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::getItemMessageTableID); - for (const GetItemMessage& messageEntry : *messageEntries) { + for (const GetItemMessage& messageEntry : messageEntries) { customMessageManager->CreateGetItemMessage( Randomizer::getItemMessageTableID, messageEntry.giid, messageEntry.iid, CustomMessage(messageEntry.english, messageEntry.german, messageEntry.french, TEXTBOX_TYPE_BLUE, @@ -3816,7 +3816,7 @@ void Randomizer::CreateCustomMessages() { "You found the %rDeku Nut Bag%w!&You can now hold deku nuts!", "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), }}; - CreateGetItemMessages(&getItemMessages); + CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); CreateTriforcePieceMessages(); CreateNaviRandoMessages(); From dd7dee8f07095d537a1b3717b8d3db688616636c Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:15:55 +0000 Subject: [PATCH 091/267] Fix finite shields getting thier effect applied in SCL (#5130) --- soh/soh/Enhancements/randomizer/logic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 408ded72e..9f127c32f 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1785,7 +1785,7 @@ namespace Rando { case ITEMTYPE_EQUIP: { RandomizerGet itemRG = item.GetRandomizerGet(); - if (itemRG == RG_GIANTS_KNIFE) { + if (itemRG == RG_GIANTS_KNIFE || itemRG == RG_DEKU_SHIELD || itemRG == RG_HYLIAN_SHIELD) { return; } uint32_t equipId = RandoGetToEquipFlag.find(itemRG)->second; From 7a6778c940e6bf148004ddf840202f87e4118200 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:21:39 +0000 Subject: [PATCH 092/267] exclude maps from junk only GI skip (#5140) --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index aa7bf806c..05d06dab2 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -302,9 +302,12 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { ( CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_JUNK && ( + //crude fix to ensure map hints are readable. Ideally replace with better hint tracking. + !(getItemEntry.getItemId >= RG_DEKU_TREE_MAP && getItemEntry.getItemId <= RG_ICE_CAVERN_MAP) && ( getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || - getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER + getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER + ) ) ) ) From d109aa795af2b61c4eb7f0f65871a613a3dee43e Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 12:34:01 +0100 Subject: [PATCH 093/267] Remove Shuffle Pots assert (#5145) * Remove assert * Remove exceptions to the assert --- soh/soh/Enhancements/randomizer/ShufflePots.cpp | 3 --- soh/soh/Enhancements/randomizer/randomizer.cpp | 1 - 2 files changed, 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index be12d086b..cbc96cd1d 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -54,9 +54,6 @@ void ObjTsubo_RandomizerSpawnCollectible(ObjTsubo* potActor, PlayState* play) { void ObjTsubo_RandomizerInit(void* actorRef) { Actor* actor = static_cast(actorRef); - // Check for Lake Hylia specifically because the game spawns 2 pots out of bounds there for some reason. - if (actor->id != ACTOR_OBJ_TSUBO || gPlayState->sceneNum == SCENE_LAKE_HYLIA || gPlayState->sceneNum == SCENE_HYRULE_CASTLE) return; - ObjTsubo* potActor = static_cast(actorRef); potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 95710078c..244afb9c4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1807,7 +1807,6 @@ PotIdentity Randomizer::IdentifyPot(s32 sceneNum, s32 posX, s32 posZ) { if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { LUSLOG_WARN("IdentifyPot did not receive a valid RC value (%d).", location->GetRandomizerCheck()); - assert(false); } else { potIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; potIdentity.randomizerCheck = location->GetRandomizerCheck(); From 04d79222d413bbe989791c2281158a33ff54806c Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 12:34:52 +0100 Subject: [PATCH 094/267] fix crash (#5146) --- soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp index 20beb193a..37fed1b7d 100644 --- a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp +++ b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp @@ -10,6 +10,12 @@ void Custom_EnMThunder_Update(Actor* thisx, PlayState* play) { f32 blueRadius; s32 redGreen; + // If thunder effect doesn't exist (aka player doesn't have magic), + // don't do anything. + if (enMThunder->actionFunc == nullptr) { + return; + } + enMThunder->actionFunc(enMThunder, play); // don't call this part, it's what makes the spin attack darkness happen // func_80A9F314(play, this->unk_1BC); From b7b5949bc4b2097b49667489f3fb43d9f30e5e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 19 Mar 2025 11:42:18 +0000 Subject: [PATCH 095/267] Some location access fixes (#5121) * Some location access fixes Split out a few fixes I've made while working on #5105 * assert false * IC feedback --- .../location_access/dungeons/deku_tree.cpp | 6 +++--- .../location_access/dungeons/dodongos_cavern.cpp | 8 +++++--- .../location_access/dungeons/forest_temple.cpp | 2 +- .../location_access/dungeons/ganons_castle.cpp | 6 +++--- .../dungeons/gerudo_training_ground.cpp | 4 ++-- .../location_access/dungeons/ice_cavern.cpp | 12 ++++++------ .../location_access/dungeons/jabujabus_belly.cpp | 3 +-- .../location_access/dungeons/shadow_temple.cpp | 8 ++++---- soh/soh/Enhancements/randomizer/logic.cpp | 3 +-- soh/soh/Enhancements/randomizer/logic.h | 1 - .../Enhancements/randomizer/randomizer_entrance.c | 4 ++-- 11 files changed, 28 insertions(+), 29 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 2500e4996..4740a7541 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -71,8 +71,8 @@ void RegionTable_Init_DekuTree() { }, { //Locations LOCATION(RC_DEKU_TREE_BASEMENT_CHEST, true), - LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanUseProjectile() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) && logic->CanJumpslashExceptHammer())), + LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), + LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) ? ED_SHORT_JUMPSLASH : ED_BOMB_THROW)), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return true;}), @@ -84,7 +84,7 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_LOWER, []{return true;}), - Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW);});}), + Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanHitEyeTargets();});}), }); areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree Basement Water Room Front", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { 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 bb5e1754f..4ae2e1e70 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -154,6 +154,7 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), }, { //Exits + Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}), Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBreakMudWalls() || (ctx->GetTrickOption(RT_DC_SCRUB_ROOM) && logic->HasItem(RG_GORONS_BRACELET));});}), Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return (logic->IsAdult && ctx->GetTrickOption(RT_DC_JUMP)) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}), @@ -304,6 +305,7 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), }, { //Exits + Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), //This is possible with sticks and shield, igniting a first flower by "touch" then very quickly crouch stabbing in a way that cuts the corner to light the 3rd bomb on the other side, but that's a trick Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));});}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->CanBreakMudWalls();});}), @@ -460,9 +462,9 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), }, { //Exits - Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), - Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), + Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), + Entrance(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), }); areaTable[RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM] = Region("Dodongos Cavern Mad Scrub Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index c9f4ebc23..04efd4994 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -28,7 +28,7 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return true;}), - Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), + Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); areaTable[RR_FOREST_TEMPLE_LOBBY] = Region("Forest Temple Lobby", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index 982ac16fc..c1a846564 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -61,7 +61,7 @@ void RegionTable_Init_GanonsCastle() { EventAccess(&logic->ForestTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE));}), }, { //Locations - LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanDamage()), + LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanKillEnemy(RE_WOLFOS)), LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE))), LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE))), }, {}); @@ -78,7 +78,7 @@ void RegionTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->BlueFireAccess, []{return logic->BlueFireAccess || logic->HasBottle();}), + EventAccess(&logic->BlueFireAccess, []{return true;}), EventAccess(&logic->FairyPot, []{return logic->FairyPot || (logic->BlueFire() && logic->CanKillEnemy(RE_FREEZARD));}), EventAccess(&logic->WaterTrialClear, []{return logic->BlueFire() && logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -112,7 +112,7 @@ void RegionTable_Init_GanonsCastle() { EventAccess(&logic->SpiritTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_MIRROR_SHIELD) || ctx->GetOption(RSK_SUNLIGHT_ARROWS)) && logic->CanUse(RG_BOMBCHU_5) && ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT));}), }, { //Locations - LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanJumpslashExceptHammer()), + LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_BOMBCHU_5))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index f0b9de5c3..0c45d755c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -17,8 +17,8 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_LOBBY] = Region("Gerudo Training Ground Lobby", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, logic->CanHitEyeTargets()), + LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanHitEyeTargets()), LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->CanKillEnemy(RE_BEAMOS) && logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2, true)), LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index ff9b171c8..879ac1dce 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -21,18 +21,18 @@ void RegionTable_Init_IceCavern() { }, { //Exits Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return true;}), - Entrance(RR_ICE_CAVERN_MAIN, []{return Here(RR_ICE_CAVERN_BEGINNING, []{return (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives() || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE);});}), + Entrance(RR_ICE_CAVERN_MAIN, []{return Here(RR_ICE_CAVERN_BEGINNING, []{return logic->CanKillEnemy(RE_FREEZARD, ED_CLOSE, true, 4);});}), }); areaTable[RR_ICE_CAVERN_MAIN] = Region("Ice Cavern", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->BlueFireAccess, []{return logic->BlueFireAccess || (logic->IsAdult && logic->HasBottle());}), + EventAccess(&logic->BlueFireAccess, []{return logic->IsAdult;}), }, { //Locations LOCATION(RC_ICE_CAVERN_MAP_CHEST, logic->BlueFire() && logic->IsAdult), LOCATION(RC_ICE_CAVERN_COMPASS_CHEST, logic->BlueFire()), - LOCATION(RC_ICE_CAVERN_IRON_BOOTS_CHEST, logic->BlueFire() && (logic->CanJumpslash() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->BlueFire() && (logic->CanJumpslash() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE)) && logic->IsAdult), + LOCATION(RC_ICE_CAVERN_IRON_BOOTS_CHEST, logic->BlueFire() && logic->CanKillEnemy(RE_WOLFOS)), + LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->BlueFire() && logic->CanKillEnemy(RE_WOLFOS) && logic->IsAdult), LOCATION(RC_ICE_CAVERN_FREESTANDING_POH, logic->BlueFire()), LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang()), LOCATION(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, logic->BlueFire() && logic->HookshotOrBoomerang()), @@ -125,8 +125,8 @@ void RegionTable_Init_IceCavern() { LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->CanKillEnemy(RE_STALFOS)), }, { //Exits - Entrance(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, []{return logic->BlueFire() && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), - Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanUse(RG_IRON_BOOTS) && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_ICE_CAVERN_MQ_WEST_CORRIDOR, []{return Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), + Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanUse(RG_IRON_BOOTS) && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), }); areaTable[RR_ICE_CAVERN_MQ_COMPASS_ROOM] = Region("Ice Cavern MQ Compass Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index fa9c7b085..7bfb98a87 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -24,7 +24,6 @@ void RegionTable_Init_JabuJabusBelly() { //Combines Lift room middle and lower, 1F holes room, the forked corridor, and it's side rooms areaTable[RR_JABU_JABUS_BELLY_MAIN] = Region("Jabu Jabus Belly Main", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->JabuRutoInB1, []{return true;}), EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations @@ -263,7 +262,7 @@ void RegionTable_Init_JabuJabusBelly() { areaTable[RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS] = Region("Jabu Jabus Belly MQ West Forked Rooms", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->JabuWestTentacle, []{return logic->CanUse(RG_BOOMERANG);}), + EventAccess(&logic->JabuWestTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, Here(RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS, []{return logic->HasExplosives();}) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index bdcf8a4fa..8cf70fc3f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -79,8 +79,8 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_WIND_TUNNEL] = Region("Shadow Temple Wind Tunnel", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, true), - LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanJumpslashExceptHammer()), - LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, true), + LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanKillEnemy(RE_GIBDO, ED_CLOSE, true, 2)), + LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, logic->HasExplosives()), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, logic->CanUse(RG_LONGSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, logic->CanBreakPots()), @@ -96,7 +96,7 @@ void RegionTable_Init_ShadowTemple() { //Locations LOCATION(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanJumpslashExceptHammer()), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanKillEnemy(RE_FLOORMASTER)), //RANDOTODO check if child can reach the token LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->IsAdult && logic->CanAttack()), LOCATION(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, logic->CanBreakPots()), @@ -181,7 +181,7 @@ void RegionTable_Init_ShadowTemple() { //Room exists for if it's ever possible to go backwards or void warp into the middle of shadow areaTable[RR_SHADOW_TEMPLE_MQ_B2_TO_B3_CORRIDOR] = Region("Shadow Temple MQ B2 to B3 Corridor", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits - Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return logic->HasExplosives() && logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}), + Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}), Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), //bunnyhovers + lens lets you go from the very top of upper pit to the stationary invisible platform below quite easily }); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 9f127c32f..62c14e6ff 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -671,7 +671,7 @@ namespace Rando { } return killed; case RE_BIG_OCTO: - //If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room without shenanigains anyway. Bunny makes it free + //If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room without shenanigans anyway. Bunny makes it free return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS) || CanUse(RG_MASTER_SWORD); case RE_GOHMA: return HasBossSoul(RG_GOHMA_SOUL) && CanJumpslash() && @@ -2338,7 +2338,6 @@ namespace Rando { MQSpiritMapRoomEnemies = false; MQSpirit3SunsEnemies = false; Spirit1FSilverRupees = false; - JabuRutoInB1 = false; JabuRutoIn1F = false; StopPerformanceTimer(PT_LOGIC_RESET); diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 4286cc5c3..d8fa9864b 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -175,7 +175,6 @@ class Logic { bool MQSpiritTimeTravelChest = false; bool MQSpirit3SunsEnemies = false; bool Spirit1FSilverRupees = false; - bool JabuRutoInB1 = false; bool JabuRutoIn1F = false; /* --- END OF HELPERS AND LOCATION ACCESS --- */ diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 3ad26b1f6..26592b0ce 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -201,12 +201,12 @@ void Entrance_Init(void) { } // Overwrite grotto related indices - if (originalIndex >= ENTRANCE_GROTTO_EXIT_START) { + if (originalIndex >= ENTRANCE_GROTTO_EXIT_START && originalIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { Grotto_SetExitOverride(originalIndex, overrideIndex); continue; } - if (originalIndex >= ENTRANCE_GROTTO_LOAD_START && originalIndex < ENTRANCE_GROTTO_EXIT_START) { + if (originalIndex >= ENTRANCE_GROTTO_LOAD_START && originalIndex < ENTRANCE_GROTTO_LOAD_START + NUM_GROTTOS) { Grotto_SetLoadOverride(originalIndex, overrideIndex); continue; } From 5517e22f6eadbc6c5973538f8b65a83483a42be7 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 12:42:56 +0100 Subject: [PATCH 096/267] Exclude skip get item animations outside of rando (#5147) --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 05d06dab2..54b658e68 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -297,6 +297,8 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE && // Always show ItemGet animation for ice traps !(getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.getItemId == RG_ICE_TRAP) && + // Always show ItemGet animation outside of randomizer to keep behaviour consistent in vanilla + IS_RANDO && ( CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_ALL || ( From 80850615c3232bcdcafa380d26b6eaa1efba2de8 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 13:49:51 +0100 Subject: [PATCH 097/267] Fix key color issues (#5149) --- soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp | 8 ++++---- soh/soh/Enhancements/randomizer/draw.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index f63c95e30..ac78353ee 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -283,13 +283,13 @@ static std::map cosmeticOptions = { 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.WellSmallEmblem", "Well Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(227, 110, 255, 255), false, true, false), 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.FortSmallEmblem", "Fortress Small Key Emblem",COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 255, 255, 255), false, true, false), 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.GTGSmallEmblem", "GTG Small Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(221, 212, 60, 255), false, true, false), //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.ChestGameEmblem", "Chest Game Key Emblem", COSMETICS_GROUP_SMALL_KEYS, ColorRGBA8(255, 0, 0, 255), false, true, false), 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), diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 0a89e4dae..718d91f0f 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -80,7 +80,7 @@ Color_RGB8 SmallEmblemDefaultValue[10] = { extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry) { - s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 0); + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 1); int slot = getItemEntry->drawItemId - RG_FOREST_TEMPLE_SMALL_KEY; Gfx* customIconDLs[] = { @@ -247,7 +247,7 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt } extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry) { - s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 0); + s8 isCustomKeysEnabled = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("CustomKeyModels"), 1); int slot = getItemEntry->drawItemId - RG_FOREST_TEMPLE_KEY_RING; Gfx* CustomIconDLs[] = { From 7f8e3d43376c0fbf4671ea661171ccc8313685de Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 13:50:04 +0100 Subject: [PATCH 098/267] randomizer enhancement menu improvements (#5148) --- soh/soh/SohGui/SohMenuRandomizer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index a022d6c40..a6649e3ea 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -17,8 +17,11 @@ void SohMenu::AddMenuRandomizer() { .CVar(CVAR_WINDOW("RandomizerSettings")) .WindowName("Randomizer Settings") .Options(WindowButtonOptions().Tooltip("Enables the separate Randomizer Settings Window.")); + + // Enhancements path.sidebarName = "Enhancements"; - AddSidebarEntry("Randomizer", path.sidebarName, 1); + AddSidebarEntry("Randomizer", path.sidebarName, 3); + AddWidget(path, "Randomizer Enhancements", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Rando-Relevant Navi Hints", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi")) .Options(CheckboxOptions().Tooltip( @@ -75,7 +78,9 @@ void SohMenu::AddMenuRandomizer() { AddWidget(path, "Item Scale: %.2f", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale")) .PreFunc([](WidgetInfo& info) { - info.isHidden = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_DISABLED; + info.options->disabled = + !CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED); + info.options->disabledTooltip = "This slider only applies when using the \"Skip Get Item Animations\" option."; }) .Options(FloatSliderOptions() .Min(5.0f) From 17b19ddd73a351229c0c987572f8577fc6657129 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 19 Mar 2025 09:11:56 -0400 Subject: [PATCH 099/267] Remove GBK Triforce Hunt as an option (#5117) Where we were previously checking it, just check the separate triforce hunt option instead. The option under GBK settings was always kind of a dummy option that wasn't meant to actually be selected, and it was set automatically when Triforce Hunt was on. This PR just cuts out the middle man, so to speak. --- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 2 +- .../Enhancements/randomizer/3drando/starting_inventory.cpp | 2 +- soh/soh/Enhancements/randomizer/hint.cpp | 7 ++++--- soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 - soh/soh/Enhancements/randomizer/settings.cpp | 6 +----- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 45e6221ce..5cbfb9a9e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1297,7 +1297,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).Get() >= 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->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/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index c72b5f285..04a7e3040 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -57,7 +57,7 @@ void GenerateStartingInventory() { // Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start. // During save init, the boss key isn't actually given and it's instead given when completing the triforce. if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH) || - ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { + ctx->GetOption(RSK_TRIFORCE_HUNT)) { AddItemToInventory(RG_GANONS_CASTLE_BOSS_KEY); } diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp index 29a9a969f..2648c4623 100644 --- a/soh/soh/Enhancements/randomizer/hint.cpp +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -587,6 +587,10 @@ CustomMessage Hint::GetGanonBossKeyText() { auto ctx = Rando::Context::GetInstance(); CustomMessage ganonBossKeyMessage; + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); + } + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { return StaticData::hintTextTable[RHT_GANON_BK_START_WITH_HINT].GetHintMessage(); } @@ -631,9 +635,6 @@ CustomMessage Hint::GetGanonBossKeyText() { ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_TOKENS_HINT].GetHintMessage(); 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(); - } return ganonBossKeyMessage; } diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index a418627ef..e2581a634 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -5425,7 +5425,6 @@ typedef enum { RO_GANON_BOSS_KEY_LACS_DUNGEONS, RO_GANON_BOSS_KEY_LACS_TOKENS, RO_GANON_BOSS_KEY_KAK_TOKENS, - RO_GANON_BOSS_KEY_TRIFORCE_HUNT, } RandoOptionGanonsBossKey; typedef enum { diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 447da07f9..a2bf3660d 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -237,7 +237,7 @@ void Settings::CreateOptions() { 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_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"}, 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); @@ -1856,10 +1856,6 @@ void Context::FinalizeSettings(const std::set& excludedLocation mOptions[RSK_STARTING_AGE].Set(RO_AGE_CHILD); } - if (mOptions[RSK_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].Set(1); From 7dd3c1b2acba6e9635ba32f06dd3f96d6092259e Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 15:46:02 +0100 Subject: [PATCH 100/267] update model (#5150) --- .../objects/object_keyring/Hilite_new.rgba16 | Bin 0 -> 604 bytes .../gKeyringIconGerudoFortressDL | 9 +- .../gKeyringIconGerudoFortressDL_tri_0 | 315 ++++++------------ .../gKeyringIconGerudoFortressDL_vtx_0 | 281 +++++++--------- .../gKeyringIconGerudoFortressDL_vtx_cull | 10 + ...ortressDL_f3dlite_IconMetal_GerudoFortress | 14 +- .../custom/objects/object_keyring/model.xml | 10 + 7 files changed, 263 insertions(+), 376 deletions(-) create mode 100644 soh/assets/custom/objects/object_keyring/Hilite_new.rgba16 create mode 100644 soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_keyring/model.xml diff --git a/soh/assets/custom/objects/object_keyring/Hilite_new.rgba16 b/soh/assets/custom/objects/object_keyring/Hilite_new.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..5438695faeb81b84633fe3d1358ffa90efbd7578 GIT binary patch literal 604 zcma)2J!^wd6t(>W?N&mjk|8(*ametdVxWslP&yRFCE_3sAxOyZmO?VR6q79yggzXK zg9PdHx+SBV$yRW33LX3dy)QPTv`al)y?DRQIUL7vkM|G#3;2G%#~&;p{r7VTo!8${ z4?W#+90U|Zg}*|%tgD8)(!#$$zTD8lLE-VFlP1g8LBV=dUD~4@<m@pM4xSz z_PqwX?ONMzHjV{cp4b7~pypBkaV;FNSzHo%z-drOpi*wi`mF6*PHRw{?>eR$s0LF3YJF{`L5;zLF1ELK z!(3n+a5nHF=4x;J@~LdxoRB!wP`{tT7eJ3@^u++D)Sckd|wSfR}>F- p6VO!ABn8klIMVgnXu + + + + - - - - - diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 index 791defa81..c7b29e9c7 100644 --- a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_tri_0 @@ -1,213 +1,110 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 index 1dd0cbb61..5ab0f76ec 100644 --- a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_0 @@ -1,233 +1,210 @@ - + - - - - - - - + + + + + + + - + - + - - - + - - - + + + - - - + + + - - - + - - - + + + + + - - - - + + + + - - - + - - - + - - - + + + - - + + - - - - + + - - - - - - + + + + + + + + - - - + + + + - - - - - - - + + + + + - - - - + + + + - - - + + + - - - + - + - - - + + + + + - + + - - - - + + - - - - + + + - - - - - - - + + + + - + - + - - - + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - + + + - - - + - + - + + - - - - - - + + + + - - - - + + + + + - - - - - - - - - - + + - + - + - + - + - + + + - + - + - + - - + + - + diff --git a/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull new file mode 100644 index 000000000..6ef0139b8 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/gKeyringIconGerudoFortressDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + 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 index b5755b4a8..f926de784 100644 --- a/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress +++ b/soh/assets/custom/objects/object_keyring/mat_gKeyringIconGerudoFortressDL_f3dlite_IconMetal_GerudoFortress @@ -1,21 +1,15 @@ + - - - + - - - - - + + - - diff --git a/soh/assets/custom/objects/object_keyring/model.xml b/soh/assets/custom/objects/object_keyring/model.xml new file mode 100644 index 000000000..6ef0139b8 --- /dev/null +++ b/soh/assets/custom/objects/object_keyring/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + From 28944cc68fba230deb08eaab649a54e6e14b37fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 19 Mar 2025 16:30:44 +0000 Subject: [PATCH 101/267] fix some warnings (#5135) * fix some warnings * fix error caught by mac build, fix 3 more warnings * merge fix * feedback * remove color refactor --- soh/soh/Enhancements/controls/InputViewer.cpp | 2 +- .../cosmetics/CosmeticsEditor.cpp | 4 +- soh/soh/Enhancements/debugconsole.cpp | 1 + .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- .../GameInteractor_RawAction.cpp | 2 +- soh/soh/Enhancements/presets.cpp | 2 +- .../Enhancements/randomizer/Plandomizer.cpp | 12 +- soh/soh/Enhancements/randomizer/item.cpp | 2 + soh/soh/Enhancements/randomizer/option.cpp | 2 +- .../randomizer/randomizer_check_tracker.cpp | 8 +- .../randomizer_entrance_tracker.cpp | 3 +- .../randomizer/randomizer_item_tracker.cpp | 80 +++++------ .../Enhancements/timesplits/TimeSplits.cpp | 2 +- soh/soh/SohGui/ResolutionEditor.cpp | 4 +- soh/soh/SohGui/SohMenuNetwork.cpp | 8 +- soh/soh/SohGui/SohMenuSettings.cpp | 8 +- soh/soh/SohGui/UIWidgets.cpp | 90 ++++++------ soh/soh/SohGui/UIWidgets.hpp | 134 +++++++++--------- soh/soh/z_scene_otr.cpp | 4 - 19 files changed, 180 insertions(+), 190 deletions(-) diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index c354e0319..d26de6719 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -564,7 +564,7 @@ void InputViewerSettingsWindow::DrawElement() { ImGui::Unindent(); } - UIWidgets:PaddedSeparator(true, true); + UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Analog Stick")) { diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index ac78353ee..ddd36fa56 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -2045,8 +2045,8 @@ void CosmeticsEditorWindow::DrawElement() { UIWidgets::ComboboxOptions() .DefaultIndex(COLORSCHEME_N64) .Color(THEME_COLOR) - .LabelPosition(UIWidgets::LabelPosition::Near) - .ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right)); UIWidgets::CVarCheckbox("Sync Rainbow colors", CVAR_COSMETIC("RainbowSync"), UIWidgets::CheckboxOptions() .Color(THEME_COLOR)); diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 67547437d..33eed43f9 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -79,6 +79,7 @@ static bool ActorSpawnHandler(std::shared_ptr Console, const std: if (args[8][0] != ',') { spawnPoint.rot.z = std::stoi(args[8]); } + [[fallthrough]]; case 6: if (args[3][0] != ',') { spawnPoint.pos.x = std::stoi(args[3]); diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index dfc4d9681..0e9bbc79a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1550,7 +1550,7 @@ void ResetBaseOptions() { intSliderOptionsBase.Color(THEME_COLOR).Size({320.0f, 0.0f}).Tooltip(""); buttonOptionsBase.Color(THEME_COLOR).Size(Sizes::Inline).Tooltip(""); checkboxOptionsBase.Color(THEME_COLOR).Tooltip(""); - comboboxOptionsBase.Color(THEME_COLOR).ComponentAlignment(ComponentAlignment::Left).LabelPosition(LabelPosition::Near).Tooltip(""); + comboboxOptionsBase.Color(THEME_COLOR).ComponentAlignment(ComponentAlignments::Left).LabelPosition(LabelPositions::Near).Tooltip(""); } void SaveEditorWindow::DrawElement() { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index aa8c72d00..d0b32018a 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -564,7 +564,7 @@ void GameInteractor::RawAction::SetRandomWind(bool active) { void GameInteractor::RawAction::SetPlayerInvincibility(bool active) { Player* player = GET_PLAYER(gPlayState); if (active) { - player->invincibilityTimer = 1000; + player->invincibilityTimer = -20; } else { player->invincibilityTimer = 0; } diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp index 240d0fa81..c8760caca 100644 --- a/soh/soh/Enhancements/presets.cpp +++ b/soh/soh/Enhancements/presets.cpp @@ -50,7 +50,7 @@ void DrawPresetSelector(PresetType presetTypeId) { comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); } - ImGui::Text("Presets", false, true); + ImGui::Text("Presets"); UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##PresetsComboBox", selectedPresetDef.label)) { for ( auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter ) { diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index 4741d9d0c..39b20d876 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.cpp +++ b/soh/soh/Enhancements/randomizer/Plandomizer.cpp @@ -838,8 +838,8 @@ void PlandomizerDrawItemSlots(uint32_t index) { void PlandomizerDrawShopSlider(uint32_t index) { ImGui::PushID(index); UIWidgets::SliderInt("Price:", &plandoLogData[index].shopPrice, UIWidgets::IntSliderOptions() - .Color(THEME_COLOR).Format("%d Rupees").Min(0).Max(999).LabelPosition(UIWidgets::LabelPosition::Near) - .ComponentAlignment(UIWidgets::ComponentAlignment::Right).Size(UIWidgets::Sizes::Inline)); + .Color(THEME_COLOR).Format("%d Rupees").Min(0).Max(999).LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right).Size(UIWidgets::Sizes::Inline)); ImGui::PopID(); } @@ -878,7 +878,7 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { } ImGui::SameLine(); } - if (UIWidgets::InputString("##TrapName", &trapTextInput, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::None))) { + if (UIWidgets::InputString("##TrapName", &trapTextInput, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None))) { plandoLogData[index].iceTrapName = trapTextInput.c_str(); } @@ -933,7 +933,7 @@ void PlandomizerDrawOptions() { PlandomizerPopulateSeedList(); static size_t selectedList = 0; if (existingSeedList.size() != 0) { - UIWidgets::Combobox("##JsonFiles", &selectedList, existingSeedList, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::None)); + UIWidgets::Combobox("##JsonFiles", &selectedList, existingSeedList, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None)); } else { ImGui::Text("No Spoiler Logs found."); @@ -1024,7 +1024,7 @@ void PlandomizerDrawOptions() { } if (getTabID == TAB_LOCATIONS) { if (plandoLogData.size() > 0) { - UIWidgets::Combobox("Filter by Area:##AreaFilter", &selectedArea, rcAreaNameMap, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::Near).ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + UIWidgets::Combobox("Filter by Area:##AreaFilter", &selectedArea, rcAreaNameMap, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::Near).ComponentAlignment(UIWidgets::ComponentAlignments::Right)); ImGui::SameLine(); if (UIWidgets::Button("Empty All Rewards", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { PlandomizerRemoveAllItems(); @@ -1061,7 +1061,7 @@ void PlandomizerDrawHintsWindow() { } ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - 10); - if (UIWidgets::InputString("##HintMessage", &hintInputText, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::None).Tooltip(plandomizerHintsTooltip().c_str()))) { + if (UIWidgets::InputString("##HintMessage", &hintInputText, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None).Tooltip(plandomizerHintsTooltip().c_str()))) { plandoHintData[index].hintText = hintInputText.c_str(); } index++; diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index 6f0309223..1c315b47f 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -94,6 +94,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_DEKU_STICK_BAG; break; } + [[fallthrough]]; case 1: if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { actual = RG_STICK_UPGRADE_INF; @@ -123,6 +124,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_DEKU_NUT_BAG; break; } + [[fallthrough]]; case 1: if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { actual = RG_NUT_UPGRADE_INF; diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index 2c478e34c..64ca107c5 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -232,7 +232,7 @@ bool Option::RenderCombobox() { } UIWidgets::ComboboxOptions widgetOptions = UIWidgets::ComboboxOptions().Color(THEME_COLOR).Tooltip(description.c_str()); if (this->GetKey() == RSK_LOGIC_RULES) { - widgetOptions = widgetOptions.LabelPosition(UIWidgets::LabelPosition::None).ComponentAlignment(UIWidgets::ComponentAlignment::Right); + widgetOptions = widgetOptions.LabelPosition(UIWidgets::LabelPositions::None).ComponentAlignment(UIWidgets::ComponentAlignments::Right); } widgetOptions.disabled = disabled; if(UIWidgets::Combobox(name.c_str(), &selected, options, widgetOptions)) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 6c4177198..c51650bbd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -1772,21 +1772,21 @@ void CheckTrackerSettingsWindow::DrawElement() { ImGui::PopItemWidth(); UIWidgets::CVarCombobox("Window Type", CVAR_TRACKER_CHECK("WindowType"), windowType, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) .Color(THEME_COLOR).DefaultIndex(TRACKER_WINDOW_WINDOW)); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { UIWidgets::CVarCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::CVarCombobox("Display Mode", CVAR_TRACKER_CHECK("DisplayType"), displayType, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) .Color(THEME_COLOR).DefaultIndex(0)); if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { UIWidgets::CVarCombobox("Combo Button 1", CVAR_TRACKER_CHECK("ComboButton1"), buttonStrings, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) .Color(THEME_COLOR).DefaultIndex(TRACKER_COMBO_BUTTON_L)); UIWidgets::CVarCombobox("Combo Button 2", CVAR_TRACKER_CHECK("ComboButton2"), buttonStrings, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPosition::Far).ComponentAlignment(UIWidgets::ComponentAlignment::Right) + UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) .Color(THEME_COLOR).DefaultIndex(TRACKER_COMBO_BUTTON_L)); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index a6e1c6d07..fab17acf1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -674,8 +674,7 @@ void EntranceTrackerSettingsWindow::DrawElement() { ImGui::Text("Sort By"); UIWidgets::CVarRadioButton("To", CVAR_TRACKER_ENTRANCE("SortBy"), 0, UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR) - .Tooltip("Sort entrances by the original source entrance")); + .Color(THEME_COLOR).Tooltip("Sort entrances by the original source entrance")); UIWidgets::CVarRadioButton("From", CVAR_TRACKER_ENTRANCE("SortBy"), 1, UIWidgets::RadioButtonsOptions() .Color(THEME_COLOR).Tooltip("Sort entrances by the overrided destination")); diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 51f161def..92c7491fc 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -1388,8 +1388,8 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::PopItemWidth(); if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, ComboboxOptions() - .DefaultIndex(TRACKER_WINDOW_FLOATING).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(TRACKER_WINDOW_FLOATING).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } @@ -1401,19 +1401,19 @@ void ItemTrackerSettingsWindow::DrawElement() { shouldUpdateVectors = true; } if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, ComboboxOptions() - .DefaultIndex(TRACKER_DISPLAY_ALWAYS).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(TRACKER_DISPLAY_ALWAYS).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, ComboboxOptions() - .DefaultIndex(TRACKER_COMBO_BUTTON_L).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(TRACKER_COMBO_BUTTON_L).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, ComboboxOptions() - .DefaultIndex(TRACKER_COMBO_BUTTON_R).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(TRACKER_COMBO_BUTTON_R).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } @@ -1425,8 +1425,8 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::NewLine(); CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, ComboboxOptions() - .DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY).ComponentAlignment(ComponentAlignment::Left) - .LabelPosition(LabelPosition::Above).Color(THEME_COLOR) + .DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY).ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above).Color(THEME_COLOR) .Tooltip("Customize what the numbers under each item are tracking." "\n\nNote: items without capacity upgrades will track ammo even in capacity mode")); if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { @@ -1436,35 +1436,35 @@ void ItemTrackerSettingsWindow::DrawElement() { } CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, ComboboxOptions() - .DefaultIndex(KEYS_COLLECTED_MAX).ComponentAlignment(ComponentAlignment::Left) - .LabelPosition(LabelPosition::Above).Color(THEME_COLOR) + .DefaultIndex(KEYS_COLLECTED_MAX).ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above).Color(THEME_COLOR) .Tooltip("Customize what numbers are shown for key tracking.")); CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"), itemTrackerTriforcePieceTrackOptions, ComboboxOptions() - .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX).ComponentAlignment(ComponentAlignment::Left) - .LabelPosition(LabelPosition::Above).Color(THEME_COLOR) + .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX).ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above).Color(THEME_COLOR) .Tooltip("Customize what numbers are shown for triforce piece tracking.")); ImGui::TableNextColumn(); if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { @@ -1473,13 +1473,13 @@ void ItemTrackerSettingsWindow::DrawElement() { } } if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) != SECTION_DISPLAY_HIDDEN) { @@ -1493,45 +1493,45 @@ void ItemTrackerSettingsWindow::DrawElement() { } } if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignment::Right) - .LabelPosition(LabelPosition::Far).Color(THEME_COLOR))) { + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } diff --git a/soh/soh/Enhancements/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index a16a98f9e..046536f45 100644 --- a/soh/soh/Enhancements/timesplits/TimeSplits.cpp +++ b/soh/soh/Enhancements/timesplits/TimeSplits.cpp @@ -809,7 +809,7 @@ void TimeSplitsDrawOptionsMenu() { static uint32_t selectedItem = 0; ImGui::Text("Select List to Load: "); ImGui::PushItemWidth(150.0f); - Combobox("", &selectedItem, keys, ComboboxOptions().Color(THEME_COLOR).LabelPosition(LabelPosition::Near)); + Combobox("", &selectedItem, keys, ComboboxOptions().Color(THEME_COLOR).LabelPosition(LabelPositions::Near)); ImGui::PopItemWidth(); ImGui::SameLine(); if (Button("Load List", ButtonOptions().Color(THEME_COLOR).Size(Sizes::Inline))) { diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp index c270444fb..6b287fde5 100644 --- a/soh/soh/SohGui/ResolutionEditor.cpp +++ b/soh/soh/SohGui/ResolutionEditor.cpp @@ -422,10 +422,10 @@ void RegisterResolutionWidgets() { // Declare input interaction bools outside of IF statement to prevent Y field from disappearing. const bool input_X = UIWidgets::SliderFloat("X", &aspectRatioX, UIWidgets::FloatSliderOptions({{ .disabled = disabled_everything }}).Min(0.1f).Max(32.0f).Step(0.001f).Format("%3f") - .Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::Near).ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + .Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::Near).ComponentAlignment(UIWidgets::ComponentAlignments::Right)); const bool input_Y = UIWidgets::SliderFloat("Y", &aspectRatioY, UIWidgets::FloatSliderOptions({{ .disabled = disabled_everything }}).Min(0.1f).Max(24.0f).Step(0.001f).Format("%3f") - .Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPosition::Near).ComponentAlignment(UIWidgets::ComponentAlignment::Right)); + .Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::Near).ComponentAlignment(UIWidgets::ComponentAlignments::Right)); if (input_X || input_Y) { item_aspectRatio = default_aspectRatio; update[UPDATE_aspectRatioX] = true; diff --git a/soh/soh/SohGui/SohMenuNetwork.cpp b/soh/soh/SohGui/SohMenuNetwork.cpp index 29511a9e9..135f7e2be 100644 --- a/soh/soh/SohGui/SohMenuNetwork.cpp +++ b/soh/soh/SohGui/SohMenuNetwork.cpp @@ -42,11 +42,11 @@ void SohMenu::AddMenuNetwork() { .CustomFunction([](WidgetInfo& info) { ImGui::BeginDisabled(Sail::Instance->isEnabled); ImGui::Text("%s", info.name.c_str()); - CVarInputString("##HostSail", CVAR_REMOTE_SAIL("Host"), InputOptions().Color(THEME_COLOR).PlaceholderText("127.0.0.1").DefaultValue("127.0.0.1").Size(ImVec2(ImGui::GetFontSize() * 15, 0)).LabelPosition(LabelPosition::None)); + CVarInputString("##HostSail", CVAR_REMOTE_SAIL("Host"), InputOptions().Color(THEME_COLOR).PlaceholderText("127.0.0.1").DefaultValue("127.0.0.1").Size(ImVec2(ImGui::GetFontSize() * 15, 0)).LabelPosition(LabelPositions::None)); ImGui::SameLine(); ImGui::Text(":"); ImGui::SameLine(); - CVarInputInt("##PortSail", CVAR_REMOTE_SAIL("Port"), InputOptions().Color(THEME_COLOR).PlaceholderText("43384").DefaultValue("43384").Size(ImVec2(ImGui::GetFontSize() * 5, 0)).LabelPosition(LabelPosition::None)); + CVarInputInt("##PortSail", CVAR_REMOTE_SAIL("Port"), InputOptions().Color(THEME_COLOR).PlaceholderText("43384").DefaultValue("43384").Size(ImVec2(ImGui::GetFontSize() * 5, 0)).LabelPosition(LabelPositions::None)); ImGui::EndDisabled(); }); AddWidget(path, "Enable##Sail", WIDGET_BUTTON) @@ -104,11 +104,11 @@ void SohMenu::AddMenuNetwork() { .CustomFunction([](WidgetInfo& info) { ImGui::BeginDisabled(CrowdControl::Instance->isEnabled); ImGui::Text("%s", info.name.c_str()); - CVarInputString("##HostCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Host"), InputOptions().Color(THEME_COLOR).PlaceholderText("127.0.0.1").DefaultValue("127.0.0.1").Size(ImVec2(ImGui::GetFontSize() * 15, 0)).LabelPosition(LabelPosition::None)); + CVarInputString("##HostCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Host"), InputOptions().Color(THEME_COLOR).PlaceholderText("127.0.0.1").DefaultValue("127.0.0.1").Size(ImVec2(ImGui::GetFontSize() * 15, 0)).LabelPosition(LabelPositions::None)); ImGui::SameLine(); ImGui::Text(":"); ImGui::SameLine(); - CVarInputInt("##PortCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Port"), InputOptions().Color(THEME_COLOR).PlaceholderText("43384").DefaultValue("43384").Size(ImVec2(ImGui::GetFontSize() * 5, 0)).LabelPosition(LabelPosition::None)); + CVarInputInt("##PortCrowdControl", CVAR_REMOTE_CROWD_CONTROL("Port"), InputOptions().Color(THEME_COLOR).PlaceholderText("43384").DefaultValue("43384").Size(ImVec2(ImGui::GetFontSize() * 5, 0)).LabelPosition(LabelPositions::None)); ImGui::EndDisabled(); }); AddWidget(path, "Enable##CrowdControl", WIDGET_BUTTON) diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index dc821ecc4..093e98618 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -108,8 +108,8 @@ void SohMenu::AddMenuSettings() { .CVar(CVAR_ENHANCEMENT("BootSequence")) .Options(ComboboxOptions() .DefaultIndex(BOOTSEQUENCE_DEFAULT) - .LabelPosition(LabelPosition::Far) - .ComponentAlignment(ComponentAlignment::Right) + .LabelPosition(LabelPositions::Far) + .ComponentAlignment(ComponentAlignments::Right) .ComboMap(bootSequenceLabels) .Tooltip("Configure what happens when starting or resetting the game.\n\n" "Default: LUS logo -> N64 logo\n" @@ -121,7 +121,7 @@ void SohMenu::AddMenuSettings() { .CVar(CVAR_SETTING("TitleScreenTranslation")); AddWidget(path, "Menu Language", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("Languages")) - .Options(ComboboxOptions().LabelPosition(LabelPosition::Far).ComponentAlignment(ComponentAlignment::Right).ComboMap(languages).DefaultIndex(LANGUAGE_ENG)); + .Options(ComboboxOptions().LabelPosition(LabelPositions::Far).ComponentAlignment(ComponentAlignments::Right).ComboMap(languages).DefaultIndex(LANGUAGE_ENG)); AddWidget(path, "Accessibility", WIDGET_SEPARATOR_TEXT); #if defined(_WIN32) || defined(__APPLE__) AddWidget(path, "Text to Speech", WIDGET_CVAR_CHECKBOX) @@ -136,7 +136,7 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "ImGui Menu Scaling", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("ImGuiScale")) .Options(ComboboxOptions().ComboMap(imguiScaleOptions).Tooltip("Changes the scaling of the ImGui menu elements.").DefaultIndex(1) - .ComponentAlignment(ComponentAlignment::Right).LabelPosition(LabelPosition::Far)) + .ComponentAlignment(ComponentAlignments::Right).LabelPosition(LabelPositions::Far)) .Callback([](WidgetInfo& info) { OTRGlobals::Instance->ScaleImGui(); }); diff --git a/soh/soh/SohGui/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp index 7b6883628..9875cf7b9 100644 --- a/soh/soh/SohGui/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -285,10 +285,10 @@ bool Checkbox(const char* _label, bool* value, const CheckboxOptions& options) { ImGui::BeginDisabled(options.disabled); - bool above = options.labelPosition == LabelPosition::Above; - bool lpFar = options.labelPosition == LabelPosition::Far; - bool right = options.alignment == ComponentAlignment::Right; - bool none = options.labelPosition == LabelPosition::None; + bool above = options.labelPosition == LabelPositions::Above; + bool lpFar = options.labelPosition == LabelPositions::Far; + bool right = options.alignment == ComponentAlignments::Right; + bool none = options.labelPosition == LabelPositions::None; std::string labelStr = (none ? "##" : ""); labelStr.append(_label); @@ -327,12 +327,12 @@ bool Checkbox(const char* _label, bool* value, const CheckboxOptions& options) { PushStyleCheckbox(options.color); ImVec2 checkPos = pos; ImVec2 labelPos = pos; - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition == LabelPositions::Above) { checkPos.y += label_size.y + (style.ItemInnerSpacing.y * 2.0f); } else { labelPos.y += (square_sz / 2) - (label_size.y / 2); } - if (options.alignment == ComponentAlignment::Right) { + if (options.alignment == ComponentAlignments::Right) { checkPos.x = total_bb.Max.x - square_sz; } else { float labelFarOffset = ImGui::GetContentRegionAvail().x - label_size.x; @@ -518,22 +518,22 @@ bool SliderInt(const char* label, int32_t* value, const IntSliderOptions& option ImGui::BeginDisabled(options.disabled); PushStyleSlider(options.color); float width = (options.size == ImVec2(0,0)) ? ImGui::GetContentRegionAvail().x : options.size.x; - if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { + if (options.labelPosition == LabelPositions::Near || options.labelPosition == LabelPositions::Far) { width = width - (ImGui::CalcTextSize(label).x + ImGui::GetStyle().FramePadding.x); } ImGui::AlignTextToFramePadding(); - if (options.alignment == ComponentAlignment::Right) { + if (options.alignment == ComponentAlignments::Right) { ImGui::Text(label, *value); - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); - } else if (options.labelPosition == LabelPosition::Near) { + } else if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); - } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + } else if (options.labelPosition == LabelPositions::Far || options.labelPosition == LabelPositions::None) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); } - } else if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text(label, *value); } } @@ -576,11 +576,11 @@ bool SliderInt(const char* label, int32_t* value, const IntSliderOptions& option } } - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); ImGui::Text(label, *value); - } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + } else if (options.labelPosition == LabelPositions::Far || options.labelPosition == LabelPositions::None) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x); ImGui::Text(label, *value); } @@ -611,33 +611,25 @@ bool CVarSliderInt(const char* label, const char* cvarName, const IntSliderOptio } void ClampFloat(float* value, float min, float max, float step) { - int ticks = 0; - float increment = 1.0f; + int factor = 1; if (step < 1.0f) { - ticks++; - increment = 0.1f; + factor *= 10; } if (step < 0.1f) { - ticks++; - increment = 0.01f; + factor *= 10; } if (step < 0.01f) { - ticks++; - increment = 0.001f; + factor *= 10; } if (step < 0.001f) { - ticks++; - increment = 0.0001f; + factor *= 10; } if (step < 0.0001f) { - ticks++; - increment = 0.00001f; + factor *= 10; } if (step < 0.00001f) { - ticks++; - increment = 0.000001f; + factor *= 10; } - int factor = 1 * std::pow(10, ticks); if (*value < min) { *value = min; } else if (*value > max) { @@ -661,24 +653,24 @@ bool SliderFloat(const char* label, float* value, const FloatSliderOptions& opti PushStyleSlider(options.color); float labelSpacing = ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemSpacing.x; float width = (options.size == ImVec2(0, 0)) ? ImGui::GetContentRegionAvail().x : options.size.x; - if (options.labelPosition == LabelPosition::Near || options.labelPosition == LabelPosition::Far) { + if (options.labelPosition == LabelPositions::Near || options.labelPosition == LabelPositions::Far) { width = width - (ImGui::CalcTextSize(label).x + ImGui::GetStyle().FramePadding.x); } ImGui::AlignTextToFramePadding(); - if (options.alignment == ComponentAlignment::Right) { + if (options.alignment == ComponentAlignments::Right) { ImGui::Text(label, *value); - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); - } else if (options.labelPosition == LabelPosition::Near) { + } else if (options.labelPosition == LabelPositions::Near) { width -= labelSpacing; ImGui::SameLine(); - } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + } else if (options.labelPosition == LabelPositions::Far || options.labelPosition == LabelPositions::None) { width -= labelSpacing; ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); } - } else if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text(label, *value); } } @@ -715,11 +707,11 @@ bool SliderFloat(const char* label, float* value, const FloatSliderOptions& opti } } - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); ImGui::Text(label, *value); - } else if (options.labelPosition == LabelPosition::Far || options.labelPosition == LabelPosition::None) { + } else if (options.labelPosition == LabelPositions::Far || options.labelPosition == LabelPositions::None) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - labelSpacing); ImGui::Text(label, *value); } @@ -765,12 +757,12 @@ bool InputString(const char* label, std::string* value, const InputOptions& opti ImGui::BeginDisabled(options.disabled); PushStyleInput(options.color); float width = (options.size == ImVec2(0, 0)) ? ImGui::GetContentRegionAvail().x : options.size.x; - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text(label, *value->c_str()); } - } else if (options.alignment == ComponentAlignment::Right) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Right) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(width - ImGui::CalcTextSize(label).x); ImGui::Text(label, *value->c_str()); @@ -821,12 +813,12 @@ bool InputInt(const char* label, int32_t* value, const InputOptions& options) { ImGui::BeginDisabled(options.disabled); PushStyleInput(options.color); float width = (options.size == ImVec2(0, 0)) ? ImGui::GetContentRegionAvail().x : options.size.x; - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text(label, *value); } - } else if (options.alignment == ComponentAlignment::Right) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Right) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(width - ImGui::CalcTextSize(label).x); ImGui::Text(label, *value); diff --git a/soh/soh/SohGui/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp index 4e30de6d1..325795023 100644 --- a/soh/soh/SohGui/UIWidgets.hpp +++ b/soh/soh/SohGui/UIWidgets.hpp @@ -105,7 +105,7 @@ namespace UIWidgets { const ImVec2 Fill = ImVec2(-1.0f, 0.0f); } - enum LabelPosition { + enum LabelPositions { Near, Far, Above, @@ -113,7 +113,7 @@ namespace UIWidgets { Within, }; - enum ComponentAlignment { + enum ComponentAlignments { Left, Right, }; @@ -204,19 +204,19 @@ namespace UIWidgets { struct CheckboxOptions : WidgetOptions { bool defaultValue = false; // Only applicable to CVarCheckbox - ComponentAlignment alignment = ComponentAlignment::Left; - LabelPosition labelPosition = LabelPosition::Near; + ComponentAlignments alignment = ComponentAlignments::Left; + LabelPositions labelPosition = LabelPositions::Near; Colors color = Colors::LightBlue; CheckboxOptions& DefaultValue(bool defaultValue_) { defaultValue = defaultValue_; return *this; } - CheckboxOptions& ComponentAlignment(ComponentAlignment alignment_) { + CheckboxOptions& ComponentAlignment(ComponentAlignments alignment_) { alignment = alignment_; return *this; } - CheckboxOptions& LabelPosition(LabelPosition labelPosition_) { + CheckboxOptions& LabelPosition(LabelPositions labelPosition_) { labelPosition = labelPosition_; return *this; } @@ -237,8 +237,8 @@ namespace UIWidgets { struct ComboboxOptions : WidgetOptions { std::unordered_map comboMap = {}; uint32_t defaultIndex = 0; // Only applicable to CVarCombobox - ComponentAlignment alignment = ComponentAlignment::Left; - LabelPosition labelPosition = LabelPosition::Above; + ComponentAlignments alignment = ComponentAlignments::Left; + LabelPositions labelPosition = LabelPositions::Above; ImGuiComboFlags flags = 0; Colors color = Colors::LightBlue; @@ -250,11 +250,11 @@ namespace UIWidgets { defaultIndex = defaultIndex_; return *this; } - ComboboxOptions& ComponentAlignment(ComponentAlignment alignment_) { + ComboboxOptions& ComponentAlignment(ComponentAlignments alignment_) { alignment = alignment_; return *this; } - ComboboxOptions& LabelPosition(LabelPosition labelPosition_) { + ComboboxOptions& LabelPosition(LabelPositions labelPosition_) { labelPosition = labelPosition_; return *this; } @@ -276,8 +276,8 @@ namespace UIWidgets { int32_t max = 10; int32_t defaultValue = 1; bool clamp = true; - ComponentAlignment alignment = ComponentAlignment::Left; - LabelPosition labelPosition = LabelPosition::Above; + ComponentAlignments alignment = ComponentAlignments::Left; + LabelPositions labelPosition = LabelPositions::Above; Colors color = Colors::Gray; ImGuiSliderFlags flags = 0; ImVec2 size = {0,0}; @@ -306,11 +306,11 @@ namespace UIWidgets { defaultValue = defaultValue_; return *this; } - IntSliderOptions& ComponentAlignment(ComponentAlignment alignment_) { + IntSliderOptions& ComponentAlignment(ComponentAlignments alignment_) { alignment = alignment_; return *this; } - IntSliderOptions& LabelPosition(LabelPosition labelPosition_) { + IntSliderOptions& LabelPosition(LabelPositions labelPosition_) { labelPosition = labelPosition_; return *this; } @@ -341,8 +341,8 @@ namespace UIWidgets { float defaultValue = 1.0f; bool clamp = true; bool isPercentage = false; // Multiplies visual value by 100 - ComponentAlignment alignment = ComponentAlignment::Left; - LabelPosition labelPosition = LabelPosition::Above; + ComponentAlignments alignment = ComponentAlignments::Left; + LabelPositions labelPosition = LabelPositions::Above; Colors color = Colors::Gray; ImGuiSliderFlags flags = 0; ImVec2 size = {0,0}; @@ -371,11 +371,11 @@ namespace UIWidgets { defaultValue = defaultValue_; return *this; } - FloatSliderOptions& ComponentAlignment(ComponentAlignment alignment_) { + FloatSliderOptions& ComponentAlignment(ComponentAlignments alignment_) { alignment = alignment_; return *this; } - FloatSliderOptions& LabelPosition(LabelPosition labelPosition_) { + FloatSliderOptions& LabelPosition(LabelPositions labelPosition_) { labelPosition = labelPosition_; return *this; } @@ -423,8 +423,8 @@ namespace UIWidgets { }; struct InputOptions : WidgetOptions { - ComponentAlignment alignment = ComponentAlignment::Left; - LabelPosition labelPosition = LabelPosition::Above; + ComponentAlignments alignment = ComponentAlignments::Left; + LabelPositions labelPosition = LabelPositions::Above; Colors color = Colors::Gray; ImVec2 size = {0,0}; std::string placeholder = ""; @@ -446,7 +446,7 @@ namespace UIWidgets { return *this; } - InputOptions& LabelPosition(LabelPosition labelPosition_) { + InputOptions& LabelPosition(LabelPositions labelPosition_) { labelPosition = labelPosition_; return *this; } @@ -545,20 +545,20 @@ namespace UIWidgets { float comboWidth = CalcComboWidth(longest, options.flags); ImGui::AlignTextToFramePadding(); - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Right) { - ImGui::Text(label); - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Right) { + ImGui::Text("%s", label); + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); - } else if (options.labelPosition == LabelPosition::Near) { + } else if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); } - } else if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { - ImGui::Text(label); + } else if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { + ImGui::Text("%s", label); } } } @@ -578,12 +578,12 @@ namespace UIWidgets { ImGui::EndCombo(); } - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); ImGui::Text("%s", label); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { float width = ImGui::CalcTextSize(comboMap.at(*value)).x + ImGui::GetStyle().FramePadding.x * 2; ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); ImGui::Text("%s", label); @@ -625,19 +625,19 @@ namespace UIWidgets { float comboWidth = CalcComboWidth(longest, options.flags); ImGui::AlignTextToFramePadding(); - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Right) { ImGui::Text("%s", label); - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); - } else if (options.labelPosition == LabelPosition::Near) { + } else if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); } - } else if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text("%s", label); } } @@ -659,12 +659,12 @@ namespace UIWidgets { ImGui::EndCombo(); } - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); ImGui::Text("%s", label); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { float width = ImGui::CalcTextSize(comboVector.at(*value)).x + ImGui::GetStyle().FramePadding.x * 2; ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); ImGui::Text("%s", label); @@ -707,19 +707,19 @@ namespace UIWidgets { float comboWidth = CalcComboWidth(longest, options.flags); ImGui::AlignTextToFramePadding(); - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Right) { ImGui::Text("%s", label); - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); - } else if (options.labelPosition == LabelPosition::Near) { + } else if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); } - } else if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text("%s", label); } } @@ -741,12 +741,12 @@ namespace UIWidgets { ImGui::EndCombo(); } - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); ImGui::Text("%s", label); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { float width = ImGui::CalcTextSize(comboVector.at(*value).c_str()).x + ImGui::GetStyle().FramePadding.x * 2; ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); ImGui::Text("%s", label); @@ -792,19 +792,19 @@ namespace UIWidgets { float comboWidth = CalcComboWidth(longest, options.flags); ImGui::AlignTextToFramePadding(); - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Right) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Right) { ImGui::Text("%s", label); - if (options.labelPosition == LabelPosition::Above) { + if (options.labelPosition == LabelPositions::Above) { ImGui::NewLine(); ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); - } else if (options.labelPosition == LabelPosition::Near) { + } else if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { ImGui::SameLine(ImGui::GetContentRegionAvail().x - comboWidth); } - } else if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Above) { + } else if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Above) { ImGui::Text("%s", label); } } @@ -826,12 +826,12 @@ namespace UIWidgets { ImGui::EndCombo(); } - if (options.labelPosition != LabelPosition::None) { - if (options.alignment == ComponentAlignment::Left) { - if (options.labelPosition == LabelPosition::Near) { + if (options.labelPosition != LabelPositions::None) { + if (options.alignment == ComponentAlignments::Left) { + if (options.labelPosition == LabelPositions::Near) { ImGui::SameLine(); ImGui::Text("%s", label); - } else if (options.labelPosition == LabelPosition::Far) { + } else if (options.labelPosition == LabelPositions::Far) { float width = ImGui::CalcTextSize(comboArray[*value]).x + ImGui::GetStyle().FramePadding.x * 2; ImGui::SameLine(ImGui::GetContentRegionAvail().x - width); ImGui::Text("%s", label); diff --git a/soh/soh/z_scene_otr.cpp b/soh/soh/z_scene_otr.cpp index 022aeee37..f03db52ba 100644 --- a/soh/soh/z_scene_otr.cpp +++ b/soh/soh/z_scene_otr.cpp @@ -150,17 +150,13 @@ bool Scene_CommandObjectList(PlayState* play, SOH::ISceneCommand* cmd) { s32 i; s32 j; s32 k; - ObjectStatus* status; ObjectStatus* status2; - ObjectStatus* firstStatus; // s16* objectEntry = SEGMENTED_TO_VIRTUAL(cmd->objectList.segment); s16* objectEntry = (s16*)cmdObj->GetRawPointer(); void* nextPtr; k = 0; i = play->objectCtx.unk_09; - firstStatus = &play->objectCtx.status[0]; - status = &play->objectCtx.status[i]; // Loop until a mismatch in the object lists // Then clear all object ids past that in the context object list and kill actors for those objects From 70fc060381a0561dde5472becf0c74bdd11128f1 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Wed, 19 Mar 2025 15:03:15 -0400 Subject: [PATCH 102/267] Fix Forest Stage upgrades with Skip Misc Interactions (#5052) * Fix Forest Stage upgrades with Skip Misc Interactions * Explicit upgrade checks --- soh/soh/Enhancements/timesaver_hook_handlers.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index eee2a0e9b..7acf51a6d 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -1106,12 +1106,18 @@ void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) { break; case FLAG_ITEM_GET_INF: switch (flag) { - case ITEMGETINF_OBTAINED_STICK_UPGRADE_FROM_STAGE: - vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_DEKU_STICK_CAPACITY_30).GetGIEntry_Copy(); + case ITEMGETINF_OBTAINED_STICK_UPGRADE_FROM_STAGE: { + RandomizerGet stickUpgrade = + CUR_UPG_VALUE(UPG_STICKS) == 2 ? RG_DEKU_STICK_CAPACITY_30 : RG_DEKU_STICK_CAPACITY_20; + vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(stickUpgrade).GetGIEntry_Copy(); break; - case ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE: - vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(RG_DEKU_NUT_CAPACITY_40).GetGIEntry_Copy(); + } + case ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE: { + RandomizerGet nutUpgrade = + CUR_UPG_VALUE(UPG_NUTS) == 2 ? RG_DEKU_NUT_CAPACITY_40 : RG_DEKU_NUT_CAPACITY_30; + vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(nutUpgrade).GetGIEntry_Copy(); break; + } } break; } From a6ff511af5b2e35660bfef704078ece210bc3f60 Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 19 Mar 2025 16:53:46 -0400 Subject: [PATCH 103/267] Exclude zora sapphire from random enemy size (#5153) --- soh/soh/Enhancements/mods.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index cfcb98fa2..e95c19637 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -810,8 +810,10 @@ void RegisterRandomizedEnemySizes() { Actor* actor = static_cast(refActor); // Exclude wobbly platforms in Jabu because they need to act like platforms. + // Exclude demo effect for Zora sapphire being re-categorized as a "boss". // Exclude Dead Hand hands and Bongo Bongo main body because they make the fights (near) impossible. - uint8_t excludedEnemy = actor->id == ACTOR_EN_BROB || actor->id == ACTOR_EN_DHA || (actor->id == ACTOR_BOSS_SST && actor->params == -1); + uint8_t excludedEnemy = actor->id == ACTOR_EN_BROB || actor->id == ACTOR_EN_DHA || + actor->id == ACTOR_DEMO_EFFECT || (actor->id == ACTOR_BOSS_SST && actor->params == -1); // Dodongo, Volvagia and Dead Hand are always smaller because they're impossible when bigger. uint8_t smallOnlyEnemy = actor->id == ACTOR_BOSS_DODONGO || actor->id == ACTOR_BOSS_FD || From 79b53e5920cd6b34d80746c619005e586347c243 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Wed, 19 Mar 2025 23:52:16 +0100 Subject: [PATCH 104/267] Change `Compass Colors Match Dungeon` to `Map & Compass Colors Match Dungeon` (#5042) * Colored maps & compasses with shipinit * Update SohMenuBar.cpp * Post-merge fixes * Whoops --- .../game-interactor/GameInteractor.h | 2 +- .../game-interactor/GameInteractor_Hooks.h | 1 + .../vanilla-behavior/GIVanillaBehavior.h | 37 +++++++++------- soh/soh/Enhancements/mods.cpp | 22 ---------- soh/soh/Enhancements/mods.h | 3 +- .../randomizer/ColoredMapsAndCompasses.cpp | 43 +++++++++++++++++++ soh/soh/Enhancements/randomizer/draw.cpp | 39 ++++++++++++----- soh/soh/Enhancements/randomizer/draw.h | 1 + soh/soh/Enhancements/randomizer/item_list.cpp | 10 +++++ soh/soh/SohGui/SohMenuRandomizer.cpp | 14 +++--- 10 files changed, 115 insertions(+), 57 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 4d8e6dcb4..db68ad86a 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -4,8 +4,8 @@ #define GameInteractor_h #include "libultraship/libultraship.h" -#include "GameInteractionEffect.h" #include "vanilla-behavior/GIVanillaBehavior.h" +#include "GameInteractionEffect.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" #include diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index f1b918cef..d20864012 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -1,5 +1,6 @@ #pragma once +#include "vanilla-behavior/GIVanillaBehavior.h" #include "GameInteractor.h" #include diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index a95dabb00..3b3ad4cb4 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1,3 +1,8 @@ +#pragma once + +#ifndef GI_VANILLA_BEHAVIOR_H +#define GI_VANILLA_BEHAVIOR_H + typedef enum { // #### `result` // ```c @@ -95,10 +100,10 @@ typedef enum { // #### `args` // - `*BgDyYoseizo` VB_BE_ELIGIBLE_FOR_GREAT_FAIRY_REWARD, - + // #### `result` // ```c - // CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && + // CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && // CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && // LINK_IS_ADULT && // !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && @@ -118,11 +123,11 @@ typedef enum { // #### `result` // ```c - // (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE) && + // (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE) && // LINK_IS_ADULT && - // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && // Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) && - // Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP) && // !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) // ``` // #### `args` @@ -473,7 +478,7 @@ typedef enum { // and // ```c // EnGe2_CheckCarpentersFreed() - // ``` + // ``` // #### `args` // - None VB_GERUDOS_BE_FRIENDLY, @@ -1268,7 +1273,7 @@ typedef enum { // #### `result` // Close enough & various cutscene checks // ```c - // (func_80AEC5FC(this, play)) && (!Play_InCsMode(play)) && + // (func_80AEC5FC(this, play)) && (!Play_InCsMode(play)) && // (!(player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER))) && // (player->actor.bgCheckFlags & 1) // ``` @@ -1697,25 +1702,25 @@ typedef enum { // #### `args` // ##### In `z_boss_dodongo.c`: // - `*BossDodongo` - // + // // ##### In `z_boss_fd2.c` // - `*BossFd2` - // + // // ##### In `z_boss_ganondrof.c`: // - `*BossGanondrof` - // + // // ##### In `z_boss_goma.c`: // - `*BossGoma` - // + // // ##### In `z_boss_mo.c`: // - `*BossMo` - // + // // ##### In `z_boss_sst.c`: // - `*BossSst` - // + // // ##### In `z_boss_tw.c`: // - `*BossTw` - // + // // ##### In `z_boss_va.c`: // - `*BossVa` VB_SPAWN_BLUE_WARP, @@ -1860,7 +1865,7 @@ typedef enum { // #### `args` // - `*EnMk` VB_USE_EYEDROP_DIALOGUE, - + // #### `result` // ```c // true @@ -1869,3 +1874,5 @@ typedef enum { // - `*EnWonderTalk2` VB_WONDER_TALK, } GIVanillaBehavior; + +#endif diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index e95c19637..38de50575 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -16,7 +16,6 @@ #include "soh/Enhancements/timesaver_hook_handlers.h" #include "soh/Enhancements/TimeSavers/TimeSavers.h" #include "soh/Enhancements/randomizer/hook_handlers.h" -#include "objects/object_gi_compass/object_gi_compass.h" #include "src/overlays/actors/ovl_En_Bb/z_en_bb.h" #include "src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h" @@ -1000,26 +999,6 @@ void RegisterPauseMenuHooks() { }); } -extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); - -void PatchCompasses() { - s8 compassesCanBeOutsideDungeon = IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); - s8 isColoredCompassesEnabled = compassesCanBeOutsideDungeon && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MatchCompassColors"), 1); - if (isColoredCompassesEnabled) { - ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_PrimColor", 5, gsDPNoOp()); - ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_EnvColor", 6, gsDPNoOp()); - } else { - ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_PrimColor"); - ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_EnvColor"); - } -} - -void RegisterRandomizerCompasses() { - GameInteractor::Instance->RegisterGameHook([](int32_t _unused) { - PatchCompasses(); - }); -} - void RegisterCustomSkeletons() { static int8_t previousTunic = -1; @@ -1067,7 +1046,6 @@ void InitMods() { RegisterRandomizedEnemySizes(); RegisterOpenAllHours(); RegisterToTMedallions(); - RegisterRandomizerCompasses(); NameTag_RegisterHooks(); RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); diff --git a/soh/soh/Enhancements/mods.h b/soh/soh/Enhancements/mods.h index 930522250..8ada99f1e 100644 --- a/soh/soh/Enhancements/mods.h +++ b/soh/soh/Enhancements/mods.h @@ -11,12 +11,11 @@ void UpdateDirtPathFixState(int32_t sceneNum); void UpdateMirrorModeState(int32_t sceneNum); void UpdateHurtContainerModeState(bool newState); void PatchToTMedallions(); -void PatchCompasses(); void UpdatePermanentHeartLossState(); void UpdateHyperEnemiesState(); void UpdateHyperBossesState(); void InitMods(); -void UpdatePatchHand(); +void UpdatePatchHand(); void SwitchAge(); #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp new file mode 100644 index 000000000..fcfa13d97 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp @@ -0,0 +1,43 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ResourceManagerHelpers.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" +#include "objects/object_gi_compass/object_gi_compass.h" +#include "objects/object_gi_map/object_gi_map.h" + +extern "C" { + extern SaveContext gSaveContext; + #include "variables.h" + #include "macros.h" + u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); +} + +#define CVAR_COLORED_MAPS_AND_COMPASSES_NAME CVAR_RANDOMIZER_ENHANCEMENT("ColoredMapsAndCompasses") +#define CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT 1 +#define CVAR_COLORED_MAPS_AND_COMPASSES_VALUE CVarGetInteger(CVAR_COLORED_MAPS_AND_COMPASSES_NAME, CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT) + +void OnLoadFileColoredMapsAndCompasses(int32_t _) { + s8 mapsAndCompassesCanBeOutsideDungeon = IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); + s8 isColoredMapsAndCompassesEnabled = mapsAndCompassesCanBeOutsideDungeon && CVAR_COLORED_MAPS_AND_COMPASSES_VALUE; + if (isColoredMapsAndCompassesEnabled) { + ResourceMgr_PatchGfxByName(gGiDungeonMapDL, "Map_PrimColor", 5, gsDPNoOp()); + ResourceMgr_PatchGfxByName(gGiDungeonMapDL, "Map_EnvColor", 6, gsDPNoOp()); + ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_PrimColor", 5, gsDPNoOp()); + ResourceMgr_PatchGfxByName(gGiCompassDL, "Compass_EnvColor", 6, gsDPNoOp()); + } else { + ResourceMgr_UnpatchGfxByName(gGiDungeonMapDL, "Map_PrimColor"); + ResourceMgr_UnpatchGfxByName(gGiDungeonMapDL, "Map_EnvColor"); + ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_PrimColor"); + ResourceMgr_UnpatchGfxByName(gGiCompassDL, "Compass_EnvColor"); + } +} + +void RegisterColoredMapsAndCompasses() { + COND_HOOK(OnLoadFile, CVAR_COLORED_MAPS_AND_COMPASSES_VALUE, OnLoadFileColoredMapsAndCompasses) + + //Also need to call it directly to patch/unpatch on cvar change + OnLoadFileColoredMapsAndCompasses(0); +} + +static RegisterShipInitFunc initFunc(RegisterColoredMapsAndCompasses, { CVAR_COLORED_MAPS_AND_COMPASSES_NAME }); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 718d91f0f..73b4142de 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -11,6 +11,7 @@ #include "objects/object_gi_key/object_gi_key.h" #include "objects/object_gi_bosskey/object_gi_bosskey.h" #include "objects/object_gi_compass/object_gi_compass.h" +#include "objects/object_gi_map/object_gi_map.h" #include "objects/object_gi_hearts/object_gi_hearts.h" #include "objects/object_gi_scale/object_gi_scale.h" #include "objects/object_gi_fire/object_gi_fire.h" @@ -131,15 +132,35 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn CLOSE_DISPS(play->state.gfxCtx); } -extern "C" { - void GetItem_DrawCompass(PlayState* play, s16 drawId); - void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); - void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); +extern "C" void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry) { + s16 color_slot = getItemEntry->drawItemId - RG_DEKU_TREE_MAP; + s16 colors[12][3] = { + { 4, 100, 46 }, // Deku Tree + { 140, 30, 30 }, // Dodongo's Cavern + { 30, 60, 255 }, // Jabu Jabu's Belly + { 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 + { 0, 255, 255 }, // Ice Cavern + }; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiDungeonMapDL); + + CLOSE_DISPS(play->state.gfxCtx); } extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEntry) { - - s16 color_slot = getItemEntry->getItemId - RG_DEKU_TREE_COMPASS; + s16 color_slot = getItemEntry->drawItemId - RG_DEKU_TREE_COMPASS; s16 colors[12][3] = { { 4, 100, 46 }, // Deku Tree { 140, 30, 30 }, // Dodongo's Cavern @@ -158,8 +179,7 @@ extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEnt OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); gDPSetEnvColor(POLY_OPA_DISP++, colors[color_slot][0] / 2, colors[color_slot][1] / 2, colors[color_slot][2] / 2, 255); @@ -167,8 +187,7 @@ extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEnt gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiCompassDL); POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, 5); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiCompassGlassDL); CLOSE_DISPS(play->state.gfxCtx); diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 3fc5c86b4..aaac71e06 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -10,6 +10,7 @@ typedef struct PlayState PlayState; extern "C" { #endif void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEntry); diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index c31a1c4a6..45516ef18 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -98,15 +98,25 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_PRELUDE_OF_LIGHT] = Item(RG_PRELUDE_OF_LIGHT, Text{ "Prelude of Light", "Prélude de la Lumière", "Kantate des Lichts" }, ITEMTYPE_SONG, 0xC0, true, LOGIC_PRELUDE_OF_LIGHT, RHT_PRELUDE_OF_LIGHT, ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); // Maps and Compasses itemTable[RG_DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{ "Great Deku Tree Map", "Carte de l'Arbre Mojo", "Karte des Deku-Baums" }, ITEMTYPE_MAP, 0xA5, false, LOGIC_MAP_DEKU_TREE, RHT_DEKU_TREE_MAP, RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_TREE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{ "Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Karte der Dodongo-Höhle" }, ITEMTYPE_MAP, 0xA6, false, LOGIC_MAP_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{ "Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Karte des Jabu-Jabu-Bauchs" }, ITEMTYPE_MAP, 0xA7, false, LOGIC_MAP_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{ "Forest Temple Map", "Carte du Temple de la Forêt", "Karte des Waldtempels" }, ITEMTYPE_MAP, 0xA8, false, LOGIC_MAP_FOREST_TEMPLE, RHT_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{ "Fire Temple Map", "Carte due Temple de Feu", "Karte des Feuertempels" }, ITEMTYPE_MAP, 0xA9, false, LOGIC_MAP_FIRE_TEMPLE, RHT_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{ "Water Temple Map", "Carte du Temple de l'Eau", "Karte des Wassertempels" }, ITEMTYPE_MAP, 0xAA, false, LOGIC_MAP_WATER_TEMPLE, RHT_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{ "Spirit Temple Map", "Carte due Temple de l'Esprit", "Karte des Geistertempels" }, ITEMTYPE_MAP, 0xAB, false, LOGIC_MAP_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{ "Shadow Temple Map", "Carte du Temple de l'Ombre", "Karte des Schattentempels" }, ITEMTYPE_MAP, 0xAC, false, LOGIC_MAP_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{ "Bottom of the Well Map", "Carte du Puits", "Karte des Grund des Brunnens" }, ITEMTYPE_MAP, 0xAD, false, LOGIC_MAP_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{ "Ice Cavern Map", "Carte de la Caverne Polaire", "Karte der Eishöhle" }, ITEMTYPE_MAP, 0xAE, false, LOGIC_MAP_ICE_CAVERN, RHT_ICE_CAVERN_MAP, RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_MAP].SetCustomDrawFunc(Randomizer_DrawMap); itemTable[RG_DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{ "Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Kompaß des Deku-Baums" }, ITEMTYPE_COMPASS, 0x9B, false, LOGIC_COMPASS_DEKU_TREE, RHT_DEKU_TREE_COMPASS, RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DEKU_TREE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); itemTable[RG_DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{ "Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Kompaß der Dodongo-Höhle" }, ITEMTYPE_COMPASS, 0x9C, false, LOGIC_COMPASS_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_COMPASS, RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index a6649e3ea..0d3b52b23 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -37,21 +37,21 @@ void SohMenu::AddMenuRandomizer() { .Options(CheckboxOptions().Tooltip( "Use Custom graphics for Dungeon Keys, Big and Small, so that they can be easily told apart." ).DefaultValue(true)); - AddWidget(path, "Compass Colors Match Dungeon", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_RANDOMIZER_ENHANCEMENT("MatchCompassColors")) + AddWidget(path, "Map & Compass Colors Match Dungeon", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_RANDOMIZER_ENHANCEMENT("ColoredMapsAndCompasses")) .PreFunc([](WidgetInfo& info) { info.options->disabled = !( OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_STARTWITH) && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_VANILLA) && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) ); - info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without " - "the compass shuffle settings set to Any Dungeon, Overworld, or Anywhere."; + info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without the map & compass\n" + "shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\""; }) .Options(CheckboxOptions().Tooltip( - "Matches the color of compasses to the dungeon they belong to. " - "This helps identify compasses from afar and adds a little bit of flair.\n\nThis only " - "applies to seeds with compasses shuffled to \"Any Dungeon\", \"Overworld\", or \"Anywhere\"." + "Matches the color of maps & compasses to the dungeon they belong to. " + "This helps identify maps & compasses from afar and adds a little bit of flair.\n\nThis only " + "applies to seeds with maps & compasses shuffled to \"Any Dungeon\", \"Overworld\", or \"Anywhere\"." ).DefaultValue(true)); AddWidget(path, "Quest Item Fanfares", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_RANDOMIZER_ENHANCEMENT("QuestItemFanfares")) From 4243eb67ae6152c0760209a0d29b488cbe47d92d Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 19 Mar 2025 23:52:33 +0100 Subject: [PATCH 105/267] Exclude nabooru from boss souls (#5152) --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 54b658e68..a4db9f428 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -2035,11 +2035,13 @@ void RandomizerOnActorInitHandler(void* actorRef) { break; } - //Deletes all actors in the boss category if the soul isn't found. - //Some actors, like Dark Link, Arwings, and Zora's Sapphire...?, are in this category despite not being actual bosses, - //so ignore any "boss" if `currentBossSoulRandInf` doesn't change from RAND_INF_MAX. + // Deletes all actors in the boss category if the soul isn't found. + // Some actors, like Dark Link, Arwings, and Zora's Sapphire...?, are in this category despite not being actual bosses, + // so ignore any "boss" if `currentBossSoulRandInf` doesn't change from RAND_INF_MAX. + // Iron Knuckle (Nabooru) in Twinrova's room is a special exception, so exclude knuckles too. if (currentBossSoulRandInf != RAND_INF_MAX) { - if (!Flags_GetRandomizerInf(currentBossSoulRandInf) && actor->category == ACTORCAT_BOSS) { + if (!Flags_GetRandomizerInf(currentBossSoulRandInf) && actor->category == ACTORCAT_BOSS && + actor->id != ACTOR_EN_IK) { Actor_Delete(&gPlayState->actorCtx, actor, gPlayState); } //Special case for Phantom Ganon's horse (and fake), as they're considered "background actors", From 6ad503e1d2171e8e102d77eff6dbd70bd52f970a Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 19 Mar 2025 15:57:08 -0700 Subject: [PATCH 106/267] Adds a modal registration for pressing F1 and confirming Quit from the menu button. (#5154) Fixes near shortcuts gossip stone name to include "grotto" to signify it's in the grotto. --- .../Enhancements/randomizer/location_list.cpp | 2 +- soh/soh/OTRGlobals.cpp | 5 +++++ soh/soh/SohGui/Menu.cpp | 20 ++++++++++++++----- soh/soh/SohGui/Menu.h | 1 + 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index d828bad47..116b7d709 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -992,7 +992,7 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22947, "Open Grotto Gossip Stone"); locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, -22984, "Open Grotto Gossip Stone"); locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, -22985, "Open Grotto Gossip Stone"); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, "Near Shortcuts Gossip Stone"); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, "Near Shortcuts Grotto Gossip Stone"); locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, -23255, "Storms Grotto Gossip Stone"); locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, -23802, "Upper Grotto Gossip Stone"); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index ed5a1169d..5d2310e1b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1293,6 +1293,11 @@ extern "C" void Graph_StartFrame() { OTRGlobals::Instance->context->GetWindow()->SetLastScancode(-1); switch (dwScancode) { + case KbScancode::LUS_KB_F1: { + std::shared_ptr modal = static_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Modal Window")); + modal->RegisterPopup("Menu Moved", "The menubar, accessed by hitting F1, no longer exists.\nThe new menu can be accessed by hitting the Esc button instead.", "OK"); + break; + } case KbScancode::LUS_KB_F5: { if (CVarGetInteger(CVAR_CHEAT("SaveStatesEnabled"), 0) == 0) { Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGameOverlay()-> diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index dc7970bc1..0e8f8ab51 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -4,6 +4,7 @@ #include "soh/Enhancements/controls/SohInputEditorWindow.h" #include "window/gui/GuiMenuBar.h" #include "window/gui/GuiElement.h" +#include "SohModals.h" #include #include #include "variables.h" @@ -19,7 +20,9 @@ std::vector windowTypeSizes = { {} }; extern std::unordered_map warpPointSceneList; extern void Warp(); -namespace SohGui {} +namespace SohGui { +extern std::shared_ptr mModalWindow; +} namespace Ship { std::string disabledTempTooltip; @@ -104,6 +107,10 @@ void Menu::UpdateWindowBackendObjects() { } } +bool Menu::IsMenuPopped() { + return popped; +} + UIWidgets::Colors Menu::GetMenuThemeColor() { return menuThemeIndex; } @@ -650,10 +657,13 @@ void Menu::DrawElement() { options3.size = UIWidgets::Sizes::Inline; options3.tooltip = "Quit SoH"; if (UIWidgets::Button(ICON_FA_POWER_OFF, options3)) { - if (!popped) { - ToggleVisibility(); - } - Ship::Context::GetInstance()->GetWindow()->Close(); + SohGui::mModalWindow->RegisterPopup("Quit SoH", "Are you sure you want to quit SoH?", "Quit", "Cancel", []() { + std::shared_ptr menu = static_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetMenu()); + if (!menu->IsMenuPopped()) { + menu->ToggleVisibility(); + } + Ship::Context::GetInstance()->GetWindow()->Close(); + }, nullptr); } ImGui::PopStyleVar(); ImGui::SameLine(); diff --git a/soh/soh/SohGui/Menu.h b/soh/soh/SohGui/Menu.h index d7007bb1e..139f90030 100644 --- a/soh/soh/SohGui/Menu.h +++ b/soh/soh/SohGui/Menu.h @@ -21,6 +21,7 @@ class Menu : public GuiWindow { void InsertSidebarSearch(); void RemoveSidebarSearch(); void UpdateWindowBackendObjects(); + bool IsMenuPopped(); UIWidgets::Colors GetMenuThemeColor(); void MenuDrawItem(WidgetInfo& widget, uint32_t width, UIWidgets::Colors menuThemeIndex); From 818c7e463394f86021ce0ae292818cff2b582ee7 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Wed, 19 Mar 2025 19:03:59 -0400 Subject: [PATCH 107/267] Skip carpenter dialogue before Gerudo mini-boss (#5057) * Skip carpenter dialogue before Gerudo mini-boss * Apparently I'd forgotten the include * IS_RANDO default --- soh/soh/Enhancements/timesaver_hook_handlers.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 7acf51a6d..5aedb90ec 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -23,6 +23,7 @@ extern "C" { #include "src/overlays/actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.h" #include "src/overlays/actors/ovl_En_Tk/z_en_tk.h" #include "src/overlays/actors/ovl_En_Fu/z_en_fu.h" +#include "src/overlays/actors/ovl_En_Daiku/z_en_daiku.h" #include "src/overlays/actors/ovl_Bg_Spot02_Objects/z_bg_spot02_objects.h" #include "src/overlays/actors/ovl_Bg_Spot03_Taki/z_bg_spot03_taki.h" #include "src/overlays/actors/ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.h" @@ -354,6 +355,18 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li !(gPlayState->sceneNum == SCENE_ZORAS_RIVER && IS_RANDO && RAND_GET_OPTION(RSK_FROGS_HINT))) { *should = false; } + + // If it's near a jailed carpenter, skip it along with introduction of Gerudo mini-boss + if (gPlayState->sceneNum == SCENE_THIEVES_HIDEOUT && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO)) { + EnWonderTalk2* enWonderTalk = va_arg(args, EnWonderTalk2*); + EnDaiku* enDaiku = + (EnDaiku*)Actor_FindNearby(gPlayState, &enWonderTalk->actor, ACTOR_EN_DAIKU, ACTORCAT_NPC, 999.0f); + if (enDaiku != NULL) { + Flags_SetSwitch(gPlayState, enDaiku->startFightSwitchFlag); + *should = false; + } + } break; } case VB_NAVI_TALK: { From 224c810e39fb6a77b727867db51e74ec540b350c Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Wed, 19 Mar 2025 19:05:20 -0400 Subject: [PATCH 108/267] Link can move around while carpenters escape (#5055) --- .../vanilla-behavior/GIVanillaBehavior.h | 8 ++++++++ soh/soh/Enhancements/timesaver_hook_handlers.cpp | 13 +++++++++++++ soh/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c | 14 ++++++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 3b3ad4cb4..c8a0f747c 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1270,6 +1270,14 @@ typedef enum { // - None VB_PLAY_BOLERO_OF_FIRE_CS, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnDaiku` + VB_PLAY_CARPENTER_FREE_CS, + // #### `result` // Close enough & various cutscene checks // ```c diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 5aedb90ec..a46ebb814 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -43,6 +43,8 @@ extern void BgSpot03Taki_ApplyOpeningAlpha(BgSpot03Taki* bgSpot03Taki, s32 buffe extern void EnGo2_CurledUp(EnGo2* enGo2, PlayState* play); extern void EnRu2_SetEncounterSwitchFlag(EnRu2* enRu2, PlayState* play); + +extern void EnDaiku_EscapeSuccess(EnDaiku* enDaiku, PlayState* play); } #define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() @@ -564,6 +566,17 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } break; } + case VB_PLAY_CARPENTER_FREE_CS: { + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) { + EnDaiku* enDaiku = va_arg(args, EnDaiku*); + if (enDaiku->subCamActive) { + enDaiku->subCamActive = false; + EnDaiku_EscapeSuccess(enDaiku, gPlayState); + } + *should = false; + } + break; + } case VB_PLAY_GORON_FREE_CS: { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { *should = false; 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 15c1950aa..d40d25499 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 @@ -451,6 +451,10 @@ void EnDaiku_InitSubCamera(EnDaiku* this, PlayState* play) { this->subCamActive = true; this->escapeSubCamTimer = sEscapeSubCamParams[this->actor.params & 3].maxFramesActive; + if (!GameInteractor_Should(VB_PLAY_CARPENTER_FREE_CS, true, this)) { + return; + } + eyePosDeltaLocal.x = sEscapeSubCamParams[this->actor.params & 3].eyePosDeltaLocal.x; eyePosDeltaLocal.y = sEscapeSubCamParams[this->actor.params & 3].eyePosDeltaLocal.y; eyePosDeltaLocal.z = sEscapeSubCamParams[this->actor.params & 3].eyePosDeltaLocal.z; @@ -477,6 +481,10 @@ void EnDaiku_InitSubCamera(EnDaiku* this, PlayState* play) { void EnDaiku_UpdateSubCamera(EnDaiku* this, PlayState* play) { s32 pad; + if (!GameInteractor_Should(VB_PLAY_CARPENTER_FREE_CS, true, this)) { + return; + } + this->subCamAtTarget.x = this->actor.world.pos.x; this->subCamAtTarget.y = this->actor.world.pos.y + 60.0f; this->subCamAtTarget.z = this->actor.world.pos.z; @@ -493,8 +501,10 @@ void EnDaiku_EscapeSuccess(EnDaiku* this, PlayState* play) { Actor* gerudoGuard; Vec3f vec; - Play_ClearCamera(play, this->subCamId); - Play_ChangeCameraStatus(play, MAIN_CAM, CAM_STAT_ACTIVE); + if (GameInteractor_Should(VB_PLAY_CARPENTER_FREE_CS, true, this)) { + Play_ClearCamera(play, this->subCamId); + Play_ChangeCameraStatus(play, MAIN_CAM, CAM_STAT_ACTIVE); + } this->subCamActive = false; if (GET_EVENTCHKINF_CARPENTERS_FREE_ALL()) { From 723375a34450087729de4f7bdd8d31f56feb55ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 20 Mar 2025 02:19:19 +0000 Subject: [PATCH 109/267] fix type signature of Randomizer_DrawMysteryItem (#5156) --- soh/soh/Enhancements/randomizer/3drando/shops.cpp | 3 +++ soh/soh/Enhancements/randomizer/draw.cpp | 2 +- soh/soh/Enhancements/randomizer/draw.h | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index edaf8aa5d..75120fa41 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -275,6 +275,9 @@ int GetShopsanityReplaceAmount() { return 7; } else if (ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_EIGHT_ITEMS)) { return 8; //temporarily unreachable due to logic limitations + } else { + assert(false); + return 0; } } else { //Random, get number in [1, 7] return Random(1, 8); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 73b4142de..9c9cfd829 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -504,7 +504,7 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get CLOSE_DISPS(play->state.gfxCtx); } -extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry getItemEntry) { +extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getItemEntry) { Color_RGB8 color = { 0, 60, 100 }; if (CVarGetInteger(CVAR_COSMETIC("World.MysteryItem.Changed"), 0)) { color = CVarGetColor24(CVAR_COSMETIC("World.MysteryItem.Value"), color); diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index aaac71e06..22d8466c6 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -23,7 +23,7 @@ void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getItemEntry); 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_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); From b3ed24902151115d6a38e58ceebd1ee6567c4611 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 19 Mar 2025 23:03:42 -0400 Subject: [PATCH 110/267] Fix Pot Shuffle crash caused by removal of id check (#5158) * Fix Pot Shuffle crash caused by removal of id check. * Properly unregister ShufflePots Hook --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index a4db9f428..f0baa4c35 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -2389,7 +2389,7 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->UnregisterGameHook(fishsanityOnVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnItemReceiveHook); - GameInteractor::Instance->UnregisterGameHook(shufflePotsOnActorInitHook); + GameInteractor::Instance->UnregisterGameHookForID(shufflePotsOnActorInitHook); GameInteractor::Instance->UnregisterGameHook(shufflePotsOnVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(shuffleFreestandingOnVanillaBehaviorHook); @@ -2465,7 +2465,7 @@ void RandomizerRegisterHooks() { } if (RAND_GET_OPTION(RSK_SHUFFLE_POTS) != RO_SHUFFLE_POTS_OFF) { - shufflePotsOnActorInitHook = GameInteractor::Instance->RegisterGameHook(ObjTsubo_RandomizerInit); + shufflePotsOnActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_OBJ_TSUBO, ObjTsubo_RandomizerInit); shufflePotsOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShufflePots_OnVanillaBehaviorHandler); } From 8958db5c2bb32adcf57bf86049c91aa8f5a5fe54 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 20 Mar 2025 00:21:31 -0400 Subject: [PATCH 111/267] Fix CVar mismatches for skip forced dialog and unrestricted items. (#5159) --- soh/soh/SohGui/SohMenu.h | 7 +++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h index 3e5f7a555..dacb98936 100644 --- a/soh/soh/SohGui/SohMenu.h +++ b/soh/soh/SohGui/SohMenu.h @@ -67,6 +67,13 @@ static const std::unordered_map dekuStickCheat = { { DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, "Unbreakable + Always on Fire" } }; +static const std::unordered_map skipForcedDialogOptions = { + { FORCED_DIALOG_SKIP_NONE, "None" }, + { FORCED_DIALOG_SKIP_NAVI, "Navi" }, + { FORCED_DIALOG_SKIP_NPC, "NPCs" }, + { FORCED_DIALOG_SKIP_ALL, "All" } +}; + static const std::unordered_map skipGetItemAnimationOptions = { { SGIA_DISABLED, "Disabled" }, { SGIA_JUNK, "Junk Items" }, diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 1f3066806..d8368f299 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -330,9 +330,12 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Skip Pickup Messages", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FastDrops")) .Options(CheckboxOptions().Tooltip("Skip Pickup Messages for new Consumable Items and Bottle Swipes.")); - AddWidget(path, "Skip Forced Dialog", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Skip Forced Dialog", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipForcedDialog")) - .Options(CheckboxOptions().Tooltip("Prevent forced conversations with Navi or other NPCs.")); + .Options(ComboboxOptions() + .ComboMap(skipForcedDialogOptions) + .DefaultIndex(FORCED_DIALOG_SKIP_NONE) + .Tooltip("Prevent forced conversations with Navi and/or other NPCs.")); AddWidget(path, "Skip Text", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SkipText")) .Options(CheckboxOptions().Tooltip("Holding down B skips text.")); @@ -1592,7 +1595,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip("Allows any item to be equipped, regardless of age.\n" "Also allows Child to use Adult strength upgrades.")); AddWidget(path, "Unrestricted Items", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("Unrestricted Items")) + .CVar(CVAR_CHEAT("NoRestrictItems")) .Options(CheckboxOptions().Tooltip("Allows you to use any item at any location")); AddWidget(path, "Super Tunic", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("SuperTunic")) From f02032aed4e2132173628b1bd648c12745d0b721 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Thu, 20 Mar 2025 07:07:43 -0400 Subject: [PATCH 112/267] Skip dialogue before getting Gerudo membership card (#5058) * Skip dialogue before getting Gerudo membership card * Change to misc interaction * Change to forced NPC dialogue * Rename VB flag --- .../game-interactor/vanilla-behavior/GIVanillaBehavior.h | 8 ++++++++ soh/soh/Enhancements/timesaver_hook_handlers.cpp | 6 ++++++ soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index c8a0f747c..d6154347c 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -405,6 +405,14 @@ typedef enum { // - `*int16_t` (item id) VB_DRAW_AMMO_COUNT, + // #### `result` + // ```c + // (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play) + // ``` + // #### `args` + // - None + VB_END_GERUDO_MEMBERSHIP_TALK, + // #### `result` // ```c // !(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC) diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index a46ebb814..2c84ecac2 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -386,6 +386,12 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } break; } + case VB_END_GERUDO_MEMBERSHIP_TALK: { + if (ForcedDialogIsDisabled(FORCED_DIALOG_SKIP_NPC)) { + *should = true; + } + break; + } case VB_GORON_LINK_BE_SCARED: { if (ForcedDialogIsDisabled(FORCED_DIALOG_SKIP_NPC)) { EnGo2* goronLink = va_arg(args, EnGo2*); 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 24129fb2a..fb233cf0d 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 @@ -152,7 +152,8 @@ 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)) { + if (GameInteractor_Should(VB_END_GERUDO_MEMBERSHIP_TALK, + (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play))) { Message_CloseTextbox(play); this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; this->actionFunc = EnGe3_WaitTillCardGiven; From 65564e946940bb2535e7176a1c979ae318666bce Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 20 Mar 2025 11:46:52 -0400 Subject: [PATCH 113/267] Fix typo in Mute Low HP Alarm CVar (#5161) --- soh/soh/Enhancements/audio/AudioEditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index efbcd5c28..3daeff01f 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -498,7 +498,7 @@ void AudioEditor::DrawElement() { ImGui::TableNextColumn(); if (ImGui::BeginChild("SfxOptions", ImVec2(0, -8))) { UIWidgets::CVarCheckbox( - "Mute Low HP Alarm", CVAR_AUDIO("LowHPAlarm"), + "Mute Low HP Alarm", CVAR_AUDIO("LowHpAlarm"), UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip("Disable the low HP beeping sound.")); UIWidgets::CVarCheckbox("Disable Navi Call Audio", CVAR_AUDIO("DisableNaviCallAudio"), UIWidgets::CheckboxOptions() From b6f957b36fa43909360e97fad92b0556268a43c2 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 20 Mar 2025 20:19:16 +0100 Subject: [PATCH 114/267] More Menu Improvements (#5155) * fix mismatch on default value for notification position * Fix checkbox vertical offset for multiline * Moooore changeees too theee menuuuuuu * capitalization again * Fix controller config & remove test var --- .../controls/SohInputEditorWindow.cpp | 15 ++++-- soh/soh/Notification/Notification.cpp | 2 +- soh/soh/SohGui/Menu.cpp | 7 +++ soh/soh/SohGui/SohMenuEnhancements.cpp | 54 +++++++++++-------- soh/soh/SohGui/SohMenuSettings.cpp | 10 +++- soh/soh/SohGui/UIWidgets.cpp | 3 +- 6 files changed, 61 insertions(+), 30 deletions(-) diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index 135cb8a00..7dbc74a75 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -1501,10 +1501,10 @@ void SohInputEditorWindow::DrawLinkTab() { } if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - 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); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); + DrawButtonLine(StringHelper::Sprintf("D %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); } if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { @@ -1782,6 +1782,11 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { } void SohInputEditorWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + ImVec4 themeColor = ColorValues.at(THEME_COLOR); + ImGui::PushStyleColor(ImGuiCol_Tab, ImVec4(themeColor.x, themeColor.y, themeColor.z, 0.8f)); + ImGui::PushStyleColor(ImGuiCol_TabHovered, ImVec4(themeColor.x, themeColor.y, themeColor.z, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_TabActive, ImVec4(themeColor.x, themeColor.y, themeColor.z, 0.6f)); ImGui::BeginTabBar("##ControllerConfigPortTabs"); DrawLinkTab(); DrawIvanTab(); @@ -1790,4 +1795,6 @@ void SohInputEditorWindow::DrawElement() { DrawDebugPortTab(3); } ImGui::EndTabBar(); + ImGui::PopStyleColor(3); + ImGui::PopFont(); } diff --git a/soh/soh/Notification/Notification.cpp b/soh/soh/Notification/Notification.cpp index ebc4e168b..5bc0e8974 100644 --- a/soh/soh/Notification/Notification.cpp +++ b/soh/soh/Notification/Notification.cpp @@ -20,7 +20,7 @@ void Window::Draw() { const float margin = 30.0f; const float padding = 10.0f; - int position = CVarGetInteger(CVAR_SETTING("Notifications.Position"), 0); + int position = CVarGetInteger(CVAR_SETTING("Notifications.Position"), 3); // Top Left ImVec2 basePosition; diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index 0e8f8ab51..955b048d6 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -519,6 +519,10 @@ void Menu::DrawElement() { ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), windowCond, { 0.5f, 0.5f }); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); } + + ImGui::PushStyleColor(ImGuiCol_WindowBg, + ImVec4(0, 0, 0, CVarGetFloat(CVAR_SETTING("Menu.BackgroundOpacity"), 0.85f))); + if (!ImGui::Begin("Main Menu", NULL, windowFlags)) { if (!popout) { ImGui::PopStyleVar(); @@ -526,6 +530,9 @@ void Menu::DrawElement() { ImGui::End(); return; } + + ImGui::PopStyleColor(); + if (popped != popout) { if (!popout) { ImGui::PopStyleVar(); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index d8368f299..2e0cb55af 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -116,7 +116,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Nighttime GS Always Spawn", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NightGSAlwaysSpawn")) .Options(CheckboxOptions().Tooltip("Nighttime Skulltulas will spawn during both day and night.")); - AddWidget(path, "Pull Grave during the day", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Pull Grave During the Day", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DayGravePull")) .Options(CheckboxOptions().Tooltip("Allows graves to be pulled when child during the day.")); AddWidget(path, "Dampe Appears All Night", WIDGET_CVAR_CHECKBOX) @@ -140,7 +140,7 @@ void SohMenu::AddMenuEnhancements() { .DisabledTooltip("This is not compatible with the Locked Overworld Doors Randomizer option.")); AddWidget(path, "Pause Menu", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Allow the Cursor to be on any slot", WIDGET_CVAR_COMBOBOX) + AddWidget(path, "Allow the Cursor to be on Any Slot", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_ENHANCEMENT("PauseAnyCursor")) .Options( ComboboxOptions() @@ -163,7 +163,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Removes the Input Requirement on Text boxes after defeating Ganon, allowing the Credits " "Sequence to continue to progress.")); - AddWidget(path, "Include Held Inputs at the Start of Buffer Input Window", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Include Held Inputs at the Start of Pause Buffer Input Window", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("IncludeHeldInputsBufferWindow")) .Options(CheckboxOptions().Tooltip( "Typically, inputs that are held prior to the buffer window are not included in the buffer. This " @@ -171,7 +171,15 @@ void SohMenu::AddMenuEnhancements() { "undesireably, for instance Z-Targetting something you might not want to.")); AddWidget(path, "Pause Buffer Input Window: %d frames", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("PauseBufferWindow")) - .Options(IntSliderOptions().Min(0).Max(40).DefaultValue(0).Format("%d frames")); + .Options(IntSliderOptions() + .Min(0) + .Max(40) + .DefaultValue(0) + .Format("%d frames") + .Tooltip("Adds back in a delay after unpausing before the game resumes playing again, " + "where inputs can be held prematurely to be input immediately after the game resumes. " + "This essentially brings back behaviour from console releases which are lost on default " + "because SoH isn't limited to N64 hardware.")); AddWidget(path, "Simulated Input Lag: %d frames", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_SIMULATED_INPUT_LAG) .Options(IntSliderOptions() @@ -214,7 +222,7 @@ void SohMenu::AddMenuEnhancements() { "The default response to Kaepora Gaebora is always that you understood what he said.")); AddWidget(path, "Convenience", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Quit Fishing At Door", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Quit Fishing at Door", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("QuitFishingAtDoor")) .Options(CheckboxOptions().Tooltip( "Fisherman asks if you want to quit at the door if you try to leave the Fishing Pond " @@ -222,7 +230,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Instant Putaway", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("InstantPutaway")) .Options(CheckboxOptions().Tooltip("Allow Link to put items away without having to wait around.")); - AddWidget(path, "Navi Timer Resets", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Navi Timer Resets on Scene Change", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ResetNaviTimer")) .Options( CheckboxOptions().Tooltip("Resets the Navi timer on scene change. If you have already talked to her, " @@ -459,11 +467,6 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("NewDrops")) .Options(CheckboxOptions().Tooltip( "Replaces most 2D items and projectiles on the overworld with their equivalent 3D models.")); - AddWidget(path, "Invisible Bunny Hood", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("HideBunnyHood")) - .Options(CheckboxOptions().Tooltip( - "Turns Bunny Hood Invisible while still maintaining its effects." - )); AddWidget(path, "Animated Link in Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("PauseMenuAnimatedLink")) .Options(CheckboxOptions().Tooltip( @@ -523,7 +526,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Disable HUD Heart Animations", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NoHUDHeartAnimation")) .Options(CheckboxOptions().Tooltip("Disables the Beating Animation of the Hearts on the HUD.")); - AddWidget(path, "Glitch line-up tick", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Glitch Line-up Tick", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DrawLineupTick")) .Options(CheckboxOptions().Tooltip( "Displays a tick in the top center of the screen to help with glitch line-ups in SoH, since traditional " @@ -549,7 +552,9 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Ammo counts in the pause menu will work correctly regardless of the position of items in the Inventory.")); AddWidget(path, "Enable Passage of Time on File Select", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("TimeFlowFileSelect")); + .CVar(CVAR_ENHANCEMENT("TimeFlowFileSelect")) + .Options(CheckboxOptions().Tooltip( + "The skybox in the background of the File Select screen will go through the day and night cycle over time.")); path.column = SECTION_COLUMN_3; AddWidget(path, "Misc.", WIDGET_SEPARATOR_TEXT); @@ -690,6 +695,9 @@ void SohMenu::AddMenuEnhancements() { "- When saving and quitting\n" "- When dying\n" "- When traveling thru time (if \"Masks Equippable as Adult\" is activated).")); + AddWidget(path, "Invisible Bunny Hood", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("HideBunnyHood")) + .Options(CheckboxOptions().Tooltip("Turns Bunny Hood Invisible while still maintaining its effects.")); AddWidget(path, "Mask Select in Inventory", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("MaskSelect")) .Options(CheckboxOptions().Tooltip( @@ -962,7 +970,7 @@ void SohMenu::AddMenuEnhancements() { "Only relevant for playthroughs involving Master Quest Dungeons.")); AddWidget(path, "Desync Fixes", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Fix Darunia Dancing Too Fast", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Fix Darunia Dancing too Fast", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed")) .Options(CheckboxOptions().Tooltip( "Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in the Original Game.")); @@ -1265,7 +1273,7 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime")) .PreFunc(frogsOcarinaGameDisabledFunc) .Options(CheckboxOptions().Tooltip("Removes the timer to play back the song.")); - AddWidget(path, "Modify note timer: %dx", WIDGET_CVAR_SLIDER_INT) + AddWidget(path, "Modify Note Timer: %dx", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("FrogsModifyFailTime")) .PreFunc([](WidgetInfo& info) { info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || @@ -1353,11 +1361,11 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("GuaranteeFishingBite")) .PreFunc(fishingDisabledFunc) .Options(CheckboxOptions().Tooltip("When a line is stable, guarantee bite. Otherwise use Default logic.")); - AddWidget(path, "Fish Never Escape", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Fish never Escape", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FishNeverEscape")) .PreFunc(fishingDisabledFunc) .Options(CheckboxOptions().Tooltip("Once a hook as been set, Fish will never let go while being reeled in.")); - AddWidget(path, "Loaches Always Appear", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Loaches always Appear", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("LoachesAlwaysAppear")) .PreFunc(fishingDisabledFunc) .Options( @@ -1416,7 +1424,7 @@ void SohMenu::AddMenuEnhancements() { "Enables Ivan the Fairy upon the next map change. Player 2 can control Ivan and press the C-Buttons to " "use items and mess with Player 1!" )); - AddWidget(path, "Dogs Follow you Everywhere", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Dogs Follow You Everywhere", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DogFollowsEverywhere")) .Options(CheckboxOptions().Tooltip("Allows dogs to follow you anywhere you go, even if you leave the Market.")); AddWidget(path, "Rupee Dash Mode", WIDGET_CVAR_CHECKBOX) @@ -1554,7 +1562,7 @@ void SohMenu::AddMenuEnhancements() { .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); }); - AddWidget(path, "Select All Enemies", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Select all Enemies", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RandomizedEnemyList.All")) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); @@ -1635,14 +1643,14 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_CHEAT("NoRedeadFreeze")) .Options( CheckboxOptions().Tooltip("Prevents ReDeads and Gibdos from being able to freeze you with their scream.")); - AddWidget(path, "Keese/Guay Don't Target You", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Keese/Guay don't Target You", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("NoKeeseGuayTarget")) .Options(CheckboxOptions().Tooltip( "Keese and Guay no longer target you and simply ignore you as if you were wearing the " "Skull Mask.")); AddWidget(path, "Glitch Aids", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Easy Frame Advancing", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Easy Frame Advancing with Pause", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("EasyFrameAdvance")) .Options(CheckboxOptions().Tooltip( "Continue holding START button when unpausing to only advance a single frame and then re-pause.")); @@ -1664,10 +1672,10 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_CHEAT("DropsDontDie")) .Options( CheckboxOptions().Tooltip("Drops from enemies, grass, etc. don't disappear after a set amount of time.")); - AddWidget(path, "Fish Don't Despawn", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Fish don't Despawn", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("NoFishDespawn")) .Options(CheckboxOptions().Tooltip("Prevents fish from automatically despawning after a while when dropped.")); - AddWidget(path, "Bugs Don't Despawn", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Bugs don't Despawn", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("NoBugsDespawn")) .Options(CheckboxOptions().Tooltip("Prevents bugs from automatically despawning after a while when dropped.")); diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 093e98618..20ce9ff50 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -55,7 +55,7 @@ void SohMenu::AddMenuSettings() { WidgetPath path = { "Settings", "General", SECTION_COLUMN_1 }; // General - Settings - AddWidget(path, "General Settings", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Menu Settings", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Menu Theme", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("Menu.Theme")) .Options(ComboboxOptions() @@ -69,6 +69,14 @@ void SohMenu::AddMenuSettings() { "Allows controller navigation of the port menu (Settings, Enhancements,...)\nCAUTION: " "This will disable game inputs while the menu is visible.\n\nD-pad to move between " "items, A to select, B to move up in scope.")); + AddWidget(path, "Menu Background Opacity", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_SETTING("Menu.BackgroundOpacity")) + .Options(FloatSliderOptions() + .DefaultValue(0.85f) + .IsPercentage() + .Tooltip("Sets the opacity of the background of the port menu.")); + + AddWidget(path, "General Settings", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Cursor Always Visible", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SETTING("CursorVisibility")) .Callback([](WidgetInfo& info) { diff --git a/soh/soh/SohGui/UIWidgets.cpp b/soh/soh/SohGui/UIWidgets.cpp index 9875cf7b9..e2f7bf2dc 100644 --- a/soh/soh/SohGui/UIWidgets.cpp +++ b/soh/soh/SohGui/UIWidgets.cpp @@ -330,7 +330,8 @@ bool Checkbox(const char* _label, bool* value, const CheckboxOptions& options) { if (options.labelPosition == LabelPositions::Above) { checkPos.y += label_size.y + (style.ItemInnerSpacing.y * 2.0f); } else { - labelPos.y += (square_sz / 2) - (label_size.y / 2); + // Center with checkbox automatically + labelPos.y += ImGui::CalcTextSize("g").y / 8; } if (options.alignment == ComponentAlignments::Right) { checkPos.x = total_bb.Max.x - square_sz; From 985bf919457abeb1672eac1dcb621208ecd6ad2f Mon Sep 17 00:00:00 2001 From: Archez Date: Thu, 20 Mar 2025 15:20:50 -0400 Subject: [PATCH 115/267] prevent some timesavers applying in boss rush (#5163) --- .../TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp | 5 +++++ soh/soh/Enhancements/timesaver_hook_handlers.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index c9a999cb1..ae4236218 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -20,6 +20,11 @@ static bool sEnteredBlueWarp = false; * should also account for the difference between your first and following visits to the blue warp. */ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { + // Do nothing when in a boss rush + if (IS_BOSS_RUSH) { + return; + } + bool overrideBlueWarpDestinations = IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 2c84ecac2..1db34b4f6 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -1066,6 +1066,11 @@ void TimeSaverOnSceneInitHandler(int16_t sceneNum) { static GetItemEntry vanillaQueuedItemEntry = GET_ITEM_NONE; void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) { + // Do nothing when in a boss rush + if (IS_BOSS_RUSH) { + return; + } + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { switch (flagType) { case FLAG_EVENT_CHECK_INF: From 57bc5690e2843dcfd966e6dfcbbd65be956287e1 Mon Sep 17 00:00:00 2001 From: Archez Date: Fri, 21 Mar 2025 07:21:33 -0400 Subject: [PATCH 116/267] Mono dev tools (#5175) * apply mono font to some dev tool windows * soh gui wrappers for gfxdebugger and console to set mono font * it can be just a little larger --- .../Enhancements/debugger/debugSaveEditor.cpp | 4 +++ soh/soh/Enhancements/debugger/dlViewer.cpp | 6 ++++ .../Enhancements/debugger/hookDebugger.cpp | 5 ++++ soh/soh/Enhancements/debugger/sohConsole.cpp | 30 +++++++++++++++++++ soh/soh/Enhancements/debugger/sohConsole.h | 17 +++++++++++ .../Enhancements/debugger/sohGfxDebugger.cpp | 16 ++++++++++ .../Enhancements/debugger/sohGfxDebugger.h | 17 +++++++++++ soh/soh/Enhancements/gameplaystats.cpp | 4 +++ soh/soh/OTRGlobals.cpp | 1 + soh/soh/OTRGlobals.h | 1 + soh/soh/SohGui/SohGui.cpp | 12 +++----- soh/soh/SohGui/SohGui.hpp | 2 ++ soh/soh/SohGui/SohMenuDevTools.cpp | 4 +-- 13 files changed, 109 insertions(+), 10 deletions(-) create mode 100644 soh/soh/Enhancements/debugger/sohConsole.cpp create mode 100644 soh/soh/Enhancements/debugger/sohConsole.h create mode 100644 soh/soh/Enhancements/debugger/sohGfxDebugger.cpp create mode 100644 soh/soh/Enhancements/debugger/sohGfxDebugger.h diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 0e9bbc79a..96163f656 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1555,6 +1555,8 @@ void ResetBaseOptions() { void SaveEditorWindow::DrawElement() { PushStyleTabs(THEME_COLOR); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { ResetBaseOptions(); if (ImGui::BeginTabItem("Info")) { @@ -1594,6 +1596,8 @@ void SaveEditorWindow::DrawElement() { ImGui::EndTabBar(); } + + ImGui::PopFont(); PopStyleTabs(); } diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index a591cf948..27833058a 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -93,6 +93,8 @@ void PerformDisplayListSearch() { void DLViewerWindow::DrawElement() { // Debounce the search field as listing otr files is expensive UIWidgets::PushStyleInput(THEME_COLOR); + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + if (ImGui::InputText("Search Display Lists", searchString, ARRAY_COUNT(searchString))) { doSearch = true; searchDebounceFrames = 30; @@ -121,6 +123,7 @@ void DLViewerWindow::DrawElement() { UIWidgets::PopStyleCombobox(); if (activeDisplayList == "") { + ImGui::PopFont(); return; } @@ -326,8 +329,11 @@ void DLViewerWindow::DrawElement() { } } catch (const std::exception& e) { ImGui::Text("Error displaying DL instructions."); + ImGui::PopFont(); return; } + + ImGui::PopFont(); } void DLViewerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/hookDebugger.cpp b/soh/soh/Enhancements/debugger/hookDebugger.cpp index a9d6ca891..113862282 100644 --- a/soh/soh/Enhancements/debugger/hookDebugger.cpp +++ b/soh/soh/Enhancements/debugger/hookDebugger.cpp @@ -1,6 +1,7 @@ #include "hookDebugger.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/SohGui/UIWidgets.hpp" +#include "soh/OTRGlobals.h" #include #include @@ -82,12 +83,16 @@ void HookDebuggerWindow::DrawElement() { "(\"__cpp_lib_source_location\" not defined in \"\")."); #endif + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + for (auto& [hookName, _] : hookData) { if (ImGui::TreeNode(hookName)) { DrawHookRegisteringInfos(hookName); ImGui::TreePop(); } } + + ImGui::PopFont(); } void HookDebuggerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/sohConsole.cpp b/soh/soh/Enhancements/debugger/sohConsole.cpp new file mode 100644 index 000000000..686152a1f --- /dev/null +++ b/soh/soh/Enhancements/debugger/sohConsole.cpp @@ -0,0 +1,30 @@ +#include "sohConsole.h" +#include "soh/OTRGlobals.h" +#include "soh/SohGui/UIWidgets.hpp" +#include "soh/SohGui/SohGui.hpp" + +void SohConsoleWindow::InitElement() { + ConsoleWindow::InitElement(); +} + +void SohConsoleWindow::UpdateElement() { + ConsoleWindow::UpdateElement(); +} + +void SohConsoleWindow::DrawElement() { + UIWidgets::PushStyleInput(THEME_COLOR); + // Small font (13) to match hardcoded width values in the LUS window.. set large font after below TODO addressed + ImGui::PushFont(OTRGlobals::Instance->fontMonoSmall); + + // TODO: This can be removed after the LUS console window is designed better without hardcoding widths + ImGui::BeginChild("##Console Wrapper", ImVec2(0, 0), ImGuiChildFlags_None, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_NoScrollWithMouse); + + ConsoleWindow::DrawElement(); + + ImGui::EndChild(); + + ImGui::PopFont(); + UIWidgets::PopStyleInput(); +} diff --git a/soh/soh/Enhancements/debugger/sohConsole.h b/soh/soh/Enhancements/debugger/sohConsole.h new file mode 100644 index 000000000..db039625b --- /dev/null +++ b/soh/soh/Enhancements/debugger/sohConsole.h @@ -0,0 +1,17 @@ +#ifndef SOH_CONSOLE_H +#define SOH_CONSOLE_H + +#include "window/gui/GuiWindow.h" +#include "window/gui/ConsoleWindow.h" + +class SohConsoleWindow : public Ship::ConsoleWindow { + public: + using ConsoleWindow::ConsoleWindow; + + protected: + void InitElement() override; + void UpdateElement() override; + void DrawElement() override; +}; + +#endif // SOH_CONSOLE_H diff --git a/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp b/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp new file mode 100644 index 000000000..20b37ca93 --- /dev/null +++ b/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp @@ -0,0 +1,16 @@ +#include "sohGfxDebugger.h" +#include "soh/OTRGlobals.h" + +void SohGfxDebuggerWindow::InitElement() { + GfxDebuggerWindow::InitElement(); +} + +void SohGfxDebuggerWindow::UpdateElement() { + GfxDebuggerWindow::UpdateElement(); +} + +void SohGfxDebuggerWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + GfxDebuggerWindow::DrawElement(); + ImGui::PopFont(); +} diff --git a/soh/soh/Enhancements/debugger/sohGfxDebugger.h b/soh/soh/Enhancements/debugger/sohGfxDebugger.h new file mode 100644 index 000000000..789173b88 --- /dev/null +++ b/soh/soh/Enhancements/debugger/sohGfxDebugger.h @@ -0,0 +1,17 @@ +#ifndef SOH_GFX_DEBUGGER_H +#define SOH_GFX_DEBUGGER_H + +#include "window/gui/GuiWindow.h" +#include "window/gui/GfxDebuggerWindow.h" + +class SohGfxDebuggerWindow : public LUS::GfxDebuggerWindow { + public: + using GfxDebuggerWindow::GfxDebuggerWindow; + + protected: + void InitElement() override; + void UpdateElement() override; + void DrawElement() override; +}; + +#endif // SOH_GFX_DEBUGGER_H diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index af7807b3a..937e81ede 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -635,9 +635,11 @@ void DrawGameplayStatsOptionsTab() { } void GameplayStatsWindow::DrawElement() { + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); DrawGameplayStatsHeader(); UIWidgets::PushStyleTabs(THEME_COLOR); + if (ImGui::BeginTabBar("Stats", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { if (ImGui::BeginTabItem("Timestamps")) { DrawGameplayStatsTimestampsTab(); @@ -657,7 +659,9 @@ void GameplayStatsWindow::DrawElement() { } ImGui::EndTabBar(); } + UIWidgets::PopStyleTabs(); + ImGui::PopFont(); ImGui::Text("Note: Gameplay stats are saved to the current file and will be\nlost if you quit without saving."); } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 5d2310e1b..a86c77524 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -401,6 +401,7 @@ OTRGlobals::OTRGlobals() { previousImGuiScale = defaultImGuiScale; + fontMonoSmall = CreateFontWithSize(14.0f, "fonts/Inconsolata-Regular.ttf"); fontMono = CreateFontWithSize(16.0f, "fonts/Inconsolata-Regular.ttf"); fontMonoLarger = CreateFontWithSize(20.0f, "fonts/Inconsolata-Regular.ttf"); fontMonoLargest = CreateFontWithSize(24.0f, "fonts/Inconsolata-Regular.ttf"); diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 0a8d6595e..2f20b0b15 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -54,6 +54,7 @@ class OTRGlobals { ImFont* defaultFontLarger; ImFont* defaultFontLargest; + ImFont* fontMonoSmall; ImFont* fontStandard; ImFont* fontStandardLarger; ImFont* fontStandardLargest; diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index ef8e40e8c..56da5eba0 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -124,15 +124,11 @@ namespace SohGui { SPDLOG_ERROR("Could not find stats window"); } - mConsoleWindow = gui->GetGuiWindow("Console"); - if (mConsoleWindow == nullptr) { - SPDLOG_ERROR("Could not find console window"); - } + mConsoleWindow = std::make_shared(CVAR_WINDOW("Console"), "Console##SoH", ImVec2(820, 630)); + gui->AddGuiWindow(mConsoleWindow); - mGfxDebuggerWindow = gui->GetGuiWindow("Gfx Debugger"); - if (mGfxDebuggerWindow == nullptr) { - SPDLOG_ERROR("Could not find Gfx Debugger window"); - } + mGfxDebuggerWindow = std::make_shared(CVAR_WINDOW("GfxDebugger"), "GfxDebugger##SoH", ImVec2(820, 630)); + gui->AddGuiWindow(mGfxDebuggerWindow); mInputEditorWindow = gui->GetGuiWindow("Controller Configuration"); if (mInputEditorWindow == nullptr) { diff --git a/soh/soh/SohGui/SohGui.hpp b/soh/soh/SohGui/SohGui.hpp index f465d1d1b..35c93b353 100644 --- a/soh/soh/SohGui/SohGui.hpp +++ b/soh/soh/SohGui/SohGui.hpp @@ -18,6 +18,8 @@ #include "soh/Enhancements/debugger/debugSaveEditor.h" #include "soh/Enhancements/debugger/hookDebugger.h" #include "soh/Enhancements/debugger/dlViewer.h" +#include "soh/Enhancements/debugger/sohConsole.h" +#include "soh/Enhancements/debugger/sohGfxDebugger.h" #include "soh/Enhancements/debugger/valueViewer.h" #include "soh/Enhancements/gameplaystatswindow.h" #include "soh/Enhancements/randomizer/randomizer_check_tracker.h" diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index 917635f34..53d866a8e 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -99,7 +99,7 @@ void SohMenu::AddMenuDevTools() { AddSidebarEntry("Dev Tools", path.sidebarName, 1); AddWidget(path, "Popout Console", WIDGET_WINDOW_BUTTON) .CVar(CVAR_WINDOW("Console")) - .WindowName("Console") + .WindowName("Console##SoH") .Options(WindowButtonOptions().Tooltip("Enables the separate Console Window.")); // Save Editor @@ -163,7 +163,7 @@ void SohMenu::AddMenuDevTools() { AddSidebarEntry("Dev Tools", path.sidebarName, 1); AddWidget(path, "Popout Gfx Debugger", WIDGET_WINDOW_BUTTON) .CVar(CVAR_WINDOW("GfxDebugger")) - .WindowName("GfxDebuggerWindow") + .WindowName("GfxDebugger##SoH") .Options(WindowButtonOptions().Tooltip("Enables the separate Gfx Debugger Window.")); } From e21a3e4c0f33c76c5eab7257125ae38d56a2cdc5 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 21 Mar 2025 04:22:22 -0700 Subject: [PATCH 117/267] Add check for GAMEMODE_END_CREDITS in Audio Editor's OnSceneInit hook (#5172) * Add check for GAMEMODE_END_CREDITS in Audio Editor's OnSceneInit hook to prevent sequence shuffles mid-credits. * Move extern "C" block up. --- soh/soh/Enhancements/audio/AudioEditor.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index 3daeff01f..caa40c66f 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -16,6 +16,11 @@ #include "AudioCollection.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" +extern "C" { + #include "z64save.h" + extern SaveContext gSaveContext; +} + Vec3f pos = { 0.0f, 0.0f, 0.0f }; f32 freqScale = 1.0f; s8 reverbAdd = 0; @@ -440,7 +445,7 @@ void DrawTypeChip(SeqType type, std::string sequenceName) { void AudioEditorRegisterOnSceneInitHook() { GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { - if (CVarGetInteger(CVAR_AUDIO("RandomizeAllOnNewScene"), 0)) { + if (gSaveContext.gameMode != GAMEMODE_END_CREDITS && CVarGetInteger(CVAR_AUDIO("RandomizeAllOnNewScene"), 0)) { AudioEditor_RandomizeAll(); } }); From 1bcab06fede5330a9d1e623429b42eb0ff442dc4 Mon Sep 17 00:00:00 2001 From: Archez Date: Fri, 21 Mar 2025 07:23:01 -0400 Subject: [PATCH 118/267] Rework CI build caching for stability (#5170) * improve github build caching * add back network build flag * add back sdlnet --- .github/workflows/generate-builds.yml | 222 +++++++++++++++----------- CMake/Packaging-2.cmake | 6 +- CMakeLists.txt | 2 +- 3 files changed, 130 insertions(+), 100 deletions(-) diff --git a/.github/workflows/generate-builds.yml b/.github/workflows/generate-builds.yml index 64c908a37..45cab21d9 100644 --- a/.github/workflows/generate-builds.yml +++ b/.github/workflows/generate-builds.yml @@ -6,42 +6,44 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: + generate-soh-otr: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure ccache + uses: hendrikmuhs/ccache-action@v1.2 with: + save: ${{ github.ref_name == github.event.repository.default_branch }} key: ${{ runner.os }}-otr-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-otr-ccache-${{ github.ref }} - ${{ runner.os }}-otr-ccache- + ${{ runner.os }}-otr-ccache - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y $(cat .github/workflows/apt-deps.txt) libzip-dev zipcmp zipmerge ziptool - - name: Cache build folders - uses: actions/cache@v4 + - name: Restore Cached deps folder + uses: actions/cache/restore@v4 with: - key: ${{ runner.os }}-otr-build-${{ github.ref }}-${{ github.sha }} + key: ${{ runner.os }}-deps-${{ github.ref }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-otr-build-${{ github.ref }} - ${{ runner.os }}-otr-build- - path: | - build-cmake - SDL2-2.30.3 - tinyxml2-10.0.0 + ${{ runner.os }}-deps-${{ github.ref }}- + ${{ runner.os }}-deps- + path: deps + - name: Create deps folder + run: mkdir -p deps - name: Install latest SDL run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "SDL2-2.30.3" ]; then - wget https://www.libsdl.org/release/SDL2-2.30.3.tar.gz - tar -xzf SDL2-2.30.3.tar.gz + if [ ! -d "deps/SDL2-2.30.3" ]; then + wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.3/SDL2-2.30.3.tar.gz + tar -xzf SDL2-2.30.3.tar.gz -C deps fi - cd SDL2-2.30.3 + cd deps/SDL2-2.30.3 ./configure --enable-hidapi-libusb make -j 10 sudo make install @@ -50,11 +52,11 @@ jobs: run: | sudo apt-get remove libtinyxml2-dev export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "tinyxml2-10.0.0" ]; then + if [ ! -d "deps/tinyxml2-10.0.0" ]; then wget https://github.com/leethomason/tinyxml2/archive/refs/tags/10.0.0.tar.gz - tar -xzf 10.0.0.tar.gz + tar -xzf 10.0.0.tar.gz -C deps fi - cd tinyxml2-10.0.0 + cd deps/tinyxml2-10.0.0 mkdir -p build cd build cmake .. @@ -64,49 +66,57 @@ jobs: run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release - cmake --build build-cmake --config Release --target GenerateSohOtr - - uses: actions/upload-artifact@v4 + cmake --build build-cmake --config Release --target GenerateSohOtr -j3 + - name: Upload soh.otr + uses: actions/upload-artifact@v4 with: name: soh.otr path: soh.otr - retention-days: 1 + retention-days: 3 + build-macos: needs: generate-soh-otr runs-on: macos-14 steps: - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure ccache + uses: hendrikmuhs/ccache-action@v1.2 with: create-symlink: true + save: ${{ github.ref_name == github.event.repository.default_branch }} key: ${{ runner.os }}-14-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-14-ccache-${{ github.ref }} - ${{ runner.os }}-14-ccache- + ${{ runner.os }}-14-ccache + # Needed to apply sudo for macports cache restore - name: Install gtar wrapper run: | sudo mv /opt/homebrew/bin/gtar /opt/homebrew/bin/gtar.orig - sudo cp .github/workflows//gtar /opt/homebrew/bin/gtar + sudo cp .github/workflows/gtar /opt/homebrew/bin/gtar sudo chmod +x /opt/homebrew/bin/gtar - - name: Cache MacPorts - id: cache-macports - uses: actions/cache@v4 + - name: Restore Cached MacPorts + id: restore-cache-macports + uses: actions/cache/restore@v4 with: - path: /opt/local/ - key: ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }} + key: ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }}-${{ github.sha }} restore-keys: | + ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }}- ${{ runner.os }}-14-macports- + path: /opt/local/ + # Updated PATH applies to the next step and onwards - name: Install MacPorts (if necessary) run: | - if [ -d /opt/local/ ]; then + if command -v /opt/local/bin/port 2>&1 >/dev/null; then echo "MacPorts already installed" else + echo "Installing MacPorts" wget https://github.com/macports/macports-base/releases/download/v2.9.3/MacPorts-2.9.3-14-Sonoma.pkg sudo installer -pkg ./MacPorts-2.9.3-14-Sonoma.pkg -target / fi - echo "/opt/local/bin:/opt/local/sbin" >> $GITHUB_PATH + echo "/opt/local/bin:/opt/local/sbin" >> "$GITHUB_PATH" - name: Install dependencies run: | brew uninstall --ignore-dependencies libpng @@ -116,11 +126,12 @@ jobs: uses: actions/download-artifact@v4 with: name: soh.otr + path: build-cmake/soh - name: Build SoH run: | + export PATH="/usr/lib/ccache:/opt/homebrew/opt/ccache/libexec:/usr/local/opt/ccache/libexec:$PATH" cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DBUILD_REMOTE_CONTROL=1 cmake --build build-cmake --config Release --parallel 10 - mv soh.otr build-cmake/soh (cd build-cmake && cpack) mv _packages/*.dmg SoH.dmg @@ -132,44 +143,52 @@ jobs: path: | SoH.dmg readme.txt + - name: Save Cache MacPorts + if: ${{ github.ref_name == github.event.repository.default_branch }} + uses: actions/cache/save@v4 + with: + key: ${{ steps.restore-cache-macports.outputs.cache-primary-key }} + path: /opt/local/ + build-linux: needs: generate-soh-otr runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y $(cat .github/workflows/apt-deps.txt) - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure ccache + uses: hendrikmuhs/ccache-action@v1.2 with: - key: linux-ccache-${{ github.ref }}-${{ github.sha }} + save: ${{ github.ref_name == github.event.repository.default_branch }} + key: ${{ runner.os }}-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | - linux-ccache-${{ github.ref }} - linux-ccache- - - name: Cache build folders - uses: actions/cache@v4 + ${{ runner.os }}-ccache-${{ github.ref }} + ${{ runner.os }}-ccache + - name: Restore Cached deps folder + id: restore-cache-deps + uses: actions/cache/restore@v4 with: - key: linux-build-${{ github.ref }}-${{ github.sha }} + key: ${{ runner.os }}-deps-${{ github.ref }}-${{ github.sha }} restore-keys: | - linux-build-${{ github.ref }} - linux-build- - path: | - SDL2-2.30.3 - SDL2_net-2.2.0 - tinyxml2-10.0.0 - libzip-1.10.1 + ${{ runner.os }}-deps-${{ github.ref }}- + ${{ runner.os }}-deps- + path: deps + - name: Create deps folder + run: mkdir -p deps - name: Install latest SDL run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "SDL2-2.30.3" ]; then - wget https://www.libsdl.org/release/SDL2-2.30.3.tar.gz - tar -xzf SDL2-2.30.3.tar.gz + if [ ! -d "deps/SDL2-2.30.3" ]; then + wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.3/SDL2-2.30.3.tar.gz + tar -xzf SDL2-2.30.3.tar.gz -C deps fi - cd SDL2-2.30.3 + cd deps/SDL2-2.30.3 ./configure --enable-hidapi-libusb make -j 10 sudo make install @@ -177,11 +196,11 @@ jobs: - name: Install latest SDL_net run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "SDL2_net-2.2.0" ]; then + if [ ! -d "deps/SDL2_net-2.2.0" ]; then wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz - tar -xzf SDL2_net-2.2.0.tar.gz + tar -xzf SDL2_net-2.2.0.tar.gz -C deps fi - cd SDL2_net-2.2.0 + cd deps/SDL2_net-2.2.0 ./configure make -j 10 sudo make install @@ -190,11 +209,11 @@ jobs: run: | sudo apt-get remove libtinyxml2-dev export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "tinyxml2-10.0.0" ]; then + if [ ! -d "deps/tinyxml2-10.0.0" ]; then wget https://github.com/leethomason/tinyxml2/archive/refs/tags/10.0.0.tar.gz - tar -xzf 10.0.0.tar.gz + tar -xzf 10.0.0.tar.gz -C deps fi - cd tinyxml2-10.0.0 + cd deps/tinyxml2-10.0.0 mkdir -p build cd build cmake .. @@ -203,11 +222,11 @@ jobs: - name: Install libzip without crypto run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - if [ ! -d "libzip-1.10.1" ]; then + if [ ! -d "deps/libzip-1.10.1" ]; then wget https://github.com/nih-at/libzip/releases/download/v1.10.1/libzip-1.10.1.tar.gz - tar -xzf libzip-1.10.1.tar.gz + tar -xzf libzip-1.10.1.tar.gz -C deps fi - cd libzip-1.10.1 + cd deps/libzip-1.10.1 mkdir -p build cd build cmake .. -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF @@ -218,6 +237,7 @@ jobs: uses: actions/download-artifact@v4 with: name: soh.otr + path: build-cmake/soh - name: Build SoH run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" @@ -237,63 +257,73 @@ jobs: path: | soh.appimage readme.txt + - name: Save Cache deps folder + if: ${{ github.ref_name == github.event.repository.default_branch }} + uses: actions/cache/save@v4 + with: + key: ${{ steps.restore-cache-deps.outputs.cache-primary-key }} + path: deps + build-windows: needs: generate-soh-otr - runs-on: ${{ (vars.WINDOWS_RUNNER && fromJSON(vars.WINDOWS_RUNNER)) || 'windows-latest' }} + runs-on: windows-latest steps: - name: Install dependencies - if: ${{ !vars.WINDOWS_RUNNER }} run: | - choco install ninja + choco install ninja -y Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force -ErrorAction SilentlyContinue - - uses: actions/checkout@v4 + - name: Git Checkout + uses: actions/checkout@v4 with: submodules: true - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2.14 + - name: Configure sccache + uses: hendrikmuhs/ccache-action@v1.2 with: variant: sccache - max-size: "1G" + max-size: "2G" + evict-old-files: job + save: ${{ github.ref_name == github.event.repository.default_branch }} key: ${{ runner.os }}-ccache-${{ github.ref }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-ccache-${{ github.ref }} - ${{ runner.os }}-ccache- - - name: Cache build folder - uses: actions/cache@v4 + ${{ runner.os }}-ccache + - name: Restore Cached VCPKG folder + id: restore-cache-vcpkg + uses: actions/cache/restore@v4 with: - key: ${{ runner.os }}-build-${{ github.ref }}-${{ github.sha }} + key: ${{ runner.os }}-vcpkg-${{ github.ref }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-build-${{ github.ref }} - ${{ runner.os }}-build- - path: | - build-windows - vcpkg + ${{ runner.os }}-vcpkg-${{ github.ref }}- + ${{ runner.os }}-vcpkg- + path: vcpkg - name: Configure Developer Command Prompt uses: ilammy/msvc-dev-cmd@v1 + - name: Download soh.otr + uses: actions/download-artifact@v4 + with: + name: soh.otr + path: build-windows/soh - name: Build SoH - env: + env: VCPKG_ROOT: ${{github.workspace}}/vcpkg run: | set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH" cmake -S . -B build-windows -G Ninja -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -DBUILD_REMOTE_CONTROL=1 cmake --build build-windows --config Release --parallel 10 - mkdir soh-windows - mv ./x64/Release/soh.exe ./soh-windows/soh.exe - mkdir soh-windows/debug - mkdir soh-windows/mods - New-Item soh-windows/mods/custom_otr_files_go_here.txt -type file - mv ./x64/Release/soh.pdb ./soh-windows/debug/soh.pdb - mv ./README.md ./soh-windows/readme.txt - mv ./build-windows/gamecontrollerdb.txt ./soh-windows/gamecontrollerdb.txt - mv ./x64/Release/assets ./soh-windows - - name: Download soh.otr - uses: actions/download-artifact@v4 - with: - name: soh.otr - path: soh-windows + (cd build-windows && cpack) + cd .. + mv _packages/*.zip _packages/soh-windows.zip + - name: Unzip package + run: Expand-Archive -Path _packages/soh-windows.zip -DestinationPath soh-windows - name: Upload build uses: actions/upload-artifact@v4 with: name: soh-windows path: soh-windows + - name: Save Cache VCPKG folder + if: ${{ github.ref_name == github.event.repository.default_branch }} + uses: actions/cache/save@v4 + with: + key: ${{ steps.restore-cache-vcpkg.outputs.cache-primary-key }} + path: vcpkg diff --git a/CMake/Packaging-2.cmake b/CMake/Packaging-2.cmake index a29635eac..dc5da1b7e 100644 --- a/CMake/Packaging-2.cmake +++ b/CMake/Packaging-2.cmake @@ -1,9 +1,9 @@ set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 0) -set(CPACK_COMPONENTS_ALL "ship" "extractor" "appimage") +set(CPACK_COMPONENTS_ALL "ship") -if (NOT CPACK_GENERATOR STREQUAL "External") - list(REMOVE_ITEM CPACK_COMPONENTS_ALL "appimage") +if (CPACK_GENERATOR STREQUAL "External") + list(APPEND CPACK_COMPONENTS_ALL "extractor" "appimage") endif() if (CPACK_GENERATOR MATCHES "DEB|RPM") diff --git a/CMakeLists.txt b/CMakeLists.txt index 38ac6ce4a..7aa873c62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,7 +174,7 @@ set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") install(PROGRAMS "${CMAKE_BINARY_DIR}/linux/soh.sh" DESTINATION . COMPONENT appimage) -install(FILES "${CMAKE_SOURCE_DIR}/soh.otr" DESTINATION . COMPONENT ship) +install(FILES "${CMAKE_BINARY_DIR}/soh/soh.otr" DESTINATION . COMPONENT ship) install(TARGETS ZAPD DESTINATION ./assets/extractor COMPONENT extractor) install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor COMPONENT extractor) install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls COMPONENT extractor) From 04458f227410363698e22eee6f5e0a19023150bf Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 21 Mar 2025 04:26:03 -0700 Subject: [PATCH 119/267] Allow F1 to close the menubar modal via new `IsPopupOpen()` and `DismissPopup` functions in `SohModalWindow`. (#5166) --- soh/soh/OTRGlobals.cpp | 6 +++++- soh/soh/SohGui/SohModals.cpp | 15 +++++++++++++++ soh/soh/SohGui/SohModals.h | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index a86c77524..3690e8648 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1296,7 +1296,11 @@ extern "C" void Graph_StartFrame() { switch (dwScancode) { case KbScancode::LUS_KB_F1: { std::shared_ptr modal = static_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Modal Window")); - modal->RegisterPopup("Menu Moved", "The menubar, accessed by hitting F1, no longer exists.\nThe new menu can be accessed by hitting the Esc button instead.", "OK"); + if (modal->IsPopupOpen("Menu Moved")) { + modal->DismissPopup(); + } else { + modal->RegisterPopup("Menu Moved", "The menubar, accessed by hitting F1, no longer exists.\nThe new menu can be accessed by hitting the Esc button instead.", "OK"); + } break; } case KbScancode::LUS_KB_F5: { diff --git a/soh/soh/SohGui/SohModals.cpp b/soh/soh/SohGui/SohModals.cpp index b1fe0b43b..e2025437f 100644 --- a/soh/soh/SohGui/SohModals.cpp +++ b/soh/soh/SohGui/SohModals.cpp @@ -20,6 +20,8 @@ struct SohModal { }; std::vector modals; +bool closePopup = false; + void SohModalWindow::Draw() { if (!IsVisible()) { return; @@ -35,6 +37,11 @@ void SohModalWindow::DrawElement() { if (!ImGui::IsPopupOpen(curModal.title_.c_str())) { ImGui::OpenPopup(curModal.title_.c_str()); } + if (closePopup) { + ImGui::CloseCurrentPopup(); + modals.erase(modals.begin()); + closePopup = false; + } if (ImGui::BeginPopupModal(curModal.title_.c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings)) { ImGui::Text("%s", curModal.message_.c_str()); UIWidgets::PushStyleButton(THEME_COLOR); @@ -66,3 +73,11 @@ void SohModalWindow::DrawElement() { void SohModalWindow::RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function button1callback, std::function button2callback) { modals.push_back({ title, message, button1, button2, button1callback, button2callback }); } + +bool SohModalWindow::IsPopupOpen(std::string title) { + return !modals.empty() && modals.at(0).title_ == title; +} + +void SohModalWindow::DismissPopup() { + closePopup = true; +} diff --git a/soh/soh/SohGui/SohModals.h b/soh/soh/SohGui/SohModals.h index f584b9540..9a1fed80c 100644 --- a/soh/soh/SohGui/SohModals.h +++ b/soh/soh/SohGui/SohModals.h @@ -13,4 +13,6 @@ class SohModalWindow : public Ship::GuiWindow { void DrawElement() override; void UpdateElement() override {}; void RegisterPopup(std::string title, std::string message, std::string button1 = "OK", std::string button2 = "", std::function button1callback = nullptr, std::function button2callback = nullptr); + bool IsPopupOpen(std::string title); + void DismissPopup(); }; \ No newline at end of file From 1e294134af12b1a3d9bace9f71b1f2c8aad93ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Fri, 21 Mar 2025 11:27:53 +0000 Subject: [PATCH 120/267] Remove EnFr_RandomizerCheckFromSongIndex (#5169) * Remove EnFr_RandomizerCheckFromSongIndex Also handle missing return in RawAction::CheckFlag Also adjust jabu jabu shabom timer override to be non-overflowing constant (but same constant) * Update soh/soh/Enhancements/enemyrandomizer.cpp Co-authored-by: Archez * remove shabom room hack from z_obj_roomtimer.c --------- Co-authored-by: Archez --- soh/soh/Enhancements/enemyrandomizer.cpp | 2 +- .../GameInteractor_RawAction.cpp | 3 +++ .../Enhancements/randomizer/hook_handlers.cpp | 21 ------------------- .../ovl_Obj_Roomtimer/z_obj_roomtimer.c | 8 +------ 4 files changed, 5 insertions(+), 29 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index e638d04ad..326a4a78d 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -186,7 +186,7 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po // Lengthen timer in non-MQ Jabu Jabu bubble room. if (!isMQ && *actorId == ACTOR_OBJ_ROOMTIMER && *params == 30760 && play->sceneNum == SCENE_JABU_JABU && play->roomCtx.curRoom.num == 12) { - *params = 92280; + *params = (*params & ~0x3FF) | 120; } if (IsEnemyFoundToRandomize(play->sceneNum, play->roomCtx.curRoom.num, *actorId, *params, *posX)) { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index d0b32018a..1db2f1e33 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -220,6 +220,9 @@ bool GameInteractor::RawAction::CheckFlag(int16_t flagType, int16_t flag) { return Flags_GetRandomizerInf(static_cast(flag)); case FlagType::FLAG_GS_TOKEN: return GET_GS_FLAGS((flag & 0x1F00) >> 8); + default: + assert(false); + return false; } } diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index f0baa4c35..9467cb10e 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -547,27 +547,6 @@ u8 EnGm_RandoCanGetMedigoronItem() { !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); } -RandomizerCheck EnFr_RandomizerCheckFromSongIndex(u16 songIndex) { - switch (songIndex) { - case FROG_ZL: - return RC_ZR_FROGS_ZELDAS_LULLABY; - case FROG_EPONA: - return RC_ZR_FROGS_EPONAS_SONG; - case FROG_SARIA: - return RC_ZR_FROGS_SARIAS_SONG; - case FROG_SUNS: - return RC_ZR_FROGS_SUNS_SONG; - case FROG_SOT: - return RC_ZR_FROGS_SONG_OF_TIME; - case FROG_STORMS: - return RC_ZR_FROGS_IN_THE_RAIN; - case FROG_CHOIR_SONG: - return RC_ZR_FROGS_OCARINA_GAME; - default: - return RC_UNKNOWN_CHECK; - } -} - void RandomizerSetChestGameRandomizerInf(RandomizerCheck rc) { switch (rc) { case RC_MARKET_TREASURE_CHEST_GAME_ITEM_1: 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 5bef60ef9..41ababe85 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 @@ -32,13 +32,7 @@ void ObjRoomtimer_Init(Actor* thisx, PlayState* play) { ObjRoomtimer* this = (ObjRoomtimer*)thisx; s16 params = this->actor.params; - // Shabom room in Jabu Jabu has a lengthened timer in Enemy Randomizer. Flag doesn't match what the game - // expects. Instead set it back to the same flag as what it would be in vanilla. - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0) && play->sceneNum == SCENE_JABU_JABU && play->roomCtx.curRoom.num == 12) { - this->switchFlag = 30; - } else { - this->switchFlag = (params >> 10) & 0x3F; - } + this->switchFlag = (params >> 10) & 0x3F; this->actor.params = params & 0x3FF; params = this->actor.params; From ae5e41f7a06e1decbbe0e3b118d2e257a9021a79 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 21 Mar 2025 04:32:46 -0700 Subject: [PATCH 121/267] Fix Dungeon Spoiling in Trackers (#5168) * Prevent spoiling dungeons in check and item trackers if MQ is set to Selection, but selection for specific dungeon is Random. * Account for other options using "Set Dungeon Quests". --- .../Enhancements/randomizer/randomizer_check_tracker.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index c51650bbd..62a4793e2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -483,9 +483,13 @@ void CheckTrackerLoadGame(int32_t fileNum) { for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) { if (!IsAreaSpoiled(static_cast(i)) && (RandomizerCheckObjects::AreaIsOverworld(static_cast(i)) || !IS_RANDO || OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SELECTION || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SELECTION && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_SET) == RO_GENERIC_ON && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12))) { + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12 || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 0)))) { SetAreaSpoiled(static_cast(i)); } } From 983c075a3328b1071a885110473bbf0352650584 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:53:17 +0100 Subject: [PATCH 122/267] Overworld Key Tracker (#5164) * Overworld Keys Tracker * Update randomizer_item_tracker.cpp * Fix id collision * Post-merge fixes * Update soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp Co-authored-by: Archez --------- Co-authored-by: Archez --- soh/CMakeLists.txt | 1 + .../Enhancements/randomizer/randomizerTypes.h | 2 + .../randomizer/randomizer_item_tracker.cpp | 224 +++++++++++++++++- soh/soh/util.cpp | 26 ++ 4 files changed, 246 insertions(+), 7 deletions(-) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index b4ee6ed7f..7277b2dfb 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -440,6 +440,7 @@ if(MSVC) /Gy; /W3 > + /bigobj; /sdl-; /permissive-; /MP; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index e2581a634..23cbb290f 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3368,6 +3368,8 @@ typedef enum { RG_HOOKSHOT, RG_LONGSHOT, RG_SCARECROW, + + //Overworld keys RG_GUARD_HOUSE_KEY, RG_MARKET_BAZAAR_KEY, RG_MARKET_POTION_SHOP_KEY, diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 92c7491fc..13046874f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -107,11 +107,40 @@ std::vector bossSoulItems = { std::vector ocarinaButtonItems = { //Hack for right now, just gonna draw ocarina buttons as ocarinas. //Will replace with other macro once we have a custom texture - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem ), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), +}; + +std::vector overworldKeyItems = { + // Hack for right now, just gonna overworld keys as dungeon keys. + // Will replace with other macro once we have a custom texture + ITEM_TRACKER_ITEM_CUSTOM(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_WINDMILL_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_STABLES_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), }; std::vector fishingPoleItems = { @@ -208,6 +237,33 @@ std::map itemTrackerOcarinaButtonShortNames = { { RG_OCARINA_C_RIGHT_BUTTON, "C-R"}, }; +std::map itemTrackerOverworldKeyShortNames = { + { RG_GUARD_HOUSE_KEY, "GUARD" }, + { RG_MARKET_BAZAAR_KEY, "MKBAZ" }, + { RG_MARKET_POTION_SHOP_KEY, "MKPOT" }, + { RG_MASK_SHOP_KEY, "MASK" }, + { RG_MARKET_SHOOTING_GALLERY_KEY, "MKSHO" }, + { RG_BOMBCHU_BOWLING_KEY, "BOWL" }, + { RG_TREASURE_CHEST_GAME_BUILDING_KEY, "TREASU" }, + { RG_BOMBCHU_SHOP_KEY, "CHUSHO" }, + { RG_RICHARDS_HOUSE_KEY, "RICH" }, + { RG_ALLEY_HOUSE_KEY, "ALLEY" }, + { RG_KAK_BAZAAR_KEY, "KAKBAZ" }, + { RG_KAK_POTION_SHOP_KEY, "KAKPO" }, + { RG_BOSS_HOUSE_KEY, "BOSS" }, + { RG_GRANNYS_POTION_SHOP_KEY, "GRANNY" }, + { RG_SKULLTULA_HOUSE_KEY, "SKULL" }, + { RG_IMPAS_HOUSE_KEY, "IMPAS" }, + { RG_WINDMILL_KEY, "WIND" }, + { RG_KAK_SHOOTING_GALLERY_KEY, "KAKSHO" }, + { RG_DAMPES_HUT_KEY, "DAMPES" }, + { RG_TALONS_HOUSE_KEY, "TALONS" }, + { RG_STABLES_KEY, "STABLE" }, + { RG_BACK_TOWER_KEY, "TOWER" }, + { RG_HYLIA_LAB_KEY, "LAB" }, + { RG_FISHING_HOLE_KEY, "FISH" }, +}; + std::vector dungeonItems = {}; std::unordered_map actualItemTrackerItemMap = { @@ -645,7 +701,9 @@ void DrawItem(ItemTrackerItem item) { bool hasItem = actualItemId != ITEM_NONE; std::string itemName = ""; - if (item.id == ITEM_NONE) { + // Hack fix as RG_MARKET_SHOOTING_GALLERY_KEY is RandomizerGet #255 which collides + // with ITEM_NONE (ItemId #255) due to the lack of a modid to separate them + if (item.name != "ITEM_KEY_SMALL" && item.id == ITEM_NONE) { return; } @@ -732,7 +790,6 @@ void DrawItem(ItemTrackerItem item) { actualItemId = item.id; hasItem = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS) == RO_BOSS_SOULS_ON_PLUS_GANON ? Flags_GetRandomizerInf(RAND_INF_GANON_SOUL) : true; - itemName = "Ganon's Soul"; break; @@ -766,6 +823,127 @@ void DrawItem(ItemTrackerItem item) { hasItem = IS_RANDO && Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND); itemName = "Fishing Pole"; break; + + case RG_GUARD_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_GUARD_HOUSE_KEY_OBTAINED); + itemName = "Guard House Key"; + break; + case RG_MARKET_BAZAAR_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MARKET_BAZAAR_KEY_OBTAINED); + itemName = "Market Bazaar Key"; + break; + case RG_MARKET_POTION_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED); + itemName = "Market Potion Shop Key"; + break; + case RG_MASK_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MASK_SHOP_KEY_OBTAINED); + itemName = "Mask Shop Key"; + break; + case RG_MARKET_SHOOTING_GALLERY_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED); + itemName = "Market Shooting Gallery Key"; + break; + case RG_BOMBCHU_BOWLING_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED); + itemName = "Bombchu Bowling Key"; + break; + case RG_TREASURE_CHEST_GAME_BUILDING_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED); + itemName = "Treasure Chest Game Building Key"; + break; + case RG_BOMBCHU_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED); + itemName = "Bombchu Shop Key"; + break; + case RG_RICHARDS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED); + itemName = "Richards House Key"; + break; + case RG_ALLEY_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_ALLEY_HOUSE_KEY_OBTAINED); + itemName = "Alley House Key"; + break; + case RG_KAK_BAZAAR_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KAK_BAZAAR_KEY_OBTAINED); + itemName = "Kak Bazaar Key"; + break; + case RG_KAK_POTION_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED); + itemName = "Kak Potion Shop Key"; + break; + case RG_BOSS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BOSS_HOUSE_KEY_OBTAINED); + itemName = "Boss House Key"; + break; + case RG_GRANNYS_POTION_SHOP_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED); + itemName = "Granny's Potion Shop Key"; + break; + case RG_SKULLTULA_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED); + itemName = "Skulltula House Key"; + break; + case RG_IMPAS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_IMPAS_HOUSE_KEY_OBTAINED); + itemName = "Impa's House Key"; + break; + case RG_WINDMILL_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_WINDMILL_KEY_OBTAINED); + itemName = "Windmill Key"; + break; + case RG_KAK_SHOOTING_GALLERY_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED); + itemName = "Kak Shooting Gallery Key"; + break; + case RG_DAMPES_HUT_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_DAMPES_HUT_KEY_OBTAINED); + itemName = "Dampé's Hut Key"; + break; + case RG_TALONS_HOUSE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_TALONS_HOUSE_KEY_OBTAINED); + itemName = "Talon's House Key"; + break; + case RG_STABLES_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_STABLES_KEY_OBTAINED); + itemName = "Stables Key"; + break; + case RG_BACK_TOWER_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BACK_TOWER_KEY_OBTAINED); + itemName = "Back Tower Key"; + break; + case RG_HYLIA_LAB_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_HYLIA_LAB_KEY_OBTAINED); + itemName = "Hylia Lab Key"; + break; + case RG_FISHING_HOLE_KEY: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_FISHING_HOLE_KEY_OBTAINED); + itemName = "Fishing Hole Key"; + break; } if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { @@ -797,6 +975,15 @@ void DrawItem(ItemTrackerItem item) { ImGui::PopStyleColor(); } + if (item.id >= RG_GUARD_HOUSE_KEY && item.id <= RG_FISHING_HOLE_KEY) { + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string overworldKeyName = itemTrackerOverworldKeyShortNames[item.id]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(overworldKeyName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); + ImGui::Text("%s", overworldKeyName.c_str()); + ImGui::PopStyleColor(); + } + ImGui::EndGroup(); if (itemName == "") { @@ -1189,6 +1376,17 @@ void UpdateVectors() { mainWindowItems.insert(mainWindowItems.end(), ocarinaButtonItems.begin(), ocarinaButtonItems.end()); } + //If we're adding overworld keys to the main window... + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) { + //...add empty items on the main window to get the keys on their own row. (Too many to sit with Greg/Triforce pieces/boss souls/ocarina buttons) + while (mainWindowItems.size() % 6) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + + //Add overworld keys + mainWindowItems.insert(mainWindowItems.end(), overworldKeyItems.begin(), overworldKeyItems.end()); + } + shouldUpdateVectors = false; } @@ -1333,6 +1531,12 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + BeginFloatingWindows("Overworld Key Tracker"); + DrawItemsInRows(overworldKeyItems); + EndFloatingWindows(); + } + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Fishing Pole Tracker"); DrawItemsInRows(fishingPoleItems); @@ -1516,6 +1720,12 @@ void ItemTrackerSettingsWindow::DrawElement() { shouldUpdateVectors = true; } + if (CVarCombobox("Overworld Keys", CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), displayTypes, ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + shouldUpdateVectors = true; + } + if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, ComboboxOptions() .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignments::Right) .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp index 4eeaa16fd..7d3189107 100644 --- a/soh/soh/util.cpp +++ b/soh/soh/util.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "Enhancements/randomizer/randomizerTypes.h" std::vector sceneNames = { @@ -341,18 +343,42 @@ std::array rcareaPrefixes = { }; const std::string& SohUtils::GetSceneName(int32_t scene) { + if (scene > sceneNames.size()) { + SPDLOG_WARN("Passed invalid scene id to SohUtils::GetSceneName: ({})", scene); + assert(false); + return ""; + } + return sceneNames[scene]; } const std::string& SohUtils::GetItemName(int32_t item) { + if (item > itemNames.size()) { + SPDLOG_WARN("Passed invalid item id to SohUtils::GetItemName: ({})", item); + assert(false); + return ""; + } + return itemNames[item]; } const std::string& SohUtils::GetQuestItemName(int32_t item) { + if (item > questItemNames.size()) { + SPDLOG_WARN("Passed invalid quest item id to SohUtils::GetQuestItemName: ({})", item); + assert(false); + return ""; + } + return questItemNames[item]; } const std::string& SohUtils::GetRandomizerCheckAreaPrefix(int32_t rcarea) { + if (rcarea > rcareaPrefixes.size()) { + SPDLOG_WARN("Passed invalid rcarea to SohUtils::GetRandomizerCheckAreaPrefix: ({})", rcarea); + assert(false); + return ""; + } + return rcareaPrefixes[rcarea]; } From 69a32ffba671b1bc55b4bbc9b13040687abe40ec Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 21 Mar 2025 10:42:59 -0700 Subject: [PATCH 123/267] Restore combobox functionality to Bunny Hood Effect (#5167) * Restore combobox functionality to Bunny Hood Effect, and tweak the tooltip. * Tweak the description a bit more. * Final tweak? --- soh/soh/SohGui/SohMenuEnhancements.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 2e0cb55af..ad12c92aa 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -10,6 +10,7 @@ static std::string comboboxTooltip = ""; static int32_t enhancementPresetSelected = ENHANCEMENT_PRESET_DEFAULT; bool isBetaQuestEnabled = false; +static std::unordered_map bunnyHoodEffectMap = {{ BUNNY_HOOD_VANILLA, "Vanilla" }, { BUNNY_HOOD_FAST, "Faster Run" }, { BUNNY_HOOD_FAST_AND_JUMP, "Faster + Longer Jump" }}; extern "C" { void enableBetaQuest() { isBetaQuestEnabled = true; } @@ -678,10 +679,11 @@ void SohMenu::AddMenuEnhancements() { " - Not within range of Ocarina Playing spots.")); AddWidget(path, "Masks", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_ENHANCEMENT("MMBunnyHood")) - .Options(CheckboxOptions().Tooltip("Wearing the Bunny Hood grants a speed increase link in Majora's Mask. " - "The longer jump option is not accounted for in Randomizer logic.\n\n" + .Options(ComboboxOptions().ComboMap(bunnyHoodEffectMap).Tooltip("Wearing the Bunny Hood grants a speed and jump boost like in Majora's Mask.\n" + "Can also be limited to only the speed boost.\n" + "The effects of either option are not accounted for in Randomizer logic.\n" "Also disables NPC's reactions to wearing the Bunny Hood.")); AddWidget(path, "Masks Equippable as Adult", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("AdultMasks")) From 9ffe2ab2b9df73205b0e51de130f54517ce5d943 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sat, 22 Mar 2025 16:51:59 -0700 Subject: [PATCH 124/267] Some cleanup (#5183) * Resolve size_t conversion warnings in UIWidgets.hpp * Change "Better Debug Warp Menu" to default on. * Change All/None checkboxes (for item counts and cutscene skips) to buttons. * Remove all/none for item counts. Remove arrays for item counts, create widgets directly. --- soh/soh/SohGui/SohMenu.h | 12 --- soh/soh/SohGui/SohMenuDevTools.cpp | 2 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 77 ++++++++----------- soh/soh/SohGui/UIWidgets.hpp | 8 +- .../overlays/gamestates/ovl_select/z_select.c | 4 +- 5 files changed, 37 insertions(+), 66 deletions(-) diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h index dacb98936..9b65e2e79 100644 --- a/soh/soh/SohGui/SohMenu.h +++ b/soh/soh/SohGui/SohMenu.h @@ -196,18 +196,6 @@ static const std::unordered_map enhancementPresetList = { { ENHANCEMENT_PRESET_RANDOMIZER, "Randomizer" } }; -static const char* itemCountMessageCVars[3] = { - CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), - CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), - CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), -}; - -static const char* itemCountMessageOptions[ARRAY_COUNT(itemCountMessageCVars)] = { - "Gold Skulltula Tokens", - "Pieces of Heart", - "Heart Containers", -}; - class SohMenu : public Ship::Menu { public: SohMenu(const std::string& consoleVariable, const std::string& name); diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index 53d866a8e..6e7b71eae 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -42,7 +42,7 @@ void SohMenu::AddMenuDevTools() { AddWidget(path, "Better Debug Warp Screen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen")) .Options(CheckboxOptions().Tooltip( - "Optimized debug warp screen, with the added ability to chose entrances and time of day")); + "Optimized debug warp screen, with the added ability to chose entrances and time of day").DefaultValue(true)); AddWidget(path, "Debug Warp Screen Translation", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation")) .Options(CheckboxOptions() diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index ad12c92aa..eb64859e6 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -191,26 +191,9 @@ void SohMenu::AddMenuEnhancements() { .Tooltip("Buffers your inputs to be executed a specified amount of frames later.")); AddWidget(path, "Item Count Messages", WIDGET_SEPARATOR_TEXT); - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - bool allItemCountsChecked = false; - AddWidget(path, "All", WIDGET_CHECKBOX) - .ValuePointer(&allItemCountsChecked) - .PreFunc([](WidgetInfo& info) { - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - *std::get(info.valuePointer) = std::all_of(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [](const char* cvar) { return CVarGetInteger(cvar, 0); }); - }) - .Callback([](WidgetInfo& info) { - int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; - int numOptions = ARRAY_COUNT(itemCountMessageCVars); - std::for_each(itemCountMessageCVars, itemCountMessageCVars + numOptions, - [newValue](const char* cvar) { CVarSetInteger(cvar, newValue); }); - - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - }); - for (int i = 0; i < numOptions; i++) { - AddWidget(path, itemCountMessageOptions[i], WIDGET_CVAR_CHECKBOX).CVar(itemCountMessageCVars[i]); - } + AddWidget(path, "Gold Skulltula Tokens", WIDGET_CVAR_CHECKBOX).CVar(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula")); + AddWidget(path, "Pieces of Heart", WIDGET_CVAR_CHECKBOX).CVar(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece")); + AddWidget(path, "Heart Containers", WIDGET_CVAR_CHECKBOX).CVar(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer")); path.column = SECTION_COLUMN_3; AddWidget(path, "Misc", WIDGET_SEPARATOR_TEXT); @@ -266,35 +249,35 @@ void SohMenu::AddMenuEnhancements() { path.column = SECTION_COLUMN_1; AddWidget(path, "Cutscenes", WIDGET_SEPARATOR_TEXT); - bool allSkipsChecked = false; - AddWidget(path, "Skip All", WIDGET_CHECKBOX) - .ValuePointer(&allSkipsChecked) - .PreFunc([](WidgetInfo& info) { - *std::get(info.valuePointer) = - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), IS_RANDO); - }) + AddWidget(path, "All##Skips", WIDGET_BUTTON) + .Options(ButtonOptions().Size(Sizes::Inline)) .Callback([](WidgetInfo& info) { - int32_t newValue = *std::get(info.valuePointer) ? 1 : 0; + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), true); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), true); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), newValue); - CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), newValue); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + }); + AddWidget(path, "None##Skips", WIDGET_BUTTON).SameLine(true) + .Options(ButtonOptions().Size(Sizes::Inline)) + .Callback([](WidgetInfo& info) { + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), false); + CVarSetInteger(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), false); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); }); diff --git a/soh/soh/SohGui/UIWidgets.hpp b/soh/soh/SohGui/UIWidgets.hpp index 325795023..46efce63a 100644 --- a/soh/soh/SohGui/UIWidgets.hpp +++ b/soh/soh/SohGui/UIWidgets.hpp @@ -534,9 +534,9 @@ namespace UIWidgets { PushStyleCombobox(options.color); const char* longest; - int length = 0; + size_t length = 0; for (auto& [index, string] : comboMap) { - int len = strlen(string); + size_t len = strlen(string); if (len > length) { longest = string; length = len; @@ -781,9 +781,9 @@ namespace UIWidgets { PushStyleCombobox(options.color); const char* longest; - int length = 0; + size_t length = 0; for (size_t i = 0; i < N; i++) { - int len = strlen(comboArray[i]); + size_t len = strlen(comboArray[i]); if (len > length) { longest = comboArray[i]; length = len; diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index f1899d27c..532829cbd 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -1535,7 +1535,7 @@ void Select_Draw(SelectContext* this) { void Select_Main(GameState* thisx) { SelectContext* this = (SelectContext*)thisx; - if (this->isBetterWarp != CVarGetInteger(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen"), 0)) { + if (this->isBetterWarp != CVarGetInteger(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen"), 1)) { Select_SwitchBetterWarpMode(this, !this->isBetterWarp); } @@ -1641,5 +1641,5 @@ void Select_Init(GameState* thisx) { CVarClear(CVAR_GENERAL("BetterDebugWarpScreenMQMode")); CVarClear(CVAR_GENERAL("BetterDebugWarpScreenMQModeScene")); - Select_SwitchBetterWarpMode(this, CVarGetInteger(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen"), 0)); + Select_SwitchBetterWarpMode(this, CVarGetInteger(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen"), 1)); } From 2564721b2c22c2d3c80ed1bdfcfac690a308eb1b Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 23 Mar 2025 09:42:34 -0700 Subject: [PATCH 125/267] Change default index retrieval to `sidebarOrder` vectors. (#5189) --- soh/soh/SohGui/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index 955b048d6..63fdca5a9 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -727,7 +727,7 @@ void Menu::DrawElement() { std::string sectionIndex = CVarGetString(sidebarCvar, ""); if (!sidebar->contains(sectionIndex)) { - sectionIndex = sidebar->begin()->first; + sectionIndex = menuEntries.at(headerIndex).sidebarOrder.at(0); } float sectionCenterX = pos.x + (sidebarWidth / 2); float topY = pos.y; From 45b8f228d974dd90a7ce87a7f32d5722ee63c977 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sun, 23 Mar 2025 14:07:12 -0400 Subject: [PATCH 126/267] Remove MenuOptionIndex Middleman and fix rando presets (#5185) * Remove CVar Middleman and fix rando presets * Throwing in a couple of typo corrections --- soh/soh/Enhancements/presets.cpp | 3 -- soh/soh/Enhancements/randomizer/option.cpp | 34 ++++--------------- soh/soh/Enhancements/randomizer/option.h | 22 +----------- .../Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/Enhancements/randomizer/settings.cpp | 17 ++-------- soh/soh/Enhancements/randomizer/settings.h | 7 ---- soh/soh/OTRGlobals.cpp | 1 - soh/soh/SohGui/SohMenuEnhancements.cpp | 4 +-- 8 files changed, 13 insertions(+), 77 deletions(-) diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/presets.cpp index c8760caca..3c542762f 100644 --- a/soh/soh/Enhancements/presets.cpp +++ b/soh/soh/Enhancements/presets.cpp @@ -75,9 +75,6 @@ void DrawPresetSelector(PresetType presetTypeId) { } CVarSetInteger(presetTypeCvar.c_str(), selectedPresetId); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - if (presetTypeId == PRESET_TYPE_RANDOMIZER){ - Rando::Settings::GetInstance()->ReloadOptions(); - } } UIWidgets::PopStyleButton(); } diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index 64ca107c5..84fc4c28b 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -62,8 +62,8 @@ const std::string& Option::GetDescription() const { return description; } -uint8_t Option::GetMenuOptionIndex() const { - return menuSelection; +uint8_t Option::GetOptionIndex() const { + return CVarGetInteger(cvarName.c_str(), defaultOption); } const std::string& Option::GetOptionText(size_t index) const { @@ -74,18 +74,6 @@ const std::string& Option::GetCVarName() const { return cvarName; } -void Option::SaveCVar() const { - if (!cvarName.empty()) { - CVarSetInteger(cvarName.c_str(), GetMenuOptionIndex()); - } -} - -void Option::SetFromCVar() { - if (!cvarName.empty()) { - SetMenuIndex(CVarGetInteger(cvarName.c_str(), defaultOption)); - } -} - void Option::SetDelayedOption() { delayedSelection = contextSelection; } @@ -94,13 +82,6 @@ void Option::RestoreDelayedOption() { contextSelection = delayedSelection; } -void Option::SetMenuIndex(size_t idx) { - menuSelection = idx; - if (menuSelection > options.size() - 1) { - menuSelection = options.size() - 1; - } -} - void Option::SetContextIndex(size_t idx) { // TODO: Set to Context's OptionValue array. contextSelection = idx; @@ -122,8 +103,8 @@ bool Option::IsHidden() const { } void Option::ChangeOptions(std::vector opts) { - if (menuSelection >= opts.size()) { - menuSelection = opts.size() - 1; + if (GetOptionIndex() >= opts.size()) { + CVarSetInteger(cvarName.c_str(), opts.size() - 1); } options = std::move(opts); } @@ -202,10 +183,9 @@ Option::Option(size_t key_, std::string name_, std::vector options_ : 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; + contextSelection = defaultOption; hidden = defaultHidden; PopulateTextToNum(); - SetFromCVar(); } bool Option::RenderCheckbox() { @@ -245,10 +225,9 @@ bool Option::RenderCombobox() { bool Option::RenderSlider() { bool changed = false; - int val = GetMenuOptionIndex(); + int val = CVarGetInteger(cvarName.c_str(), defaultOption); if (val > options.size() - 1) { val = options.size() - 1; - CVarSetInteger(cvarName.c_str(), val); changed = true; } UIWidgets::IntSliderOptions widgetOptions = UIWidgets::IntSliderOptions().Color(THEME_COLOR).Min(0).Max(options.size() - 1).Tooltip(description.c_str()).Format(options[val].c_str()).DefaultValue(defaultOption); @@ -266,7 +245,6 @@ bool Option::RenderSlider() { } if (changed) { CVarSetInteger(cvarName.c_str(), val); - SetFromCVar(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } return changed; diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index 518487219..3b1ae8521 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -225,19 +225,7 @@ class Option { * * @return uint8_t */ - uint8_t GetMenuOptionIndex() const; - - /** - * @brief Sets the CVar corresponding to the property `cvarName` equal to the value - * of the property `selectedValue`. - */ - void SaveCVar() const; - - /** - * @brief Sets the value of property `selectedValue` equal to the CVar corresponding - * to the property `cvarName`. - */ - void SetFromCVar(); + uint8_t GetOptionIndex() const; /** * @brief Set the delayedOption to the currently selected index so it can be restored later. @@ -249,13 +237,6 @@ class Option { */ void RestoreDelayedOption(); - /** - * @brief Set the menu index for this Option. Also calls `SetVariable()`. - * - * @param idx the index to set as the selected index. - */ - void SetMenuIndex(size_t idx); - /** * @brief Set the rando context index for this Option. Also calls `SetVariable()`. * @@ -344,7 +325,6 @@ protected: void PopulateTextToNum(); std::string name; std::vector options; - uint8_t menuSelection = 0; uint8_t contextSelection = 0; uint8_t delayedSelection = 0; bool hidden = false; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 244afb9c4..4b88d7e2a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1871,7 +1871,6 @@ 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 - Rando::Settings::GetInstance()->SetAllFromCVar(); Rando::Settings::GetInstance()->SetAllToContext(); // todo: this efficently when we build out cvar array support @@ -1972,6 +1971,7 @@ void RandomizerSettingsWindow::DrawElement() { } CVarSetInteger(presetTypeCvar.c_str(), randomizerPresetSelected); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + mSettings->UpdateOptionProperties(); } UIWidgets::Spacer(0); diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index a2bf3660d..2e6a61e89 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1147,12 +1147,6 @@ const OptionGroup& Settings::GetOptionGroup(const RandomizerSettingGroupKey key) return mOptionGroups[key]; } -void Settings::SetAllFromCVar() { - for (auto& option : mOptions) { - option.SetFromCVar(); - } -} - void Settings::UpdateOptionProperties() { // Default to hiding bridge opts and the extra sliders. mOptions[RSK_RAINBOW_BRIDGE].AddFlag(IMFLAG_SEPARATOR_BOTTOM); @@ -2222,11 +2216,6 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { } } -void Settings::ReloadOptions() { - for (int i = 0; i < RSK_MAX; i++) { - mOptions[i].SetFromCVar(); - } -} void Settings::AssignContext(std::shared_ptr ctx) { mContext = ctx; } @@ -2237,13 +2226,13 @@ void Settings::ClearContext() { void Settings::SetAllToContext() { for (int i = 0; i < RSK_MAX; i++) { - mContext->GetOption(static_cast(i)).Set(mOptions[i].GetMenuOptionIndex()); + mContext->GetOption(static_cast(i)).Set(mOptions[i].GetOptionIndex()); } for (int i = 0; i < RT_MAX; i++) { - mContext->GetTrickOption(static_cast(i)).Set(mTrickOptions[i].GetMenuOptionIndex()); + mContext->GetTrickOption(static_cast(i)).Set(mTrickOptions[i].GetOptionIndex()); } for (int i = 0; i < RC_MAX; i++) { - mContext->GetItemLocation(i)->SetExcludedOption(StaticData::GetLocation(static_cast(i))->GetExcludedOption()->GetMenuOptionIndex()); + mContext->GetItemLocation(i)->SetExcludedOption(StaticData::GetLocation(static_cast(i))->GetExcludedOption()->GetOptionIndex()); } } diff --git a/soh/soh/Enhancements/randomizer/settings.h b/soh/soh/Enhancements/randomizer/settings.h index 6810b6832..271774c40 100644 --- a/soh/soh/Enhancements/randomizer/settings.h +++ b/soh/soh/Enhancements/randomizer/settings.h @@ -88,12 +88,6 @@ class Settings { */ const OptionGroup& GetOptionGroup(RandomizerSettingGroupKey key); - /** - * @brief sets the `selectedOption` of all Options to the value of the CVar - * corresponding to their `cvarName`s. - */ - void SetAllFromCVar(); - /** * @brief Updates various properties of options based on the value of other options. * Used to update visibility, whether or not interaction is disabled, and what the @@ -113,7 +107,6 @@ class Settings { */ void ParseJson(nlohmann::json spoilerFileJson); std::map> mTricksByArea = {}; - void ReloadOptions(); /** * @brief Assigns a Rando::Context instance to this settings instance diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 3690e8648..3809a2ac6 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2514,7 +2514,6 @@ 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(); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index eb64859e6..85cbc6734 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -904,7 +904,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Removes the Dungeon Entrance icon on the top-left corner of the screen when no dungeon is present on the " "current map.")); - AddWidget(path, "Fix Two-Handled Idle Animations", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Fix Two-Handed Idle Animations", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("TwoHandedIdle")) .Options(CheckboxOptions().Tooltip( "Re-Enables the two-handed idle animation, a seemingly finished animation that was disabled on accident " @@ -975,7 +975,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Restore pre-release behavior where defeating a Gold Skulltula will play a cutscene showing it die.")); AddWidget(path, "Pulsate Boss Icon", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("Pulsate Boss Icon")) + .CVar(CVAR_ENHANCEMENT("PulsateBossIcon")) .Options(CheckboxOptions().Tooltip( "Restores an unfinished feature to pulsate the boss room icon when you are in the boss room.")); From e25058c25697c40b356f0a12bedc64fa10c3ffce Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 23 Mar 2025 21:34:06 -0700 Subject: [PATCH 127/267] Fix sleeping waterfall enhancement and rando option combinations. (#5199) --- .../Enhancements/timesaver_hook_handlers.cpp | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 1db34b4f6..78b43ae2a 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -880,23 +880,12 @@ void TimeSaverOnActorInitHandler(void* actorRef) { return; } - bool shouldKeepOpen; - switch (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 0)) { - case 1: - shouldKeepOpen = Flags_GetEventChkInf(EVENTCHKINF_OPENED_ZORAS_DOMAIN); - break; - case 2: - if (IS_RANDO && RAND_GET_OPTION(RSK_SLEEPING_WATERFALL) == RO_WATERFALL_OPEN) { - shouldKeepOpen = true; - } else { - shouldKeepOpen = CHECK_QUEST_ITEM(QUEST_SONG_LULLABY) && - (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME || - INV_CONTENT(ITEM_OCARINA_FAIRY) == ITEM_OCARINA_FAIRY); - } - break; - default: - shouldKeepOpen = false; - break; + bool shouldKeepOpen = RAND_GET_OPTION(RSK_SLEEPING_WATERFALL) && IS_RANDO; + if (!shouldKeepOpen) { + bool enhancement = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 0); + shouldKeepOpen = (enhancement == 2 && ((CHECK_QUEST_ITEM(QUEST_SONG_LULLABY) && + (INV_CONTENT(ITEM_OCARINA_TIME) != ITEM_NONE)))) + || (enhancement == 1 && Flags_GetEventChkInf(EVENTCHKINF_OPENED_ZORAS_DOMAIN)); } if (!shouldKeepOpen) { From c7e3ef9e4dd86ea38a655eaecce850db8d7f8a03 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 23 Mar 2025 21:52:07 -0700 Subject: [PATCH 128/267] Wrong type for CVarGetInt on waterfall open enhancement. (#5200) --- soh/soh/Enhancements/timesaver_hook_handlers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 78b43ae2a..8e4e74fb4 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -882,7 +882,7 @@ void TimeSaverOnActorInitHandler(void* actorRef) { bool shouldKeepOpen = RAND_GET_OPTION(RSK_SLEEPING_WATERFALL) && IS_RANDO; if (!shouldKeepOpen) { - bool enhancement = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 0); + int enhancement = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 0); shouldKeepOpen = (enhancement == 2 && ((CHECK_QUEST_ITEM(QUEST_SONG_LULLABY) && (INV_CONTENT(ITEM_OCARINA_TIME) != ITEM_NONE)))) || (enhancement == 1 && Flags_GetEventChkInf(EVENTCHKINF_OPENED_ZORAS_DOMAIN)); From edd8561ddc3ffe155e6c63e37599274e977e70da Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Mon, 24 Mar 2025 03:46:22 -0400 Subject: [PATCH 129/267] assignable tunics/boots - dont throw items (#5045) * don't throw items when using assigned tunics/boots * didn't actually need that * simplify logic so we don't need to check for holding items * just use a vb should * fix comment --- .../Enhancements/AssignableTunicsAndBoots.cpp | 22 +++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 9 ++++++++ .../actors/ovl_player_actor/z_player.c | 6 +++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp index 3a52312c9..3b4b11686 100644 --- a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp +++ b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp @@ -87,6 +87,28 @@ void RegisterAssignableTunicsBoots() { } }); + // don't throw items when the pressed button is a tunic or boots + COND_VB_SHOULD(VB_THROW_OR_PUT_DOWN_HELD_ITEM, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { + // if the vanilla condition doesn't want us to throw/put down the item, early return + if (!*should) { + return; + } + + Input* input = va_arg(args, Input*); + + s32 item = ITEM_NONE; + for (s32 i = 0; i < ARRAY_COUNT(sItemButtons); i++) { + if (CHECK_BTN_ALL(input->press.button, sItemButtons[i])) { + item = Player_GetItemOnButton(gPlayState, i); + break; + } + } + + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { + *should = false; + } + }); + // do something when the player presses a button to use the tunics/boots COND_VB_SHOULD(VB_EXECUTE_PLAYER_ACTION_FUNC, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { // if the vanilla condition doesn't want us to run the actionFunc, don't do any of this diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index d6154347c..5d25bd12d 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1794,6 +1794,15 @@ typedef enum { // - `*ShotSun` VB_SPAWN_SONG_FAIRY, + // #### `result` + // ```c + // (this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) && (this->heldActor != NULL) && + // CHECK_BTN_ANY(sControlInput->press.button, buttonsToCheck) + // ``` + // #### `args` + // - `*Input` + VB_THROW_OR_PUT_DOWN_HELD_ITEM, + // #### `result` // ```c // true 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 1d9c89212..8acdee4a4 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -7436,8 +7436,10 @@ s32 Player_ActionHandler_9(Player* this, PlayState* play) { if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0) != 0) { buttonsToCheck |= BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT; } - if ((this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) && (this->heldActor != NULL) && - CHECK_BTN_ANY(sControlInput->press.button, buttonsToCheck)) { + if (GameInteractor_Should(VB_THROW_OR_PUT_DOWN_HELD_ITEM, ( + (this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) && (this->heldActor != NULL) && + CHECK_BTN_ANY(sControlInput->press.button, buttonsToCheck) + ), sControlInput)) { if (!func_80835644(play, this, this->heldActor)) { if (!func_8083EAF0(this, this->heldActor)) { Player_SetupAction(play, this, Player_Action_808464B0, 1); From 1053b0e0cf7f86b5d9d0fdc7e424a3ea9cb0cc59 Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Mon, 24 Mar 2025 00:56:08 -0700 Subject: [PATCH 130/267] Prefix icon paths with CMAKE_SOURCE_DIR (#5197) --- CMakeLists.txt | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7aa873c62..19703c989 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -231,7 +231,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux") find_package(ImageMagick COMPONENTS convert) if (ImageMagick_FOUND) execute_process ( - COMMAND ${ImageMagick_convert_EXECUTABLE} soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png + COMMAND ${ImageMagick_convert_EXECUTABLE} ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png -resize 512x512 ${CMAKE_BINARY_DIR}/sohIcon.png OUTPUT_VARIABLE outVar ) endif() @@ -240,16 +240,16 @@ endif() if(CMAKE_SYSTEM_NAME MATCHES "Darwin") add_custom_target(CreateOSXIcons COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/soh.iconset - COMMAND sips -z 16 16 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png - COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png - COMMAND sips -z 32 32 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png - COMMAND sips -z 64 64 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png - COMMAND sips -z 128 128 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png - COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png - COMMAND sips -z 256 256 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png - COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png - COMMAND sips -z 512 512 soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png - COMMAND cp soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png + COMMAND sips -z 16 16 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16.png + COMMAND sips -z 32 32 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_16x16@2x.png + COMMAND sips -z 32 32 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32.png + COMMAND sips -z 64 64 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_32x32@2x.png + COMMAND sips -z 128 128 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128.png + COMMAND sips -z 256 256 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_128x128@2x.png + COMMAND sips -z 256 256 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256.png + COMMAND sips -z 512 512 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_256x256@2x.png + COMMAND sips -z 512 512 ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png --out ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512.png + COMMAND cp ${CMAKE_SOURCE_DIR}/soh/macosx/sohIcon.png ${CMAKE_BINARY_DIR}/macosx/soh.iconset/icon_512x512@2x.png COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/soh.icns ${CMAKE_BINARY_DIR}/macosx/soh.iconset WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Creating OSX icons ..." From 9ae9dc49770d34acabd139bbf9e7a39249f9424b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Mon, 24 Mar 2025 08:11:45 +0000 Subject: [PATCH 131/267] Fix SFM wolfos logic (#5192) * Fix SFM logic SFM mixed child wolfos / adult moblin logic, making both incorrect In particular, Din's Fire is ineffective on Moblins, & slashing your way through them should not be in logic Adds trick for getting through SFM as adult without killing moblins Includes small cleanup elsewhere in logic * moblins not required --- .../randomizer/location_access/dungeons/deku_tree.cpp | 2 +- .../randomizer/location_access/overworld/castle_grounds.cpp | 2 +- .../location_access/overworld/sacred_forest_meadow.cpp | 2 +- .../overworld/{zora_river.cpp => zoras_river.cpp} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename soh/soh/Enhancements/randomizer/location_access/overworld/{zora_river.cpp => zoras_river.cpp} (98%) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 4740a7541..df47f0f42 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -216,7 +216,7 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), }, { //Exits - Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return true;}), + Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), Entrance(RR_DEKU_TREE_MQ_PAST_BOULDER_VINES, []{return Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS))) || (logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));});}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index b4b77056b..60aa8432f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -21,7 +21,7 @@ void RegionTable_Init_CastleGrounds() { }, { //Locations LOCATION(RC_HC_MALON_EGG, true), - LOCATION(RC_HC_GS_TREE, logic->IsChild && logic->CanAttack()), + LOCATION(RC_HC_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp index ecc0577e2..e09e9559b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp @@ -7,7 +7,7 @@ void RegionTable_Init_SacredForestMeadow() { areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_LW_BEYOND_MIDO, []{return true;}), - Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->CanJumpslash() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), + Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->IsAdult || logic->CanKillEnemy(RE_WOLFOS);}), Entrance(RR_SFM_WOLFOS_GROTTO, []{return logic->CanOpenBombGrotto();}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zora_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp similarity index 98% rename from soh/soh/Enhancements/randomizer/location_access/overworld/zora_river.cpp rename to soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index 16ac1b271..f12de9128 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zora_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -6,7 +6,7 @@ using namespace Rando; void RegionTable_Init_ZoraRiver() { areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanAttack()), + LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return logic->IsAdult || logic->BlastOrSmash();}), From 26aa36fe7bf24b57affb8b4fbb26e3ea4f899a70 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Mon, 24 Mar 2025 04:34:07 -0400 Subject: [PATCH 132/267] bump lus (#5187) * pushing what i have so i can try to figure out HW_REG errors * HW_REG (fix? workaround? either way it builds now) * factory fixes and shaders * bump again * bump again * copy shaders for `ExtractAssets` too (instead of just in `GenerateSohOtr`) --- CMakeLists.txt | 10 ++++++++++ libultraship | 2 +- soh/assets/.gitignore | 1 + soh/include/macros.h | 4 ++++ soh/soh/OTRGlobals.cpp | 2 +- soh/soh/resource/importer/AnimationFactory.cpp | 6 +++--- soh/soh/resource/importer/AnimationFactory.h | 2 +- soh/soh/resource/importer/ArrayFactory.cpp | 6 +++--- soh/soh/resource/importer/ArrayFactory.h | 2 +- soh/soh/resource/importer/AudioSampleFactory.cpp | 6 +++--- soh/soh/resource/importer/AudioSampleFactory.h | 2 +- soh/soh/resource/importer/AudioSequenceFactory.cpp | 6 +++--- soh/soh/resource/importer/AudioSequenceFactory.h | 2 +- soh/soh/resource/importer/AudioSoundFontFactory.cpp | 6 +++--- soh/soh/resource/importer/AudioSoundFontFactory.h | 2 +- soh/soh/resource/importer/BackgroundFactory.cpp | 6 +++--- soh/soh/resource/importer/BackgroundFactory.h | 2 +- soh/soh/resource/importer/CollisionHeaderFactory.cpp | 12 ++++++------ soh/soh/resource/importer/CollisionHeaderFactory.h | 4 ++-- soh/soh/resource/importer/CutsceneFactory.cpp | 6 +++--- soh/soh/resource/importer/CutsceneFactory.h | 2 +- soh/soh/resource/importer/PathFactory.cpp | 12 ++++++------ soh/soh/resource/importer/PathFactory.h | 4 ++-- soh/soh/resource/importer/PlayerAnimationFactory.cpp | 6 +++--- soh/soh/resource/importer/PlayerAnimationFactory.h | 2 +- soh/soh/resource/importer/SceneFactory.cpp | 12 ++++++------ soh/soh/resource/importer/SceneFactory.h | 4 ++-- soh/soh/resource/importer/SkeletonFactory.cpp | 12 ++++++------ soh/soh/resource/importer/SkeletonFactory.h | 4 ++-- soh/soh/resource/importer/SkeletonLimbFactory.cpp | 12 ++++++------ soh/soh/resource/importer/SkeletonLimbFactory.h | 4 ++-- soh/soh/resource/importer/TextFactory.cpp | 12 ++++++------ soh/soh/resource/importer/TextFactory.h | 4 ++-- 33 files changed, 97 insertions(+), 82 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 19703c989..2771ee8c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -199,6 +199,11 @@ find_package(Python3 COMPONENTS Interpreter) add_custom_target( ExtractAssets COMMAND ${CMAKE_COMMAND} -E rm -f oot.otr oot-mq.otr soh.otr + + # copy LUS default shaders into assets/custom + COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../soh/assets/xml --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter @@ -220,6 +225,11 @@ add_custom_target( add_custom_target( GenerateSohOtr COMMAND ${CMAKE_COMMAND} -E rm -f soh.otr + + # copy LUS default shaders into assets/custom + COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -DONLYSOHOTR=On -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter diff --git a/libultraship b/libultraship index 02bb77ef2..455b6dade 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 02bb77ef253e2de0969fd2cb36ad2e870677d18d +Subproject commit 455b6dadef901d586332d6015fd2fd01ff07b54c diff --git a/soh/assets/.gitignore b/soh/assets/.gitignore index d75078bf1..7a844a727 100644 --- a/soh/assets/.gitignore +++ b/soh/assets/.gitignore @@ -5,3 +5,4 @@ *.vtx.inc *.dlist.inc !*.png +custom/shaders diff --git a/soh/include/macros.h b/soh/include/macros.h index 302e3755d..325fb91b6 100644 --- a/soh/include/macros.h +++ b/soh/include/macros.h @@ -8,6 +8,10 @@ // #define __attribute__(x) // #endif +// this was removed from the LUS rcp.h in https://github.com/Kenix3/libultraship/pull/833/ +// it is still used in graph.c and fault.c +#define HW_REG(reg, type) *(volatile type*)((reg) | 0xA0000000) + // SoH [Port] Always use the AVOID_UB version (we don't set AVOID_UB while building yet) /* #ifndef AVOID_UB diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 3809a2ac6..5cdf06d9e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -909,7 +909,7 @@ OTRVersion ReadPortVersionFromOTR(std::string otrPath) { // Use a temporary archive instance to load the otr and read the version file auto archive = std::make_shared(otrPath); if (archive->Open()) { - auto t = archive->LoadFile("portVersion", std::make_shared()); + auto t = archive->LoadFile("portVersion"); if (t != nullptr && t->IsLoaded) { auto stream = std::make_shared(t->Buffer->data(), t->Buffer->size()); auto reader = std::make_shared(stream); diff --git a/soh/soh/resource/importer/AnimationFactory.cpp b/soh/soh/resource/importer/AnimationFactory.cpp index 13aa71c86..45b582035 100644 --- a/soh/soh/resource/importer/AnimationFactory.cpp +++ b/soh/soh/resource/importer/AnimationFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryAnimationV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryAnimationV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto animation = std::make_shared(file->InitData); + auto animation = std::make_shared(initData); auto reader = std::get>(file->Reader); AnimationType animType = (AnimationType)reader->ReadUInt32(); diff --git a/soh/soh/resource/importer/AnimationFactory.h b/soh/soh/resource/importer/AnimationFactory.h index ae27832b6..b77374602 100644 --- a/soh/soh/resource/importer/AnimationFactory.h +++ b/soh/soh/resource/importer/AnimationFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryAnimationV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/ArrayFactory.cpp b/soh/soh/resource/importer/ArrayFactory.cpp index 39be7c093..50e208a48 100644 --- a/soh/soh/resource/importer/ArrayFactory.cpp +++ b/soh/soh/resource/importer/ArrayFactory.cpp @@ -4,12 +4,12 @@ #include "graphic/Fast3D/lus_gbi.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryArrayV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryArrayV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto array = std::make_shared(file->InitData); + auto array = std::make_shared(initData); auto reader = std::get>(file->Reader); array->ArrayType = (ArrayResourceType)reader->ReadUInt32(); diff --git a/soh/soh/resource/importer/ArrayFactory.h b/soh/soh/resource/importer/ArrayFactory.h index b9f5ca75b..4497591c4 100644 --- a/soh/soh/resource/importer/ArrayFactory.h +++ b/soh/soh/resource/importer/ArrayFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryArrayV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace LUS diff --git a/soh/soh/resource/importer/AudioSampleFactory.cpp b/soh/soh/resource/importer/AudioSampleFactory.cpp index 0ec3f5260..8ef0b9657 100644 --- a/soh/soh/resource/importer/AudioSampleFactory.cpp +++ b/soh/soh/resource/importer/AudioSampleFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryAudioSampleV2::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryAudioSampleV2::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto audioSample = std::make_shared(file->InitData); + auto audioSample = std::make_shared(initData); auto reader = std::get>(file->Reader); audioSample->sample.codec = reader->ReadUByte(); diff --git a/soh/soh/resource/importer/AudioSampleFactory.h b/soh/soh/resource/importer/AudioSampleFactory.h index 372e8a310..5a1a9da3a 100644 --- a/soh/soh/resource/importer/AudioSampleFactory.h +++ b/soh/soh/resource/importer/AudioSampleFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryAudioSampleV2 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/AudioSequenceFactory.cpp b/soh/soh/resource/importer/AudioSequenceFactory.cpp index 35da7f798..a10ae7eee 100644 --- a/soh/soh/resource/importer/AudioSequenceFactory.cpp +++ b/soh/soh/resource/importer/AudioSequenceFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryAudioSequenceV2::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryAudioSequenceV2::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto audioSequence = std::make_shared(file->InitData); + auto audioSequence = std::make_shared(initData); auto reader = std::get>(file->Reader); audioSequence->sequence.seqDataSize = reader->ReadInt32(); diff --git a/soh/soh/resource/importer/AudioSequenceFactory.h b/soh/soh/resource/importer/AudioSequenceFactory.h index 35fd1ebef..71b1f713d 100644 --- a/soh/soh/resource/importer/AudioSequenceFactory.h +++ b/soh/soh/resource/importer/AudioSequenceFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryAudioSequenceV2 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/AudioSoundFontFactory.cpp b/soh/soh/resource/importer/AudioSoundFontFactory.cpp index 534a7914c..e5c637574 100644 --- a/soh/soh/resource/importer/AudioSoundFontFactory.cpp +++ b/soh/soh/resource/importer/AudioSoundFontFactory.cpp @@ -4,12 +4,12 @@ #include "libultraship/libultraship.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryAudioSoundFontV2::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryAudioSoundFontV2::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto audioSoundFont = std::make_shared(file->InitData); + auto audioSoundFont = std::make_shared(initData); auto reader = std::get>(file->Reader); audioSoundFont->soundFont.fntIndex = reader->ReadInt32(); diff --git a/soh/soh/resource/importer/AudioSoundFontFactory.h b/soh/soh/resource/importer/AudioSoundFontFactory.h index a80b8fe97..5db75aa66 100644 --- a/soh/soh/resource/importer/AudioSoundFontFactory.h +++ b/soh/soh/resource/importer/AudioSoundFontFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryAudioSoundFontV2 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/BackgroundFactory.cpp b/soh/soh/resource/importer/BackgroundFactory.cpp index 6be484698..e8902827f 100644 --- a/soh/soh/resource/importer/BackgroundFactory.cpp +++ b/soh/soh/resource/importer/BackgroundFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryBackgroundV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryBackgroundV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto background = std::make_shared(file->InitData); + auto background = std::make_shared(initData); auto reader = std::get>(file->Reader); uint32_t dataSize = reader->ReadUInt32(); diff --git a/soh/soh/resource/importer/BackgroundFactory.h b/soh/soh/resource/importer/BackgroundFactory.h index e74e897e9..587f750a1 100644 --- a/soh/soh/resource/importer/BackgroundFactory.h +++ b/soh/soh/resource/importer/BackgroundFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryBackgroundV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/CollisionHeaderFactory.cpp b/soh/soh/resource/importer/CollisionHeaderFactory.cpp index 4636d80c7..0c615fa87 100644 --- a/soh/soh/resource/importer/CollisionHeaderFactory.cpp +++ b/soh/soh/resource/importer/CollisionHeaderFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryCollisionHeaderV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryCollisionHeaderV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto collisionHeader = std::make_shared(file->InitData); + auto collisionHeader = std::make_shared(initData); auto reader = std::get>(file->Reader); collisionHeader->collisionHeaderData.minBounds.x = reader->ReadInt16(); @@ -123,12 +123,12 @@ std::shared_ptr ResourceFactoryBinaryCollisionHeaderV0::ReadRes return collisionHeader; } -std::shared_ptr ResourceFactoryXMLCollisionHeaderV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryXMLCollisionHeaderV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto collisionHeader = std::make_shared(file->InitData); + auto collisionHeader = std::make_shared(initData); auto reader = std::get>(file->Reader)->FirstChildElement(); auto child = reader->FirstChildElement(); diff --git a/soh/soh/resource/importer/CollisionHeaderFactory.h b/soh/soh/resource/importer/CollisionHeaderFactory.h index dd438f9c3..66702f33d 100644 --- a/soh/soh/resource/importer/CollisionHeaderFactory.h +++ b/soh/soh/resource/importer/CollisionHeaderFactory.h @@ -7,11 +7,11 @@ namespace SOH { class ResourceFactoryBinaryCollisionHeaderV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; class ResourceFactoryXMLCollisionHeaderV0 : public Ship::ResourceFactoryXML { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/CutsceneFactory.cpp b/soh/soh/resource/importer/CutsceneFactory.cpp index 49e44680c..63a5695e9 100644 --- a/soh/soh/resource/importer/CutsceneFactory.cpp +++ b/soh/soh/resource/importer/CutsceneFactory.cpp @@ -58,12 +58,12 @@ static inline uint32_t read_CMD_HH(std::shared_ptr reader) { } namespace SOH { -std::shared_ptr ResourceFactoryBinaryCutsceneV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryCutsceneV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto cutscene = std::make_shared(file->InitData); + auto cutscene = std::make_shared(initData); auto reader = std::get>(file->Reader); uint32_t numEntries = reader->ReadUInt32(); diff --git a/soh/soh/resource/importer/CutsceneFactory.h b/soh/soh/resource/importer/CutsceneFactory.h index 8afe98bb8..9eb5e1415 100644 --- a/soh/soh/resource/importer/CutsceneFactory.h +++ b/soh/soh/resource/importer/CutsceneFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryCutsceneV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/PathFactory.cpp b/soh/soh/resource/importer/PathFactory.cpp index f0f92be02..19c374c64 100644 --- a/soh/soh/resource/importer/PathFactory.cpp +++ b/soh/soh/resource/importer/PathFactory.cpp @@ -4,12 +4,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryPathV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryPathV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto path = std::make_shared(file->InitData); + auto path = std::make_shared(initData); auto reader = std::get>(file->Reader); path->numPaths = reader->ReadUInt32(); @@ -43,12 +43,12 @@ std::shared_ptr ResourceFactoryBinaryPathV0::ReadResource(std:: return path; } -std::shared_ptr ResourceFactoryXMLPathV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryXMLPathV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto path = std::make_shared(file->InitData); + auto path = std::make_shared(initData); auto reader = std::get>(file->Reader); auto pathElement = reader->RootElement(); diff --git a/soh/soh/resource/importer/PathFactory.h b/soh/soh/resource/importer/PathFactory.h index 9dd73b110..2cba7d219 100644 --- a/soh/soh/resource/importer/PathFactory.h +++ b/soh/soh/resource/importer/PathFactory.h @@ -7,11 +7,11 @@ namespace SOH { class ResourceFactoryBinaryPathV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; class ResourceFactoryXMLPathV0 : public Ship::ResourceFactoryXML { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/PlayerAnimationFactory.cpp b/soh/soh/resource/importer/PlayerAnimationFactory.cpp index 59610da46..76857b351 100644 --- a/soh/soh/resource/importer/PlayerAnimationFactory.cpp +++ b/soh/soh/resource/importer/PlayerAnimationFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryPlayerAnimationV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryPlayerAnimationV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto playerAnimation = std::make_shared(file->InitData); + auto playerAnimation = std::make_shared(initData); auto reader = std::get>(file->Reader); uint32_t numEntries = reader->ReadUInt32(); diff --git a/soh/soh/resource/importer/PlayerAnimationFactory.h b/soh/soh/resource/importer/PlayerAnimationFactory.h index 3ee8b1d3a..d7efb5035 100644 --- a/soh/soh/resource/importer/PlayerAnimationFactory.h +++ b/soh/soh/resource/importer/PlayerAnimationFactory.h @@ -6,6 +6,6 @@ namespace SOH { class ResourceFactoryBinaryPlayerAnimationV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/SceneFactory.cpp b/soh/soh/resource/importer/SceneFactory.cpp index 1bcf92e1c..b8cecf5b5 100644 --- a/soh/soh/resource/importer/SceneFactory.cpp +++ b/soh/soh/resource/importer/SceneFactory.cpp @@ -93,12 +93,12 @@ std::shared_ptr ResourceFactoryBinarySceneV0::ParseSceneCommand(s return result; } -std::shared_ptr ResourceFactoryBinarySceneV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinarySceneV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto scene = std::make_shared(file->InitData); + auto scene = std::make_shared(initData); auto reader = std::get>(file->Reader); ParseSceneCommands(scene, reader); @@ -216,12 +216,12 @@ std::shared_ptr ResourceFactoryXMLSceneV0::ParseSceneCommand(std: return result; } -std::shared_ptr ResourceFactoryXMLSceneV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryXMLSceneV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto scene = std::make_shared(file->InitData); + auto scene = std::make_shared(initData); auto reader = std::get>(file->Reader); ParseSceneCommands(scene, reader); diff --git a/soh/soh/resource/importer/SceneFactory.h b/soh/soh/resource/importer/SceneFactory.h index 115c3f3f5..52a4c42c9 100644 --- a/soh/soh/resource/importer/SceneFactory.h +++ b/soh/soh/resource/importer/SceneFactory.h @@ -12,7 +12,7 @@ class ResourceFactoryBinarySceneV0 : public Ship::ResourceFactoryBinary { public: ResourceFactoryBinarySceneV0(); - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; void ParseSceneCommands(std::shared_ptr scene, std::shared_ptr reader); // Doing something very similar to what we do on the ResourceLoader. @@ -28,7 +28,7 @@ class ResourceFactoryXMLSceneV0 : public Ship::ResourceFactoryXML { public: ResourceFactoryXMLSceneV0(); - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; void ParseSceneCommands(std::shared_ptr scene, std::shared_ptr reader); // Doing something very similar to what we do on the ResourceLoader. diff --git a/soh/soh/resource/importer/SkeletonFactory.cpp b/soh/soh/resource/importer/SkeletonFactory.cpp index d4cb965bf..e9545b978 100644 --- a/soh/soh/resource/importer/SkeletonFactory.cpp +++ b/soh/soh/resource/importer/SkeletonFactory.cpp @@ -4,12 +4,12 @@ #include namespace SOH { -std::shared_ptr ResourceFactoryBinarySkeletonV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinarySkeletonV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto skeleton = std::make_shared(file->InitData); + auto skeleton = std::make_shared(initData); auto reader = std::get>(file->Reader); skeleton->type = (SkeletonType)reader->ReadInt8(); @@ -62,12 +62,12 @@ std::shared_ptr ResourceFactoryBinarySkeletonV0::ReadResource(s return skeleton; } -std::shared_ptr ResourceFactoryXMLSkeletonV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryXMLSkeletonV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto skel = std::make_shared(file->InitData); + auto skel = std::make_shared(initData); auto reader = std::get>(file->Reader)->FirstChildElement(); auto child = reader->FirstChildElement(); diff --git a/soh/soh/resource/importer/SkeletonFactory.h b/soh/soh/resource/importer/SkeletonFactory.h index 24f92720a..33c1ea12b 100644 --- a/soh/soh/resource/importer/SkeletonFactory.h +++ b/soh/soh/resource/importer/SkeletonFactory.h @@ -7,11 +7,11 @@ namespace SOH { class ResourceFactoryBinarySkeletonV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; class ResourceFactoryXMLSkeletonV0 : public Ship::ResourceFactoryXML { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/SkeletonLimbFactory.cpp b/soh/soh/resource/importer/SkeletonLimbFactory.cpp index 3f780e6d4..4efdd66dc 100644 --- a/soh/soh/resource/importer/SkeletonLimbFactory.cpp +++ b/soh/soh/resource/importer/SkeletonLimbFactory.cpp @@ -4,12 +4,12 @@ #include "libultraship/libultraship.h" namespace SOH { -std::shared_ptr ResourceFactoryBinarySkeletonLimbV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinarySkeletonLimbV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto skeletonLimb = std::make_shared(file->InitData); + auto skeletonLimb = std::make_shared(initData); auto reader = std::get>(file->Reader); skeletonLimb->limbType = (LimbType)reader->ReadInt8(); @@ -184,12 +184,12 @@ std::shared_ptr ResourceFactoryBinarySkeletonLimbV0::ReadResour return skeletonLimb; } -std::shared_ptr ResourceFactoryXMLSkeletonLimbV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryXMLSkeletonLimbV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto skelLimb = std::make_shared(file->InitData); + auto skelLimb = std::make_shared(initData); auto reader = std::get>(file->Reader)->FirstChildElement(); std::string limbType = reader->Attribute("Type"); diff --git a/soh/soh/resource/importer/SkeletonLimbFactory.h b/soh/soh/resource/importer/SkeletonLimbFactory.h index 222cefa2c..cb5b9da22 100644 --- a/soh/soh/resource/importer/SkeletonLimbFactory.h +++ b/soh/soh/resource/importer/SkeletonLimbFactory.h @@ -7,11 +7,11 @@ namespace SOH { class ResourceFactoryBinarySkeletonLimbV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; class ResourceFactoryXMLSkeletonLimbV0 : public Ship::ResourceFactoryXML { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH diff --git a/soh/soh/resource/importer/TextFactory.cpp b/soh/soh/resource/importer/TextFactory.cpp index 1da1d50db..9796285c6 100644 --- a/soh/soh/resource/importer/TextFactory.cpp +++ b/soh/soh/resource/importer/TextFactory.cpp @@ -3,12 +3,12 @@ #include "spdlog/spdlog.h" namespace SOH { -std::shared_ptr ResourceFactoryBinaryTextV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryBinaryTextV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto text = std::make_shared(file->InitData); + auto text = std::make_shared(initData); auto reader = std::get>(file->Reader); uint32_t msgCount = reader->ReadUInt32(); @@ -27,12 +27,12 @@ std::shared_ptr ResourceFactoryBinaryTextV0::ReadResource(std:: return text; } -std::shared_ptr ResourceFactoryXMLTextV0::ReadResource(std::shared_ptr file) { - if (!FileHasValidFormatAndReader(file)) { +std::shared_ptr ResourceFactoryXMLTextV0::ReadResource(std::shared_ptr file, std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; } - auto txt = std::make_shared(file->InitData); + auto txt = std::make_shared(initData); auto child = std::get>(file->Reader)->FirstChildElement()->FirstChildElement(); while (child != nullptr) { diff --git a/soh/soh/resource/importer/TextFactory.h b/soh/soh/resource/importer/TextFactory.h index 55a569366..2f55743b9 100644 --- a/soh/soh/resource/importer/TextFactory.h +++ b/soh/soh/resource/importer/TextFactory.h @@ -7,11 +7,11 @@ namespace SOH { class ResourceFactoryBinaryTextV0 : public Ship::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; class ResourceFactoryXMLTextV0 : public Ship::ResourceFactoryXML { public: - std::shared_ptr ReadResource(std::shared_ptr file) override; + std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; } // namespace SOH From dc5bc1aa6c885df7f384eb237180549aa503c324 Mon Sep 17 00:00:00 2001 From: lilacLunatic <8488221+lilacLunatic@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:33:55 -0300 Subject: [PATCH 133/267] Mouse Support (#4673) * mouse * (mouse) small fix * "fix" implicit declaration * LUS 1.2 * empty commit to force CI re-run * include new mouse LUS * deleted: soh/soh/Enhancements/controls/GameControlEditor.cpp * [mouse]LUS * fix input viewer header * Bump LUS for mouse support * Mouse Support * Comment cleanup * Adding the actual mouse enhancement files * Fix (?) Windows and Mac builds * Maybe fix MacOS now * Why was it compiling with this?? * Mouse input viewer handling * [Mouse] LUS bump * [mouse] LUS * (Mouse) bump LUS for dxgi fix * F2 mouse notif * Update soh/soh/Enhancements/controls/Mouse.h Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> * Update soh/soh/Enhancements/controls/Mouse.cpp Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> * Fix mouse shield ranges to match control stick behavior * Use early returns in Mouse_HandleQuickspin * newline cleanup * cleanup * rename BUTTON_COLOR_MOUSE_BEIGE to BUTTON_COLOR_MOUSE_GRAY * 'Enable Mouse' tooltip * Fix includes * Comments re mouse quickspin * bullshit * Hook handler for cursor recentering on shield * Hook handler for first person mouse aiming * Hook handlers for mouse quickspin * Hook handlers for mouse shield control * Hook registration conditions * Enable Mouse -> Enable Mouse Controls --------- Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> --- soh/soh/Enhancements/controls/Mouse.cpp | 153 ++++++++++++++++++ soh/soh/Enhancements/controls/Mouse.h | 25 +++ .../controls/SohInputEditorWindow.cpp | 12 +- .../GameInteractor_HookTable.h | 4 + .../game-interactor/GameInteractor_Hooks.cpp | 16 ++ .../game-interactor/GameInteractor_Hooks.h | 4 + .../vanilla-behavior/GIVanillaBehavior.h | 9 ++ soh/soh/SohGui/SohGui.cpp | 1 + soh/src/code/padmgr.c | 3 + soh/src/code/z_camera.c | 16 +- .../actors/ovl_player_actor/z_player.c | 11 ++ 11 files changed, 248 insertions(+), 6 deletions(-) create mode 100644 soh/soh/Enhancements/controls/Mouse.cpp create mode 100644 soh/soh/Enhancements/controls/Mouse.h diff --git a/soh/soh/Enhancements/controls/Mouse.cpp b/soh/soh/Enhancements/controls/Mouse.cpp new file mode 100644 index 000000000..ae3842a1a --- /dev/null +++ b/soh/soh/Enhancements/controls/Mouse.cpp @@ -0,0 +1,153 @@ +#include "Mouse.h" +#include "soh/OTRGlobals.h" +#include "z64player.h" +#include "global.h" +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +static Ship::Coords mouseCoord = {}; +static Ship::Coords mouseCoordRel = {}; + +#define CVAR_ENABLE_MOUSE_NAME CVAR_SETTING("EnableMouse") +#define CVAR_ENABLE_MOUSE_DEFAULT 0 +#define CVAR_ENABLE_MOUSE_VALUE CVarGetInteger(CVAR_ENABLE_MOUSE_NAME, CVAR_ENABLE_MOUSE_DEFAULT) +#define MOUSE_ENABLED (CVAR_ENABLE_MOUSE_VALUE && GetWindow()->IsMouseCaptured()) + +std::shared_ptr GetWindow() { + return OTRGlobals::Instance->context->GetWindow(); +} + +extern "C" { +void Mouse_UpdatePos() { + mouseCoord = GetWindow()->GetMousePos(); +} + +void Mouse_UpdatePosRel() { + mouseCoordRel = GetWindow()->GetMouseDelta(); +} + +void Mouse_UpdateAll() { + Mouse_UpdatePos(); + Mouse_UpdatePosRel(); +} + +void Mouse_HandleThirdPerson(f32* newCamX, f32* newCamY) { + if (MOUSE_ENABLED) { + *newCamX -= mouseCoordRel.x * 40.0f; + *newCamY += mouseCoordRel.y * 40.0f; + } +} + +void Mouse_HandleFirstPerson(Player* player) { + f32 xAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.X"), 1.0f); + f32 yAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.Y"), 1.0f); + s8 invertXAxisMulti = ((CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) + && !CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) + || (!CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) + && CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0))) ? -1 : 1; + s8 invertYAxisMulti = CVarGetInteger(CVAR_SETTING("Controls.InvertAimingYAxis"), 1) ? 1 : -1; + if (MOUSE_ENABLED) { + player->actor.focus.rot.y -= mouseCoordRel.x * 6.0f * xAxisMulti * invertXAxisMulti; + player->actor.focus.rot.x += mouseCoordRel.y * 6.0f * yAxisMulti * invertYAxisMulti; + } +} + +void Mouse_RecenterCursor() { + u32 width = GetWindow()->GetWidth(); + u32 height = GetWindow()->GetHeight(); + if (MOUSE_ENABLED) { + GetWindow()->SetMousePos({(s32) (width/2), (s32) (height/2)}); + } +} + +void Mouse_HandleShield(f32* sp50, f32* sp54) { + if (MOUSE_ENABLED) { + s32 width = GetWindow()->GetWidth(); + s32 height = GetWindow()->GetHeight(); + f32 xBound = 7200 / ((f32)width / 2); + f32 yBound = 6000 / ((f32)height / 2); + *sp50 += (mouseCoord.x - (width / 2)) * xBound * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? 1 : -1); + *sp54 += (mouseCoord.y - (height / 2)) * yBound; + *sp50 = CLAMP(*sp50, -7200, 7200); + *sp54 = CLAMP(*sp54, -6000, 6000); + } +} + +static s8 iterMouse = 0; +static f32 mouseQuickspinX[5] = {}; +static f32 mouseQuickspinY[5] = {}; +static u8 quickspinCount = 0; + +void Mouse_UpdateQuickspinCount() { + if (MOUSE_ENABLED) { + quickspinCount = (quickspinCount + 1) % 5; + mouseQuickspinX[quickspinCount] = mouseCoord.x; + mouseQuickspinY[quickspinCount] = mouseCoord.y; + } else { + quickspinCount = 0; + } +} + +bool Mouse_HandleQuickspin(bool* should, s8* iter2, s8* sp3C) { + s8 temp1; + s8 temp2; + s32 i; + if (!MOUSE_ENABLED) { + return *should = false; + } + + for (i = 0; i < 4; i++, iter2++) { + // Calculating angles as per z_lib.c:func_80077D10() + f32 relY = mouseQuickspinY[i + 1] - mouseQuickspinY[i]; + f32 relX = mouseQuickspinX[i + 1] - mouseQuickspinX[i]; + s16 aTan = Math_Atan2S(relY, -relX); + iterMouse = (u16)(aTan + 0x2000) >> 9; // See z_player.c:Player_ProcessControlStick() + if ((*iter2 = iterMouse) < 0) { + return *should = false; + } + *iter2 *= 2; + } + temp1 = sp3C[0] - sp3C[1]; + if (ABS(temp1) < 10) { + return *should = false; + } + iter2 = &sp3C[1]; + for (i = 1; i < 3; i++, iter2++) { + temp2 = *iter2 - *(iter2 + 1); + if ((ABS(temp2) < 10) || (temp2 * temp1 < 0)) { + return *should = false; + } + } + + return *should = true; +} + +// Hook handlers + +void Mouse_RegisterRecenterCursorOnShield() { + COND_HOOK(OnPlayerHoldUpShield, true, Mouse_RecenterCursor); +} + +void Mouse_RegisterHandleFirstPerson() { + COND_HOOK(OnPlayerFirstPersonControl, true, Mouse_HandleFirstPerson); +} + +void Mouse_RegisterHandleShield() { + COND_HOOK(OnPlayerShieldControl, true, Mouse_HandleShield); +} + +void Mouse_RegisterUpdateQuickspinCount() { + COND_HOOK(OnPlayerProcessStick, true, Mouse_UpdateQuickspinCount); +} + +void Mouse_RegisterHandleQuickspin() { + REGISTER_VB_SHOULD(VB_SHOULD_QUICKSPIN, { Mouse_HandleQuickspin(should, va_arg(args, s8*), va_arg(args, s8*)); } ); +} + +static RegisterShipInitFunc initFunc_shieldRecenter(Mouse_RegisterRecenterCursorOnShield, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_firstPerson(Mouse_RegisterHandleFirstPerson, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_quickspinCount(Mouse_RegisterUpdateQuickspinCount, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_quickspin(Mouse_RegisterHandleQuickspin, { CVAR_ENABLE_MOUSE_NAME }); +static RegisterShipInitFunc initFunc_shieldMove(Mouse_RegisterHandleShield, { CVAR_ENABLE_MOUSE_NAME }); +} //extern "C" diff --git a/soh/soh/Enhancements/controls/Mouse.h b/soh/soh/Enhancements/controls/Mouse.h new file mode 100644 index 000000000..38d84e078 --- /dev/null +++ b/soh/soh/Enhancements/controls/Mouse.h @@ -0,0 +1,25 @@ +#ifndef MOUSE_H +#define MOUSE_H + +#pragma once + +#include + +struct Player; + +#ifdef __cplusplus +extern "C" { +#endif +void Mouse_UpdateAll(); +void Mouse_RecenterCursor(); +void Mouse_HandleThirdPerson(f32* newCamX, f32* newCamY); +void Mouse_HandleFirstPerson(struct Player* player); +void Mouse_HandleShield(f32* sp50, f32* sp54); +bool Mouse_HandleQuickspin(bool* should, s8* iter2, s8* sp3C); +void Mouse_UpdateQuickspinCount(); +#ifdef __cplusplus +}; //extern "C" +#endif + +//MOUSE_H +#endif diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index 7dbc74a75..dcef762cf 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -172,8 +172,8 @@ 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_MOUSE_GRAY ImVec4(0.5f, 0.5f, 0.5f, 0.5f) +#define BUTTON_COLOR_MOUSE_GRAY_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) @@ -198,8 +198,8 @@ void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED; break; case Ship::PhysicalDeviceType::Mouse: - buttonColor = BUTTON_COLOR_MOUSE_BEIGE; - buttonHoveredColor = BUTTON_COLOR_MOUSE_BEIGE_HOVERED; + buttonColor = BUTTON_COLOR_MOUSE_GRAY; + buttonHoveredColor = BUTTON_COLOR_MOUSE_GRAY_HOVERED; break; case Ship::PhysicalDeviceType::SDLGamepad: buttonColor = BUTTON_COLOR_GAMEPAD_BLUE; @@ -265,6 +265,7 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt icon = ICON_FA_GAMEPAD; break; case MAPPING_TYPE_KEYBOARD: + case MAPPING_TYPE_MOUSE: icon = ICON_FA_KEYBOARD_O; break; case MAPPING_TYPE_UNKNOWN: @@ -1343,6 +1344,9 @@ void SohInputEditorWindow::DrawOcarinaControlPanel() { void SohInputEditorWindow::DrawCameraControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); + CVarCheckbox("Enable Mouse Controls", CVAR_SETTING("EnableMouse"), CheckboxOptions().Color(THEME_COLOR) + .Tooltip("Allows for using the mouse to control the camera (must enable Free Look), " + "aim with the shield, and perform quickspin attacks (quickly rotate the mouse then press B)")); Ship::GuiWindow::BeginGroupPanel("Aiming/First-Person Camera", ImGui::GetContentRegionAvail()); CVarCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim"), CheckboxOptions().Color(THEME_COLOR) .Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming")); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 3bd2ef36e..59d511941 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -33,6 +33,10 @@ DEFINE_HOOK(OnTimestamp, (u8 item)); DEFINE_HOOK(OnPlayerBonk, ()); DEFINE_HOOK(OnPlayerHealthChange, (int16_t amount)); DEFINE_HOOK(OnPlayerBottleUpdate, (int16_t contents)); +DEFINE_HOOK(OnPlayerHoldUpShield, ()); +DEFINE_HOOK(OnPlayerFirstPersonControl, (Player* player)); +DEFINE_HOOK(OnPlayerProcessStick, ()); +DEFINE_HOOK(OnPlayerShieldControl, (float_t* sp50, float_t* sp54)); DEFINE_HOOK(OnPlayDestroy, ()); DEFINE_HOOK(OnPlayDrawEnd, ()); DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list originalArgs)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 9c861062b..40c47e9a9 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -142,6 +142,22 @@ void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents) { GameInteractor::Instance->ExecuteHooks(contents); } +void GameInteractor_ExecuteOnPlayerHoldUpShield() { + GameInteractor::Instance->ExecuteHooks(); +} + +void GameInteractor_ExecuteOnPlayerFirstPersonControl(Player* player) { + GameInteractor::Instance->ExecuteHooks(player); +} + +void GameInteractor_ExecuteOnPlayerShieldControl(float_t* sp50, float_t* sp54) { + GameInteractor::Instance->ExecuteHooks(sp50, sp54); +} + +void GameInteractor_ExecuteOnPlayerProcessStick() { + GameInteractor::Instance->ExecuteHooks(); +} + void GameInteractor_ExecuteOnPlayDestroy() { GameInteractor::Instance->ExecuteHooks(); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index d20864012..10ab3a877 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -35,6 +35,10 @@ void GameInteractor_ExecuteOnTimestamp (u8 item); void GameInteractor_ExecuteOnPlayerBonk(); void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount); void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents); +void GameInteractor_ExecuteOnPlayerHoldUpShield(); +void GameInteractor_ExecuteOnPlayerFirstPersonControl(Player* player); +void GameInteractor_ExecuteOnPlayerShieldControl(float_t* sp50, float_t* sp54); +void GameInteractor_ExecuteOnPlayerProcessStick(); void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price); void GameInteractor_ExecuteOnPlayDestroy(); void GameInteractor_ExecuteOnPlayDrawEnd(); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 5d25bd12d..8aace9a90 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1679,6 +1679,15 @@ typedef enum { // - `*VBFishingData` VB_SHOULD_SET_FISHING_RECORD, + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*s8 iter2` + // - `s8 sp3C[4]` + VB_SHOULD_QUICKSPIN, + // #### `result` // ```c // (interactedActor->id == ACTOR_BG_TOKI_SWD) && LINK_IS_ADULT diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 56da5eba0..40996fc59 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -113,6 +113,7 @@ namespace SohGui { gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press - to access enhancements menu"); #else gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press F1 to access enhancements menu"); + gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press F2 to enable the mouse cursor"); #endif }*/ diff --git a/soh/src/code/padmgr.c b/soh/src/code/padmgr.c index a8bf778af..13a82162f 100644 --- a/soh/src/code/padmgr.c +++ b/soh/src/code/padmgr.c @@ -3,6 +3,7 @@ #include #include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/controls/Mouse.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -317,6 +318,8 @@ void PadMgr_HandleRetraceMsg(PadMgr* padMgr) { osRecvMesg(queue, NULL, OS_MESG_BLOCK); osContGetReadData(padMgr->pads); + Mouse_UpdateAll(); + for (i = 0; i < __osMaxControllers; i++) { padMgr->padStatus[i].status = Controller_ShouldRumble(i); } diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index 7167daceb..7b95c70af 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -7,6 +7,7 @@ #include "overlays/actors/ovl_En_Horse/z_en_horse.h" #include "soh/frame_interpolation.h" +#include "soh/Enhancements/controls/Mouse.h" s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags); s32 Camera_ChangeModeFlags(Camera* camera, s16 mode, u8 flags); @@ -1422,6 +1423,8 @@ s32 SetCameraManual(Camera* camera) { f32 newCamX = -D_8015BD7C->state.input[0].cur.right_stick_x * 10.0f; f32 newCamY = D_8015BD7C->state.input[0].cur.right_stick_y * 10.0f; + Mouse_HandleThirdPerson(&newCamX, &newCamY); + if ((fabsf(newCamX) >= 15.0f || fabsf(newCamY) >= 15.0f) && camera->play->manualCamera == false) { camera->play->manualCamera = true; @@ -1485,8 +1488,17 @@ s32 Camera_Free(Camera* camera) { camera->animState = 0; - f32 newCamX = -D_8015BD7C->state.input[0].cur.right_stick_x * 10.0f * (CVarGetFloat(CVAR_SETTING("FreeLook.CameraSensitivity.X"), 1.0f)); - f32 newCamY = D_8015BD7C->state.input[0].cur.right_stick_y * 10.0f * (CVarGetFloat(CVAR_SETTING("FreeLook.CameraSensitivity.Y"), 1.0f)); + f32 newCamX = -D_8015BD7C->state.input[0].cur.right_stick_x * 10.0f; + f32 newCamY = +D_8015BD7C->state.input[0].cur.right_stick_y * 10.0f; + + /* Disable mouse movement when holding down the shield */ + if (!(camera->player->stateFlags1 & 0x400000)) { + Mouse_HandleThirdPerson(&newCamX, &newCamY); + } + + newCamX *= (CVarGetFloat(CVAR_SETTING("FreeLook.CameraSensitivity.X"), 1.0f)); + newCamY *= (CVarGetFloat(CVAR_SETTING("FreeLook.CameraSensitivity.Y"), 1.0f)); + bool invertXAxis = (CVarGetInteger(CVAR_SETTING("FreeLook.InvertXAxis"), 0) && !CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) || (!CVarGetInteger(CVAR_SETTING("FreeLook.InvertXAxis"), 0) && CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)); camera->play->camX += newCamX * (invertXAxis ? -1 : 1); 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 8acdee4a4..312a74215 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2082,6 +2082,8 @@ void Player_ProcessControlStick(PlayState* play, Player* this) { direction = (u16)((s16)(sControlStickWorldYaw - this->actor.shape.rot.y) + 0x2000) >> 14; } + GameInteractor_ExecuteOnPlayerProcessStick(); + this->controlStickSpinAngles[this->controlStickDataIndex] = spinAngle; this->controlStickDirections[this->controlStickDataIndex] = direction; } @@ -4281,6 +4283,10 @@ s32 Player_CanSpinAttack(Player* this) { iter = &this->controlStickSpinAngles[0]; iter2 = &sp3C[0]; + if (GameInteractor_Should(VB_SHOULD_QUICKSPIN, false, iter2, sp3C)) { + return true; + } + for (i = 0; i < 4; i++, iter++, iter2++) { if ((*iter2 = *iter) < 0) { return false; @@ -6432,6 +6438,8 @@ s32 Player_ActionHandler_11(Player* this, PlayState* play) { Player_DetachHeldActor(play, this); if (Player_SetupAction(play, this, Player_Action_80843188, 0)) { + GameInteractor_ExecuteOnPlayerHoldUpShield(); + this->stateFlags1 |= PLAYER_STATE1_SHIELDING; if (!Player_IsChildWithHylianShield(this)) { @@ -9260,6 +9268,7 @@ void Player_Action_80843188(Player* this, PlayState* play) { sp54 = sControlInput->rel.stick_y * 100 * (CVarGetInteger(CVAR_SETTING("Controls.InvertShieldAimingYAxis"), 1) ? 1 : -1); sp50 = sControlInput->rel.stick_x * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? 120 : -120) * (CVarGetInteger(CVAR_SETTING("Controls.InvertShieldAimingXAxis"), 0) ? -1 : 1); sp4E = this->actor.shape.rot.y - Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); + GameInteractor_ExecuteOnPlayerShieldControl(&sp50, &sp54); sp40 = Math_CosS(sp4E); sp4C = (Math_SinS(sp4E) * sp50) + (sp54 * sp40); @@ -12658,6 +12667,8 @@ s16 func_8084ABD8(PlayState* play, Player* this, s32 arg2, s16 arg3) { f32 xAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.X"), 1.0f); f32 yAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.Y"), 1.0f); + GameInteractor_ExecuteOnPlayerFirstPersonControl(this); + if (!func_8002DD78(this) && !func_808334B4(this) && (arg2 == 0)) { // First person without weapon // Y Axis if (!CVarGetInteger(CVAR_SETTING("MoveInFirstPerson"), 0)) { From bddef32a5ac3a97c3e0d43b0f971f272962bd937 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 24 Mar 2025 20:09:39 +0100 Subject: [PATCH 134/267] fix defaults + modIndex (#5201) --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 9467cb10e..9a7a28806 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -300,12 +300,12 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { // Always show ItemGet animation outside of randomizer to keep behaviour consistent in vanilla IS_RANDO && ( - CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_ALL || + CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_ALL || ( - CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED) == SGIA_JUNK && + CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_JUNK && ( //crude fix to ensure map hints are readable. Ideally replace with better hint tracking. - !(getItemEntry.getItemId >= RG_DEKU_TREE_MAP && getItemEntry.getItemId <= RG_ICE_CAVERN_MAP) && ( + !(getItemEntry.getItemId >= RG_DEKU_TREE_MAP && getItemEntry.getItemId <= RG_ICE_CAVERN_MAP && getItemEntry.modIndex == MOD_RANDOMIZER) && ( getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER @@ -767,7 +767,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_PLAY_SLOW_CHEST_CS: { // We force fast chests if SkipGetItemAnimation is enabled because the camera in the CS looks pretty wonky otherwise - if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED)) { + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK)) { *should = false; } break; From 43510e5ad9f0fd6c6b720a0cb65eb6b232449690 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 24 Mar 2025 17:21:09 -0400 Subject: [PATCH 135/267] Fix Skull Tokens from Chests locking you in place (#5198) * temp fix for chest skulltulas * Implement way to load a vanilla message into a CustomMessage * dynamically inserts autodismiss text code to skulltula text. --- .../custom-message/CustomMessageManager.cpp | 38 +++++++++++++++++++ .../custom-message/CustomMessageManager.h | 2 + .../Enhancements/randomizer/hook_handlers.cpp | 5 ++- soh/soh/OTRGlobals.cpp | 8 +++- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 4d4d27b3f..1b993dab2 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -114,6 +114,44 @@ CustomMessage::CustomMessage(Text text, TextBoxType type_,TextBoxPosition positi messages[LANGUAGE_FRA] = text.GetFrench(); } +typedef struct { + u16 textId; + u8 typePos; + const char* segment; + u32 msgSize; +} MessageTableEntry; + +extern "C" MessageTableEntry* sNesMessageEntryTablePtr; +extern "C" MessageTableEntry* sGerMessageEntryTablePtr; +extern "C" MessageTableEntry* sFraMessageEntryTablePtr; + +CustomMessage CustomMessage::LoadVanillaMessageTableEntry(uint16_t textId) { + const char* foundSeg; + const char* nextSeg; + MessageTableEntry* msgEntry = sNesMessageEntryTablePtr; + u16 bufferId = textId; + CustomMessage msg; + if (gSaveContext.language == LANGUAGE_GER) { + msgEntry = sGerMessageEntryTablePtr; + } else if (gSaveContext.language == LANGUAGE_FRA) { + msgEntry = sFraMessageEntryTablePtr; + } + while (msgEntry->textId != 0xFFFF) { + if (msgEntry->textId == bufferId) { + TextBoxPosition position = static_cast(msgEntry->typePos & 0xF); + TextBoxType type = static_cast(msgEntry->typePos >> 4); + // uint8_t icon = msgEntry->segment[1]; + std::string message = std::string(msgEntry->segment , msgEntry->msgSize); + msg = CustomMessage(message, type, position); + // msg.Format(static_cast(icon)); + return msg; + } + msgEntry++; + } + return CustomMessage(); +} + + const std::string CustomMessage::GetEnglish(MessageFormat format) const { return GetForLanguage(LANGUAGE_ENG, format); } diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index e8a969064..0720d8ac4 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -47,6 +47,8 @@ class CustomMessage { CustomMessage(std::string english_, std::vector colors_, std::vector capital_ = {}, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); CustomMessage(Text text, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + static CustomMessage LoadVanillaMessageTableEntry(uint16_t textId); + static std::string MESSAGE_END() ; static std::string ITEM_OBTAINED(uint8_t x) ; static std::string NEWLINE() ; diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 9a7a28806..2d40459ea 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -236,6 +236,7 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag); if (rc == RC_UNKNOWN_CHECK) return; + if (flagType == FLAG_GS_TOKEN && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; @@ -1610,7 +1611,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_GIVE_ITEM_FROM_LAB_DIVE: case VB_GIVE_ITEM_FROM_SKULL_KID_SARIAS_SONG: case VB_GIVE_ITEM_FROM_MAN_ON_ROOF: - case VB_GIVE_ITEM_SKULL_TOKEN: case VB_GIVE_ITEM_FROM_BLUE_WARP: case VB_GIVE_ITEM_FAIRY_OCARINA: case VB_GIVE_ITEM_WEIRD_EGG: @@ -1626,6 +1626,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_GIVE_ITEM_SHADOW_MEDALLION: *should = false; break; + case VB_GIVE_ITEM_SKULL_TOKEN: + *should = (Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)); + break; default: break; } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 5cdf06d9e..792bf0639 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2379,7 +2379,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { if (CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 0) != 0) { // The freeze text cannot be manually dismissed and must be auto-dismissed. // This is fine and even wanted when skull tokens are not shuffled, but when - // when they are shuffled we don't want to be able to manually dismiss the box. + // when they are shuffled we want to be able to manually dismiss the box. // Otherwise if we get a token from a chest or an NPC we get stuck in the ItemGet // animation until the text box auto-dismisses. // RANDOTODO: Implement a way to determine if an item came from a skulltula and @@ -2395,7 +2395,11 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { s16 gsCount = gSaveContext.inventory.gsTokens + (IS_RANDO ? 1 : 0); messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId, MF_FORMATTED); messageEntry.Replace("[[gsCount]]", std::to_string(gsCount)); - } + } else if (CVarGetInteger(CVAR_ENHANCEMENT("SkulltulaFreeze"), 0) != 0 && (!IS_RANDO || Randomizer_GetSettingValue(RSK_SHUFFLE_TOKENS) == RO_TOKENSANITY_OFF)) { + messageEntry = CustomMessage::LoadVanillaMessageTableEntry(TEXT_GS_FREEZE); + messageEntry.Replace(CustomMessage::MESSAGE_END(), "\x0E\x3C"); + messageEntry += CustomMessage::MESSAGE_END(); + } } else if ((IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0)) && (textId == TEXT_BUY_BOMBCHUS_10_DESC || textId == TEXT_BUY_BOMBCHUS_10_PROMPT)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId, MF_FORMATTED); From c7ff6e47006359b49f12dd360e5fa0a7f77b911e Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 24 Mar 2025 22:22:51 +0100 Subject: [PATCH 136/267] Update enhancement and randomizer presets (#5193) * Prepare fresh presets * Separate preset files & finish hell preset * Enhancement presets done * Finish randomizer presets * Update missed enhancement cvar * Better split presets.h * Address review comments --- .../Enhancements/Presets/PresetEntries.cpp | 679 +++++++++++++ .../{presets.cpp => Presets/Presets.cpp} | 2 +- soh/soh/Enhancements/Presets/Presets.h | 58 ++ soh/soh/Enhancements/enhancementTypes.h | 4 +- soh/soh/Enhancements/presets.h | 907 ------------------ .../Enhancements/randomizer/randomizer.cpp | 11 +- soh/soh/Enhancements/randomizer/settings.cpp | 3 +- soh/soh/OTRGlobals.cpp | 2 +- soh/soh/SohGui/SohGui.cpp | 2 +- soh/soh/SohGui/SohMenu.h | 2 +- soh/soh/SohGui/SohMenuBar.cpp | 2 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 18 +- soh/soh/SohGui/SohMenuSettings.cpp | 2 +- 13 files changed, 761 insertions(+), 931 deletions(-) create mode 100644 soh/soh/Enhancements/Presets/PresetEntries.cpp rename soh/soh/Enhancements/{presets.cpp => Presets/Presets.cpp} (99%) create mode 100644 soh/soh/Enhancements/Presets/Presets.h delete mode 100644 soh/soh/Enhancements/presets.h diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp new file mode 100644 index 000000000..3b2167a2e --- /dev/null +++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp @@ -0,0 +1,679 @@ +#include "Presets.h" +#include +#include "soh/cvar_prefixes.h" +#include "soh/Enhancements/enhancementTypes.h" + +#define PRESET_ENTRY_S32(cvar, value) { cvar, PRESET_ENTRY_TYPE_S32, value } +#define PRESET_ENTRY_FLOAT(cvar, value) { cvar, PRESET_ENTRY_TYPE_FLOAT, value } +#define PRESET_ENTRY_STRING(cvar, value) { cvar, PRESET_ENTRY_TYPE_STRING, value } +#define PRESET_ENTRY_CPP_STRING(cvar, value) { cvar, PRESET_ENTRY_TYPE_CPP_STRING, value } + +// TODO: Ideally everything in this file will come from one/many JSON files + +// Enhancement presets +const std::vector vanillaPlusPresetEntries = { + // Quality of Life + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), + + // Skips & Speed-ups + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), + + // Graphics + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableLOD"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RememberMapToggleState"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("WidescreenActorCulling"), 1), + + // Items + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), + + // Fixes + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixTexturesOOB"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixHammerHand"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_CONSISTENT_VANISH), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), + + // Difficulty + // NONE + + // Minigames + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FrogsModifyFailTime"), 2), + + // Extra Modes + // NONE + + // Cheats + // NONE +}; + +const std::vector enhancedPresetEntries = { + // Quality of Life + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseWarp"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableCritWiggle"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 1), + + // Skips & Speed-ups + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CrawlSpeed"), 2), + PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), + + // Graphics + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableLOD"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToTMedallionsColors"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RememberMapToggleState"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterAmmoRendering"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("WidescreenActorCulling"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors"), 1), + + // Items + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PersistentMasks"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableFirstPersonChus"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterFarore"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), + + // Fixes + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixTexturesOOB"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixHammerHand"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_CONSISTENT_VANISH), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), + + // Difficulty + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnableBombchuDrops"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), + + // Minigames + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FrogsModifyFailTime"), 2), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), + + // Extra Modes + // NONE + + // Cheats + // NONE +}; + +const std::vector randomizerPresetEntries = { + // Quality of Life + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeAllNight"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseWarp"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("IncludeHeldInputsBufferWindow"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableCritWiggle"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 1), + + // Skips & Speed-ups + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Entrances"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.QuickBossDeaths"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.DisableTitleCard"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipForcedDialog"), FORCED_DIALOG_SKIP_ALL), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CrawlSpeed"), 2), + PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipChildStealth"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SkipTowerEscape"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), + + // Graphics + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableLOD"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToTMedallionsColors"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RememberMapToggleState"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FileSelectMoreInfo"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterAmmoRendering"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("WidescreenActorCulling"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors"), 1), + + // Items + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToggleStrength"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SwordToggle"), SWORD_TOGGLE_CHILD), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PersistentMasks"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableFirstPersonChus"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterFarore"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), + + // Fixes + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixTexturesOOB"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixHammerHand"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_CONSISTENT_VANISH), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), + + // Difficulty + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), + + // Minigames + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FrogsModifyFailTime"), 2), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), + + // Extra Modes + // NONE + + // Cheats + PRESET_ENTRY_S32(CVAR_CHEAT("EasyFrameAdvance"), 1), +}; + +// Randomizer presets +const std::vector randomizerBeginnerPresetEntries = { + // World tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), 1), + + // Items tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 6), + + // Gamplay tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), + + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SheikLAHint"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SariaHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FrogsHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BiggoronHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MerchantText"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), + + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), + + // Locations tab + PRESET_ENTRY_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "147,148,233,323,"), + + // Tricks/Glitches tab + // NONE + + // Starting inventory tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingKokiriSword"), RO_STARTING_OCARINA_FAIRY), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), RO_STARTING_OCARINA_FAIRY), +}; + +const std::vector randomizerStandardPresetEntries = { + // World tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), 1), + + // Items tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), 4), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrices"), RO_PRICE_FIXED), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_BEANS_ONLY), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 7), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_COUNT), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsRandomCount"), 8), + + // Gamplay tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), + + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SheikLAHint"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SariaHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FrogsHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BiggoronHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MerchantText"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), + + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), + + // Locations tab + // NONE + + // Tricks/Glitches tab + // NONE + + // Starting inventory tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), RO_STARTING_OCARINA_FAIRY), +}; + +const std::vector randomizerAdvancedPresetEntries = { + // World tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_ON_PLUS_GANON), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), 1), + + // Items tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSwim"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), 7), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrices"), RO_PRICE_FIXED), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 8), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_COUNT), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRingsRandomCount"), 4), + + // Gamplay tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), + + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SheikLAHint"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SariaHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FrogsHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MerchantText"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), + + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), + + // Locations tab + // NONE + + // Tricks/Glitches tab + // NONE + + // Starting inventory tab + // NONE +}; + +const std::vector hellModePresetEntries = { + // World tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LockOverworldDoors"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_ON_PLUS_GANON), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_INTERIOR_ENTRANCE_SHUFFLE_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOwlDrops"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixedEntrances"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixDungeons"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixBosses"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixOverworld"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixInteriors"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixGrottos"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), 1), + + // Items tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleChildWallet"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinaButtons"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSwim"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), 7), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_BOTH), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), 17), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrices"), RO_PRICE_BALANCED), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_SHUFFLE_POTS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), 2), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFairies"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 10), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardOptions"), RO_LACS_GREG_REWARD), + + // Gamplay tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 0), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), + + // Locations tab + // NONE + + // Tricks/Glitches tab + // NONE + + // Starting inventory tab + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingHearts"), 0), +}; + +const std::map presetTypes = { + { PRESET_TYPE_ENHANCEMENTS, + { { CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_CHEAT }, + { + { ENHANCEMENT_PRESET_DEFAULT, + { + "Default", + "Reset all options to their default values.", + {}, + } }, + { ENHANCEMENT_PRESET_VANILLA_PLUS, + { + "Vanilla Plus", + "Adds some quality of life features, but don't alter gameplay and aims to " + "preserve the authentic experience. Recommended for a first playthrough of OoT.", + vanillaPlusPresetEntries, + } }, + { ENHANCEMENT_PRESET_ENHANCED, + { "Enhanced", + "The \"Vanilla Plus\" preset, but with more quality of life enhancements that might alter gameplay " + "slightly. Recommended for returning players going through the vanilla game again.", + enhancedPresetEntries } }, + { ENHANCEMENT_PRESET_RANDOMIZER, + { "Randomizer", + "A baseline set of enhancements for playing randomizer. Includes many quality of life options and " + "options to speed up gameplay.", + randomizerPresetEntries } }, + } } }, + { PRESET_TYPE_RANDOMIZER, + { { CVAR_PREFIX_RANDOMIZER_SETTING, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT }, + { + { RANDOMIZER_PRESET_DEFAULT, + { + "Default", + "Reset all options to their default values.", + {}, + } }, + { RANDOMIZER_PRESET_BEGINNER, + { + "Beginner", + "A simpler set of options and shuffled items meant for players new to the randomizer. ", + randomizerBeginnerPresetEntries, + } }, + { RANDOMIZER_PRESET_STANDARD, + { + "Standard", + "A set of options meant as a baseline for both newer and experienced randomizer players.", + randomizerStandardPresetEntries, + } }, + { RANDOMIZER_PRESET_ADVANCED, + { + "Advanced", + "Includes many more shuffled items and introduces some entrance shuffle options. Meant for advanced " + "randomizer players.", + randomizerAdvancedPresetEntries, + } }, + { RANDOMIZER_PRESET_HELL_MODE, + { "Hell Mode", + "Every location randomized, all entrance settings enabled, but still using glitchless logic. Expect " + "pain.", + hellModePresetEntries } }, + } } } +}; diff --git a/soh/soh/Enhancements/presets.cpp b/soh/soh/Enhancements/Presets/Presets.cpp similarity index 99% rename from soh/soh/Enhancements/presets.cpp rename to soh/soh/Enhancements/Presets/Presets.cpp index 3c542762f..8d08869f5 100644 --- a/soh/soh/Enhancements/presets.cpp +++ b/soh/soh/Enhancements/Presets/Presets.cpp @@ -1,4 +1,4 @@ -#include "presets.h" +#include "Presets.h" #include #include #include diff --git a/soh/soh/Enhancements/Presets/Presets.h b/soh/soh/Enhancements/Presets/Presets.h new file mode 100644 index 000000000..898bc9cc9 --- /dev/null +++ b/soh/soh/Enhancements/Presets/Presets.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include "soh/OTRGlobals.h" + +enum PresetEntryType { + PRESET_ENTRY_TYPE_S32, + PRESET_ENTRY_TYPE_FLOAT, + PRESET_ENTRY_TYPE_STRING, + PRESET_ENTRY_TYPE_CPP_STRING, +}; + +enum PresetType { + PRESET_TYPE_ENHANCEMENTS, + PRESET_TYPE_RANDOMIZER, +}; + +enum EnhancementPreset { + ENHANCEMENT_PRESET_DEFAULT, + ENHANCEMENT_PRESET_VANILLA_PLUS, + ENHANCEMENT_PRESET_ENHANCED, + ENHANCEMENT_PRESET_RANDOMIZER, +}; + +enum RandomizerPreset { + RANDOMIZER_PRESET_DEFAULT, + RANDOMIZER_PRESET_BEGINNER, + RANDOMIZER_PRESET_STANDARD, + RANDOMIZER_PRESET_ADVANCED, + RANDOMIZER_PRESET_HELL_MODE, +}; + +typedef struct PresetEntry { + const char* cvar; + PresetEntryType type; + std::variant value; +} PresetEntry; + +std::string FormatLocations(std::vector locs); + +void DrawPresetSelector(PresetType presetType); +void clearCvars(std::vector cvarsToClear); +void applyPreset(std::vector entries); + +typedef struct PresetDefinition { + const char* label; + const char* description; + std::vector entries; +} PresetDefinition; + +typedef struct PresetTypeDefinition { + std::vector blocksToClear; + std::map presets; +} PresetTypeDefinition; + +extern const std::map presetTypes; diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index 14228054b..36ef76cc8 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -30,8 +30,8 @@ typedef enum { typedef enum { BUNNY_HOOD_VANILLA, - BUNNY_HOOD_FAST_AND_JUMP, - BUNNY_HOOD_FAST + BUNNY_HOOD_FAST, + BUNNY_HOOD_FAST_AND_JUMP } BunnyHoodMode; typedef enum { diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h deleted file mode 100644 index a7bca4e66..000000000 --- a/soh/soh/Enhancements/presets.h +++ /dev/null @@ -1,907 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include "soh/Enhancements/randomizer/randomizerTypes.h" -#include "soh/Enhancements/enhancementTypes.h" -#include "soh/OTRGlobals.h" -#include "soh/cvar_prefixes.h" - -enum PresetEntryType { - PRESET_ENTRY_TYPE_S32, - PRESET_ENTRY_TYPE_FLOAT, - PRESET_ENTRY_TYPE_STRING, - PRESET_ENTRY_TYPE_CPP_STRING, -}; - -enum PresetType { - PRESET_TYPE_ENHANCEMENTS, - PRESET_TYPE_RANDOMIZER, -}; - -enum EnhancementPreset { - ENHANCEMENT_PRESET_DEFAULT, - ENHANCEMENT_PRESET_VANILLA_PLUS, - ENHANCEMENT_PRESET_ENHANCED, - ENHANCEMENT_PRESET_RANDOMIZER, -}; - -enum RandomizerPreset { - RANDOMIZER_PRESET_DEFAULT, - RANDOMIZER_PRESET_SPOCK_RACE, - RANDOMIZER_PRESET_SPOCK_RACE_NO_LOGIC, - RANDOMIZER_PRESET_S6, - RANDOMIZER_PRESET_HELL_MODE, - RANDOMIZER_PRESET_BENCHMARK, -}; - -typedef struct PresetEntry { - const char* cvar; - PresetEntryType type; - std::variant value; -} PresetEntry; - -std::string FormatLocations(std::vector locs); - -#define PRESET_ENTRY_S32(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_S32, value } -#define PRESET_ENTRY_FLOAT(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_FLOAT, value } -#define PRESET_ENTRY_STRING(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_STRING, value } -#define PRESET_ENTRY_CPP_STRING(cvar, value) \ - { cvar, PRESET_ENTRY_TYPE_CPP_STRING, value } - -void DrawPresetSelector(PresetType presetType); -void clearCvars(std::vector cvarsToClear); -void applyPreset(std::vector entries); - -// TODO: Ideally everything below this point will come from one/many JSON files - -const std::vector vanillaPlusPresetEntries = { - // D-pad Support in text and file select - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - // Play Ocarina with D-pad - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - // Play Ocarina with Right Stick - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - // D-pad as Equip Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - // Prevent Dropped Ocarina Inputs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - - // Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - // Slow Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - // Skip Text - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - // King Zora Speed (1 to 5) - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 2.0f), - // Faster Block Push (+0 to +5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - // Better Owl - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - - // Assignable Tunics and Boots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - // Enable passage of time on file select - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), - // Inject Item Counts in messages - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - - // Dynamic Wallet Icon - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), - // Always show dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 1), - - // Fix L&R Pause menu - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), - // Fix Dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - // Fix Two Handed idle animations - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - // Fix the Gravedigging Tour Glitch - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), - // Fix Deku Nut upgrade - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - // Fix Navi text HUD position - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), - // Extend Silver Rupee Jingle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - // Fix some Floor Switches - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - - // Red Ganon blood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - // Fish while hovering - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - // N64 Weird Frames - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - // Bombchus out of bounds - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - // Quick Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - // Skip save confirmation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), -}; - -const std::vector enhancedPresetEntries = { - // D-pad Support in text and file select - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - // Play Ocarina with D-pad - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - // Play Ocarina with Right Stick - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - // D-pad as Equip Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - // Prevent Dropped Ocarina Inputs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - - // Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - // Slow Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - // Skip Text - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - // King Zora Speed (1 to 5) - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - // Faster Block Push (+0 to +5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - // Better Owl - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - - // Assignable Tunics and Boots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - // Enable passage of time on file select - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), - // Inject Item Counts in messages - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - - // Dynamic Wallet Icon - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), - // Always show dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 1), - - // Fix L&R Pause menu - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), - // Fix Dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - // Fix Two Handed idle animations - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - // Fix the Gravedigging Tour Glitch - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), - // Fix Deku Nut upgrade - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - // Fix Navi text HUD position - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), - // Extend Silver Rupee Jingle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - // Fix enemies not spawning on ground over water - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), - // Fix some Floor Switches - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - - // Red Ganon blood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - // Fish while hovering - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - // N64 Weird Frames - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - // Bombchus out of bounds - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - // Quick Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - // Skip save confirmation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), - // Biggoron Forge Time (0 to 3) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - // Vine/Ladder Climb speed (+0 to +12) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), - // Faster Heavy Block Lift - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - // No Forced Navi - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - // No Skulltula Freeze - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), - // MM Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST_AND_JUMP), - // Adult Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - // Fast Chests - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - // Fast Drops - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - // Fast Ocarina Playback - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - // Instant Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - // Instant Boomerang Recall - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - // Nuts Explode Bombs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), - // Ask to Equip New Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AskToEquip"), 1), - // Mask Select in Inventory - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - // Always Win Goron Pot - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - // Always Win Dampe Digging - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), - // Skip Magic Arrow Equip Animation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), - - // Equip arrows on multiple slots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - - // Disable Navi Call Audio - PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), - - // Equipment Toggle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - // Link's Cow in Both Time Periods - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CowOfTime"), 1), - - // Enable 3D Dropped items/projectiles - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), - - // Fix Anubis fireballs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AnubisFix"), 1), - - // Autosave - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), - - // Bombchu shop doesn't sell out, and 10 bombchus cost 99 instead of 100 - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1), -}; - -const std::vector randomizerPresetEntries = { - // D-pad Support in text and file select - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - // Play Ocarina with D-pad - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - // Play Ocarina with Right Stick - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - // D-pad as Equip Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - // Prevent Dropped Ocarina Inputs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - - // Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - // Slow Text Speed (1 to 5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - // Skip Text - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - // King Zora Speed (1 to 5) - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - // Faster Block Push (+0 to +5) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - // Better Owl - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - - // Assignable Tunics and Boots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - // Enable passage of time on file select - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), - // Inject Item Counts in messages - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - - // Dynamic Wallet Icon - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), - // Always show dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AlwaysShowDungeonMinimapIcon"), 1), - - // Fix L&R Pause menu - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), - // Fix Dungeon entrances - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - // Fix Two Handed idle animations - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - // Fix the Gravedigging Tour Glitch - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), - // Fix Deku Nut upgrade - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - // Fix Navi text HUD position - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), - // Extend Silver Rupee Jingle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - // Fix some Floor Switches - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - - // Red Ganon blood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - // Fish while hovering - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - // N64 Weird Frames - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - // Bombchus out of bounds - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - // Quick Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - // Skip save confirmation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), - // Biggoron Forge Time (0 to 3) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - // Vine/Ladder Climb speed (+0 to +12) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), - // Faster Heavy Block Lift - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - // No Forced Navi - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - // No Skulltula Freeze - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), - // MM Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST_AND_JUMP), - // Adult Bunny Hood - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - // Fast Chests - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - // Fast Drops - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - // Fast Ocarina Playback - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - // Instant Putaway - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - // Instant Boomerang Recall - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - // Nuts Explode Bombs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), - // Ask to Equip New Items - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AskToEquip"), 1), - // Mask Select in Inventory - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - // Always Win Goron Pot - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - // Always Win Dampe Digging - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), - // Skip Magic Arrow Equip Animation - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), - // Exit Market at Night - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), - - // Equip arrows on multiple slots - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - - // Disable Navi Call Audio - PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), - - // Equipment Toggle - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - // Link's Cow in Both Time Periods - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CowOfTime"), 1), - - // Enable 3D Dropped items/projectiles - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), - - // Fix Anubis fireballs - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AnubisFix"), 1), - - // Autosave - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), - - // Customize Fishing Behaviour - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), - // Guarantee Bite - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), - // Fish Never Escape - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), - // Child Minimum Weight (6 to 10) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 3), - // Adult Minimum Weight (8 to 13) - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), - - // Customize Lost Woods Ocarina Game Behavior - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeOcarinaGame"), 1), - // Start With Five Notes - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("OcarinaGame.StartingNotes"), 5), - // Round One Notes - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("OcarinaGame.RoundOneNotes"), 5), - - // Visual Stone of Agony - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), - // Pull grave during the day - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - // Pull out Ocarina to Summon Scarecrow - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), - // Chest size & texture matches contents - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_BOTH), - - // Color Temple of Time's Medallions - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToTMedallionsColors"), 1), - - // Frames to wait - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinFrameCount"), 200), - - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), - - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), -}; - -const std::vector spockRacePresetEntries = { - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LogicRules"), 0), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 4), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - PRESET_ENTRY_S32(CVAR_SETTING("DpadInText"), 1), - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.Dpad"), 1), - PRESET_ENTRY_S32(CVAR_SETTING("OcarinaControl.RStick"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadEquips"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AssignableTunicsAndBoots"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseAnyCursor"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 6), - 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_ENHANCEMENT("DampeAllNight"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), - 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("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), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_CPP_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), FormatLocations( - { RC_MARKET_10_BIG_POES, RC_KAK_40_GOLD_SKULLTULA_REWARD, RC_KAK_50_GOLD_SKULLTULA_REWARD, RC_ZR_FROGS_OCARINA_GAME })), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_FAST), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 5), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubText"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrice"), RO_PRICE_FIXED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsFixedPrice"), 10), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), -}; - -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_ENHANCEMENT("MinimumFishWeightChild"), 3), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 4), - PRESET_ENTRY_S32(CVAR_COSMETIC("Goron.NeckLength"), 1000), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeAllNight"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DayGravePull"), 1), - PRESET_ENTRY_S32(CVAR_AUDIO("DisableNaviCallAudio"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EquipmentCanBeRemoved"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastDrops"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FishNeverEscape"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ForgeTime"), 0), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GoronPot"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GuaranteeFishingBite"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MarketSneak"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MaskSelect"), 1), - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoForcedNavi"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseAnyCursor"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), - 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("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), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 1), - PRESET_ENTRY_CPP_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), FormatLocations( - { RC_MARKET_10_BIG_POES, RC_KAK_40_GOLD_SKULLTULA_REWARD, RC_KAK_50_GOLD_SKULLTULA_REWARD, RC_ZR_FROGS_OCARINA_GAME })), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_FAST), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsRewardCount"), 5), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_NO_LOGIC), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_GREG), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubText"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_BEANS_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchantPrices"), RO_PRICE_VANILLA), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), -}; - -const std::vector s6PresetEntries = { - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_BOTH), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 4), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_CPP_STRING(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), FormatLocations({ RC_DEKU_THEATER_MASK_OF_TRUTH })), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_DEKU_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_FAST), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IceTraps"), RO_ICE_TRAPS_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MedallionCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_MEDALLIONS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), RO_DUNGEON_REWARDS_END_OF_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), RO_WATERFALL_CLOSED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingDekuShield"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_STARTWITH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), RO_ZF_CLOSED), -}; - -const std::vector hellModePresetEntries = { - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_BOTH), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastChests"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("AdultMasks"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), 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), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), 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), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IceTraps"), RO_ICE_TRAPS_ONSLAUGHT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ItemPool"), RO_ITEM_POOL_MINIMAL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LinksPocket"), RO_LINKS_POCKET_NOTHING), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_RANDOM_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_DUNGEON_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), RO_SHOPSANITY_COUNT_FOUR_ITEMS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_RANGE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange1"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityPriceRange2"), 999), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_BEANS_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchantPrices"), RO_PRICE_VANILLA), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), RO_DUNGEON_REWARDS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_DUNGEONS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubsPrice"), RO_PRICE_CHEAP_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_ALL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildStealth"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipTowerEscape"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), RO_WATERFALL_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), RO_ZF_OPEN), -}; - -const std::vector BenchmarkPresetEntries = { - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_DEKU_ONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("KakarikoGate"), RO_KAK_GATE_OPEN), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_SONGONLY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SleepingWaterfall"), RO_WATERFALL_CLOSED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ZorasFountain"), RO_ZF_CLOSED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RainbowBridge"), RO_BRIDGE_DUNGEON_REWARDS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("RewardCount"), 5), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BridgeRewardOptions"), RO_BRIDGE_GREG_REWARD), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanonTrialCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingAge"), RO_AGE_RANDOM), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonsEntrances"), RO_DUNGEON_ENTRANCE_SHUFFLE_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossEntrances"), RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldEntrances"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleInteriorsEntrances"), RO_INTERIOR_ENTRANCE_SHUFFLE_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGrottosEntrances"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleWarpSongs"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOverworldSpawns"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MixedEntrances"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DecoupleEntrances"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchusInLogic"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("EnableBombchuDrops"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("TriforceHunt"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_RANDOM_NUMBER), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MQDungeonsSelection"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), RO_DUNGEON_REWARDS_END_OF_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LinksPocket"), RO_LINKS_POCKET_DUNGEON_REWARD), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shopsanity"), RO_SHOPSANITY_SPECIFIC_COUNT), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShopsanityCount"), RO_SHOPSANITY_COUNT_FOUR_ITEMS), - //RANDOTODO add refactored price/scrub/merchant settings - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKokiriSword"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMasterSword"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleChildWallet"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleOcarinaButtons"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleSwim"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), RO_BOSS_SOULS_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_BOTH), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_LACS_MEDALLIONS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LacsMedallionCount"), 6), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleKeyRings"), RO_KEYRINGS_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipChildZelda"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipEponaRace"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 4), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GossipStoneHints"), RO_GOSSIP_STONES_NEED_NOTHING), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HintClarity"), RO_HINT_CLARITY_CLEAR), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HintDistribution"), RO_HINT_DIST_STRONG), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AltarHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GanondorfHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SheikLAHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SariaHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FrogsHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("OoTHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BiggoronHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BigPoesHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ChickensHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("WarpSongText"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ScrubText"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("10GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("20GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("30GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MaskShopHint"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BlueFireArrows"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SunlightArrows"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("InfiniteUpgrades"), RO_INF_UPGRADES_PROGRESSIVE), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkeletonKey"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ItemPool"), RO_ITEM_POOL_BALANCED), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("IceTraps"), RO_ICE_TRAPS_NORMAL), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingOcarina"), RO_STARTING_OCARINA_FAIRY), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingDekuShield"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingKokiriSword"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMasterSword"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingConsumables"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingZeldasLullaby"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingEponasSong"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSariasSong"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSunsSong"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSongOfTime"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSongOfStorms"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMinuetOfForest"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingBoleroOfFire"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSerenadeOfWater"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingRequiemOfSpirit"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingNocturneOfShadow"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingPreludeOfLight"), RO_GENERIC_OFF), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingSkulltulaToken"), 0), - PRESET_ENTRY_S32("gRandomizeStartingHearts", 2), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("AllLocationsReachable"), RO_GENERIC_ON), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GsExpectSunsSong"), RO_GENERIC_ON), -}; - -typedef struct PresetDefinition { - const char* label; - const char* description; - std::vector entries; -} PresetDefinition; - -typedef struct PresetTypeDefinition { - std::vector blocksToClear; - std::map presets; -} PresetTypeDefinition; - -const std::map presetTypes = { - { PRESET_TYPE_ENHANCEMENTS, { { CVAR_PREFIX_ENHANCEMENT, CVAR_PREFIX_CHEAT }, { - { ENHANCEMENT_PRESET_DEFAULT, { - "Default", - "Reset all options to their default values.", - {}, - } }, - { ENHANCEMENT_PRESET_VANILLA_PLUS, { - "Vanilla Plus", - "Adds Quality of Life features that enhance your experience, but don't alter gameplay. Recommended for a first playthrough of OoT.", - vanillaPlusPresetEntries, - } }, - { ENHANCEMENT_PRESET_ENHANCED, { - "Enhanced", - "The \"Vanilla Plus\" preset, but with more quality of life enhancements that might alter gameplay slightly. Recommended for returning players.", - enhancedPresetEntries - } }, - { ENHANCEMENT_PRESET_RANDOMIZER, { - "Randomizer", - "The \"Enhanced\" preset, plus any other enhancements that are recommended for playing Randomizer.", - randomizerPresetEntries - } }, - } } }, - { PRESET_TYPE_RANDOMIZER, { { CVAR_PREFIX_RANDOMIZER_SETTING, CVAR_PREFIX_RANDOMIZER_ENHANCEMENT }, { - { RANDOMIZER_PRESET_DEFAULT, { - "Default", - "Reset all options to their default values.", - {}, - } }, - { RANDOMIZER_PRESET_SPOCK_RACE, { - "Spock Race", - "Race preset used for the official Ship of Harkinian race on June 3rd 2023. The following settings are notable:\n" \ - "- Rainbow Bridge is set to Greg\n" \ - "- Ganon's Boss Key is 5 dungeon rewards\n" \ - "- Shopsanity and Scrubsanity enabled\n" \ - "- All locations reachable is off\n", \ - spockRacePresetEntries, - } }, - { RANDOMIZER_PRESET_SPOCK_RACE_NO_LOGIC, { - "Spock Race - No Logic", - "No Logic Race preset used for official Ship of Harkinian No Logic races. The following settings are " - "notable:\n" - "- Rainbow Bridge is set to Greg\n" - "- Ganon's Boss Key is 5 dungeon rewards\n" - "- Shopsanity and Scrubsanity enabled\n" - "- All locations reachable is off\n", - spockRaceNoLogicPresetEntries, - } }, - { RANDOMIZER_PRESET_S6, { - "S6 Tournament (Adapted)", - "Matches OOTR S6 tournament settings as close as we can get with the options available in SoH. The following differences are notable:\n" \ - "- Both child and adult overworld spawns are randomized\n" \ - "- Dungeon rewards are shuffled at the end of dungeons, rather than at the end of their own dungeon\n" \ - "- Full adult trade sequence is shuffled instead of the selected 4\n" \ - "- Hint distribution no \"tournament\" mode, falling back to balanced", - s6PresetEntries, - } }, - { RANDOMIZER_PRESET_HELL_MODE, { - "Hell Mode", - "All settings maxed but still using glitchless logic. Expect pain.", - hellModePresetEntries - } }, - { RANDOMIZER_PRESET_BENCHMARK, { - "Benchmark", - "Used for benchmarking the logic.", - BenchmarkPresetEntries - } }, - } } } -}; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4b88d7e2a..081df968c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -17,7 +17,7 @@ #include #include "../custom-message/CustomMessageTypes.h" #include "../item-tables/ItemTableManager.h" -#include "../presets.h" +#include "../Presets/Presets.h" #include "../../../src/overlays/actors/ovl_En_GirlA/z_en_girla.h" #include #include "randomizer_check_objects.h" @@ -1924,11 +1924,10 @@ bool GenerateRandomizer(std::string seed /*= ""*/) { static const std::unordered_map randomizerPresetList = { { RANDOMIZER_PRESET_DEFAULT, "Default" }, - { RANDOMIZER_PRESET_SPOCK_RACE, "Spock Race" }, - { RANDOMIZER_PRESET_SPOCK_RACE_NO_LOGIC, "Spock Race (No Logic)" }, - { RANDOMIZER_PRESET_S6, "S6" }, - { RANDOMIZER_PRESET_HELL_MODE, "Hell Mode" }, - { RANDOMIZER_PRESET_BENCHMARK, "Benchmark" } + { RANDOMIZER_PRESET_BEGINNER, "Beginner" }, + { RANDOMIZER_PRESET_STANDARD, "Standard" }, + { RANDOMIZER_PRESET_ADVANCED, "Advanced" }, + { RANDOMIZER_PRESET_HELL_MODE, "Hell Mode" } }; static int32_t randomizerPresetSelected = RANDOMIZER_PRESET_DEFAULT; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 2e6a61e89..f001a7cb7 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1268,7 +1268,8 @@ void Settings::UpdateOptionProperties() { mOptions[RSK_GANONS_TRIALS].Enable(); mOptions[RSK_TRIAL_COUNT].Enable(); // Only show the trial count slider if Trials is set to Set Number - if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SKIP) == RO_GANONS_TRIALS_SET_NUMBER) { + if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("GanonTrial"), RO_GANONS_TRIALS_SET_NUMBER) == + RO_GANONS_TRIALS_SET_NUMBER) { mOptions[RSK_GANONS_TRIALS].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM); mOptions[RSK_TRIAL_COUNT].Unhide(); } else { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 792bf0639..ee98a70b3 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -43,7 +43,7 @@ #include "window/gui/resource/Font.h" #include #include "Enhancements/custom-message/CustomMessageManager.h" -#include "Enhancements/presets.h" +#include "Enhancements/Presets/Presets.h" #include "util.h" #include diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 40996fc59..222df054f 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -25,7 +25,7 @@ #include "include/z64audio.h" #include "soh/SaveManager.h" #include "soh/OTRGlobals.h" -#include "soh/Enhancements/presets.h" +#include "soh/Enhancements/Presets/Presets.h" #include "soh/resource/type/Skeleton.h" #include "libultraship/libultraship.h" diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h index 9b65e2e79..bb4fc7b0f 100644 --- a/soh/soh/SohGui/SohMenu.h +++ b/soh/soh/SohGui/SohMenu.h @@ -7,7 +7,7 @@ #include "graphic/Fast3D/gfx_rendering_api.h" #include "soh/cvar_prefixes.h" #include "soh/Enhancements/enhancementTypes.h" -#include "soh/Enhancements/presets.h" +#include "soh/Enhancements/Presets/Presets.h" extern "C" { #include "z64.h" diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index ed63fea7b..e7633f0f2 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -14,7 +14,7 @@ #include "functions.h" #include "variables.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/presets.h" +#include "soh/Enhancements/Presets/Presets.h" #include "soh/Enhancements/mods.h" #include "soh/Notification/Notification.h" #include "soh/Enhancements/cosmetics/authenticGfxPatches.h" diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 85cbc6734..3ad6b4064 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include static std::string comboboxTooltip = ""; @@ -883,16 +883,16 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix Camera Drift", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixCameraDrift")) .Options(CheckboxOptions().Tooltip( - "Fixes camera slightly drifting to the left when standing still due to a math error.")); + "Fixes camera slightly drifting to the left when standing still due to a math error. May impact certain glitches.")); AddWidget(path, "Fix Camera Swing", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixCameraSwing")) .Options(CheckboxOptions().Tooltip( "Fixes camera getting stuck on collision when standing still. Also fixes slight shift " - "back in camera when Link stops moving.")); + "back in camera when Link stops moving. May impact certain glitches.")); AddWidget(path, "Fix Hanging Ledge Swing Rate", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixHangingLedgeSwingRate")) .Options(CheckboxOptions().Tooltip( - "Fixes camera swing rate when the player falls off a ledge and the camera swings around.")); + "Fixes camera swing rate when the player falls off a ledge and the camera swings around. May impact certain glitches.")); path.column = SECTION_COLUMN_2; AddWidget(path, "Graphical Fixes", WIDGET_SEPARATOR_TEXT); @@ -1360,6 +1360,11 @@ void SohMenu::AddMenuEnhancements() { .PreFunc(fishingDisabledFunc) .Options( CheckboxOptions().Tooltip("The Pond Owner will not ask to confirm if you want to keep a smaller Fish.")); + AddWidget(path, "All Fish are Hyrule Loaches", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("AllHyruleLoaches")) + .PreFunc(fishingDisabledFunc) + .Options(CheckboxOptions().Tooltip("Every fish in the Fishing Pond will always be a Hyrule Loach.\n\n" + "NOTE: This requires reloading the area.")); AddWidget(path, "Child Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("MinimumFishWeightChild")) .PreFunc(fishingDisabledFunc) @@ -1370,11 +1375,6 @@ void SohMenu::AddMenuEnhancements() { .PreFunc(fishingDisabledFunc) .Options(IntSliderOptions().Min(6).Max(13).DefaultValue(13).Format("%d lbs.").Tooltip( "The minimum weight for the unique fishing reward as an Adult.")); - AddWidget(path, "All Fish are Hyrule Loaches", WIDGET_CVAR_SLIDER_INT) - .CVar(CVAR_ENHANCEMENT("AllHyruleLoaches")) - .PreFunc(fishingDisabledFunc) - .Options(IntSliderOptions().Tooltip("Every fish in the Fishing Pond will always be a Hyrule Loach.\n\n" - "NOTE: This requires reloading the area.")); // Extra Modes path.sidebarName = "Extra Modes"; diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 20ce9ff50..eaa739afc 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -113,7 +113,7 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Boot", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX) - .CVar(CVAR_ENHANCEMENT("BootSequence")) + .CVar(CVAR_SETTING("BootSequence")) .Options(ComboboxOptions() .DefaultIndex(BOOTSEQUENCE_DEFAULT) .LabelPosition(LabelPositions::Far) From 084627b8af862404b8df4288efab44301b2f466b Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 24 Mar 2025 17:58:56 -0400 Subject: [PATCH 137/267] Force excluded locations update when preset is applied. (#5205) * Force excluded locations update when preset is applied. * Apply same fix for tricks tab * Address review comment --- soh/soh/Enhancements/randomizer/randomizer.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 081df968c..8809d8691 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1937,6 +1937,8 @@ void RandomizerSettingsWindow::DrawElement() { generated = 0; randoThread.join(); } + static bool locationsTabOpen = false; + static bool tricksTabOpen = false; bool disableEditingRandoSettings = CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings); const PresetTypeDefinition presetTypeDef = presetTypes.at(PRESET_TYPE_RANDOMIZER); @@ -1971,6 +1973,9 @@ void RandomizerSettingsWindow::DrawElement() { CVarSetInteger(presetTypeCvar.c_str(), randomizerPresetSelected); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); mSettings->UpdateOptionProperties(); + // force excluded location list and trick list update if tab is open. + locationsTabOpen = false; + tricksTabOpen = false; } UIWidgets::Spacer(0); @@ -2060,7 +2065,6 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndDisabled(); ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); - static bool locationsTabOpen = false; if (ImGui::BeginTabItem("Locations")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (!locationsTabOpen) { @@ -2189,7 +2193,6 @@ void RandomizerSettingsWindow::DrawElement() { } ImGui::EndDisabled(); - static bool tricksTabOpen = false; if (ImGui::BeginTabItem("Tricks/Glitches")) { if (!tricksTabOpen) { tricksTabOpen = true; From 5bf1dc8285abede08a669d4b21f2355c1fc1e8e1 Mon Sep 17 00:00:00 2001 From: Archez Date: Mon, 24 Mar 2025 21:27:38 -0400 Subject: [PATCH 138/267] Fix unhandled opcode crash with authentic gfx patches (#5206) --- .../cosmetics/authenticGfxPatches.cpp | 148 +++++++++++------- 1 file changed, 89 insertions(+), 59 deletions(-) diff --git a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp index 75f6bd35d..aad43a99d 100644 --- a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp +++ b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp @@ -18,7 +18,7 @@ typedef struct { int startInstruction; } DListPatchInfo; -static DListPatchInfo freezardEffectDListPatchInfos[] = { +static DListPatchInfo freezardBodyDListPatchInfos[] = { { gFreezardIntactDL, 5 }, { gFreezardTopRightHornChippedDL, 5 }, { gFreezardHeadChippedDL, 5 }, @@ -67,76 +67,97 @@ static DListPatchInfo ironKnuckleDListPatchInfos[] = { void PatchDekuStickTextureOverflow() { // Custom texture for holding Deku Stick that accounts for overflow texture reading - Gfx gDekuStickOverflowTexFix = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gDekuStickOverflowTex); + Gfx dekuSticTexkWithOverflowFixGfx = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gDekuStickOverflowTex); // Gfx instructions to fix authentic vanilla bug where the Deku Stick texture is read as the wrong size - Gfx gDekuStickTexFix[] = { + Gfx dekuStickTexWithSizeFixGfx[] = { gsDPLoadTextureBlock(gDekuStickTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 8, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD) + G_TX_NOMIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD), }; const char* dlist = gLinkChildLinkDekuStickDL; int start = 5; + // Patch using custom overflowed texture if (!CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0)) { // Unpatch the other texture fix - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string unpatchName = "DekuStickFix" + std::to_string(instruction); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "dekuStickWithSizeFix_" + std::to_string(instruction); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); } - std::string patchName = "DekuStickOverflow" + std::to_string(start); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, gDekuStickOverflowTexFix); - } else { + std::string patchName = "dekuStickWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "dekuStickWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, dekuSticTexkWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, gsSPNoOp()); + } else { // Patch texture to use correct image size/fmt // Unpatch the other texture fix - std::string unpatchName = "DekuStickOverflow" + std::to_string(start); + std::string unpatchName = "dekuStickWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "dekuStickWithOverflowFix_" + std::to_string(start + 1); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); - - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string patchName = "DekuStickFix" + std::to_string(instruction); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gDekuStickTexFix[i]); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); + + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string patchName = "dekuStickWithSizeFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, dekuStickTexWithSizeFixGfx[i - 1]); + } } } } void PatchFreezardTextureOverflow() { // Custom texture for Freezard effect that accounts for overflow texture reading - Gfx gEffUnknown12OverflowTextFix = gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, gEffUnknown12OverflowTex); + Gfx freezardBodyTextureWithOverflowFixGfx = + gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_16b, 1, gEffUnknown12OverflowTex); // Gfx instructions to fix authentic vanilla bug where the Freezard effect texture is read as the wrong format - Gfx gEffUnknown12TexFix[] = { - gsDPLoadTextureBlock(gEffUnknown12Tex, 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, G_TX_NOLOD, G_TX_NOLOD) + Gfx freezardBodyTextureWithFormatFixGfx[] = { + gsDPLoadTextureBlock(gEffUnknown12Tex, 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, G_TX_NOLOD, G_TX_NOLOD), }; - for (const auto& patchInfo : freezardEffectDListPatchInfos) { + bool fixTexturesOOB = CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0); + + for (const auto& patchInfo : freezardBodyDListPatchInfos) { const char* dlist = patchInfo.dlist; int start = patchInfo.startInstruction; - char patchNameBuf[24]; - // Patch using custom overflowed texture - if (!CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0)) { + if (!fixTexturesOOB) { // Unpatch the other texture fix - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string unpatchName = "gEffUnknown12Fix" + std::to_string(instruction); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "freezardBodyTextureWithFormatFix_" + std::to_string(instruction); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); } - std::string patchName = "gEffUnknown12Overflow" + std::to_string(start); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, gEffUnknown12OverflowTextFix); - } else { // Patch texture to use correct image size + std::string patchName = "freezardBodyTextureWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "freezardBodyTextureWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, freezardBodyTextureWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, gsSPNoOp()); + } else { // Patch texture to use correct image size/fmt // Unpatch the other texture fix - std::string unpatchName = "gEffUnknown12Overflow" + std::to_string(start); + std::string unpatchName = "freezardBodyTextureWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "freezardBodyTextureWithOverflowFix_" + std::to_string(start + 1); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string patchName = "gEffUnknown12Fix" + std::to_string(instruction); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gEffUnknown12TexFix[i]); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string patchName = "freezardBodyTextureWithFormatFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, + freezardBodyTextureWithFormatFixGfx[i - 1]); + } } } } @@ -144,44 +165,53 @@ void PatchFreezardTextureOverflow() { void PatchIronKnuckleTextureOverflow() { // Custom texture for Iron Knuckle that accounts for overflow texture reading - Gfx gIronKnuckleMetalOverflowTexFix = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gIronKnuckleMetalOverflowTex); + Gfx ironKnuckleFireTexWithOverflowFixGfx = + gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gIronKnuckleMetalOverflowTex); // Gfx instructions to fix authentic vanilla bug where the Iron Knuckle texture is read as the wrong format - Gfx gIronKnuckleMetalTexFix[] = { - gsDPLoadTextureBlock(gIronKnuckleMetalTex, G_IM_FMT_I, G_IM_SIZ_4b, 32, 64, 0, G_TX_MIRROR | G_TX_WRAP, - G_TX_MIRROR | G_TX_WRAP, 5, 6, G_TX_NOLOD, G_TX_NOLOD) + Gfx ironKnuckleFireTexWithFormatFixGfx[] = { + gsDPLoadTextureBlock_4b(gIronKnuckleMetalTex, G_IM_FMT_I, 32, 64, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 5, 6, G_TX_NOLOD, G_TX_NOLOD), }; + bool fixTexturesOOB = CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0); + for (const auto& patchInfo : ironKnuckleDListPatchInfos) { const char* dlist = patchInfo.dlist; int start = patchInfo.startInstruction; - // OTRTODO: Patching to use the correct size format for Iron Knuckle causes a tile size failure - // Until this is solved, Iron Knuckle will be hardcoded to always display with the "authentic" texture fix - // Patch using custom overflowed texture - // if (!CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0)) { + if (!fixTexturesOOB) { // Unpatch the other texture fix - for (size_t i = 0; i < 7; i++) { - int instruction = start + (i == 0 ? 0 : i + 1); - std::string unpatchName = "MetalTexFix" + std::to_string(instruction); + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "ironKnuckleFireTexWithSizeFix_" + std::to_string(instruction); ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); } - std::string patchName = "MetalTexOverflow" + std::to_string(start); - ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, gIronKnuckleMetalOverflowTexFix); - // } else { // Patch texture to use correct image size - // // Unpatch the other texture fix - // std::string unpatchName = "MetalTexOverflow" + std::to_string(start); - // ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + std::string patchName = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, ironKnuckleFireTexWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, ironKnuckleFireTexWithOverflowFixGfx); + } else { // Patch texture to use correct image size/fmt + // Unpatch the other texture fix + std::string unpatchName = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "ironKnuckleFireTexWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); - // // Patch texture to use correct image size - // for (size_t i = 0; i < 7; i++) { - // int instruction = start + (i == 0 ? 0 : i + 1); - // std::string patchName = "MetalTexFix" + std::to_string(instruction); - // ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gIronKnuckleMetalTexFix[i]); - // } - // } + for (size_t i = 0; i < 8; i++) { + int instruction = start + i; + std::string patchName = "ironKnuckleFireTexWithSizeFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, + ironKnuckleFireTexWithFormatFixGfx[i - 1]); + } + } + } } } From 890f3ccee6603d8f79fc74d605e87b827936bb3f Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 25 Mar 2025 04:20:08 -0400 Subject: [PATCH 139/267] Change soh override windows to use different cvar name (#5208) --- soh/soh/SohGui/SohGui.cpp | 4 ++-- soh/soh/SohGui/SohMenuBar.cpp | 2 -- soh/soh/SohGui/SohMenuDevTools.cpp | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 222df054f..213efcfd4 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -125,10 +125,10 @@ namespace SohGui { SPDLOG_ERROR("Could not find stats window"); } - mConsoleWindow = std::make_shared(CVAR_WINDOW("Console"), "Console##SoH", ImVec2(820, 630)); + mConsoleWindow = std::make_shared(CVAR_WINDOW("SohConsole"), "Console##SoH", ImVec2(820, 630)); gui->AddGuiWindow(mConsoleWindow); - mGfxDebuggerWindow = std::make_shared(CVAR_WINDOW("GfxDebugger"), "GfxDebugger##SoH", ImVec2(820, 630)); + mGfxDebuggerWindow = std::make_shared(CVAR_WINDOW("SohGfxDebugger"), "GfxDebugger##SoH", ImVec2(820, 630)); gui->AddGuiWindow(mGfxDebuggerWindow); mInputEditorWindow = gui->GetGuiWindow("Controller Configuration"); diff --git a/soh/soh/SohGui/SohMenuBar.cpp b/soh/soh/SohGui/SohMenuBar.cpp index e7633f0f2..170ef349a 100644 --- a/soh/soh/SohGui/SohMenuBar.cpp +++ b/soh/soh/SohGui/SohMenuBar.cpp @@ -84,8 +84,6 @@ namespace SohGui { std::unordered_map availableWindowBackendsMap; Ship::WindowBackend configWindowBackend; -extern std::shared_ptr mGfxDebuggerWindow; - void DrawSettingsMenu() { } diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index 6e7b71eae..c8b3e96b7 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -98,7 +98,7 @@ void SohMenu::AddMenuDevTools() { path.sidebarName = "Console"; AddSidebarEntry("Dev Tools", path.sidebarName, 1); AddWidget(path, "Popout Console", WIDGET_WINDOW_BUTTON) - .CVar(CVAR_WINDOW("Console")) + .CVar(CVAR_WINDOW("SohConsole")) .WindowName("Console##SoH") .Options(WindowButtonOptions().Tooltip("Enables the separate Console Window.")); @@ -162,7 +162,7 @@ void SohMenu::AddMenuDevTools() { path.sidebarName = "Gfx Debugger"; AddSidebarEntry("Dev Tools", path.sidebarName, 1); AddWidget(path, "Popout Gfx Debugger", WIDGET_WINDOW_BUTTON) - .CVar(CVAR_WINDOW("GfxDebugger")) + .CVar(CVAR_WINDOW("SohGfxDebugger")) .WindowName("GfxDebugger##SoH") .Options(WindowButtonOptions().Tooltip("Enables the separate Gfx Debugger Window.")); } From 0f1fb1e5def29b50bb7355ed7179b771c1a1925c Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 25 Mar 2025 04:21:44 -0400 Subject: [PATCH 140/267] Add OOB texture fix entry for Arrow heads (#5207) --- .../objects/gameplay_keep/gameplay_keep.h | 3 + .../xml/GC_MQ_D/objects/gameplay_keep.xml | 2 + .../xml/GC_MQ_PAL_F/objects/gameplay_keep.xml | 2 + .../xml/GC_NMQ_D/objects/gameplay_keep.xml | 2 + .../GC_NMQ_PAL_F/objects/gameplay_keep.xml | 2 + .../xml/N64_PAL_10/objects/gameplay_keep.xml | 2 + .../xml/N64_PAL_11/objects/gameplay_keep.xml | 2 + .../cosmetics/authenticGfxPatches.cpp | 58 +++++++++++++++++++ 8 files changed, 73 insertions(+) diff --git a/soh/assets/objects/gameplay_keep/gameplay_keep.h b/soh/assets/objects/gameplay_keep/gameplay_keep.h index 6377e165d..638125397 100644 --- a/soh/assets/objects/gameplay_keep/gameplay_keep.h +++ b/soh/assets/objects/gameplay_keep/gameplay_keep.h @@ -21,6 +21,9 @@ static const ALIGN_ASSET(2) char gHilite1Tex[] = dgHilite1Tex; #define dgHilite2Tex "__OTR__objects/gameplay_keep/gHilite2Tex" static const ALIGN_ASSET(2) char gHilite2Tex[] = dgHilite2Tex; +#define dgHilite2Tex_Overflow "__OTR__objects/gameplay_keep/gHilite2Tex_Overflow" +static const ALIGN_ASSET(2) char gHilite2Tex_Overflow[] = dgHilite2Tex_Overflow; + #define dgHylianShieldDesignTex "__OTR__objects/gameplay_keep/gHylianShieldDesignTex" static const ALIGN_ASSET(2) char gHylianShieldDesignTex[] = dgHylianShieldDesignTex; diff --git a/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml index 992525114..4a071ef98 100644 --- a/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_MQ_D/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml index 5ffc52f65..882422884 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml index 5ffc52f65..905f5d272 100644 --- a/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml index 5ffc52f65..882422884 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml b/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml index 5ffc52f65..882422884 100644 --- a/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml +++ b/soh/assets/xml/N64_PAL_10/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml b/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml index 5ffc52f65..882422884 100644 --- a/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml +++ b/soh/assets/xml/N64_PAL_11/objects/gameplay_keep.xml @@ -7,6 +7,8 @@ + + diff --git a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp index aad43a99d..0738ff6da 100644 --- a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp +++ b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp @@ -65,6 +65,63 @@ static DListPatchInfo ironKnuckleDListPatchInfos[] = { { object_ik_DL_01D638, 110 }, }; +static DListPatchInfo arrowTipDListPatchInfos[] = { + { gArrowNearDL, 46 }, + { gArrowFarDL, 5 }, +}; + +void PatchArrowTipTexture() { + // Custom texture for Arrow tips that accounts for overflow texture reading + Gfx arrowTipTextureWithOverflowFixGfx = + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, gHilite2Tex_Overflow); + + // Gfx instructions to fix authentic vanilla bug where the Arrow tips texture is read as the wrong size + Gfx arrowTipTextureWithSizeFixGfx[] = { + gsDPLoadTextureBlock(gHilite2Tex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 5, 5, 1, 1), + }; + + bool fixTexturesOOB = CVarGetInteger(CVAR_ENHANCEMENT("FixTexturesOOB"), 0); + + for (const auto& patchInfo : arrowTipDListPatchInfos) { + const char* dlist = patchInfo.dlist; + int start = patchInfo.startInstruction; + + // Patch using custom overflowed texture + if (!fixTexturesOOB) { + // Unpatch the other texture fix + for (size_t i = 4; i < 8; i++) { + int instruction = start + i; + std::string unpatchName = "arrowTipTextureWithSizeFix_" + std::to_string(instruction); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + } + + std::string patchName = "arrowTipTextureWithOverflowFix_" + std::to_string(start); + std::string patchName2 = "arrowTipTextureWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), start, arrowTipTextureWithOverflowFixGfx); + ResourceMgr_PatchGfxByName(dlist, patchName2.c_str(), start + 1, gsSPNoOp()); + } else { // Patch texture to use correct image size/fmt + // Unpatch the other texture fix + std::string unpatchName = "arrowTipTextureWithOverflowFix_" + std::to_string(start); + std::string unpatchName2 = "arrowTipTextureWithOverflowFix_" + std::to_string(start + 1); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName.c_str()); + ResourceMgr_UnpatchGfxByName(dlist, unpatchName2.c_str()); + + for (size_t i = 4; i < 8; i++) { + int instruction = start + i; + std::string patchName = "arrowTipTextureWithSizeFix_" + std::to_string(instruction); + + if (i == 0) { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, gsSPNoOp()); + } else { + ResourceMgr_PatchGfxByName(dlist, patchName.c_str(), instruction, + arrowTipTextureWithSizeFixGfx[i - 1]); + } + } + } + } +} + void PatchDekuStickTextureOverflow() { // Custom texture for holding Deku Stick that accounts for overflow texture reading Gfx dekuSticTexkWithOverflowFixGfx = gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b, 1, gDekuStickOverflowTex); @@ -216,6 +273,7 @@ void PatchIronKnuckleTextureOverflow() { } void ApplyAuthenticGfxPatches() { + PatchArrowTipTexture(); PatchDekuStickTextureOverflow(); PatchFreezardTextureOverflow(); PatchIronKnuckleTextureOverflow(); From aabeffa254fe5be787ea0a5c21912b3c4cdd9d2b Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 25 Mar 2025 04:22:18 -0400 Subject: [PATCH 141/267] prep for clang format (#5202) --- soh/soh/ActorDB.cpp | 2 +- .../Enhancements/TimeDisplay/TimeDisplay.h | 4 +-- .../Enhancements/audio/AudioCollection.cpp | 3 +- soh/soh/Enhancements/audio/AudioEditor.cpp | 4 +-- soh/soh/Enhancements/boss-rush/BossRush.cpp | 28 +++++++++---------- .../Enhancements/boss-rush/BossRushTypes.h | 18 ++++++------ .../cosmetics/CosmeticsEditor.cpp | 6 ++-- .../Enhancements/cosmetics/CosmeticsEditor.h | 2 +- .../Enhancements/cosmetics/cosmeticsTypes.h | 4 +-- .../custom-message/CustomMessageManager.cpp | 8 +++--- .../Enhancements/debugger/MessageViewer.cpp | 2 +- soh/soh/Enhancements/debugger/actorViewer.cpp | 22 +++++++-------- .../Enhancements/debugger/debugSaveEditor.h | 6 ++-- soh/soh/Enhancements/debugger/valueViewer.cpp | 2 ++ soh/soh/Enhancements/enhancementTypes.h | 8 +++--- soh/soh/Enhancements/gameplaystats.cpp | 2 ++ soh/soh/Enhancements/mods.cpp | 5 ++-- .../randomizer/3drando/hint_list.cpp | 5 +++- .../hint_list/hint_list_exclude_dungeon.cpp | 11 +++++--- .../hint_list/hint_list_exclude_overworld.cpp | 2 ++ .../3drando/hint_list/hint_list_item.cpp | 4 ++- .../randomizer/3drando/item_pool.cpp | 6 ++-- soh/soh/Enhancements/randomizer/Plandomizer.h | 4 +-- .../Enhancements/randomizer/ShuffleCows.cpp | 5 +++- .../randomizer/ShuffleFairies.cpp | 3 ++ .../randomizer/ShuffleFreestanding.cpp | 5 +++- .../Enhancements/randomizer/ShufflePots.cpp | 5 +++- soh/soh/Enhancements/randomizer/entrance.cpp | 2 ++ .../Enhancements/randomizer/fishsanity.cpp | 2 ++ soh/soh/Enhancements/randomizer/fishsanity.h | 2 +- .../Enhancements/randomizer/hook_handlers.cpp | 18 ++++++------ soh/soh/Enhancements/randomizer/item_list.cpp | 4 +++ .../randomizer/location_access.cpp | 5 +++- .../dungeons/bottom_of_the_well.cpp | 4 ++- .../location_access/dungeons/deku_tree.cpp | 5 +++- .../dungeons/dodongos_cavern.cpp | 5 +++- .../location_access/dungeons/fire_temple.cpp | 5 +++- .../dungeons/forest_temple.cpp | 5 +++- .../dungeons/ganons_castle.cpp | 4 ++- .../dungeons/gerudo_training_ground.cpp | 4 ++- .../location_access/dungeons/ice_cavern.cpp | 4 ++- .../dungeons/jabujabus_belly.cpp | 5 +++- .../dungeons/shadow_temple.cpp | 5 +++- .../dungeons/spirit_temple.cpp | 5 +++- .../location_access/dungeons/water_temple.cpp | 5 +++- .../location_access/gerudo_fortress.cpp | 5 +++- .../overworld/castle_grounds.cpp | 5 +++- .../overworld/death_mountain_crater.cpp | 5 +++- .../overworld/death_mountain_trail.cpp | 5 +++- .../overworld/desert_colossus.cpp | 5 +++- .../overworld/gerudo_valley.cpp | 5 +++- .../location_access/overworld/goron_city.cpp | 5 +++- .../location_access/overworld/graveyard.cpp | 3 ++ .../overworld/haunted_wasteland.cpp | 5 +++- .../overworld/hyrule_field.cpp | 5 +++- .../location_access/overworld/kakariko.cpp | 3 ++ .../overworld/kokiri_forest.cpp | 5 +++- .../location_access/overworld/lake_hylia.cpp | 3 ++ .../overworld/lon_lon_ranch.cpp | 3 ++ .../location_access/overworld/lost_woods.cpp | 5 +++- .../location_access/overworld/market.cpp | 3 ++ .../overworld/sacred_forest_meadow.cpp | 5 +++- .../overworld/temple_of_time.cpp | 5 +++- .../overworld/zoras_domain.cpp | 5 +++- .../overworld/zoras_fountain.cpp | 5 +++- .../location_access/overworld/zoras_river.cpp | 5 +++- .../Enhancements/randomizer/randomizer.cpp | 20 ++++++------- .../Enhancements/randomizer/randomizerTypes.h | 10 +++---- .../randomizer/randomizer_entrance.c | 3 ++ .../randomizer_entrance_tracker.cpp | 3 ++ .../randomizer/randomizer_grotto.c | 6 ++++ .../Enhancements/randomizer/static_data.cpp | 9 ++++-- .../Enhancements/timesplits/TimeSplits.cpp | 6 ++++ soh/soh/OTRGlobals.cpp | 12 ++++---- soh/soh/SohGui/ImGuiUtils.cpp | 2 +- soh/soh/frame_interpolation.cpp | 2 ++ 76 files changed, 299 insertions(+), 134 deletions(-) diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index 880b2dab9..8b7c43ee6 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -462,7 +462,7 @@ static constexpr std::pair actorDescriptionData[] = { { ACTOR_EN_ZL4, "Zelda (Child)" }, { ACTOR_EN_MM2, "Running Man (Adult Era)" }, { ACTOR_BG_JYA_BLOCK, "Silver Block (Child Era)" }, - { ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" } + { ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" }, }; static std::unordered_map actorDescriptions = std::unordered_map(std::begin(actorDescriptionData), std::end(actorDescriptionData)); diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h index 671577631..41cda077f 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h @@ -17,7 +17,7 @@ typedef enum TimerDisplay { DISPLAY_IN_GAME_TIMER, DISPLAY_TIME_OF_DAY, DISPLAY_CONDITIONAL_TIMER, - DISPLAY_NAVI_TIMER + DISPLAY_NAVI_TIMER, } TimerDisplay; typedef enum NaviTimerValues { @@ -34,4 +34,4 @@ typedef struct { const char* timeEnable; } TimeObject; -extern const std::vector timeDisplayList; \ No newline at end of file +extern const std::vector timeDisplayList; diff --git a/soh/soh/Enhancements/audio/AudioCollection.cpp b/soh/soh/Enhancements/audio/AudioCollection.cpp index 28e8d3d99..13b793b90 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.cpp +++ b/soh/soh/Enhancements/audio/AudioCollection.cpp @@ -14,6 +14,7 @@ { sequenceId, { sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement } } AudioCollection::AudioCollection() { + // clang-format off // (originalSequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement), sequenceMap = { @@ -328,7 +329,7 @@ AudioCollection::AudioCollection() { //SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x88_YOBI, "NA_SE_VO_DUMMY_0x88_YOBI", "NA_SE_VO_DUMMY_0x88_YOBI", SEQ_VOICE, true, false), // .. //SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x89_YOBI, "NA_SE_VO_DUMMY_0x89_YOBI", "NA_SE_VO_DUMMY_0x89_YOBI", SEQ_VOICE, true, false), // .. }; - + // clang-format on } std::string AudioCollection::GetCvarKey(std::string sfxKey) { diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index caa40c66f..2e94e924a 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -618,7 +618,7 @@ void AudioEditor::DrawElement() { {SEQ_SFX, true }, {SEQ_VOICE, true }, {SEQ_INSTRUMENT, true}, - {SEQ_BGM_CUSTOM, true} + {SEQ_BGM_CUSTOM, true}, }; // make temporary sets because removing from the set we're iterating through crashes ImGui @@ -772,7 +772,7 @@ void AudioEditor::DrawElement() { UIWidgets::PopStyleTabs(); } -std::vector allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE }; +std::vector allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE, }; void AudioEditor_RandomizeAll() { for (auto type : allTypes) { diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index aabe5d67a..6f218fcb3 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -1,4 +1,4 @@ -#include "BossRush.h" +#include "BossRush.h" #include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" @@ -34,7 +34,7 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { { "All", "Alle", "Tous" }, { "Child", "Kind", "Enfant" }, { "Adult", "Erwachsener", "Adulte" }, - { "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" } + { "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" }, } }, { @@ -45,7 +45,7 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { { "20", "20", "20" }, { "3", "3", "3" }, { "5", "5", "5" }, - { "7", "7", "7" } + { "7", "7", "7" }, } }, { @@ -53,7 +53,7 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { { { "Limited", "Limitiert", "Limitées" }, { "Full", "Voll", "Pleines" }, - { "Maxed", "Maximum", "Maximum" } + { "Maxed", "Maximum", "Maximum" }, } }, { @@ -61,28 +61,28 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { { { "Before Ganondorf", "Vor Ganondorf", "Avant Ganondorf" }, { "Every Boss", "Bei jedem Boss", "Tous les Boss" }, - { "Never", "Niemals", "Jamais" } + { "Never", "Niemals", "Jamais" }, } }, { { "HYPER BOSSES:", "HYPER-BOSSE:", "HYPER BOSS:" }, { { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } + { "Yes", "Ja", "Oui" }, } }, { { "MAGIC:", "MAGIE:", "MAGIE:" }, { { "Single", "Einzel", "Simple" }, - { "Double", "Doppel", "Double" } + { "Double", "Doppel", "Double" }, } }, { { "BIG. SWORD:", "BIG.-SCHWERT:", "EPÉE DE BIG.:" }, { { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } + { "Yes", "Ja", "Oui" }, } }, { @@ -93,35 +93,35 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { { "Fairy", "Fee", "Fée" }, { "Red Potion", "Rotes Elixier", "Potion Rouge" }, { "Green Potion", "Grünes Elixier", "Potion Verte" }, - { "Blue Potion", "Blaues Elixier", "Potion Bleue" } + { "Blue Potion", "Blaues Elixier", "Potion Bleue" }, } }, { { "LONGSHOT:", "ENTERHAKEN:", "SUPER GRAPPIN:" }, { { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } + { "Yes", "Ja", "Oui" }, } }, { { "HOVER BOOTS:", "GLEITSTIEFEL:", "BOTTES DES AIRS:" }, { { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } + { "Yes", "Ja", "Oui" }, } }, { { "BUNNY HOOD:", "HASENOHREN:", "MASQUE DU LAPIN:" }, { { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" } + { "Yes", "Ja", "Oui" }, } }, { { "TIMER:", "TIMER:", "TIMER:" }, { { "Yes", "Ja", "Oui" }, - { "No", "Nein", "Non" } + { "No", "Nein", "Non" }, } } }; @@ -507,7 +507,7 @@ void BossRush_InitSave() { static void* sSavePromptNoChoiceTexs[] = { (void*)gPauseNoENGTex, (void*)gPauseNoGERTex, - (void*)gPauseNoFRATex + (void*)gPauseNoFRATex, }; void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { diff --git a/soh/soh/Enhancements/boss-rush/BossRushTypes.h b/soh/soh/Enhancements/boss-rush/BossRushTypes.h index cf4d3aaba..973f1599f 100644 --- a/soh/soh/Enhancements/boss-rush/BossRushTypes.h +++ b/soh/soh/Enhancements/boss-rush/BossRushTypes.h @@ -37,28 +37,28 @@ typedef enum { typedef enum { BR_CHOICE_AMMO_LIMITED, BR_CHOICE_AMMO_FULL, - BR_CHOICE_AMMO_MAXED + BR_CHOICE_AMMO_MAXED, } BossRushAmmoChoices; typedef enum { BR_CHOICE_HEAL_GANONDORF, BR_CHOICE_HEAL_EVERYBOSS, - BR_CHOICE_HEAL_NEVER + BR_CHOICE_HEAL_NEVER, } BossRushHealChoices; typedef enum { BR_CHOICE_HYPERBOSSES_NO, - BR_CHOICE_HYPERBOSSES_YES + BR_CHOICE_HYPERBOSSES_YES, } BossRushHyperBossesChoices; typedef enum { BR_CHOICE_MAGIC_SINGLE, - BR_CHOICE_MAGIC_DOUBLE + BR_CHOICE_MAGIC_DOUBLE, } BossRushMagicChoices; typedef enum { BR_CHOICE_BGS_NO, - BR_CHOICE_BGS_YES + BR_CHOICE_BGS_YES, } BossRushBgsChoices; typedef enum { @@ -72,20 +72,20 @@ typedef enum { typedef enum { BR_CHOICE_LONGSHOT_NO, - BR_CHOICE_LONGSHOT_YES + BR_CHOICE_LONGSHOT_YES, } BossRushLongshotChoices; typedef enum { BR_CHOICE_HOVERBOOTS_NO, - BR_CHOICE_HOVERBOOTS_YES + BR_CHOICE_HOVERBOOTS_YES, } BossRushHoverBootsChoices; typedef enum { BR_CHOICE_BUNNYHOOD_NO, - BR_CHOICE_BUNNYHOOD_YES + BR_CHOICE_BUNNYHOOD_YES, } BossRushBunnyHoodChoices; typedef enum { BR_CHOICE_TIMER_YES, - BR_CHOICE_TIMER_NO + BR_CHOICE_TIMER_NO, } BossRushTimerChoices; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index ddd36fa56..f4a41f587 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -119,6 +119,7 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { supportsAlpha, supportsRainbow, advancedOption \ } } +// clang-format off /* So, you would like to add a new cosmetic option? BUCKLE UP @@ -439,6 +440,7 @@ static std::map cosmeticOptions = { COSMETIC_OPTION("NPC.MetalTrap", "Metal Trap", COSMETICS_GROUP_NPC, ColorRGBA8(255, 255, 255, 255), false, true, true), COSMETIC_OPTION("NPC.IronKnuckles", "Iron Knuckles", COSMETICS_GROUP_NPC, ColorRGBA8(245, 255, 205, 255), false, true, false), }; +// clang-format on static const char* MarginCvarList[] { CVAR_COSMETIC("HUD.Hearts"), @@ -461,7 +463,7 @@ static const char* MarginCvarList[] { CVAR_COSMETIC("HUD.ArcheryScore"), CVAR_COSMETIC("HUD.TitleCard.Map"), CVAR_COSMETIC("HUD.TitleCard.Boss"), - CVAR_COSMETIC("HUD.IGT") + CVAR_COSMETIC("HUD.IGT"), }; static const char* MarginCvarNonAnchor[] { @@ -469,7 +471,7 @@ static const char* MarginCvarNonAnchor[] { CVAR_COSMETIC("HUD.Timers"), CVAR_COSMETIC("HUD.ArcheryScore"), CVAR_COSMETIC("HUD.TitleCard.Map"), - CVAR_COSMETIC("HUD.TitleCard.Boss") + CVAR_COSMETIC("HUD.TitleCard.Boss"), }; void SetMarginAll(const char* ButtonName, bool SetActivated, const char* tooltip) { diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h index 9c3dd76ba..a0a836ce3 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h @@ -25,7 +25,7 @@ typedef enum { COSMETICS_GROUP_NAVI, COSMETICS_GROUP_IVAN, COSMETICS_GROUP_MESSAGE, - COSMETICS_GROUP_MAX + COSMETICS_GROUP_MAX, } CosmeticGroup; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h index 7fc454117..0b7eed3e8 100644 --- a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h +++ b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h @@ -1,6 +1,6 @@ typedef enum { COLORSCHEME_N64, - COLORSCHEME_GAMECUBE + COLORSCHEME_GAMECUBE, } DefaultColorScheme; typedef enum { @@ -15,5 +15,5 @@ typedef enum { ANCHOR_RIGHT, ANCHOR_NONE, HIDDEN, - ANCHOR_TO_LIFE_METER + ANCHOR_TO_LIFE_METER, } PosType; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 1b993dab2..a199c8a00 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -18,11 +18,11 @@ static const std::unordered_map textBoxSpecialCharacters = { }; static const std::unordered_map percentColors = { { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, { "b", QM_BLUE }, { "c", QM_LBLUE }, { "p", QM_PINK }, - { "y", QM_YELLOW }, { "B", QM_BLACK } }; + { "y", QM_YELLOW }, { "B", QM_BLACK }, }; static const std::unordered_map colorToPercent = { { QM_WHITE, "%w" }, { QM_RED, "%r"}, { QM_GREEN, "%g" }, { QM_BLUE, "%b" }, { QM_LBLUE, "%c"}, { QM_PINK, "%p" }, - { QM_YELLOW, "%y" }, { QM_BLACK, "%B" } }; + { QM_YELLOW, "%y" }, { QM_BLACK, "%B" }, }; static const std::unordered_map altarIcons = { { "0", ITEM_KOKIRI_EMERALD }, @@ -44,7 +44,7 @@ static const std::unordered_map altarIcons = { { "m", ITEM_DUNGEON_MAP }, { "C", ITEM_COMPASS }, { "s", ITEM_SKULL_TOKEN }, - { "g", ITEM_MASK_GORON } + { "g", ITEM_MASK_GORON }, }; static std::map pixelWidthTable = { @@ -72,7 +72,7 @@ static std::map pixelWidthTable = { { "í", 5 }, { "î", 5 }, { "ï", 5 }, { "ð", 7 }, { "ñ", 7 }, { "ò", 7 }, { "ó", 7 }, { "ô", 7 }, { "õ", 7 }, { "ö", 7 }, { "÷", 11 }, { "ø", 9 }, { "ù", 7 }, { "ú", 7 }, { "û", 7 }, { "ü", 7 }, { "ý", 8 }, { "þ", 8 }, { "ÿ", 8 }, { "Œ", 11 }, { "œ", 11 }, { "„", 5 }, { "”", 5 }, { "€", 10 }, - { "Ÿ", 10 }, { "~", 8 } + { "Ÿ", 10 }, { "~", 8 }, }; CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_, diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index aabe9ad61..ebdb22971 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -181,7 +181,7 @@ static const char* msgStaticTbl[] = gFadingMessageBackgroundTex, gMessageContinueTriangleTex, gMessageEndSquareTex, - gMessageArrowTex + gMessageArrowTex, }; void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t language) { diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index 767ff2723..5d5b7a0d2 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -42,7 +42,7 @@ typedef enum { LIST, TARGET, HELD, - INTERACT + INTERACT, } RetrievalMethod; std::array acMapping = { @@ -230,7 +230,7 @@ static std::vector noParamsActors = { ACTOR_UNSET_15D, ACTOR_UNSET_161, ACTOR_UNSET_180, - ACTOR_UNSET_1AA + ACTOR_UNSET_1AA, }; static std::unordered_map> actorSpecificData; @@ -402,7 +402,7 @@ void CreateActorSpecificData() { "Zora Tunic", "Goron Tunic", "Bombs (Special)", - "Bombchus" + "Bombchus", }; int selectedItem = params & 0xFF; @@ -439,7 +439,7 @@ void CreateActorSpecificData() { "Zora Tunic", "Goron Tunic", "Bombs (Special)", - "Bombchus" + "Bombchus", }; int selectedItem = params & 0xFF; @@ -519,7 +519,7 @@ void CreateActorSpecificData() { "Bombs (5) (35 Rupees)", "Red Potion (40 Rupees)", "Red Potion (50 Rupees)", - "Randomizer Item" + "Randomizer Item", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { @@ -537,7 +537,7 @@ void CreateActorSpecificData() { "Spawned Falling (2)", //"INVALID", "Ceiling Spot Spawner", - "On Floor" + "On Floor", }; int selectedItem = params > 3 ? params - 1 : params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { @@ -568,7 +568,7 @@ void CreateActorSpecificData() { "Magic Fire", "Magic Wind", "Magic Dark", - "Bullet Bag" + "Bullet Bag", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { @@ -587,7 +587,7 @@ void CreateActorSpecificData() { "Spawner", "Revive Death", "Heal", - "Heal Big" + "Heal Big", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { @@ -601,7 +601,7 @@ void CreateActorSpecificData() { static const char* items[] = { "Cutscene", //0 "Normal", //1 - "Laser" //100 + "Laser", //100 }; int selectedItem = params == 100 ? 2 : params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { @@ -647,7 +647,7 @@ void CreateActorSpecificData() { "UNK 7", "Orange", "Green", - "Red" + "Red", }; int selectedItem = params + 2; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { @@ -716,7 +716,7 @@ void CreateActorSpecificData() { "Switch Flag Fall Small", "9", "10", - "Switch Flag Big" + "Switch Flag Big", }; int type = (params >> 12) & 0xF; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 554a90b2a..b99931a6e 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -1659,7 +1659,7 @@ const std::vector state1 = { "In Item Cutscene", "In Cutscene", "30", //Unknown - "Floor collision disabled" + "Floor collision disabled", }; const std::vector state2 = { @@ -1694,7 +1694,7 @@ const std::vector state2 = { "Idling", "Disabled draw func", "Sword Lunge", - "Void out" + "Void out", }; const std::vector state3 = { @@ -1705,7 +1705,7 @@ const std::vector state3 = { "Check Floor Water Collision", "Force Pull Ocarina", "Restore Nayru's Love", - "Travelling to Hook Target" + "Travelling to Hook Target", }; class SaveEditorWindow : public Ship::GuiWindow { diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index 23ce4e26c..c0ac04739 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -22,6 +22,7 @@ s32 GfxPrint_Printf(GfxPrint* printer, const char* fmt, ...); ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); +// clang-format off std::vector valueTable = { { "Time", "gSaveContext.dayTime", "TIME:", TYPE_U16, false, []() -> void* { return &gSaveContext.dayTime; }, WHITE }, { "Age", "gSaveContext.linkAge", "AGE:", TYPE_S32, false, []() -> void* { return &gSaveContext.linkAge; }, WHITE }, @@ -71,6 +72,7 @@ std::vector valueTable = { "Deku Tree Warp Timer" u16 0x801F83A2 */ }; +// clang-format on extern "C" void ValueViewer_Draw(GfxPrint* printer) { for (int i = 0; i < valueTable.size(); i++) { diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index 36ef76cc8..a7745192a 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -11,14 +11,14 @@ typedef enum { CSMC_DISABLED, CSMC_BOTH, CSMC_TEXTURE, - CSMC_SIZE + CSMC_SIZE, } ChestStyleMatchesContentsType; typedef enum { SGIA_DISABLED, SGIA_JUNK, SGIA_ALL, - SGIA_SIZE + SGIA_SIZE, } SkipGetItemAnimationType; typedef enum { @@ -31,7 +31,7 @@ typedef enum { typedef enum { BUNNY_HOOD_VANILLA, BUNNY_HOOD_FAST, - BUNNY_HOOD_FAST_AND_JUMP + BUNNY_HOOD_FAST_AND_JUMP, } BunnyHoodMode; typedef enum { @@ -55,7 +55,7 @@ typedef enum { typedef enum { BOOTSEQUENCE_DEFAULT, BOOTSEQUENCE_AUTHENTIC, - BOOTSEQUENCE_FILESELECT + BOOTSEQUENCE_FILESELECT, } BootSequenceType; typedef enum { diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 937e81ede..51144dd20 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -709,6 +709,7 @@ void SetupDisplayNames() { // To add a timestamp for an item or event, add it to this list and ensure // it has a corresponding entry in the enum (see gameplaystats.h) + // clang-format off strcpy(itemTimestampDisplayName[ITEM_BOW], "Fairy Bow: "); strcpy(itemTimestampDisplayName[ITEM_ARROW_FIRE], "Fire Arrows: "); strcpy(itemTimestampDisplayName[ITEM_DINS_FIRE], "Din's Fire: "); @@ -799,6 +800,7 @@ void SetupDisplayNames() { strcpy(itemTimestampDisplayName[TIMESTAMP_BOSSRUSH_FINISH], "Boss Rush Finished: "); strcpy(itemTimestampDisplayName[TIMESTAMP_FOUND_GREG], "Greg Found: "); strcpy(itemTimestampDisplayName[TIMESTAMP_TRIFORCE_COMPLETED], "Triforce Completed: "); + // clang-format on } void SetupDisplayColors() { diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 38de50575..b208d2598 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -715,7 +715,8 @@ void RegisterEnemyDefeatCounts() { break; case ACTOR_EN_TP: - if (actor->params == TAILPASARAN_HEAD) { // Only count the head, otherwise each body segment will increment + // Only count the head, otherwise each body segment will increment + if (actor->params == TAILPASARAN_HEAD) { gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TAILPASARAN]++; } break; @@ -833,8 +834,8 @@ void RegisterRandomizedEnemySizes() { randomNumber = rand() % 200; // Between 100% and 300% size. randomScale = 1.0f + (randomNumber / 100); - // Small actor } else { + // Small actor randomNumber = rand() % 90; // Between 10% and 100% size. randomScale = 0.1f + (randomNumber / 100); diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 3081d4863..182e5eba5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -22,6 +22,7 @@ using namespace std::literals::string_literals; namespace Rando { void StaticData::HintTable_Init() { + // clang-format off /*-------------------------- | GENERAL TEXT | ---------------------------*/ @@ -46,12 +47,13 @@ void StaticData::HintTable_Init() { "Man erzählt sich, daß #[[2]]# #[[1]]# horte.", /*french*/ "Selon moi, #[[2]]# recèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ "Según dicen, #[[2]]# acapara #[[1]]#." + // clang-format on HintTable_Init_Item(); HintTable_Init_Exclude_Overworld(); HintTable_Init_Exclude_Dungeon(); - + // clang-format off /*-------------------------- | SOMETIMES HINT TEXT | ---------------------------*/ @@ -2418,5 +2420,6 @@ void StaticData::HintTable_Init() { /*german*/ "&Man kann darauf die Worte&%r\"Master Quest\"%w entziffern...", /*french*/ "&Étrange... les mots %r\"Master&Quest\"%w sont gravés dessus.")); + // clang-format on } } 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 ed447fe30..152239f5b 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 @@ -4,10 +4,12 @@ namespace Rando { void StaticData::HintTable_Init_Exclude_Dungeon() { - /*-------------------------- - | DEKU TREE | - ---------------------------*/ - hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", + // clang-format off + + /*-------------------------- + | DEKU TREE | + ---------------------------*/ + hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", /*german*/ "Man erzählt sich, daß im #Zentrum des Deku-Baums# #[[1]]# läge.", /*french*/ "Selon moi, #le centre de l'Arbre Mojo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. @@ -2173,5 +2175,6 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*german*/ "", /*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // clang-format on } } 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 a6c6b99f3..efbb24d10 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 @@ -4,6 +4,7 @@ namespace Rando { void StaticData::HintTable_Init_Exclude_Overworld() { + // clang-format off hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", /*german*/ "Man erzählt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# sei.", @@ -1954,5 +1955,6 @@ void StaticData::HintTable_Init_Exclude_Overworld() { 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 })); + // clang-format on } } 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 c786dd8de..8b441c66e 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 @@ -5,7 +5,8 @@ namespace Rando { void StaticData::HintTable_Init_Item() { - + // clang-format off + hintTextTable[RHT_KOKIRI_SWORD] = HintText(CustomMessage("the Kokiri Sword", /*german*/"das Kokiri-Schwert", /*french*/"l'Épée Kokiri"), // /*spanish*/la Espada Kokiri { @@ -2169,5 +2170,6 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_MYSTERIOUS_ITEM_CAPITAL] = HintText(CustomMessage("Mysterious Item", /*german*/"Mysteriöser Gegenstand", /*french*/"Objet Mystérieux")); // /*spanish*/Algo Misterioso + // clang-format on } } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 5cbfb9a9e..43193a926 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -149,7 +149,7 @@ const std::array easyItems = { RG_PIECE_OF_HEART, }; const std::array normalItems = { - RG_PIECE_OF_HEART, //35 pieces of heart + // 35 pieces of heart RG_PIECE_OF_HEART, RG_PIECE_OF_HEART, RG_PIECE_OF_HEART, @@ -184,7 +184,9 @@ const std::array normalItems = { RG_PIECE_OF_HEART, RG_PIECE_OF_HEART, RG_PIECE_OF_HEART, - RG_HEART_CONTAINER, //8 heart containers + RG_PIECE_OF_HEART, + // 8 heart containers + RG_HEART_CONTAINER, RG_HEART_CONTAINER, RG_HEART_CONTAINER, RG_HEART_CONTAINER, diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.h b/soh/soh/Enhancements/randomizer/Plandomizer.h index 1b7996ce4..0305beb0e 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.h +++ b/soh/soh/Enhancements/randomizer/Plandomizer.h @@ -41,7 +41,7 @@ typedef struct { typedef enum PlandoTabs { TAB_HINTS, - TAB_LOCATIONS + TAB_LOCATIONS, } PlandoTabs; typedef enum PlandoHints { @@ -49,4 +49,4 @@ typedef enum PlandoHints { HINT_ALL, } PlandoHints; -#endif \ No newline at end of file +#endif diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp index 5fc86f76d..ff4680a17 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -59,6 +59,7 @@ void RegisterShuffleCows() { static RegisterShipInitFunc initFunc(RegisterShuffleCows, { "IS_RANDO" }); void Rando::StaticData::RegisterCowLocations() { + // clang-format-off locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW)); locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), "Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW)); @@ -69,6 +70,8 @@ void Rando::StaticData::RegisterCowLocations() { locationTable[RC_DMT_COW_GROTTO_COW] = Location::Base(RC_DMT_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444, -471), "Cow Grotto Cow", RHT_DMT_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW)); locationTable[RC_GV_COW] = Location::Base(RC_GV_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, "Cow", RHT_GV_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_GV_COW)); locationTable[RC_JABU_JABUS_BELLY_MQ_COW] = Location::Base(RC_JABU_JABUS_BELLY_MQ_COW, RCQUEST_MQ, RCTYPE_COW, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, "MQ Cow", RHT_JABU_JABUS_BELLY_MQ_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW)); + + // clang-format-on } -static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations); \ No newline at end of file +static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index 441591aa0..c9e53e315 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -185,6 +185,7 @@ void ShuffleFairies_UnregisterHooks() { } void Rando::StaticData::RegisterFairyLocations() { + // clang-format off locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3)); @@ -404,6 +405,8 @@ void Rando::StaticData::RegisterFairyLocations() { locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY)); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY)); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY)); + + // clang-format on } static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index c35cab107..858e9f3e2 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -45,6 +45,7 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh } void Rando::StaticData::RegisterFreestandingLocations() { + // clang-format off locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2)); locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1009, 1556), "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_1)); locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(2, -45), "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BRIDGE_RUPEE)); @@ -275,6 +276,8 @@ void Rando::StaticData::RegisterFreestandingLocations() { locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1743, -528), "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART)); locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2506, -1096), "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART)); locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2655, -549), "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART)); + + // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations); \ No newline at end of file +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index cbc96cd1d..41b586455 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -95,6 +95,7 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va } void Rando::StaticData::RegisterPotLocations() { + // clang-format off // Overworld Pots // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); @@ -643,6 +644,8 @@ void Rando::StaticData::RegisterPotLocations() { locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); + + // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations); \ No newline at end of file +static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations); diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 81afbf33c..74eaaa50e 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -856,6 +856,7 @@ int EntranceShuffler::ShuffleAllEntrances() { mCurNumRandomizedEntrances = 0; std::vector entranceShuffleTable = { + // clang-format off // Type Parent Region Connected Region Index { { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, ENTR_DEKU_TREE_ENTRANCE }, { EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE } }, @@ -1161,6 +1162,7 @@ int EntranceShuffler::ShuffleAllEntrances() { NO_RETURN_ENTRANCE }, { { EntranceType::BlueWarp, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP }, NO_RETURN_ENTRANCE }, + // clang-format on }; std::map priorityEntranceTable = { diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index 9da52ddc2..e2a013906 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -580,6 +580,7 @@ extern "C" { } void Rando::StaticData::RegisterFishLocations() { + // clang-format off // Fishing Pond locationTable[RC_LH_CHILD_FISH_1] = Location::Fish(RC_LH_CHILD_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_CHILD_FISH_1, "Child Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); locationTable[RC_LH_CHILD_FISH_2] = Location::Fish(RC_LH_CHILD_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_CHILD_FISH_2, "Child Pond Fish 2", RHT_LH_POND_FISH, RG_NONE); @@ -630,6 +631,7 @@ void Rando::StaticData::RegisterFishLocations() { locationTable[RC_ZD_FISH_3] = Location::Fish(RC_ZD_FISH_3, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 2, RAND_INF_ZD_FISH_3, "Fish 3", RHT_ZD_FISH, RG_FISH); locationTable[RC_ZD_FISH_4] = Location::Fish(RC_ZD_FISH_4, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, RAND_INF_ZD_FISH_4, "Fish 4", RHT_ZD_FISH, RG_FISH); locationTable[RC_ZD_FISH_5] = Location::Fish(RC_ZD_FISH_5, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, RAND_INF_ZD_FISH_5, "Fish 5", RHT_ZD_FISH, RG_FISH); + // clang-format on } static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFishLocations); diff --git a/soh/soh/Enhancements/randomizer/fishsanity.h b/soh/soh/Enhancements/randomizer/fishsanity.h index 91d021157..642443136 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.h +++ b/soh/soh/Enhancements/randomizer/fishsanity.h @@ -14,7 +14,7 @@ typedef struct { typedef enum { FSO_SOURCE_RANDO, - FSO_SOURCE_CVARS + FSO_SOURCE_CVARS, } FishsanityOptionsSource; typedef enum { diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 2d40459ea..8169bbb17 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -2047,15 +2047,15 @@ void RandomizerOnActorInitHandler(void* actorRef) { return; } - if ( - // If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting gallery man - actor->id == ACTOR_EN_SYATEKI_MAN && - RAND_GET_OPTION(RSK_SHUFFLE_INTERIOR_ENTRANCES) && - ( - (LINK_IS_CHILD && Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x00)) || //Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table - (LINK_IS_ADULT && Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x01)) //Market -> Child Shooting Gallery, index 016D in the entrance table - ) - ) { + // If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting + // gallery man + if (actor->id == ACTOR_EN_SYATEKI_MAN && RAND_GET_OPTION(RSK_SHUFFLE_INTERIOR_ENTRANCES) && + ((LINK_IS_CHILD && + // Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table + Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x00)) || + (LINK_IS_ADULT && + // Market -> Child Shooting Gallery, index 016D in the entrance table + Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x01)))) { Actor_Kill(actor); return; } diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 45516ef18..5fb2a401c 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -12,6 +12,8 @@ std::unordered_map Rando::StaticData::itemNameToEnum void Rando::StaticData::InitItemTable() { auto logic = Context::GetInstance()->GetLogic(); + + // clang-format off itemTable[RG_NONE] = Item(RG_NONE, Text{ "No Item", "Rien", "Kein Artikel" }, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_NONE, 0, 0, 0, 0, 0, ITEM_CATEGORY_JUNK, MOD_NONE); // Randomizer Get Randomizer Get Name Text Type Get Item ID Adv. Logic Value Hint Text Key Item ID Object ID Draw ID Text ID field Chest Animation Item Category Mod Index itemTable[RG_KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{ "Kokiri Sword", "Épée Kokiri", "Kokiri-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_KOKIRI, true, LOGIC_KOKIRI_SWORD, RHT_KOKIRI_SWORD, ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -402,6 +404,8 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verbessertes Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Fragment" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + // clang-format on + // Init itemNameToEnum for (auto& item : itemTable) { // Easiest way to filter out all the empty values from the array, since we still technically want the 0/RG_NONE diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index a45e27cd0..f6b55868b 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -261,6 +261,7 @@ void RegionTable_Init() { //locations which appear in both MQ and Vanilla dungeons don't get set in both areas. areaTable.fill(Region("Invalid Region", "Invalid Region", {}, NO_DAY_NIGHT_CYCLE, {}, {}, {})); + // clang-format off areaTable[RR_ROOT] = Region("Root", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), @@ -326,6 +327,8 @@ void RegionTable_Init() { Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); + // clang-format on + // Overworld RegionTable_Init_KokiriForest(); RegionTable_Init_LostWoods(); @@ -571,4 +574,4 @@ Rando::Entrance* GetEntrance(const std::string name) { } return nullptr; -} \ No newline at end of file +} 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 171542ea3..2a913f4a9 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 @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_BottomOfTheWell() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Region("Bottom of the Well Entryway", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -293,4 +294,5 @@ void RegionTable_Init_BottomOfTheWell() { }); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index df47f0f42..21a7151da 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_DekuTree() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_DEKU_TREE_ENTRYWAY] = Region("Deku Tree Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -360,4 +361,6 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}), Entrance(RR_KF_OUTSIDE_DEKU_TREE, []{return logic->DekuTreeClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} 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 4ae2e1e70..738368117 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_DodongosCavern() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Region("Dodongos Cavern Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -541,4 +542,6 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}), Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return logic->DodongosCavernClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index a17cfc598..1af91e7be 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_FireTemple() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Region("Fire Temple Entryway", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -715,4 +716,6 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 04efd4994..3e595c735 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_ForestTemple() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -610,4 +611,6 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->ForestTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index c1a846564..ded6c8279 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -6,6 +6,7 @@ using namespace Rando; void RegionTable_Init_GanonsCastle() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Region("Ganon's Castle Entryway", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -511,4 +512,5 @@ void RegionTable_Init_GanonsCastle() { }, {}); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index 0c45d755c..f95b32239 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_GerudoTrainingGround() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_GERUDO_TRAINING_GROUND_ENTRYWAY] = Region("Gerudo Training Ground Entryway", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -321,4 +322,5 @@ void RegionTable_Init_GerudoTrainingGround() { }); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index 879ac1dce..ff2bf9594 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_IceCavern() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_ICE_CAVERN_ENTRYWAY] = Region("Ice Cavern Entryway", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -144,4 +145,5 @@ void RegionTable_Init_IceCavern() { }, {}); #pragma endregion -} \ No newline at end of file + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index 7bfb98a87..8e3c8a8d4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_JabuJabusBelly() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Region("Jabu Jabus Belly Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -356,4 +357,6 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_ZORAS_FOUNTAIN, []{return logic->JabuJabusBellyClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 8cf70fc3f..1ed814adb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_ShadowTemple() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Region("Shadow Temple Entryway", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -409,4 +410,6 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return logic->ShadowTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} 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 e3d00ccf3..7982f9ae5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_SpiritTemple() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Region("Spirit Temple Entryway", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -554,4 +555,6 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_DESERT_COLOSSUS, []{return logic->SpiritTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index 4d2fbb9bf..ddf72fba0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -5,6 +5,7 @@ using namespace Rando; void RegionTable_Init_WaterTemple() { + // clang-format off // Vanilla/MQ Decider areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Region("Water Temple Entryway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits @@ -735,4 +736,6 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_LAKE_HYLIA, []{return logic->WaterTempleClear;}, false), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 6af0551e0..2dcdf71bb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -9,6 +9,7 @@ using namespace Rando; */ void RegionTable_Init_GerudoFortress() { + // clang-format off areaTable[RR_GERUDO_FORTRESS] = Region("Gerudo Fortress", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->CarpenterRescue, []{return logic->CanFinishGerudoFortress();}), @@ -78,4 +79,6 @@ void RegionTable_Init_GerudoFortress() { //Exits Entrance(RR_GERUDO_FORTRESS, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index 60aa8432f..33022e270 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_CastleGrounds() { + // clang-format off //With multi-area support {RA_CASTLE_GROUNDS} is not strictly required anymore, as any interior here could inherit both //{RA_HYRULE_CASTLE} and {RA_OUTSIDE_GANONS_CASTLE}, but a setting to merge the latter 2 into the former may be preferred areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", "Castle Grounds", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -114,4 +115,6 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_GANONS_CASTLE_GROUNDS, []{return logic->BuiltRainbowBridge;}), Entrance(RR_GANONS_CASTLE_ENTRYWAY, []{return logic->IsAdult;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index 6ba8bfc6e..48863c695 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_DeathMountainCrater() { + // clang-format off areaTable[RR_DMC_UPPER_NEARBY] = Region("DMC Upper Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_DMC_UPPER_LOCAL, []{return logic->FireTimer() >= 48;}), @@ -142,4 +143,6 @@ void RegionTable_Init_DeathMountainCrater() { //Exits Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTimer() >= 48 && logic->CanUse(RG_DISTANT_SCARECROW);}), }); -} \ No newline at end of file + + // clang-format on +} 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 bd0362598..750fbf140 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 @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_DeathMountainTrail() { + // clang-format off areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Region("Death Mountain", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET));}), @@ -98,4 +99,6 @@ void RegionTable_Init_DeathMountainTrail() { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp index 0ef2bbdfc..ac0869036 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_DesertColossus() { + // clang-format off areaTable[RR_DESERT_COLOSSUS] = Region("Desert Colossus", "Desert Colossus", {RA_DESERT_COLOSSUS}, DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FairyPond, []{return logic->FairyPond || logic->CanUse(RG_SONG_OF_STORMS);}), @@ -74,4 +75,6 @@ void RegionTable_Init_DesertColossus() { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 189d96521..9141f4dcd 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_GerudoValley() { + // clang-format off areaTable[RR_GERUDO_VALLEY] = Region("Gerudo Valley", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->BugRock, []{return logic->BugRock || logic->IsChild;}), @@ -108,4 +109,6 @@ void RegionTable_Init_GerudoValley() { //Exits Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index 722402ae9..b39a389d2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_GoronCity() { + // clang-format off areaTable[RR_GORON_CITY] = Region("Goron City", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), @@ -108,4 +109,6 @@ void RegionTable_Init_GoronCity() { //Exits Entrance(RR_GC_GROTTO_PLATFORM, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 28d272711..6a3fb41f5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_Graveyard() { + // clang-format off areaTable[RR_THE_GRAVEYARD] = Region("The Graveyard", "The Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}), @@ -120,4 +121,6 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_GY_SHADOW_FIRE_ARROWS) && logic->IsAdult && logic->CanUse(RG_FIRE_ARROWS));}), }); + + // clang-format on } 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 abedcc571..437f93a64 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_HauntedWasteland() { + // clang-format off areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_GF_OUTSIDE_GATE, []{return true;}), @@ -35,4 +36,6 @@ void RegionTable_Init_HauntedWasteland() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index d73c09162..f6c9d1c40 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_HyruleField() { + // clang-format off areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", "Hyrule Field", {RA_HYRULE_FIELD}, DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->BigPoeKill, []{return logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_EPONA) && logic->HasBottle();}), @@ -140,4 +141,6 @@ void RegionTable_Init_HyruleField() { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index aff90914e..846e55203 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_Kakariko() { + // clang-format off areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->BugRock, []{return true;}), @@ -239,4 +240,6 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->DrainWell;}), Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, []{return logic->IsChild || (logic->DrainWell && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index fd7c340de..cdd43b042 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_KokiriForest() { + // clang-format off areaTable[RR_KOKIRI_FOREST] = Region("Kokiri Forest", "Kokiri Forest", {RA_KOKIRI_FOREST}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -149,4 +150,6 @@ void RegionTable_Init_KokiriForest() { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) }); -} \ No newline at end of file + + // clang-format on +} 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 447d039d2..d4b950d78 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_LakeHylia() { + // clang-format off areaTable[RR_LAKE_HYLIA] = Region("Lake Hylia", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), @@ -128,4 +129,6 @@ void RegionTable_Init_LakeHylia() { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); + + // clang-format on } 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 283150415..00ce5a3ee 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 @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_LonLonRanch() { + // clang-format off areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", "Lon Lon Ranch", {RA_LON_LON_RANCH}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreedEpona, []{return logic->FreedEpona || ((logic->HasItem(RG_CHILD_WALLET) || ctx->GetOption(RSK_SKIP_EPONA_RACE)) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}), @@ -71,4 +72,6 @@ void RegionTable_Init_LonLonRanch() { //Exits Entrance(RR_LON_LON_RANCH, []{return true;}), }); + + // clang-format on } 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 17aaff639..fb146ec54 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_LostWoods() { + // clang-format off areaTable[RR_LW_FOREST_EXIT] = Region("LW Forest Exit", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) @@ -128,4 +129,6 @@ void RegionTable_Init_LostWoods() { Entrance(RR_HYRULE_FIELD, []{return true;}), Entrance(RR_THE_LOST_WOODS, []{return logic->CanUse(RG_LONGSHOT);}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index af406f8bf..3924c858a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_Market() { + // clang-format off areaTable[RR_MARKET_ENTRANCE] = Region("Market Entrance", "Market Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}), @@ -214,4 +215,6 @@ void RegionTable_Init_Market() { //Exits Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); + + // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp index e09e9559b..9df62afd7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_SacredForestMeadow() { + // clang-format off areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_LW_BEYOND_MIDO, []{return true;}), @@ -71,4 +72,6 @@ void RegionTable_Init_SacredForestMeadow() { //Exits Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp index 06865772d..be2d8e33f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_TempleOfTime() { + // clang-format off areaTable[RR_TOT_ENTRANCE] = Region("ToT Entrance", "ToT Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), @@ -51,4 +52,6 @@ void RegionTable_Init_TempleOfTime() { //Exits Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index 0bf91e43a..07922bc8f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_ZorasDomain() { + // clang-format off areaTable[RR_ZORAS_DOMAIN] = Region("Zoras Domain", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), @@ -90,4 +91,6 @@ void RegionTable_Init_ZorasDomain() { //Exits Entrance(RR_ZORAS_DOMAIN_ISLAND, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index ccdca0eca..a03070454 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_ZorasFountain() { + // clang-format off areaTable[RR_ZORAS_FOUNTAIN] = Region("Zoras Fountain", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), @@ -61,4 +62,6 @@ void RegionTable_Init_ZorasFountain() { //Exits Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index f12de9128..3a252edb0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -4,6 +4,7 @@ using namespace Rando; void RegionTable_Init_ZoraRiver() { + // clang-format off areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), @@ -104,4 +105,6 @@ void RegionTable_Init_ZoraRiver() { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), }); -} \ No newline at end of file + + // clang-format on +} diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8809d8691..fa2a3098e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -100,7 +100,7 @@ static const char* englishRupeeNames[175] = { "Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals", "Tiberium", "TokKul", "Toys", "Turnips", "Upvotes", "V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs", - "World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids" + "World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids", }; static const char* germanRupeeNames[65] = { @@ -205,7 +205,7 @@ std::unordered_map getItemIdToItemId = { { GI_PRESCRIPTION, ITEM_PRESCRIPTION }, { GI_FROG, ITEM_FROG }, { GI_EYEDROPS, ITEM_EYEDROPS }, - { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK } + { GI_CLAIM_CHECK, ITEM_CLAIM_CHECK }, }; #pragma optimize("", off) @@ -400,12 +400,12 @@ void Randomizer::LoadMerchantMessages() { } std::map trialFlagToTrialKey = { - { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL, }, - { EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL, }, - { EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL, }, - { EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL, }, - { EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL, }, - { EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL, } + { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL }, + { EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL }, + { EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL }, + { EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL }, + { EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL }, + { EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL }, }; bool Randomizer::IsTrialRequired(s32 trialFlag) { @@ -2272,7 +2272,7 @@ void RandomizerSettingsWindow::DrawElement() { {RA_BOTTOM_OF_THE_WELL, true}, {RA_ICE_CAVERN, true}, {RA_GERUDO_TRAINING_GROUND, true}, - {RA_GANONS_CASTLE, true} + {RA_GANONS_CASTLE, true}, }; static std::unordered_map areaTreeEnabled { {RA_NONE, true}, @@ -2307,7 +2307,7 @@ void RandomizerSettingsWindow::DrawElement() { {RA_BOTTOM_OF_THE_WELL, true}, {RA_ICE_CAVERN, true}, {RA_GERUDO_TRAINING_GROUND, true}, - {RA_GANONS_CASTLE, true} + {RA_GANONS_CASTLE, true}, }; static std::map showTag { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 23cbb290f..2c97c50c0 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -13,11 +13,11 @@ // which doesn't exist yet. typedef enum { MOD_NONE, - MOD_RANDOMIZER + MOD_RANDOMIZER, } ModIndex; typedef enum { TABLE_VANILLA = MOD_NONE, - TABLE_RANDOMIZER = MOD_RANDOMIZER + TABLE_RANDOMIZER = MOD_RANDOMIZER, } TableIndex; typedef struct { @@ -5666,12 +5666,12 @@ typedef struct FishIdentity { typedef enum { TRACKER_WINDOW_FLOATING, - TRACKER_WINDOW_WINDOW + TRACKER_WINDOW_WINDOW, } TrackerWindowType; typedef enum { TRACKER_DISPLAY_ALWAYS, - TRACKER_DISPLAY_COMBO_BUTTON + TRACKER_DISPLAY_COMBO_BUTTON, } TrackerDisplayType; typedef enum { @@ -5774,7 +5774,7 @@ typedef enum { WL_MID, WL_HIGH, WL_LOW_OR_MID, - WL_HIGH_OR_MID + WL_HIGH_OR_MID, } RandoWaterLevel; #define ENTRANCE_GROTTO_LOAD_START 0x0700 diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 26592b0ce..96c916824 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -59,6 +59,7 @@ typedef struct { } DungeonEntranceInfo; static DungeonEntranceInfo dungeons[] = { + // clang-format off //entryway exit, boss, reverse, bluewarp, dungeon scene, boss scene { ENTR_DEKU_TREE_ENTRANCE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, ENTR_DEKU_TREE_BOSS_ENTRANCE, ENTR_DEKU_TREE_BOSS_DOOR, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP, SCENE_DEKU_TREE, SCENE_DEKU_TREE_BOSS }, { ENTR_DODONGOS_CAVERN_ENTRANCE, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, ENTR_DODONGOS_CAVERN_BOSS_DOOR, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP, SCENE_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN_BOSS }, @@ -68,6 +69,8 @@ static DungeonEntranceInfo dungeons[] = { { ENTR_WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP, SCENE_WATER_TEMPLE, SCENE_WATER_TEMPLE_BOSS }, { ENTR_SPIRIT_TEMPLE_ENTRANCE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, ENTR_SPIRIT_TEMPLE_BOSS_DOOR, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, SCENE_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE_BOSS }, { ENTR_SHADOW_TEMPLE_ENTRANCE, ENTR_GRAVEYARD_OUTSIDE_TEMPLE, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP, SCENE_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE_BOSS }, + + // clang-format on }; static s8 hasCopiedEntranceTable = 0; diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index fab17acf1..57ff467f4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -74,6 +74,7 @@ static std::string groupTypeNames[] = { // Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and meta search tags // ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer const EntranceData entranceData[] = { + // clang-format off //index, reverse, scenes (and spawns), source name, destination name, source group, destination group, type, metaTag, oneExit { ENTR_LINKS_HOUSE_CHILD_SPAWN, -1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Child Spawn", "Link's House", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, { ENTR_HYRULE_FIELD_10, -1, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Adult Spawn", "Temple of Time", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY}, @@ -380,6 +381,8 @@ const EntranceData entranceData[] = { { 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"} + + // clang-format on }; // Check if Link is in the area and return that scene/entrance for tracking diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index 50cb093c8..eef1c3171 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -12,6 +12,7 @@ extern PlayState* gPlayState; // Information necessary for entering each grotto static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = { + // clang-format off {.entranceIndex = ENTR_GROTTOS_10, .content = 0xFD, .scene = SCENE_DESERT_COLOSSUS}, // Desert Colossus -> Colossus Grotto {.entranceIndex = ENTR_GROTTOS_4, .content = 0xEF, .scene = SCENE_LAKE_HYLIA}, // Lake Hylia -> LH Grotto {.entranceIndex = ENTR_GROTTOS_10, .content = 0xEB, .scene = SCENE_ZORAS_RIVER}, // Zora River -> ZR Storms Grotto @@ -45,10 +46,13 @@ static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = { {.entranceIndex = ENTR_GROTTOS_10, .content = 0xF0, .scene = SCENE_GERUDO_VALLEY}, // GV Fortress Side -> GV Storms Grotto {.entranceIndex = ENTR_GROTTOS_6, .content = 0xF2, .scene = SCENE_GERUDO_VALLEY}, // GV Grotto Ledge -> GV Octorok Grotto {.entranceIndex = ENTR_GROTTOS_12, .content = 0xF3, .scene = SCENE_LOST_WOODS}, // LW Beyond Mido -> Deku Theater + + // clang-format on }; // Information necessary for setting up returning from a grotto static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = { + // clang-format off {.entranceIndex = ENTR_DESERT_COLOSSUS_EAST_EXIT, .room = 0x00, .angle = 0xA71C, .pos = {.x = 62.5078f, .y = -32.0f, .z = -1296.2f}}, // Colossus Grotto -> Desert Colossus {.entranceIndex = ENTR_LAKE_HYLIA_NORTH_EXIT, .room = 0x00, .angle = 0x0000, .pos = {.x = -3039.34f, .y = -1033.0f, .z = 6080.74f}}, // LH Grotto -> Lake Hylia {.entranceIndex = ENTR_ZORAS_RIVER_WEST_EXIT, .room = 0x00, .angle = 0x0000, .pos = {.x = -1630.05f, .y = 100.0f, .z = -132.104f}}, // ZR Storms Grotto -> Zora River @@ -82,6 +86,8 @@ static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = { {.entranceIndex = ENTR_GERUDO_VALLEY_WEST_EXIT, .room = 0x00, .angle = 0x9555, .pos = {.x = -1326.34f, .y = 15.0f, .z = -983.994f}}, // GV Storms Grotto -> GV Fortress Side {.entranceIndex = ENTR_GERUDO_VALLEY_EAST_EXIT, .room = 0x00, .angle = 0x8000, .pos = {.x = 291.513f, .y = -555.0f, .z = 1478.39f}}, // GV Octorok Grotto -> GV Grotto Ledge {.entranceIndex = ENTR_LOST_WOODS_NORTH_EXIT, .room = 0x06, .angle = 0x4000, .pos = {.x = 109.281f, .y = -20.0f, .z = -1601.42f}}, // Deku Theater -> LW Beyond Mido + + // clang-format on }; static s16 grottoExitList[NUM_GROTTOS] = {0}; diff --git a/soh/soh/Enhancements/randomizer/static_data.cpp b/soh/soh/Enhancements/randomizer/static_data.cpp index 84da0d3c1..40fdc9c50 100644 --- a/soh/soh/Enhancements/randomizer/static_data.cpp +++ b/soh/soh/Enhancements/randomizer/static_data.cpp @@ -187,6 +187,7 @@ std::unordered_map StaticData::trialData = { }; std::unordered_map StaticData::staticHintInfoMap = { + // clang-format off // RH_GANONDORF_HINT is special cased due to being different based on master sword shuffle // Altar hints are special cased due to special hint marking rules // warp song hints are special cased due to entrances not being done properly yet @@ -211,6 +212,8 @@ std::unordered_map StaticData::staticHintInfoMap {RH_KAK_50_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_50_SKULLS_HINT, true, {RC_KAK_50_GOLD_SKULLTULA_REWARD}, {}, {}, false, 50)}, {RH_KAK_100_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_100_SKULLS_HINT, true, {RC_KAK_100_GOLD_SKULLTULA_REWARD}, {}, {}, false, 100)}, {RH_MASK_SHOP_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_MASK_SHOP_HINT}, RSK_MASK_SHOP_HINT, true, {RC_DEKU_THEATER_SKULL_MASK, RC_DEKU_THEATER_MASK_OF_TRUTH}, {}, {RC_MASK_SHOP_HINT})} + + // clang-format on }; std::unordered_map StaticData::PopulateTranslationMap(std::unordered_map input){ @@ -220,7 +223,8 @@ std::unordered_map StaticData::PopulateTranslationMap(std for (std::string string: strings){ if (output.contains(string)){ if (output[string] != key){ - SPDLOG_DEBUG("\tREPEATED STRING IN " + message.GetEnglish(MF_CLEAN) + "\n\n"); //RANDOTODO should this cause an error of some kind? + //RANDOTODO should this cause an error of some kind? + SPDLOG_DEBUG("\tREPEATED STRING IN " + message.GetEnglish(MF_CLEAN) + "\n\n"); } } else { output[string] = key; @@ -237,7 +241,8 @@ std::unordered_map StaticData::PopulateTranslationMap(std for (std::string string: strings){ if (output.contains(string)){ if (output[string] != key){ - SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n"); //RANDOTODO should this cause an error of some kind? + //RANDOTODO should this cause an error of some kind? + SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n"); } } else { output[string] = key; diff --git a/soh/soh/Enhancements/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index 046536f45..9523a8feb 100644 --- a/soh/soh/Enhancements/timesplits/TimeSplits.cpp +++ b/soh/soh/Enhancements/timesplits/TimeSplits.cpp @@ -63,6 +63,7 @@ std::vector splitList; std::vector emptyList; std::vector splitObjectList = { + // clang-format off { SPLIT_TYPE_ITEM, ITEM_STICK, "Deku Stick", "ITEM_STICK", COLOR_WHITE }, { SPLIT_TYPE_ITEM, ITEM_NUT, "Deku Nut", "ITEM_NUT", COLOR_WHITE }, { SPLIT_TYPE_ITEM, ITEM_BOMB, "Bomb", "ITEM_BOMB", COLOR_WHITE }, @@ -205,9 +206,12 @@ std::vector splitObjectList = { { SPLIT_TYPE_MISC, SCENE_ZORAS_RIVER, "Lost Woods Escape", "SPECIAL_SPLIT_ENTRANCE", COLOR_WHITE }, { SPLIT_TYPE_MISC, SCENE_LOST_WOODS, "Forest Escape", "SPECIAL_SPLIT_ENTRANCE", COLOR_WHITE }, { SPLIT_TYPE_MISC, SCENE_KAKARIKO_VILLAGE, "Watchtower Death", "SPECIAL_SPLIT_ENTRANCE", COLOR_WHITE }, + + // clang-format on }; std::map> popupList = { + // clang-format off { ITEM_STICK, { ITEM_STICK, ITEM_STICK_UPGRADE_20, ITEM_STICK_UPGRADE_30 } }, { ITEM_NUT, { ITEM_NUT, ITEM_NUT_UPGRADE_30, ITEM_NUT_UPGRADE_40 } }, { ITEM_BOMB, { ITEM_BOMB_BAG_20, ITEM_BOMB_BAG_30, ITEM_BOMB_BAG_40 } }, @@ -229,6 +233,8 @@ std::map> popupList = { { ITEM_WALLET_ADULT, { ITEM_WALLET_ADULT, ITEM_WALLET_GIANT } }, { ITEM_SINGLE_MAGIC, { ITEM_SINGLE_MAGIC, ITEM_DOUBLE_MAGIC } }, { ITEM_SKULL_TOKEN, { } } + + // clang-format on }; std::string removeSpecialCharacters(const std::string& str) { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index ee98a70b3..6eb0e667b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1,4 +1,4 @@ -#include "OTRGlobals.h" +#include "OTRGlobals.h" #include "OTRAudio.h" #include #include @@ -579,6 +579,7 @@ extern "C" void OTRAudio_Exit() { extern "C" void VanillaItemTable_Init() { static GetItemEntry getItemTable[] = { + // clang-format off GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_BOMBS_5), GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_NUTS_5), GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_BOMBCHUS_10), @@ -705,6 +706,7 @@ extern "C" void VanillaItemTable_Init() { GET_ITEM_NONE, GET_ITEM_NONE, GET_ITEM_NONE // GI_MAX - if you need to add to this table insert it before this entry. + // clang-format on }; ItemTableManager::Instance->AddItemTable(MOD_NONE); for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) { @@ -841,7 +843,7 @@ std::unordered_map ItemIDtoGetItemIDMap { { ITEM_TUNIC_ZORA, GI_TUNIC_ZORA }, { ITEM_WALLET_ADULT, GI_WALLET_ADULT }, { ITEM_WALLET_GIANT, GI_WALLET_GIANT }, - { ITEM_WEIRD_EGG, GI_WEIRD_EGG } + { ITEM_WEIRD_EGG, GI_WEIRD_EGG }, }; extern "C" GetItemID RetrieveGetItemIDFromItemID(ItemID itemID) { @@ -1523,7 +1525,7 @@ std::map cachedCustomSFs; extern "C" SoundFontSample* ReadCustomSample(const char* path) { return nullptr; -/* + /* if (!ExtensionCache.contains(path)) return nullptr; @@ -1576,7 +1578,7 @@ extern "C" SoundFontSample* ReadCustomSample(const char* path) { } return nullptr; -*/ + */ } ImFont* OTRGlobals::CreateFontWithSize(float size, std::string fontPath) { @@ -2070,7 +2072,7 @@ extern "C" bool Randomizer_IsCheckShuffled(RandomizerCheck rc) { } extern "C" GetItemEntry GetItemMystery() { - return { ITEM_NONE_FE, 0, 0, 0, 0, 0, 0, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, NULL, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem }; + return GET_ITEM_MYSTERY; } extern "C" uint8_t Randomizer_IsSeedGenerated() { diff --git a/soh/soh/SohGui/ImGuiUtils.cpp b/soh/soh/SohGui/ImGuiUtils.cpp index ebedf6b59..435e953f7 100644 --- a/soh/soh/SohGui/ImGuiUtils.cpp +++ b/soh/soh/SohGui/ImGuiUtils.cpp @@ -125,7 +125,7 @@ std::map itemMapping = { ITEM_MAP_ENTRY(ITEM_DUNGEON_MAP), ITEM_MAP_ENTRY(ITEM_KEY_SMALL), ITEM_MAP_ENTRY(ITEM_MAGIC_SMALL), - ITEM_MAP_ENTRY(ITEM_MAGIC_LARGE) + ITEM_MAP_ENTRY(ITEM_MAGIC_LARGE), }; std::map gregMapping = { diff --git a/soh/soh/frame_interpolation.cpp b/soh/soh/frame_interpolation.cpp index c42f0e89f..4d8f63486 100644 --- a/soh/soh/frame_interpolation.cpp +++ b/soh/soh/frame_interpolation.cpp @@ -605,6 +605,7 @@ static bool invert_matrix(const float m[16], float invOut[16]) { float inv[16], det; int i; + // clang-format off inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + @@ -716,6 +717,7 @@ static bool invert_matrix(const float m[16], float invOut[16]) { m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5]; + // clang-format on det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12]; From ebc3616a3ab83456b97812264b1b4ff4381a92ca Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 25 Mar 2025 11:42:52 -0400 Subject: [PATCH 142/267] lus bump to fix shader issues (#5210) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index 455b6dade..7e40f9de1 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 455b6dadef901d586332d6015fd2fd01ff07b54c +Subproject commit 7e40f9de1b1ca5fda9a129676c235bbf0cec4582 From 6abacc1024dd2c9684cf2fcaaab6ffa674a2b990 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 25 Mar 2025 13:12:50 -0400 Subject: [PATCH 143/267] Fix the player state flag that Tailparasan checks for for Damage Effect (#5211) * Fix the player state flag that Tailparasan checks for * Updated comment for accuracy --- soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 20966eac4..33449e4a0 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 @@ -657,7 +657,7 @@ void EnTp_Update(Actor* thisx, PlayState* play) { Player* player = GET_PLAYER(play); s16 yawToWall; - if (player->stateFlags1 & PLAYER_STATE1_SHIELDING) { // Shielding + if (player->stateFlags1 & PLAYER_STATE1_DAMAGED) { // Damaged this->damageEffect = TAILPASARAN_DMGEFF_NONE; } From 2fd3825569c7fc0d74d2658b3b347a1352e56dc5 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 25 Mar 2025 10:41:25 -0700 Subject: [PATCH 144/267] Fix warning from popped, minimized menu. (#5212) * Fix warning from popped, minimized menu. * Pre-empt another possible missing Pop. --- soh/soh/SohGui/Menu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index 63fdca5a9..6bb4698d5 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -527,6 +527,7 @@ void Menu::DrawElement() { if (!popout) { ImGui::PopStyleVar(); } + ImGui::PopStyleColor(); ImGui::End(); return; } @@ -537,6 +538,7 @@ void Menu::DrawElement() { if (!popout) { ImGui::PopStyleVar(); } + ImGui::PopStyleColor(); CVarSetInteger(CVAR_SETTING("Menu.Popout"), popped); CVarSetFloat(CVAR_SETTING("Menu.PoppedWidth"), poppedSize.x); CVarSetFloat(CVAR_SETTING("Menu.PoppedHeight"), poppedSize.y); From 364fec4d297016c9ad6b35e37a229142281a4d04 Mon Sep 17 00:00:00 2001 From: Extloga <141232749+Extloga@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:55:53 +0100 Subject: [PATCH 145/267] Additions and fixes for the German translation in several files (#5173) * Additions and fixes for the German translation in item_list.cpp * Additions and fixes for the German translation in hint_list_exclude_dungeon.cpp * Additions and fixes for the German translation in hint_list_exclude_overworld.cpp * Additions and fixes for the German translation in hint_list_item.cpp * Additions and fixes for the German translation in randomizer.cpp * Additions and fixes for the German translation in randomizer.cpp * Fix for the French translation in item_list.cpp * Additions and fixes for the German translation in hint_list_exclude_dungeon.cpp * Fixes for the English text in settings.cpp * Fixes for the English text in SohMenuEnhancements.cpp * Fixes for the English text in SohMenuDevTools.cpp * Fixes for the English text in SohMenuRandomizer.cpp * Fixes for the English text in ResolutionEditor.cpp * Fixes for the English text in enemyrandomizer.cpp * Fixes for the English text in gameplaystats.cpp * Fixes for the English text in savefile.cpp * Fixes for the English text in enemyrandomizer.cpp * Fix for the English text in SohMenuEnhancements.cpp Co-authored-by: aMannus --------- Co-authored-by: aMannus --- soh/soh/Enhancements/enemyrandomizer.cpp | 70 +++---- soh/soh/Enhancements/gameplaystats.cpp | 16 +- .../hint_list/hint_list_exclude_dungeon.cpp | 107 ++++++----- .../hint_list/hint_list_exclude_overworld.cpp | 32 ++-- .../3drando/hint_list/hint_list_item.cpp | 21 +- soh/soh/Enhancements/randomizer/item_list.cpp | 55 +++--- .../Enhancements/randomizer/randomizer.cpp | 85 ++++++--- soh/soh/Enhancements/randomizer/savefile.cpp | 46 ++--- soh/soh/Enhancements/randomizer/settings.cpp | 68 +++---- soh/soh/SohGui/ResolutionEditor.cpp | 12 +- soh/soh/SohGui/SohMenuDevTools.cpp | 18 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 180 +++++++++--------- soh/soh/SohGui/SohMenuRandomizer.cpp | 6 +- 13 files changed, 370 insertions(+), 346 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 326a4a78d..0b73af41a 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -42,18 +42,18 @@ const char* enemyCVarList[] = { }; const char* enemyNameList[] = { - "Armos", "Arwing", "Baby Dodongo", "Bari", - "Beamos", "Big Skulltula", "Stalchild (Big)", "Biri", - "Iron Knuckle (Black)", "Blue Tektite", "Bubble", "Club Moblin", - "Dark Link", "Dinolfos", "Dodongo", "Fire Keese", - "Floor Tile", "Floormaster", "Flying Peahat", "Flying Pot", - "Freezard", "Gibdo", "Gohma Larva", "Guay", - "Ice Keese", "Invisible Skulltula", "Keese", "Large Deku Baba", - "Like-Like", "Lizalfos", "Mad Scrub", "Wolfos (Normal)", - "Peahat Larva", "Redead", "Red Tektite", "Shabom", - "ShellBlade", "Skulltula", "Small Deku Baba", "Stalchild (Small)", - "Spike", "Stalfos", "Stinger", "Tailparasan", - "Torch Slug", "Wallmaster", "Iron Knuckle (White)", "Wolfos (White)", + "Armos", "Arwing", "Baby Dodongo", "Bari", + "Beamos", "Big Skulltula", "Stalchild (Big)", "Biri", + "Iron Knuckle (Black)", "Blue Tektite", "Bubble", "Club Moblin", + "Dark Link", "Dinolfos", "Dodongo", "Fire Keese", + "Floor Tile", "Floormaster", "Flying Peahat", "Flying Pot", + "Freezard", "Gibdo", "Gohma Larva", "Guay", + "Ice Keese", "Invisible Skulltula", "Keese", "Large Deku Baba", + "Like-Like", "Lizalfos", "Mad Scrub", "Wolfos (Normal)", + "Peahat Larva", "Redead", "Red Tektite", "Shabom", + "Shell Blade", "Skulltula", "Small Deku Baba", "Stalchild (Small)", + "Spike", "Stalfos", "Stinger", "Tailpasaran", + "Torch Slug", "Wallmaster", "Iron Knuckle (White)", "Wolfos (White)", "Withered Deku Baba", }; @@ -80,7 +80,7 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot { ACTOR_EN_FZ, 0 }, // Freezard { ACTOR_EN_RD, 32766 }, // Gibdo (standing) - { ACTOR_EN_GOMA, 7 }, // Gohma larva (non-gohma rooms) + { ACTOR_EN_GOMA, 7 }, // Gohma Larva (Non-Gohma rooms) { ACTOR_EN_CROW, 0 }, // Guay { ACTOR_EN_FIREFLY, 4 }, // Ice Keese { ACTOR_EN_ST, 2 }, // Skulltula (invisible) @@ -102,7 +102,7 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) { ACTOR_EN_TEST, 2 }, // Stalfos { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) - { ACTOR_EN_TP, -1 }, // Electric Tailparasan + { ACTOR_EN_TP, -1 }, // Electric Tailpasaran { ACTOR_EN_BW, 0 }, // Torch Slug { ACTOR_EN_WALLMAS, 1 }, // Wallmaster { ACTOR_EN_WF, 1 }, // Wolfos (white) @@ -120,19 +120,19 @@ static int enemiesToRandomize[] = { ACTOR_EN_FIREFLY, // Keese (including fire/ice) ACTOR_EN_TEST, // Stalfos ACTOR_EN_TITE, // Tektite - ACTOR_EN_POH, // Poe (normal, blue rupee, composers + ACTOR_EN_POH, // Poe (normal, blue rupee, composers) ACTOR_EN_OKUTA, // Octorok ACTOR_EN_WALLMAS, // Wallmaster ACTOR_EN_DODONGO, // Dodongo // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_e_encount1.c) ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva - ACTOR_EN_ZF, // Lizalfos, dinolfos - ACTOR_EN_GOMA, // Gohma larva (normal, eggs, gohma eggs) + ACTOR_EN_ZF, // Lizalfos, Dinolfos + ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) ACTOR_EN_BUBBLE, // Shabom (bubble) ACTOR_EN_DODOJR, // Baby Dodongo ACTOR_EN_TORCH2, // Dark Link ACTOR_EN_BILI, // Biri (small jellyfish) - ACTOR_EN_TP, // Electric Tailparasan + ACTOR_EN_TP, // Electric Tailpasaran ACTOR_EN_ST, // Skulltula (normal, big, invisible) ACTOR_EN_BW, // Torch Slug ACTOR_EN_EIYER, // Stinger (land) @@ -147,7 +147,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_FLOORMAS, // Floormaster ACTOR_EN_RD, // Redead, Gibdo ACTOR_EN_SW, // Skullwalltula - // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations means it atleast shows up in the game + // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations means it at least shows up in the game) ACTOR_EN_SB, // Shell Blade ACTOR_EN_KAREBABA, // Withered Deku Baba ACTOR_EN_RR, // Like-Like @@ -156,7 +156,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_TUBO_TRAP, // Flying pot ACTOR_EN_FZ, // Freezard ACTOR_EN_WEIYER, // Stinger (Water) - ACTOR_EN_HINTNUTS, // Hint deku scrubs + ACTOR_EN_HINTNUTS, // Hint Deku Scrubs ACTOR_EN_WF, // Wolfos ACTOR_EN_SKB, // Stalchild ACTOR_EN_CROW // Guay @@ -169,8 +169,8 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po // Hack to remove enemies that wrongfully spawn because of bypassing object dependency with enemy randomizer on. // This should probably be handled on OTR generation in the future when object dependency is fully removed. - // Remove bats and skulltulas from graveyard. - // Remove octorok in lost woods. + // Remove bats and Skulltulas from graveyard. + // Remove Octorok in Lost Woods. if (((*actorId == ACTOR_EN_FIREFLY || (*actorId == ACTOR_EN_SW && *params == 0)) && play->sceneNum == SCENE_GRAVEYARD) || (*actorId == ACTOR_EN_OKUTA && play->sceneNum == SCENE_LOST_WOODS)) { return 0; @@ -251,13 +251,13 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po case ACTOR_EN_VALI: *posY = *posY + 300; break; - // Spawn peahat off the ground, otherwise it kills itself by colliding with the ground. + // Spawn Peahat off the ground, otherwise it kills itself by colliding with the ground. case ACTOR_EN_PEEHAT: if (*params == 1) { *posY = *posY + 100; } break; - // Spawn skulltulas off the ground. + // Spawn Skulltulas off the ground. case ACTOR_EN_ST: *posY = *posY + 200; break; @@ -327,14 +327,14 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // Only randomize the main component of Electric Tailparasans, not the tail segments they spawn. case ACTOR_EN_TP: return (params == -1); - // Only randomize the initial deku scrub actor (single and triple attack), not the flower they spawn. + // Only randomize the initial Deku Scrub actor (single and triple attack), not the flower they spawn. case ACTOR_EN_DEKUNUTS: return (params == -256 || params == 768); - // Don't randomize the OoB wallmaster in the silver rupee room because it's only there to + // Don't randomize the OoB wallmaster in the Silver Rupee room because it's only there to // not trigger unlocking the door after killing the other wallmaster in authentic gameplay. case ACTOR_EN_WALLMAS: return (!(!isMQ && sceneNum == SCENE_GERUDO_TRAINING_GROUND && roomNum == 2 && posX == -2345)); - // Only randomize initial floormaster actor (it can split and does some spawning on init). + // Only randomize initial Floormaster actor (it can split and does some spawning on init). case ACTOR_EN_FLOORMAS: return (params == 0 || params == -32768); // Only randomize the initial eggs, not the enemies that spawn from them. @@ -348,10 +348,10 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // break the thrones in the room to access a button. case ACTOR_EN_IK: return (params != 1280 && !(isMQ && sceneNum == SCENE_INSIDE_GANONS_CASTLE && roomNum == 17)); - // Only randomize the intitial spawn of the huge jellyfish. It spawns another copy when hit with a sword. + // Only randomize the initial spawn of the huge jellyfish. It spawns another copy when hit with a sword. case ACTOR_EN_VALI: return (params == -1); - // Don't randomize lizalfos in Doodong's Cavern because the gates won't work correctly otherwise. + // Don't randomize Lizalfos in Dodongo's Cavern because the gates won't work correctly otherwise. case ACTOR_EN_ZF: return (params != 1280 && params != 1281 && params != 1536 && params != 1537); // Don't randomize the Wolfos in SFM because it's needed to open the gate. @@ -363,7 +363,7 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, case ACTOR_EN_TEST: return (params != 1 && !(sceneNum == SCENE_SHADOW_TEMPLE && roomNum == 21)); // Only randomize the enemy variant of Armos Statue. - // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a button + // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a button. case ACTOR_EN_AM: return ((params == -1 || params == 255) && !(sceneNum == SCENE_SPIRIT_TEMPLE && posX == 2141)); // Don't randomize Shell Blades and Spikes in the underwater portion in Water Temple as it's impossible to kill @@ -385,9 +385,9 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { uint32_t isMQ = ResourceMgr_IsSceneMasterQuest(sceneNum); - // Freezard - Child Link can only kill this with jump slash deku sticks or other equipment like bombs. + // Freezard - Child Link can only kill this with jump slash Deku Sticks or other equipment like bombs. // Beamos - Needs bombs. - // Shell Blade & Spike - Child link can't kill these with sword or deku stick. + // Shell Blade & Spike - Child Link can't kill these with sword or Deku Stick. // Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. // Wallmaster - Not easily visible, often makes players think they're softlocked and that there's no enemies left. // Club Moblin - Many issues with them falling or placing out of bounds. Maybe fixable in the future? @@ -454,7 +454,7 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { !(!isMQ && enemiesToExcludeClearRooms && (roomNum == 3 || roomNum == 5 || roomNum == 10)) && !(isMQ && enemiesToExcludeTimedRooms && (roomNum == 1 || roomNum == 3 || roomNum == 5 || roomNum == 7)) && !(isMQ && enemiesToExcludeClearRooms && roomNum == 10)); - // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceilling, + // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceiling, // becoming impossible to kill. // Ganon's Tower. case SCENE_GANONS_TOWER: @@ -462,8 +462,8 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { // Ganon's Tower Escape. case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: return (!((enemiesToExcludeTimedRooms || (enemy.id == ACTOR_EN_ZF && enemy.params == -1)) && roomNum == 1)); - // Don't allow big stalchildren, big peahats and the large Bari (jellyfish) during the Gohma fight because they can clip into Gohma - // and it crashes the game. Likely because Gohma on the ceilling can't handle collision with other enemies. + // Don't allow big Stalchildren, big Peahats and the large Bari (jellyfish) during the Gohma fight because they can clip into Gohma + // and it crashes the game. Likely because Gohma on the ceiling can't handle collision with other enemies. case SCENE_DEKU_TREE_BOSS: return (!enemiesToExcludeTimedRooms && !(enemy.id == ACTOR_EN_SKB && enemy.params == 20) && !(enemy.id == ACTOR_EN_PEEHAT && enemy.params == -1)); diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 51144dd20..e939fa18c 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -35,7 +35,7 @@ const char* const sceneMappings[] = { "Ice Cavern", "Ganon's Tower", "Gerudo Training Ground", - "Theives' Hideout", + "Thieves' Hideout", "Inside Ganon's Castle", "Tower Collapse", "Castle Collapse", @@ -189,7 +189,7 @@ const char* const countMappings[] = { "Poe Sisters:", "Redead:", "Shabom:", - "Shellblade:", + "Shell Blade:", "Skull Kid:", "Skulltula:", "Skulltula (Big):", @@ -251,8 +251,8 @@ typedef struct { }TimestampInfo; // 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.ship.stats.itemTimestamp +// Names and colors are set up at the bottom of this file. +// Times are stored in gSaveContext.ship.stats.itemTimestamp. TimestampInfo itemTimestampDisplay[TIMESTAMP_MAX]; TimestampInfo sceneTimestampDisplay[8191]; //std::vector sceneTimestampDisplay; @@ -427,7 +427,7 @@ const char* ResolveSceneID(int sceneID, int roomID){ return "Big Skulltula Grotto"; }; } else if (sceneID == SCENE_WINDMILL_AND_DAMPES_GRAVE) { - //Only the last room of Dampe's Grave (rm 6) is considered the windmill + //Only the last room of Dampe's Grave (rm 6) is considered the windmill. return roomID == 6 ? "Windmill" : "Dampe's Grave"; } else if (sceneID < SCENE_ID_MAX) { return sceneMappings[sceneID]; @@ -625,7 +625,7 @@ void DrawGameplayStatsOptionsTab() { UIWidgets::CheckboxOptions() .Tooltip("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" + "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") .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), @@ -869,9 +869,9 @@ void GameplayStatsWindow::InitElement() { SetupDisplayColors(); SaveManager::Instance->AddLoadFunction("sohStats", 1, LoadStatsVersion1); - // Add main section save, no parent + // Add main section save, no parent. SaveManager::Instance->AddSaveFunction("sohStats", 1, SaveStats, true, SECTION_PARENT_NONE); - // Add subsections, parent of "sohStats". Not sure how to do this without the redundant references to "SaveStats" + // Add subsections, parent of "sohStats". Not sure how to do this without the redundant references to "SaveStats". SaveManager::Instance->AddSaveFunction("entrances", 1, SaveStats, false, SECTION_ID_STATS); SaveManager::Instance->AddSaveFunction("scenes", 1, SaveStats, false, SECTION_ID_STATS); SaveManager::Instance->AddInitFunction(InitStats); 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 152239f5b..81612ddb2 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 @@ -120,13 +120,13 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# vende #[[1]]#. hintTextTable[RHT_DEKU_TREE_HEART] = HintText(CustomMessage("They say that a #heart in the Deku Tree# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Deku-Baum# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ -hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", + hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", /*german*/ "Man erzählt sich, daß #auf König Dodongo# #[[1]]# läge.", /*french*/ "Selon moi, #par dessus le Roi Dodongo# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #sobre el Rey Dodongo# yace #[[1]]#. @@ -282,19 +282,19 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. hintTextTable[RHT_POT_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #pot in Dodongo's Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Dodongos Höhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz in Dodongos Höhle# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur# dans la Caverne Dodongo# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); @@ -446,22 +446,21 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, un #deku dentro de cierta deidad# vende #[[1]]#. hintTextTable[RHT_POT_JABU_JABUS_BELLY] = HintText(CustomMessage("They say that a #pot in Jabu Jabu's Belly# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Jabu-Jabus Bauch# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unter Wasser in Jabu-Jabus Bauch# #[[1]]# läge.", /*french*/ "Selon moi, #[[1]]# se trouve #sous l'eau dans le Ventre de Jabu Jabu#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABU_HEART] = HintText(CustomMessage("They say that near a #central lift in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß sich #nahe des zentralen Lifts in Jabu-Jabus Bauch# #[[1]]# befände.", /*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FOREST TEMPLE | ---------------------------*/ - hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", + hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", /*german*/ "Man erzählt sich, daß ein #Baum im Waldtempel# #[[1]]# unterstütze.", /*french*/ "Selon moi, sur l'#arbre dans le Temple de la Forêt# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, sobre un #árbol del Templo del Bosque# yace #[[1]]#. @@ -681,17 +680,17 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #pot in Forest Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Waldtempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FIRE TEMPLE | ---------------------------*/ -hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", + hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. @@ -877,11 +876,11 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_POT_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #pot in Fire Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Feuertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Feuertempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple du Feu# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", @@ -1020,11 +1019,11 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. hintTextTable[RHT_POT_WATER_TEMPLE] = HintText(CustomMessage("They say that a #pot in Water Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Wassertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß in einem #Fluß im Wassertempel# #[[1]]# läge.", /*french*/ "Selon moi, une #rivière dans le Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun atop a small pillar before a duel with one's shadow# reveals #[[1]]#.", @@ -1273,7 +1272,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #pot in Spirit Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Geistertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", @@ -1287,7 +1286,7 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ -hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", + hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubrirá un pasillo de facetas con #[[1]]#. @@ -1528,11 +1527,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_POT_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #pot in Shadow Temple# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Schattentempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Schattentempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain for a sentry guarding a house of the dead# reveals #[[1]]#.", @@ -1666,27 +1665,27 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. hintTextTable[RHT_POT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #pot in Bottom of the Well# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf dem Grund des Brunnens# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Puits# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz im Brunnen# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# in the well leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #versteckter Pfad durch den Grund# im Brunnen zu #[[1]]# führe.", /*french*/ "Selon moi, un #passage caché sous le sol# dans le puits mène à #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun in an empty cell# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer leeren Zelle# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une cellule vide# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); @@ -1764,19 +1763,19 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. hintTextTable[RHT_POT_ICE_CAVERN] = HintText(CustomMessage("They say that a #pot in Ice Cavern# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Eiskaverne# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Polaire# contient #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß auf einer #gefrorenen Säule# #[[1]]# läge.", /*french*/ "Selon moi, ", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Rubin in einer gefrorenen Kaverne# #[[1]]# verstecke.", /*french*/ "Selon moi, un #rubis dans la Caverne Polaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to a frozen cave# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens in der Nähe des Eingangs zu einer gefrorenen Kaverne# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie près de l’entrée d’une grotte gelée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. @@ -1784,27 +1783,27 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | Gerudo Training Ground | ---------------------------*/ hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Ground# drops #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", + /*german*/ "Man erzählt sich, daß ein #erblindetes Auge auf dem Gerudo-Trainingsgelände# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Ground# drops #[[1]]#.", - /*german*/ "Man erzählt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", + /*german*/ "Man erzählt sich, daß ein #erblindetes Auge auf dem Gerudo-Trainingsgelände# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Ground protect #[[1]]#.", - /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schützen würden.", + /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# auf dem Gerudo-Trainingsgelände #[[1]]# schützen würden.", /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Ground reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthülle.", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# auf dem Gerudo-Trainingsgelände #[[1]]# enthülle.", /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. @@ -1824,17 +1823,17 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# auf dem Gerudo-Trainingsgelände zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# auf dem Gerudo-Trainingsgelände zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #feurige Feinde# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #limaces de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. @@ -1878,12 +1877,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Grounds# reveals #[[1]]#.", - /*german*/ "!!!", + hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Ground# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Anrufen des Regens in der Nähe des Eingangs zum Gerudo-Trainingsgelände #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler la pluie près de l’entrée du Gymnase Gerudo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# auf dem Gerudo-Trainingsgelände zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. @@ -1898,7 +1897,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden laufende Soldaten# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. @@ -1918,12 +1917,12 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß #feurige Feinde# auf dem Gerudo-Trainingsgelände #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #ennemis de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Ground protect #[[1]]#.", - /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schützen würden.", + /*german*/ "Man erzählt sich, daß #reptilienartige Krieger# auf dem Gerudo-Trainingsgelände #[[1]]# schützen würden.", /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. @@ -1953,7 +1952,7 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Ground reveals #[[1]]#.", - /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthülle.", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# auf dem Gerudo-Trainingsgelände #[[1]]# enthülle.", /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. @@ -1962,9 +1961,9 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinalfos# is #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, dans #une épreuve avec un Dinalfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinolfos# is #[[1]]#.", + /*german*/ "Man erzählt sich, daß das Sehen einer #Prüfung mit Dinodorus# #[[1]]# enthülle.", + /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | GANONS CASTLE | @@ -2050,11 +2049,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for a sentry in the test of the sands# reveals #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne für eine Wache in einer Prüfung der Sande# #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil pour une sentinelle dans l’épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_SCRUBS_FAIRY] = HintText(CustomMessage("They say that within a #sanctuary before the final trial# rests #[[1]]#.", - /*german*/ "!!!", + /*german*/ "Man erzählt sich, daß innerhalb eines #Heiligtum vor der finalen Prüfung# #[[1]]# ruhe.", /*french*/ "Selon moi, #dans un sanctuaire avant l’épreuve finale# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", @@ -2168,11 +2167,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_POT_GANONS_CASTLE] = HintText(CustomMessage("They say that a #pot in Ganon's Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Ganons Schloß# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Château de Ganon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Herz in Ganons Schloß# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on 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 efbb24d10..9bbb1e4af 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 @@ -1493,67 +1493,67 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_POT_KOKIRI_FOREST] = HintText(CustomMessage("They say that a #pot in Kokiri Forest# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Kokiri-Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fôret Kokiri# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GERUDO_FORTRESS] = HintText(CustomMessage("They say that a #pot in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Gerudo-Festung# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_WASTELAND] = HintText(CustomMessage("They say that a #pot in Haunted Wasteland# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Gespensterwüste# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Désert Hanté# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_MARKET] = HintText(CustomMessage("They say that a #pot in Market# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf dem Markt# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Place du Marché# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_KAKARIKO] = HintText(CustomMessage("They say that a #pot in Kakariko Village# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Kakariko# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GRAVEYARD] = HintText(CustomMessage("They say that a #pot in Graveyard# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf dem Friedhof# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GORON_CITY] = HintText(CustomMessage("They say that a #pot in Goron City# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Goronia# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #pot in Death Mountain Crater# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase im Todeskrater# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre sur le Mont du Péril# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_DOMAIN] = HintText(CustomMessage("They say that a #pot in Zora's Domain# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Zoras Reich# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Domaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that a #pot in Zora's Fountain# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Zoras Quelle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fontaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_LON_LON_RANCH] = HintText(CustomMessage("They say that a #pot in Lon Lon Ranch# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase auf der Lon Lon-Farm# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_FIELD] = HintText(CustomMessage("They say that a #pot in Hyrule Field# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in der Hylianischen Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Plaine d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #pot in Hyrule Castle# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Vase in Schloß Hyrule# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Château d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Rubin in einem #ruhigen Wald# #[[1]]# verstecke.", /*french*/ "Selon moi, un rubis dans une #forêt tranquille# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_KOKIRI_FOREST_HEART] = HintText(CustomMessage("They say that a heart in a #tranquil forest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Herz in einem #ruhigen Wald# #[[1]]# verstecke.", /*french*/ "Selon moi, un cœur dans une #forêt tranquille# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_SARIAS_HOUSE_HEART] = HintText(CustomMessage("They say that a heart in a #dear friend's home# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Herz #im Heim eines lieben Freundes# #[[1]]# verstecke.", /*french*/ "Selon moi, un cœur dans la #maison d'une amie chère# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", 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 8b441c66e..9f4a0026a 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 @@ -2080,14 +2080,14 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(un aimant à poisson)")}); // /*spanish*/(caña de pescar) - hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("Bombchu Bag", /*german*/"!!!", /*french*/"un Sac de Missiles Teigneux"), + hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("a Bombchu Bag", /*german*/"eine Krabbelminentasche", /*french*/"un Sac de Missiles Teigneux"), { 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*/"un Sac rempli de souris")}); + CustomMessage("sack of mice", /*german*/"ein Sack Mäuse", /*french*/"un Sac rempli de souris")}); hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "ein Universalschlüssel", /*french*/ "une Clé Squelette"), // /*spanish*/una Llave Maestra @@ -2097,49 +2097,50 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a master unlocker", /*german*/ "ein Meisterentsperrer", /*french*/ "un Kit de Déverrouillage") }); // /*spanish*/un desbloqueador maestro - hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"!!!", /*french*/"un Carquois Infini"), + + hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"ein unendlicher Köcher", /*french*/"un Carquois Infini"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"!!!", /*french*/"un Sac de Bombe sans fond"), + hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"eine unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"!!!", /*french*/"un Sac de Graine sans fond"), + hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"eine unendliche Samentasche", /*french*/"un Sac de Graine sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"!!!", /*french*/" des Bâtons Mojo illimités"), + hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-Stäbe", /*french*/"des Bâtons Mojo illimités"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nut", /*german*/"!!!", /*french*/"des Noix Mojo illimitées"), + hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-Nüsse", /*french*/"des Noix Mojo illimitées"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"!!!", /*french*/"de la Magie infinie"), + hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magie", /*french*/"de la Magie infinie"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"!!!", /*french*/"des Missiles Teigneux illimités"), + hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"unendliche Krabbelminen", /*french*/"des Missiles Teigneux illimités"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { CustomMessage("", /*german*/"!!!", /*french*/"!!!")}); - hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"!!!", /*french*/"une Bourse sans fond"), + hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"eine unendliche Geldbörse", /*french*/"une Bourse sans fond"), { CustomMessage("", /*german*/"!!!", /*french*/"!!!"), }, { diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 5fb2a401c..d8113edd3 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -17,7 +17,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_NONE] = Item(RG_NONE, Text{ "No Item", "Rien", "Kein Artikel" }, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_NONE, 0, 0, 0, 0, 0, ITEM_CATEGORY_JUNK, MOD_NONE); // Randomizer Get Randomizer Get Name Text Type Get Item ID Adv. Logic Value Hint Text Key Item ID Object ID Draw ID Text ID field Chest Animation Item Category Mod Index itemTable[RG_KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{ "Kokiri Sword", "Épée Kokiri", "Kokiri-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_KOKIRI, true, LOGIC_KOKIRI_SWORD, RHT_KOKIRI_SWORD, ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{ "Master Sword", "Épée de Legende", "Master-Schwert"}, ITEMTYPE_EQUIP, 0xE0, true, LOGIC_MASTER_SWORD, RHT_MASTER_SWORD, ITEM_SWORD_MASTER, OBJECT_TOKI_OBJECTS, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MASTER_SWORD] = Item(RG_MASTER_SWORD, Text{ "Master Sword", "Épée de Legende", "Master-Schwert" }, ITEMTYPE_EQUIP, 0xE0, true, LOGIC_MASTER_SWORD, RHT_MASTER_SWORD, ITEM_SWORD_MASTER, OBJECT_TOKI_OBJECTS, GID_SWORD_BGS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MASTER_SWORD].SetCustomDrawFunc(Randomizer_DrawMasterSword); itemTable[RG_GIANTS_KNIFE] = Item(RG_GIANTS_KNIFE, Text{ "Giant's Knife", "Lame des Géants", "Langschwert" }, ITEMTYPE_EQUIP, GI_SWORD_KNIFE, true, LOGIC_NONE, RHT_GIANTS_KNIFE, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{ "Biggoron's Sword", "Épée de Biggoron", "Biggoron-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_BGS, true, LOGIC_BIGGORON_SWORD, RHT_BIGGORON_SWORD, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -171,6 +171,7 @@ 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_TREASURE_GAME_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); 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); @@ -189,7 +190,7 @@ void Rando::StaticData::InitItemTable() { 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] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "", "Schlüssel für das Gassenhaus" }, 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); @@ -232,7 +233,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SHADOW_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "Schlüsselbund für den Grund des Brunnens" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund für das Gerudo-Trainingsgelände" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund für das Gerudo-Trainingsgelände" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Schlüsselbund für die Gerudo-Festung" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); @@ -316,23 +317,23 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BUY_RED_POTION_40] = Item(RG_BUY_RED_POTION_40, Text{ "Buy Red Potion [40]", "Acheter: Potion Rouge [40]", "Rotes Elixier kaufen [40]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 40); itemTable[RG_BUY_RED_POTION_50] = Item(RG_BUY_RED_POTION_50, Text{ "Buy Red Potion [50]", "Acheter: Potion Rouge [50]", "Rotes Elixier kaufen [50]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); // Misc. - itemTable[RG_GOHMA_SOUL] = Item(RG_GOHMA_SOUL, Text{ "Gohma's Soul", "Âme de Gohma", "Gohmas Seele" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_CAN_SUMMON_GOHMA, RHT_GOHMA_SOUL, RG_GOHMA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GOHMA_SOUL] = Item(RG_GOHMA_SOUL, Text{ "Gohma's Soul", "Âme de Gohma", "Gohmas Seele" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_CAN_SUMMON_GOHMA, RHT_GOHMA_SOUL, RG_GOHMA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_GOHMA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_KING_DODONGO_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{ "King Dodongo's Soul", "Âme du Roi Dodongo", "König Dodongos Seele" }, ITEMTYPE_ITEM, 0xE1, true, LOGIC_CAN_SUMMON_KINGDODONGO, RHT_KING_DODONGO_SOUL, RG_KING_DODONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_KING_DODONGO_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{ "King Dodongo's Soul", "Âme du Roi Dodongo", "König Dodongos Seele" }, ITEMTYPE_ITEM, 0xE1, true, LOGIC_CAN_SUMMON_KINGDODONGO, RHT_KING_DODONGO_SOUL, RG_KING_DODONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_KING_DODONGO_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_BARINADE_SOUL] = Item(RG_BARINADE_SOUL, Text{ "Barinade's Soul", "Âme de Barinade", "Barinades Seele" }, ITEMTYPE_ITEM, 0xE2, true, LOGIC_CAN_SUMMON_BARINADE, RHT_BARINADE_SOUL, RG_BARINADE_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BARINADE_SOUL] = Item(RG_BARINADE_SOUL, Text{ "Barinade's Soul", "Âme de Barinade", "Barinades Seele" }, ITEMTYPE_ITEM, 0xE2, true, LOGIC_CAN_SUMMON_BARINADE, RHT_BARINADE_SOUL, RG_BARINADE_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BARINADE_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_PHANTOM_GANON_SOUL] = Item(RG_PHANTOM_GANON_SOUL, Text{ "Phantom Ganon's Soul", "Âme de Ganon Spectral", "Phantom-Ganons Seele" }, ITEMTYPE_ITEM, 0xE3, true, LOGIC_CAN_SUMMON_PHANTOMGANON, RHT_PHANTOM_GANON_SOUL, RG_PHANTOM_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_PHANTOM_GANON_SOUL] = Item(RG_PHANTOM_GANON_SOUL, Text{ "Phantom Ganon's Soul", "Âme de Ganon Spectral", "Phantom-Ganons Seele" }, ITEMTYPE_ITEM, 0xE3, true, LOGIC_CAN_SUMMON_PHANTOMGANON, RHT_PHANTOM_GANON_SOUL, RG_PHANTOM_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_PHANTOM_GANON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_VOLVAGIA_SOUL] = Item(RG_VOLVAGIA_SOUL, Text{ "Volvagia's Soul", "Âme de Vulcania", "Volvagias Seele" }, ITEMTYPE_ITEM, 0xE4, true, LOGIC_CAN_SUMMON_VOLVAGIA, RHT_VOLVAGIA_SOUL, RG_VOLVAGIA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_VOLVAGIA_SOUL] = Item(RG_VOLVAGIA_SOUL, Text{ "Volvagia's Soul", "Âme de Volcania", "Volvagias Seele" }, ITEMTYPE_ITEM, 0xE4, true, LOGIC_CAN_SUMMON_VOLVAGIA, RHT_VOLVAGIA_SOUL, RG_VOLVAGIA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_VOLVAGIA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_MORPHA_SOUL] = Item(RG_MORPHA_SOUL, Text{ "Morpha's Soul", "Âme de Morpha", "Morphas Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_MORPHA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MORPHA_SOUL] = Item(RG_MORPHA_SOUL, Text{ "Morpha's Soul", "Âme de Morpha", "Morphas Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_MORPHA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MORPHA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_BONGO_BONGO_SOUL] = Item(RG_BONGO_BONGO_SOUL, Text{ "Bongo Bongo's Soul", "Âme de Bongo Bongo", "Bongo Bongos Seele" }, ITEMTYPE_ITEM, 0xE6, true, LOGIC_CAN_SUMMON_BONGOBONGO, RHT_BONGO_BONGO_SOUL, RG_BONGO_BONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BONGO_BONGO_SOUL] = Item(RG_BONGO_BONGO_SOUL, Text{ "Bongo Bongo's Soul", "Âme de Bongo Bongo", "Bongo Bongos Seele" }, ITEMTYPE_ITEM, 0xE6, true, LOGIC_CAN_SUMMON_BONGOBONGO, RHT_BONGO_BONGO_SOUL, RG_BONGO_BONGO_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BONGO_BONGO_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_TWINROVA_SOUL] = Item(RG_TWINROVA_SOUL, Text{ "Twinrova's Soul", "Âme du Duo Maléfique", "Twinrovas Seele" }, ITEMTYPE_ITEM, 0xE7, true, LOGIC_CAN_SUMMON_TWINROVA, RHT_TWINROVA_SOUL, RG_TWINROVA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_TWINROVA_SOUL] = Item(RG_TWINROVA_SOUL, Text{ "Twinrova's Soul", "Âme du Duo Maléfique", "Twinrovas Seele" }, ITEMTYPE_ITEM, 0xE7, true, LOGIC_CAN_SUMMON_TWINROVA, RHT_TWINROVA_SOUL, RG_TWINROVA_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_TWINROVA_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); - itemTable[RG_GANON_SOUL] = Item(RG_GANON_SOUL, Text{ "Ganon's Soul", "Âme de Ganon", "Ganons Seele" }, ITEMTYPE_ITEM, 0xE8, true, LOGIC_CAN_SUMMON_GANON, RHT_GANON_SOUL, RG_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GANON_SOUL] = Item(RG_GANON_SOUL, Text{ "Ganon's Soul", "Âme de Ganon", "Ganons Seele" }, ITEMTYPE_ITEM, 0xE8, true, LOGIC_CAN_SUMMON_GANON, RHT_GANON_SOUL, RG_GANON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_GANON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul); itemTable[RG_FISHING_POLE] = Item(RG_FISHING_POLE, Text{ "Fishing Pole", "Canne à Pêche", "Angelrute" }, ITEMTYPE_ITEM, RG_FISHING_POLE, true, LOGIC_FISHING_POLE, RHT_FISHING_POLE, RG_FISHING_POLE, OBJECT_GI_FISH, GID_FISHING_POLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_FISHING_POLE].SetCustomDrawFunc(Randomizer_DrawFishingPoleGI); @@ -348,28 +349,28 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "Taste C-Rechts der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - 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] = 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", "!!!", "Sac de Missiles Teigneux" }, 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] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "Sac de Missiles Teigneux", "Krabbelminentasche" }, 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); - itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "Bâtons Mojo Infinis", "Unendliche Stab-Kapazität" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - 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_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); + itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "Bâtons Mojo Infinis", "Unendliche Stab-Kapazität" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + 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_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); + 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); itemTable[RG_SKELETON_KEY].SetCustomDrawFunc(Randomizer_DrawSkeletonKey); - itemTable[RG_DEKU_STICK_BAG] = Item(RG_DEKU_STICK_BAG, Text{ "Deku Stick Bag", "Sac de Bâton Mojo", "Deku-Stab-Tasche" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_NONE, RG_DEKU_STICK_BAG, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DEKU_STICK_BAG] = Item(RG_DEKU_STICK_BAG, Text{ "Deku Stick Bag", "Sac de Bâton Mojo", "Deku-Stab-Tasche" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_NONE, RG_DEKU_STICK_BAG, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_DEKU_NUT_BAG] = Item(RG_DEKU_NUT_BAG, Text{ "Deku Nut Bag", "Sac de Noix Mojo", "Deku-Nuß-Tasche" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NONE, RG_DEKU_NUT_BAG, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, LOGIC_NONE, RHT_NONE); itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, LOGIC_NONE, RHT_NONE); @@ -391,11 +392,11 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Silberhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Goldhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_SILVER_SCALE] = Item(RG_SILVER_SCALE, Text{ "Silver Scale", "Écaille d'argent", "Silberne Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_SCALE, RHT_SILVER_SCALE, ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Écaille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "Erwachsenengeldbörse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, LOGIC_PROGRESSIVE_WALLET, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de Géant", "Riesige Geldbörse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, LOGIC_PROGRESSIVE_WALLET, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_TYCOON_WALLET] = Item(RG_TYCOON_WALLET, Text{ "Tycoon Wallet", "Bourse de Magnat", "Goldene Geldbörse" }, ITEMTYPE_ITEM, RG_TYCOON_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_TYCOON_WALLET, RG_TYCOON_WALLET, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "Kindergeldbörse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "Kindergeldbörse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{ "Deku Nut Capacity (30)", "Capacité de noix Mojo (30)", "Deku-Nuß-Kapazität (30)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_30, ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_NUT_CAPACITY_40] = Item(RG_DEKU_NUT_CAPACITY_40, Text{ "Deku Nut Capacity (40)", "Capacité de noix Mojo (40)", "Deku-Nuß-Kapazität (40)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_40, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_40, ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_STICK_CAPACITY_20] = Item(RG_DEKU_STICK_CAPACITY_20, Text{ "Deku Stick Capacity (20)", "Capacité de Bâtons Mojo (20)", "Deku-Stab-Kapazität (20)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_20, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_20, ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index fa2a3098e..4eac2e5bb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3460,8 +3460,8 @@ void Randomizer::CreateCustomMessages() { "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!", + "You found a %yGerudo Training &Ground %wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %yGerudo-Trainingsgelände%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!", @@ -3593,8 +3593,8 @@ void Randomizer::CreateCustomMessages() { "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", "Vous obtenez le trousseau de&clés du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, - "You found a %yGerudo Training&Grounds %wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für die %yGerudo-Trainingsarena%w!", + "You found a %yGerudo Training&Ground %wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für das %yGerudo-Trainingsgelände%w!", "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rGanon's Castle&%wKeyring!", @@ -3602,7 +3602,7 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez le 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!", - "!!!", + "Du erhältst ein %rSchlüsselbund%w& für das %rSchatztruhen-Poker&%w!", "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"), GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, @@ -3725,32 +3725,41 @@ void Randomizer::CreateCustomMessages() { "Du erhältst die %rKindergeldbörse%w!&Jetzt kannst Du bis&zu %y99 Rubine%w mit Dir führen!", "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'à %y99 rubis%w!"), - GIMESSAGE_NO_GERMAN(RG_GOHMA_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_GOHMA_SOUL, ITEM_BIG_POE, "You found the soul for %gGohma%w!", + "Du hast die Seele von %gGohma%w gefunden!", "Vous obtenez l'âme de %gGohma%w!"), - GIMESSAGE_NO_GERMAN(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, "You found the soul for %rKing&Dodongo%w!", + "Du hast die Seele von %rKönig&Dodongo%w gefunden!", "Vous obtenez l'âme du %rRoi Dodongo%w!"), - GIMESSAGE_NO_GERMAN(RG_BARINADE_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_BARINADE_SOUL, ITEM_BIG_POE, "You found the soul for %bBarinade%w!", + "Du hast die Seele von %bBarinade%w gefunden!", "Vous obtenez l'âme de %bBarinade%w!"), - GIMESSAGE_NO_GERMAN(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %gPhantom&Ganon%w!", + "Du hast die Seele von %gPhantom-&Ganon%w gefunden!", "Vous obtenez l'âme de %gGanon&Spectral%w!"), - GIMESSAGE_NO_GERMAN(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, "You found the soul for %rVolvagia%w!", - "Vous obtenez l'âme de %rVulcania%w!"), - GIMESSAGE_NO_GERMAN(RG_MORPHA_SOUL, ITEM_BIG_POE, + "Du hast die Seele von %rVolvagia%w gefunden!", + "Vous obtenez l'âme de %rVolcania%w!"), + GIMESSAGE(RG_MORPHA_SOUL, ITEM_BIG_POE, "You found the soul for %bMorpha%w!", + "Du hast die Seele von %bMorpha%w gefunden!", "Vous obtenez l'âme de %bMorpha%w!"), - GIMESSAGE_NO_GERMAN(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, "You found the soul for %pBongo&Bongo%w!", + "Du hast die Seele von %pBongo&Bongo%w gefunden!", "Vous obtenez l'âme de %pBongo&Bongo%w!"), - GIMESSAGE_NO_GERMAN(RG_TWINROVA_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_TWINROVA_SOUL, ITEM_BIG_POE, "You found the soul for %yTwinrova%w!", + "Du hast die Seele von %yTwinrova%w gefunden!", "Vous obtenez l'âme du %yDuo&Maléfique%w!"), - GIMESSAGE_NO_GERMAN(RG_GANON_SOUL, ITEM_BIG_POE, + GIMESSAGE(RG_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %cGanon%w!", + "Du hast die Seele von %cGanon%w gefunden!", "Vous obtenez l'âme de %cGanon%w!"), GIMESSAGE(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, @@ -3774,47 +3783,61 @@ void Randomizer::CreateCustomMessages() { "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), - GIMESSAGE_NO_GERMAN(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, + GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", + "Du hast die %rBronzene Schuppe%w erhalten!&Die Macht der Schwungkraft ist dein!", "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), - GIMESSAGE_NO_GERMAN(RG_FISHING_POLE, ITEM_FISHING_POLE, + GIMESSAGE(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!", + "Du hast eine verlorene %rAngelrute%w gefunden!&Zeit, im Teich zu angeln!", "Vous obtenez une %rCanne à pêche%w&perdue!&Il est temps d'aller à %gl'étang%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMBCHU_BAG, ITEM_BOMBCHU, + GIMESSAGE(RG_BOMBCHU_BAG, ITEM_BOMBCHU, "You found the %rBombchu Bag%w!", + "Du hast die %rKrabbelminentasche%w&gefunden!", "Vous obtenez un %rSac de Missiles&Teigneux%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, + GIMESSAGE(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", + "Du hast eine %runendliche Bombentasche%w&gefunden! Nun hast Du &%yunendliche Bomben%w!", "Vous obtenez un %rSac de Bombes&sans fond%w!&Vous avez maintenant des %ybombes&en quantité illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_QUIVER_INF, ITEM_QUIVER_50, + GIMESSAGE(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", + "Du hast einen %runendlichen Köcher%w&gefunden! Nun hast Du &%yunendliche Pfeile%w!", "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflèches&de manière illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, + GIMESSAGE(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", + "Du hast eine %runendliche Samentasche%w&gefunden! Nun hast Du &%yunendliche Samen%w!", "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres à l'infini%w!"), - GIMESSAGE_NO_GERMAN(RG_STICK_UPGRADE_INF, ITEM_STICK, + GIMESSAGE(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!", + "Du hast nun %yrunendliche%w %rDeku-Stäbe%w!", "Vous avez maintenant des %yBâtons&Mojo de manière illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_NUT_UPGRADE_INF, ITEM_NUT, + GIMESSAGE(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!", + "Du hast nun %yunendliche%w %rDeku-Nüsse%w!", "Vous avez maintenant des %yNoix&Mojo de manière illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_MAGIC_INF, ITEM_MAGIC_LARGE, + GIMESSAGE(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!", + "Du hast nun %yunendliche%w %rMagiew!", "Vous avez maintenant une quantité&de %ymagie illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_BOMBCHU_INF, ITEM_BOMBCHU, + GIMESSAGE(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!", + "Du hast nun %yunendliche%w %rKrabbelminen%w!", "Vous avez maintenant des %yMissiles&Teigneux en quantité illimités%w!"), - GIMESSAGE_NO_GERMAN(RG_WALLET_INF, ITEM_WALLET_GIANT, + GIMESSAGE(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!", + "Du hast nun %yunendliche%w %rRubinew!", "Vous avez maintenant des %yRubis en& quantité illimitée%w!"), - GIMESSAGE_NO_GERMAN(RG_SKELETON_KEY, ITEM_KEY_SMALL, + GIMESSAGE(RG_SKELETON_KEY, ITEM_KEY_SMALL, "You found the %rSkeleton Key%w!", + "Du hast den %rSkelettschlüssel%w gefunden!", "Vous avez trouvé la %rClé Squelette%w!"), - GIMESSAGE_NO_GERMAN(RG_DEKU_STICK_BAG, ITEM_STICK, - "You found the %rDeku Stick Bag%w!&You can now hold deku sticks!", + GIMESSAGE(RG_DEKU_STICK_BAG, ITEM_STICK, + "You found the %rDeku Stick Bag%w!&You can now hold Deku Sticks!", + "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-Stäbe%w halten!", "Vous avez trouvé le %rSac de Bâtons&Mojo%w!&Vous pouvez maintenant porter des&Bâtons Mojo!"), - GIMESSAGE_NO_GERMAN(RG_DEKU_NUT_BAG, ITEM_NUT, - "You found the %rDeku Nut Bag%w!&You can now hold deku nuts!", + GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, + "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", + "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-Nüsse%w halten!", "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), }}; CreateGetItemMessages(getItemMessages); diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index fba7c688b..f43fecf9e 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -32,9 +32,9 @@ void StartingItemGive(GetItemEntry getItemEntry, RandomizerCheck randomizerCheck } } -// RANDOTODO replace most of these GiveLink functions with calls to +// RANDOTODO: Replace most of these GiveLink functions with calls to // Item_Give in z_parameter, we'll need to update Item_Give to ensure -// nothing breaks when calling it without a valid play first +// nothing breaks when calling it without a valid play first. void GiveLinkRupees(int numOfRupees) { int maxRupeeCount = 0; if (CUR_UPG_VALUE(UPG_WALLET) == 0) { @@ -101,7 +101,7 @@ void GiveLinksPocketItem() { if (Randomizer_GetSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, (GetItemID)RG_NONE); StartingItemGive(getItemEntry, RC_LINKS_POCKET); - // If we re-add the above, we'll get the item on save creation, now it's given on first load + // If we re-add the above, we'll get the item on save creation, now it's given on first load. Flags_SetRandomizerInf(RAND_INF_LINKS_POCKET); } } @@ -194,9 +194,9 @@ void SetStartingItems() { // Logic cannot handle vanilla key layout in some dungeons // this is because vanilla expects the dungeon major item to be // locked behind the keys, which is not always true in rando. - // We can resolve this by starting with some extra keys + // We can resolve this by starting with some extra keys. if (ResourceMgr_IsSceneMasterQuest(SCENE_SPIRIT_TEMPLE)) { - // MQ Spirit needs 3 keys + // MQ Spirit needs 3 keys. gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; gSaveContext.ship.stats.dungeonKeys[SCENE_SPIRIT_TEMPLE] = 3; } @@ -222,10 +222,10 @@ extern "C" void Randomizer_InitSaveFile() { // Starts pending ice traps out at 0 before potentially incrementing them down the line. gSaveContext.ship.pendingIceTrapCount = 0; - // Reset triforce pieces collected + // Reset triforce pieces collected. gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected = 0; - // Set Cutscene flags and texts to skip them + // Set Cutscene flags and texts to skip them. Flags_SetEventChkInf(EVENTCHKINF_FIRST_SPOKE_TO_MIDO); Flags_SetInfTable(INFTABLE_SPOKE_TO_KAEPORA_IN_LAKE_HYLIA); Flags_SetEventChkInf(EVENTCHKINF_SHEIK_SPAWNED_AT_MASTER_SWORD_PEDESTAL); @@ -234,7 +234,7 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_WATCHED_GANONS_CASTLE_COLLAPSE_CAUGHT_BY_GERUDO); Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_NABOORU_IN_SPIRIT_TEMPLE); - // Go away ruto (water temple first cutscene) + // Go away Ruto (Water Temple first cutscene). gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x10); if (Randomizer_GetSettingValue(RSK_SHUFFLE_OCARINA_BUTTONS) == RO_GENERIC_OFF) { @@ -260,7 +260,7 @@ extern "C" void Randomizer_InitSaveFile() { // Give Link's pocket item GiveLinksPocketItem(); - // remove One Time scrubs with scrubsanity off + // Remove One Time Scrubs with Scrubsanity off if (Randomizer_GetSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_OFF) { Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE); Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT); @@ -272,7 +272,7 @@ extern "C" void Randomizer_InitSaveFile() { case RO_AGE_ADULT: // Adult gSaveContext.linkAge = LINK_AGE_ADULT; gSaveContext.entranceIndex = ENTR_TEMPLE_OF_TIME_WARP_PAD; - gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT + gSaveContext.savedSceneNum = SCENE_LON_LON_RANCH; // Set scene num manually to ToT. break; case RO_AGE_CHILD: // Child gSaveContext.linkAge = LINK_AGE_CHILD; @@ -284,7 +284,7 @@ extern "C" void Randomizer_InitSaveFile() { if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS)) { // Override the spawn entrance so entrance rando can take control, - // and to prevent remember save location from breaking inital spawn + // and to prevent remember save location from breaking initial spawn. gSaveContext.entranceIndex = -1; } @@ -304,7 +304,7 @@ extern "C" void Randomizer_InitSaveFile() { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, (GetItemID)RG_ZELDAS_LULLABY); StartingItemGive(getItemEntry, RC_SONG_FROM_IMPA); - // malon/talon back at ranch + // Malon/Talon back at ranch. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG); Flags_SetEventChkInf(EVENTCHKINF_TALON_WOKEN_IN_CASTLE); Flags_SetEventChkInf(EVENTCHKINF_TALON_RETURNED_FROM_CASTLE); @@ -313,13 +313,13 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER); Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); - // Got item from impa + // Got item from Impa. Flags_SetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY); - gSaveContext.sceneFlags[SCENE_HYRULE_CASTLE].swch |= (1 << 0x4); // move milk crates in hyrule castle to moat + gSaveContext.sceneFlags[SCENE_HYRULE_CASTLE].swch |= (1 << 0x4); // Move milk crates in Hyrule Castle to moat. - // set this at the end to ensure we always start with the letter - // this is for the off chance we got the weird egg from impa (which should never happen) + // Set this at the end to ensure we always start with the letter. + // This is for the off chance, we got the Weird Egg from Impa (which should never happen). INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA; Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } @@ -336,8 +336,8 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetEventChkInf(EVENTCHKINF_EPONA_OBTAINED); } - // Open lowest Vanilla Fire Temple locked door (to prevent key logic lockouts) - // Not done on keysanity since this lockout is a non issue when Fire keys can be found outside the temple + // Open lowest Vanilla Fire Temple locked door (to prevent key logic lockouts). + // Not done on Keysanity since this lockout is a non-issue when Fire Keys can be found outside the temple. u8 keysanity = Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANYWHERE || Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_OVERWORLD || Randomizer_GetSettingValue(RSK_KEYSANITY) == RO_DUNGEON_ITEM_LOC_ANY_DUNGEON; @@ -345,14 +345,14 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.sceneFlags[SCENE_FIRE_TEMPLE].swch |= (1 << 0x17); } - // Opens locked Water Temple door in vanilla to prevent softlocks - // West door on the middle level that leads to the water raising thing - // Happens in 3DS rando and N64 rando as well + // Opens locked Water Temple door in vanilla to prevent softlocks. + // West door on the middle level that leads to the water raising thing. + // Happens in 3DS rando and N64 rando as well. if (!ResourceMgr_IsSceneMasterQuest(SCENE_WATER_TEMPLE)) { gSaveContext.sceneFlags[SCENE_WATER_TEMPLE].swch |= (1 << 0x15); } - // Now handled on the fly + // Now handled on the fly. // int openForest = Randomizer_GetSettingValue(RSK_FOREST); // switch (openForest) { // case RO_CLOSED_FOREST_OFF: @@ -423,7 +423,7 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.itemGetInf[3] |= 0x100; // Sold Keaton Mask gSaveContext.itemGetInf[3] |= 0x200; // Sold Skull Mask gSaveContext.itemGetInf[3] |= 0x400; // Sold Spooky Mask - gSaveContext.itemGetInf[3] |= 0x800; // bunny hood related + gSaveContext.itemGetInf[3] |= 0x800; // Bunny Hood related gSaveContext.itemGetInf[3] |= 0x8000; // Obtained Mask of Truth } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f001a7cb7..39f367a1e 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -344,20 +344,20 @@ void Settings::CreateOptions() { // 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_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."); 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_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 // 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_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."); @@ -383,8 +383,8 @@ void Settings::CreateOptions() { // disabled for now, only applies when trade quest is not shuffled so there's a timer (currently not considered in logic) // 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_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 Bomb Flower 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."); @@ -405,39 +405,39 @@ void Settings::CreateOptions() { 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."); + 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 // 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_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_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_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_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_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_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."); @@ -445,14 +445,14 @@ void Settings::CreateOptions() { 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_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. 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_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 conjunction 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 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."); @@ -461,7 +461,7 @@ void Settings::CreateOptions() { 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_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 Fire 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."); @@ -472,11 +472,11 @@ void Settings::CreateOptions() { 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_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) 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_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."); @@ -492,21 +492,21 @@ void Settings::CreateOptions() { 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_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_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_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)"); + 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 // 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."); @@ -515,17 +515,17 @@ void Settings::CreateOptions() { 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_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 Fire."); 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_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_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 hookshooting 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."); @@ -1182,7 +1182,7 @@ void Settings::UpdateOptionProperties() { if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ClosedForest"), RO_CLOSED_FOREST_ON) == RO_CLOSED_FOREST_ON || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("DoorOfTime"), RO_DOOROFTIME_CLOSED) == RO_DOOROFTIME_CLOSED && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_OFF) == RO_GENERIC_OFF)) /* closed door of time with ocarina shuffle off */ { - mOptions[RSK_STARTING_AGE].Disable("This option is disabled due to other options making the game unbeatable"); + mOptions[RSK_STARTING_AGE].Disable("This option is disabled due to other options making the game unbeatable."); } else { mOptions[RSK_STARTING_AGE].Enable(); } @@ -1453,12 +1453,12 @@ void Settings::UpdateOptionProperties() { } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), 0)) { - mOptions[RSK_STARTING_STICKS].Disable("Disabled because Shuffle Deku Stick Bag is On"); + mOptions[RSK_STARTING_STICKS].Disable("Disabled because Shuffle Deku Stick Bag is on."); } else { mOptions[RSK_STARTING_STICKS].Enable(); } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), 0)) { - mOptions[RSK_STARTING_NUTS].Disable("Disabled because Shuffle Deku Nut Bag is On"); + mOptions[RSK_STARTING_NUTS].Disable("Disabled because Shuffle Deku Nut Bag is on."); } else { mOptions[RSK_STARTING_NUTS].Enable(); } @@ -1669,7 +1669,7 @@ void Settings::UpdateOptionProperties() { } // Shuffle 100 GS Reward - Force-Enabled if Ganon's Boss Key is on the 100 GS Reward if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_VANILLA) == RO_GANON_BOSS_KEY_KAK_TOKENS) { - mOptions[RSK_SHUFFLE_100_GS_REWARD].Disable("This option is force-enabled because \"Ganon's Boss Key\" is set to \"100 GS Reward.\""); + mOptions[RSK_SHUFFLE_100_GS_REWARD].Disable("This option is force-enabled because \"Ganon's Boss Key\" is set to \"100 GS Reward\"."); } else { mOptions[RSK_SHUFFLE_100_GS_REWARD].Enable(); } @@ -1822,17 +1822,17 @@ void Settings::UpdateOptionProperties() { if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), RO_GENERIC_OFF)) { mOptions[RSK_KAK_100_SKULLS_HINT].Enable(); } else { - mOptions[RSK_KAK_100_SKULLS_HINT].Disable("There is no point to hinting 100 skulls if it is not shuffled"); + mOptions[RSK_KAK_100_SKULLS_HINT].Disable("There is no point to hinting 100 skulls if it is not shuffled."); } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_OFF) == RO_FISHSANITY_HYRULE_LOACH) { mOptions[RSK_LOACH_HINT].Enable(); } else { - mOptions[RSK_LOACH_HINT].Disable("Loach hint is only avaliable with \"Fishsanity\" set to \"Shuffle only Hyrule Loach\"\nas that's the only setting where you present the loach to the fishing pond owner"); + mOptions[RSK_LOACH_HINT].Disable("Loach hint is only avaliable with \"Fishsanity\" set to \"Shuffle only Hyrule Loach\"\nas that's the only setting where you present the loach to the fishing pond owner."); } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("CuccosToReturn"), 7) == 0) { - mOptions[RSK_CHICKENS_HINT].Disable("Anju will just give you the item instead with 0 chickens"); + mOptions[RSK_CHICKENS_HINT].Disable("Anju will just give you the item instead with 0 chickens."); } else { mOptions[RSK_CHICKENS_HINT].Enable(); } diff --git a/soh/soh/SohGui/ResolutionEditor.cpp b/soh/soh/SohGui/ResolutionEditor.cpp index 6b287fde5..f302104da 100644 --- a/soh/soh/SohGui/ResolutionEditor.cpp +++ b/soh/soh/SohGui/ResolutionEditor.cpp @@ -89,7 +89,7 @@ using namespace UIWidgets; void ResolutionCustomWidget(WidgetInfo& info) { ImGui::BeginDisabled(disabled_everything); // Vertical Resolution - UIWidgets::CVarCheckbox("Set fixed vertical resolution (disables Resolution slider)", CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", + UIWidgets::CVarCheckbox("Set fixed vertical resolution (disables resolution slider)", CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", UIWidgets::CheckboxOptions({ {.disabled = disabled_everything} }).Tooltip("Override the resolution scale slider and use the settings below, irrespective of window size.") .Color(THEME_COLOR)); //if (disabled_pixelCount || disabled_everything) { // Hide pixel count controls. @@ -161,7 +161,7 @@ void ResolutionCustomWidget(WidgetInfo& info) { ImGui::EndDisabled(); UIWidgets::PopStyleInput(); - // Integer scaling settings group (Pixel-perfect Mode) + // Integer scaling settings group (Pixel Perfect Mode) static const ImGuiTreeNodeFlags IntegerScalingResolvedImGuiFlag = CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) ? ImGuiTreeNodeFlags_DefaultOpen : ImGuiTreeNodeFlags_None; @@ -169,8 +169,8 @@ void ResolutionCustomWidget(WidgetInfo& info) { if (ImGui::CollapsingHeader("Integer Scaling Settings", IntegerScalingResolvedImGuiFlag)) { const bool disabled_pixelPerfectMode = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0) || disabled_everything; - // Pixel-perfect Mode - UIWidgets::CVarCheckbox("Pixel-perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", + // Pixel Perfect Mode + UIWidgets::CVarCheckbox("Pixel Perfect Mode", CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", UIWidgets::CheckboxOptions({{ .disabled = disabled_pixelCount || disabled_everything }}).Tooltip("Don't scale image to fill window.") .Color(THEME_COLOR)); if (disabled_pixelCount && CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".PixelPerfectMode", 0)) { @@ -181,7 +181,7 @@ void ResolutionCustomWidget(WidgetInfo& info) { // Integer Scaling UIWidgets::CVarSliderInt(fmt::format("Integer scale factor: {}", max_integerScaleFactor).c_str(), CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.Factor", UIWidgets::IntSliderOptions({ {.disabled = disabled_pixelPerfectMode || CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)} }) - .Min(1).Max(max_integerScaleFactor).DefaultValue(1).Tooltip("Integer scales the image. Only available in pixel-perfect mode.").Color(THEME_COLOR)); + .Min(1).Max(max_integerScaleFactor).DefaultValue(1).Tooltip("Integer scales the image. Only available in Pixel Perfect Mode.").Color(THEME_COLOR)); // Display warning if size is being clamped or if framebuffer is larger than viewport. if (!disabled_pixelPerfectMode && (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.NeverExceedBounds", 1) && @@ -193,7 +193,7 @@ void ResolutionCustomWidget(WidgetInfo& info) { UIWidgets::CVarCheckbox("Automatically scale image to fit viewport", CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", UIWidgets::CheckboxOptions({ {.disabled = disabled_pixelPerfectMode} }).DefaultValue(true).Color(THEME_COLOR) - .Tooltip("Automatically sets scale factor to fit window. Only available in pixel-perfect mode.")); + .Tooltip("Automatically sets scale factor to fit window. Only available in Pixel Perfect Mode.")); if (CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".IntegerScale.FitAutomatically", 0)) { // This is just here to update the value shown on the slider. // The function in LUS to handle this setting will ignore IntegerScaleFactor while active. diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index c8b3e96b7..e6a757f21 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -28,21 +28,21 @@ void SohMenu::AddMenuDevTools() { .CVar(CVAR_DEVELOPER_TOOLS("DebugSaveFileMode")) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }) .Options(ComboboxOptions() - .Tooltip("Changes the behaviour of debug file select creation (creating a save file on slot 1 " - "with debug mode on)\n" - "- Off: The debug save file will be a normal savefile\n" - "- Vanilla: The debug save file will be the debug save file from the original game\n" - "- Maxed: The debug save file will be a save file with all of the items & upgrades") + .Tooltip("Changes the behavior of debug file select creation (creating a save file on slot 1 " + "with debug mode on):\n" + "- Off: The debug save file will be a normal savefile.\n" + "- Vanilla: The debug save file will be the debug save file from the original game.\n" + "- Maxed: The debug save file will be a save file with all of the items & upgrades.") .ComboMap(debugSaveFileModes)); AddWidget(path, "OoT Skulltula Debug", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("SkulltulaDebugEnabled")) .Options(CheckboxOptions().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.")); + "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!")); AddWidget(path, "Better Debug Warp Screen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("BetterDebugWarpScreen")) .Options(CheckboxOptions().Tooltip( - "Optimized debug warp screen, with the added ability to chose entrances and time of day").DefaultValue(true)); + "Optimized Debug Warp Screen, with the added ability to chose entrances and time of day.").DefaultValue(true)); AddWidget(path, "Debug Warp Screen Translation", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation")) .Options(CheckboxOptions() @@ -50,7 +50,7 @@ void SohMenu::AddMenuDevTools() { .DefaultValue(true)); AddWidget(path, "Resource logging", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("ResourceLogging")) - .Options(CheckboxOptions().Tooltip("Logs some resources as XML when they're loaded in binary format")); + .Options(CheckboxOptions().Tooltip("Logs some resources as XML when they're loaded in binary format.")); AddWidget(path, "Frame Advance", WIDGET_CHECKBOX) .Options(CheckboxOptions().Tooltip( diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 3ad6b4064..c2f425898 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -103,7 +103,7 @@ void SohMenu::AddMenuEnhancements() { " - Junk items: Small brown chests\n" " - Small keys: Small silver chests\n" " - Boss keys: Vanilla size and texture\n" - " - Skulltula Tokens: Small skulltula chest\n" + " - Skulltula Tokens: Small Skulltula chest\n" "\n" "NOTE: Textures will not apply if you are using a mod pack with a custom chest model.")); AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX) @@ -158,7 +158,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Controls", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Answer Navi Prompt with L Button", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NaviOnL")) - .Options(CheckboxOptions().Tooltip("Speak to Navi with L but enter First-Person Camera with C-Up")); + .Options(CheckboxOptions().Tooltip("Speak to Navi with L but enter First-Person Camera with C-Up.")); AddWidget(path, "Don't Require Input for Credits Sequence", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NoInputForCredits")) .Options(CheckboxOptions().Tooltip( @@ -169,7 +169,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().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.")); + "undesireably, for instance Z-Targeting something you might not want to.")); AddWidget(path, "Pause Buffer Input Window: %d frames", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("PauseBufferWindow")) .Options(IntSliderOptions() @@ -314,7 +314,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Exclude Glitch-Aiding Cutscenes", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding")) .Options(CheckboxOptions().Tooltip( - "Don't skip cutscenes that are associated wiht useful glitches. Currently, it is " + "Don't skip cutscenes that are associated with useful glitches. Currently, it is " "only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, and the Box Skip One " "Point in Jabu.")); @@ -396,7 +396,7 @@ void SohMenu::AddMenuEnhancements() { "\"Skip Get Item Animation\" option within the randomizer enhancements instead."; }) .Options(CheckboxOptions().Tooltip( - "Stops the game from freezing the player when picking up Gold Skulltula Tokens. Does not" + "Stops the game from freezing the player when picking up Gold Skulltula Tokens. Does not " "apply in randomizer savefiles.")); AddWidget(path, "Skip Save Confirmation", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SkipSaveConfirmation")) @@ -454,7 +454,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Animated Link in Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("PauseMenuAnimatedLink")) .Options(CheckboxOptions().Tooltip( - "Turns the Static Image of Link in the Pause Menu's Equipment Subsceen " + "Turns the Static Image of Link in the Pause Menu's Equipment Subscreen " "into a model cycling through his idle animations." )); AddWidget(path, "Show Age-Dependent Equipment", WIDGET_CVAR_CHECKBOX) @@ -463,7 +463,7 @@ void SohMenu::AddMenuEnhancements() { UpdatePatchHand(); }) .Options(CheckboxOptions().Tooltip( - "Makes all equipment visible, regardless of Age." + "Makes all equipment visible, regardless of age." )); AddWidget(path, "Scale Adult Equipment as Child", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ScaleAdultEquipmentAsChild")) @@ -477,7 +477,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Show Gauntlets in First Person", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FirstPersonGauntlets")) .Options(CheckboxOptions().Tooltip( - "Renders Guantlets when using the Bow and Hookshot like in OoT3D." + "Renders Gauntlets when using the Bow and Hookshot like in OoT3D." )); AddWidget(path, "Show Chains on Both Sides of Locked Doors", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides")); @@ -518,7 +518,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Disable Black Bar Letterboxes", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DisableBlackBars")) .Options(CheckboxOptions().Tooltip( - "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: there may be minor visual " + "Disables Black Bar Letterboxes during cutscenes and Z-Targeting. NOTE: There may be minor visual " "glitches that were covered up by the black bars. Please disable this setting before reporting a bug.")); AddWidget(path, "Dynamic Wallet Icon", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DynamicWalletIcon")) @@ -550,7 +550,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Remove Spin Attack Darkness", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RemoveSpinAttackDarkness")) .Options(CheckboxOptions().Tooltip( - "Remove the Darkness that appears when charging a Spin Attack" + "Remove the Darkness that appears when charging a Spin Attack." )); AddWidget(path, "Draw Distance", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Increase Actor Draw Distance: %dx", WIDGET_CVAR_SLIDER_INT) @@ -585,13 +585,13 @@ void SohMenu::AddMenuEnhancements() { "Exclude Actors that are useful for Glitches from the extended culling ranges. Some actors may still draw " "in the extended ranges, but will not \"update\" so that certain glitches that leverage the original " "culling requirements will still work.\n\nThe following actors are excluded:\n" - " - White clothed Gerudos\n" + " - White Clothed Gerudos\n" " - King Zora\n" " - Gossip Stones\n" " - Boulders\n" " - Blue Warps\n" " - Darunia\n" - " - Gold SKulltulas\n")); + " - Gold Skulltulas\n")); path.sidebarName = "Items"; AddSidebarEntry("Enhancements", path.sidebarName, 3); @@ -601,17 +601,17 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Equip Items on Dpad", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("DpadEquips")) .Options(CheckboxOptions().Tooltip( - "Equip items and equipment on the D-Pad. If used with \"D-Pad on Pause Screen\", you must " - "hold C-Up to equip instead of navgiate.")); + "Equip items and equipment on the D-pad. If used with \"D-pad on Pause Screen\", you must " + "hold C-Up to equip instead of navigate.")); AddWidget(path, "Assignable Tunics and Boots", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("AssignableTunicsAndBoots")) - .Options(CheckboxOptions().Tooltip("Allows equipping the Tunics and Boots to C-Buttons/D-Pad.")); + .Options(CheckboxOptions().Tooltip("Allows equipping the Tunics and Boots to C-Buttons/D-pad.")); // TODO: Revist strength toggle, it's currently separate but should probably be locked behind the // Equipment toggle settings or be absorbed by it completely. AddWidget(path, "Equipment Toggle", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EquipmentCanBeRemoved")) .Options(CheckboxOptions().Tooltip( - "Allows equipment to be removed by toggling it off on\n the equipment subscreen.")); + "Allows equipment to be removed by toggling it on/off\n the equipment subscreen.")); AddWidget(path, "Allow Strength Equipment to be Toggled", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ToggleStrength")) .Callback([](WidgetInfo& info) { @@ -633,9 +633,9 @@ void SohMenu::AddMenuEnhancements() { .Tooltip("Introduces Options for unequipping Link's sword\n\n" "None: Only Biggoron's Sword/Giant's Knife can be toggled. Doing so will equip the " "Master Sword.\n\n" - "Child Toggle: This will allow for completely unequipping any sword as child link.\n\n" + "Child Toggle: This will allow for completely unequipping any sword as Child link.\n\n" "Both Ages: Any sword can be unequipped as either age. This may lead to swordless " - "glitches as Adult.")); + "glitches as adult.")); AddWidget(path, "Ask to Equip New Items", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("AskToEquip")) .Options(CheckboxOptions().Tooltip("Adds a prompt to equip newly-obtained Swords, Shields, and Tunics.")); @@ -659,7 +659,7 @@ void SohMenu::AddMenuEnhancements() { " - Obtained the Song of Time\n" " - Obtained the Master Sword\n" " - Not within range of a Time Block\n" - " - Not within range of Ocarina Playing spots.")); + " - Not within range of Ocarina Playing spots")); AddWidget(path, "Masks", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_COMBOBOX) @@ -676,10 +676,10 @@ void SohMenu::AddMenuEnhancements() { .Options( CheckboxOptions().Tooltip("Stops masks from automatically unequipping on certain situations:\n" "- When entering a new scene\n" - "- When not in any C button or the D-Pad\n" + "- When not in any C-Button or the D-pad\n" "- When saving and quitting\n" "- When dying\n" - "- When traveling thru time (if \"Masks Equippable as Adult\" is activated).")); + "- When traveling through time (if \"Masks Equippable as Adult\" is activated)")); AddWidget(path, "Invisible Bunny Hood", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HideBunnyHood")) .Options(CheckboxOptions().Tooltip("Turns Bunny Hood Invisible while still maintaining its effects.")); @@ -687,14 +687,14 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("MaskSelect")) .Options(CheckboxOptions().Tooltip( "After completing the mask trading sub-quest, press A and any direction on the mask " - "slog to change masks")); + "slot to change masks.")); path.column = SECTION_COLUMN_2; AddWidget(path, "Explosives", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Deku Nuts Explode Bombs", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NutsExplodeBombs")) .Options(CheckboxOptions().Tooltip("Make Deku Nuts explode Bombs, similar to how they interact with Bombchus. " - "This does not affect Bombflowers.")); + "This does not affect Bomb Flowers.")); AddWidget(path, "Remove Explosive Limit", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("RemoveExplosiveLimit")) .Options(CheckboxOptions().Tooltip("Removes the cap of 3 active explosives being deployed at once.")); @@ -748,8 +748,8 @@ void SohMenu::AddMenuEnhancements() { "Allows Light Arrows to activate Sun Switches. May require a room reload if toggled during gameplay.")); AddWidget(path, "Bow and Child/Slingshot as Adult", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BowSlingshotAmmoFix")) - .Options(CheckboxOptions().Tooltip("Allows Child to use a Bow with Arrows.\n" - "Allows Adult to use a Slingshot with Seeds.\n\n" + .Options(CheckboxOptions().Tooltip("Allows Child Link to use a Bow with Arrows.\n" + "Allows Adult Link to use a Slingshot with Seeds.\n\n" "Requires glitches or the 'Timeless Equipment' cheat to equip.")); AddWidget(path, "Aiming Reticle for the Bow/Slingshot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BowReticle")) @@ -761,12 +761,12 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Targetable Hookshot Reticle", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HookshotableReticle")) .Options(CheckboxOptions().Tooltip( - "Makes the Hookshot Reticle use a different color when aiming at Hookshotable Collision.")); + "Makes the Hookshot Reticle use a different color when aiming at hookshotable collision.")); AddWidget(path, "Boomerang", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Instant Boomerang Recall", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FastBoomerang")) - .Options(CheckboxOptions().Tooltip("Instantly return the boomerang to Link by pressing its item button while " + .Options(CheckboxOptions().Tooltip("Instantly return the Boomerang to Link by pressing its item button while " "it's in the air.")); AddWidget(path, "Aim Boomerang in First-Person Mode", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BoomerangFirstPerson")) @@ -827,7 +827,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix Enemies not Spawning Near Water", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes")) .Options(CheckboxOptions().Tooltip( - "Causes respanwing enemies, like Stalchildren, to appear on land near bodies of water. " + "Causes respawning enemies, like Stalchildren, to appear on land near bodies of water. " "Fixes an incorrect calculation that acted like water underneath ground was above it.")); AddWidget(path, "Fix Poacher's Saw Softlock", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixSawSoftlock")) @@ -898,7 +898,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Graphical Fixes", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Fix L&R Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixMenuLR")) - .Options(CheckboxOptions().Tooltip("Makes the L and R buttons in the pause menu the same color")); + .Options(CheckboxOptions().Tooltip("Makes the L and R buttons in the pause menu the same color.")); AddWidget(path, "Fix Dungeon Entrances", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixDungeonMinimapIcon")) .Options(CheckboxOptions().Tooltip( @@ -916,7 +916,7 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("GerudoWarriorClothingFix")) .Options(CheckboxOptions().Tooltip( "Prevent the Gerudo Warrior's clothes changing color when changing Link's tunic or " - "using Bombs in front of her.")); + "using bombs in front of her.")); AddWidget(path, "Fix Out of Bounds Textures", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixTexturesOOB")) .Callback([](WidgetInfo& info) { ApplyAuthenticGfxPatches(); }) @@ -925,7 +925,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix Link's Eyes Open while Sleeping", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping")) .Options(CheckboxOptions().Tooltip( - "Fixes Link's eyes being open in the openeing cutscene when he is supposed to be sleeping.")); + "Fixes Link's eyes being open in the opening cutscene when he is supposed to be sleeping.")); AddWidget(path, "Fix Hand Holding Hammer", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FixHammerHand")) .Callback([](WidgetInfo& info) { UpdatePatchHand(); }) @@ -942,10 +942,10 @@ void SohMenu::AddMenuEnhancements() { ComboboxOptions() .ComboMap(zFightingOptions) .DefaultIndex(ZFIGHT_FIX_DISABLED) - .Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" - "Consistent: Certain paths vanish the same way in all resolutions\n" - "No Vanish: Paths do not vanish, Link seems to sink in to some paths\n" - "This might affect other decal effects\n")); + .Tooltip("Disabled: Paths vanish more the higher the resolution (Z-Fighting is based on resolution).\n" + "Consistent: Certain paths vanish the same way in all resolutions.\n" + "No Vanish: Paths do not vanish, Link seems to sink in to some paths.\n" + "This might affect other decal effects.\n")); AddWidget(path, "Audio Fixes", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Fix Missing Jingle after 5 Silver Rupees", WIDGET_CVAR_CHECKBOX) @@ -983,13 +983,13 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fish while Hovering", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("HoverFishing")) .Options(CheckboxOptions().Tooltip( - "Restore a bug from NSTC 1.0 that allows casting the Fishing Rod while using the Hover Boots.")); + "Restore a bug from NTSC 1.0 that allows casting the Fishing Rod while using the Hover Boots.")); AddWidget(path, "N64 Weird Frames", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("N64WeirdFrames")) - .Options(CheckboxOptions().Tooltip("Restores N64 Weird Frames allwing weirdshots to behave the same as N64.")); + .Options(CheckboxOptions().Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64.")); AddWidget(path, "Bombchus Out of Bounds", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BombchusOOB")) - .Options(CheckboxOptions().Tooltip("Allows Bombchus to explode out of bounds. Similar to Gamecube and Wii VC")); + .Options(CheckboxOptions().Tooltip("Allows Bombchus to explode out of bounds. Similar to GameCube and Wii VC.")); AddWidget(path, "Quick Putaway", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("QuickPutaway")) .Options(CheckboxOptions().Tooltip( @@ -1012,7 +1012,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fix L&Z Page Switch in Pause Menu", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("NGCKaleidoSwitcher")) .Options(CheckboxOptions().Tooltip( - "Makes L and R switch pages like on the Gamecube. Z opens the Debug Menu instead.")); + "Makes L and R switch pages like on the GameCube. Z opens the Debug Menu instead.")); // Difficulty Options path.sidebarName = "Difficulty"; @@ -1035,15 +1035,15 @@ void SohMenu::AddMenuEnhancements() { .ComboMap(allPowers) .DefaultIndex(0) .Tooltip( - "Modifies all sources of damage not affected by other sliders\n" - "2x: Can survive all common attacks from the start of the game\n" - "4x: Dies in 1 hit to any substantial attack from the start of the game\n" - "8x: Can only survive trivial damage from the start of the game\n" - "16x: Can survive all common attacks with max health without double defense\n" - "32x: Can survive all common attacks with max health and double defense\n" - "64x: Can survive trivial damage with max health without double defense\n" - "128x: Can survive trivial damage with max health and double defense\n" - "256x: Cannot survive damage" + "Modifies all sources of damage not affected by other sliders:\n" + "2x: Can survive all common attacks from the start of the game.\n" + "4x: Dies in 1 hit to any substantial attack from the start of the game.\n" + "8x: Can only survive trivial damage from the start of the game.\n" + "16x: Can survive all common attacks with max health without double defense.\n" + "32x: Can survive all common attacks with max health and double defense.\n" + "64x: Can survive trivial damage with max health without double defense.\n" + "128x: Can survive trivial damage with max health and double defense.\n" + "256x: Cannot survive damage." ) ); AddWidget(path, "Fall Damage Multiplier", WIDGET_CVAR_COMBOBOX) @@ -1051,14 +1051,14 @@ void SohMenu::AddMenuEnhancements() { .Options(ComboboxOptions() .ComboMap(subPowers) .Tooltip( - "Modifies all fall damage\n" - "2x: Can survive all fall damage from the start of the game\n" - "4x: Can only survive short fall damage from the start of the game\n" - "8x: Cannot survive any fall damage from the start of the game\n" - "16x: Can survive all fall damage with max health without double defense\n" - "32x: Can survive all fall damage with max health and double defense\n" - "64x: Can survive short fall damage with double defense\n" - "128x: Cannot survive fall damage" + "Modifies all fall damage:\n" + "2x: Can survive all fall damage from the start of the game.\n" + "4x: Can only survive short fall damage from the start of the game.\n" + "8x: Cannot survive any fall damage from the start of the game.\n" + "16x: Can survive all fall damage with max health without double defense.\n" + "32x: Can survive all fall damage with max health and double defense.\n" + "64x: Can survive short fall damage with double defense.\n" + "128x: Cannot survive fall damage." ) ); AddWidget(path, "Void Damage Multiplier", WIDGET_CVAR_COMBOBOX) @@ -1067,13 +1067,13 @@ void SohMenu::AddMenuEnhancements() { .ComboMap(subSubPowers) .DefaultIndex(0) .Tooltip( - "Modifies damage taken after falling into a void\n" - "2x: Can survive void damage from the start of the game\n" - "4x: Cannot survive void damage from the start of the game\n" - "8x: Can survive void damage twice with max health without double defense\n" - "16x: Can survive void damage with max health without double defense\n" - "32x: Can survive void damage with max health and double defense\n" - "64x: Cannot survive void damage" + "Modifies damage taken after falling into a void:\n" + "2x: Can survive void damage from the start of the game.\n" + "4x: Cannot survive void damage from the start of the game.\n" + "8x: Can survive void damage twice with max health without double defense.\n" + "16x: Can survive void damage with max health without double defense.\n" + "32x: Can survive void damage with max health and double defense.\n" + "64x: Cannot survive void damage." ) ); AddWidget(path, "Bonk Damage Multiplier", WIDGET_CVAR_COMBOBOX) @@ -1126,7 +1126,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Dying will delete your file.\n\n" ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE - "\nTHIS IS NOT REVERSABLE\nUSE AT YOUR OWN RISK!" + "\nTHIS IS NOT REVERSABLE!\nUSE AT YOUR OWN RISK!" )); AddWidget(path, "Always Win Goron Pot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("GoronPot")) @@ -1188,11 +1188,11 @@ void SohMenu::AddMenuEnhancements() { }; AddWidget(path, "Customize Behavior##Shooting", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("CustomizeShootingGallery")) - .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior")); + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the shooting gallery behavior.")); AddWidget(path, "Instant Win", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("InstantShootingGalleryWin")) .PreFunc(shootingGalleryDisabledFunc) - .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame")); + .Options(CheckboxOptions().Tooltip("Skips the Shooting Gallery minigame.")); AddWidget(path, "No Rupee Randomization", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("ConstantAdultGallery")) .PreFunc(shootingGalleryDisabledFunc) @@ -1223,7 +1223,7 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Bombchu Bowling behavior.")); auto bombchuBowlingDisabledFunc = [](WidgetInfo& info) { info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeBombchuBowling"), 0) == 0; - info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off"; + info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; }; AddWidget(path, "Remove Small Cucco", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BombchuBowlingNoSmallCucco")) @@ -1264,7 +1264,7 @@ void SohMenu::AddMenuEnhancements() { info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0); info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off or " - "\"Unlimited Playback Time\" is on"; + "\"Unlimited Playback Time\" is on."; }) .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( "Adjusts the time allowed for playback before failing.")); @@ -1333,7 +1333,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Fishing", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Customize Behavior##Fishing", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("CustomizeFishing")) - .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Fishing behavior")); + .Options(CheckboxOptions().Tooltip("Turn on/off changes to the Fishing behavior.")); auto fishingDisabledFunc = [](WidgetInfo& info) { info.options->disabled = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) == 0; info.options->disabledTooltip = "This option is disabled because \"Customize Behavior\" is turned off."; @@ -1369,12 +1369,12 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("MinimumFishWeightChild")) .PreFunc(fishingDisabledFunc) .Options(IntSliderOptions().Min(3).Max(10).DefaultValue(10).Format("%d lbs.").Tooltip( - "The minimum weight for the unique Fishing Reward as a Child.")); + "The minimum weight for the unique Fishing Reward as a child.")); AddWidget(path, "Adult Minimum Weight: %d lbs.", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("MinimumFishWeightAdult")) .PreFunc(fishingDisabledFunc) .Options(IntSliderOptions().Min(6).Max(13).DefaultValue(13).Format("%d lbs.").Tooltip( - "The minimum weight for the unique fishing reward as an Adult.")); + "The minimum weight for the unique fishing reward as an adult.")); // Extra Modes path.sidebarName = "Extra Modes"; @@ -1392,15 +1392,15 @@ void SohMenu::AddMenuEnhancements() { .DefaultIndex(MIRRORED_WORLD_OFF) .ComboMap(mirroredWorldModes) .Tooltip( - "Mirrors the world horizontally\n\n" - " - Always: Always mirror the world\n" - " - Random: Randomly decide to mirror the world on each scene change\n" - " - Random (Seeded): Scenes are mirrored based on the current randomizer seed/file\n" - " - Dungeons: Mirror the world in Dungeons\n" - " - Dungeons (Vanilla): Mirror the world in vanilla Dungeons\n" - " - Dungeons (MQ): Mirror the world in MQ Dungeons\n" - " - Dungeons Random: Randomly decide to mirror the world in Dungeons\n" - " - Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file\n" + "Mirrors the world horizontally:\n\n" + " - Always: Always mirror the world.\n" + " - Random: Randomly decide to mirror the world on each scene change.\n" + " - Random (Seeded): Scenes are mirrored based on the current randomizer seed/file.\n" + " - Dungeons: Mirror the world in Dungeons.\n" + " - Dungeons (Vanilla): Mirror the world in Vanilla Dungeons.\n" + " - Dungeons (MQ): Mirror the world in MQ Dungeons.\n" + " - Dungeons Random: Randomly decide to mirror the world in Dungeons.\n" + " - Dungeons Random (Seeded): Dungeons are mirrored based on the current randomizer seed/file.\n" ) ); AddWidget(path, "Ivan the Fairy (Coop Mode)", WIDGET_CVAR_CHECKBOX) @@ -1528,10 +1528,10 @@ void SohMenu::AddMenuEnhancements() { .DefaultIndex(ENEMY_RANDOMIZER_OFF) .ComboMap(enemyRandomizerModes) .Tooltip( - "Replaces fixed enemies throughout the game with a random enemy. Bosses, mini-bosses and a few specific regular enemies are excluded.\n" - "Enemies that need more than Deku Nuts + either Deku Sticks or a sword to kill are excluded from spawning in \"clear enemy\" rooms.\n\n" - "- Random: Enemies are randomized every time you load a room\n" - "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file\n" + "Replaces fixed enemies throughout the game with a random enemy. Bosses, Mini-Bosses and a few specific regular enemies are excluded.\n" + "Enemies that need more than Deku Nuts & either Deku Sticks or a sword to kill are excluded from spawning in \"clear enemy\" rooms.\n\n" + "- Random: Enemies are randomized every time you load a room.\n" + "- Random (Seeded): Enemies are randomized based on the current randomizer seed/file.\n" ) ); AddWidget(path, "Randomized Enemy Sizes", WIDGET_CVAR_CHECKBOX) @@ -1542,7 +1542,7 @@ void SohMenu::AddMenuEnhancements() { .PreFunc( [](WidgetInfo& info) { info.options->disabled = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0); }) .Options(CheckboxOptions().Tooltip( - "Scales normal enemies Health with their randomized size. *This will NOT affect bosses*")); + "Scales normal enemies Health with their randomized size. *This will NOT affect Bosses!*")); AddWidget(path, "Enemy List", WIDGET_SEPARATOR_TEXT) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0); @@ -1586,7 +1586,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Timeless Equipment", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("TimelessEquipment")) .Options(CheckboxOptions().Tooltip("Allows any item to be equipped, regardless of age.\n" - "Also allows Child to use Adult strength upgrades.")); + "Also allows child to use adult strength upgrades.")); AddWidget(path, "Unrestricted Items", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("NoRestrictItems")) .Options(CheckboxOptions().Tooltip("Allows you to use any item at any location")); @@ -1608,7 +1608,7 @@ void SohMenu::AddMenuEnhancements() { .Options(FloatSliderOptions().Format("%.2f").Min(0.1f).Max(5.0f).DefaultValue(1.0f)); AddWidget(path, "Hookshot Everything", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("HookshotEverything")) - .Options(CheckboxOptions().Tooltip("Makes every surface in the game hookshot-able.")); + .Options(CheckboxOptions().Tooltip("Makes every surface in the game hookshotable.")); AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_CHEAT("HookshotReachMultiplier")) .Options(FloatSliderOptions().Format("%.2f").Min(1.0f).Max(5.0f)); @@ -1667,7 +1667,7 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Time of Day", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Freeze Time", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("FreezeTime")) - .Options(CheckboxOptions().Tooltip("Freezes the time of day")); + .Options(CheckboxOptions().Tooltip("Freezes the time of day.")); AddWidget(path, "Time Sync", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_CHEAT("TimeSync")) .Options(CheckboxOptions().Tooltip("Syncs the in-game time with the real world time.")); @@ -1713,7 +1713,7 @@ void SohMenu::AddMenuEnhancements() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); }) .Options(CheckboxOptions().Tooltip( - "Turns on OoT Beta Quest. *WARNING* This will reset your game." + "Turns on OoT Beta Quest. *WARNING*: This will reset your game!" )); AddWidget(path, "Beta Quest World: %d", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_CHEAT("BetaQuestWorld")) @@ -1729,7 +1729,7 @@ void SohMenu::AddMenuEnhancements() { .Min(0) .Max(8) .Tooltip( - "Set the Beta Quest world to explore. *WARNING* Changing this will reset your game.\n" + "Set the Beta Quest world to explore. *WARNING*: Changing this will reset your game!\n" "Ctrl+Click to type in a value." )); diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index 0d3b52b23..5c724ec1e 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -45,8 +45,8 @@ void SohMenu::AddMenuRandomizer() { OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_VANILLA) && OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).IsNot(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) ); - info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without the map & compass\n" - "shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\""; + info.options->disabledTooltip = "This setting is disabled because a savefile is loaded without the map & compass.\n" + "Shuffle settings set to \"Any Dungeon\", \"Overworld\" or \"Anywhere\"."; }) .Options(CheckboxOptions().Tooltip( "Matches the color of maps & compasses to the dungeon they belong to. " @@ -88,7 +88,7 @@ void SohMenu::AddMenuRandomizer() { .Format("%.2f") .DefaultValue(10.0f) .Tooltip( - "The size of the item when it is picked up" + "The size of the item when it is picked up." )); // Plandomizer From 8832bcaf126dac93888c54c9778ad76a3a01bf18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Tue, 25 Mar 2025 19:00:32 +0000 Subject: [PATCH 146/267] Try make item pool size match location pool size (#5181) Also avoid putting random junk into the pool to begin with When smaller, add junk from pending junk items When larger, remove junk from the item pool This avoids issue where shuffles which add items to pool (souls, overworld keys, triforce pieces) would hit assert about item pool size exceeding location pool size --- .../randomizer/3drando/item_pool.cpp | 51 ++++++++----------- .../randomizer/3drando/item_pool.hpp | 1 - 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 43193a926..af52a6446 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -453,7 +453,7 @@ static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { for (size_t i = 0; i < ItemPool.size(); i++) { if (ItemPool[i] == itemToReplace) { if (itemCount >= max) { - ItemPool[i] = GetJunkItem(); + ItemPool[i] = RG_NONE; } itemCount++; } @@ -703,19 +703,8 @@ void GenerateItemPool() { if (ctx->GetOption(RSK_SHUFFLE_BEEHIVES)) { //32 total beehive locations - AddItemToMainPool(RG_RED_RUPEE, 23); - AddItemToMainPool(RG_BLUE_RUPEE, 9); - } - - if (ctx->GetOption(RSK_SHUFFLE_COWS)) { - //9 total cow locations - for (uint8_t i = 0; i < 9; i++) { - AddItemToMainPool(GetJunkItem()); - } - //extra location for Jabu MQ - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { - AddItemToMainPool(GetJunkItem()); - } + AddItemToPool(PendingJunkPool, RG_RED_RUPEE, 23); + AddItemToPool(PendingJunkPool, RG_BLUE_RUPEE, 9); } // Shuffle Pots @@ -1335,6 +1324,7 @@ void GenerateItemPool() { } //Replace all junk items with ice traps for onslaught mode else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { + PendingJunkPool.clear(); for (uint8_t i = 0; i < JunkPoolItems.size() - 3; i++) { // -3 Omits Huge Rupees and Deku Nuts 10 ReplaceMaxItem(JunkPoolItems[i], 0); } @@ -1348,31 +1338,30 @@ void GenerateItemPool() { ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); } - //this feels ugly and there's probably a better way, but - //it replaces random junk with pending junk. - bool junkSet; - for (RandomizerGet pendingJunk : PendingJunkPool) { - junkSet = false; - for (RandomizerGet& item : ItemPool) { - for (RandomizerGet junk : JunkPoolItems) { - if (item == junk && item != RG_HUGE_RUPEE && item != RG_DEKU_NUTS_10) { - item = pendingJunk; - junkSet = true; + std::erase(ItemPool, RG_NONE); + + if (ItemPool.size() < ctx->allLocations.size()) { + Shuffle(PendingJunkPool); + size_t junkNeeded = std::min(PendingJunkPool.size(), ctx->allLocations.size() - ItemPool.size()); + ItemPool.insert(ItemPool.end(), PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + PendingJunkPool.erase(PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + } else if (ItemPool.size() > ctx->allLocations.size()) { + // RANDOTODO: all junk should be put in PendingJunkPool so this is never needed + size_t remove = ItemPool.size() - ctx->allLocations.size(); + for (size_t i = 0; remove > 0 && i < ItemPool.size(); i++) { + for (size_t j = 0; j < JunkPoolItems.size(); j++) { + if (ItemPool[i] == JunkPoolItems[j]) { + ItemPool[i] = RG_NONE; + remove--; break; } } - if (junkSet) break; } + std::erase(ItemPool, RG_NONE); } - PendingJunkPool.clear(); // RANDOTODO: Ideally this should be checking for equality, but that is not currently the case and has never been // the case, and isn't even currently the case in the 3drando repo we inherited this from years ago, so it may // be a large undertaking to fix. assert(ItemPool.size() <= ctx->allLocations.size() || !"Item Pool larger than Location Pool"); } - -void AddJunk() { - SPDLOG_DEBUG("HAD TO PLACE EXTRA JUNK "); - AddItemToMainPool(GetPendingJunkItem()); -} diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp index 4ef583001..095b417b4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.hpp @@ -11,6 +11,5 @@ void AddItemToPool(std::vector& pool, const RandomizerGet item, s RandomizerGet GetJunkItem(); void PlaceJunkInExcludedLocation(const RandomizerCheck il); void GenerateItemPool(); -void AddJunk(); extern std::vector ItemPool; From c1ff45a240a2d1264140f66d4e7103102e129add Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 26 Mar 2025 11:07:26 +0100 Subject: [PATCH 147/267] More minor menu/cvar fixes (#5213) * Minor fixes * Hide unshuffled shop checks default fix --- soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp | 2 +- .../Enhancements/randomizer/randomizer_check_tracker.cpp | 2 +- soh/soh/SohGui/SohMenuSettings.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp index 2d750ab5d..7ecdc1f4b 100644 --- a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp +++ b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp @@ -117,7 +117,7 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD CLOSE_DISPS(titleContext->state.gfxCtx); } -#define CVAR_BOOTSEQUENCE_NAME CVAR_ENHANCEMENT("BootSequence") +#define CVAR_BOOTSEQUENCE_NAME CVAR_SETTING("BootSequence") #define CVAR_BOOTSEQUENCE_DEFAULT BOOTSEQUENCE_DEFAULT #define CVAR_BOOTSEQUENCE_VALUE CVarGetInteger(CVAR_BOOTSEQUENCE_NAME, CVAR_BOOTSEQUENCE_DEFAULT) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 62a4793e2..aa6b8b608 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -879,7 +879,7 @@ void CheckTrackerWindow::DrawElement() { mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); - hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 1); + hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index eaa739afc..8e3cc5e19 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -354,7 +354,7 @@ void SohMenu::AddMenuSettings() { .Tooltip("Which corner of the screen notifications appear in.") .ComboMap(notificationPosition) .DefaultIndex(3)); - AddWidget(path, "Duration: %.0f seconds", WIDGET_CVAR_SLIDER_FLOAT) + AddWidget(path, "Duration (seconds):", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_SETTING("Notifications.Duration")) .Options(FloatSliderOptions() .Tooltip("How long notifications are displayed for.") @@ -363,13 +363,13 @@ void SohMenu::AddMenuSettings() { .Min(3.0f) .Max(30.0f) .DefaultValue(10.0f)); - AddWidget(path, "Background Opacity: %.0f%%", WIDGET_CVAR_SLIDER_FLOAT) + AddWidget(path, "Background Opacity", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_SETTING("Notifications.BgOpacity")) .Options(FloatSliderOptions() .Tooltip("How opaque the background of notifications is.") .DefaultValue(0.5f) .IsPercentage()); - AddWidget(path, "Size %.1f", WIDGET_CVAR_SLIDER_FLOAT) + AddWidget(path, "Size:", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_SETTING("Notifications.Size")) .Options(FloatSliderOptions() .Tooltip("How large notifications are.") From dd81af17bb70294dda93b31942bde56c276ba404 Mon Sep 17 00:00:00 2001 From: Varuuna Date: Wed, 26 Mar 2025 19:33:10 +0100 Subject: [PATCH 148/267] [Rando] Grassanity (#4889) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * * fixes softlock when talking to Mido without Kokiri Emerald after killing Gohma * * moved scene check to hook * moved vanilla conditioon into GameInteractor_Should * * corrected hook condition * removed 'this' * * reverted GameInteractor and hook_handlers * changed actor to use existing hook * * updated kokiri emerald conditions * * missed parentheses * * Overworld pretty much done. * Known issue with Market Night + 2 bushes in KF * Known issue with Adult bush in ZR * * fixed locations post-merge * * renamed option and types to 'GRASSANITY' * changed grassnity to be a combobox option * added first 5 deku tree locations * * color is a sickly green when containing a check * added ZR 14 (adult only bush on the platform, not the same?) * * forgot to rename the files to grassanity * updated draw method to fix regrowing grass * Removed old WIP locacc files * * removed comments in bush actor * added rest of Deku Tree plus MQ * Added DC + MQ * Fixed DC incorrect pos value on 1 loc * JJB done minus after big octo * Added BotW + MQ locs * WIP grottos * Grottos done * Workaround to allow market grass during night * Seperated the 2 KF bushes into 4 checks * Hints and additional formatting * Slightly less ghastly color * Corrected the 2 JJB locs * * Renaming and removal of some locs. * Restructure in z_en_kusa.c to leave vanilla code alone. * Formatting. * * see previous (forgot to stage woops) * * Clear grassIdentity on item drop * Added check for RC on RandoDraw function Results in no extra dupe drops, and instantly correct the color of the grass when cut instead of on collecting the item. * * fixed dupe location spoiler names which caused occasional crash when writing spoiler log * * reverse should * * fixed faulty locations * * corrected KAK location names and some formatting * * Fixed market bushes by tree not working at night * * merged ZR near PoH grass into a single loc * * Changed to ShipInit (might be missing something?) * Corrected Should in z_en_kusa.c to use original draw func when setting is Off * * Renaming to Shuffle Grass * * minor fix * * keyboard fail lol * * suggestions * * removed unused function * * move grass locations into ShuffleGrass * move grass GameInteractor into GIVanillaBehavior * minor fixes * * pre-removed locs from dungeon.cpp * * pre-remove from context.cpp * * re-added Grass to context * * added Dana's amazing custom bush models * using CSMC to display flowers based on "contents" * * added Dana's grass models * refactor to lessen the clutter in the switch * * removed fairy case * Added back missing Deku Tree locations * formatting * Update soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp Co-authored-by: Philip Dubé * re-added suggestion from previous * removed wrong line >.> --------- Co-authored-by: Philip Dubé --- .../gameplay_field_keep/BushTex.rgba16 | Bin 0 -> 2140 bytes .../gameplay_field_keep/LeafTex.rgba16 | Bin 0 -> 604 bytes .../flower_bosskey_tex.rgba16 | Bin 0 -> 604 bytes .../flower_bronze_tex.rgba16 | Bin 0 -> 604 bytes .../flower_fairy_tex.rgba16 | Bin 0 -> 604 bytes .../flower_gold_tex.rgba16 | Bin 0 -> 604 bytes .../flower_heart_tex.rgba16 | Bin 0 -> 604 bytes .../flower_mask_tex.rgba16 | Bin 0 -> 604 bytes .../flower_random_tex.rgba16 | Bin 0 -> 604 bytes .../flower_silver_tex.rgba16 | Bin 0 -> 604 bytes .../flower_token_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_field_keep/gFieldBushBossKeyDL | 14 + .../gFieldBushBossKeyDL_tri_0 | 8 + .../gFieldBushBossKeyDL_tri_1 | 134 +++++ .../gFieldBushBossKeyDL_tri_2 | 134 +++++ .../gFieldBushBossKeyDL_vtx_0 | 16 + .../gFieldBushBossKeyDL_vtx_1 | 268 +++++++++ .../gFieldBushBossKeyDL_vtx_2 | 268 +++++++++ .../gFieldBushBossKeyDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushFairyDL | 14 + .../gFieldBushFairyDL_tri_0 | 8 + .../gFieldBushFairyDL_tri_1 | 134 +++++ .../gFieldBushFairyDL_tri_2 | 134 +++++ .../gFieldBushFairyDL_vtx_0 | 16 + .../gFieldBushFairyDL_vtx_1 | 268 +++++++++ .../gFieldBushFairyDL_vtx_2 | 268 +++++++++ .../gFieldBushFairyDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushHeartDL | 14 + .../gFieldBushHeartDL_tri_0 | 8 + .../gFieldBushHeartDL_tri_1 | 134 +++++ .../gFieldBushHeartDL_tri_2 | 134 +++++ .../gFieldBushHeartDL_vtx_0 | 16 + .../gFieldBushHeartDL_vtx_1 | 268 +++++++++ .../gFieldBushHeartDL_vtx_2 | 268 +++++++++ .../gFieldBushHeartDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushJunkDL | 10 + .../gFieldBushJunkDL_tri_0 | 8 + .../gFieldBushJunkDL_vtx_0 | 16 + .../gFieldBushJunkDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushMajorDL | 14 + .../gFieldBushMajorDL_tri_0 | 8 + .../gFieldBushMajorDL_tri_1 | 134 +++++ .../gFieldBushMajorDL_tri_2 | 134 +++++ .../gFieldBushMajorDL_vtx_0 | 16 + .../gFieldBushMajorDL_vtx_1 | 268 +++++++++ .../gFieldBushMajorDL_vtx_2 | 268 +++++++++ .../gFieldBushMajorDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushMaskDL | 14 + .../gFieldBushMaskDL_tri_0 | 8 + .../gFieldBushMaskDL_tri_1 | 134 +++++ .../gFieldBushMaskDL_tri_2 | 134 +++++ .../gFieldBushMaskDL_vtx_0 | 16 + .../gFieldBushMaskDL_vtx_1 | 268 +++++++++ .../gFieldBushMaskDL_vtx_2 | 268 +++++++++ .../gFieldBushMaskDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushMinorDL | 14 + .../gFieldBushMinorDL_tri_0 | 8 + .../gFieldBushMinorDL_tri_1 | 134 +++++ .../gFieldBushMinorDL_tri_2 | 134 +++++ .../gFieldBushMinorDL_vtx_0 | 16 + .../gFieldBushMinorDL_vtx_1 | 268 +++++++++ .../gFieldBushMinorDL_vtx_2 | 268 +++++++++ .../gFieldBushMinorDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushRandomDL | 14 + .../gFieldBushRandomDL_tri_0 | 8 + .../gFieldBushRandomDL_tri_1 | 134 +++++ .../gFieldBushRandomDL_tri_2 | 134 +++++ .../gFieldBushRandomDL_vtx_0 | 16 + .../gFieldBushRandomDL_vtx_1 | 268 +++++++++ .../gFieldBushRandomDL_vtx_2 | 268 +++++++++ .../gFieldBushRandomDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushSmallKeyDL | 14 + .../gFieldBushSmallKeyDL_tri_0 | 8 + .../gFieldBushSmallKeyDL_tri_1 | 134 +++++ .../gFieldBushSmallKeyDL_tri_2 | 134 +++++ .../gFieldBushSmallKeyDL_vtx_0 | 16 + .../gFieldBushSmallKeyDL_vtx_1 | 268 +++++++++ .../gFieldBushSmallKeyDL_vtx_2 | 268 +++++++++ .../gFieldBushSmallKeyDL_vtx_cull | 10 + .../gameplay_field_keep/gFieldBushTokenDL | 14 + .../gFieldBushTokenDL_tri_0 | 8 + .../gFieldBushTokenDL_tri_1 | 134 +++++ .../gFieldBushTokenDL_tri_2 | 134 +++++ .../gFieldBushTokenDL_vtx_0 | 16 + .../gFieldBushTokenDL_vtx_1 | 268 +++++++++ .../gFieldBushTokenDL_vtx_2 | 268 +++++++++ .../gFieldBushTokenDL_vtx_cull | 10 + ...gFieldBushBossKeyDL_f3dlite_flower_bosskey | 16 + .../mat_gFieldBushBossKeyDL_f3dlite_leaf | 16 + .../mat_gFieldBushBossKeyDL_f3dlite_shrubbery | 16 + ...mat_gFieldBushFairyDL_f3dlite_flower_fairy | 16 + .../mat_gFieldBushFairyDL_f3dlite_leaf | 16 + .../mat_gFieldBushFairyDL_f3dlite_shrubbery | 16 + ...mat_gFieldBushHeartDL_f3dlite_flower_heart | 16 + .../mat_gFieldBushHeartDL_f3dlite_leaf | 16 + .../mat_gFieldBushHeartDL_f3dlite_shrubbery | 16 + .../mat_gFieldBushJunkDL_f3dlite_shrubbery | 16 + .../mat_gFieldBushMajorDL_f3dlite_flower_gold | 16 + .../mat_gFieldBushMajorDL_f3dlite_leaf | 16 + .../mat_gFieldBushMajorDL_f3dlite_shrubbery | 16 + .../mat_gFieldBushMaskDL_f3dlite_flower_mask | 16 + .../mat_gFieldBushMaskDL_f3dlite_leaf | 16 + .../mat_gFieldBushMaskDL_f3dlite_shrubbery | 16 + ...at_gFieldBushMinorDL_f3dlite_flower_bronze | 16 + .../mat_gFieldBushMinorDL_f3dlite_leaf | 16 + .../mat_gFieldBushMinorDL_f3dlite_shrubbery | 16 + ...t_gFieldBushRandomDL_f3dlite_flower_random | 16 + .../mat_gFieldBushRandomDL_f3dlite_leaf | 16 + .../mat_gFieldBushRandomDL_f3dlite_shrubbery | 16 + ...gFieldBushSmallKeyDL_f3dlite_flower_silver | 16 + .../mat_gFieldBushSmallKeyDL_f3dlite_leaf | 16 + ...mat_gFieldBushSmallKeyDL_f3dlite_shrubbery | 16 + ...mat_gFieldBushTokenDL_f3dlite_flower_token | 16 + .../mat_gFieldBushTokenDL_f3dlite_leaf | 16 + .../mat_gFieldBushTokenDL_f3dlite_shrubbery | 16 + .../objects/gameplay_field_keep/model.xml | 10 + .../objects/gameplay_keep/LeafTex.rgba16 | Bin 0 -> 604 bytes .../objects/gameplay_keep/StemTex.rgba16 | Bin 0 -> 220 bytes .../gameplay_keep/flower_bosskey_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_bronze_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_fairy_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_gold_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_heart_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_mask_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_random_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_silver_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/flower_token_tex.rgba16 | Bin 0 -> 604 bytes .../gameplay_keep/gGrassBunchTex.rgba16 | Bin 0 -> 2140 bytes .../gRandoCuttableGrassBossKeyDL | 16 + .../gRandoCuttableGrassBossKeyDL_tri_0 | 16 + .../gRandoCuttableGrassBossKeyDL_tri_1 | 48 ++ .../gRandoCuttableGrassBossKeyDL_tri_2 | 48 ++ .../gRandoCuttableGrassBossKeyDL_tri_3 | 16 + .../gRandoCuttableGrassBossKeyDL_vtx_0 | 62 +++ .../gRandoCuttableGrassBossKeyDL_vtx_1 | 90 +++ .../gRandoCuttableGrassBossKeyDL_vtx_2 | 90 +++ .../gRandoCuttableGrassBossKeyDL_vtx_3 | 42 ++ .../gRandoCuttableGrassBossKeyDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassFairyDL | 16 + .../gRandoCuttableGrassFairyDL_tri_0 | 16 + .../gRandoCuttableGrassFairyDL_tri_1 | 48 ++ .../gRandoCuttableGrassFairyDL_tri_2 | 48 ++ .../gRandoCuttableGrassFairyDL_tri_3 | 16 + .../gRandoCuttableGrassFairyDL_vtx_0 | 62 +++ .../gRandoCuttableGrassFairyDL_vtx_1 | 90 +++ .../gRandoCuttableGrassFairyDL_vtx_2 | 90 +++ .../gRandoCuttableGrassFairyDL_vtx_3 | 42 ++ .../gRandoCuttableGrassFairyDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassHeartDL | 16 + .../gRandoCuttableGrassHeartDL_tri_0 | 16 + .../gRandoCuttableGrassHeartDL_tri_1 | 48 ++ .../gRandoCuttableGrassHeartDL_tri_2 | 48 ++ .../gRandoCuttableGrassHeartDL_tri_3 | 16 + .../gRandoCuttableGrassHeartDL_vtx_0 | 62 +++ .../gRandoCuttableGrassHeartDL_vtx_1 | 90 +++ .../gRandoCuttableGrassHeartDL_vtx_2 | 90 +++ .../gRandoCuttableGrassHeartDL_vtx_3 | 42 ++ .../gRandoCuttableGrassHeartDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassJunkDL | 10 + .../gRandoCuttableGrassJunkDL_tri_0 | 16 + .../gRandoCuttableGrassJunkDL_vtx_0 | 62 +++ .../gRandoCuttableGrassJunkDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassMajorDL | 16 + .../gRandoCuttableGrassMajorDL_tri_0 | 16 + .../gRandoCuttableGrassMajorDL_tri_1 | 48 ++ .../gRandoCuttableGrassMajorDL_tri_2 | 48 ++ .../gRandoCuttableGrassMajorDL_tri_3 | 16 + .../gRandoCuttableGrassMajorDL_vtx_0 | 62 +++ .../gRandoCuttableGrassMajorDL_vtx_1 | 90 +++ .../gRandoCuttableGrassMajorDL_vtx_2 | 90 +++ .../gRandoCuttableGrassMajorDL_vtx_3 | 42 ++ .../gRandoCuttableGrassMajorDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassMaskDL | 16 + .../gRandoCuttableGrassMaskDL_tri_0 | 16 + .../gRandoCuttableGrassMaskDL_tri_1 | 48 ++ .../gRandoCuttableGrassMaskDL_tri_2 | 48 ++ .../gRandoCuttableGrassMaskDL_tri_3 | 16 + .../gRandoCuttableGrassMaskDL_vtx_0 | 62 +++ .../gRandoCuttableGrassMaskDL_vtx_1 | 90 +++ .../gRandoCuttableGrassMaskDL_vtx_2 | 90 +++ .../gRandoCuttableGrassMaskDL_vtx_3 | 42 ++ .../gRandoCuttableGrassMaskDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassMinorDL | 16 + .../gRandoCuttableGrassMinorDL_tri_0 | 16 + .../gRandoCuttableGrassMinorDL_tri_1 | 48 ++ .../gRandoCuttableGrassMinorDL_tri_2 | 48 ++ .../gRandoCuttableGrassMinorDL_tri_3 | 16 + .../gRandoCuttableGrassMinorDL_vtx_0 | 62 +++ .../gRandoCuttableGrassMinorDL_vtx_1 | 90 +++ .../gRandoCuttableGrassMinorDL_vtx_2 | 90 +++ .../gRandoCuttableGrassMinorDL_vtx_3 | 42 ++ .../gRandoCuttableGrassMinorDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassRandomDL | 16 + .../gRandoCuttableGrassRandomDL_tri_0 | 16 + .../gRandoCuttableGrassRandomDL_tri_1 | 48 ++ .../gRandoCuttableGrassRandomDL_tri_2 | 48 ++ .../gRandoCuttableGrassRandomDL_tri_3 | 16 + .../gRandoCuttableGrassRandomDL_vtx_0 | 62 +++ .../gRandoCuttableGrassRandomDL_vtx_1 | 90 +++ .../gRandoCuttableGrassRandomDL_vtx_2 | 90 +++ .../gRandoCuttableGrassRandomDL_vtx_3 | 42 ++ .../gRandoCuttableGrassRandomDL_vtx_cull | 10 + .../gRandoCuttableGrassSmallKeyDL | 16 + .../gRandoCuttableGrassSmallKeyDL_tri_0 | 16 + .../gRandoCuttableGrassSmallKeyDL_tri_1 | 48 ++ .../gRandoCuttableGrassSmallKeyDL_tri_2 | 48 ++ .../gRandoCuttableGrassSmallKeyDL_tri_3 | 16 + .../gRandoCuttableGrassSmallKeyDL_vtx_0 | 62 +++ .../gRandoCuttableGrassSmallKeyDL_vtx_1 | 90 +++ .../gRandoCuttableGrassSmallKeyDL_vtx_2 | 90 +++ .../gRandoCuttableGrassSmallKeyDL_vtx_3 | 42 ++ .../gRandoCuttableGrassSmallKeyDL_vtx_cull | 10 + .../gameplay_keep/gRandoCuttableGrassTokenDL | 16 + .../gRandoCuttableGrassTokenDL_tri_0 | 16 + .../gRandoCuttableGrassTokenDL_tri_1 | 48 ++ .../gRandoCuttableGrassTokenDL_tri_2 | 48 ++ .../gRandoCuttableGrassTokenDL_tri_3 | 16 + .../gRandoCuttableGrassTokenDL_vtx_0 | 62 +++ .../gRandoCuttableGrassTokenDL_vtx_1 | 90 +++ .../gRandoCuttableGrassTokenDL_vtx_2 | 90 +++ .../gRandoCuttableGrassTokenDL_vtx_3 | 42 ++ .../gRandoCuttableGrassTokenDL_vtx_cull | 10 + ...gRandoCuttableGrassBossKeyDL_f3dlite_Grass | 16 + ...tableGrassBossKeyDL_f3dlite_flower_bosskey | 16 + ..._gRandoCuttableGrassBossKeyDL_f3dlite_leaf | 16 + ...ndoCuttableGrassBossKeyDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassFairyDL_f3dlite_Grass | 16 + ...oCuttableGrassFairyDL_f3dlite_flower_fairy | 16 + ...at_gRandoCuttableGrassFairyDL_f3dlite_leaf | 16 + ...RandoCuttableGrassFairyDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassHeartDL_f3dlite_Grass | 16 + ...oCuttableGrassHeartDL_f3dlite_flower_heart | 16 + ...at_gRandoCuttableGrassHeartDL_f3dlite_leaf | 16 + ...RandoCuttableGrassHeartDL_f3dlite_material | 16 + ...at_gRandoCuttableGrassJunkDL_f3dlite_Grass | 16 + ...t_gRandoCuttableGrassMajorDL_f3dlite_Grass | 16 + ...doCuttableGrassMajorDL_f3dlite_flower_gold | 16 + ...at_gRandoCuttableGrassMajorDL_f3dlite_leaf | 16 + ...RandoCuttableGrassMajorDL_f3dlite_material | 16 + ...at_gRandoCuttableGrassMaskDL_f3dlite_Grass | 16 + ...ndoCuttableGrassMaskDL_f3dlite_flower_mask | 16 + ...mat_gRandoCuttableGrassMaskDL_f3dlite_leaf | 16 + ...gRandoCuttableGrassMaskDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassMinorDL_f3dlite_Grass | 16 + ...CuttableGrassMinorDL_f3dlite_flower_bronze | 16 + ...at_gRandoCuttableGrassMinorDL_f3dlite_leaf | 16 + ...RandoCuttableGrassMinorDL_f3dlite_material | 16 + ..._gRandoCuttableGrassRandomDL_f3dlite_Grass | 16 + ...uttableGrassRandomDL_f3dlite_flower_random | 16 + ...t_gRandoCuttableGrassRandomDL_f3dlite_leaf | 16 + ...andoCuttableGrassRandomDL_f3dlite_material | 16 + ...RandoCuttableGrassSmallKeyDL_f3dlite_Grass | 16 + ...tableGrassSmallKeyDL_f3dlite_flower_silver | 16 + ...gRandoCuttableGrassSmallKeyDL_f3dlite_leaf | 16 + ...doCuttableGrassSmallKeyDL_f3dlite_material | 16 + ...t_gRandoCuttableGrassTokenDL_f3dlite_Grass | 16 + ...oCuttableGrassTokenDL_f3dlite_flower_token | 16 + ...at_gRandoCuttableGrassTokenDL_f3dlite_leaf | 16 + ...RandoCuttableGrassTokenDL_f3dlite_material | 16 + .../custom/objects/gameplay_keep/model.xml | 10 + soh/assets/soh_assets.h | 60 ++ .../vanilla-behavior/GIVanillaBehavior.h | 16 + .../hint_list/hint_list_exclude_dungeon.cpp | 16 + .../hint_list/hint_list_exclude_overworld.cpp | 20 + .../Enhancements/randomizer/ShuffleGrass.cpp | 514 ++++++++++++++++++ .../Enhancements/randomizer/ShuffleGrass.h | 15 + soh/soh/Enhancements/randomizer/context.cpp | 7 +- soh/soh/Enhancements/randomizer/location.cpp | 7 + soh/soh/Enhancements/randomizer/location.h | 5 + .../dungeons/bottom_of_the_well.cpp | 44 +- .../location_access/dungeons/deku_tree.cpp | 141 ++++- .../dungeons/dodongos_cavern.cpp | 18 +- .../dungeons/jabujabus_belly.cpp | 30 +- .../overworld/castle_grounds.cpp | 2 + .../overworld/death_mountain_crater.cpp | 4 + .../overworld/death_mountain_trail.cpp | 6 + .../location_access/overworld/graveyard.cpp | 12 + .../overworld/hyrule_field.cpp | 62 +++ .../location_access/overworld/kakariko.cpp | 12 + .../overworld/kokiri_forest.cpp | 39 ++ .../location_access/overworld/lake_hylia.cpp | 42 ++ .../location_access/overworld/lost_woods.cpp | 13 + .../location_access/overworld/market.cpp | 12 +- .../location_access/overworld/zoras_river.cpp | 19 +- .../randomizer/option_descriptions.cpp | 11 + .../Enhancements/randomizer/randomizer.cpp | 412 ++++++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 1 + .../Enhancements/randomizer/randomizerTypes.h | 384 ++++++++++++- .../randomizer/randomizer_check_objects.cpp | 1 + .../randomizer/randomizer_check_tracker.cpp | 26 + .../Enhancements/randomizer/randomizer_inf.h | 351 ++++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 2 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../overlays/actors/ovl_En_Kusa/z_en_kusa.c | 28 +- .../overlays/actors/ovl_En_Kusa/z_en_kusa.h | 1 + 295 files changed, 15086 insertions(+), 60 deletions(-) create mode 100644 soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/LeafTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_gold_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_heart_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_silver_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery create mode 100644 soh/assets/custom/objects/gameplay_field_keep/model.xml create mode 100644 soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_gold_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_heart_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_silver_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 create mode 100644 soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf create mode 100644 soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material create mode 100644 soh/assets/custom/objects/gameplay_keep/model.xml create mode 100644 soh/soh/Enhancements/randomizer/ShuffleGrass.cpp create mode 100644 soh/soh/Enhancements/randomizer/ShuffleGrass.h diff --git a/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/BushTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..99a0fd4bdea6e8baa2aea9c8a5f25c8ae3f199b6 GIT binary patch literal 2140 zcma)6L2u$l6oy5VQj4v;5sK_prS;HDyf?UoLt(vyCR576Ra0boDW-dfZ|kEE>%a;{ zg`_k=Y=zwPLUQtvz13PoaD<{zC23ggR=X+c59nX$8xtBrnkZx0Gh@H+eQ&<^{9G=V z>zl+^X*bOOSmt|j!}8YS4p=@ozek{FpSfIce>mFR_PO|ty*u4qg z|K9x7deHjcv#lJrhW#7Sgs=E@^IJP-=WTSEhmIBNt+Rf9I;N}pxxJ?+ts%K=dGxjX zLb}VXs$%QRMpx~xzF}6iV6$Olnug`r|Ms`|G1t|q7H5AtvZiBn>?-c!4YyjX*JjnK zR$Dm+#do!3rlW1Pwg)?OEWEICRIboo%k`*_b<=U8;OH9LPtGHC;S3$=Aa`hFOhejW-MFXB2uWVJNqhELSh%-8$kON9!zJ!GE zbD82g*P|_Dp4FDK6fTK9(5)0rGCFu@3rTT}_kwy9_Fs>-<(FKuK@^uMnNl!VuZ6qd zK}VhNbEbe7)pR&{9e%K5g<5CYiANCfAuf?c^H% zTBrrBS_xKy(joGIO8;FftfF2eRjggl4mA}rB(u?Mh?r>;X1Wa?fSr!RS{K)}syah5 zj_&Y}1%LSQq%T{BdWQH-<53SV1Q{pD@fvxuRBd+Y0P?vn9Y75l7H4jc{!VfVQlWOP zHGI?~T!16B<@jKAvgaXlhJ?I=kK{((FeHKi%y$G$v?F*i1$?i@ag98nj&pjS94Nn@ z-;XAQl1x>Cq!U3e+l43e81p^!t9-EzjIUfSZ5=O!_ds{TALl!Kht_dYtx6TX6G>$K zn$w-O{?wMCqYbSP!T0l4i1!j^`6E&}5f3ViJfK3<%d~Mx6_F?6$@-0q@yXI5R{-B| z#<{)n3&2A(xg&yBzEDzGzfg)M9tsZy1pI6~;$_`J5@XgKP1G1E?ZgGPqd~f?X_(vL z1?ath7#Y$ta1ZYbr3iQ+nIsBCeaM6KsBeDpGMf0%)=fhT(y`o+R)|!Px}l_?c1sa2 z0yI<~IK>H$xVm$>uh8oY%ZZpa21 mPVJ0v1l6YXd+wXiF4xmz^B1DRc%0WSiDb-6R4huBzoGB%{eRQ$}-sqp_S4w^Zo|J}C literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bosskey_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..54bdc9fa7800263894ed3be2cb7107e492095b19 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukiw{ah*_jE2rrTa^d zKW{{bdmEn}?l~_N%cRV;H2Cs;M|AnA{7b!a0=Z2&39j(=Dyaw2~IR7FV~tCjTbi9`YA1$>??dwi%)I-K=MFACI+b;4GfV_Kec$mqBX${> q=zT|!8f@->sJPE~?%=V;b3nIahu0a8IqqZJhtn3IeB(C8tp@?cN-TN+ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_bronze_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..9d561d1ae10910dec3ec1e657a24175afbbca56c GIT binary patch literal 604 zcma)3v1-FW3_bM=`bR~W%z@G&zmd_IqAbCq$E2IbBV9b2CZNy`F?7jjNC$fiB)`z7 zIAEXKp(liN_oVkE&N=5Mqn9xuUUzTb=1Bj29#Hvs_qJ*NW&Dpel1Qh)ltj}=9t&~>9Ch*V;XRwKDuo{msWxuv) zcWQ1`1%oA+G2GbnDkwCFL!`UcTBD}c?xmj@Ln&tc*Di19sCy~+uOGFl7SB27AM%(7 A+W-In literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_fairy_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..b9d1f74e3622404781611de6157424b2db45417b GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixAE!8-Qo)uZc@GS z{$C|JJlgo~@Ri<$cULAJe7;%zojJPvmGgJK4_}-)cV*(mm!~qfXrjw6ygT#eBFTmG zS0*1^eoObz%BzK_DmJOEOkTNo=hB1AFTT9_`jPJL%x@@mY<_u4^W^fA%WuBE`TF78 zNBOsMk7y&C@Xmbm^Gn&cv~RwBr28oM(fUX0cRhbvjH=>{?xyFbvcaVrJ>8UkD;H>o?&?%be}1dHyZOl4*-v*ZKehU>Ho7lh_Iq@>)GlvqM&E6Z2#5$r2?*mdE> zNt7LpfPJ5NAcPQK-RHaH^?LX|*XHfNzZYh{-g_2p-h|+0-~$q#!RfWOITPnjMMFaN(hVC=uki*YR%SEXNARijz67 z>-M6^M2Y zc>z%Gg4UIs3poofmZI8GS^T(2xRZ0i@s*q_jxTWTyqKbjV#40K-KCqOA7_PD_ReTu zz&N8d=_aZhz^ZrWZccd}{J8L9r*Bm_x-X#S?FO3kHRo+gddlm%-Dq|ohwSdU$})_Q qL{q=Jt{SKYmnpl;DoelS0wJ0%m@T`@%yT#A7N!>BlTXc0)dv6&z9qN- literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_mask_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..bf90c64fcc704c63c7b5917386809179f77dc695 GIT binary patch literal 604 zcma)&u};G<6h%!XhA6U1{>B^5Q0Zl;aDXA%$e1zRvcXVgh?w{VMi?1ELWse#EKjU_ z0{jBkP^!j8sJ?nilzZO0@nej!YH@yYfamAa{kt!`?tNw;k2dwwba~7e3dU*vnA?}t zAdECk+Al-BUVS{@E{a5q(vsL53U!B(E{u zl2c9v8Oo5A5IL{-$|~_>auyO%P^zkl_5;2Gq^Y9T*ZIM+Z0nkAs-?g z-?ImUIi9jAy2WNI+*1u^RnZK?4 A82|tP literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_random_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..52f4848b379f4950de39533db5eadc849b2dd635 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixA|DN&wcLKD*5Y- z-|t0-dmEoK_fD36&i$6BIOOg9N_6?DmzVLEiVH7ge#`S+=j+s5bb0CL%8QjBbH8MM z%d(Z%+UE1I&8R9=@|oXrzhyCGDdzdkYb{!xs{b6tj#^!r?>t*sw(|Vs`N?aoTB};w zyAj!h`<1QQs^+4WK)u$o)w+9Ct9{-d`;Mxjccaf*U30K(t*EtYIi@R*ZEe*KS!=Ui z7HE!ab;@c~H-JogzWdzPweNeDySz6wjWtI11-+z9n`U znCSCrkecV!Fg`kc-}2hmb6d}CMHh$ici*=>R=lrppCNYn=ezHlpWD1of9rby_9haR9{>KvmO1&jE80&Pvu=UatWMj7Jj7w5i>Qiy zYtrYf&c#WnEJ!qQAFuP~etE=Op^69$9~Wn_5yv=0y(D;_ArvgpSx`ihB>6osRTcmR zUK(h8D-cI#R01VlnnahT&nP0OI8+j{ZyaYyZVIO()NoJY=h=VhnqvN3ytjqma8r;~g7X=gA*e46#fQug< literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_field_keep/flower_token_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..436b8707145ced97e8cb5a75a86dbf0df3153ebb GIT binary patch literal 604 zcma)3F>b^l5X5OP-IkPGXO~;LiXxN(U2#o{JSP(3Ir&05#4qxN`$A?+u$82VR~WOi zJ2Q)oG3NF8VQR7&e50Et_MSC=%`x?HDH%aTwQ2qMORxIlo^%XLd}DNYRsNN*1@32 zD=LUF#JtXf|r1~?wvtDB?11sv_O4qT#SbxZS=IDPsmk;+RWFS40V=pMbb z>m4`Ya6{Rb^GsjEh(SN&hm59j9mbjuU#Lz^+fJ~yUd O?JsTIV9(*N0RIAMF@|LT literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL new file mode 100644 index 000000000..c0a32b3b0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 new file mode 100644 index 000000000..bdb256c87 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 new file mode 100644 index 000000000..eab49e30d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 new file mode 100644 index 000000000..2fea2e4db --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushBossKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL new file mode 100644 index 000000000..70e8240a4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 new file mode 100644 index 000000000..926fed879 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 new file mode 100644 index 000000000..74ccefada --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 new file mode 100644 index 000000000..08fdc08b9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushFairyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL new file mode 100644 index 000000000..046e04d33 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 new file mode 100644 index 000000000..dcc1da33a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 new file mode 100644 index 000000000..8475ba007 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 new file mode 100644 index 000000000..c20f0dc4d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushHeartDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL new file mode 100644 index 000000000..a27f05f47 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 new file mode 100644 index 000000000..be06a23a7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushJunkDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL new file mode 100644 index 000000000..af43aa60c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 new file mode 100644 index 000000000..dd226cbc5 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 new file mode 100644 index 000000000..e00033c0f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 new file mode 100644 index 000000000..95c382ca0 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMajorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL new file mode 100644 index 000000000..b9e25ae70 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 new file mode 100644 index 000000000..874e7ffb8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 new file mode 100644 index 000000000..90b390218 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 new file mode 100644 index 000000000..b2c011f94 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMaskDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL new file mode 100644 index 000000000..35d99afcd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 new file mode 100644 index 000000000..6f519fbc8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 new file mode 100644 index 000000000..6d7a07c98 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 new file mode 100644 index 000000000..f85ac723f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushMinorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL new file mode 100644 index 000000000..c04d7156e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 new file mode 100644 index 000000000..cb19e7c48 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 new file mode 100644 index 000000000..8cf916c22 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 new file mode 100644 index 000000000..cb5550f61 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushRandomDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL new file mode 100644 index 000000000..29371b448 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 new file mode 100644 index 000000000..a25ca5b55 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 new file mode 100644 index 000000000..cb9c707a8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 new file mode 100644 index 000000000..96023e0eb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushSmallKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL new file mode 100644 index 000000000..c8a98c94e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 new file mode 100644 index 000000000..e60691715 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_0 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 new file mode 100644 index 000000000..d20545643 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_1 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 new file mode 100644 index 000000000..72993605d --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_tri_2 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 new file mode 100644 index 000000000..ff0b01fdf --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 new file mode 100644 index 000000000..af2f51461 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_1 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 new file mode 100644 index 000000000..5f2557028 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_2 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/gFieldBushTokenDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey new file mode 100644 index 000000000..0cad964b8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_flower_bosskey @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushBossKeyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy new file mode 100644 index 000000000..740ca2da3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_flower_fairy @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushFairyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart new file mode 100644 index 000000000..e074ff279 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_flower_heart @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushHeartDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushJunkDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold new file mode 100644 index 000000000..42f481571 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_flower_gold @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMajorDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask new file mode 100644 index 000000000..f19b26e56 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_flower_mask @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMaskDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze new file mode 100644 index 000000000..de5aecac6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_flower_bronze @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushMinorDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random new file mode 100644 index 000000000..36895a84b --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_flower_random @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushRandomDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver new file mode 100644 index 000000000..227294911 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_flower_silver @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushSmallKeyDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token new file mode 100644 index 000000000..6725b33e6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_flower_token @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf new file mode 100644 index 000000000..72bfec180 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery new file mode 100644 index 000000000..0fdd83a9e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/mat_gFieldBushTokenDL_f3dlite_shrubbery @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_field_keep/model.xml b/soh/assets/custom/objects/gameplay_field_keep/model.xml new file mode 100644 index 000000000..9c003b401 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_field_keep/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/LeafTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..1d4f2db39ece723c81ed44213a4a5d5b8dd5e291 GIT binary patch literal 604 zcma)(v1)}d6o$2##HEgAOgG(bHZzoP2$zzfgLmlQcpt&>4huBzoGB%{eRQ$}-sqp_S4w^Zo|J}C literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/StemTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..fa00a5606fd33519dace4b30dcbde5d16e72648c GIT binary patch literal 220 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTisFDMUA(|TO85kPu8-N@^N2x~R=9>O%%Z;0* K8U-Ec%?AMUia0U= literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bosskey_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..54bdc9fa7800263894ed3be2cb7107e492095b19 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukiw{ah*_jE2rrTa^d zKW{{bdmEn}?l~_N%cRV;H2Cs;M|AnA{7b!a0=Z2&39j(=Dyaw2~IR7FV~tCjTbi9`YA1$>??dwi%)I-K=MFACI+b;4GfV_Kec$mqBX${> q=zT|!8f@->sJPE~?%=V;b3nIahu0a8IqqZJhtn3IeB(C8tp@?cN-TN+ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_bronze_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..9d561d1ae10910dec3ec1e657a24175afbbca56c GIT binary patch literal 604 zcma)3v1-FW3_bM=`bR~W%z@G&zmd_IqAbCq$E2IbBV9b2CZNy`F?7jjNC$fiB)`z7 zIAEXKp(liN_oVkE&N=5Mqn9xuUUzTb=1Bj29#Hvs_qJ*NW&Dpel1Qh)ltj}=9t&~>9Ch*V;XRwKDuo{msWxuv) zcWQ1`1%oA+G2GbnDkwCFL!`UcTBD}c?xmj@Ln&tc*Di19sCy~+uOGFl7SB27AM%(7 A+W-In literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_fairy_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..b9d1f74e3622404781611de6157424b2db45417b GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixAE!8-Qo)uZc@GS z{$C|JJlgo~@Ri<$cULAJe7;%zojJPvmGgJK4_}-)cV*(mm!~qfXrjw6ygT#eBFTmG zS0*1^eoObz%BzK_DmJOEOkTNo=hB1AFTT9_`jPJL%x@@mY<_u4^W^fA%WuBE`TF78 zNBOsMk7y&C@Xmbm^Gn&cv~RwBr28oM(fUX0cRhbvjH=>{?xyFbvcaVrJ>8UkD;H>o?&?%be}1dHyZOl4*-v*ZKehU>Ho7lh_Iq@>)GlvqM&E6Z2#5$r2?*mdE> zNt7LpfPJ5NAcPQK-RHaH^?LX|*XHfNzZYh{-g_2p-h|+0-~$q#!RfWOITPnjMMFaN(hVC=uki*YR%SEXNARijz67 z>-M6^M2Y zc>z%Gg4UIs3poofmZI8GS^T(2xRZ0i@s*q_jxTWTyqKbjV#40K-KCqOA7_PD_ReTu zz&N8d=_aZhz^ZrWZccd}{J8L9r*Bm_x-X#S?FO3kHRo+gddlm%-Dq|ohwSdU$})_Q qL{q=Jt{SKYmnpl;DoelS0wJ0%m@T`@%yT#A7N!>BlTXc0)dv6&z9qN- literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_mask_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..bf90c64fcc704c63c7b5917386809179f77dc695 GIT binary patch literal 604 zcma)&u};G<6h%!XhA6U1{>B^5Q0Zl;aDXA%$e1zRvcXVgh?w{VMi?1ELWse#EKjU_ z0{jBkP^!j8sJ?nilzZO0@nej!YH@yYfamAa{kt!`?tNw;k2dwwba~7e3dU*vnA?}t zAdECk+Al-BUVS{@E{a5q(vsL53U!B(E{u zl2c9v8Oo5A5IL{-$|~_>auyO%P^zkl_5;2Gq^Y9T*ZIM+Z0nkAs-?g z-?ImUIi9jAy2WNI+*1u^RnZK?4 A82|tP literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_random_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..52f4848b379f4950de39533db5eadc849b2dd635 GIT binary patch literal 604 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTis8RrmA(|TO85n>VC=ukixA|DN&wcLKD*5Y- z-|t0-dmEoK_fD36&i$6BIOOg9N_6?DmzVLEiVH7ge#`S+=j+s5bb0CL%8QjBbH8MM z%d(Z%+UE1I&8R9=@|oXrzhyCGDdzdkYb{!xs{b6tj#^!r?>t*sw(|Vs`N?aoTB};w zyAj!h`<1QQs^+4WK)u$o)w+9Ct9{-d`;Mxjccaf*U30K(t*EtYIi@R*ZEe*KS!=Ui z7HE!ab;@c~H-JogzWdzPweNeDySz6wjWtI11-+z9n`U znCSCrkecV!Fg`kc-}2hmb6d}CMHh$ici*=>R=lrppCNYn=ezHlpWD1of9rby_9haR9{>KvmO1&jE80&Pvu=UatWMj7Jj7w5i>Qiy zYtrYf&c#WnEJ!qQAFuP~etE=Op^69$9~Wn_5yv=0y(D;_ArvgpSx`ihB>6osRTcmR zUK(h8D-cI#R01VlnnahT&nP0OI8+j{ZyaYyZVIO()NoJY=h=VhnqvN3ytjqma8r;~g7X=gA*e46#fQug< literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 b/soh/assets/custom/objects/gameplay_keep/flower_token_tex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..436b8707145ced97e8cb5a75a86dbf0df3153ebb GIT binary patch literal 604 zcma)3F>b^l5X5OP-IkPGXO~;LiXxN(U2#o{JSP(3Ir&05#4qxN`$A?+u$82VR~WOi zJ2Q)oG3NF8VQR7&e50Et_MSC=%`x?HDH%aTwQ2qMORxIlo^%XLd}DNYRsNN*1@32 zD=LUF#JtXf|r1~?wvtDB?11sv_O4qT#SbxZS=IDPsmk;+RWFS40V=pMbb z>m4`Ya6{Rb^GsjEh(SN&hm59j9mbjuU#Lz^+fJ~yUd O?JsTIV9(*N0RIAMF@|LT literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 b/soh/assets/custom/objects/gameplay_keep/gGrassBunchTex.rgba16 new file mode 100644 index 0000000000000000000000000000000000000000..c59757c1d46f5999ba2894e433fbfc07f31e9e7a GIT binary patch literal 2140 zcma)7O^e%B6jfV>Gz=wHP3x+uP)%1}cG=k!24*py8iN%R8!e1^%eS<4)uIax!SIYB zmI#AKWKp!#QcHQMG8p8TWX24}%}?lG=(&<*&7|WrzC7tkdgtDAKP^d;)H!+9{0#Sh zX2IXIu>IuU=Q#P}c4eSHew8GwFSDnQUzzy$_x)c9$pjlQVV1J}{E!ub$CgLA>a@W>}d$P?(;5>reg$XQ)xD7Y47HiH; zI2A8H#N^L}P4NpLWmC?uHt^1E_&R!@^n+=%_9~aFeSW|yd}M++TWz~-KgV4+%i>k| zI{qo?C;eCr*TKbq@u}r4Yw~%EZJT9?Y?VDFt|ko9OSD*Zu5-@C9U5RAyn!IwR(Y`G zV??4s(GYGhjWsY}SUp5xQgA@T5>B3v2FsLr*(x(2jfQcSizWNra2jpM2l66XJMVJa zz%Oi_Q`BJDEb}EJiG2dl#eL_B!Q9Pqcu;^8-$*Ky*yafhsUQ! zI7^c5A00jV`LEiG+Ij7y_QLq;a)k)2DGJe=V(52R)7HszJ*Ac0d?~v@$+UbL~qsPC$^_6HH z7}1pcr#d9LT-iFZqwpp94v()Oh#vV*ex#l}X3d}r-W!TQtWp(lDi~cbQ{$@NDe5nsbJPV3OQ(JXhqU$!yj7;!i8k=O zmoUE@y|>cpD|BT2=e#2?P>JKbb5b7~gJp0*yn*f|edOFN`Y+c(x!?)%saxNeGA9j< zttSoPZhMc#n1qGrIX1gz94LyJ7g-N8Sof5qfAc3gx9WFkj^4)=Pt?oS*QQKUkHmy8 zh$`mSjh`^ezg5~lL9;lL4w|0!t4xReT-?T(U9sj@?sk1)_5Kd{QHn$)iGhvzOF5gV zcFTNn|Lj9gX&m1W2fm~^4lXkNdjuC|>7nxvy(1q`4>ZrQ&|lX~c;7yBa^E{*k^dji PoY;46|NB(K|KR=wVqj)U literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL new file mode 100644 index 000000000..4c7b1ab35 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 new file mode 100644 index 000000000..061362cd6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 new file mode 100644 index 000000000..16c026e42 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 new file mode 100644 index 000000000..0d0968586 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 new file mode 100644 index 000000000..d8fcf1fe1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassBossKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL new file mode 100644 index 000000000..875f809dd --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 new file mode 100644 index 000000000..951dd58bb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 new file mode 100644 index 000000000..97fe8599c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 new file mode 100644 index 000000000..0d7b67f3c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 new file mode 100644 index 000000000..22c8ba3d8 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassFairyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL new file mode 100644 index 000000000..235dfdcf3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 new file mode 100644 index 000000000..273e96ed4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 new file mode 100644 index 000000000..1b8a08eec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 new file mode 100644 index 000000000..889988611 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 new file mode 100644 index 000000000..45a3b48e1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassHeartDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL new file mode 100644 index 000000000..d4ab27bdb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 new file mode 100644 index 000000000..bcf6f69e6 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull new file mode 100644 index 000000000..6444457b7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassJunkDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL new file mode 100644 index 000000000..7ded8214f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 new file mode 100644 index 000000000..f8278cc0c --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 new file mode 100644 index 000000000..64c020a98 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 new file mode 100644 index 000000000..13938b6d9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 new file mode 100644 index 000000000..da60e69d2 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMajorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL new file mode 100644 index 000000000..94c93e453 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 new file mode 100644 index 000000000..d981594a9 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 new file mode 100644 index 000000000..ee5852695 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 new file mode 100644 index 000000000..1ed45fdcb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 new file mode 100644 index 000000000..94910ceb3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMaskDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL new file mode 100644 index 000000000..e0ae6e48a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 new file mode 100644 index 000000000..7a5d4e3de --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 new file mode 100644 index 000000000..a24c28fa4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 new file mode 100644 index 000000000..5ef0b99cb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 new file mode 100644 index 000000000..d49e9b186 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassMinorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL new file mode 100644 index 000000000..7ec87e807 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 new file mode 100644 index 000000000..94ccbe795 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 new file mode 100644 index 000000000..96e84046e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 new file mode 100644 index 000000000..db7142847 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 new file mode 100644 index 000000000..b1b8cb8c1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassRandomDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL new file mode 100644 index 000000000..f22094eba --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 new file mode 100644 index 000000000..2235b57ae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 new file mode 100644 index 000000000..93b101a86 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 new file mode 100644 index 000000000..2cf0ed524 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 new file mode 100644 index 000000000..653b2b7cb --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL new file mode 100644 index 000000000..d1dff7095 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 new file mode 100644 index 000000000..dc2309657 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_0 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 new file mode 100644 index 000000000..f78444188 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_1 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 new file mode 100644 index 000000000..7de2d7943 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_2 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 new file mode 100644 index 000000000..e5c1fbd15 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_tri_3 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 new file mode 100644 index 000000000..7f094d39f --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 new file mode 100644 index 000000000..18d3d3c64 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_1 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 new file mode 100644 index 000000000..205b9a005 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_2 @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 new file mode 100644 index 000000000..56e99d5ed --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_3 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull new file mode 100644 index 000000000..2f795b083 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/gRandoCuttableGrassTokenDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey new file mode 100644 index 000000000..ee25715ae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_flower_bosskey @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassBossKeyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy new file mode 100644 index 000000000..d3c0c44ec --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_flower_fairy @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassFairyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart new file mode 100644 index 000000000..2864988e3 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_flower_heart @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassHeartDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassJunkDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold new file mode 100644 index 000000000..6f451d12a --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_flower_gold @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMajorDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask new file mode 100644 index 000000000..a5bb3b8a4 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_flower_mask @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMaskDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze new file mode 100644 index 000000000..0102b9a5e --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_flower_bronze @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassMinorDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random new file mode 100644 index 000000000..f23e81a03 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_flower_random @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassRandomDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver new file mode 100644 index 000000000..98dcfacb1 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_flower_silver @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassSmallKeyDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass new file mode 100644 index 000000000..34034f059 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_Grass @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token new file mode 100644 index 000000000..63a739c30 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_flower_token @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf new file mode 100644 index 000000000..574f63139 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_leaf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material new file mode 100644 index 000000000..04270bbae --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/mat_gRandoCuttableGrassTokenDL_f3dlite_material @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/gameplay_keep/model.xml b/soh/assets/custom/objects/gameplay_keep/model.xml new file mode 100644 index 000000000..6444457b7 --- /dev/null +++ b/soh/assets/custom/objects/gameplay_keep/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index ace158854..9e56e51bd 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -77,6 +77,66 @@ static const ALIGN_ASSET(2) char gBossSoulSkullDL[] = dgBossSoulSkullDL; #define dgRandoPotDL "__OTR__objects/gameplay_dangeon_keep/gRandoPotDL" static const ALIGN_ASSET(2) char gRandoPotDL[] = dgRandoPotDL; +#define dgRandoBushDL "__OTR__objects/gameplay_field_keep/gFieldBushRandomDL" +static const ALIGN_ASSET(2) char gRandoBushDL[] = dgRandoBushDL; + +#define dgRandoBushMinorDL "__OTR__objects/gameplay_field_keep/gFieldBushMinorDL" +static const ALIGN_ASSET(2) char gRandoBushMinorDL[] = dgRandoBushMinorDL; + +#define dgRandoBushMajorDL "__OTR__objects/gameplay_field_keep/gFieldBushMajorDL" +static const ALIGN_ASSET(2) char gRandoBushMajorDL[] = dgRandoBushMajorDL; + +#define dgRandoBushSmallKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushSmallKeyDL" +static const ALIGN_ASSET(2) char gRandoBushSmallKeyDL[] = dgRandoBushSmallKeyDL; + +#define dgRandoBushBossKeyDL "__OTR__objects/gameplay_field_keep/gFieldBushBossKeyDL" +static const ALIGN_ASSET(2) char gRandoBushBossKeyDL[] = dgRandoBushBossKeyDL; + +#define dgRandoBushTokenDL "__OTR__objects/gameplay_field_keep/gFieldBushTokenDL" +static const ALIGN_ASSET(2) char gRandoBushTokenDL[] = dgRandoBushTokenDL; + +#define dgRandoBushMaskDL "__OTR__objects/gameplay_field_keep/gFieldBushMaskDL" +static const ALIGN_ASSET(2) char gRandoBushMaskDL[] = dgRandoBushMaskDL; + +#define dgRandoBushFairyDL "__OTR__objects/gameplay_field_keep/gFieldBushFairyDL" +static const ALIGN_ASSET(2) char gRandoBushFairyDL[] = dgRandoBushFairyDL; + +#define dgRandoBushHeartDL "__OTR__objects/gameplay_field_keep/gFieldBushHeartDL" +static const ALIGN_ASSET(2) char gRandoBushHeartDL[] = dgRandoBushHeartDL; + +#define dgRandoBushJunkDL "__OTR__objects/gameplay_field_keep/gFieldBushJunkDL" +static const ALIGN_ASSET(2) char gRandoBushJunkDL[] = dgRandoBushJunkDL; + +#define dgRandoCuttableGrassRandomDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassRandomDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassDL[] = dgRandoCuttableGrassRandomDL; + +#define dgRandoCuttableGrassMinorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMinorDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMinorDL[] = dgRandoCuttableGrassMinorDL; + +#define dgRandoCuttableGrassMajorDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMajorDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMajorDL[] = dgRandoCuttableGrassMajorDL; + +#define dgRandoCuttableGrassSmallKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassSmallKeyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassSmallKeyDL[] = dgRandoCuttableGrassSmallKeyDL; + +#define dgRandoCuttableGrassBossKeyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassBossKeyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassBossKeyDL[] = dgRandoCuttableGrassBossKeyDL; + +#define dgRandoCuttableGrassTokenDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassTokenDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassTokenDL[] = dgRandoCuttableGrassTokenDL; + +#define dgRandoCuttableGrassMaskDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassMaskDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassMaskDL[] = dgRandoCuttableGrassMaskDL; + +#define dgRandoCuttableGrassFairyDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassFairyDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassFairyDL[] = dgRandoCuttableGrassFairyDL; + +#define dgRandoCuttableGrassHeartDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassHeartDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassHeartDL[] = dgRandoCuttableGrassHeartDL; + +#define dgRandoCuttableGrassJunkDL "__OTR__objects/gameplay_keep/gRandoCuttableGrassJunkDL" +static const ALIGN_ASSET(2) char gRandoCuttableGrassJunkDL[] = dgRandoCuttableGrassJunkDL; + #define dgFishingPoleGiDL "__OTR__objects/object_gi_fishing_pole/gFishingPoleGiDL" static const ALIGN_ASSET(2) char gFishingPoleGiDL[] = dgFishingPoleGiDL; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 8aace9a90..b4990803f 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -974,6 +974,22 @@ typedef enum { // - `*EnDs` VB_GRANNY_TAKE_MONEY, + // ### `result` + // ```c + // false + // ``` + // ### `args` + // - `*EnKusa` + VB_GRASS_DROP_ITEM, + + // ### `result` + // ```c + // true + // ``` + // ### `args` + // - `*EnKusa` + VB_GRASS_SETUP_DRAW, + // #### `result` // ```c // Flags_GetSwitch(play, this->dyna.actor.params & 0x3F) 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 81612ddb2..6e6ec17d6 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 @@ -123,6 +123,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß ein #Herz im Deku-Baum# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ @@ -297,6 +301,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das #Spielen einer stürmischen Melodie für einen seltsamen Stein in Dodongos Höhle# #[[1]]# enthülle.", /*french*/ "Selon moi, #jouer un air orageux pour une pierre étrange dans la Caverne Dodongo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "!!!", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | JABU JABUS BELLY | @@ -457,6 +465,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß sich #nahe des zentralen Lifts in Jabu-Jabus Bauch# #[[1]]# befände.", /*french*/ "Selon moi, près d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | FOREST TEMPLE | ---------------------------*/ @@ -1688,6 +1700,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das #Anrufen der Sonne in einer Sackgasse# innerhalb des Brunnens #[[1]]# enthülle.", /*french*/ "Selon moi, #appeler le soleil dans une impasse# à l’intérieur du puits révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_GRASS] = HintText(CustomMessage("They say that some #grass in the Bottom of the Well# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | ICE CAVERN | 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 9bbb1e4af..2c28b154e 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 @@ -1955,6 +1955,26 @@ void StaticData::HintTable_Init_Exclude_Overworld() { 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 })); + hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + // clang-format on } } diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp new file mode 100644 index 000000000..b14c816d7 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -0,0 +1,514 @@ +#include "ShuffleGrass.h" +#include "soh_assets.h" +#include "static_data.h" +#include "soh/Enhancements/enhancementTypes.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h" +#include "objects/gameplay_field_keep/gameplay_field_keep.h" +#include "objects/object_kusa/object_kusa.h" +extern PlayState* gPlayState; +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +void DrawTypeOfGrass(EnKusa* grassActor, Gfx* bushDList, Gfx* grassDList, PlayState* play) { + // Actor params is -255 for regrowable grass. + if (grassActor->actor.params == -255) { + Gfx_DrawDListOpa(play, grassDList); + } else { + Gfx_DrawDListOpa(play, bushDList); + } +} + +extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { + //static Gfx* dLists[] = { (Gfx*)gRandoBushDL, (Gfx*)object_kusa_DL_000140, (Gfx*)object_kusa_DL_000140 }; + static Gfx* dLists[] = { (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, (Gfx*)gRandoCuttableGrassJunkDL }; + auto grassActor = ((EnKusa*)thisx); + + OPEN_DISPS(play->state.gfxCtx); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + if (grassActor->grassIdentity.randomizerCheck != RC_MAX && Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + + if (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) { + auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); + GetItemCategory getItemCategory = itemEntry.getItemCategory; + + switch (getItemCategory) { + case ITEM_CATEGORY_JUNK: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, play); + break; + case ITEM_CATEGORY_LESSER: + switch (itemEntry.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, play); + break; + default: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, play); + break; + } + break; + case ITEM_CATEGORY_BOSS_KEY: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushBossKeyDL, (Gfx*)gRandoCuttableGrassBossKeyDL, play); + break; + case ITEM_CATEGORY_SMALL_KEY: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushSmallKeyDL, (Gfx*)gRandoCuttableGrassSmallKeyDL, play); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushTokenDL, (Gfx*)gRandoCuttableGrassTokenDL, play); + break; + case ITEM_CATEGORY_MAJOR: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMajorDL, (Gfx*)gRandoCuttableGrassMajorDL, play); + break; + default: + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play); + break; + } + } else { + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushDL, (Gfx*)gRandoCuttableGrassDL, play); + } + } else if (grassActor->actor.flags & ACTOR_FLAG_GRASS_DESTROYED) { + Gfx_DrawDListOpa(play, (Gfx*)object_kusa_DL_0002E0); + } else { + Gfx_DrawDListOpa(play, dLists[thisx->params & 3]); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) { + if (grassActor->grassIdentity.randomizerCheck == RC_MAX) + return false; + + RandomizerCheck rc = grassActor->grassIdentity.randomizerCheck; + + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t grassSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_GRASS).Get(); + + // Don't pull randomized item if grass isn't randomized or is already checked + if (!IS_RANDO || (grassSetting == RO_SHUFFLE_GRASS_OVERWORLD && isDungeon) || + (grassSetting == RO_SHUFFLE_GRASS_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) || + grassActor->grassIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void EnKusa_RandomizerSpawnCollectible(EnKusa* grassActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &grassActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = grassActor->grassIdentity.randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void EnKusa_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_EN_KUSA) + return; + + EnKusa* grassActor = static_cast(actorRef); + s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); + + grassActor->grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, respawnData, gPlayState->linkAgeOnLoad); +} + +void RegisterShuffleGrass() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_GRASS); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA, shouldRegister, EnKusa_RandomizerInit); + + COND_VB_SHOULD(VB_GRASS_SETUP_DRAW, shouldRegister, { + EnKusa* grassActor = va_arg(args, EnKusa*); + if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { + grassActor->actor.draw = (ActorFunc)EnKusa_RandomizerDraw; + *should = false; + } else { + *should = true; + } + }); + + COND_VB_SHOULD(VB_GRASS_DROP_ITEM, shouldRegister, { + EnKusa* grassActor = va_arg(args, EnKusa*); + if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { + EnKusa_RandomizerSpawnCollectible(grassActor, gPlayState); + grassActor->grassIdentity.randomizerCheck = RC_MAX; + grassActor->grassIdentity.randomizerInf = RAND_INF_MAX; + *should = false; + } else { + *should = true; + } + }); +} + + +void Rando::StaticData::RegisterGrassLocations() { + // Overworld Grass + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); + locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "Child Grass 2", "Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2)); + locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "Child Grass 3", "Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3)); + locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "Child Grass 4", "Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4)); + locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "Child Grass 5", "Child Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5)); + locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "Child Grass 6", "Child Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6)); + locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "Child Grass 7", "Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7)); + locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "Child Grass 8", "Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8)); + locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "Child Grass 9", "Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9)); + locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "Child Grass 10", "Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10)); + locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "Child Grass 11", "Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11)); + locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "Child Grass 12", "Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12)); + locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "Child Grass Maze 1", "Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1)); + locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "Child Grass Maze 2", "Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2)); + locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "Child Grass Maze 3", "Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3)); + locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "Adult Grass 1", "Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1)); + locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "Adult Grass 2", "Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2)); + locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "Adult Grass 3", "Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3)); + locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "Adult Grass 4", "Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4)); + locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "Adult Grass 5", "Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5)); + locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "Adult Grass 6", "Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6)); + locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "Adult Grass 7", "Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7)); + locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "Adult Grass 8", "Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8)); + locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "Adult Grass 9", "Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9)); + locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "Adult Grass 10", "Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10)); + locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "Adult Grass 11", "Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11)); + locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "Adult Grass 12", "Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12)); + locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "Adult Grass 13", "Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13)); + locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "Adult Grass 14", "Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14)); + locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "Adult Grass 15", "Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15)); + locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "Adult Grass 16", "Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16)); + locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "Adult Grass 17", "Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17)); + locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "Adult Grass 18", "Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18)); + locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 0xFF), "Adult Grass 19", "Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19)); + locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 0xFF), "Adult Grass 20", "Adult Grass 20", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20)); + locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "Near Shortcuts Grass 1", "Near Shortcuts Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1)); + locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "Near Shortcuts Grass 2", "Near Shortcuts Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2)); + locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "Near Shortcuts Grass 3", "Near Shortcuts Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3)); + locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "After Mido Grass 1", "After Mido Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4)); + locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "After Mido Grass 2", "After Mido Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5)); + locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "After Mido Grass 3", "After Mido Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6)); + locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "Near SFM Grass 1", "Near SFM Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7)); + locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "Near SFM Grass 2", "Near SFM Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8)); + locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "Near SFM Grass 3", "Near SFM Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9)); + locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1)); + locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2)); + locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3)); + locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4)); + locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5)); + locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6)); + locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7)); + locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8)); + locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Near Storms Grotto Grass 1", "Near Storms Grotto Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1)); + locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Near Storms Grotto Grass 2", "Near Storms Grotto Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2)); + locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Near Graveyard Grass 1", "Near Graveyard Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1)); + locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Near Graveyard Grass 2", "Near Graveyard Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2)); + locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Near Graveyard Grass 3", "Near Graveyard Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3)); + locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Tree Grass 1", "Tree Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4)); + locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Tree Grass 2", "Tree Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5)); + locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Tree Grass 3", "Tree Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6)); + locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Tree Grass 4", "Tree Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7)); + locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Tree Grass 5", "Tree Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8)); + locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1)); + locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2)); + locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3)); + locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4)); + locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5)); + locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6)); + locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7)); + locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8)); + locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9)); + locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10)); + locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11)); + locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12)); + locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1)); + locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2)); + locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3)); + locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4)); + locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5)); + locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6)); + locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7)); + locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8)); + locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9)); + locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10)); + locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11)); + locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12)); + locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13)); + locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14)); + locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15)); + locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16)); + locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17)); + locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18)); + locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19)); + locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20)); + locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21)); + locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22)); + locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23)); + locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24)); + locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25)); + locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26)); + locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27)); + locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28)); + locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29)); + locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30)); + locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31)); + locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32)); + locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33)); + locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34)); + locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35)); + locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36)); + locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1)); + locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2)); + locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3)); + locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4)); + locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1)); + locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "Near KF Grass 1", "Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1)); + locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "Near KF Grass 2", "Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "Near KF Grass 3", "Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3)); + locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "Near KF Grass 4", "Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4)); + locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "Near KF Grass 5", "Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5)); + locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "Near KF Grass 6", "Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6)); + locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "Near KF Grass 7", "Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7)); + locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "Near KF Grass 8", "Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8)); + locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "Near KF Grass 9", "Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9)); + locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "Near KF Grass 10", "Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10)); + locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "Near KF Grass 11", "Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11)); + locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "Near KF Grass 12", "Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12)); + locationTable[RC_HF_NEAR_MARKET_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "Near Market Grass 1", "Near Market Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "Near Market Grass 2", "Near Market Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "Near Market Grass 3", "Near Market Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "Near Market Grass 4", "Near Market Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GRASS_5] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "Near Market Grass 5", "Near Market Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_5)); + locationTable[RC_HF_NEAR_MARKET_GRASS_6] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "Near Market Grass 6", "Near Market Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_6)); + locationTable[RC_HF_NEAR_MARKET_GRASS_7] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "Near Market Grass 7", "Near Market Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_7)); + locationTable[RC_HF_NEAR_MARKET_GRASS_8] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "Near Market Grass 8", "Near Market Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_8)); + locationTable[RC_HF_NEAR_MARKET_GRASS_9] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "Near Market Grass 9", "Near Market Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_9)); + locationTable[RC_HF_NEAR_MARKET_GRASS_10] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "Near Market Grass 10", "Near Market Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_10)); + locationTable[RC_HF_NEAR_MARKET_GRASS_11] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "Near Market Grass 11", "Near Market Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_11)); + locationTable[RC_HF_NEAR_MARKET_GRASS_12] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "Near Market Grass 12", "Near Market Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_12)); + locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "South Grass 1", "South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1)); + locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "South Grass 2", "South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2)); + locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "South Grass 3", "South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3)); + locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "South Grass 4", "South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4)); + locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "South Grass 5", "South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5)); + locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "South Grass 6", "South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6)); + locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "South Grass 7", "South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7)); + locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "South Grass 8", "South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8)); + locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "South Grass 9", "South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9)); + locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "South Grass 10", "South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10)); + locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "South Grass 11", "South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11)); + locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "South Grass 12", "South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12)); + locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "Central Grass 1", "Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1)); + locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "Central Grass 2", "Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2)); + locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "Central Grass 3", "Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3)); + locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "Central Grass 4", "Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4)); + locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "Central Grass 5", "Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5)); + locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "Central Grass 6", "Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6)); + locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "Central Grass 7", "Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7)); + locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "Central Grass 8", "Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8)); + locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "Central Grass 9", "Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9)); + locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "Central Grass 10", "Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10)); + locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "Central Grass 11", "Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11)); + locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "Central Grass 12", "Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12)); + locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "Near Tree Grass 1", "Near Tree Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1)); + locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "Near Tree Grass 2", "Near Tree Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2)); + locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "Near Tree Grass 3", "Near Tree Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3)); + locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "Near Tree Grass 4", "Near Tree Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4)); + locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "Near Tree Grass 5", "Near Tree Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5)); + locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "Near Tree Grass 6", "Near Tree Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6)); + locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "Near Tree Grass 7", "Near Tree Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7)); + locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "Near Tree Grass 8", "Near Tree Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8)); + locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "Near Tree Grass 9", "Near Tree Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9)); + locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "Near Tree Grass 10", "Near Tree Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10)); + locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "Near Tree Grass 11", "Near Tree Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11)); + locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "Near Tree Grass 12", "Near Tree Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12)); + locationTable[RC_ZR_NEAR_FREESTANDING_POH_GRASS] = Location::Grass(RC_ZR_NEAR_FREESTANDING_POH_GRASS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "Near Freestanding PoH Grass", "Near Freestanding PoH Grass", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS)); + // Grotto Grass + locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x2C), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x2C), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x2C), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x2C), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x14), "Near Shortcuts Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x14), "Near Shortcuts Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x14), "Near Shortcuts Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x14), "Near Shortcuts Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_1] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x00), "Near Market Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_2] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x00), "Near Market Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_3] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x00), "Near Market Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_4] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x00), "Near Market Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_1] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x03), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_1)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_2] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x03), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_2)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_3] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x03), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_3)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_4] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x03), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_4)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_1] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x22), "Southeast Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_2] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x22), "Southeast Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_3] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x22), "Southeast Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_4] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x22), "Southeast Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4)); + locationTable[RC_HF_COW_GROTTO_GRASS_1] = Location::Base(RC_HF_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3419, 0xE4), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_1)); + locationTable[RC_HF_COW_GROTTO_GRASS_2] = Location::Base(RC_HF_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3518, 0xE4), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_1] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x28), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_1)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_2] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x28), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_3] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x28), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_3)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_4] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x28), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_4)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_1] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x57), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_1)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_2] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x57), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_2)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_3] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x57), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_3)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_4] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x57), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_4)); + locationTable[RC_DMT_COW_GROTTO_GRASS_1] = Location::Base(RC_DMT_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2443, 0xF8), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_1)); + locationTable[RC_DMT_COW_GROTTO_GRASS_2] = Location::Base(RC_DMT_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2494, 0xF8), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_1] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x7A), "Upper Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_1)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_2] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x7A), "Upper Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_3] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x7A), "Upper Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_3)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_4] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x7A), "Upper Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_4)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_1] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x29), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_1)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_2] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x29), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_2)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_3] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x29), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_3)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_4] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x29), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_4)); + // Dungeon Grass + locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Deku Tree Lobby Grass 1", "Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Deku Tree Lobby Grass 2", "Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Deku Tree Lobby Grass 3", "Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Deku Tree Lobby Grass 4", "Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Deku Tree Lobby Grass 5", "Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1018, 1263), "Deku Tree Slingshot Grass 1", "Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1005, 1216), "Deku Tree Slingshot Grass 2", "Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1280, 1026), "Deku Tree Slingshot Grass 3", "Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1229, 1006), "Deku Tree Slingshot Grass 4", "Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1444, 169), "Deku Tree Compass Grass 1", "Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1516, 142), "Deku Tree Compass Grass 2", "Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 130), "Deku Tree Basement Grass 1", "Deku Tree Basement Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 187), "Deku Tree Basement Grass 2", "Deku Tree Basement Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-228, 792), "Deku Tree Eye Switch Grass 1", "Deku Tree Eye Switch Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-202, 751), "Deku Tree Eye Switch Grass 2", "Deku Tree Eye Switch Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(79, 794), "Deku Tree Eye Switch Grass 3", "Deku Tree Eye Switch Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(49, 752), "Deku Tree Eye Switch Grass 4", "Deku Tree Eye Switch Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1310, 840), "Deku Tree Spike Roller Grass 1", "Deku Tree Spike Roller Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1361, 840), "Deku Tree Spike Roller Grass 2", "Deku Tree Spike Roller Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1796, 821), "Deku Tree Torches Grass 1", "Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1919, 820), "Deku Tree Torches Grass 2", "Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1955, -296), "Deku Tree Larvae Grass 1", "Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2025, -301), "Deku Tree Larvae Grass 2", "Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -515), "Deku Tree Before Boss Grass 1", "Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -577), "Deku Tree Before Boss Grass 2", "Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-269, -643), "Deku Tree Before Boss Grass 3", "Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-760, -465), "Dodongo's Cavern First Bridge Grass", "Dodongo's Cavern First Bridge Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BLADE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BLADE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1713, -1246), "Dodongo's Cavern Blade Room Grass", "Dodongo's Cavern Blade Room Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3189, -485), "Dodongo's Cavern Single Eye Grass", "Dodongo's Cavern Single Eye Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-249, -2519), "Dodongo's Cavern Before Boss Grass", "Dodongo's Cavern Before Boss Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-858, -1330), "Bottom of the Well Basement Behind Rocks Grass 1", "Bottom of the Well Basement Behind Rocks Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-870, -1021), "Bottom of the Well Basement Behind Rocks Grass 2", "Bottom of the Well Basement Behind Rocks Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-872, -1383), "Bottom of the Well Basement Behind Rocks Grass 3", "Bottom of the Well Basement Behind Rocks Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-874, -1447), "Bottom of the Well Basement Behind Rocks Grass 4", "Bottom of the Well Basement Behind Rocks Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-886, -1263), "Bottom of the Well Basement Behind Rocks Grass 5", "Bottom of the Well Basement Behind Rocks Grass 5", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-918, -1131), "Bottom of the Well Basement Behind Rocks Grass 6", "Bottom of the Well Basement Behind Rocks Grass 6", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-943, -1316), "Bottom of the Well Basement Behind Rocks Grass 7", "Bottom of the Well Basement Behind Rocks Grass 7", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1377), "Bottom of the Well Basement Behind Rocks Grass 8", "Bottom of the Well Basement Behind Rocks Grass 8", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1463), "Bottom of the Well Basement Behind Rocks Grass 9", "Bottom of the Well Basement Behind Rocks Grass 9", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-619, -627), "Bottom of the Well Basement Grass 1", "Bottom of the Well Basement Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-565, -654), "Bottom of the Well Basement Grass 2", "Bottom of the Well Basement Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-552, -711), "Bottom of the Well Basement Grass 3", "Bottom of the Well Basement Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3)); + // MQ Dungeon Grass + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(392, -158), "MQ Deku Tree Lobby Grass 1", "MQ Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(356, -235), "MQ Deku Tree Lobby Grass 2", "MQ Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(308, -291), "MQ Deku Tree Lobby Grass 3", "MQ Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(81, -416), "MQ Deku Tree Lobby Grass 4", "MQ Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(143, -401), "MQ Deku Tree Lobby Grass 5", "MQ Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-11, -344), "MQ Deku Tree Lobby Grass 6", "MQ Deku Tree Lobby Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-159, -302), "MQ Deku Tree Lobby Grass 7", "MQ Deku Tree Lobby Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-636, 161), "MQ Deku Tree Slingshot Grass 1", "MQ Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-693, 182), "MQ Deku Tree Slingshot Grass 2", "MQ Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1443, 167), "MQ Deku Tree Slingshot Grass 3", "MQ Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1515, 140), "MQ Deku Tree Slingshot Grass 4", "MQ Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-753, 614), "MQ Deku Tree Before Compass Grass 1", "MQ Deku Tree Before Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-736, 795), "MQ Deku Tree Before Compass Grass 2", "MQ Deku Tree Before Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-575, 627), "MQ Deku Tree Before Compass Grass 3", "MQ Deku Tree Before Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-572, 727), "MQ Deku Tree Before Compass Grass 4", "MQ Deku Tree Before Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-788, 702), "MQ Deku Tree Before Compass Grass 5", "MQ Deku Tree Before Compass Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-654, 582), "MQ Deku Tree Before Compass Grass 6", "MQ Deku Tree Before Compass Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-643, 798), "MQ Deku Tree Before Compass Grass 7", "MQ Deku Tree Before Compass Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1279, 1024), "MQ Deku Tree Compass Grass 1", "MQ Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1228, 1004), "MQ Deku Tree Compass Grass 2", "MQ Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1017, 1261), "MQ Deku Tree Compass Grass 3", "MQ Deku Tree Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1004, 1214), "MQ Deku Tree Compass Grass 4", "MQ Deku Tree Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-15, -261), "MQ Deku Tree Basement Lower Grass 1", "MQ Deku Tree Basement Lower Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-7, -328), "MQ Deku Tree Basement Lower Grass 2", "MQ Deku Tree Basement Lower Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(5, 119), "MQ Deku Tree Basement Lower Grass 3", "MQ Deku Tree Basement Lower Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-39, 118), "MQ Deku Tree Basement Lower Grass 4", "MQ Deku Tree Basement Lower Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-807, -228), "MQ Deku Tree Basement Upper Grass 1", "MQ Deku Tree Basement Upper Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-764, 280), "MQ Deku Tree Basement Upper Grass 2", "MQ Deku Tree Basement Upper Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, 237), "MQ Deku Tree Basement Upper Grass 3", "MQ Deku Tree Basement Upper Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-466, 865), "MQ Deku Tree Spike Roller Front Grass 1", "MQ Deku Tree Spike Roller Front Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-495, 906), "MQ Deku Tree Spike Roller Front Grass 2", "MQ Deku Tree Spike Roller Front Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-538, 907), "MQ Deku Tree Spike Roller Front Grass 3", "MQ Deku Tree Spike Roller Front Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1360, 838), "MQ Deku Tree Spike Roller Back Grass 1", "MQ Deku Tree Spike Roller Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1309, 838), "MQ Deku Tree Spike Roller Back Grass 2", "MQ Deku Tree Spike Roller Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-227, 790), "MQ Deku Tree Torches Grass 1", "MQ Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-201, 749), "MQ Deku Tree Torches Grass 2", "MQ Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(50, 750), "MQ Deku Tree Torches Grass 3", "MQ Deku Tree Torches Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, 792), "MQ Deku Tree Torches Grass 4", "MQ Deku Tree Torches Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1795, 819), "MQ Deku Tree Larvae Grass 1", "MQ Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1918, 818), "MQ Deku Tree Larvae Grass 2", "MQ Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1678, -120), "MQ Deku Tree Graves Grass 1", "MQ Deku Tree Graves Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1700, 196), "MQ Deku Tree Graves Grass 2", "MQ Deku Tree Graves Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2165, 350), "MQ Deku Tree Graves Grass 3", "MQ Deku Tree Graves Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2215, 56), "MQ Deku Tree Graves Grass 4", "MQ Deku Tree Graves Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1901, 604), "MQ Deku Tree Graves Grass 5", "MQ Deku Tree Graves Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2708, -522), "MQ Deku Tree Back Grass 1", "MQ Deku Tree Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2395, -587), "MQ Deku Tree Back Grass 2", "MQ Deku Tree Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2553, -433), "MQ Deku Tree Back Grass 3", "MQ Deku Tree Back Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -517), "MQ Deku Tree Before Boss Grass 1", "MQ Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -579), "MQ Deku Tree Before Boss Grass 2", "MQ Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-268, -645), "MQ Deku Tree Before Boss Grass 3", "MQ Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1721, -579), "MQ Dodongo's Cavern Compass Grass 1", "MQ Dodongo's Cavern Compass Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1731, -45), "MQ Dodongo's Cavern Compass Grass 2", "MQ Dodongo's Cavern Compass Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2218, -56), "MQ Dodongo's Cavern Compass Grass 3", "MQ Dodongo's Cavern Compass Grass 3", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2230, -556), "MQ Dodongo's Cavern Compass Grass 4", "MQ Dodongo's Cavern Compass Grass 4", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1765, -3940), "MQ Dodongo's Cavern Armos Grass", "MQ Dodongo's Cavern Armos Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1285, -4693), "MQ Dodongo's Cavern Back Poe Grass", "MQ Dodongo's Cavern Back Poe Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2644, -3368), "MQ Dodongo's Cavern Scrub Grass 1", "MQ Dodongo's Cavern Scrub Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2614, -3387), "MQ Dodongo's Cavern Scrub Grass 2", "MQ Dodongo's Cavern Scrub Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-219, -61), "MQ Jabu Jabu's Belly First Grass 1", "MQ Jabu Jabu's Belly First Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(213, -398), "MQ Jabu Jabu's Belly First Grass 2", "MQ Jabu Jabu's Belly First Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3209), "MQ Jabu Jabu's Belly Pit Grass 1", "MQ Jabu Jabu's Belly Pit Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3534), "MQ Jabu Jabu's Belly Pit Grass 2", "MQ Jabu Jabu's Belly Pit Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-91, -2815), "MQ Jabu Jabu's Belly Basement Grass 1", "MQ Jabu Jabu's Belly Basement Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(231, -3575), "MQ Jabu Jabu's Belly Basement Grass 2", "MQ Jabu Jabu's Belly Basement Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(305, -3481), "MQ Jabu Jabu's Belly Basement Grass 3", "MQ Jabu Jabu's Belly Basement Grass 3", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1089, -1489), "MQ Jabu Jabu's Belly Wigglers Grass", "MQ Jabu Jabu's Belly Wigglers Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(652, -5687), "MQ Jabu Jabu's Belly Like Like Grass", "MQ Jabu Jabu's Belly Like Like Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1228, -2647), "MQ Jabu Jabu's Belly Basement Boomerang Grass", "MQ Jabu Jabu's Belly Basement Boomerang Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1360, -3606), "MQ Jabu Jabu's Belly After Big Octo Grass 1", "MQ Jabu Jabu's Belly After Big Octo Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1086, -3346), "MQ Jabu Jabu's Belly After Big Octo Grass 2", "MQ Jabu Jabu's Belly After Big Octo Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1477, -1366), "MQ Jabu Jabu's Belly Before Boss Grass 1", "MQ Jabu Jabu's Belly Before Boss Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1691, -1576), "MQ Jabu Jabu's Belly Before Boss Grass 2", "MQ Jabu Jabu's Belly Before Boss Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1604, 3), "MQ Bottom of the Well Dead Hand Grass 1", "MQ Bottom of the Well Dead Hand Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1529, 2), "MQ Bottom of the Well Dead Hand Grass 2", "MQ Bottom of the Well Dead Hand Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1492, -49), "MQ Bottom of the Well Dead Hand Grass 3", "MQ Bottom of the Well Dead Hand Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1458, -130), "MQ Bottom of the Well Dead Hand Grass 4", "MQ Bottom of the Well Dead Hand Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4)); + // Shared Dungeon Grass + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(545, -75), "Deku Tree Queen Gohma Grass 1", "Deku Tree Queen Gohma Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(525, -375), "Deku Tree Queen Gohma Grass 2", "Deku Tree Queen Gohma Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-646, 108), "Deku Tree Queen Gohma Grass 3", "Deku Tree Queen Gohma Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-444, 323), "Deku Tree Queen Gohma Grass 4", "Deku Tree Queen Gohma Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-848, -166), "Deku Tree Queen Gohma Grass 5", "Deku Tree Queen Gohma Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-855, -596), "Deku Tree Queen Gohma Grass 6", "Deku Tree Queen Gohma Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Deku Tree Queen Gohma Grass 7", "Deku Tree Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Deku Tree Queen Gohma Grass 8", "Deku Tree Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); + // End Grass +} + +static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleGrassLocations(Rando::StaticData::RegisterGrassLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.h b/soh/soh/Enhancements/randomizer/ShuffleGrass.h new file mode 100644 index 000000000..e666f107e --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.h @@ -0,0 +1,15 @@ +#ifndef SHUFFLEGRASS_H +#define SHUFFLEGRASS_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void EnKusa_RandomizerInit(void* actorRef); +#ifdef __cplusplus +}; +#endif + +#endif //SHUFFLEGRASS_H diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 221e2176c..77f67873e 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -179,6 +179,7 @@ void Context::GenerateLocationPool() { (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || @@ -189,7 +190,8 @@ void Context::GenerateLocationPool() { // Skip stuff that is shuffled to dungeon only, i.e. tokens, pots, etc., or other checks that // should not have a shuffled item. if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS))) { + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -201,7 +203,8 @@ void Context::GenerateLocationPool() { if (location.GetQuest() == RCQUEST_BOTH || (location.GetQuest() == RCQUEST_MQ) == dungeon->IsMQ()) { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD))) { + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD))) { continue; } // also add to that dungeon's location list. diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index b6f332927..7b5f98f4b 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -392,3 +392,10 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, false, collectionCheck}; } + +Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + std::string&& spoilerName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, collectionCheck }; +} diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index b4fb6482a..3806160c8 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -199,6 +199,11 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); 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 2a913f4a9..4ec6b6773 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 @@ -131,20 +131,32 @@ void RegionTable_Init_BottomOfTheWell() { areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), - LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, logic->CanBreakPots()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, logic->CanCutShrubs() && logic->BlastOrSmash()), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), @@ -235,6 +247,10 @@ void RegionTable_Init_BottomOfTheWell() { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, logic->HasExplosives() || (ctx->GetTrickOption(RT_BOTW_MQ_DEADHAND_KEY) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, logic->CanCutShrubs()), }, { //Exits //This assumes we spawned in dead hand's room, if whatever trick made this relevant instead puts us in the previous room, remove the kill Dead Hand check. diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 21a7151da..129a842ef 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -25,6 +25,11 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MAP_CHEST, true), LOCATION(RC_DEKU_TREE_LOBBY_LOWER_HEART, true), LOCATION(RC_DEKU_TREE_LOBBY_UPPER_HEART, logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_LOBBY_GRASS_5, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}), @@ -45,6 +50,10 @@ void RegionTable_Init_DekuTree() { //Locations LOCATION(RC_DEKU_TREE_SLINGSHOT_CHEST, true), LOCATION(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, true), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_1, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_2, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_3, logic->CanCutShrubs() && logic->CanReflectNuts()), + LOCATION(RC_DEKU_TREE_SLINGSHOT_GRASS_4, logic->CanCutShrubs() && logic->CanReflectNuts()), }, { //Exits Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), @@ -59,6 +68,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_COMPASS_CHEST, true), LOCATION(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, true), LOCATION(RC_DEKU_TREE_GS_COMPASS_ROOM, logic->CanAttack()), + LOCATION(RC_DEKU_TREE_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_COMPASS_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}), @@ -74,6 +85,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_BASEMENT_CHEST, true), LOCATION(RC_DEKU_TREE_GS_BASEMENT_GATE, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), LOCATION(RC_DEKU_TREE_GS_BASEMENT_VINES, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS) ? ED_SHORT_JUMPSLASH : ED_BOMB_THROW)), + LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return true;}), @@ -82,7 +95,13 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return false;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + //Location + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_LOWER, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanHitEyeTargets();});}), @@ -94,7 +113,11 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), }); - areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), @@ -104,7 +127,11 @@ void RegionTable_Init_DekuTree() { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), @@ -114,7 +141,11 @@ void RegionTable_Init_DekuTree() { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), - }, {}, { + }, { + //Location + LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_BACK_ROOM, []{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}) && Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->BlastOrSmash();});}), @@ -142,9 +173,12 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs() && logic->HasFireSourceWithTorch()), }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_UPPER, []{return true;}), @@ -159,7 +193,14 @@ void RegionTable_Init_DekuTree() { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}), EventAccess(&logic->BrokeDeku1FWeb, []{return logic->HasFireSource();}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, []{return true;}), //may need canAvoid logic with enemy shuffle @@ -173,9 +214,11 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), - LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), - LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -195,6 +238,10 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, logic->CanKillEnemy(RE_DEKU_BABA)), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, logic->HasFireSourceWithTorch() || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), @@ -205,7 +252,14 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return Here(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanHitEyeTargets();});}), @@ -214,7 +268,11 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), @@ -236,7 +294,11 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -250,7 +312,13 @@ void RegionTable_Init_DekuTree() { //Events //Implies CanKillEnemy(RE_GOHMA_LARVA) EventAccess(&logic->ClearedMQDekuSERoom, []{return logic->CanKillEnemy(RE_MAD_SCRUB);}), - }, {}, { + }, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return logic->HasFireSource();}), Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return logic->ClearedMQDekuSERoom;}), @@ -262,7 +330,10 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_STICKS) && (ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield())));}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS));}), @@ -276,14 +347,20 @@ void RegionTable_Init_DekuTree() { }, { //Locations //it blocks the chest while stunned unless you stun it from afar while it's slightly off the ground - LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, logic->CanUse(RG_SONG_OF_TIME) && logic->CanPassEnemy(RE_BIG_SKULLTULA)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->MQDekuWaterRoomTorches && logic->CanPassEnemy(RE_BIG_SKULLTULA, logic->CanUse(RG_SONG_OF_TIME) ? ED_CLOSE : ED_SHORT_JUMPSLASH);}), Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)));}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), + }, { //Exits //both imply CanKillEnemy(RE_GOHMA_LARVA) Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->CanKillEnemy(RE_MAD_SCRUB) && logic->CanKillEnemy(RE_KEESE);});}), @@ -297,6 +374,11 @@ void RegionTable_Init_DekuTree() { }, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG))), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->IsChild && Here(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), @@ -308,6 +390,9 @@ void RegionTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return true;}), @@ -318,7 +403,10 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->PushedDekuBasementBlock, []{return true;}), }, { //Locations - LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()), + LOCATION(RC_DEKU_TREE_MQ_DEKU_SCRUB, logic->CanStunDeku()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->IsChild;}), @@ -333,6 +421,9 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), @@ -354,8 +445,16 @@ void RegionTable_Init_DekuTree() { EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || logic->CanKillEnemy(RE_GOHMA);}), }, { // Locations - LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), + LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->DekuTreeClear && logic->CanCutShrubs()), }, { // Exits Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}), 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 738368117..bea5801e5 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -153,6 +153,8 @@ void RegionTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true), LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), + LOCATION(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_BLADE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}), @@ -174,6 +176,7 @@ void RegionTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), @@ -226,7 +229,10 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), - }, {}, { + }, { + //Location + LOCATION(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, logic->CanCutShrubs()), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_BACK_ROOM, []{return Here(RR_DODONGOS_CAVERN_BOSS_AREA, []{return logic->CanBreakMudWalls();});}), @@ -346,7 +352,11 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return true;}), @@ -472,6 +482,8 @@ void RegionTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) + LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);});}), @@ -497,6 +509,7 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, true), //pulling the grave isn't required, as you can open the chest through it LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return logic->CanAttack();}), @@ -513,6 +526,7 @@ void RegionTable_Init_DodongosCavern() { Here(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) /* || bunny jumps*/);})), LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index 8e3c8a8d4..ed28e8672 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -173,6 +173,8 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return true;}), @@ -220,6 +222,11 @@ void RegionTable_Init_JabuJabusBelly() { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, logic->CanCutShrubs() && logic->HasExplosives()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return true;}), @@ -233,10 +240,11 @@ void RegionTable_Init_JabuJabusBelly() { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true), //Implies logic->CanKillEnemy(RE_LIKE_LIKE) && logic->CanKillEnemy(RE_STINGER). Without swim, jump from the song of time block to the vines. - LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()), - LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanKillEnemy(RE_LIZALFOS)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, (logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (ctx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, logic->CanCutShrubs()), }, { //Exits //without swim, jump from rang chest to the other side @@ -254,6 +262,7 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}), @@ -298,7 +307,10 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->LoweredJabuPath, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_COW, logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), @@ -320,9 +332,11 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->FairyPot, []{return true;}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), - LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, logic->CanUse(RG_BOOMERANG) || (ctx->GetTrickOption(RT_JABU_NEAR_BOSS_RANGED) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index 33022e270..bdcdf9a4c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -29,6 +29,8 @@ void RegionTable_Init_CastleGrounds() { LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_MALON_GOSSIP_STONE, true), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true), + LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_CASTLE_GROUNDS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index 48863c695..cc5601fcb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -114,6 +114,10 @@ void RegionTable_Init_DeathMountainCrater() { LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DMC_UPPER_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DMC_UPPER_LOCAL, []{return true;}), 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 750fbf140..b9fab96e0 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 @@ -73,6 +73,8 @@ void RegionTable_Init_DeathMountainTrail() { 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)), + LOCATION(RC_DMT_COW_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMT_COW_GROTTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), @@ -87,6 +89,10 @@ void RegionTable_Init_DeathMountainTrail() { LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DMT_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{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 6a3fb41f5..694d0e3ee 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -19,6 +19,18 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GY_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index f6c9d1c40..add3a2f86 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -13,6 +13,54 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_BRIDGE, []{return true;}), @@ -41,6 +89,10 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -55,6 +107,10 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -89,6 +145,8 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_COW_GROTTO_POT_1, logic->CanBreakPots()), LOCATION(RC_HF_COW_GROTTO_POT_2, logic->CanBreakPots()), + LOCATION(RC_HF_COW_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_COW_GROTTO_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HF_COW_GROTTO, []{return true;}), @@ -103,6 +161,10 @@ void RegionTable_Init_HyruleField() { LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 846e55203..7fffa5d72 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -31,6 +31,14 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), @@ -224,6 +232,10 @@ void RegionTable_Init_Kakariko() { LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_KAK_BACKYARD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index cdd43b042..80df2bb91 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -40,6 +40,41 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), LOCATION(RC_KF_GOSSIP_STONE, true), + LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_19, logic->IsAdult && logic->CanCutShrubs()), + LOCATION(RC_KF_ADULT_GRASS_20, logic->IsAdult && logic->CanCutShrubs()), }, { //Exits Entrance(RR_KF_LINKS_HOUSE, []{return true;}), @@ -146,6 +181,10 @@ void RegionTable_Init_KokiriForest() { LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KF_STORMS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) 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 d4b950d78..04ae5fe85 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -39,6 +39,48 @@ void RegionTable_Init_LakeHylia() { LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), + LOCATION(RC_LH_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_13, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_14, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_15, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_16, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_17, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_18, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_19, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_20, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_21, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_22, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_23, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_24, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_25, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_26, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_27, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_28, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_29, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_30, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_31, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_32, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_33, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_34, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_35, logic->CanCutShrubs()), + LOCATION(RC_LH_GRASS_36, logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_LH_WARP_PAD_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LH_WARP_PAD_GRASS_2, logic->CanCutShrubs()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), 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 fb146ec54..812b33a55 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -49,6 +49,9 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), + LOCATION(RC_LW_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_3, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_FOREST_EXIT, []{return true;}), @@ -72,6 +75,12 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_LW_GRASS_9, logic->CanCutShrubs()), }, { //Exits Entrance(RR_LW_FOREST_EXIT, []{return true;}), @@ -90,6 +99,10 @@ void RegionTable_Init_LostWoods() { LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_THE_LOST_WOODS, []{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 3924c858a..02dea3b56 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -12,7 +12,17 @@ void RegionTable_Init_Market() { 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, {}, {}, { + areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), Entrance(RR_TOT_ENTRANCE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index 3a252edb0..3fbf8bdbd 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -7,7 +7,19 @@ void RegionTable_Init_ZoraRiver() { // clang-format off areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), + LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), + LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()), + LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return logic->IsAdult || logic->BlastOrSmash();}), @@ -48,6 +60,7 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), + LOCATION(RC_ZR_NEAR_FREESTANDING_POH_GRASS, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZR_FRONT, []{return true;}), @@ -73,6 +86,10 @@ void RegionTable_Init_ZoraRiver() { LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives()), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_ZR_OPEN_GROTTO_GRASS_4, logic->CanCutShrubs()), }, { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index a3184765f..576e8c334 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -449,6 +449,17 @@ void Settings::CreateOptionDescriptions() { "All Items - Shuffle all freestanding rupees & hearts."; mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations."; + mOptionDescriptions[RSK_SHUFFLE_GRASS] = + "Grass/Bushes will drop a randomized item the first time they're cut and collected. " + "Grass/Bushes will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Grass/Bushes will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle grass/bushes that are within dungeons.\n" + "\n" + "Overworld - Only shuffle grass/bushes that are outside of dungeons.\n" + "\n" + "All Grass/Bushes - Shuffle all grass/bushes."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of Spiritual Stones and medallions.\n" "Vanilla - Spiritual Stones and medallions will be given from their respective boss.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 4eac2e5bb..f99a38ba3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1007,6 +1007,356 @@ std::map rcToRandomizerInf = { { RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 }, { RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 }, { RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 }, + // Grass + { RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 }, + { RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 }, + { RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 }, + { RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 }, + { RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 }, + { RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 }, + { RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 }, + { RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 }, + { RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 }, + { RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 }, + { RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 }, + { RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 }, + { RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 }, + { RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 }, + { RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 }, + { RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 }, + { RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 }, + { RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 }, + { RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 }, + { RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 }, + { RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 }, + { RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 }, + { RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 }, + { RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 }, + { RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 }, + { RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 }, + { RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 }, + { RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 }, + { RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 }, + { RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 }, + { RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 }, + { RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 }, + { RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 }, + { RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 }, + { RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 }, + { RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 }, + { RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 }, + { RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 }, + { RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 }, + { RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 }, + { RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 }, + { RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 }, + { RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 }, + { RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 }, + { RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 }, + { RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 }, + { RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 }, + { RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 }, + { RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 }, + { RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 }, + { RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 }, + { RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 }, + { RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 }, + { RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 }, + { RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 }, + { RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 }, + { RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 }, + { RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 }, + { RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 }, + { RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 }, + { RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 }, + { RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 }, + { RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 }, + { RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 }, + { RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 }, + { RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 }, + { RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 }, + { RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 }, + { RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 }, + { RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 }, + { RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 }, + { RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 }, + { RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 }, + { RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 }, + { RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 }, + { RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 }, + { RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 }, + { RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 }, + { RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 }, + { RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 }, + { RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 }, + { RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 }, + { RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 }, + { RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 }, + { RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 }, + { RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 }, + { RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 }, + { RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 }, + { RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 }, + { RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 }, + { RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 }, + { RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 }, + { RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 }, + { RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 }, + { RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 }, + { RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 }, + { RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 }, + { RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 }, + { RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 }, + { RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 }, + { RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 }, + { RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 }, + { RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 }, + { RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 }, + { RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 }, + { RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 }, + { RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 }, + { RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 }, + { RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 }, + { RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 }, + { RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 }, + { RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 }, + { RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 }, + { RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 }, + { RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 }, + { RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 }, + { RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 }, + { RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 }, + { RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 }, + { RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 }, + { RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 }, + { RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 }, + { RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 }, + { RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 }, + { RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 }, + { RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 }, + { RC_HF_NEAR_MARKET_GRASS_1, RAND_INF_HF_NEAR_MARKET_GRASS_1 }, + { RC_HF_NEAR_MARKET_GRASS_2, RAND_INF_HF_NEAR_MARKET_GRASS_2 }, + { RC_HF_NEAR_MARKET_GRASS_3, RAND_INF_HF_NEAR_MARKET_GRASS_3 }, + { RC_HF_NEAR_MARKET_GRASS_4, RAND_INF_HF_NEAR_MARKET_GRASS_4 }, + { RC_HF_NEAR_MARKET_GRASS_5, RAND_INF_HF_NEAR_MARKET_GRASS_5 }, + { RC_HF_NEAR_MARKET_GRASS_6, RAND_INF_HF_NEAR_MARKET_GRASS_6 }, + { RC_HF_NEAR_MARKET_GRASS_7, RAND_INF_HF_NEAR_MARKET_GRASS_7 }, + { RC_HF_NEAR_MARKET_GRASS_8, RAND_INF_HF_NEAR_MARKET_GRASS_8 }, + { RC_HF_NEAR_MARKET_GRASS_9, RAND_INF_HF_NEAR_MARKET_GRASS_9 }, + { RC_HF_NEAR_MARKET_GRASS_10, RAND_INF_HF_NEAR_MARKET_GRASS_10 }, + { RC_HF_NEAR_MARKET_GRASS_11, RAND_INF_HF_NEAR_MARKET_GRASS_11 }, + { RC_HF_NEAR_MARKET_GRASS_12, RAND_INF_HF_NEAR_MARKET_GRASS_12 }, + { RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 }, + { RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 }, + { RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 }, + { RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 }, + { RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 }, + { RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 }, + { RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 }, + { RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 }, + { RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 }, + { RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 }, + { RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 }, + { RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 }, + { RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 }, + { RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 }, + { RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 }, + { RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 }, + { RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 }, + { RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 }, + { RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 }, + { RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 }, + { RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 }, + { RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 }, + { RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 }, + { RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 }, + { RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 }, + { RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 }, + { RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 }, + { RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 }, + { RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 }, + { RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 }, + { RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 }, + { RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 }, + { RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 }, + { RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 }, + { RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 }, + { RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 }, + { RC_ZR_NEAR_FREESTANDING_POH_GRASS, RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS }, + // Grotto Grass + { RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 }, + { RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 }, + { RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 }, + { RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4 }, + { RC_HF_OPEN_GROTTO_GRASS_1, RAND_INF_HF_OPEN_GROTTO_GRASS_1 }, + { RC_HF_OPEN_GROTTO_GRASS_2, RAND_INF_HF_OPEN_GROTTO_GRASS_2 }, + { RC_HF_OPEN_GROTTO_GRASS_3, RAND_INF_HF_OPEN_GROTTO_GRASS_3 }, + { RC_HF_OPEN_GROTTO_GRASS_4, RAND_INF_HF_OPEN_GROTTO_GRASS_4 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_1, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_2, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_3, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_4, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4 }, + { RC_HF_COW_GROTTO_GRASS_1, RAND_INF_HF_COW_GROTTO_GRASS_1 }, + { RC_HF_COW_GROTTO_GRASS_2, RAND_INF_HF_COW_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_1, RAND_INF_KAK_OPEN_GROTTO_GRASS_1 }, + { RC_KAK_OPEN_GROTTO_GRASS_2, RAND_INF_KAK_OPEN_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_3, RAND_INF_KAK_OPEN_GROTTO_GRASS_3 }, + { RC_KAK_OPEN_GROTTO_GRASS_4, RAND_INF_KAK_OPEN_GROTTO_GRASS_4 }, + { RC_DMT_STORMS_GROTTO_GRASS_1, RAND_INF_DMT_STORMS_GROTTO_GRASS_1 }, + { RC_DMT_STORMS_GROTTO_GRASS_2, RAND_INF_DMT_STORMS_GROTTO_GRASS_2 }, + { RC_DMT_STORMS_GROTTO_GRASS_3, RAND_INF_DMT_STORMS_GROTTO_GRASS_3 }, + { RC_DMT_STORMS_GROTTO_GRASS_4, RAND_INF_DMT_STORMS_GROTTO_GRASS_4 }, + { RC_DMT_COW_GROTTO_GRASS_1, RAND_INF_DMT_COW_GROTTO_GRASS_1 }, + { RC_DMT_COW_GROTTO_GRASS_2, RAND_INF_DMT_COW_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_1, RAND_INF_DMC_UPPER_GROTTO_GRASS_1 }, + { RC_DMC_UPPER_GROTTO_GRASS_2, RAND_INF_DMC_UPPER_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_3, RAND_INF_DMC_UPPER_GROTTO_GRASS_3 }, + { RC_DMC_UPPER_GROTTO_GRASS_4, RAND_INF_DMC_UPPER_GROTTO_GRASS_4 }, + { RC_ZR_OPEN_GROTTO_GRASS_1, RAND_INF_ZR_OPEN_GROTTO_GRASS_1 }, + { RC_ZR_OPEN_GROTTO_GRASS_2, RAND_INF_ZR_OPEN_GROTTO_GRASS_2 }, + { RC_ZR_OPEN_GROTTO_GRASS_3, RAND_INF_ZR_OPEN_GROTTO_GRASS_3 }, + { RC_ZR_OPEN_GROTTO_GRASS_4, RAND_INF_ZR_OPEN_GROTTO_GRASS_4 }, + // Dungeon Grass + { RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS }, + { RC_DODONGOS_CAVERN_BLADE_GRASS, RAND_INF_DODONGOS_CAVERN_BLADE_GRASS }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS }, + { RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3 }, + // MQ Dungeon Grass + { RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS }, + { RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3 }, + { RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4 }, + // Shared Dungeon Grass + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8 }, + // End Grass { RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT }, { RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 }, @@ -1836,6 +2186,68 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) { return fishIdentity; } +GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge) { + struct GrassIdentity grassIdentity; + + grassIdentity.randomizerInf = RAND_INF_MAX; + grassIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + if (sceneNum == SCENE_GROTTOS) { + respawnData = TWO_ACTOR_PARAMS(posX, respawnData); + } else { + // We'll just pretend it's always daytime for our market bushes. + if (sceneNum == SCENE_MARKET_NIGHT) { + sceneNum = SCENE_MARKET_DAY; + + /* + The two bushes by the tree are not in the same spot + between night and day. We'll assume the coordinates + of the daytime bushes so that we can count them as + the same locations. + */ + if (posX == -74) { + posX = -106; + posZ = 277; + } + if (posX == -87) { + posX = -131; + posZ = 225; + } + } + + /* + Same as with Market. ZR has a bush slightly off pos + between Child and Adult. This is to merge them into + a single location. + */ + if (sceneNum == SCENE_ZORAS_RIVER) { + if (posX == 233) { + posX = 231; + posZ = -1478; + } + } + + // The two bushes behind the sign in KF should be separate + // locations between Child and Adult. + if (sceneNum == SCENE_KOKIRI_FOREST && linkAge == 0) { + if (posX == -498 || posX == -523) { + posZ = 0xFF; + } + } + + respawnData = TWO_ACTOR_PARAMS(posX, posZ); + } + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_KUSA, sceneNum, respawnData); + + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + grassIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + grassIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return grassIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 76bde6a4f..13718dac4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -54,6 +54,7 @@ class Randomizer { CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ); PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ); FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams); + GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2c97c50c0..9851f614b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -294,6 +294,7 @@ typedef enum { RCTYPE_FISH, // Fishes RCTYPE_FREESTANDING, // Freestanding rupees and hearts RCTYPE_FAIRY, // Fairies + RCTYPE_GRASS, // Grass } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -2848,6 +2849,358 @@ typedef enum { RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + + // Overworld Grass + RC_KF_CHILD_GRASS_1, + RC_KF_CHILD_GRASS_2, + RC_KF_CHILD_GRASS_3, + RC_KF_CHILD_GRASS_4, + RC_KF_CHILD_GRASS_5, + RC_KF_CHILD_GRASS_6, + RC_KF_CHILD_GRASS_7, + RC_KF_CHILD_GRASS_8, + RC_KF_CHILD_GRASS_9, + RC_KF_CHILD_GRASS_10, + RC_KF_CHILD_GRASS_11, + RC_KF_CHILD_GRASS_12, + RC_KF_CHILD_GRASS_MAZE_1, + RC_KF_CHILD_GRASS_MAZE_2, + RC_KF_CHILD_GRASS_MAZE_3, + RC_KF_ADULT_GRASS_1, + RC_KF_ADULT_GRASS_2, + RC_KF_ADULT_GRASS_3, + RC_KF_ADULT_GRASS_4, + RC_KF_ADULT_GRASS_5, + RC_KF_ADULT_GRASS_6, + RC_KF_ADULT_GRASS_7, + RC_KF_ADULT_GRASS_8, + RC_KF_ADULT_GRASS_9, + RC_KF_ADULT_GRASS_10, + RC_KF_ADULT_GRASS_11, + RC_KF_ADULT_GRASS_12, + RC_KF_ADULT_GRASS_13, + RC_KF_ADULT_GRASS_14, + RC_KF_ADULT_GRASS_15, + RC_KF_ADULT_GRASS_16, + RC_KF_ADULT_GRASS_17, + RC_KF_ADULT_GRASS_18, + RC_KF_ADULT_GRASS_19, + RC_KF_ADULT_GRASS_20, + RC_LW_GRASS_1, + RC_LW_GRASS_2, + RC_LW_GRASS_3, + RC_LW_GRASS_4, + RC_LW_GRASS_5, + RC_LW_GRASS_6, + RC_LW_GRASS_7, + RC_LW_GRASS_8, + RC_LW_GRASS_9, + RC_MARKET_GRASS_1, + RC_MARKET_GRASS_2, + RC_MARKET_GRASS_3, + RC_MARKET_GRASS_4, + RC_MARKET_GRASS_5, + RC_MARKET_GRASS_6, + RC_MARKET_GRASS_7, + RC_MARKET_GRASS_8, + RC_HC_GRASS_1, + RC_HC_GRASS_2, + RC_KAK_GRASS_1, + RC_KAK_GRASS_2, + RC_KAK_GRASS_3, + RC_KAK_GRASS_4, + RC_KAK_GRASS_5, + RC_KAK_GRASS_6, + RC_KAK_GRASS_7, + RC_KAK_GRASS_8, + RC_GY_GRASS_1, + RC_GY_GRASS_2, + RC_GY_GRASS_3, + RC_GY_GRASS_4, + RC_GY_GRASS_5, + RC_GY_GRASS_6, + RC_GY_GRASS_7, + RC_GY_GRASS_8, + RC_GY_GRASS_9, + RC_GY_GRASS_10, + RC_GY_GRASS_11, + RC_GY_GRASS_12, + RC_LH_GRASS_1, + RC_LH_GRASS_2, + RC_LH_GRASS_3, + RC_LH_GRASS_4, + RC_LH_GRASS_5, + RC_LH_GRASS_6, + RC_LH_GRASS_7, + RC_LH_GRASS_8, + RC_LH_GRASS_9, + RC_LH_GRASS_10, + RC_LH_GRASS_11, + RC_LH_GRASS_12, + RC_LH_GRASS_13, + RC_LH_GRASS_14, + RC_LH_GRASS_15, + RC_LH_GRASS_16, + RC_LH_GRASS_17, + RC_LH_GRASS_18, + RC_LH_GRASS_19, + RC_LH_GRASS_20, + RC_LH_GRASS_21, + RC_LH_GRASS_22, + RC_LH_GRASS_23, + RC_LH_GRASS_24, + RC_LH_GRASS_25, + RC_LH_GRASS_26, + RC_LH_GRASS_27, + RC_LH_GRASS_28, + RC_LH_GRASS_29, + RC_LH_GRASS_30, + RC_LH_GRASS_31, + RC_LH_GRASS_32, + RC_LH_GRASS_33, + RC_LH_GRASS_34, + RC_LH_GRASS_35, + RC_LH_GRASS_36, + RC_LH_CHILD_GRASS_1, + RC_LH_CHILD_GRASS_2, + RC_LH_CHILD_GRASS_3, + RC_LH_CHILD_GRASS_4, + RC_LH_WARP_PAD_GRASS_1, + RC_LH_WARP_PAD_GRASS_2, + RC_HF_NEAR_KF_GRASS_1, + RC_HF_NEAR_KF_GRASS_2, + RC_HF_NEAR_KF_GRASS_3, + RC_HF_NEAR_KF_GRASS_4, + RC_HF_NEAR_KF_GRASS_5, + RC_HF_NEAR_KF_GRASS_6, + RC_HF_NEAR_KF_GRASS_7, + RC_HF_NEAR_KF_GRASS_8, + RC_HF_NEAR_KF_GRASS_9, + RC_HF_NEAR_KF_GRASS_10, + RC_HF_NEAR_KF_GRASS_11, + RC_HF_NEAR_KF_GRASS_12, + RC_HF_NEAR_MARKET_GRASS_1, + RC_HF_NEAR_MARKET_GRASS_2, + RC_HF_NEAR_MARKET_GRASS_3, + RC_HF_NEAR_MARKET_GRASS_4, + RC_HF_NEAR_MARKET_GRASS_5, + RC_HF_NEAR_MARKET_GRASS_6, + RC_HF_NEAR_MARKET_GRASS_7, + RC_HF_NEAR_MARKET_GRASS_8, + RC_HF_NEAR_MARKET_GRASS_9, + RC_HF_NEAR_MARKET_GRASS_10, + RC_HF_NEAR_MARKET_GRASS_11, + RC_HF_NEAR_MARKET_GRASS_12, + RC_HF_SOUTH_GRASS_1, + RC_HF_SOUTH_GRASS_2, + RC_HF_SOUTH_GRASS_3, + RC_HF_SOUTH_GRASS_4, + RC_HF_SOUTH_GRASS_5, + RC_HF_SOUTH_GRASS_6, + RC_HF_SOUTH_GRASS_7, + RC_HF_SOUTH_GRASS_8, + RC_HF_SOUTH_GRASS_9, + RC_HF_SOUTH_GRASS_10, + RC_HF_SOUTH_GRASS_11, + RC_HF_SOUTH_GRASS_12, + RC_HF_CENTRAL_GRASS_1, + RC_HF_CENTRAL_GRASS_2, + RC_HF_CENTRAL_GRASS_3, + RC_HF_CENTRAL_GRASS_4, + RC_HF_CENTRAL_GRASS_5, + RC_HF_CENTRAL_GRASS_6, + RC_HF_CENTRAL_GRASS_7, + RC_HF_CENTRAL_GRASS_8, + RC_HF_CENTRAL_GRASS_9, + RC_HF_CENTRAL_GRASS_10, + RC_HF_CENTRAL_GRASS_11, + RC_HF_CENTRAL_GRASS_12, + RC_ZR_GRASS_1, + RC_ZR_GRASS_2, + RC_ZR_GRASS_3, + RC_ZR_GRASS_4, + RC_ZR_GRASS_5, + RC_ZR_GRASS_6, + RC_ZR_GRASS_7, + RC_ZR_GRASS_8, + RC_ZR_GRASS_9, + RC_ZR_GRASS_10, + RC_ZR_GRASS_11, + RC_ZR_GRASS_12, + RC_ZR_NEAR_FREESTANDING_POH_GRASS, + // Grotto Grass + RC_KF_STORMS_GROTTO_GRASS_1, + RC_KF_STORMS_GROTTO_GRASS_2, + RC_KF_STORMS_GROTTO_GRASS_3, + RC_KF_STORMS_GROTTO_GRASS_4, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, + RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, + RC_HF_NEAR_MARKET_GROTTO_GRASS_1, + RC_HF_NEAR_MARKET_GROTTO_GRASS_2, + RC_HF_NEAR_MARKET_GROTTO_GRASS_3, + RC_HF_NEAR_MARKET_GROTTO_GRASS_4, + RC_HF_OPEN_GROTTO_GRASS_1, + RC_HF_OPEN_GROTTO_GRASS_2, + RC_HF_OPEN_GROTTO_GRASS_3, + RC_HF_OPEN_GROTTO_GRASS_4, + RC_HF_SOUTHEAST_GROTTO_GRASS_1, + RC_HF_SOUTHEAST_GROTTO_GRASS_2, + RC_HF_SOUTHEAST_GROTTO_GRASS_3, + RC_HF_SOUTHEAST_GROTTO_GRASS_4, + RC_HF_COW_GROTTO_GRASS_1, + RC_HF_COW_GROTTO_GRASS_2, + RC_KAK_OPEN_GROTTO_GRASS_1, + RC_KAK_OPEN_GROTTO_GRASS_2, + RC_KAK_OPEN_GROTTO_GRASS_3, + RC_KAK_OPEN_GROTTO_GRASS_4, + RC_DMT_STORMS_GROTTO_GRASS_1, + RC_DMT_STORMS_GROTTO_GRASS_2, + RC_DMT_STORMS_GROTTO_GRASS_3, + RC_DMT_STORMS_GROTTO_GRASS_4, + RC_DMT_COW_GROTTO_GRASS_1, + RC_DMT_COW_GROTTO_GRASS_2, + RC_DMC_UPPER_GROTTO_GRASS_1, + RC_DMC_UPPER_GROTTO_GRASS_2, + RC_DMC_UPPER_GROTTO_GRASS_3, + RC_DMC_UPPER_GROTTO_GRASS_4, + RC_ZR_OPEN_GROTTO_GRASS_1, + RC_ZR_OPEN_GROTTO_GRASS_2, + RC_ZR_OPEN_GROTTO_GRASS_3, + RC_ZR_OPEN_GROTTO_GRASS_4, + // Dungeon Grass + RC_DEKU_TREE_LOBBY_GRASS_1, + RC_DEKU_TREE_LOBBY_GRASS_2, + RC_DEKU_TREE_LOBBY_GRASS_3, + RC_DEKU_TREE_LOBBY_GRASS_4, + RC_DEKU_TREE_LOBBY_GRASS_5, + RC_DEKU_TREE_SLINGSHOT_GRASS_1, + RC_DEKU_TREE_SLINGSHOT_GRASS_2, + RC_DEKU_TREE_SLINGSHOT_GRASS_3, + RC_DEKU_TREE_SLINGSHOT_GRASS_4, + RC_DEKU_TREE_COMPASS_GRASS_1, + RC_DEKU_TREE_COMPASS_GRASS_2, + RC_DEKU_TREE_BASEMENT_GRASS_1, + RC_DEKU_TREE_BASEMENT_GRASS_2, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, + RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, + RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, + RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, + RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, + RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, + RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, + RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, + RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, + RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, + RC_DODONGOS_CAVERN_BLADE_GRASS, + RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, + RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, + RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, + RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, + // MQ Dungeon Grass + RC_DEKU_TREE_MQ_LOBBY_GRASS_1, + RC_DEKU_TREE_MQ_LOBBY_GRASS_2, + RC_DEKU_TREE_MQ_LOBBY_GRASS_3, + RC_DEKU_TREE_MQ_LOBBY_GRASS_4, + RC_DEKU_TREE_MQ_LOBBY_GRASS_5, + RC_DEKU_TREE_MQ_LOBBY_GRASS_6, + RC_DEKU_TREE_MQ_LOBBY_GRASS_7, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, + RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, + RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, + RC_DEKU_TREE_MQ_COMPASS_GRASS_1, + RC_DEKU_TREE_MQ_COMPASS_GRASS_2, + RC_DEKU_TREE_MQ_COMPASS_GRASS_3, + RC_DEKU_TREE_MQ_COMPASS_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, + RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, + RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, + RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, + RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, + RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, + RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, + RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, + RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, + RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, + RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, + RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, + RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, + RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, + RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, + RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, + // Shared Dungeon Grass + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, + RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, + // End Grass + RC_MAX } RandomizerCheck; @@ -4931,8 +5284,23 @@ typedef enum { RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + // GRASS + RHT_KF_GRASS, + RHT_LW_GRASS, + RHT_MARKET_GRASS, + RHT_HC_GRASS, + RHT_KAK_GRASS, + RHT_GY_GRASS, + RHT_LH_GRASS, + RHT_HF_GRASS, + RHT_ZR_GRASS, + RHT_GROTTO_GRASS, + RHT_DEKU_TREE_GRASS, + RHT_DODONGOS_CAVERN_GRASS, + RHT_BOTTOM_OF_THE_WELL_GRASS, + RHT_JABU_JABUS_BELLY_GRASS, // MAX - RHT_MAX + RHT_MAX, } RandomizerHintTextKey; @@ -5223,6 +5591,7 @@ typedef enum { RSK_SHUFFLE_FREESTANDING, RSK_SHUFFLE_FAIRIES, RSK_LOCK_OVERWORLD_DOORS, + RSK_SHUFFLE_GRASS, RSK_MAX } RandomizerSettingKey; @@ -5569,6 +5938,14 @@ typedef enum { RO_SHUFFLE_POTS_ALL, } RandoOptionShufflePots; +// Shuffle Grass settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_GRASS_OFF, + RO_SHUFFLE_GRASS_DUNGEONS, + RO_SHUFFLE_GRASS_OVERWORLD, + RO_SHUFFLE_GRASS_ALL, +} RandoOptionShuffleGrass; + //Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, @@ -5664,6 +6041,11 @@ typedef struct FishIdentity { RandomizerCheck randomizerCheck; } FishIdentity; +typedef struct GrassIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} GrassIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, TRACKER_WINDOW_WINDOW, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index b8d435fd8..9333913a4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -172,6 +172,7 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_BEEHIVE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index aa6b8b608..7d531cb24 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -59,6 +59,8 @@ bool showWeirdEgg; bool showGerudoCard; bool showOverworldPots; bool showDungeonPots; +bool showOverworldGrass; +bool showDungeonGrass; bool showFrogSongRupees; bool showFairies; bool showStartingMapsCompasses; @@ -1269,11 +1271,32 @@ void LoadSettings() { showDungeonPots = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GRASS)) { + case RO_SHUFFLE_GRASS_ALL: + showOverworldGrass = true; + showDungeonGrass = true; + break; + case RO_SHUFFLE_GRASS_OVERWORLD: + showOverworldGrass = true; + showDungeonGrass = false; + break; + case RO_SHUFFLE_GRASS_DUNGEONS: + showOverworldGrass = false; + showDungeonGrass = true; + break; + default: + showOverworldGrass = false; + showDungeonGrass = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; showOverworldPots = false; showDungeonPots = false; + showOverworldGrass = false; + showDungeonGrass = false; } fortressFast = false; @@ -1354,6 +1377,9 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_POT || (showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_GRASS || + (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 8c4d05a4f..f061be660 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1349,6 +1349,357 @@ typedef enum { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, + + // Overworld Grass + RAND_INF_KF_CHILD_GRASS_1, + RAND_INF_KF_CHILD_GRASS_2, + RAND_INF_KF_CHILD_GRASS_3, + RAND_INF_KF_CHILD_GRASS_4, + RAND_INF_KF_CHILD_GRASS_5, + RAND_INF_KF_CHILD_GRASS_6, + RAND_INF_KF_CHILD_GRASS_7, + RAND_INF_KF_CHILD_GRASS_8, + RAND_INF_KF_CHILD_GRASS_9, + RAND_INF_KF_CHILD_GRASS_10, + RAND_INF_KF_CHILD_GRASS_11, + RAND_INF_KF_CHILD_GRASS_12, + RAND_INF_KF_CHILD_GRASS_MAZE_1, + RAND_INF_KF_CHILD_GRASS_MAZE_2, + RAND_INF_KF_CHILD_GRASS_MAZE_3, + RAND_INF_KF_ADULT_GRASS_1, + RAND_INF_KF_ADULT_GRASS_2, + RAND_INF_KF_ADULT_GRASS_3, + RAND_INF_KF_ADULT_GRASS_4, + RAND_INF_KF_ADULT_GRASS_5, + RAND_INF_KF_ADULT_GRASS_6, + RAND_INF_KF_ADULT_GRASS_7, + RAND_INF_KF_ADULT_GRASS_8, + RAND_INF_KF_ADULT_GRASS_9, + RAND_INF_KF_ADULT_GRASS_10, + RAND_INF_KF_ADULT_GRASS_11, + RAND_INF_KF_ADULT_GRASS_12, + RAND_INF_KF_ADULT_GRASS_13, + RAND_INF_KF_ADULT_GRASS_14, + RAND_INF_KF_ADULT_GRASS_15, + RAND_INF_KF_ADULT_GRASS_16, + RAND_INF_KF_ADULT_GRASS_17, + RAND_INF_KF_ADULT_GRASS_18, + RAND_INF_KF_ADULT_GRASS_19, + RAND_INF_KF_ADULT_GRASS_20, + RAND_INF_LW_GRASS_1, + RAND_INF_LW_GRASS_2, + RAND_INF_LW_GRASS_3, + RAND_INF_LW_GRASS_4, + RAND_INF_LW_GRASS_5, + RAND_INF_LW_GRASS_6, + RAND_INF_LW_GRASS_7, + RAND_INF_LW_GRASS_8, + RAND_INF_LW_GRASS_9, + RAND_INF_MARKET_GRASS_1, + RAND_INF_MARKET_GRASS_2, + RAND_INF_MARKET_GRASS_3, + RAND_INF_MARKET_GRASS_4, + RAND_INF_MARKET_GRASS_5, + RAND_INF_MARKET_GRASS_6, + RAND_INF_MARKET_GRASS_7, + RAND_INF_MARKET_GRASS_8, + RAND_INF_HC_GRASS_1, + RAND_INF_HC_GRASS_2, + RAND_INF_KAK_GRASS_1, + RAND_INF_KAK_GRASS_2, + RAND_INF_KAK_GRASS_3, + RAND_INF_KAK_GRASS_4, + RAND_INF_KAK_GRASS_5, + RAND_INF_KAK_GRASS_6, + RAND_INF_KAK_GRASS_7, + RAND_INF_KAK_GRASS_8, + RAND_INF_GY_GRASS_1, + RAND_INF_GY_GRASS_2, + RAND_INF_GY_GRASS_3, + RAND_INF_GY_GRASS_4, + RAND_INF_GY_GRASS_5, + RAND_INF_GY_GRASS_6, + RAND_INF_GY_GRASS_7, + RAND_INF_GY_GRASS_8, + RAND_INF_GY_GRASS_9, + RAND_INF_GY_GRASS_10, + RAND_INF_GY_GRASS_11, + RAND_INF_GY_GRASS_12, + RAND_INF_LH_GRASS_1, + RAND_INF_LH_GRASS_2, + RAND_INF_LH_GRASS_3, + RAND_INF_LH_GRASS_4, + RAND_INF_LH_GRASS_5, + RAND_INF_LH_GRASS_6, + RAND_INF_LH_GRASS_7, + RAND_INF_LH_GRASS_8, + RAND_INF_LH_GRASS_9, + RAND_INF_LH_GRASS_10, + RAND_INF_LH_GRASS_11, + RAND_INF_LH_GRASS_12, + RAND_INF_LH_GRASS_13, + RAND_INF_LH_GRASS_14, + RAND_INF_LH_GRASS_15, + RAND_INF_LH_GRASS_16, + RAND_INF_LH_GRASS_17, + RAND_INF_LH_GRASS_18, + RAND_INF_LH_GRASS_19, + RAND_INF_LH_GRASS_20, + RAND_INF_LH_GRASS_21, + RAND_INF_LH_GRASS_22, + RAND_INF_LH_GRASS_23, + RAND_INF_LH_GRASS_24, + RAND_INF_LH_GRASS_25, + RAND_INF_LH_GRASS_26, + RAND_INF_LH_GRASS_27, + RAND_INF_LH_GRASS_28, + RAND_INF_LH_GRASS_29, + RAND_INF_LH_GRASS_30, + RAND_INF_LH_GRASS_31, + RAND_INF_LH_GRASS_32, + RAND_INF_LH_GRASS_33, + RAND_INF_LH_GRASS_34, + RAND_INF_LH_GRASS_35, + RAND_INF_LH_GRASS_36, + RAND_INF_LH_CHILD_GRASS_1, + RAND_INF_LH_CHILD_GRASS_2, + RAND_INF_LH_CHILD_GRASS_3, + RAND_INF_LH_CHILD_GRASS_4, + RAND_INF_LH_WARP_PAD_GRASS_1, + RAND_INF_LH_WARP_PAD_GRASS_2, + RAND_INF_HF_NEAR_KF_GRASS_1, + RAND_INF_HF_NEAR_KF_GRASS_2, + RAND_INF_HF_NEAR_KF_GRASS_3, + RAND_INF_HF_NEAR_KF_GRASS_4, + RAND_INF_HF_NEAR_KF_GRASS_5, + RAND_INF_HF_NEAR_KF_GRASS_6, + RAND_INF_HF_NEAR_KF_GRASS_7, + RAND_INF_HF_NEAR_KF_GRASS_8, + RAND_INF_HF_NEAR_KF_GRASS_9, + RAND_INF_HF_NEAR_KF_GRASS_10, + RAND_INF_HF_NEAR_KF_GRASS_11, + RAND_INF_HF_NEAR_KF_GRASS_12, + RAND_INF_HF_NEAR_MARKET_GRASS_1, + RAND_INF_HF_NEAR_MARKET_GRASS_2, + RAND_INF_HF_NEAR_MARKET_GRASS_3, + RAND_INF_HF_NEAR_MARKET_GRASS_4, + RAND_INF_HF_NEAR_MARKET_GRASS_5, + RAND_INF_HF_NEAR_MARKET_GRASS_6, + RAND_INF_HF_NEAR_MARKET_GRASS_7, + RAND_INF_HF_NEAR_MARKET_GRASS_8, + RAND_INF_HF_NEAR_MARKET_GRASS_9, + RAND_INF_HF_NEAR_MARKET_GRASS_10, + RAND_INF_HF_NEAR_MARKET_GRASS_11, + RAND_INF_HF_NEAR_MARKET_GRASS_12, + RAND_INF_HF_SOUTH_GRASS_1, + RAND_INF_HF_SOUTH_GRASS_2, + RAND_INF_HF_SOUTH_GRASS_3, + RAND_INF_HF_SOUTH_GRASS_4, + RAND_INF_HF_SOUTH_GRASS_5, + RAND_INF_HF_SOUTH_GRASS_6, + RAND_INF_HF_SOUTH_GRASS_7, + RAND_INF_HF_SOUTH_GRASS_8, + RAND_INF_HF_SOUTH_GRASS_9, + RAND_INF_HF_SOUTH_GRASS_10, + RAND_INF_HF_SOUTH_GRASS_11, + RAND_INF_HF_SOUTH_GRASS_12, + RAND_INF_HF_CENTRAL_GRASS_1, + RAND_INF_HF_CENTRAL_GRASS_2, + RAND_INF_HF_CENTRAL_GRASS_3, + RAND_INF_HF_CENTRAL_GRASS_4, + RAND_INF_HF_CENTRAL_GRASS_5, + RAND_INF_HF_CENTRAL_GRASS_6, + RAND_INF_HF_CENTRAL_GRASS_7, + RAND_INF_HF_CENTRAL_GRASS_8, + RAND_INF_HF_CENTRAL_GRASS_9, + RAND_INF_HF_CENTRAL_GRASS_10, + RAND_INF_HF_CENTRAL_GRASS_11, + RAND_INF_HF_CENTRAL_GRASS_12, + RAND_INF_ZR_GRASS_1, + RAND_INF_ZR_GRASS_2, + RAND_INF_ZR_GRASS_3, + RAND_INF_ZR_GRASS_4, + RAND_INF_ZR_GRASS_5, + RAND_INF_ZR_GRASS_6, + RAND_INF_ZR_GRASS_7, + RAND_INF_ZR_GRASS_8, + RAND_INF_ZR_GRASS_9, + RAND_INF_ZR_GRASS_10, + RAND_INF_ZR_GRASS_11, + RAND_INF_ZR_GRASS_12, + RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS, + // Grotto Grass + RAND_INF_KF_STORMS_GROTTO_GRASS_1, + RAND_INF_KF_STORMS_GROTTO_GRASS_2, + RAND_INF_KF_STORMS_GROTTO_GRASS_3, + RAND_INF_KF_STORMS_GROTTO_GRASS_4, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, + RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3, + RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4, + RAND_INF_HF_OPEN_GROTTO_GRASS_1, + RAND_INF_HF_OPEN_GROTTO_GRASS_2, + RAND_INF_HF_OPEN_GROTTO_GRASS_3, + RAND_INF_HF_OPEN_GROTTO_GRASS_4, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3, + RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4, + RAND_INF_HF_COW_GROTTO_GRASS_1, + RAND_INF_HF_COW_GROTTO_GRASS_2, + RAND_INF_KAK_OPEN_GROTTO_GRASS_1, + RAND_INF_KAK_OPEN_GROTTO_GRASS_2, + RAND_INF_KAK_OPEN_GROTTO_GRASS_3, + RAND_INF_KAK_OPEN_GROTTO_GRASS_4, + RAND_INF_DMT_STORMS_GROTTO_GRASS_1, + RAND_INF_DMT_STORMS_GROTTO_GRASS_2, + RAND_INF_DMT_STORMS_GROTTO_GRASS_3, + RAND_INF_DMT_STORMS_GROTTO_GRASS_4, + RAND_INF_DMT_COW_GROTTO_GRASS_1, + RAND_INF_DMT_COW_GROTTO_GRASS_2, + RAND_INF_DMC_UPPER_GROTTO_GRASS_1, + RAND_INF_DMC_UPPER_GROTTO_GRASS_2, + RAND_INF_DMC_UPPER_GROTTO_GRASS_3, + RAND_INF_DMC_UPPER_GROTTO_GRASS_4, + RAND_INF_ZR_OPEN_GROTTO_GRASS_1, + RAND_INF_ZR_OPEN_GROTTO_GRASS_2, + RAND_INF_ZR_OPEN_GROTTO_GRASS_3, + RAND_INF_ZR_OPEN_GROTTO_GRASS_4, + // Dungeon Grass + RAND_INF_DEKU_TREE_LOBBY_GRASS_1, + RAND_INF_DEKU_TREE_LOBBY_GRASS_2, + RAND_INF_DEKU_TREE_LOBBY_GRASS_3, + RAND_INF_DEKU_TREE_LOBBY_GRASS_4, + RAND_INF_DEKU_TREE_LOBBY_GRASS_5, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3, + RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4, + RAND_INF_DEKU_TREE_COMPASS_GRASS_1, + RAND_INF_DEKU_TREE_COMPASS_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, + RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, + RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, + RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, + RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, + RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1, + RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2, + RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3, + RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, + RAND_INF_DODONGOS_CAVERN_BLADE_GRASS, + RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS, + RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, + // MQ Dungeon Grass + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6, + RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, + RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3, + RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, + RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, + RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, + RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, + RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, + RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS, + RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, + RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, + RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, + RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, + RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, + RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, + RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, + RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, + RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, + // Shared Dungeon Grass + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7, + RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8, + // End Grass // 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/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 39f367a1e..ba049b32c 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -209,6 +209,7 @@ void Settings::CreateOptions() { 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_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_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); @@ -677,6 +678,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_100_GS_REWARD], &mOptions[RSK_SHUFFLE_BOSS_SOULS], &mOptions[RSK_SHUFFLE_FAIRIES], + &mOptions[RSK_SHUFFLE_GRASS], }, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index a456089a3..1ce04687c 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -51,6 +51,7 @@ class StaticData { static void RegisterFairyLocations(); static void RegisterPotLocations(); static void RegisterFreestandingLocations(); + static void RegisterGrassLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; 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 49623c850..23146f376 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 @@ -10,6 +10,7 @@ #include "objects/gameplay_field_keep/gameplay_field_keep.h" #include "objects/object_kusa/object_kusa.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_THROW_ONLY) @@ -126,6 +127,10 @@ s32 EnKusa_SnapToFloor(EnKusa* this, PlayState* play, f32 yOffset) { void EnKusa_DropCollectible(EnKusa* this, PlayState* play) { s16 dropParams; + if (!GameInteractor_Should(VB_GRASS_DROP_ITEM, true, this)) { + return; + } + switch (this->actor.params & 3) { case ENKUSA_TYPE_0: case ENKUSA_TYPE_2: @@ -138,11 +143,9 @@ void EnKusa_DropCollectible(EnKusa* this, PlayState* play) { break; case ENKUSA_TYPE_1: if (CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) { - } - else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) { + } else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) { Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS); - } - else if (Rand_ZeroOne() < 0.5f) { + } else if (Rand_ZeroOne() < 0.5f) { Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS); } else { Item_DropCollectible(play, &this->actor.world.pos, ITEM00_HEART); @@ -193,8 +196,8 @@ void EnKusa_SpawnFragments(EnKusa* this, PlayState* play) { scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) & 7; - EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, - 80, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubStalkDL); + EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, 80, + KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubStalkDL); pos.x = this->actor.world.pos.x + (dir->x * this->actor.scale.x * 40.0f); pos.y = this->actor.world.pos.y + (dir->y * this->actor.scale.y * 40.0f) + 10.0f; @@ -206,8 +209,8 @@ void EnKusa_SpawnFragments(EnKusa* this, PlayState* play) { scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) % 7; - EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, - 80, KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubTipDL); + EffectSsKakera_Spawn(play, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0, 80, + KAKERA_COLOR_NONE, OBJECT_GAMEPLAY_KEEP, gCuttableShrubTipDL); } } @@ -215,8 +218,9 @@ void EnKusa_SpawnBugs(EnKusa* this, PlayState* play) { s32 i; for (i = 0; i < 3; i++) { - Actor* bug = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x, - this->actor.world.pos.y, this->actor.world.pos.z, 0, Rand_ZeroOne() * 0xFFFF, 0, 1, true); + Actor* bug = + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_INSECT, this->actor.world.pos.x, this->actor.world.pos.y, + this->actor.world.pos.z, 0, Rand_ZeroOne() * 0xFFFF, 0, 1, true); if (bug == NULL) { break; @@ -288,6 +292,10 @@ void EnKusa_WaitObject(EnKusa* this, PlayState* play) { EnKusa_SetupMain(this); } + if (!GameInteractor_Should(VB_GRASS_SETUP_DRAW, true, this)) { + return; + } + this->actor.draw = EnKusa_Draw; this->actor.objBankIndex = this->objBankIndex; this->actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h index f1e9f24d7..6db50aa28 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h @@ -20,6 +20,7 @@ typedef struct EnKusa { /* 0x0150 */ ColliderCylinder collider; /* 0x019C */ s16 timer; /* 0x019E */ s8 objBankIndex; + /* */ GrassIdentity grassIdentity; } EnKusa; // size = 0x01A0 #endif From 540aad67156abd539986036e713cccd9c1f155b7 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Wed, 26 Mar 2025 14:40:03 -0400 Subject: [PATCH 149/267] Don't place GBK into the pool for Triforce Hunt (#5218) --- .../randomizer/3drando/item_pool.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index af52a6446..8a27f8106 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1286,14 +1286,16 @@ void GenerateItemPool() { AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); } - 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).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { - 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); - } else { - AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); + if (!ctx->GetOption(RSK_TRIFORCE_HUNT)) { // Don't add GBK to the pool at all for Triforce Hunt. + 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).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { + 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); + } else { + AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); + } } if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { From b2ba5a6481e1f296f430257884393c2c68ecee62 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 26 Mar 2025 19:59:43 +0100 Subject: [PATCH 150/267] Add clang format off to shuffle grass (#5219) --- soh/soh/Enhancements/randomizer/ShuffleGrass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index b14c816d7..37d407fb3 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -157,6 +157,7 @@ void RegisterShuffleGrass() { void Rando::StaticData::RegisterGrassLocations() { + // clang-format off // Overworld Grass // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); @@ -508,6 +509,7 @@ void Rando::StaticData::RegisterGrassLocations() { locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Deku Tree Queen Gohma Grass 7", "Deku Tree Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Deku Tree Queen Gohma Grass 8", "Deku Tree Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); // End Grass + // clang-format on } static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" }); From f1a45cf2ecf8a87b03e3a209153fd7d779065d76 Mon Sep 17 00:00:00 2001 From: Archez Date: Wed, 26 Mar 2025 15:05:06 -0400 Subject: [PATCH 151/267] Fix Tektite texture body break parts for custom skeletons (#5214) * Fix Tektite body break parts for custom skeletons * explicit null check --- soh/src/overlays/actors/ovl_En_Part/z_en_part.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 0a91e0e88..02afa040e 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 @@ -299,11 +299,17 @@ void EnPart_Draw(Actor* thisx, PlayState* play) { gSPSegment(POLY_OPA_DISP++, 0x08, func_80ACEAC0(play->state.gfxCtx, 255, 255, 255, 180, 180, 180)); gSPSegment(POLY_OPA_DISP++, 0x09, func_80ACEAC0(play->state.gfxCtx, 225, 205, 115, 25, 20, 0)); gSPSegment(POLY_OPA_DISP++, 0x0A, func_80ACEAC0(play->state.gfxCtx, 225, 205, 115, 25, 20, 0)); - } else if ((thisx->params == 9) && (strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0)) { + // #region SOH [Port] DL references are stored as resource paths so we need to use string comparison to check + // for equality. Additionally, we added a fallback for checking the parent actor ID to account for mods the + // override the Tektite skelton + } else if ((thisx->params == 9) && ((strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0) || + (thisx->parent != NULL && thisx->parent->id == ACTOR_EN_TITE))) { gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001300); gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001700); gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_001900); - } else if ((thisx->params == 10) && (strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0)) { + } else if ((thisx->params == 10) && ((strcmp((const char*)this->displayList, object_tite_DL_002FF0) == 0) || + (thisx->parent != NULL && thisx->parent->id == ACTOR_EN_TITE))) { + // #endregion gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001B00); gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001F00); gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_002100); From 9ff49403a86c6c3b31dfc71a67e9f15d119459ed Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:07:54 -0400 Subject: [PATCH 152/267] shipinit (r)ba (#5025) * RBA and BA * move rba to shipinit * make the vanilla condition actually a vanilla condition * update should docs * move ba to shipinit * don't pass things * try a different readability strategy * remove option/preset entries --------- Co-authored-by: rozlette --- .../Enhancements/Presets/PresetEntries.cpp | 2 - .../Restorations/BottleAdventure.cpp | 452 ++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 17 + soh/soh/SohGui/SohMenuEnhancements.cpp | 3 - soh/src/code/z_parameter.c | 25 +- 5 files changed, 478 insertions(+), 21 deletions(-) create mode 100644 soh/soh/Enhancements/Restorations/BottleAdventure.cpp diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp index 3b2167a2e..e09df2862 100644 --- a/soh/soh/Enhancements/Presets/PresetEntries.cpp +++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp @@ -163,7 +163,6 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty @@ -297,7 +296,6 @@ const std::vector randomizerPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RestoreRBAValues"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty diff --git a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp new file mode 100644 index 000000000..c581a325d --- /dev/null +++ b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp @@ -0,0 +1,452 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +} + +// gSaveContext.inventory.items +void HandleBAInventoryItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.items[itemOnCRight]; +} + +void HandleRBAInventoryItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.items[itemOnCRight] = itemToPutInBottle; +} + +// gSaveContext.inventory.ammo +void HandleBAInventoryAmmo() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY]; +} + +void HandleRBAInventoryAmmo(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.ammo[itemOnCRight - ITEM_FAIRY] = itemToPutInBottle; +} + +// gSaveContext.inventory.equipment +void HandleBAInventoryEquipment() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.equipment >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.equipment & 0xFF; + } +} + +void HandleRBAInventoryEquipment(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_MASK_GORON) { + gSaveContext.inventory.equipment = (itemToPutInBottle << 8) | (gSaveContext.inventory.equipment & 0x00FF); + } else if (itemOnCRight == ITEM_MASK_ZORA) { + gSaveContext.inventory.equipment = itemToPutInBottle | (gSaveContext.inventory.equipment & 0xFF00); + } +} + +// gSaveContext.inventory.upgrades +void HandleBAInventoryUpgrades() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.upgrades >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.upgrades & 0xFF; + } +} + +void HandleRBAInventoryUpgrades(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SOLD_OUT) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 24) | (gSaveContext.inventory.upgrades & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_POCKET_EGG) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 16) | (gSaveContext.inventory.upgrades & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_POCKET_CUCCO) { + gSaveContext.inventory.upgrades = (itemToPutInBottle << 8) | (gSaveContext.inventory.upgrades & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_COJIRO) { + gSaveContext.inventory.upgrades = itemToPutInBottle | (gSaveContext.inventory.upgrades & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.questItems +void HandleBAInventoryQuestItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 24) & 0xFF; + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 16) & 0xFF; + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.questItems >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.questItems & 0xFF; + } +} + +void HandleRBAInventoryQuestItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_ODD_MUSHROOM) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 24) | (gSaveContext.inventory.questItems & 0x00FFFFFF); + } else if (itemOnCRight == ITEM_ODD_POTION) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 16) | (gSaveContext.inventory.questItems & 0xFF00FFFF); + } else if (itemOnCRight == ITEM_SAW) { + gSaveContext.inventory.questItems = (itemToPutInBottle << 8) | (gSaveContext.inventory.questItems & 0xFFFF00FF); + } else if (itemOnCRight == ITEM_SWORD_BROKEN) { + gSaveContext.inventory.questItems = itemToPutInBottle | (gSaveContext.inventory.questItems & 0xFFFFFF00); + } +} + +// gSaveContext.inventory.dungeonItems +void HandleBAInventoryDungeonItems() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION]; +} + +void HandleRBAInventoryDungeonItems(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION] = itemToPutInBottle; +} + +// gSaveContext.inventory.dungeonKeys +void HandleBAInventoryDungeonKeys() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40]; +} + +void HandleRBAInventoryDungeonKeys(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40] = itemToPutInBottle; +} + +// gSaveContext.inventory.defenseHearts +void HandleBAInventoryDefenseHearts() { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.defenseHearts; +} + +void HandleRBAInventoryDefenseHearts(uint8_t itemToPutInBottle) { + gSaveContext.inventory.defenseHearts = itemToPutInBottle; +} + +// gSaveContext.inventory.gsTokens +void HandleBAInventoryGSTokens() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.equips.buttonItems[0] = (gSaveContext.inventory.gsTokens >> 8) & 0xFF; + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.equips.buttonItems[0] = gSaveContext.inventory.gsTokens & 0xFF; + } +} + +void HandleRBAInventoryGSTokens(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight == ITEM_SONG_SERENADE) { + gSaveContext.inventory.gsTokens = (itemToPutInBottle << 8) | (gSaveContext.inventory.gsTokens & 0x00FF); + } else if (itemOnCRight == ITEM_SONG_REQUIEM) { + gSaveContext.inventory.gsTokens = itemToPutInBottle | (gSaveContext.inventory.gsTokens & 0xFF00); + } +} + +// gSaveContext.sceneFlags +void HandleBASceneFlags() { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it pulls from + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 24) & 0xFF; + break; + case 1: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 16) & 0xFF; + break; + case 2: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 8) & 0xFF; + break; + case 3: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].chest & 0xFF; + break; + case 4: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 24) & 0xFF; + break; + case 5: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 16) & 0xFF; + break; + case 6: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 8) & 0xFF; + break; + case 7: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].swch & 0xFF; + break; + case 8: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 24) & 0xFF; + break; + case 9: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 16) & 0xFF; + break; + case 10: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 8) & 0xFF; + break; + case 11: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].clear & 0xFF; + break; + case 12: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 24) & 0xFF; + break; + case 13: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 16) & 0xFF; + break; + case 14: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 8) & 0xFF; + break; + case 15: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].collect & 0xFF; + break; + case 16: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 24) & 0xFF; + break; + case 17: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 16) & 0xFF; + break; + case 18: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 8) & 0xFF; + break; + case 19: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].unk & 0xFF; + break; + case 20: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 24) & 0xFF; + break; + case 21: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 16) & 0xFF; + break; + case 22: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 8) & 0xFF; + break; + case 23: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].rooms & 0xFF; + break; + case 24: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 24) & 0xFF; + break; + case 25: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 16) & 0xFF; + break; + case 26: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 8) & 0xFF; + break; + case 27: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].floors & 0xFF; + break; + } +} + +void HandleRBASceneFlags(uint8_t itemToPutInBottle) { + // The rest of the items fall into the saved scene flags. Let's calculate the scene and which field it sets + u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; + u32 scene = offset / sizeof(SavedSceneFlags); + switch (offset % sizeof(SavedSceneFlags)) { + case 0: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].chest & 0x00FFFFFF); + break; + case 1: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].chest & 0xFF00FFFF); + break; + case 2: + gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].chest & 0xFFFF00FF); + break; + case 3: + gSaveContext.sceneFlags[scene].chest = itemToPutInBottle | (gSaveContext.sceneFlags[scene].chest & 0xFFFFFF00); + break; + case 4: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].swch & 0x00FFFFFF); + break; + case 5: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].swch & 0xFF00FFFF); + break; + case 6: + gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].swch & 0xFFFF00FF); + break; + case 7: + gSaveContext.sceneFlags[scene].swch = itemToPutInBottle | (gSaveContext.sceneFlags[scene].swch & 0xFFFFFF00); + break; + case 8: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].clear & 0x00FFFFFF); + break; + case 9: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].clear & 0xFF00FFFF); + break; + case 10: + gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].clear & 0xFFFF00FF); + break; + case 11: + gSaveContext.sceneFlags[scene].clear = itemToPutInBottle | (gSaveContext.sceneFlags[scene].clear & 0xFFFFFF00); + break; + case 12: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].collect & 0x00FFFFFF); + break; + case 13: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].collect & 0xFF00FFFF); + break; + case 14: + gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].collect & 0xFFFF00FF); + break; + case 15: + gSaveContext.sceneFlags[scene].collect = itemToPutInBottle | (gSaveContext.sceneFlags[scene].collect & 0xFFFFFF00); + break; + case 16: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].unk & 0x00FFFFFF); + break; + case 17: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].unk & 0xFF00FFFF); + break; + case 18: + gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].unk & 0xFFFF00FF); + break; + case 19: + gSaveContext.sceneFlags[scene].unk = itemToPutInBottle | (gSaveContext.sceneFlags[scene].unk & 0xFFFFFF00); + break; + case 20: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].rooms & 0x00FFFFFF); + break; + case 21: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].rooms & 0xFF00FFFF); + break; + case 22: + gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].rooms & 0xFFFF00FF); + break; + case 23: + gSaveContext.sceneFlags[scene].rooms = itemToPutInBottle | (gSaveContext.sceneFlags[scene].rooms & 0xFFFFFF00); + break; + case 24: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].floors & 0x00FFFFFF); + break; + case 25: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].floors & 0xFF00FFFF); + break; + case 26: + gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].floors & 0xFFFF00FF); + break; + case 27: + gSaveContext.sceneFlags[scene].floors = itemToPutInBottle | (gSaveContext.sceneFlags[scene].floors & 0xFFFFFF00); + break; + } +} + +// padding bytes +void HandleBAPaddingBytes() { + // Reading from padding bytes is not implemented + gSaveContext.equips.buttonItems[0] = 0; +} + +void HandleRBAPaddingBytes() { + // Writing to padding bytes is not implemented +} + +// Bottle Adventure +void DoBA() { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleBAInventoryItems(); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleBAInventoryAmmo(); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleBAInventoryEquipment(); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleBAInventoryUpgrades(); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleBAInventoryQuestItems(); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleBAInventoryDungeonItems(); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleBAInventoryDungeonKeys(); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleBAInventoryDefenseHearts(); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleBAInventoryGSTokens(); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleBASceneFlags(); + } +} + +// Reverse Bottle Adventure +void DoRBA(uint8_t itemToPutInBottle) { + auto itemOnCRight = gSaveContext.equips.buttonItems[3]; + + if (itemOnCRight >= ITEM_STICK && itemOnCRight <= ITEM_POTION_BLUE) { + HandleRBAInventoryItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_FAIRY && itemOnCRight <= ITEM_MASK_BUNNY) { + HandleRBAInventoryAmmo(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GORON || itemOnCRight == ITEM_MASK_ZORA) { + HandleRBAInventoryEquipment(itemToPutInBottle); + } else if (itemOnCRight == ITEM_MASK_GERUDO || itemOnCRight == ITEM_MASK_TRUTH) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SOLD_OUT && itemOnCRight <= ITEM_COJIRO) { + HandleRBAInventoryUpgrades(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_ODD_MUSHROOM && itemOnCRight <= ITEM_SWORD_BROKEN) { + HandleRBAInventoryQuestItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_PRESCRIPTION && itemOnCRight <= ITEM_BULLET_BAG_30) { + HandleRBAInventoryDungeonItems(itemToPutInBottle); + } else if (itemOnCRight >= ITEM_BULLET_BAG_40 && itemOnCRight <= ITEM_SWORD_KNIFE) { + HandleRBAInventoryDungeonKeys(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_BOLERO) { + HandleRBAInventoryDefenseHearts(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_SERENADE || itemOnCRight == ITEM_SONG_REQUIEM) { + HandleRBAInventoryGSTokens(itemToPutInBottle); + } else if (itemOnCRight == ITEM_SONG_NOCTURNE || itemOnCRight == ITEM_SONG_PRELUDE) { + HandleRBAPaddingBytes(); + } else if (itemOnCRight >= ITEM_SONG_LULLABY) { + HandleRBASceneFlags(itemToPutInBottle); + } +} + +void RegisterBottleAdventure() { + REGISTER_VB_SHOULD(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, { + // if we aren't dealing with the b button, early return + auto button = static_cast(va_arg(args, int32_t)); + if (button != 0) { + return; + } + + *should = false; + DoBA(); + }); + + REGISTER_VB_SHOULD(VB_UPDATE_BOTTLE_ITEM, { + // if we aren't dealing with a bottle on b, early return + auto buttonBottleIsOn = static_cast(va_arg(args, int32_t)); + if (buttonBottleIsOn != 0) { + return; + } + + *should = false; + + auto itemToPutInBottle = static_cast(va_arg(args, int32_t)); + DoRBA(itemToPutInBottle); + }); +} + +static RegisterShipInitFunc initFunc(RegisterBottleAdventure); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index b4990803f..5ce3c2ea0 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1634,6 +1634,14 @@ typedef enum { // - `*EnRu1` VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `s16`) + VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, + // #### `result` // ```c // true @@ -1908,6 +1916,15 @@ typedef enum { // - `*PauseContext` VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `int32_t` (button - promoted from `u8`) + // - `int32_t` (item - promoted from `u8`) + VB_UPDATE_BOTTLE_ITEM, + // #### `result` // ```c // INV_CONTENT(ITEM_ODD_MUSHROOM) == ITEM_EYEDROPS diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index c2f425898..fbb2a8378 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -999,9 +999,6 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("QuickBongoKill")) .Options(CheckboxOptions().Tooltip( "Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him.")); - AddWidget(path, "Original RBA Values", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("RestoreRBAValues")) - .Options(CheckboxOptions().Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure.")); AddWidget(path, "Early Eyeball Frog", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("EarlyEyeballFrog")) .Options(CheckboxOptions().Tooltip( diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 8c93b8a57..bf0ba6a1c 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1517,8 +1517,10 @@ void Rando_Inventory_SwapAgeEquipment(void) { (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { - gSaveContext.equips.buttonItems[i] = - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + if (GameInteractor_Should(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, true, i)) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } } } @@ -1674,8 +1676,10 @@ void Inventory_SwapAgeEquipment(void) { ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); - gSaveContext.equips.buttonItems[i] = - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + if (GameInteractor_Should(VB_SET_BUTTON_ITEM_FROM_C_BUTTON_SLOT, true, i)) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } } } @@ -2703,13 +2707,6 @@ s32 Inventory_HasSpecificBottle(u8 bottleItem) { } } -void byteSwapInventory() { - gSaveContext.inventory.equipment = BE16SWAP(gSaveContext.inventory.equipment); - gSaveContext.inventory.upgrades = BE32SWAP(gSaveContext.inventory.upgrades); - gSaveContext.inventory.questItems = BE32SWAP(gSaveContext.inventory.questItems); - gSaveContext.inventory.gsTokens = BE16SWAP(gSaveContext.inventory.gsTokens); -} - void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { osSyncPrintf("item_no=%x, c_no=%x, Pt=%x Item_Register=%x\n", item, button, gSaveContext.equips.cButtonSlots[button - 1], @@ -2721,11 +2718,7 @@ void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 button) { item = ITEM_MILK_HALF; } - if (CVarGetInteger(CVAR_ENHANCEMENT("RestoreRBAValues"),0)) { - byteSwapInventory(); - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; - byteSwapInventory(); - } else { + if (GameInteractor_Should(VB_UPDATE_BOTTLE_ITEM, true, button, item)) { gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[button - 1]] = item; } From 47c653a0e539559dab449a81a6bf2c95e8280890 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:32:32 -0400 Subject: [PATCH 153/267] [Rando] Shuffle Crates (#5017) * location list + enums * add identity function * add new files + hook handlers + settings + crate struct * add dungeon struct + large crate locations * fix wasteland name + add overworld hints * add dungeon hints * add to item pool * opt desc + check tracker + overworld locs * add VB funcs + fix fire locs + dmc crate + shuffle crates not pots again * fix crate option def * fix gy crate area * add ow locs * context + more location_list * fix kak crate * add gv child crates + make exceptions for OOB GF crates + fix GF rht name * finish adding gv crates + align GF child crates + fix adult GF locs * fix VB draw + adjust color * begin logic * add child archery crate + overworld logic * deku + dc + rename dc locs * gtg + spirit * fire temple logic * start water temple + some renaming * finish water temple + renames * fix dmc crate * remove child GV + GF crates :( + simplify hints + french * fix dungeon hint + add french attempt * cleanup * smol crate loc list + enums * setup small crates * fix fire temple fairy hints * add logic * fix small crates + locs * align GF crates without moving * add child GV-GF crates for No Logic * convert to shipinit * whitespace * remove old comments * assets * proper cap * better comments on not-shuffled crates * update for context changes * update for rest of context changes * cleanup * fix shadow hint RHT * more cleanup * count to three * child gf logic * gv cow crate * loc list spacing * remove redundant small crates * remove left over vb funcs * split out location list * fix van spawns * move NL crates to new type * rm whitespace * more whitespacing * more more whitespace * update VB * restore support for custom models * prep dungeon for develop * update context for location changes * finish context post-develop merge * add heart crates to CSMC * update loc list + logic fix * update breakroom crates to adult only * newline to make github happy * revise vbshoulds * formatting sheesh * update vb info * BRACKET * whitespacent * ws finalfinal --- .../objects/object_kibako/bosskey_crate_top | Bin 0 -> 8284 bytes .../object_kibako/gSmallBossKeyCrateDL | 14 + .../object_kibako/gSmallBossKeyCrateDL_tri_0 | 11 + .../object_kibako/gSmallBossKeyCrateDL_vtx_0 | 26 + .../gSmallBossKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallHeartCrateDL | 14 + .../object_kibako/gSmallHeartCrateDL_tri_0 | 11 + .../object_kibako/gSmallHeartCrateDL_vtx_0 | 26 + .../object_kibako/gSmallHeartCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallJunkCrateDL | 14 + .../object_kibako/gSmallJunkCrateDL_tri_0 | 11 + .../object_kibako/gSmallJunkCrateDL_vtx_0 | 26 + .../object_kibako/gSmallJunkCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallMajorCrateDL | 14 + .../object_kibako/gSmallMajorCrateDL_tri_0 | 11 + .../object_kibako/gSmallMajorCrateDL_vtx_0 | 26 + .../object_kibako/gSmallMajorCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallMinorCrateDL | 14 + .../object_kibako/gSmallMinorCrateDL_tri_0 | 11 + .../object_kibako/gSmallMinorCrateDL_vtx_0 | 26 + .../object_kibako/gSmallMinorCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallRandoCrateDL | 14 + .../object_kibako/gSmallRandoCrateDL_tri_0 | 11 + .../object_kibako/gSmallRandoCrateDL_vtx_0 | 26 + .../object_kibako/gSmallRandoCrateDL_vtx_cull | 10 + .../object_kibako/gSmallSmallKeyCrateDL | 14 + .../object_kibako/gSmallSmallKeyCrateDL_tri_0 | 11 + .../object_kibako/gSmallSmallKeyCrateDL_vtx_0 | 26 + .../gSmallSmallKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallTokenCrateDL | 14 + .../object_kibako/gSmallTokenCrateDL_tri_0 | 11 + .../object_kibako/gSmallTokenCrateDL_vtx_0 | 26 + .../object_kibako/gSmallTokenCrateDL_vtx_cull | 10 + .../objects/object_kibako/heart_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/junk_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/major_crate_top | Bin 0 -> 8284 bytes ...lBossKeyCrateDL_f3dlite_smallcrate_bosskey | 21 + ...SmallHeartCrateDL_f3dlite_smallcrate_heart | 21 + ..._gSmallJunkCrateDL_f3dlite_smallcrate_junk | 21 + ...SmallMajorCrateDL_f3dlite_smallcrate_major | 21 + ...SmallMinorCrateDL_f3dlite_smallcrate_minor | 21 + ...SmallRandoCrateDL_f3dlite_smallcrate_rando | 21 + ...mallKeyCrateDL_f3dlite_smallcrate_smallkey | 21 + ...SmallTokenCrateDL_f3dlite_smallcrate_token | 21 + .../objects/object_kibako/minor_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/rando_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/smallkey_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/token_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/bosskey_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/bosskey_crate_top | Bin 0 -> 8284 bytes .../object_kibako2/gLargeBossKeyCrateDL | 16 + .../object_kibako2/gLargeBossKeyCrateDL_tri_0 | 6 + .../object_kibako2/gLargeBossKeyCrateDL_tri_1 | 9 + .../object_kibako2/gLargeBossKeyCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeBossKeyCrateDL_vtx_1 | 18 + .../gLargeBossKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeHeartCrateDL | 16 + .../object_kibako2/gLargeHeartCrateDL_tri_0 | 6 + .../object_kibako2/gLargeHeartCrateDL_tri_1 | 9 + .../object_kibako2/gLargeHeartCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeHeartCrateDL_vtx_1 | 18 + .../gLargeHeartCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeJunkCrateDL | 16 + .../object_kibako2/gLargeJunkCrateDL_tri_0 | 6 + .../object_kibako2/gLargeJunkCrateDL_tri_1 | 9 + .../object_kibako2/gLargeJunkCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeJunkCrateDL_vtx_1 | 18 + .../object_kibako2/gLargeJunkCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeMajorCrateDL | 16 + .../object_kibako2/gLargeMajorCrateDL_tri_0 | 6 + .../object_kibako2/gLargeMajorCrateDL_tri_1 | 9 + .../object_kibako2/gLargeMajorCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeMajorCrateDL_vtx_1 | 18 + .../gLargeMajorCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeMinorCrateDL | 16 + .../object_kibako2/gLargeMinorCrateDL_tri_0 | 6 + .../object_kibako2/gLargeMinorCrateDL_tri_1 | 9 + .../object_kibako2/gLargeMinorCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeMinorCrateDL_vtx_1 | 18 + .../gLargeMinorCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeRandoCrateDL | 16 + .../object_kibako2/gLargeRandoCrateDL_tri_0 | 6 + .../object_kibako2/gLargeRandoCrateDL_tri_1 | 9 + .../object_kibako2/gLargeRandoCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeRandoCrateDL_vtx_1 | 18 + .../gLargeRandoCrateDL_vtx_cull | 10 + .../object_kibako2/gLargeSmallKeyCrateDL | 16 + .../gLargeSmallKeyCrateDL_tri_0 | 6 + .../gLargeSmallKeyCrateDL_tri_1 | 9 + .../gLargeSmallKeyCrateDL_vtx_0 | 6 + .../gLargeSmallKeyCrateDL_vtx_1 | 18 + .../gLargeSmallKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeTokenCrateDL | 16 + .../object_kibako2/gLargeTokenCrateDL_tri_0 | 6 + .../object_kibako2/gLargeTokenCrateDL_tri_1 | 9 + .../object_kibako2/gLargeTokenCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeTokenCrateDL_vtx_1 | 18 + .../gLargeTokenCrateDL_vtx_cull | 10 + .../objects/object_kibako2/heart_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/heart_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/junk_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/junk_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/major_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/major_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/mask_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/mask_crate_top | Bin 0 -> 8284 bytes ...eBossKeyCrateDL_f3dlite_crate_side_bosskey | 21 + ...geBossKeyCrateDL_f3dlite_crate_top_bosskey | 21 + ...LargeHeartCrateDL_f3dlite_crate_side_heart | 21 + ...gLargeHeartCrateDL_f3dlite_crate_top_heart | 21 + ..._gLargeJunkCrateDL_f3dlite_crate_side_junk | 21 + ...t_gLargeJunkCrateDL_f3dlite_crate_top_junk | 21 + ...LargeMajorCrateDL_f3dlite_crate_side_major | 21 + ...gLargeMajorCrateDL_f3dlite_crate_top_major | 21 + ...LargeMinorCrateDL_f3dlite_crate_side_minor | 21 + ...gLargeMinorCrateDL_f3dlite_crate_top_minor | 21 + ...LargeRandoCrateDL_f3dlite_crate_side_rando | 21 + ...gLargeRandoCrateDL_f3dlite_crate_top_rando | 21 + ...mallKeyCrateDL_f3dlite_crate_side_smallkey | 21 + ...SmallKeyCrateDL_f3dlite_crate_top_smallkey | 21 + ...LargeTokenCrateDL_f3dlite_crate_side_token | 21 + ...gLargeTokenCrateDL_f3dlite_crate_top_token | 21 + .../objects/object_kibako2/minor_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/minor_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/rando_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/rando_crate_top | Bin 0 -> 8284 bytes .../object_kibako2/smallkey_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/smallkey_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/token_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/token_crate_top | Bin 0 -> 8284 bytes soh/assets/soh_assets.h | 48 ++ .../vanilla-behavior/GIVanillaBehavior.h | 32 + .../hint_list/hint_list_exclude_dungeon.cpp | 37 +- .../hint_list/hint_list_exclude_overworld.cpp | 40 ++ .../randomizer/3drando/item_pool.cpp | 12 + .../Enhancements/randomizer/ShuffleCrates.cpp | 548 ++++++++++++++++++ .../Enhancements/randomizer/ShuffleCrates.h | 16 + soh/soh/Enhancements/randomizer/context.cpp | 15 +- soh/soh/Enhancements/randomizer/location.cpp | 24 + soh/soh/Enhancements/randomizer/location.h | 15 + .../location_access/dungeons/deku_tree.cpp | 3 + .../dungeons/dodongos_cavern.cpp | 50 +- .../location_access/dungeons/fire_temple.cpp | 59 +- .../dungeons/forest_temple.cpp | 9 +- .../dungeons/gerudo_training_ground.cpp | 6 +- .../dungeons/jabujabus_belly.cpp | 10 +- .../dungeons/shadow_temple.cpp | 10 +- .../dungeons/spirit_temple.cpp | 33 +- .../location_access/dungeons/water_temple.cpp | 186 +++++- .../location_access/gerudo_fortress.cpp | 36 ++ .../overworld/death_mountain_crater.cpp | 4 +- .../overworld/gerudo_valley.cpp | 8 +- .../location_access/overworld/goron_city.cpp | 2 + .../location_access/overworld/graveyard.cpp | 3 +- .../overworld/haunted_wasteland.cpp | 17 +- .../location_access/overworld/kakariko.cpp | 70 ++- .../location_access/overworld/lake_hylia.cpp | 3 +- .../overworld/lon_lon_ranch.cpp | 1 + .../location_access/overworld/market.cpp | 28 +- soh/soh/Enhancements/randomizer/logic.cpp | 8 + soh/soh/Enhancements/randomizer/logic.h | 2 + .../randomizer/option_descriptions.cpp | 10 + .../Enhancements/randomizer/randomizer.cpp | 311 ++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 2 + .../Enhancements/randomizer/randomizerTypes.h | 305 ++++++++++ .../randomizer/randomizer_check_objects.cpp | 3 + .../randomizer/randomizer_check_tracker.cpp | 34 ++ .../Enhancements/randomizer/randomizer_inf.h | 254 ++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 3 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../actors/ovl_Obj_Kibako/z_obj_kibako.c | 7 +- .../actors/ovl_Obj_Kibako/z_obj_kibako.h | 1 + .../actors/ovl_Obj_Kibako2/z_obj_kibako2.c | 7 +- .../actors/ovl_Obj_Kibako2/z_obj_kibako2.h | 1 + 174 files changed, 3667 insertions(+), 119 deletions(-) create mode 100644 soh/assets/custom/objects/object_kibako/bosskey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/heart_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/junk_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/major_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token create mode 100644 soh/assets/custom/objects/object_kibako/minor_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/rando_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/smallkey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/token_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/bosskey_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/bosskey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/heart_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/heart_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/junk_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/junk_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/major_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/major_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/mask_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/mask_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token create mode 100644 soh/assets/custom/objects/object_kibako2/minor_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/minor_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/rando_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/rando_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/smallkey_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/smallkey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/token_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/token_crate_top create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.cpp create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.h diff --git a/soh/assets/custom/objects/object_kibako/bosskey_crate_top b/soh/assets/custom/objects/object_kibako/bosskey_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..4b055671e4805a8800f673465022fcc70335858d GIT binary patch literal 8284 zcmd^EPiPxw7I*d%8xd+FmW?nWI|x%mSQdK^3%cyqCX{Fprk*vsWe{c=j46{+g58@A zyF?~*BVmFigwqHiJHlj>A%u45Nx4PFl**VA31ea-d z>ehJXFmo_nRmvQgHJPDu6JB-s&;WtNNok}`BU76-gA$_VN^=jv= zoSh@0+jkoHfCG*qeu%&|bzOO4lT*$bBrAszc#7G0F5j4gRVtb4>HG-)%zTc{95{{Z z$(0GGL1Z%#${+B`6@yhH)CH&R)bVS<#<$$-@0=YxjnFP}4pDH0ESM3_X>bM6RCOik zo~%r`Cz)zGt{Mn+79oZbV|IwC$XI0ocMZAL-9Gh5&V+l;BBJ1PEuDi=C;Zq8s_p#Z z$^<`lZn_Hm9yBmd`>Q@N513qoI3QdF2S|FS>){R8<;r|>hV0znGq(?k`_#)cBu-oT zrThftcN&yFZP9N?w0WR6kzXWJDTD*T1>#DQ>j8mJMKb;h?vR`qX;@X*bK$9h zQ4RNGnS4Ud{33LnwCvRW*oa|{?j%OQeS>nRt;zk=UTP0qfl_-@&`sI`2O34V(uPWo zAi2<(O}i*E^$zZAXmKuxJC$HgG#P4T`2>>Ar}h#tqcplRdTZ$1|2GZK1hhH~`h_m^ z-Rkg7ju`^sTgF9K9r0gRjts{0dr-&W8Z%gRb$BK*qGXtCyQJWE z4A120**9YtHzp(XiWxgf;6`{Do{=?7nID7yo0I!fV`=((g?Rc}=%= z#jR(0o_F-FootwOTqg_qee5bkcua+|C@heb4Lu)OtZ`|K9sl{R6s#o>F_7 zX$_N_XD!Gtt$+jKuOywinSh;k((wQv(U;oO{)ts`a^JD;J@>zC9e@rypHKtP7Hr-5 z-1FMYo@bA{#~q*2`ycrqwJM#*<(H^rv>tp!{9p8MWLc%D`@*(Xey73u>C|bfNPc7q z;+qNWQKsUV?~Chx&EIHMTZhoVV`BPV_s!9p&JBFNYA+N0=xwXw&jP>Nd9q>;zNE^Zh8PC$?Zq-@21x1jRE_w z(SAmW8l(^9<1I+<&w5#ZwpD?RH~bC%uV1f!U3rv!WP0!UmG))7%D4V(JK1zq`?LV^ z<{tb{YKsvQ-xm)M|4XuW6D=eEI+6SrcPIDJhcV9~n}MqNORdA!3qR|b-Uw;yi_P1c z=EirM7dEq-rAM(x*X}<9?cCq>V(nzXK~`t()Xa!_5BZ`0i@WeQ=|Mzx_#Qh-^n2)h z;lU>=KdTb*UC{57yUf9IzjpcFVL4m8R{XH|;q5Q}X$Eu~-?#r|-oAEo_2#piJ2!WV zv*mgk85a@E=oLz#*I@h&UnL4WU%Y^sNOvFfG%FY8{|Fy`q1|-mpwR5xXdBSKN^fpt zL9-k0HP#y6HTM3!w)yS7tCXJJS8TA4k_-&bnL_+X{GS8<488n1a-UPb4&6ik96HaO z#oYydMgAxGN4nvPWWagbemaTFRssHb@BG#^pkDy~1zKREw7CZx?Bd;pXUDDM>3O2k z@=_g87ZNe8Kf_l?QGt;C(SHLU5^MgEdW0vD|J^dOw4itq)}nWMpLUkJkNtIez@weJ zCa{&DiOuX*?9sQriO5ejCnP&!E;BcINbM(r`Zu~WH3o^G_iTwBEB)BjWw;L--&xaQ{PaPzpJ?Yu+D`$h_>ol-(peMr$+Hp#B5=#0Yj7!A`^x z+e3bEK>X{-$q_#5kJSF@D($D4V8uX&eb;^;I)DbYzSy`e_@#}~mPGxt!_HFP;ZA~H z6YOSSKgb``{0r?@X>0CofD2U719mU03a9vq5yYQ#|JBeZpF4>d1Qqbi2EhmCbBus{*2aFA7BSS*+zHR=`fz?Z?w8}0>EZgj_^NF ze9>S<@)$S(AxC)L)5)WE-6yI8csybreiv(PJWaJ;J2`p^vl+cs;$Ll8g8YcTi@U71 z8qw4e@!1DRM}V9h=wIuPW}X0<=*;Ive4?SeBsul*!> zPOV9&2QNe(W&K6|8C@0I^e7E�DB>zxP+<{Aca3>01sa@&#-EWS5 zMm9h;^t1kY*X#KH>%t-|){`0IVq?gsCkUB?sWGiTi4poGKFEx`vm$(U1o`bye&jzZ zSc$9H+NCHLPQCc*>14-;A7-g}`2AL)X(59JGq~qROlek;+2d&|F(UQPG!v9tZAtl& zhnbHj;QgqGijOR1Lena>c&c)c=_1DOgiZ1h^XI0{^7)3%>&CQSrRL7n+O_XjN-A?a)(> zXcOswcIkhHsqcEPm-h|3JS`yW}2o zuK?d?y*zXB!;`G(YHB~|KeGBeYp3#wH~vqxlv`(~!A>eT z?_kWJznre30wMoM{3G_oQ@{b_$1Z?98Sg^>8(t+oJ)*EpQe3$Lm+17Gqc`YAiC^;9 z+LzmxJ4>C<@{Z&PMl~qp!KsJ%Mx=kS0Ps16HOOAz%7OgApQHRDZ=eNa2NJnq&L}niYF<28Y`~qj z$d6tCvW56FMpp5O3Sxyqx57@v!s#y0MVwmq4eU=1%(m9MZ;yUPXMkNvp-G9Pr-<^W zHIRRq*F|=TK{-`hU>`vHNBW;J%uJP55dw$wBCg3is9Y4bkN?lmodmFOk1%2D)VouL>bQFb4@b+yPW+jM@?jJczWH>;6Tv=5E-ZT;i|OoS$rc4-YUR{28fS+FLcFDpZ$(K9@?M#FLq}n z`n*zTdpv_=gGAg=o76ecVP#Y-)o*G~_a9gn_QcKz=T$__9I#Kt2d5u+win=YpEQC| zsC?W->Dd-*i`Eo5?b}P8o(@LmeR5KWUpV*520O44Prc(xh-KKm|w8=ilzhL!~$&s~LhGR9oQdL@!#r^cNde}}ub z@O%@Ji9Vn;eUE*WoDcFBy$R6=#;> zUM=_X|2f`;vrS|bb~eG=1b6h|JATVZ^%?Oe{%=fuh#Bn^2~Q)BlQGenSh+Wtf4C-A zwNH6aJou(|zu`(i)s^(yOemi^TJO0o-{Km0y!bsiv9;q2`_6DB&JKFgFcxH{%tN>OA3n6F zatd^4j63m=2jyR$D-Xm#Z_CwrWfc}W48HM;D=O(Tjyp@_G2}^Wi|#{3bE?Ay<$&C9 zuE-3XqHamXl#%cr%&zcVh{SuWZp-)xSNQ#fFX{~CGr+>!U^aCSo)9qCqn3w#1Z#ng zr&h?lpveqD#hqwVye5zvJCWcn(uCSc^^5W7PgEwY++qDD7s3g$z0`kH9nl7T1Kg5- z;X0w~3;&_~(87RE$au-;qFbpVtSEZ+A-*OY$jXYV|I?L`z}IKQ#GVbSiHG$<=|y(c WAFh-OtATfp(+{78qk`|i*Z%`M1f4Vh literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL new file mode 100644 index 000000000..c42484ebe --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 new file mode 100644 index 000000000..96b7903de --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL new file mode 100644 index 000000000..1fd3a1f8b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 new file mode 100644 index 000000000..bbcb5c4c9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL new file mode 100644 index 000000000..e0d09ffa4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 new file mode 100644 index 000000000..a0af63d7f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL new file mode 100644 index 000000000..9999462e6 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 new file mode 100644 index 000000000..6eea14d8c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL new file mode 100644 index 000000000..8237aa0e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 new file mode 100644 index 000000000..c1c8d6cfc --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL new file mode 100644 index 000000000..17467a73b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 new file mode 100644 index 000000000..6df8755b2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL new file mode 100644 index 000000000..e3cc0ebe1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 new file mode 100644 index 000000000..692fd7ec3 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL new file mode 100644 index 000000000..dc73b6089 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 new file mode 100644 index 000000000..88a23f0e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/heart_crate_top b/soh/assets/custom/objects/object_kibako/heart_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..f5b47bd092e88a063328f34c17caf883277ded00 GIT binary patch literal 8284 zcmd^EPe>eD8rSt;`XH?gi=9JAhapVM9M;_2)3!7VDTYBB7j}y#tihAyFyy+w-}k*&)skIy@9Rfb zy{dZe{l0(i`@Z+=>FMeD%OC$V(Tn@p-=B2&L-T+B`we=g%})p2{X zn3xSX#tk*VQQ^GWrk-?UJJ)6##1`B3S>Afkos8EJhELBi{exV47QdX2KENwX$|iY@S$C+DR2*5A}bCh&=%%`{m4Z@T4<|$!k_T!3y*?Md`ir@A#pj~ zDjpQT0WCmu`VC2a5WQ$;UVTcQYkMjI5Y=w99p=N+4By2m8J`TrsagIgbN+M1&QG{b zx;0i#Ws;dxrg)g2m>Hmkh*sPiqRT?diwZ{9$`yKpc4SA3r z6nMc+%sCUE8E~l=pb9^f0^E5%c&=bfC0mivezt;sZSZ5rYdig;Wy(I-JJ{Rve@+*A zEq$mB`{l#?U^wc-Zy&xnujBLIlbJ*&(VL(zmQ&@Z=LOgX@8Km%YYLv5V_Tv zFQBI#sdsogeGmQ)kMSdX_$EAL6rPA5uUHklYKv=xZ@S5TmHr%4N|nT$Awj}$Fqq+p z^zL|ndKW&AJF^a>Wey%%ShDz(9q3qx8VfWtF{4C3ZE>Ai(%7L_%nt<1AJ-b^PGqn$ z7~QaP3`ulnWbi*){;S1@p88VYl{`{E=8pEiBh^VLf2b!|w3H;l#%h6N8Ii_eJOm=5 zW+ARwrZ6#o=zsL^qQxJC^h8(wX&;e?_|RTjVx+!dTlfQyR$AJNny20q;z!p0$r7Zl zFj5!djFgD`i1fKO<5KZ(`DKI;-Kz#gcGaoobwS)!oda9!7-5qK;0ro9=mUWZ8)p(3 z=0VC{WK4_~fsgEkH_TJT1B;*N9W6(45j`zA0htxV9A&>MXVI0quzE1sgFRBu>(_{CAzk(b?Ym&ef*3v$k`(wdUW*eg;jHmBtY5)dNz*2M3Ce z`x3N){Fn&U^z9R>aU%U>IOVv?C-lzU^KDCt}h~!UYBAebE+I|cP-|d|~ zd(-rQ@~Y`IYdc?UeZ2W)r*ZslXS#k|JE~VVhHI1cvCV$vp*}u0Sw0Lh}Wq-pBZg(0tL};&%hkf?Uz6#P9$1{_x*cEAemR`t6Q?C-~a` z+Q;3m996%6@=5-I8%V5grGQV_F7#$&y7ndZ`0%{SELI=!5tk;c{K-su7g3s(R|VcR z-MmbhYeOrGKkSqAY5l=EB)3ni(9Atbzj$wPb?E8k7junU{&%_xt^O|{t5NF0K(39S zPyNrfxpQC?wD@9w*j=+u>(gJZ)~nR=$^mQ)O)KL1q;dg|z&HL@C;1h$xUyfbb{fH1 z>4ro@WB|24v%2fdDt4TRh(B$Of!+8v{=e! zAsigkk2~K4XZdCIKa0=&3yHA;BKet-s0FMFqyHXo$^63==)@jfc{){pwf=Ggo<`&l z|H#M>$=8nrUpP>%nl;LQGtTwL_@nYCN)GmNTFZ0a!pa+a1o$9y0>4!I6MwX%HMsj( z^)=S?4N3^2{>cNSrOrd5MpSQ%0OBR}xP2f)MnGWj4!M)R-^ziq9(Xv{oN@9V~A4&e^h?8;z$ z?o~`wj_{#<;&bh8zJ>qS=z&BL?Ju&WaX|b+o>ec<&>|yL>(=%Yu72*r$NN(z|7iZ@ z%-r9z4w7t04&sapR{t9RHFo5eA6}_`|KmR@hu>nY-}Ub<-0>L&?%;=Kw(!hVZ|U3k z{XaKG@-MYkVFhK^-(W9MRWjUT9%}*J9U&H5e6CVtJgiCXgLD4&$lfV)n_8F}h*rI5 zo$_n^#W&;tcW=EjS6G%AWR@`#f0D4jW_4svi8;iVS_J6xM*c2*>d48*TepsG@0~WM z>Qz}`3+iLW;uhOvfc2yLtK)Z%Jgw|_<$hB$aH>qplLx75AwSVgE<#S~j(-x9oLq&g zV|n2=fs0a$OiRVFDDsD# z)FyYPkKR4M=InFdW%g;Za~Om7nfe3%FZj?cZ6NZ?`kM_ReAJ(r-}mDj0r?+wId)2D z;S7O0CcpaRlg3E(3tjn$28Jr}&FRMD#w}-mu$L7xV~3ocU}V-AYv~RM`>%8I!~RRm z#s%05t*rI`R5^=PSIm+psg!v?pobKfwrZW(&eLZ#WWdQE4kQww3V8PB;MuO^-PQJRiqX`MdZN} zUHB#FAN7C|Px#n^rLbCN258y*#P%n@d|a<0Cc4c_!AS6!ILxUM(M9jbs(NbYkB9na zR#*L}TgmsM&bO3VXf@N2BJk!mo>J6QTv68dl zq>wETeb%j{cWwLyYRuwO7kaKrAK@O{;wLkXY7!b$E0Rl|7;E14DqOFdmwx%@)|JPv z?;lwt)~n{kveFfQ5&zZyZT#oXgz~fMW<=%*d^dg~GX_4HA-Rs&2j>=O>&dc=X>%u< z&(h=g1u_}0qI7yrpl9&d+w7|KdwNG(?9V-Ah>!S)EQ_~@fT8??k8?!!B_}+COe2cR zc@6NCFRc%Bwe!kKk5wbld452C83P#q^b88;4~U86Q1NL2#z*F)sQzO9g?&+*ur|!b zxJT#tFiyy&TI5^$I%@+ZMs*umL|ZZ^a}B?{h(E^un1OpelEgpB2Gp>F|3ujOU+@ho zJ%i{ZoZP^lwJjD8@u@$=dPIAz?KmH`OetvF5Fh!+O0V%(bw-O}hG_q-`ycgQNC6*_ zILa2=f(JY3Gq1D>bigafS_b;XH`PCVJ6U2qJc{fe5G6*bYz>X^Pe28l@UU3#*-K|3TXw`OE!Wq#A1JgLW7z4`GS zpY_VO`c-XW@f1~dx$tBApC7THtO@$FRw~+xo{WcyuhGLf+W3L2Wv*u-`Nr?~8Z-B( zuZ$xu$4WiQQG6>aOJ`QU;%o+A`WQ^KZ7;o(lk;SH%3I=~A22u{pM>D8SPA+Zv!ipU zdu?0iAOa~u;vBY*+`|#)-k$GcW-<6&D_Ap(BYFnF*o}(&+!)1Vgi%Dpx5KeA5BMQBt*L@Fl)#KdWVpX?SAv0nf}XUGq_1khPOR6b_U}`$grjTyi!=#%NeV z$V7Ey0LcORpGW3&EpubZ6^1oID`qp9t)QTwP*P5XNFY^KK+0wj6cjW`)ym9bGP9td;J^e%EP`e+ zG~B-sKYsSD(^vLX?R5Fx{y2T!^WCjGy?&>~QJI2uaq$d}8Y3kG63H{>gaq;~2{PwtT4^LY5wcOo} zwLUl2GKZ+m_fuM@uY8C%j?y$z0yf< zbVZBxP`e`uo}SLfo9oNbY}o(l&u!~{>o(SyX=y(9-P6u@xwNB}ivGnz+Tb`iex_vg zoC-=>c7FZtB879yi+#iX;5h8lMzhhZO9h5&P-O%iEi2(5#aB->(2l)t#nJtf6Af<= zb>br;72&PpEwhhj9cE3lffSxiBICN8ku23(&UMK z$62qp7?aazHaLQR@c^Z<-Hq_|kU9uH+LIZ{0_!2!V6$#zbpEz_SVc-oat#X%j&MtL zB!4_L$l~vZfBjne>k;^rhFvYgy|krg_WH)oc&6+>ID%LiyWNwm_pi@yhvoOfe^=t8 z|Kvm+vKE1KOJ)49y1KQ`NT?*SIaW`ck}L2Y9Px5npTJ)a_oKt|u>8+h`{R8okcg?t z_^a(>d1#QWVk0&{^JriC5Bs1|Ev>}QZ=Nlj2&>&;Y0eIg;|&$~H|`&mkO(AUfX4IjIa#R1_v&^abdw zQSXVr(G1(8JLdoqPi5xzgN>&1(tkQvUuvmpyrG}PLEjN=83xo`d>VN5_~EV`@Jz!1<^nFK~jpKL7$d7 z^8IjF-oH}eLC4zGK+iAz7<{6f98`DePtE{Npt3&^XRhh#c%rp@D$iesgQ7<@wiiU6tn(uaOoXUN*0}*6foj=OfN^Aa-kGcO0j+4{P z69^z;`Lemacq18BG|(b3D@B|9K~kF z!9@!C$X5Q*>al9})cf{@6PWW?dGHL>!RJ>XbvgQj-^DaWc?Q2EXrm+g=Zy^fu2%oi z%yIC&b>}Y9wSQ};Xl4~=M1xBr01Mbx8doD(&L8nZf&SQDe4hT&B>z%NjV0qN+=xHx zins05c_Lm<7&+>SBrSd`8D|cD$NoHHfANjoL^Pb$(Fj+9WVn*#%z!dh56MviY_$L~T z=S06Fp3MC6agN?RagRlke|%WWD6IGsA8C~X|66@lyWn&FPv=;M8NI{PW{;>zV}H(_ z)CC5*fkeUGjK;iWEwKef(oD4GH8eKAgd= zJR$$3`ivj_Ma>gA>sW(_W)RWG$#eCqG` zBd*H>aPiK7&r1L6OK)khAX1_S@ofFY65Koe1yM-yDKvsQAM^_UCRwOxxp2$?c0bOnnjiVte)*(SEyU#5&$$75kI_ z;|=`O9_jogj}-n-K#OngB7qUr_KdXLWbs6N#M{2|cpnv??+PFq{ovofaz|v$*Z=zc zJvp(4?0Q*Ut+de_O~ehhu|SNV4|Y!M@cqI22WMf+o(V+IZ1xdeN9PKjPQqiyme+yM2ew zce_@U6*1Xkw1{Mc)e39XLX&mnXmQ%U`NvGqLl4JL(uZ&8+?5zdo=~2@vvOKp+k97=a22sedZU#hzPuarC$1}B;H}{xSL~1%U5>%w| zUH!s|B=wG@>RI~ByB$~U4}Kv;|9C*I^$cFk#CFjO?L;fh=`jaQ=sayW$MgWY@mF>e QgISwALI=;Rv2Nqc5td^Jv>+Uyk|o_yo!FUG{xu;GE8$>BND-^lb#duZO#nh51l=Kx%X@{q zLK;C32;qN)yh2_f-#4?%r7YiF(ge{!%O$zoZ)SFOW;pEidc8kS|MYZ&rD_5tN0m#0BHoMKP z+E?f5ygz>(zJb2azkmKd-|SZPvV66B+^NnS#nCU8PktG!oAqf0TI!6^s?N6AcHNAp zod22>pWLlaIY#^n|82OcNy~C$e}->lMqozwx9f&a#fNM38KsB(@u7l@=9q1-@%I<< zSNm-HHe|a#0e|1hFVYA3!;IN>JY7Ny+0+Jzs+9;lnBz(Hhzddi!#gzsYZKOWpi`PS28ONtIUVF+BpipGQi-1KFL~S<>F_O=(K$^Zbk}JC4BUQlAjc%N(POU7S5-gQW48 zILdxxJF0uPy_^35-Htk_|3CO~efNRB|^RDq;T*%N|og4ow%IG6i; zswL%if%wvJ7(BP9-p!UznWB&%O{WD1AbEQ$;r{p!rAx_)Sjs(R5zEc?&i1{IsCY?B|M4^_%1pkLIQu` z@u~d|5-_QWiC~L-U0HFR)Q(r(o5aLo3Dl*ZH!duFgI%9A4zEtcSGvT<+5$r*?jVv2 z(J)s+yrkvI@KhNvREY&NEMk2_#VcL;f@I zz0EO?WcIhJH+DQQwu4`AHjz+vAZHKgA}2Kq9Vjotqacc|s4pd;LxaU7{`zE)^)4l! zT$a^&hB%xJFY!4KeL!bt`8nM+-s#>|d%M0u`}6C+*g^jNtWV3&ktL#c+MkgDPT~K8 z{6%tfk-wiiq6KPPXM~q*fLXwK_G$UFe9CRt#|z)I1koAoFW5iwhHv+`%nu*?=J;x7 z$bj_9r~q3MzT0BKiM699C^^FMgJw12_Dje$G^M5E`q0H z-cR(G!Pnud<#B(`=eG6#BLn=1^8*|E4Nqy0h@_f%&jQG+;cB>kT0fc6p)WFW&KU@3)Rvei<-W46G z?_qn1pA;TV^-o*w`T*_<9}nm!ReEv&9>hmGO~`t*_y!}RoNua*y!WlnSpQc3(M<~P zlJ|8cT7r5)!J(|6OAZXiBDOI?NR(j2@fHy5Z)ETs@moUd+ixTSb>-(edHr?erv60} zY!BTGhr02U_f_luJj9=ov3Q%v=3)JP^xf=$|IM$zkAIwjGIw}sQ7GN@b&;92;&uai z2gvXI@7;}wkpFb>LnOGshy0>Pv1zOV_Siy5b{ltG=~g-LhE?J^S+{CjBkTUDk3R+C z={B3w-qh+Z@I(F~_>A<7_d<#pcxY{$>)< zFx%5yD|iLf19jx%Ponzo;4>3vHoR`G@pb=dcCXe>yJj{c{GcU1^D`H3um`)c6Q5q9 zBR{m0ZpVXQb@C=I?_-F6t^URT0*f^O=HVorN&CK44s{e;a>D2r7lCW~g1Aus9~X*` zdYsGpm#CFVovVHyf8nPk-lMhBL*~pLA|B7>u8v?1AQgyRdSDjdxfO4SIr50tY5ybm zU&=4FK)idt3|Lvbza1Cm81N-ZM~m}%xc&tC4APdp&xrP)aYyL+EYx6E)U?dJ&+NnW zb)QI!dwAzM#=8HU{IhaA9T%)(O8i=?~Tu-(pzT{?zzmrqi#D{hBYFYcskF3420(^mA4R@V|BNfR<_Iej^bd>OrVVS(toqF&tu3?qe2wqr6K!HX@jaLeZ?p!s z<+R*E5)CM-dSPu1p7H({UIOx?))^6zlarU3 zzQn{P{ zWAm6HFZTIQTx5M%IB>bPY^4|Zo~$_LL2}STzBR6ebk@Z`U7_uBgiFb zRB5kCjQRMCbuWp{jEv~(+b8`$`lx?;%zrk z+&`hwuZJ1XL;X46hDvFLbhR^78dX4jhyM8>->jY8X6Y>B@`2K?$xPEE!$M(CEyN+}B9f@C(I^Uu$ zzB0Xk%74e=tm8r2+#~jQV*V2!SPk)O;=lSW`DF-s>6gK>WV~dxig`10cYS~1TbzD% zMg0POR`QU?ZZp)=nBOtCclCYAFhkWD-VQOJUloa5o%wC^$N2e?)hcF60l)jz?>nj| ziqD$X2DtpD>+vPSe}~WSqnwf7UspBjU*Y@fwfylxt5x~&SNN|s+g4|`(3X?`BYd3^ zQcs!xAPbxROn&AH_)_|j{CtncSMMPI47D`Uy7?JC^)27jrS`^L=rQ_0|IixOe^rwM euIZKh@9_CPIqT;~j_u-ymDk>~WajyZ{O8}p+Kf5? literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey new file mode 100644 index 000000000..4996f1054 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart new file mode 100644 index 000000000..f1df8a15c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk new file mode 100644 index 000000000..85a1aef61 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major new file mode 100644 index 000000000..ea7b5edf0 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor new file mode 100644 index 000000000..7a6580630 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando new file mode 100644 index 000000000..e8ff9db18 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey new file mode 100644 index 000000000..593bf9e54 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token new file mode 100644 index 000000000..f58840a2b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/minor_crate_top b/soh/assets/custom/objects/object_kibako/minor_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..830d8ff65b34ca91e71ff42f60422a1981d32a4e GIT binary patch literal 8284 zcmc&(!D{PD5_RTc6k`ku*~nxg@8q5JR#)E4Q^Y06#soVPm|QcP+}(V|fHB5|;8n<1 z%rDF)1Y^v@WEHZRUzlH*bE>-4Z6~>JW;5eLa;w$qQ&nAERoz{y)oOqK_NU7u{Qv78 zfBz>h6#wJjAJFnwbLmHa`(v$!E3VbL_nl$1?hL#4>FyJHNq1<~NO%3y^Q-gg!2{@V z@Hlw|y-nVx?djR{?8o%SUr3YJ{z+{ne)BZ^~{~SM@ zL&`I7+&sWn={@-;ubt-fZ1UC__D`vsN`51~#jkp7K=KB)(1w0Lp_g`}d;iM`TC9E# ze|n~R>@+Yw9=_GS#qXFNsfSJ@oVS0X|6fkD4K#N0AwEXG8vp6wy3=eo&Qcu|!|Nphd_T>A$`JgWa!-++v43nxwZVG$0G9dulT%on%#!OKR$}`xB$&Sa!*(i zf^C9W)_?ab@A*|l%57-z^JE4q_w3K%r=$GN;!}3u&w8`o^Vi>{-ZNYA4tg^8r{0tD z#e0;i2Ern%C+lw0+8jLEwWVw|xwQB-;Kv2O>^+-a*c&fL)st#Mb+doh*&G$2!H;I; zMUVK1fl3-3c?bU3;#2z`5-_QWo?wf7zO1MxRqa*xd7MXL3Dl+SH!4c_hO~(&%s33P z@%a!RV+#zG*h3^2qG67T)_XcKJaF_e?nmUn@}L}qMGjw@GL9NTgd`!K=r+sWET7PR zrFoGYs6@=`Btd>cy`f$;8OYupy2we*LI=u=@F<9)E9y%L z=+I!XkKaG--bZWAC)3^JEkzvew)XMa4}E|)vuvNHj&J<8YH#mrXn%J6$B5C$Lhdp0 zugHACNB?x%MvmJ^ef%PRHj%%c8KMQ+TmUg0c8pBmuG|h!^;6|I>cGW#1mNDeqWzlQ&H`Y)1aW*0(1Rl;-WGL9w67bP;1@pjTGm-KPuL8BJ^ zmslovNS-YI@eyWGnMvLcT+D;%895kSe}79yW##|F9QXnI2R7y#zS0sANekvZV<3NT zesA7h-d^Sx2AvUxkxQbNj)?RB@T&!~x6$Ac7630WdBeKJ5b%ed{egS6Ewv|Wd+Gy3 z47RO{ES%RS4iX)g)r0$&(GlNRUX0Zygdc68 z@w37&V8sFOWv$4&^*+<~K7L$SG}S+C+4ljQ71l%1Ppb6f06d6~Hky#}sPJ>N3{nr@ z`QJVJJ4)bPvby#}OVGF@IFuE%&q0p1h;57z5+xXMtOYpx3v+xIq%9}EtfFNl?aR+` zvikGorv60}yg&IF4s~NGtE<-Svx`4rUSc%?{L1PPc@clf1@Q0p?B8HfW{;N&h0?vR z7nx}*W;USo1o@5sJwD0<)%(_-5CD-p3N~UH&2XjP#86LW=2lsBE0$U@e4Jpd3oce4E#MvoNP_ zBS^*kk5(r;7j4Zx2iJoK-~OV!_iTF-$rm?E60N(MW8}_Auj8QdvzBD|mR3%F%nF0A zmhUnV;5+$YyVRxaQS6`6Knunn1A%WTxzzy2n)%Klx%d+y{}cJe;%Iey_|E@J_RZeh z9J2lxD5%vpZk@qwPjfAut5ysAr)Spq7aRRsn`0ahLO$&4-)8?r*X&-cop#M^hEL>x z_|ih-4d$RPJF)2{Jo%xWWFBvg&B5~RIskiCp8m!E0*iY9%)?3Ala}q>XvefmASZJT zT!rJBz91^p|3}3hK5UQ7=ZW0$4r{LGNavrCKi#z(#Kg{9BYXKVO?S}-_{RSMf0hL|TR~GydnZRg zSKNw+&5fXF{N)_6d|}SYyR04+GXE8S6Kw{M+^g%}bKh_9nC`;08-IhpLI0GTl2Q*^ z0w>^%Sr542J1K4G8^rT0fQWkHS}GUBm)s2Tx3`Wr;o|&i@PHk#COO~;VBfH^Kcj!* z3$Y*OS(NIwHC{4?mrKV5rFXsw(Xxjm8ci3R~!rC`Dlk_`b+pk;JN_$T#7{Laq*SoR-0e9H&^efcF%WfOJ^iEB?LWx+ zM^_ozA3ZHRvXEFHN;)oDr#Tu&hNSk8m=W;xkMg%@>F~QdOVKi__8&OI_II-Qq*0}+ zml*T$6ZgF&HcN!G*&qEs%Gm$>2tQo-`>))!k{wR0m}EtXyDQ;MRV(fMCw^z1?H3yT zYUlx_FX6(&_xAs>Gby|7V#~&wO@xK?N*a-IpM#{ejn6XkWFEe+aqloY7XJ9VlYn@W ztTlJB`L^Z~I-V}Cpna>2Gsk0o3JWlGhyUh1-2FoTYe!m8s--#^S`1okh{6 z_+;MF`iNgWYrSTjEVE=$U61fan12=%(Z4#0iI&OYD>%rIq1yY`_1AR|7wC%Qc5q98J;pfPG7n>qvdXuoVsG|VAn5L$LUHM>p59dwXvHv zl>IcWYYt8wyxlA!XrGM{2?q;q)UGl|dot9Rxd-xlp||Iz;wfs4dNU*|^DW+!C!!f%9nOZ$SUW{|<1#8zCVFNh-EpoQ4pQ4hCmrUN zYr8ABchsJ6GNXD_4xHJ-sac70IEK=uJK`zPb}};}Uc#@ZfCqe$BL0;C>RPZ%o3kGQTk9Y4199XtO2fJR&>#*IYatZ zC2PJn-}Q@minWD;gPz`^KjBX-%<>zxOV1C3qmTz&1nIr>Nq!OZ8C@5=h!**zt19>U z)&1o+LxSs7O)o&&`0${|3iK9ztyUs4lH88Ag@G9I41#)#y~ROK$U_~_4zz@Ld7Ekg zz9XDCTnjIJqj(%co;7})SfT_eBYWCwry`|6k3TW!@dbRX?S1WiM?kpR?RLvME*PTQf4uFbAZGpgksVk<_cU~yEt-MP`-YN%_o zbF*^;q+iTB93?Xv9P$ZLaP1?#{3^3JbEDJtVLczI-%3~k#mA^Vj_TT!Z~Yw8-AevA z(h4Z~`ayW+H~lr79lmyMw%bSg6kpbmdBpU!!V3!^ScB2v;P>_!IO85`C2f z?>HJ7ihYv)?8*nZ>kIptzfFA>`y`YK4gcn-8Pj~VFvo(OJB5RG+g*`-@{t;%{oNVsCP9a#epVo?Dzc9_`?q!_-@} z65XxPL2u_KrDUWrNAqebjh#v(LWob@`&!ATL;>PZDN@eNS0{GI_pI_q_qt1CcSqNP z#o(H!c)vKkbL>g?e)XV-Jj6zr!-N>kLWs3~YM{GS@Fb=+vbAO)D~&A7F3gJjqJ6c9 zuEOXH2dCbz0Dk)pMuNpyHZm?dW>PeztbIGH(AXI$|`ScC!*d-=GI{ zx3WGUKS~TUYBk5CJBaS!_d@=DN)O(lcMx?pU9rBqdTIMB&$Yz0Nu{MphYCxHrNW}; z+qv7vcE|HCV{_3_BGc}^etIWj#XbW62R>wHUSd8Fe97%9z2d9&2R)EENt=uG$?Vzk zH(!r_S^TnS(ErOdv6#AjxpJy9{-^iDGxS0eDc!A|8??W#l{JOARBa ztwa~1&=)W@5ZTyEt0QC1P$%RyKCF4LQ}Nx7pj7 zNA?W;h4M4&iv9;8B~~BC-tPFr>ubT4;vGl&rNr{~ezcxv5~$s-=bxNe0SAVMmBec5 z!4I|k-fOWRtVj#^B?I{S)$8DIj{K}=)Ia?^x$WW)dZZJ<>_~a<_0#O?&{Cm+UwCk) zUO(u`JfAwAfo|&cr{B;oR0k`Qt4AN4W~LDD6(2^u75h{F;(bI%*FpL16gyw$LEvlt z*{}li|Ih%UFc`Ui;D4H38-lMNNU0+-&Y>d?@KfZ(D zgUCO$f1ef5$OE#M{zt!O=LIXH?=$kl{sryA@TC-ecklJy&l~eg1;_6at3#AIca?MP zROS+%@^`<0enbQG&s&e{_1*F4yO9#thI9jt{#!9#Bqs;-J+47dVblg+=`z^klo~J?T%Yao9iA?0-*xs@K!=z;Co;#~`d3U^C-x)(KbiD6c@nIFw zaZ)@F^T7fAUpkPkO?1`3BGCr?7y0oETWbDy@DTxsed);ucz>=OpUXV2oXTB2=&77U z^v~08b7u~EUS`*V4tip#`1eb+RpzqnrkHyr`!N1k|B0`AvnC!;k6Dp3BkYAW|Am8; zj@1d>IruQU)AX^a_wtL`6WKGF%lJOB_xe@s?np!TlgryLa`cT*%0dlu>Nn)K0`R{+ zT3_Rh{wDhh=s-#2hy9QAA^#Raf)Dvi$b&)M74n`t#OS-x4$*EoceZx>?wqUp#hDkm zTK>iB>>1h~W1u$@_Zw3Gr2eYir1NM(PopL^`=8c-`4vBaFJMh2NCvIO=B|AB-Ia?4 zjr$9ee?FT3ykc!xS3Zn(u;#G#GOsiLG5+Cyn?{dXUDyja6%mo_)PJde;UM?Wx{qdj zIx!+wiPvF!c5fMRw{84xd1xO|hr07KZLitO{Dy*l)qlsBMbRNdoa?TJI`GFsB z@F73F0Qf*>EpC?I>A&!u^+Wp*u>@8FK_1kqM^*pMGlPC-^1%t<|NEe4>KLPiv&47# z%NRuc7x@D^n`0E8U6A18w@Lr9AEL+6)08j=+|Y7-pIbyvgt$`W6d%0lZ)p5gZY=plK*g(ctV{c~);oYN9q3BpUN`m6 zoTM>I=@gxBLZ<%+u+o!6l2Q!*Py4eXiT`Q-$L>q}Z{Q*Vk_}DBV>_{7<}}_(p#ApUi*cU%g1KLykuc z#fI$J{L6}U^YVqng~Y|l3yGQFKdw})ik1G%3Us$J=4l7_1W@&l_(T2``_Y!rL3~(c z$36&m@PAvYPiR0n<2&q&_$ycX2=__Z)$xO?p@n1UB3J1l|}tm&U44XPNtdS z=tJQqqR}f={%=L~ha@Hy*PRbN9Xf(~~RfbERiH&tJt@ zckCTX!`{-RW_-zhC8E;@xfdlq`#=}p7oh&Jj+f|;hP;}md0vH6(}(OuO2=2H(fQN= zimSl~r)&PbpQnDQ8J+0tjx=9I%IpBBe?``+5-G*RQqm7K<6|ep$N-}55}`|4h^L0E zo>m|yaC$bJ1`L z*wXbX2h6hJ7>jpr|`wfyeQ*a)?yYf|$Z8ylwn>3@`8PMIk`{U17ICZKNVZ?r#q zblP80=@}-HfKHD_#DI2omut6q(ol<6{W$;1AM|YgxbV!$k-`BH4&&>&x8witK4=T) zJG2-(!lwG~cqTPq= zbRNg3A1Ru0cL)>F>5g{SckZ08&0`eh?O%3G%Dq-k%qADoYc_K&ayZ;M0O|LaQY@f+>z678$#!hs`!iFVb1 z!-wdCh(>N^ab45JG(O_`4Zm@e!B6N&1e`Of35zwi6b_wO8U-MV$_zy9Mt$NmYwSO2qL=Y{4!{P)l3`ETx}2L1QH-nxbB?yXx^ z%+A^uR?O-)yAIDQXO*+VGqa0NR+Myj&i7`w73JmKl=GP^2UrSZyE z1@oBfBeQw)$;hZ318xjG&+NDMTc^*yRAUc;E^}cfnUS-0AD+9Tb}(w^a{}K{&cyHP zPDv_|gQzkGXTn^<>EDg#*u!(6_d7H8CB~dvU56q+@HkcxIF*)%oQ1yrU$SD5n&V}J zC776ldWNR$OP8|L&Ec6d>&)QluhdEt)Shrookc&F)84UmZcx<>7cy5?W|O4yaX9d@%x5*v)6myn&aC?UAF zC?V`c2$Dc|BuGS}Y#{F|pYcsy^?s5wQ=hH(o3YaP%ai;weJnrbysOXDd#SU^7GxhU zg^jQ=Zfup#tKHR@88fHMDJy5?Xs0CWt(mjl+70_H=d&A_bGANfHSC7vz3Ed}pWSC6 zA&IgUpzEoZCx15e&~jR9b@sqdcWI(DVRRHu3g9Y#l0PYS8kth9RIB={esX}{9xE>d z4y=X+T#R%1B0u$e^?vY{w{qmU+EewH{YK5O%RN<$H*@$t3rWF+l`EYWPV`V-TQ-;1 zg2Oiy3NnNE?V&qE!?-*e9vVg$^|ulvsXwm|f6+(C8zaAg+y8?3zO3F& zeNz>*An$74$m_@}(qv1#HQstRMf$QjcpF&5p_R}Izsdb|##|a@|H&3_yv%|= zYBr1^VZ5T?aNsua2XAw($rc&+n)k$7Viea};%KR3sY9U$ZU=`Wui`E9Bl2xMv7Q*6 zADth;^IBp(dF;{=-pe<4hEe>2(DUzUB;FEwH8lJU@B_n~BYBimBXQTligar?vfK3y z^h6y+UL{7B&2*agU>HIxpyU-%V-XOB3hE#01KORPnNgWwA0 zknwW2bjz3kMPO}qb-Ma6aGR?hTA3e7wZTGQho8up@Y*s4Pevy^Wn7**KYf*69jY&F zIe(&S>9)jZXeDqb-ooA`+O`f%{7S6!n|?b7+nl3KQ2OLrx-EZVbe1M6naVlx(mz7z ziOd74WOxTnfIHz)*OEun!2GD$U8ylPda*^Kd#v%+nQgwmzCUy)02>aiBu3Ma-td9f zEhVko(e`v8(nC9juh?0#%^B;3399xQ5#^@5bB$zm+LP;(Ewq67bw--TO%!$dm?x~5 zGt(?I-(4>TZo}{HgkI4u@>a2vmq$PXRsmW8L5tLUxyO8Q`gQ%~>B5`))%VqR<(YDy zv6I&r+w`$No6G6tbYdi#p8q29*TC(&srV=}uhWYdsUqb=$rL$Ak1TM#5D@t%Tarh* zRfJs-Q6wcE2<-`Kg;dHA`}E11`@4;e>5b{_{C0l-Ub#^2E%)X%eN1a52PE<^{fZtx zzfRpVb2Mj~GrZ#&IR+VF%Jet)7(0T&cuP85q?I5ll2A)vMUk7%55->8I$O`L9$f!? zx&ZY22CzxHjon7MP<>(cGQt}jq*4cCeY$NP7MMI1^j@dGIjivb%xna|X|u8_>Ht4f z^Z_MvSOXUzSRvZT>VE1Ane*KA*T1@YP=C3dr|cWkMD}<%m@CiJzpChhK7NR?#m?oU zcuR04)ef0OcIX=%G-oNheQ9>5TbIqEPvl>jhxHXZE2z3?`LN>7(m3?6g$z~0n+)`^ zRUc63t39hd8`Fz=%3h2-@-69#n`)t4Fnchj10&%B`m@AH1o4{qO7|W<)`EE~r$5ui zteleH#m}&6qSg(d6Z3O&eyzVenA@0M?ICg?t>{r_$|gU%`Tc(Lce6(-!OhZmu`}IH z{U?r^{X`UdL*>()WmREK*;&|hhto&-8GX|2`IAp*qDSH2(BmQF{Bbb1onP%)(!X!} zzHKl_{J~(*{2}znm$Ipa@@##;^jCmh8ZVrr+o1p9fI{Ju@$@Aub#wepmUS$+A49*{gn zr0J8Ih4}D7)Mh)>F>0Q3r&q0id@MD-8!g#oKWl)}Iq#L4F;T(2Vwdd7MRodgVf*>& z^rOh66)*$l;M!n%aHRJRY2b@V?J2Bcw^4s-J;#XiQl{v0^}lZCAo~l}M9mpH2mBr4 zqwbTej6 z(KAucMB#bxJ0aA!PNDgsT-eA#eqUVVhYr$2zx&sLF9y?bi(avvufK#B)|dnGCn>H! za=!*Irw`Z{tbr+i<3i>|mFzrp?T`NFD`h0_Y$4K(!}r__L{1#|UiCe!Z+bD3va#YJ zXdoC^8-NuInSr%O5%GZr*8lfXhE<*ZEQt)vie`E3u*UcYv_30`okzBDVKW9Y3eI@; zw|s=`BR)^d13tW;{x5XyJidBx`h@sP`jQR{g!Dvq?Qcx^V7cIYa2}U3Mn|zj;SUW* zUK^b%0umpW*q_8?*7FJ<@mJxiY+7U#?IgNzfGq1gZhpLau-l-PQ})BoM-${BeiBGe zYLnVxM8(7UOGKyvMgYUb4-Us$CHr#ka?yAT+vkNH0`IVk7h?ax$m>)avMQy8*13LY zBkHL)u-0jC@ZrtZ8_)nFz>*%fegN(dp~Z+70Z;E=|J?it|KGy+4lT6o=6{UlevTUF zjso~jFY__iq&X|q=}Nps3mX%%>*X%Bn|#nl$&I|7a`u}aoDTto%pB=f{W@lD&*f-da9}{Re?B`)=8l!=JVkQAe-4#Mp*)K!^%<%l z)_*7IP+~pwI&f#Qg?f~DhutQ83EF2gAQ7MXNBkevLdFDl{-URt9R+d46hQ(|!#scB>I0wkzpOv} zA5oXN7XFKtIqm#%^}yM8{-}Rd?P-44&ZlhBYR~>X^F=B0QZlvhutkhd1S!sqPOLxj zKlLxtL;u8Q&Vlyj1VZppqXt*vt*Q3Bg}Bcedz|sFVmnWoAK%=6^EGO_g88oc-t+bY zT6<5i1N-)4^uw%jWjH(cHX{Ey<){Cp+WB3GHgIM|;rCLBF#5s&Sbqm6Ta(AAzay-_ zQT3w^ul698f7~BnwYl2Mxc5~2eq;KeaQd}@y_AtDMnJy&iH4mEb^unvqUW+sHzsr| zc})LHtRsE^pQ{8qvv(*zs{#A+bNr=_ZC_EBd~X}1+Cfiw@A*AeJd66$4r)z$zE16z zXHcKuoT1!%&;uNEeng@MV@3p=VU}V>KT94@wgm3XkA5!yA@G6D*w=5xXbC)3z@Geg zyUU!C8XdI?*M;~0y}JJK>buhgaKX3_+HU;iK71WB@I1=Onz3qkx-Hdac1uLM=9KdL>f6Y;SNVe~^S1Updp$>ZHF*c&~PyP`ov7SfNP->!fA%YE!O zq~_nBLymdR85qNHMn~_6@uUv#xW7>x^xBtIzu>=;^*<91TzvMysT@u~fmQene@a=z z^|#mGveG~O^>pDBHMjFo_B+!XxsAN@;d&5$^RW4lvtSSF{njn zJ^d%v^|Pv zpAO>N3s8n;N;JbQ{kF9T_12Bt6esw=Ncg9F4P|( z=1(!ks2U%0qCSudHLKx+epxMG&rm}CPs;ui_&ex-Ms%zJPw2sc*=_Hbe%O2AX8+Il zlVM!h^=TUX813DtR!iASsOy*D_uIK$9|-jTPde1Ej*}i8bpwAjL?DSj86(0uXnjM& z3GDxs{u$X}iHwqn&p3VMzF;pHLT%)+VqZ^tW?tS^m;i^Ovjdnje}Un}0xK z)HErJyu_%UpnxA z3mq$bS)+T+M~D{p)QYQ>MirU0WgS$^#~A?#dPn6(Daa|-Uz;CO__TiD)BlnGSlu$e z857v=t_HbPar&NuGy-(&1E?=gv6$4aP^4$LaC( zCTKhrme#nm*d}eJ!!EH8ddU;t^YWf~GTOm!iQ~!E;L6|~MnIguDl(Uk(x`LjD+V}L zB&Th@0d8e&=ebuj2$drD9vV-6g{6+pn1?|4`2?|eI*$Xqsx6Xov zIt3M)*dZe`Y6e=7N2*Ht^d$ZQe^nsic5Oq4llX6vn3;? zvg6K1oo``xLT{3M(%RU^dWK+oGqYHA?Fmgw58BN&YJZfyW zjN{mDIsfAvQ6)DuBV4(&v8~9{{-b4>^%g@^K{i2)XXiMZ zL8bvdwL$V^=O~g$EE@8(z&RA>o{f`NqPk-^hdhCoo7~MBLh1%hz1aDe}rO5Yty$eH;o z+80SFoxG8^XanDU=gKB?i)@nH_+QN|k!bhi#-2jPl8lD;S^EMP(B1lC3MUZE8R$)Y eV{S_A5fQliQ@%q9*blOj2eySg4v9q>cm5B<3T&GI literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/token_crate_top b/soh/assets/custom/objects/object_kibako/token_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..d4d5442860fb49fe962d1b4ee6ac461ac1aee1a8 GIT binary patch literal 8284 zcmd^EO=w%$6?STjtVNMUFjg3fWy%n1F@(3&sujWv&mt7bEvb}683hv}Ee5QewJCmx zFe3|7p1laNS5XKd(rT=w3dOvLq1eV4+lyj*5i+3+CaaQdzwexTrI#5fv#$^D>Am~z zz2Et}=bU>zF)=am=cPaX;TC>B{JnR@3y;6}?^o#gdvocazy5Aw0#|Zkq7X0TODl!g za?Cw;4>KV5&^_i`Ay$YNVtA7l_TanR<9L#1yxCTLier}JOe>wsv@jFq(V5uF5jqa{ zJg?zfj_1V5lYXLe?G=qY%7#}wyAgd5KCtmrid{&(+ zpJfiyIgV7ViNu)AqEf~YqMd=iE8yS97d(p|g%hAbAJQM=mSbif?F~HiJS(lJwADFM z<*bm;9Mam5Uv)>W4J!FBt*D)F-x)p0OfnzQIWxYAbkvJJfjen4EoHxgew>*Sr*n$W zIl#}c_>EZ41vkn8CBdaShNMInBA%sBTlhv^>{tFOf6}rXOXr+uDv}&74r>pf3up%X zK<-R4-E?ve_!|2!Y^nH^2mOQ>JY&Wk+{Jp7741f1%1gu%uYy{g9qZbOCK}1%Og7Pg z?S05iT-S+`tHog|l8Qn%Xj8A`I)O(383YcjZiN?Ot`Ny`r>j@iq4+fXEMCZubwNp; zXfjv?{!Dh_*8ew6XQyxB0{vVY_(GDe;b-?jwQ})H7gH<5wP@*!Q!o)mf z-X&tlb1TyXadr|`GSF~wt#R%|gJZ^#1uIChQrWN0)r$4D#h*scRD@$052zo`rSmyC zuJ!s}{jz+4*s+8AMai!{tnYc(rJdz?SO-?qGYz#sVu%P5m*};_2!XgOIk9q9E7pqM zrNxK#MS5t<;97|?t=hw0s#op5?)L`0!3R*U_hkDK-#YJmsrnwG3D!5`hu-F@-KAssovO@Foj7}u+Qb#T*v z&2OFe^>$&!Jq9}BSkm|?JW%YPXqZfbs7d_loa9At#5`4-v+^ezuzgeYt~nvytljBX zk7`HG(Y?WHf4=j;-)cs@NHYq``7M8I_jdQPTin0yzT16XzJLzsX=?u{?C+6-L__iz zCJ=2=yguefN1U1&J5hr$CHs1WJNW9$Y`yK5d`0PyLJj=fVLz zha4cQz#i&<$)Rc<_GaFl1^x=FkL6gRG1G8zicjxzqV#WiD`lw84Q`H{{sLrW}`f{bZ`3+Z7252rGU@5 zsei7%Pw^=udzO90pSU&CUiZTw*A@m^XeS6$90^F&Un=Abk;rQs#7muBx3C< zl|Sm6%EgBrI^GDrg^aMdys-seAU~vUtT)6P{?;(OOp&4&CBF~+6DSao81>HyVsT-(C<^n8tdn+r#^ z^IB)t-}0jQAT{Ysx(&DCG3Hqg@Lc|~7^Jh#RAwo?u^k^U16WM8e5 zSHJ_GP`grgjS8dnC;3NLKz;ALfAz65+sv&s77r30DK(jgr<*v47*L+dG@Qw#2RcYi zHFr7>29JUtt9P)1B>GtW&or>FhznV4=z;p6O{(Gi<8mjAp3qkR^;LiH+xF?k_ZB|^ zoYK@9yp8_0_B6AkUuM8t@}Sb{w)d}lse(kc@cK_QxEs^`q3+5oHeb$@D zc>Z-~w)|!CfVHR6;(_a_$GNH(v{N_Elz*~+-CyXXD81Sc>(A6b^fksi>?g3cX?Ly$ z)xOQYntvD(mC9!?QvKfcXBC%v9Md9nP+2NXg}F+4l~!}7dC_@WzCiYq)i3K$*8fbF zs6a<#V|IadcQhJO`(gZaPWSDs)hcJf2d;tk$=V?*3dpGBOs+j$YpgYr2lAeU?2{Wq z_+D}FsQ;wAgRwy4<+wKg=nk85kq=szdM6J*!AJaq^)Z@0usIJO{LkP~`=s)XGqre- z6v9gI*0PnX+CGK1jUi(1gZ}*0cbg01W$J6ObW`z@L-HeaYm2#+vB>5kW@H@5q4{F8D1knt{E^LwYg~{B>N#gGzQS%WUXxb^dhp#d(cqI)($tpU#Ew zVSjoCy`YpQx~&Dm`gd~Nb8-#PTbED|uzPuu*h(9oP|(aF?!A2D zROd8y%6MQg|5LW)5IjNe&_Cv-{M5bT*B*rN%?_9`P%7Z%c)i`P?q4GgjB0>&FMm)x z$a}?qkPC1S__^-0H}?iTW)!gqSiDIVex2Co@@RG7s%<2nW!AYp^=#m3Qdl)El*|`B&u^WUefr6CZv*EBSC| z?0=*9j|x(x$12JkZ-3Q&>z}X!vym@iRkG*T|!6f@2hm7-I zVko%WCAG+d%1`ev`(gh}G*GvS-JwbN@N%qrrU|7vd`3%ktu zO}URUfYb$y#p|dG{jI^{?XOH^MPx7GtVt{2L;!DqRpxA#MyhIMpwU0Ye2U|S=JKCJWCHnAl`|Zwb=RxoDdJ)J&qLp!Lu`V0HlyU%My6FU(@3vtBXfcT87^Z;_fiy4U32lpV{gB$&$Uq()bjRr-M zvhQ8?Utf88)v7#=Rchi0_%5vUp9HV4$887yZXXl1TkJjqKB~k0%fXB8Wq_Sp zeGmIz#te)lQTv+zQ&Bl}hwLDU@QlKUmDqhF0*>Uj_~0DTLt{0ocxtbD$GhBp-g#I5 z_4=WgZ(eMFhTom--=L-KT`wb6Fy69$riXEU#y{PEGydaU(6zpn@9+bjgpbxg_1`je zDzcUA+3_C&~GFvH`>D<>v3>1cy#z<@M`e#$mzVVJtQ{sJ)?{2UTizkKjr5s zGb`&1>U-kSA31_+)viCW|B8ArYXtRD)XDT`ykTu4#_c|TgENq$d&oF9y(iu!W4+Bg z}p>nu7}t25037EQB;c^i#nf1@9?k^9j*+QV~NKDAE>M|!dL z7ZQ8YqLeu#YaH=H-c1{&P%gkZZ7{~7*2Zsq;&=Lukl>hB#l$__U-XXoh&0l-JdNHk zCy9Ea=HS7IuEH7K8QrK=JEuMgw`enR9`i|cVXdHiT3(IS#6p5Zd6|)w5NjE4rH(+3 z=8nN=CWaaY@teKPMepHQ-k~$%5(RWDgkR;0{Ky#TDg9*>buZXf3$%s77anj@X2xL# zW>zad=jXG`tNMyjFDg5^5gO0CVr8N{Mj~K?=nvupV+}xhX#-}9IYTwg>?LGTfu|_4 UekcppDD}WOM?7$hj8NqN0{SG^yZ`_I literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/bosskey_crate_side b/soh/assets/custom/objects/object_kibako2/bosskey_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..d5ec9241ab3b5603a02ad3cfb4f7f8f050df50a7 GIT binary patch literal 8284 zcmeHMPiPxw7I*d%3lS=z!&;b-48pWSPjU~7b=kE{DApiMJZrjS5Me8VS(K#&c~9%Z zF188XNQhtw;WWl5u?g8`D4`vCQf`qjr4nMPj4`n>VF_U=p_CAM+u!fK8ClL{3wzkh z`Z1&V^L_94-uvFaZ#*(GGV;4iznwdS-&arELms&N*?+&l$lv&fPWsEQM@Dd592v34 zom_s)9?u+P_S1Ex%)T|A*|*0@nR;fQ2d?Bv@Lb+uoQ?{9ISPDgsaU#}=1d`dsw4I6 zE7y9TbNr_RwDX)p6r7<8W(0E@xfMU0oEbK}Yz^UTPs_PevzWld<#yeTY)bA5fA!ExnZ&d+K!ohU!MiI_j zL#4bR6<{%k>!QfCJEU`9#d$yORD*f3WMGxzb7;C?cH?2A9BD^xj-2^F{Vy#rIulT2 zCNgtclF{kl-GA{*9@8g$-{u6=HPV>S&^W=SOaodQT%A1o4_7B>%6asR@DRjd+_ANb z?e{=K_^=Dc`f{msKj*BvC~rAaze}UOWk+X($IXlF6B=ue;m!=1p=9VS{7XZ8Aj!q2 zl<{JFY)F1`Kd}q-P$~7o7gqLHK3jQKh?`|I3&MG-TXYKX zd^~L@D+Q-&tknKoTd5bF`5NYi{R6U%u90_SEgehSsBjDO^-K-FHOZFf7viBvJ2SwK z+%&Su-efctOZJl8WH(bO#j5qY_3e%A4cFLyk*QBc)8KJszmTi$RCkJ-Dcgyc^6tc4 zi~>C`B_JKCOCCm6@#7%}IUD34hv#@^21hSYXD&|meEp{*ZL^FD1i4ZRlTovBrB|}u zxcf_Y!TqTD&*t~l7n!}{QT0Xh)!mmKj`{t3uKB7{^tQIU+g&%-{MTxJlCnbw%up=9rZK6Wn>{+Zh*gQR!}{pj->08vCKb!pY!U?dh_7vQU8n94Htj? zFZ*A%ZuGzG6k8v3iidCdo>z0{yvts_b7RS16-7NI#msJGcLZK&gsvy@4c2V-9IT0X zRBl!^%2_z}@n<5$$4qnsAQM`w#+nVU=H2$@yxT3K@3tnI$1S6k=oDH;=UU(GKR$fZ zS#-msX03I@jAhR`tc`E) zox7L4SAGt5XKPtVHc2lVL&>!|6+s$t+Ne?2rZvh|vfPN31Z)U&n zT=gHFiHA}#?ZedvGW*5j%?o!As@c+P>BG{8w?6%=<^X$rCpk< zZl$7zMb8h&M6W^nk6t3m5-d*-WM`pc^p!3Yx z++E<#U;i1be>b%t-Ea*a06%t|CrS5Vvj+UL?%DgZKtBikb6kOq^1UwBU>EPsJw0k3 zr4h5b@{>{R>f&LI|ItgxGT3vl{{}uZMm&oDBL?uq$3MgT!xa=S0xx=}`^QeP|An_s z4|vqRV*y(UmbjO_AAa{VeNF8Z+%Gx~XIbO%a6H7-XI`WJ>VJ{8B^-q_yLEV< zbmrX2V0Yl_Kdty;!J4ckYXNt)`>y*WiA?)gZ2*r)%){@(&5b8!^Hn}aPhmEr*Gl%( zH7rAa#NXJi?dZ;v5>PwZo%<&4f|nP4eDQxj^Z3X_XEwFt)d$S|?!)SODTI7*7U#L0 z3p?*tAFSrn3tBZPvsuBq!GlxGqgl;Aku_PHJ!-=>Vg_I)TtY-5FAeZvJIOyHCH9K6 zl>d4MqpK~*<6P`m56JC3eNfu|1&I|kC7s)lcVm-i}Zoj2gCS?f94;pqRggIK|np! zrzyMinG5>^{oLmH!jUPy2298?{N;yVveI?4=l363y$@tV%|X-w|Jtzq(I>VCl^@kx zqL}f-7@%kOn31bT=rxe>VS~@AFQne|)T^X!2RnCInfq;xf5W1L;Gt1P|3loP9!^M4 z64)PoD)K)tSU=@A_$~r;NOa371myTv>|f~vJBezxIt$9){jT(&c)Xk_9;e`Ek(-p766*I8 zjIAeo>VM4tzL(Hn_qhI&f1cap^aPE+(G{c2K7m~tq=H|N=pXuvE4=AHZr=7RP`3FU zGUC_X51VFTi=75LDaooDGpMiWIx5i2$Qg-$#6B!YeCm%bj6E5z0{3KQc2B)k2I=>Ot zms&svB=)D}#e-!H>~UXz^a9W=z@IU)iceG!D-^mF{T`UcUMU{RZ}xx0`qKh)&Gr84 z!=KO@6kT_9hZ=G03E4yWmw8=uml%|!`1*I5u6v8M}KJKD)55wA`HHG^De5>XT3ty~3+-WKKcSaVZJ1~3$VfRPt zOI-!hfGo3uuR}gXcC|+OYp}*BAKT?q97^q>Yd#;oAHLRE`d-eeJ@f&0GZuZ4H^PG>gH`03 z=^<)8f87qKD`r5(YCB zYkk^-H&U?(2Ppz_Oem4O)OZHdD(tFX|4|BE|vRMKZ0cbceoAd}V>{*O>e ztsmS|8qO7+VN=vC$(S6AXAWl9_%1-=HMl!6et;|TzU7NLL*?|5G1s3>8)%kirbp(- zA^BG8??BdZN-tA%u45Nx4PFl**VA31ea-d z>ehJXFmo_nRmvQgHJPDu6JB-s&;WtNNok}`BU76-gA$_VN^=jv= zoSh@0+jkoHfCG*qeu%&|bzOO4lT*$bBrAszc#7G0F5j4gRVtb4>HG-)%zTc{95{{Z z$(0GGL1Z%#${+B`6@yhH)CH&R)bVS<#<$$-@0=YxjnFP}4pDH0ESM3_X>bM6RCOik zo~%r`Cz)zGt{Mn+79oZbV|IwC$XI0ocMZAL-9Gh5&V+l;BBJ1PEuDi=C;Zq8s_p#Z z$^<`lZn_Hm9yBmd`>Q@N513qoI3QdF2S|FS>){R8<;r|>hV0znGq(?k`_#)cBu-oT zrThftcN&yFZP9N?w0WR6kzXWJDTD*T1>#DQ>j8mJMKb;h?vR`qX;@X*bK$9h zQ4RNGnS4Ud{33LnwCvRW*oa|{?j%OQeS>nRt;zk=UTP0qfl_-@&`sI`2O34V(uPWo zAi2<(O}i*E^$zZAXmKuxJC$HgG#P4T`2>>Ar}h#tqcplRdTZ$1|2GZK1hhH~`h_m^ z-Rkg7ju`^sTgF9K9r0gRjts{0dr-&W8Z%gRb$BK*qGXtCyQJWE z4A120**9YtHzp(XiWxgf;6`{Do{=?7nID7yo0I!fV`=((g?Rc}=%= z#jR(0o_F-FootwOTqg_qee5bkcua+|C@heb4Lu)OtZ`|K9sl{R6s#o>F_7 zX$_N_XD!Gtt$+jKuOywinSh;k((wQv(U;oO{)ts`a^JD;J@>zC9e@rypHKtP7Hr-5 z-1FMYo@bA{#~q*2`ycrqwJM#*<(H^rv>tp!{9p8MWLc%D`@*(Xey73u>C|bfNPc7q z;+qNWQKsUV?~Chx&EIHMTZhoVV`BPV_s!9p&JBFNYA+N0=xwXw&jP>Nd9q>;zNE^Zh8PC$?Zq-@21x1jRE_w z(SAmW8l(^9<1I+<&w5#ZwpD?RH~bC%uV1f!U3rv!WP0!UmG))7%D4V(JK1zq`?LV^ z<{tb{YKsvQ-xm)M|4XuW6D=eEI+6SrcPIDJhcV9~n}MqNORdA!3qR|b-Uw;yi_P1c z=EirM7dEq-rAM(x*X}<9?cCq>V(nzXK~`t()Xa!_5BZ`0i@WeQ=|Mzx_#Qh-^n2)h z;lU>=KdTb*UC{57yUf9IzjpcFVL4m8R{XH|;q5Q}X$Eu~-?#r|-oAEo_2#piJ2!WV zv*mgk85a@E=oLz#*I@h&UnL4WU%Y^sNOvFfG%FY8{|Fy`q1|-mpwR5xXdBSKN^fpt zL9-k0HP#y6HTM3!w)yS7tCXJJS8TA4k_-&bnL_+X{GS8<488n1a-UPb4&6ik96HaO z#oYydMgAxGN4nvPWWagbemaTFRssHb@BG#^pkDy~1zKREw7CZx?Bd;pXUDDM>3O2k z@=_g87ZNe8Kf_l?QGt;C(SHLU5^MgEdW0vD|J^dOw4itq)}nWMpLUkJkNtIez@weJ zCa{&DiOuX*?9sQriO5ejCnP&!E;BcINbM(r`Zu~WH3o^G_iTwBEB)BjWw;L--&xaQ{PaPzpJ?Yu+D`$h_>ol-(peMr$+Hp#B5=#0Yj7!A`^x z+e3bEK>X{-$q_#5kJSF@D($D4V8uX&eb;^;I)DbYzSy`e_@#}~mPGxt!_HFP;ZA~H z6YOSSKgb``{0r?@X>0CofD2U719mU03a9vq5yYQ#|JBeZpF4>d1Qqbi2EhmCbBus{*2aFA7BSS*+zHR=`fz?Z?w8}0>EZgj_^NF ze9>S<@)$S(AxC)L)5)WE-6yI8csybreiv(PJWaJ;J2`p^vl+cs;$Ll8g8YcTi@U71 z8qw4e@!1DRM}V9h=wIuPW}X0<=*;Ive4?SeBsul*!> zPOV9&2QNe(W&K6|8C@0I^e7E�DB>zxP+<{Aca3>01sa@&#-EWS5 zMm9h;^t1kY*X#KH>%t-|){`0IVq?gsCkUB?sWGiTi4poGKFEx`vm$(U1o`bye&jzZ zSc$9H+NCHLPQCc*>14-;A7-g}`2AL)X(59JGq~qROlek;+2d&|F(UQPG!v9tZAtl& zhnbHj;QgqGijOR1Lena>c&c)c=_1DOgiZ1h^XI0{^7)3%>&CQSrRL7n+O_XjN-A?a)(> zXcOswcIkhHsqcEPm-h|3JS`yW}2o zuK?d?y*zXB!;`G(YHB~|KeGBeYp3#wH~vqxlv`(~!A>eT z?_kWJznre30wMoM{3G_oQ@{b_$1Z?98Sg^>8(t+oJ)*EpQe3$Lm+17Gqc`YAiC^;9 z+LzmxJ4>C<@{Z&PMl~qp!KsJ%Mx=kS0Ps16HOOAz%7OgApQHRDZ=eNa2NJnq&L}niYF<28Y`~qj z$d6tCvW56FMpp5O3Sxyqx57@v!s#y0MVwmq4eU=1%(m9MZ;yUPXMkNvp-G9Pr-<^W zHIRRq*F|=TK{-`hU>`vHNBW;J%uJP55dw$wBCg3is9Y4bkN?lmodmFOk1%2D)VouL>bQFb4@b+yPW+jM@?jJczWH>;6Tv=5E-ZT;i|OoS$rc4-YUR{28fS+FLcFDpZ$(K9@?M#FLq}n z`n*zTdpv_=gGAg=o76ecVP#Y-)o*G~_a9gn_QcKz=T$__9I#Kt2d5u+win=YpEQC| zsC?W->Dd-*i`Eo5?b}P8o(@LmeR5KWUpV*520O44Prc(xh-KKm|w8=ilzhL!~$&s~LhGR9oQdL@!#r^cNde}}ub z@O%@Ji9Vn;eUE*WoDcFBy$R6=#;> zUM=_X|2f`;vrS|bb~eG=1b6h|JATVZ^%?Oe{%=fuh#Bn^2~Q)BlQGenSh+Wtf4C-A zwNH6aJou(|zu`(i)s^(yOemi^TJO0o-{Km0y!bsiv9;q2`_6DB&JKFgFcxH{%tN>OA3n6F zatd^4j63m=2jyR$D-Xm#Z_CwrWfc}W48HM;D=O(Tjyp@_G2}^Wi|#{3bE?Ay<$&C9 zuE-3XqHamXl#%cr%&zcVh{SuWZp-)xSNQ#fFX{~CGr+>!U^aCSo)9qCqn3w#1Z#ng zr&h?lpveqD#hqwVye5zvJCWcn(uCSc^^5W7PgEwY++qDD7s3g$z0`kH9nl7T1Kg5- z;X0w~3;&_~(87RE$au-;qFbpVtSEZ+A-*OY$jXYV|I?L`z}IKQ#GVbSiHG$<=|y(c WAFh-OtATfp(+{78qk`|i*Z%`M1f4Vh literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL new file mode 100644 index 000000000..c59674884 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 new file mode 100644 index 000000000..f43cacd88 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 new file mode 100644 index 000000000..d877460d4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL new file mode 100644 index 000000000..ce8bcb69f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 new file mode 100644 index 000000000..64c96a3a3 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 new file mode 100644 index 000000000..ee780d50d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL new file mode 100644 index 000000000..2d9c5974c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 new file mode 100644 index 000000000..a3a46e621 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 new file mode 100644 index 000000000..041d794d9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL new file mode 100644 index 000000000..190005d99 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 new file mode 100644 index 000000000..867e166d7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 new file mode 100644 index 000000000..5ab5bf39b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL new file mode 100644 index 000000000..d093960d5 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 new file mode 100644 index 000000000..9ab4cdf9a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 new file mode 100644 index 000000000..8a22d508b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL new file mode 100644 index 000000000..b1c1ffd1f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 new file mode 100644 index 000000000..3e87c23b1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 new file mode 100644 index 000000000..296988ca1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL new file mode 100644 index 000000000..c4d711d10 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 new file mode 100644 index 000000000..126e0bde7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 new file mode 100644 index 000000000..908b646bb --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL new file mode 100644 index 000000000..b1b1269b9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 new file mode 100644 index 000000000..c02cd056d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 new file mode 100644 index 000000000..dd2c07c52 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/heart_crate_side b/soh/assets/custom/objects/object_kibako2/heart_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..d0d916c0788346102dec8cc08b1a9e2713d9f82e GIT binary patch literal 8284 zcmeHMO=w$J7Pck}M++mHVX(XiQ3#F zLJQ?#9LE^!QA;c8Qta3i6lZH{q!8sMnjyxOLobYv^tVjIL3+xA)BdeEJW*Aa$K&oTYm=~f0;+D9MYDAd-?}7sw(pM^M`{kU2zrqUBd| zE4XGnAM)c(YWQlCb^|`NYc&P#flFk?p#<8(T(BRx$Vm%rl~4E+UVY(F(1}lpIX5IO zCK~ytIdDJ=5S@NQQXfPw+L?EslBZjqN&rN)8*PXA@HEeNAxg$4Lm_IG7iG?VsMy&V z*GV+u#b`2;j3)EXvNQ7|)DTgxHuxnDzQl)|6m0Jb2h<(OYq@^9J#X-U8p^G3hWQas z-s%^;2cq!AyKqT4^DC6s^JB$uAd(ynM9yLKNDBNAHwKD=r)VKoj5nr-r-vQdfb5K4A4I0@R35v=A)} z;uE>w@4stV?kxxB1C&zn2JggXbr?I0d9CSol0)IdvhXYPC! z;(O?m8dlCMm#~$1;AoO@-T4FJBjO}tYl)dUg^Gn-ryMK)Xds#-61XC!;3k@=XqXXv zCx~d>uwU^0gZbIdCbDavP2`@tN6rU{Cb&r&LN19n7;8CqBq`Ypaa^M{B6cY|f|xx_ zi^Yxq!Ak?N0`n0nDR2-g#EYq=)tCDVja|^2&5!+Z;hMX2wV7z7oG-lnh4!1q!lSu| zl?NC0F7M6lT>fkVJX+47w@6Y~V6@0A%Iug+Nlu(ex0o^0Eo#i`>0j|#pOE53|I6d4 zZmnB8p2F`U?u*BZ`{_;3UE2BKIP+xc;AZut`T}%vaP#5C&i6YX`(JuTi6ZkUE=UlT z7!WDuP%Gq+lUZ|U<&|l(%Ahv0BdUMOA5Cf{!26A{{RiDz=k4L?<5zW$NOiAXIk>rZ zdFSJ9?d0vjT=k^Vsg}3LE3?&;?TLD&{r>)LVS-teI#PVj9WCZUtXq(WSMtEmqwYwz zC?k7X{2}T;$&4ILqDE;xf$RrYw#T?ZtM>kQ736VFvAvVH&|b*u1vcpe=^o|g7i=)Sa7>P9-bQXvC7y6uFBZf z+P1sx9)4GK@ihDO(fZN7C86beOY2A5Zu?fZb|Zut=vYij4g1HfDp0$|gXG7^yhE+W9y;5$*${$H4ny5ipd6kZ* z4(93?DRX6PefjGnl0I#%Z9#JTv;ocBqx8%7mN&*8UOZl`E%;yRDz*A&{H4@6cswqj z`p>kub6|yQ@x}hIyY7b???1XyEmOc9Jx=L#X3UQH;Q`MrC-h0Y z0T0xMaPYKx(*3mkCcCQsXYogq@ggL~3h2v^+7~;745C8b=zj>Y2=TATwdVvkFFm|o zeX;d?8=gkw9)8Ej56QPWf-f8>SM>_zzY*g4izEK1{NaLwy`0wa+_$ju#vTDa2%W$$ z)&9hf6|@F-KPbP%n!ZK}LDWBaptRI^kEjuqUp=J$>h+I1-=>_a62W`;$=+TP`UWm| zU_{dWOCLWRK*YtWq-HiR)hmx*Rm)ucMtVJ{|Y^jD5CvkwlofiU&yoS1sYmrgla78?{f8X zA3i-CEgJnNDG_Jp{vIm~zM%WI9OA(MejrxV$l(lUSHHMa{_2~*m7aZ$wSLFHvvk{M z6u6BG&urnDtKQP*q5FTTO=h2CAJruF^WSKIs45xrE+RlL8uszIN)rw4LAei3`}>oJ zrw3Q+o?4h1=&yRwI_1~+i*LvQ?%`HN896vr({%VV&$2!{Jq*_ z{-JDXw1Dalk&D?|S8<|Im^fbSF4nJC z5bX>P(80RqUEDXus^!DeCsQ6ylSFTl*NA83k3y?j*Kl<)zOV)WI`Sd;=*K_cBXh>N zdYD0*=pRHaFd?gkzj%M9 z-N)xH>9?qLng4Nqgi{8zaE8Fz)i3Y9SDP$16=bWA1#29 zDJR|tO9dLX`1+mxx58|kgT2s7S^tNgue*IJ; z0jhwBKvZFSv6p^z_mKF_f31UI=;1v8YopQciw;fZhsQ?VHKkhjTuEq@Q0&D|LU0* z-z!NifQrb2B?j;d&_C({C7$rHrFHxK2gy37j5j@QfA zbRNb^&PGgW!((BSQle?&FHnOPUsj;RSNaI--P3<0>8K{5LA4>di;(WOJxW7S#>ia^8|hnKaAZcPm#GZ<+&_c($BP{=;+NkVyHi4{S}zg$)Vyaf2;{{5)O@8 z`$PX&8}K05JQd_wGtY-{LN3)J-$K*Wo3S#Zx{a)&E%3$fv=+T4Zu2i@;9id;@lUb= zHSFL&5w`wj{&x&2JwrSh9C)bQl^52oS~n{P)E}~BkhzlhoR3c&UF^d`wusYTnRV9J%!k_gGv!^Aa z3Hhp7nP0RgPq1)$W-h+tv)=huzp70vo}$VwSK@?LC1OE%vL#&~XP=CRiLcSa)z8H< zWG!<&3&}Tr$G4#Q)hE7@aa?z7OFha_d@CzUXI8)BY~+FKnSFFD-`ZZ55Arfdrl-8q zaWdY_!Z%zsSP3$#{MSqRrcw9Wc`T>W8((|R7-Rd$Z*Rnzw`cnhk%Y0l>zZL4G4UGp z4l3?5V~E1uy0*0~&td`2VlL^$FVu|r)py!c-dbDQU(60naBR3Y@dR1PzOfREEyP+f zH*6*x^^vTNjQ7xHvzoK=b2haX<_a3inW&BoAUQz)^T?czT)?e_?!0Lhj&9uawJH{cya|X_BeD8rSt;`XH?gi=9JAhapVM9M;_2)3!7VDTYBB7j}y#tihAyFyy+w-}k*&)skIy@9Rfb zy{dZe{l0(i`@Z+=>FMeD%OC$V(Tn@p-=B2&L-T+B`we=g%})p2{X zn3xSX#tk*VQQ^GWrk-?UJJ)6##1`B3S>Afkos8EJhELBi{exV47QdX2KENwX$|iY@S$C+DR2*5A}bCh&=%%`{m4Z@T4<|$!k_T!3y*?Md`ir@A#pj~ zDjpQT0WCmu`VC2a5WQ$;UVTcQYkMjI5Y=w99p=N+4By2m8J`TrsagIgbN+M1&QG{b zx;0i#Ws;dxrg)g2m>Hmkh*sPiqRT?diwZ{9$`yKpc4SA3r z6nMc+%sCUE8E~l=pb9^f0^E5%c&=bfC0mivezt;sZSZ5rYdig;Wy(I-JJ{Rve@+*A zEq$mB`{l#?U^wc-Zy&xnujBLIlbJ*&(VL(zmQ&@Z=LOgX@8Km%YYLv5V_Tv zFQBI#sdsogeGmQ)kMSdX_$EAL6rPA5uUHklYKv=xZ@S5TmHr%4N|nT$Awj}$Fqq+p z^zL|ndKW&AJF^a>Wey%%ShDz(9q3qx8VfWtF{4C3ZE>Ai(%7L_%nt<1AJ-b^PGqn$ z7~QaP3`ulnWbi*){;S1@p88VYl{`{E=8pEiBh^VLf2b!|w3H;l#%h6N8Ii_eJOm=5 zW+ARwrZ6#o=zsL^qQxJC^h8(wX&;e?_|RTjVx+!dTlfQyR$AJNny20q;z!p0$r7Zl zFj5!djFgD`i1fKO<5KZ(`DKI;-Kz#gcGaoobwS)!oda9!7-5qK;0ro9=mUWZ8)p(3 z=0VC{WK4_~fsgEkH_TJT1B;*N9W6(45j`zA0htxV9A&>MXVI0quzE1sgFRBu>(_{CAzk(b?Ym&ef*3v$k`(wdUW*eg;jHmBtY5)dNz*2M3Ce z`x3N){Fn&U^z9R>aU%U>IOVv?C-lzU^KDCt}h~!UYBAebE+I|cP-|d|~ zd(-rQ@~Y`IYdc?UeZ2W)r*ZslXS#k|JE~VVhHI1cvCV$vp*}u0Sw0Lh}Wq-pBZg(0tL};&%hkf?Uz6#P9$1{_x*cEAemR`t6Q?C-~a` z+Q;3m996%6@=5-I8%V5grGQV_F7#$&y7ndZ`0%{SELI=!5tk;c{K-su7g3s(R|VcR z-MmbhYeOrGKkSqAY5l=EB)3ni(9Atbzj$wPb?E8k7junU{&%_xt^O|{t5NF0K(39S zPyNrfxpQC?wD@9w*j=+u>(gJZ)~nR=$^mQ)O)KL1q;dg|z&HL@C;1h$xUyfbb{fH1 z>4ro@WB|24v%2fdDt4TRh(B$Of!+8v{=e! zAsigkk2~K4XZdCIKa0=&3yHA;BKet-s0FMFqyHXo$^63==)@jfc{){pwf=Ggo<`&l z|H#M>$=8nrUpP>%nl;LQGtTwL_@nYCN)GmNTFZ0a!pa+a1o$9y0>4!I6MwX%HMsj( z^)=S?4N3^2{>cNSrOrd5MpSQ%0OBR}xP2f)MnGWj4!M)R-^ziq9(Xv{oN@9V~A4&e^h?8;z$ z?o~`wj_{#<;&bh8zJ>qS=z&BL?Ju&WaX|b+o>ec<&>|yL>(=%Yu72*r$NN(z|7iZ@ z%-r9z4w7t04&sapR{t9RHFo5eA6}_`|KmR@hu>nY-}Ub<-0>L&?%;=Kw(!hVZ|U3k z{XaKG@-MYkVFhK^-(W9MRWjUT9%}*J9U&H5e6CVtJgiCXgLD4&$lfV)n_8F}h*rI5 zo$_n^#W&;tcW=EjS6G%AWR@`#f0D4jW_4svi8;iVS_J6xM*c2*>d48*TepsG@0~WM z>Qz}`3+iLW;uhOvfc2yLtK)Z%Jgw|_<$hB$aH>qplLx75AwSVgE<#S~j(-x9oLq&g zV|n2=fs0a$OiRVFDDsD# z)FyYPkKR4M=InFdW%g;Za~Om7nfe3%FZj?cZ6NZ?`kM_ReAJ(r-}mDj0r?+wId)2D z;S7O0CcpaRlg3E(3tjn$28Jr}&FRMD#w}-mu$L7xV~3ocU}V-AYv~RM`>%8I!~RRm z#s%05t*rI`R5^=PSIm+psg!v?pobKfwrZW(&eLZ#WWdQE4kQww3V8PB;MuO^-PQJRiqX`MdZN} zUHB#FAN7C|Px#n^rLbCN258y*#P%n@d|a<0Cc4c_!AS6!ILxUM(M9jbs(NbYkB9na zR#*L}TgmsM&bO3VXf@N2BJk!mo>J6QTv68dl zq>wETeb%j{cWwLyYRuwO7kaKrAK@O{;wLkXY7!b$E0Rl|7;E14DqOFdmwx%@)|JPv z?;lwt)~n{kveFfQ5&zZyZT#oXgz~fMW<=%*d^dg~GX_4HA-Rs&2j>=O>&dc=X>%u< z&(h=g1u_}0qI7yrpl9&d+w7|KdwNG(?9V-Ah>!S)EQ_~@fT8??k8?!!B_}+COe2cR zc@6NCFRc%Bwe!kKk5wbld452C83P#q^b88;4~U86Q1NL2#z*F)sQzO9g?&+*ur|!b zxJT#tFiyy&TI5^$I%@+ZMs*umL|ZZ^a}B?{h(E^un1OpelEgpB2Gp>F|3ujOU+@ho zJ%i{ZoZP^lwJjD8@u@$=dPIAz?KmH`OetvF5Fh!+O0V%(bw-O}hG_q-`ycgQNC6*_ zILa2=f(JY3Gq1D>bigafS_b;XH`PCVJ6U2qJc{fe5G6*bYz>X^Pe28l@UU3#*-K|3TXw`OE!Wq#A1JgLW7z4`GS zpY_VO`c-XW@f1~dx$tBApC7THtO@$FRw~+xo{WcyuhGLf+W3L2Wv*u-`Nr?~8Z-B( zuZ$xu$4WiQQG6>aOJ`QU;%o+A`WQ^KZ7;o(lk;SH%3I=~A22u{pM>D8SPA+Zv!ipU zdu?0iAOa~u;vBY*+`|#)-k$GcW-<6&D_Ap(BYFnF*o}(&+!)1Vgi%Dpx5KeA5BMQBt*L@Fl)#KdWVpX?SAv0nf}XUGq_1khPOR6b_U}`$grjTyi!=#%NeV z$V7Ey0LcORpGW3&9D+eTAX0a1AG)dLk%wiU^p`hW>uq~r4 zp)0cp8s=ZfeBMW2&y##tcd2+v^W)7-f4h5ny8Auv?d|RT{V#v}>wanf^RK6W^DEuo z{r88m^3R)}oBsKyy}k1LxVLw`zUkleuO6=+XJ4jAmf05y&#oS)M?7cblRS4vM(ugl zPZm&;PHO2{U#}^wykFi;`AILk9PMJdYrDRBWXyVNdQzd6qCDF>SwB6xn?AfgyxvXS zLruxPHg$KSt@nkwJcVoYv5V&X-IPL~RnsHTmxKG|?8{`~8K|#c+kexq6rdwD>igyW zQVb*uNAz#{aOY}Pxf1m0(Q-g}c)jT(HBT;HJnt&6w8Rx>n-=Hib12IZoTS%o@0Sm+ z_e&^ZC6mR|416sB9bCLn+8k8PhGt}d7Nw4Vsn?!&_0{8Kadv*v9nMFqry1C2NZFZz zFFD95MC+_fUs>;$Xipo?lU*+4QcWZ8_4@35FdnV?o#8xZfAIoGC*9GC`s^GXc!RJ- z?8&ojYu;0>x|ciGYh97zrmx=Ngp)oyAI?v@gK@ueaM~_=``d*%p0wAz@4Kh{e49#p z)Lzx}_YYEz502X_xBILreC!{TRc~dpla+5&O8>V?U0Zr@@*kcaHnO_ASp!n$MJ*%N zQQl^DdzHWRS{$_~Hv2-Y_qBK1yRDqFE_1tW?^kDbS7uyz-SEH@_xDZ;G83wK)?VJIeVVoPs(Ux5|7pKVD6`lh2dSmx~R4LGO18XX8PsDZ{a)^geBVJ}IN^ z!ajKJJr@bek8*e$4h~NX+V@YZPat-w&puDiC+C+xPtMP}vm@}az5WM$^QiFFl-2QS z^!>Qh#WR*tMs=>?zl^`LqSR#^ZZ~Zi!_(pI!D;V#a(=P6TwK1)j(&W({Q1Y1**}Pb zmoNCjX~A#q-R+=ryee^^M1r&PloFfDzKfUgTNG{!zol$un=$LlQ~dYIA4l+9%1M_w zd_DO6&h=wc)_47{Ys&TdZc6L{|Eyck%f0VC55{NR%O(O47sN3t86W94v9f6$89VKV zue8H??-_qJ7#qKg2KQuMB{EQtR>S%A8g%f7^RsiK58ByaZ6dQA7^N>>60y@}RzAWl z@dgh19ilDhW*tOMH8(<;-7TQM2Lb&VLUWOTN9&w3QAl0V9Pf(@fQ5S*jQ~W zCK?hmmGR=`Zra%2>EZ2QT+XfRqNbH%TCgf@<}+if*4^XmXf+sf{(~{vHXk4_AsQ2p zk!1GeZd&Cx17Rk`CuWD{-O0@?o1|C_#=7u$@{Tw(S_{X=22 zf}fg6Bq!yGc_FnU@*(K-JN*tk490`v8yd@hvrcjiou7mZy(UVUO&7d zfAE7O7eQ-hgIdzV>rYQlv+FfC40LW=a|fF|3O#U+!5_}ah2WPTJdpc=!KmsVi!(#^ zq@&BW=FP~wQM}E7g=NGZv;)v{|G5F2bHzt{Y7~yP?N7Uwsy8VX4>#z{6HtGQkc7G1 zyKocy!`rj-oR{(|z0V$A-{Uv_r@4ROAexAOkPp$hO=?r!!3p{Ze(#xcR&QpqRfpJx z`u7xb&!J;^!j3x_x5IyBL{zi{#6c3;`MEg&(djF80weXw!fvsdj z%Y3ynHK1JeETl47B>s42XokJw>yO&_)&D`sGp$@~W2=K$Le_7$7cZlg@kf4k@p%ix zFGqgxwmvVP>^S)NJmf|LZTYc(Xk{Hp?9AO}>})Im?MD;t zsyx;BBfc|GxL$)SK6S~zHt|2cR9m8sh3ixFE50jZX{?85?O)4LR`^W*0ls|812ISW z@0Z|5|KvX+>%%KPGCC&*&in3OV}=?~OX4U0*w)h3BlaKr%l+s6k$HH}Xq76QJ5mpF z$qIXX)le&ufEn-q-aa`l1q%F>-#lo`{^p7Q=+NTXYn4^M%yA#SHgR;aAdiI;vsbN# z?>f1EqJvH0{PjLpkHIJYpPi!_o_IRc7JFzch5gfAoH_jNsB%e#~FOg&d$Cf9$20>k?iO$Y$itR{pPsP)s(&m~+pIJ>FFb?aO~qEziR8>Em9+6!(<3v0!C2(j zG^gw-{W89iDg|eZhB@QmJia?~P+^4;)n1Jk;NyRXja?&u?i9Am9?q=Ff6_Hele*F% z2llN0<#fn9eS@e-(xXn{hQ$95=ZwJTjuVFdd;?ecD@xta%An0SXDs4K{ zwJ_$1|K#S#&ko<{g3k&p2M_ojA8#k0coAt<8;;*m9(`dlMm=`$HRugQ)W^Y#CxAN`M3@DF9JO=+v&6ZapH`StbmaZ0&oa(=XLo31C2f1Ij<^%;!VK0gWi2e!XxkLC zCiCuXQ)~CVf6~Yf=t(mxp%2}xb60E}ezJ16RmM7B_qej+*PZ%Hxu~+$o$X%TW$(RC zeL}rGm+^M%8lNdMTCaCnS=;wrZYm#A$avQln1!MxINNRZDm(rO?;5Fh+j>&W;JNTP zSugic6hqoMkKk4s!Ojf(p(pL^cC6>4j_)#!ERD2}+LV;2G;VNkDb{9)b{cV-c y-Y$Mci2S=2y(?$N?3DM&g>;c7JY-cgAikrV0J8Cmu7lt$VkA=5G0vK_!TT@0_4}d# literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/junk_crate_top b/soh/assets/custom/objects/object_kibako2/junk_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..ef303867ccfd03e50cc146013a7ebf0ff58bfd2b GIT binary patch literal 8284 zcma)>EpubZ6^1oID`qp9t)QTwP*P5XNFY^KK+0wj6cjW`)ym9bGP9td;J^e%EP`e+ zG~B-sKYsSD(^vLX?R5Fx{y2T!^WCjGy?&>~QJI2uaq$d}8Y3kG63H{>gaq;~2{PwtT4^LY5wcOo} zwLUl2GKZ+m_fuM@uY8C%j?y$z0yf< zbVZBxP`e`uo}SLfo9oNbY}o(l&u!~{>o(SyX=y(9-P6u@xwNB}ivGnz+Tb`iex_vg zoC-=>c7FZtB879yi+#iX;5h8lMzhhZO9h5&P-O%iEi2(5#aB->(2l)t#nJtf6Af<= zb>br;72&PpEwhhj9cE3lffSxiBICN8ku23(&UMK z$62qp7?aazHaLQR@c^Z<-Hq_|kU9uH+LIZ{0_!2!V6$#zbpEz_SVc-oat#X%j&MtL zB!4_L$l~vZfBjne>k;^rhFvYgy|krg_WH)oc&6+>ID%LiyWNwm_pi@yhvoOfe^=t8 z|Kvm+vKE1KOJ)49y1KQ`NT?*SIaW`ck}L2Y9Px5npTJ)a_oKt|u>8+h`{R8okcg?t z_^a(>d1#QWVk0&{^JriC5Bs1|Ev>}QZ=Nlj2&>&;Y0eIg;|&$~H|`&mkO(AUfX4IjIa#R1_v&^abdw zQSXVr(G1(8JLdoqPi5xzgN>&1(tkQvUuvmpyrG}PLEjN=83xo`d>VN5_~EV`@Jz!1<^nFK~jpKL7$d7 z^8IjF-oH}eLC4zGK+iAz7<{6f98`DePtE{Npt3&^XRhh#c%rp@D$iesgQ7<@wiiU6tn(uaOoXUN*0}*6foj=OfN^Aa-kGcO0j+4{P z69^z;`Lemacq18BG|(b3D@B|9K~kF z!9@!C$X5Q*>al9})cf{@6PWW?dGHL>!RJ>XbvgQj-^DaWc?Q2EXrm+g=Zy^fu2%oi z%yIC&b>}Y9wSQ};Xl4~=M1xBr01Mbx8doD(&L8nZf&SQDe4hT&B>z%NjV0qN+=xHx zins05c_Lm<7&+>SBrSd`8D|cD$NoHHfANjoL^Pb$(Fj+9WVn*#%z!dh56MviY_$L~T z=S06Fp3MC6agN?RagRlke|%WWD6IGsA8C~X|66@lyWn&FPv=;M8NI{PW{;>zV}H(_ z)CC5*fkeUGjK;iWEwKef(oD4GH8eKAgd= zJR$$3`ivj_Ma>gA>sW(_W)RWG$#eCqG` zBd*H>aPiK7&r1L6OK)khAX1_S@ofFY65Koe1yM-yDKvsQAM^_UCRwOxxp2$?c0bOnnjiVte)*(SEyU#5&$$75kI_ z;|=`O9_jogj}-n-K#OngB7qUr_KdXLWbs6N#M{2|cpnv??+PFq{ovofaz|v$*Z=zc zJvp(4?0Q*Ut+de_O~ehhu|SNV4|Y!M@cqI22WMf+o(V+IZ1xdeN9PKjPQqiyme+yM2ew zce_@U6*1Xkw1{Mc)e39XLX&mnXmQ%U`NvGqLl4JL(uZ&8+?5zdo=~2@vvOKp+k97=a22sedZU#hzPuarC$1}B;H}{xSL~1%U5>%w| zUH!s|B=wG@>RI~ByB$~U4}Kv;|9C*I^$cFk#CFjO?L;fh=`jaQ=sayW$MgWY@mF>e QgISwALI=;RB}=-aI*CU-ngE0#2)aWWm-h;J zg){~s5W@Egd4;?}e!rO=E@k=dOOPNkUb9<9F_k($PNy`$no0s>4Y&$Pk$EP8vdIoLw zn|*z#Pxa|=`Z{_6eP4Y4^nJ0}uXfAwxjNuZec~vNeyaH7m*KiyA6KBI&KRwB**4p* z+sTacUy|aJyY(^0h~L708Lf7tWx1(-hVNuXU`Dq$>y}T&ub1d^N)P$t*BUaqCfi=( zAI{{j583u*#N+x1{6ir$#ES`px2-4FxeuzJhGRz36 zO4?s3IeKc7HU&+FM%l2VDqG}6haBX-DdqkwS8|7UK{k4kfpYvO!`mp|8r?@mK;I=> z(2U1)n;uEiV-{smJ_J=D;Y8c6a*G^)cW?*Z%X9=qF`n;FmD#GTLij3Uu7Y2%rVy7E|<+5HD3{3(w*GdOnRck!RF zD&p-qzR2ZNIy}c`yBRO8ygq)U0mF}rae?*MX~1VkWXQ=dIri}d;opc3ll^AWqxUq}RNh4F}^O5S!DB~BL&^wHaFmF;Lx^_OlZkZvKCWx(J zT|KU0oJdEy8 zr?1oIPH5UpyWVg=t*0Pf_c$xkf_-tJ_;FE{$RSbNJMr1QTq?4)Sqz+}h# z4d@jlNNg)UuR-0NK390Yj=lVG{jhh#99i1v>*(uclN;1adTaP_Q3C7}sas7BghFX}fCdNahLe(qeIoZlzMVm)~7l0a5g%}S4(o9piMug?^Bd;S6lt@+JiOM*MF5C z<^y_ujw%tY}vt!bYyx|0*C4}|G50T{G3;|%DL|7 zG0>1`hWbfr)&IDtD%1_%Zf{s0-Va>!T+LAd<;@ekqK}_8tS*G2u7&F=R2+M>OU$=_ zI4wU`d#*9^ATbhaPB;)A(pSU(aGejp_czx4M1LB79X(e(A5QtAI&|_o;76Pv*b)8E zI1$XU+Oh6=0P7VO5AG*V)TJMNjANb}1TD&asL$&De zuM_ij?|tTZZUBCu5tAMAvkhI`LCcVt>$T@G^u1tz@;E&@Lse{lg#J5x@Jao3z9)Vs zy6mq4Xa(F<nJDXgZhNEpf%@{(PNu)U+>~E5!6Txr&EIKA?&bp@GrO@#ZTYW41j!b` z{+4|=d*FXF`y+ygu8BpNd%SdW68o}WID+LEbGRDFC-a}ipAXkA!W&f&KV*V4e8?|) zRI9?TtMWleRvTAb>8%`igOzBf%3F;VtNcIp@h>irDYn^y{-$1khW~3Pzu>DE5eKB0 zfrrk=X$SKVdV!9VmOhD*(|YVUcMPc@|46-#Tv#4{LRJX=7o$$GnMCs4ed+X0SM| z5?_&7Rcg!7^_m2@*q{WH@Eo3}i z%UvD88bEd+_US9D0OMAoA?C;<_S65zh`*Fy_5zPzaOTe9?aiccO~98d9X*`ZqxDD7 zCy*Z5`h;x%33r4ZPeLtL#g4fzAF%px16?O_#J#GVHnFb1Lh=h5Ry&=k{-%gIM0JHU404>t<7Nug*2x z_uK5}W&9fK@9|sAPsu4M^`I?q0?t_VfD7J}R?FBRk!J@)^b^;p+7VxBvjVm`rfvMX zZl5de{pAh!UbzE&hF|2-1M!7859=&Swf^|9XAZCSfeT6>ViVdY^q|iZEEDt(kKLv% z_nf)wH;;60nY+)I_$Hrd6Z6r+4s-D>9=_$Z+(Qx#D5}M4p81T$UqlJWkG;-_=-k^j z%BrybP$j~LOn)W~Wq{p6dPkyNrp=)r9=%E}i zx@Z)7FA@<~qmiC97V49Xe_DTN{7;T1Gh>fYHnjDJJjwirYEo=2tNC#cUcf#2D*Rzp z%gStPrqb$ABfjL%$VI3cDi;O)Q~rQ&*gR*bi!J}hMK*wk1D_o5D6Pm^VsXq%TR*@G z>KVUi?g1)mPiO@CBDZ~fw72i$r~UVDdH>P349*6E&mkfUi3g&k+SNX-(P)|A4=MQJ zn7;nep2fSq+}6habGQG%6~+v5PMTG^KFKlfUvU>(ax*g{+FJcF{-cfkN5kx&$GiUi zC*NXa=MQg8@}^Mt!L9_YISS>FhCfG2$aX}JeUvUB&{ z$@k;he@Eh%q~5ovv#(5VpR(^*oOLox+gs!wBi29hD|bW8Cic~D$uC2wOTP@4CG#bB zt5`R)cGve8zQyTRSL|P)&7C~dvD*y$X{_&9+xz`}sW8K?Gol@GKEEmwxjymR=8y67 zhPzd)lmdSLtKWC*o+v)|v^K!yH(kS*3jYm0zmIZ8et%uzNyRJ s8*8Ea=pFq-YqbArM-FJy3;EyR^L=tY$QzFB;|I%YYgw}Lyhr`>Psk?v2Nqc5td^Jv>+Uyk|o_yo!FUG{xu;GE8$>BND-^lb#duZO#nh51l=Kx%X@{q zLK;C32;qN)yh2_f-#4?%r7YiF(ge{!%O$zoZ)SFOW;pEidc8kS|MYZ&rD_5tN0m#0BHoMKP z+E?f5ygz>(zJb2azkmKd-|SZPvV66B+^NnS#nCU8PktG!oAqf0TI!6^s?N6AcHNAp zod22>pWLlaIY#^n|82OcNy~C$e}->lMqozwx9f&a#fNM38KsB(@u7l@=9q1-@%I<< zSNm-HHe|a#0e|1hFVYA3!;IN>JY7Ny+0+Jzs+9;lnBz(Hhzddi!#gzsYZKOWpi`PS28ONtIUVF+BpipGQi-1KFL~S<>F_O=(K$^Zbk}JC4BUQlAjc%N(POU7S5-gQW48 zILdxxJF0uPy_^35-Htk_|3CO~efNRB|^RDq;T*%N|og4ow%IG6i; zswL%if%wvJ7(BP9-p!UznWB&%O{WD1AbEQ$;r{p!rAx_)Sjs(R5zEc?&i1{IsCY?B|M4^_%1pkLIQu` z@u~d|5-_QWiC~L-U0HFR)Q(r(o5aLo3Dl*ZH!duFgI%9A4zEtcSGvT<+5$r*?jVv2 z(J)s+yrkvI@KhNvREY&NEMk2_#VcL;f@I zz0EO?WcIhJH+DQQwu4`AHjz+vAZHKgA}2Kq9Vjotqacc|s4pd;LxaU7{`zE)^)4l! zT$a^&hB%xJFY!4KeL!bt`8nM+-s#>|d%M0u`}6C+*g^jNtWV3&ktL#c+MkgDPT~K8 z{6%tfk-wiiq6KPPXM~q*fLXwK_G$UFe9CRt#|z)I1koAoFW5iwhHv+`%nu*?=J;x7 z$bj_9r~q3MzT0BKiM699C^^FMgJw12_Dje$G^M5E`q0H z-cR(G!Pnud<#B(`=eG6#BLn=1^8*|E4Nqy0h@_f%&jQG+;cB>kT0fc6p)WFW&KU@3)Rvei<-W46G z?_qn1pA;TV^-o*w`T*_<9}nm!ReEv&9>hmGO~`t*_y!}RoNua*y!WlnSpQc3(M<~P zlJ|8cT7r5)!J(|6OAZXiBDOI?NR(j2@fHy5Z)ETs@moUd+ixTSb>-(edHr?erv60} zY!BTGhr02U_f_luJj9=ov3Q%v=3)JP^xf=$|IM$zkAIwjGIw}sQ7GN@b&;92;&uai z2gvXI@7;}wkpFb>LnOGshy0>Pv1zOV_Siy5b{ltG=~g-LhE?J^S+{CjBkTUDk3R+C z={B3w-qh+Z@I(F~_>A<7_d<#pcxY{$>)< zFx%5yD|iLf19jx%Ponzo;4>3vHoR`G@pb=dcCXe>yJj{c{GcU1^D`H3um`)c6Q5q9 zBR{m0ZpVXQb@C=I?_-F6t^URT0*f^O=HVorN&CK44s{e;a>D2r7lCW~g1Aus9~X*` zdYsGpm#CFVovVHyf8nPk-lMhBL*~pLA|B7>u8v?1AQgyRdSDjdxfO4SIr50tY5ybm zU&=4FK)idt3|Lvbza1Cm81N-ZM~m}%xc&tC4APdp&xrP)aYyL+EYx6E)U?dJ&+NnW zb)QI!dwAzM#=8HU{IhaA9T%)(O8i=?~Tu-(pzT{?zzmrqi#D{hBYFYcskF3420(^mA4R@V|BNfR<_Iej^bd>OrVVS(toqF&tu3?qe2wqr6K!HX@jaLeZ?p!s z<+R*E5)CM-dSPu1p7H({UIOx?))^6zlarU3 zzQn{P{ zWAm6HFZTIQTx5M%IB>bPY^4|Zo~$_LL2}STzBR6ebk@Z`U7_uBgiFb zRB5kCjQRMCbuWp{jEv~(+b8`$`lx?;%zrk z+&`hwuZJ1XL;X46hDvFLbhR^78dX4jhyM8>->jY8X6Y>B@`2K?$xPEE!$M(CEyN+}B9f@C(I^Uu$ zzB0Xk%74e=tm8r2+#~jQV*V2!SPk)O;=lSW`DF-s>6gK>WV~dxig`10cYS~1TbzD% zMg0POR`QU?ZZp)=nBOtCclCYAFhkWD-VQOJUloa5o%wC^$N2e?)hcF60l)jz?>nj| ziqD$X2DtpD>+vPSe}~WSqnwf7UspBjU*Y@fwfylxt5x~&SNN|s+g4|`(3X?`BYd3^ zQcs!xAPbxROn&AH_)_|j{CtncSMMPI47D`Uy7?JC^)27jrS`^L=rQ_0|IixOe^rwM euIZKh@9_CPIqT;~j_u-ymDk>~WajyZ{O8}p+Kf5? literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_side b/soh/assets/custom/objects/object_kibako2/mask_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..634969f2ad117d3451b8c75b9cc8f9493ee6ae5a GIT binary patch literal 8284 zcma)BUr1ZopYJRz{mnyh1`(%-q#}}rQXC%!$W0xzJ{aR zER&DyPfmRB7JYWmR}!>2Xx3Vm(^6_J(F5{8e^@~Dv3Y_cEP=i|uoRveh&JO_re&UG zEHwhcTC#^NC$tlGMtw_A9yW(%4w{y$?y?lid2n2uqdWqA5H{%c?@CK_iAoN6f!&h) zn>y_6l?{KC>L+E0da&CVdnz%H5Yf^uDsEv zqrWD5(c7szigU#|Nc1-IR@>0tYHzbQFD1|yL6n3tHn~RO<_I~xPq+3bSUp^D$`NH#s zC>N!VZatE<7de&)y3Lx4=k_Czfie=fb$QzekMQO5t>lIjTFCURr0DzTFQ0wk`RZF+ z`_J8=vFjdwuQMgTEM=MJK6JUyFCH&T1zl%bwqPyZc3)wESGQlm3Y1dF$2YJ9eQkXG z>g!j~I(hpQ`+M(88~^G1iTBAL)Za&6$i}x#DkOoFW1kZPNLR@HkC0c82bxlMj5>SU zW9(IZpI|WWdt#I7yG(b>{@_b)kN}~I|b_Cz|PWH_Dk{Pv`cBCC@Gnq+dLT^34x>dJ2 zcHgZAH^Tk1n%c|;KBcq+Eo=AC+he*_@2?*7UeDxI!k-;N%OTcI_IO{b)1YVCGwn#* z#P>+7yaTzLkmMQe2jvwtT}?Un19U6I=6ZcJnnsY@5|uEq)%;D6kVw(xqPfYq?Mm@XDMS{F2Cbf zcVL$rDrc77gq~{8JkWj(dLND&ztuV@oXI#3!hk&5+u)M(Yje#U)-I~Bf&7_j#u zrEMgqj76^*>rV$N&cjjjw0)+RviZF8m(hBxecl;wpLNDb{I<{9XTP6y+#R{l50)g2)*G>FZONj`q&pmY=9lUcr$mi?xf#`YPnsbP#=}L zb;f}MJiNaVT=|X*8b8Ok{X)FY+8^5=truO%Y+2*z6KAjbUHyAC<9!|LlM#y8jl1}W zd}QQNYkAGtDYa>wny1#j(9|vZ3#|lCiA@K>i$Mcu}wWv zYz4JwwRR%3M-*f!O{5VW?GT^QN3G?7f2RYm*S_E=Gz34Au)X9i((Y`&Qs~4_#@7NR z1+Cq{*tgE>kjj=+NMfB?VpQspv;(s?W#%oV9Tu^ZBE}vOE8;ywqK3m78T*{`FWIEe zWLw#t*;*nKtgSipQ{&X=@cCs_lF^yn2>X8-H9E1m|8(dm*Gr^|c;j2hwqkRO{fqtK zo0S6nFxKz(`d%L#16#ybDpIA!`UVx8feI2muB(@$Y5_*{B7?4Q+=$Jt%I&_1*F_3zgPXMMic z>XZqOhZo?DlneOp?Gpq_=zYmdMS(AaQ~P5_jsR^R2f8H60YaJE8Z#fh+$(IGcMkGq z*owjOVysTaF%}h!#CiMdaLmGp$np28(WknDku#+rKI3X}wm_t9Io)2b34F|9;WzNX zdMumQ3(^~`7gmf&2l?{w?!b?Yt!Jy%_38D^|n1j zzjd_!Y<+rJi~HiKNJ_COUX5rgeaqGL&6gj{Fs()czLLmb6q<*lhodEDtUs7KI2LCK zo}A?A1t~`MwfB~@9cFZ>VhyWDfH;0Qy5{%=s|v{s?+&b1ms1fRFns}EAf;55Y9J*^ z(G)GBMN;w9{KA{AKj;?%`eIwAjM>n>uKU6A@1|I8k8r*|kP+n!>3< z;H#58+1*^L9%J8nn@LucG@txvC3feqX)sq^Zf-{%+kKGs=oH&l(j;dxb_mZ3G)J$b5XwwhcO!ya|kC-AZQapmLM)^Q)~t=V;6}7}Wm=oBxWK7YQL?*h4#WjMqKfqn>kaolp|^`N*!WsD zP*Lg;%)K9^7ZtW)d12-9hs?WxJ?2VP+{M>PlZ>{^g!E z%6)??K(RIJOY|Nb^Q6x+Cgp$^w73fqzpbyNG+-nCxH)u-9no#Q+UXaUVEnVqH0P#@CB7awGYqchRIP@huO?_m6e z{@RWegOwl&e6e?HvkgD${9wJn_&0oJw91n`&;8}+90lNGA8Hr4BLKg^xF1r^6yG1- zvHte^ne|__Lg9H=f6fX-Ja=*r0+@T{4|=#hW|RR;vm;KhziPUuxt=w4IfP zwxG^0HN-4Hjkc}MV@_&;>e8mRt!-zA)p^WQcuMZU(k6YNur22w;{O}bD&{}*m-kGt z{|H!L*`VLi!`k*zUmUCO%RS;FMt5RvPj~gV?Z3m7zm{(z0>}I-@zj}Y>IE_S-<-!^ z?yYZvcQwRWUgM4@DWb)z%hhFVwTgBANPgibSoPT2Zi78}xw^GkD{%)C_?UlO{kk&9 z^^f~7W05X?s8&(9`*8iOb=GGh&@Di&+RF5D_3;dL*k{Wr;68(GpKooxJo&M)|8DCD z`QCNxe5=*CMp{lSr`G$*!`K0de^zXTs)=54uazmzN&Srlahu4~$Rhk-=s!D=n5m3d z58MC4m9thV%&!v@`|mnOKWu*ndc(sGR-Yj$d-^6=KP-GTMK zt)s$1twSE|k0;+)``MjfDmh)mx=(CLw1BwNZ2@0tmw2-k!VX0J>4Buqc&%jKF&`4o zitsdox&&+fR~IeV4k#F9Sd4Mk@8?#eR^rMhV^;KtGyaS9C1>RR2M+{^U0B>p^VZmM z0Uz;?&r}=O|IXzO#J=Eym{Z1eBF(%YmWhXPMz;mNlDd5uL+C#xH)ng2(}+HBKThx`w<}Oc+LS9&k(s$eQdud7J z7AOI4wMekUF-TZIXF2DD&`I>av^aV5K7#tg0!&F{-VgAu06nEGz@MDE`d_AnXTp0# z4egpQZH&mEL$HT30fFK64!1;&4DbW0=m@M_D5TL*seRrsF|35;IRXa3-mfM Q#&X6$YPJAT7ShiD0o@t@O#lD@ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_top b/soh/assets/custom/objects/object_kibako2/mask_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..d8292e33fe439000e45629da4e2315ca18f16131 GIT binary patch literal 8284 zcma)BUq~a_n(y70VID*-BCd#JL?jcMMr0Y9Jned6A2P5=bj3|Xq$15w3BwTc(8Ro~ z=H3UpybQ6FMw3RIRFEbKOJnjhseS6|`_Pn26Ou+kN}48-W^lsNh>v%FzjG=ovwyhx zsH#(^&N;vDeCPXjP98jX@Zewn>0jpl2G8DqlpS6u{?)&~MazG5FWKqe{^7v`TwgtS zU@3Oq&RdG*F~@7|N~_YUwQFs@S*xt&Tdi$+ERupc4=zcvj%ANEF218|j+^6^Y$;U9 z)>;^YZE$Dpy?(2?{?mh9p3iP;G`<9kO?0WybVYHi2Y^f{{ItzDFs$&WxEhYb4t``i*;qH=_S!0yQL z1$VMNc}5T0?Tz+o6X>>5Yn4K!kW&Ue<_`@3I`xJm^Z+x!OxEl*!9OGh zDsZeOP>Boj3GzaNE?FaM<=4A5vb}hRw3|LlDTR!Y?7qIB>rR<+BR@o~9Dt`KTv_PQ zg*jnPSZg5Qf`DOn?1Cjrz{5N)v3jwl&%OkmkPEiLh^QBLv;lF2RUzjh=WDO!-*3Is z7uWwYJ%rv~(^Fb5ErX-?+4uUs{$78d8@=PeTmz94@=&l(Kt%b}xCCe51q2I{JXqik zZPC6uQTb51C|y+fhIX7c$?@5RO4}IG7WDTU@7CYVZqEiJ1+-c1@6x2N{`j@^^`B?H z@Z*dBmPD)VS+ttf0)j+Ywh?XnBi--i#~1$>GoY`nuPome?kFy%KM=Gf%@2gNX-5NCtIt^8-OU z@K%t9S!(kOvwxZo2HpnWh6lm}^MZnQG!y+1S7!Yk`VN2fN8cCU4kkv^Z6jayR@JIE zw`!{8DI;I%J@qQy(Ics6aS zrs$JXa{0adjwh8(4M!pM^>-38n$h;PMQt&?sGsMSb7M1K&Ii*MM#n5RDsF{TP@@V54+PNr9g1k;sQECGVB`HGB##$^F@kSu{G8 z3uC$RqS7wCD81m*^uSwASQ9oh)QQaoBKqD$*=ro1J#t=kKNI%`C^yN!p2!dS+z~k7 zY^rK5pU#?|+C|?N3y%WNY$@<%YPZ*$nbpF;H?W4zDJ0E#_odw*5Ap!rpLhR@{~o40 z@19?-8`kBfnP^t4MOZD+8l5)c4r32vi={ZeZn<0TCH#T;!Blp~lT*&Heq1&5isN!u zwZFRm-;=Fnud|tE96CCU_3WL^REyP^0Z(Bo#O@Q~gJKt)n85#gSjk}eh1RZqhklR9 z1Gu0DVZ=AnX1Q84q4O>`RfqH&&YB5mTJeqO2`Cqj`%3}v$@){6Q!omx%|yXfAoh&qV;`9=W|M$s11zq9l3cv?hHXRTlC zUx5Cqs{X+f*1sL}+u{9GHWmu&Vg2`m{y&BF9pxF*#zx9s&V=|o9__g+cePs-F#-6{gM#Hr|8C=5Zj|%St>um()p+;w*>w5> z9wVD>r!R7avbU^OV`a6h<_h!?&Z)4CZ>V+lm35WN8y|N(uICVlShXKuOPy-bdDV=k zLxH!cAw+4$Y2s4?$b1+z8wGt|Td?y%J28@5tE%uGkGj_wvs3m$3r^{Ie!cSn)M{aw zH%ZjO8oJlbS7$SVA88Hr7ASFbdXJl@_?{?r!h_Me)Oz4E?-2NizKHOpQDd~}okcu| zHjKPgY);dAagN08UgQ1^#(XU9E(Wc<`%2ue;VV8nuh^1pU4NBCYuf7L<|FevEgN{7 z7$!cgU7#Z_;|-aQ%sd*MfE`}Y+SZkQMPy<9($+DC7*is%E(s4o&OXyq&`SzW$2-2t zFZlL@SbMZ-#!H=uzFu!!Li$4U9kq=zvZG_-Gy7bBS}8UdJuv z3e_Tg^Nvzh(b^A;Q+OG0<#H-Gf#(rEtQp_)AYx`<>y$n1U+Nw*R^)rgL@kdqHS;As zP`bURl&5ltc;QAW8)-nRpkG#x*PCfcRxi9C3%!}PdWq#fcudrrWl~k#=_z1~%WETR zBe79s%BvE8NOQSs>Yr(bVes{@D5bv4E;r1{83ev(=WyqzB~ zMrA(UpFgC3%y`J`-cgzDAp(z^FQL`YUh`$Ru`>Y;!u-3}wUgq?;rZ_K-Nj8k8BAv4 z8P%m^J+5yJZ`OAYUVpM6YATCWXiG1SY%No}5PJ#koaF8WB}Rb8M+ZKc*`d}h zdxd|0Opp0yT1evBj^)R;>zkQ)5ST$FsASZ-T30fXR9)5MdOVZNJR9C!vSYTdTLsUc zE}{Y=*(2+!)Jcp)GqtwZ5phR@9R;o5nZj<0K7sh!{2=^jrxGj+3_&qA?M`byP@k;=@y zc0A#QNRX()-@)IQz!$j){b3(p&nbvMh9;;y+`7jLYG1c2fT zWkNwEV@#T{jU^?MtZxk$S6-hu(~KDO0Ej=q)KKk$JALjk$p^Hc18)p}gw;n(3}_L= zUs&$Vtqvy+50Y3{;ON%(rteng>ZKF?7>GjtX3Q!pI(0!ms(jiyrzWVG-Nnje7i)-B zgf45X`GM3hPa^vM9<~6R7ycL=bYtCE;4S?R_7)=hB@gXhewlWr=!$Na?cT;gbQop4 zm!9M%*O%6Zqr+<5e2DcI^Vg4^1f&E`po>F?2VLk<@2T?&>)#66>vitzx$m#MAQ!+# z4DJ>g5rAKu4FoiBxm5ai_R#s^*K6nB8^z*_{`_ebRvB1N6xd$nlNoEySY_mxn7w{P z{7_IovdY>R(DitI7q%$yMU+JR(NjY_i;>Yz;2%r;J{L0o+Z!)^G@sa?;DNq(;*~Yv zV`L>mDeFhZB(UoA0J!SLWNxx=1ze41t;&fu&eu>kpp`yMfi=&7n&pfR;%(! zUr~aE{(mv!0d_!FZcK>7W z$G`yI|C#s__PN6BrlZ^xFK=DZ0 zUphNKuwIA#WB&4-3GzQ?E=KQ1OMv}p0eep|%g(FIZ-}2?dA6k1*Oy8sQrFFg(E5kj z4_htTBWZnjeVEZlMah_CJ6ePJ(2VIv8^cL>;nyd`cTTHb*!E(7{;vFw>G>Ol_N85b z{grvHl5U$tvHIWKBwwHG9$@Txlvdtg#FG@)ll9H|roLT=pFfvR=n1?YTf1!#lQ-*! z2aPf#n81hq(fjpzkp7QxnDg)BM;ld@(TD!G(c4{$V{QsZ)wdQm>(7=DVV`eifcqS> zeQ|j3`tqmN>4(E}ybtXn@@?0XI%zYrnb{q#OdA{`Tq|2zmh-n(#c5&z zdEgrNpqzhrF11vha=!2W7d>aATwK{DCgSfd#@=1pT{>(bwjtkY^bqC!H&1VVX0(Qn zpK13R<;vvY^ZeNE@ZouJwbA1k-OrcbIH$SeNG82lg5M{$BuYS>>0%Fp^)K^eD~brj z`BMW)y~mBR{m}lNcut(V5qwMW%U?{p+8OKw>1-Z1}-=!v1q3u83<-WV}L z1|(p5#QEbsP6YRjWn+cswA=yU1PJGvh<=D2pwEnj+*L7~iVR0mW;W-z-knk>^ z%(>{tkjvl{C#OVoj6A2m$4SeAw!l+QeLpwKlTehH7XS)9D*a1z1y?71{2gFEN88 zamNmwAt9%7X&g^peS)>&bd_%tXon~5Pm(Ah7vvkP;6?3%|67T@Fk7rLQ*{5i!#jE5 zY3*%qe7irIY>j`71fln;90_BHmTtdW^!_;H7JBIN%s${t^p$1thIi3^0(X`aawZ9_ zfQTM<=%gsF7o|x8Czs)%9cIv)=rMWOo%P84`mFzLuFaK z-(rbx)&vkQcvc|)m*eUEZHwEvbG=y0d5V91Z@=70|Gth(-2S&d7dRd06L#pJ0{7^4 zo;yatFIJM=_uKP%CrP}42g+PZ1d_M_2?^l;2FQcDaNGAz;vAdj5u86Hz>-Af`2f!f z&{N6+<8$o({O`&_God}=i@O5u8+&qWIWx|PSnhoK+~A)Of$O&7%z-Sp0=k^DlyHCc gLL + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey new file mode 100644 index 000000000..6bbbe0408 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart new file mode 100644 index 000000000..e79a71e40 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart new file mode 100644 index 000000000..2e20008c7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk new file mode 100644 index 000000000..b7eee4eb1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk new file mode 100644 index 000000000..d59ca15f8 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major new file mode 100644 index 000000000..e930dced0 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major new file mode 100644 index 000000000..ee053858d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor new file mode 100644 index 000000000..c9b542226 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor new file mode 100644 index 000000000..619787be2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando new file mode 100644 index 000000000..8e2e6bb46 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando new file mode 100644 index 000000000..ca00e4780 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey new file mode 100644 index 000000000..b4cb8d672 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey new file mode 100644 index 000000000..a0ea43499 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token new file mode 100644 index 000000000..d87ec4148 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token new file mode 100644 index 000000000..369b6a05a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_side b/soh/assets/custom/objects/object_kibako2/minor_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..27a62c8c4d9c0eb801f2c264e2180f5f2535604f GIT binary patch literal 8284 zcmc&(&1x&l5tefhvJiqX-i+{Ow42#!&dQ@r?noFh62e%HAwD7-dzYsO2qT0sUKu|{ zULl)<5JFspSH_#XLS7-?SJge;l7EtrkgGy7Jv}}BRaIA4Rd-h^mC7H_{&0SP`#=8n z*T3_R;=ld-9a{ck{`%2heqX8JA5|*JLwgji+N0zl-F`wZ=@zZ(>9%{^yX;*JpFq#U z=gBMRZSpp4O;4sLx6|7{ktVO*qjWobnzk-mc>9W$Z2#1|!ndIAW%rmZq{qkZQG3)L z^)B1>_UIGzZTdp)y2ots9{;lC<4;ezMIkN*mP zdZK!4*D*dGzSX|PZ<`*ehju-7O8aw(BAERH6|8#iOZnWw>mA;gJA3uF0 zDs8UauoSMNb-0LdRf^Y1<2|L#bnH`ho;~7!p7L&Kr-k1-9Vg?Y5pHO8O39-oV9%pF z&>64sUA!W7R%tD*Wpz*is;3|==S4os@Xzn_d%iGPKHz zi;bnU9<42=e-9RwZSL}J-&M~`uI!(7C-C<{cz0~sHD-6*Ju;1e0)Lp&!qRb zb9_*jw%@}8c$hQHe~rVidmEpJPwhrhckO~a+$Hr)uFiO>y;hcAa6;>_T)2Lt8NBP- zjXEME3Hd~{Nj>~9kNO_XqCPyLA@qS~kNC_QQ@_ho1fGLjbr9s8WxSF&Zt?+*lFVho zOzlEEq zw7&r3q-f;8%8ve*pr0T?Vp;L|3@YFFT;cm!XygxP7mK`}j)$eyBYQIB>tFHnYF4Gh zDjECd6R*Mr%g}_9v@!U$#(qZ$009;7d-(>*ST$U-xMEoHX*n+KJ**13-{5 zK%aPWL>(wEY~%4LBS4)S&d}~Xe)l+e2v?dC@CHihHXi zzrEIA&iVR>{K-S_61n222R^#T(-v~vdg|l%qos-b7z3rw5_gjeAf_`LU>2|$HYewk z^Q^G5ob!$r0}Y90sGn%2`Vaa=QQT*b;fnbov%le!8iXgLwgK{03Ea{=TZjUSDh^PBU0V9(~=6fLn`UQEzL-;H^Qw~{v%=u3<=Z@@cL{taKWvw}v^|Rb8!f1} zvDlIg7!8O`8k=w&`SB<0%lJ1+t4H*=w6& zXXWW%{4ZqT9ze`F1k#?gY_CQ)rd^CV$5?|uc(Gj57r6X$2OqZ2y)u&E@5J9s;=V-S zg3-5N#(@$d9-rl{)JqN^I}nTbC$j*{t$0IxnblZN`w!rMDL?mvbT^TEOW}$;Tu%QI zrE3?Po5oEOGzRIFr7@!Y7;l8GH$rR7iaBFnR%P~)S9PAq74M2cXBq1J>nnb`ZPkg1 zows`Sayw18;TrhH{{erN)vh;!rkM6hj)1PXB@gRsLDBfj`EU8coRxQ3HI%ir`XB6b zt%uLtt4kiZ?>Br-x53JdzrkOle@aeCsRu2A6L7|?2VC%-l-BeO;(6vkL_KjW6?5WC zZq~=xtfF-=?_FZWH^Q0^9B>4%Z&=!&(LeEp*bnn8N_Eq`STKec3&#becfJYb4Qfzl z2qWY44~xb6FBt=|4)jOe36|aGk@Y_o-^wT2M1LIN9DQ*W58ET7*?I)Ii@&nj62G(aKbm1Ie0<9X?!Nqz zCqmcY7T!ZSpm$L(^pPhbu6iTAt1r|q>HjqUQ2+1Azl&ey9}@qNP0EMM zY8k(1>;WosPiO@CBDX$1%CP@({5|m$4}hFme|b5h_YsX^#3Sh|M4UI zVD9gKauq8(e^@ceiV{~>`g$kMy|rJc_35r+qBT~glH;jG@f+HhwJ6#Y%jPYukND-Y*2}CUN9;+iDBCu;!yCc>SWHC! z@+2l)#Pd^dkRe00*VEPMs)IkTKDlSU(>8W*L~GcGEwKmpbvzFj4wZR;63?IF4Nsin zjo#m%K1oe8Y2p-0$(=Mcan2-lAAQ9hwO5{Pg=>4}#rWGE1$R7;b2cfZ7s(8dnH{Gu z3C?J_TP3HiSUcGD3)XSElE!*Y)>JL*rj2Ajjq94dQ%5h?+yZsQ_{SUsJ3(Wf@9vO? z&wVQHR&kdOnfn*`lh&!2h;_qbDWm~{b?6pR`Kt~pXk!o*ME85pku)NNAur*0`_Q@ AVE_OC literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_top b/soh/assets/custom/objects/object_kibako2/minor_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..830d8ff65b34ca91e71ff42f60422a1981d32a4e GIT binary patch literal 8284 zcmc&(!D{PD5_RTc6k`ku*~nxg@8q5JR#)E4Q^Y06#soVPm|QcP+}(V|fHB5|;8n<1 z%rDF)1Y^v@WEHZRUzlH*bE>-4Z6~>JW;5eLa;w$qQ&nAERoz{y)oOqK_NU7u{Qv78 zfBz>h6#wJjAJFnwbLmHa`(v$!E3VbL_nl$1?hL#4>FyJHNq1<~NO%3y^Q-gg!2{@V z@Hlw|y-nVx?djR{?8o%SUr3YJ{z+{ne)BZ^~{~SM@ zL&`I7+&sWn={@-;ubt-fZ1UC__D`vsN`51~#jkp7K=KB)(1w0Lp_g`}d;iM`TC9E# ze|n~R>@+Yw9=_GS#qXFNsfSJ@oVS0X|6fkD4K#N0AwEXG8vp6wy3=eo&Qcu|!|Nphd_T>A$`JgWa!-++v43nxwZVG$0G9dulT%on%#!OKR$}`xB$&Sa!*(i zf^C9W)_?ab@A*|l%57-z^JE4q_w3K%r=$GN;!}3u&w8`o^Vi>{-ZNYA4tg^8r{0tD z#e0;i2Ern%C+lw0+8jLEwWVw|xwQB-;Kv2O>^+-a*c&fL)st#Mb+doh*&G$2!H;I; zMUVK1fl3-3c?bU3;#2z`5-_QWo?wf7zO1MxRqa*xd7MXL3Dl+SH!4c_hO~(&%s33P z@%a!RV+#zG*h3^2qG67T)_XcKJaF_e?nmUn@}L}qMGjw@GL9NTgd`!K=r+sWET7PR zrFoGYs6@=`Btd>cy`f$;8OYupy2we*LI=u=@F<9)E9y%L z=+I!XkKaG--bZWAC)3^JEkzvew)XMa4}E|)vuvNHj&J<8YH#mrXn%J6$B5C$Lhdp0 zugHACNB?x%MvmJ^ef%PRHj%%c8KMQ+TmUg0c8pBmuG|h!^;6|I>cGW#1mNDeqWzlQ&H`Y)1aW*0(1Rl;-WGL9w67bP;1@pjTGm-KPuL8BJ^ zmslovNS-YI@eyWGnMvLcT+D;%895kSe}79yW##|F9QXnI2R7y#zS0sANekvZV<3NT zesA7h-d^Sx2AvUxkxQbNj)?RB@T&!~x6$Ac7630WdBeKJ5b%ed{egS6Ewv|Wd+Gy3 z47RO{ES%RS4iX)g)r0$&(GlNRUX0Zygdc68 z@w37&V8sFOWv$4&^*+<~K7L$SG}S+C+4ljQ71l%1Ppb6f06d6~Hky#}sPJ>N3{nr@ z`QJVJJ4)bPvby#}OVGF@IFuE%&q0p1h;57z5+xXMtOYpx3v+xIq%9}EtfFNl?aR+` zvikGorv60}yg&IF4s~NGtE<-Svx`4rUSc%?{L1PPc@clf1@Q0p?B8HfW{;N&h0?vR z7nx}*W;USo1o@5sJwD0<)%(_-5CD-p3N~UH&2XjP#86LW=2lsBE0$U@e4Jpd3oce4E#MvoNP_ zBS^*kk5(r;7j4Zx2iJoK-~OV!_iTF-$rm?E60N(MW8}_Auj8QdvzBD|mR3%F%nF0A zmhUnV;5+$YyVRxaQS6`6Knunn1A%WTxzzy2n)%Klx%d+y{}cJe;%Iey_|E@J_RZeh z9J2lxD5%vpZk@qwPjfAut5ysAr)Spq7aRRsn`0ahLO$&4-)8?r*X&-cop#M^hEL>x z_|ih-4d$RPJF)2{Jo%xWWFBvg&B5~RIskiCp8m!E0*iY9%)?3Ala}q>XvefmASZJT zT!rJBz91^p|3}3hK5UQ7=ZW0$4r{LGNavrCKi#z(#Kg{9BYXKVO?S}-_{RSMf0hL|TR~GydnZRg zSKNw+&5fXF{N)_6d|}SYyR04+GXE8S6Kw{M+^g%}bKh_9nC`;08-IhpLI0GTl2Q*^ z0w>^%Sr542J1K4G8^rT0fQWkHS}GUBm)s2Tx3`Wr;o|&i@PHk#COO~;VBfH^Kcj!* z3$Y*OS(NIwHC{4?mrKV5rFXsw(Xxjm8ci3R~!rC`Dlk_`b+pk;JN_$T#7{Laq*SoR-0e9H&^efcF%WfOJ^iEB?LWx+ zM^_ozA3ZHRvXEFHN;)oDr#Tu&hNSk8m=W;xkMg%@>F~QdOVKi__8&OI_II-Qq*0}+ zml*T$6ZgF&HcN!G*&qEs%Gm$>2tQo-`>))!k{wR0m}EtXyDQ;MRV(fMCw^z1?H3yT zYUlx_FX6(&_xAs>Gby|7V#~&wO@xK?N*a-IpM#{ejn6XkWFEe+aqloY7XJ9VlYn@W ztTlJB`L^Z~I-V}Cpna>2Gsk0o3JWlGhyUh1-2FoTYe!m8s--#^S`1okh{6 z_+;MF`iNgWYrSTjEVE=$U61fan12=%(Z4#0iI&OYD>%rIq1yY`_1AR|7wC%Qc5q98J;pfPG7n>qvdXuoVsG|VAn5L$LUHM>p59dwXvHv zl>IcWYYt8wyetYo=bZcMDj6&D zLHFx@-}9Vv-t%>@J32Z#J`DeSXb;Zyf0efQ!{z_|_an?a^@n{KnkQRpf3bDHG9*td3+uW^Qhh`etQTsz&tUNTFw}mWsszqzk<@VF8qT4%g`VuBSUX=F5%Oh+Qoy7KB;f&&A9#)ikTui7 zCI>|_SFfLeGv&%hO?AGa=QoNzpo3#7pNJ)5GtLRO9Gz~v|E5Y3`ZA@mNTSJ zRkQYMGp-}%F4L8W4SIvsfE}=Bra4CI(({v$DB*<^F?uh3k|TmXrFC8|khj5EI@(P_P=T4tf(_+JO7Ooe(eYQVYO$ zL=s18k%dnbk8>!q#*Y(A)L_!+Uhw56Q)`3XfIaB-NBo}dPaanJqFibT04QCtT@};mc8jDKqzUD#<)EOV7@TnZa|5U)xpt`2V*!oPg9$l&=rC(fshla1As8 z$`8lnhwFfMpu#z?k)VlvAVFtPxU?``z_M|gN-km{%`~HfO--9gR350_}4!+pF4SSh8K7214b9CMVT>K6z zg$@fH3LUN-u3%Qp+Uws-%@JqdL|f7~$-6sf5v`pffk@CEt}3aGsQbVQ<)U;dVRCqE zI{b39`IYGQ19?6Y9rf&_ib#{S4LlwnVIj%YzUYDX&|9;?W=US_{& zbu2Hlg59}(59cvI2O>Ns;>Ba9HcnPfj-L#l43T~#N4V5czuakJSdFW$qrk)X0X+AMGFCNU0* zva0(dz00&eE4AqFEBd4lgYK;KN%Vb2e|UdIyD*HbrQh7z-TH3%qS&7nuy4ev^ZaG) zOp51mSHANZ?BnRaVBdV)Y;K-NzX=ZlZ)g_{*!`aFoZpk1)P4)PqZ42!mK|cR%wB`| z>;w8e!D(DDCyE!P-;U=WuD-W!{dq&;fbjwP!{b$} z_*F8FT@?!itCr~Bn;S#N%bi!<*?F0_kIYb^hvVE;?cLTpSmxyWq%DvYga}ce-9ntt#|EC2=>_!vO+@sY4jCcCF zM16MtV|`QEJkf04AHCi3zAM#-bwtMj@jR@D1oVH=zi$OyHLxTLZ4lGZA5R#KYJVsG z5dGxAIAkUmt7Xp?pRK<)e|hKN`T<1$Mf&ah@tuP&N{cba_wCv0-_CQdiWlT<3j4?C z57>;q&QQOH_^=x6-6q2n_7OR;IKp07^ItM1Z(*2+?i_NMx6{Jgr{5}HE$uHIFJ1tz zk*(dAjXNVP+mFv}JfEj;BqlBR5G_Y9aQrXC-Pd@dzZn_yJwfzml?);ORuX~_{aFKI z`c}wmR;%=z=^n9eZT{oNtvhF3+h3h}KHn%m-z^>I-eV5zM&kPh{U7xQ8tJ}C9l{P6 z^n!0@q}~72`{XEoKwmV(s2=oY&R%-wpO?;Q1w>x>{Tt<9uUo6urFYUjiI}{{VDB{l zG5+CyE5?q9~c5O*6U>&?Zt5p|97 z)_2@{&0gl1h_M28hWugJZ;dw8>ZbU7gQNA^@R5I8_>e<$kt+eNhBrTLHt!y5Wu3~G zmk^tX%dOqqv?IB!4nFj!7XTmVd?#(!pYsyN+l&@jE33s%(Zgs5VnuW{=O{k=0Kvzx&Hm^= zB>ymfIfONkhC4@3oWI&AGwxJ^h4BZlexnS(mz_2H&NH=O{WJDgt-uFTvgR25DMfq# z!ThU!jwr^J#1rZ?JF?`&)^6j}QV;N@>Mz)L`)PmXB#lvOr|5i=aQYuB!b(pPP1Z8- zf9^jklK7wIf9d}ic`Ad>*L|S=@QvY}gN^K+qqi#y75wal%Kc~5f95OZI{k(~3yRdR z7UQ4&uRm-oD4o@s_@8(`@s0i(e=5Ivk?ell@u+wvo|`VeShucUIAfndPkhFnLeINy zty_g(T9JMaW1joqegRbbBmR(oW&fnNO~Lwp zq3N0F(!TmB=o?txx8z&gSi5lN(MyZ=U;h*xKYZL|H9cq1;o)lsDxej?cQ)ETCU&I% z!}82Q?2Bex{1`_B6KD=D##J87JkJgUf902%?Gld2`TSe?Ml+S>G$Tb0-`a@ZEBLCv z*a!HWqjiv)w)7W#qP@8ht$CvE4 zMs)fhvgj1?*$2A#ez8CJ_=xUU$fr8-dlkN#K4dSlw(rKoLKU62y->XodvL4~*!u4D zk2Rx1P3(0aqLuWUEzh~> z`l;{RvM=x}i}7uLqg)&{nC8rknQY-Rh9n0_K4FY$_a*)|?bg49Q~%^!Eaotmm}_z_ zUv8EcCtCU=11wH#r|W^-qZD?RnG2Rir6aM2^M{%L*!_zBKt~M7I61QiguhQ~{g?b7 zB^tj<<4urx7daGf1y}6`C9vEMeUgAQ^h~lPt^mrF5WzU^YPsMrK8Kw zUerH(TEt( z{mr??E%d_KMz$WP2O8y_gDc<6JauxUNI-mLnY4hR zSG$nHM>9`XzAo)weRuu9%+u8ah0)^0+%$JnYb^I&t2Q;({txvhuirEjHQmMce%1@T zaY732elDiRS@dunFko3|k= z!hAsOK;pBI8r?eXAoHuFIObVvHnrrMsPGU@qC20M=Q0L6VN{Rg&NZAV{sKRR$FeV# znA4cxoyLbovAO3ClQegzznNV(&vl0JMfwA-fntvCy;gZ3tvPGpZMx3&Bju{nsYh`J zpXz@m^iEefD2jyGZ68yPiqn2%$7J}?*Rh62={4J>7Cjv4ocTs8;BbYka#U<{qqN~=bfy$sVwd4?6aL_8#@-1Ck9Woky;{%A~BFjlH=v6%!1z9c~BNq gE9lI#@^-X$(DbS9fZ;`d;g4%nRz2e=XxX9v0Q2(xt^fc4 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/rando_crate_top b/soh/assets/custom/objects/object_kibako2/rando_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..2d211d61250cecc2530ca7829c1fe873e169ce9e GIT binary patch literal 8284 zcma)AZD^a<6?O-Ph+t|XMjb-ICX^yd2=6bWUz=x)u!S*|XS&LafxlA!XrGM{2?q;q)UGl|dot9Rxd-xlp||Iz;wfs4dNU*|^DW+!C!!f%9nOZ$SUW{|<1#8zCVFNh-EpoQ4pQ4hCmrUN zYr8ABchsJ6GNXD_4xHJ-sac70IEK=uJK`zPb}};}Uc#@ZfCqe$BL0;C>RPZ%o3kGQTk9Y4199XtO2fJR&>#*IYatZ zC2PJn-}Q@minWD;gPz`^KjBX-%<>zxOV1C3qmTz&1nIr>Nq!OZ8C@5=h!**zt19>U z)&1o+LxSs7O)o&&`0${|3iK9ztyUs4lH88Ag@G9I41#)#y~ROK$U_~_4zz@Ld7Ekg zz9XDCTnjIJqj(%co;7})SfT_eBYWCwry`|6k3TW!@dbRX?S1WiM?kpR?RLvME*PTQf4uFbAZGpgksVk<_cU~yEt-MP`-YN%_o zbF*^;q+iTB93?Xv9P$ZLaP1?#{3^3JbEDJtVLczI-%3~k#mA^Vj_TT!Z~Yw8-AevA z(h4Z~`ayW+H~lr79lmyMw%bSg6kpbmdBpU!!V3!^ScB2v;P>_!IO85`C2f z?>HJ7ihYv)?8*nZ>kIptzfFA>`y`YK4gcn-8Pj~VFvo(OJB5RG+g*`-@{t;%{oNVsCP9a#epVo?Dzc9_`?q!_-@} z65XxPL2u_KrDUWrNAqebjh#v(LWob@`&!ATL;>PZDN@eNS0{GI_pI_q_qt1CcSqNP z#o(H!c)vKkbL>g?e)XV-Jj6zr!-N>kLWs3~YM{GS@Fb=+vbAO)D~&A7F3gJjqJ6c9 zuEOXH2dCbz0Dk)pMuNpyHZm?dW>PeztbIGH(AXI$|`ScC!*d-=GI{ zx3WGUKS~TUYBk5CJBaS!_d@=DN)O(lcMx?pU9rBqdTIMB&$Yz0Nu{MphYCxHrNW}; z+qv7vcE|HCV{_3_BGc}^etIWj#XbW62R>wHUSd8Fe97%9z2d9&2R)EENt=uG$?Vzk zH(!r_S^TnS(ErOdv6#AjxpJy9{-^iDGxS0eDc!A|8??W#l{JOARBa ztwa~1&=)W@5ZTyEt0QC1P$%RyKCF4LQ}Nx7pj7 zNA?W;h4M4&iv9;8B~~BC-tPFr>ubT4;vGl&rNr{~ezcxv5~$s-=bxNe0SAVMmBec5 z!4I|k-fOWRtVj#^B?I{S)$8DIj{K}=)Ia?^x$WW)dZZJ<>_~a<_0#O?&{Cm+UwCk) zUO(u`JfAwAfo|&cr{B;oR0k`Qt4AN4W~LDD6(2^u75h{F;(bI%*FpL16gyw$LEvlt z*{}li|Ih%UFc`Ui;D4H38-lMNNU0+-&Y>d?@KfZ(D zgUCO$f1ef5$OE#M{zt!O=LIXH?=$kl{sryA@TC-ecklJy&l~eg1;_6at3#AIca?MP zROS+%@^`<0enbQG&s&e{_1*F4yO9#thI9jt{#!9#Bqs;-J+47dVblg+=`z^klo~J?T%Yao9iA?0-*xs@K!=z;Co;#~`d3U^C-x)(KbiD6c@nIFw zaZ)@F^T7fAUpkPkO?1`3BGCr?7y0oETWbDy@DTxsed);ucz>=OpUXV2oXTB2=&77U z^v~08b7u~EUS`*V4tip#`1eb+RpzqnrkHyr`!N1k|B0`AvnC!;k6Dp3BkYAW|Am8; zj@1d>IruQU)AX^a_wtL`6WKGF%lJOB_xe@s?np!TlgryLa`cT*%0dlu>Nn)K0`R{+ zT3_Rh{wDhh=s-#2hy9QAA^#Raf)Dvi$b&)M74n`t#OS-x4$*EoceZx>?wqUp#hDkm zTK>iB>>1h~W1u$@_Zw3Gr2eYir1NM(PopL^`=8c-`4vBaFJMh2NCvIO=B|AB-Ia?4 zjr$9ee?FT3ykc!xS3Zn(u;#G#GOsiLG5+Cyn?{dXUDyja6%mo_)PJde;UM?Wx{qdj zIx!+wiPvF!c5fMRw{84xd1xO|hr07KZLitO{Dy*l)qlsBMbRNdoa?TJI`GFsB z@F73F0Qf*>EpC?I>A&!u^+Wp*u>@8FK_1kqM^*pMGlPC-^1%t<|NEe4>KLPiv&47# z%NRuc7x@D^n`0E8U6A18w@Lr9AEL+6)08j=+|Y7-pIbyvgt$`W6d%0lZ)p5gZY=plK*g(ctV{c~);oYN9q3BpUN`m6 zoTM>I=@gxBLZ<%+u+o!6l2Q!*Py4eXiT`Q-$L>q}Z{Q*Vk_}DBV>_{7<}}_(p#ApUi*cU%g1KLykuc z#fI$J{L6}U^YVqng~Y|l3yGQFKdw})ik1G%3Us$J=4l7_1W@&l_(T2``_Y!rL3~(c z$36&m@PAvYPiR0n<2&q&_$ycX2=__Z)$xO?p@n1UB3J1l|}tm&U44XPNtdS z=tJQqqR}f={%=L~ha@Hy*PRbN9Xf(~~RfbERiH&tJt@ zckCTX!`{-RW_-zhC8E;@xfdlq`#=}p7oh&Jj+f|;hP;}md0vH6(}(OuO2=2H(fQN= zimSl~r)&PbpQnDQ8J+0tjx=9I%IpBBe?``+5-G*RQqm7K<6|ep$N-}55}`|4h^L0E zo>m|yaC$bJ1`L z*wXbX2h6hJ7>jpr|`wfyeQ*a)?yYf|$Z8ylwn>3@`8PMIk`{U17ICZKNVZ?r#q zblP80=@}-HfKHD_#DI2omut6q(ol<6{W$;1AM|YgxbV!$k-`BH4&&>&x8witK4=T) zJG2-(!lwG~cqTPq= zbRNg3A1Ru0cL)>F>5g{SckZ08&0`eh?O%3G%Dq-k%qADoYc_K&ayZ;M0O|LaQY@f+>z678$#!hs`!iFVb1 z!-wdCh(>N^ab45JG(O_`4Zm@e!B6N&1e`O!TzQpCz-Xk{of{(3i*K{7>3nk(KYL9~dd48@dTxccW| zdKr9CN;!&zql6GkDTxfF#~%an{h8!GN<9?`M+xCXq~u(Np^>5V`S*R_+UG>0QH}p~OtPTq!K>Xfrw&yo; z!}*Oo_?YY?+&q3Va?FkZH-etW_B;EXbKO2wWA}kByue8~l559)$sM(YQCpV@a*vS{ zzpFbn$wLpK3J-DuFOl@`#&hg`3Ftk}lzoaZC98d3^amctDuSfa@{p6T*Z)dZ1X^>v zjIaa~JZNWF+CFtDN!#onJJZe-uAY23H$v-){*{9I9r*a(@2R^lRUN|pmFPv#B3H@Pdyjzz!P;(@xqC--+pH@#D zj7IxJwcKCsdshaL!qxM{c1Nn;z=pOKWXvDuLb(vIf$sFc1Aq>{Stp4PM$k*hPFd6t z(p%IJ{vrfTU^@~tB2hPx_m#i#Ow#H%6WVSHA+k8-=de zt%9HhcvpN~MB>J}V*mO((x?7U{hyJPG??a`2EjYb=fYYj6n_;zv}`|TDM>sMPC)ZDo{%5-gQUuzxA{C z6)jS|_oddw7xi8JzH}$AE|K7~JD0`@uYs$I)NHtxze6c+{Y;52h_k3jjqrYb1y8wX z|DzT#f4%`5eCqFtajaiRp7am;Spz%*e=_T$y+T(#|NnPNMnrg@SfDFLya3U7ks5>s zgMr|3Fs|@FgY|DgS0$;^_VS%Ns^97fo{(LxhJl957I3W%?Ym<1fUejjWUK-~T@EgX z-;7=xy*7D|egY2#x~x7~J+ux8vZ~eS%B`e_%t14J5IhK)q(GdjlJ=r}SatLQ%%q2Z zqW~?J!>_|{Jes{bdp9~1eHuNC9xk@36?UuOZ&1C0uY<4A`ybPr+2E{3y5AHqK?i|@ z`^}TV(Wc3!;17`UYq`Ew(kK}Q8U$@M`oyDnb37OiY3uP&yjd^ZK$HObVE9dRb>U!P z)g_bdr2`WBH{oe6nDODw&drIqJ!?&_gDlYctTlVQ7>~Jjad~z%9@I5mOIy4vV))Irg4)n3Znqhydo#Pe zi~6H5DW=ElMV%D0S2{O+#;LxpHG%G>F+Scr+Zb4e_Cq{i)VuCB@H{XB*?q+1C69 zDufbh!jdtZ8)k;eZJ?@i$@#JJYIkO(lM*}%55yJCwZ_UToof@D>Fuid-0Wl}NXoXr z0(S$;(I>3+BquW;A|JD=u*U5qbZT*~Gj{}+XYa0%Cc<{i%#wn<7G+&3x@x2tOtF?&=Si2Kd{043n%H@|68 z_&Yt7msXm3F{>{fOuPpEVU^X(6o~k!P*9s~iIvy)OHMcS4=hjKiw$p&!AE@JD<$6Z zWn(0ddmcWMKPgNc&2K(inV1WYS_9^Q*}vK!@4wsKK^Y>~E)_`*YSrwJAFV{4L_6@wVn$NFQClAA;V%h6V2S1^PZAjjm%wU>)pC8zxOPdtZ~+fsAstMkeU{E)VEHi_F*rxmV*9mlcGOt z5GQ)qfAxLRAD^`7mz(LztIF?TH<`y6=O2-eUd{^9K4A?^{i`R!8&$IN!1ceOcre?R zOVIb>eIuN2?hikG24Me})-SmPSD^lM zVKt2T4=yjQ?w9F-K)Y_Gu=7Y(Pi)yK;LVihe@h4HB32zE0Hg;#Tb}QioNv!=A3Y>K z;|)9z+7sFJzk7^8@c)eS!TC0qFj}%L3ZHS+Xk|U_pyGA)hyQV}P-Q)@@B@rL#K-Cd zWwH7o1JFf+L>~CHk7u{Ht7`Q>Xq_9O43ouy_^8Gh#MMXdJG))!V+1f)UPli!Z5z3688J2Qp%h0NZxzOFxIrc4+0Vmugq5_~hz zFxp5vs;nY=a#)|yfJA)SAMt-k3mPNb`HP(*_85pWrU)8v{#St$Xj zj_%4(`|;=@t-dzCnckgoKAwGfPPz@hn87Yl#?^sJxkJ0FbzN@CV0IWI8ukBS z;Sl~ertmonc2dw^Fe6ZZR+-Gdv_Cu@rxCIfhoq1jR%iU>yg746^IUtR?ds7(`)}B_ zGd`{7@FZuMW1gmyu3@ZSw9E&m(*&??+@IeFysK{HMR(T*EAoc4m-c z-jf4kIP)m$6`s`L-4re*LAQNc@Cp8Fng3&vz{O`DRK%!?ft9(0KdwCD{EPE1kVjt~ zy*!#fdRckpd_>M6erhf4d^qpNx_MB0KrYo&Ij2J&6>P}lk$nRE|Up@Onf8t|JLg(+_-h9?e&jThZd$sPNeed~q7&GNOppBsgBNKAD zM0Bw`I7_^;lDV?B4*S1eIsh{Cr~TQo#snYwTjQAP3;Z@0|NZ$-XJ2y0;rA0O@y^Kbk-P0-g&bTF)g`64VGfU62*YB{YroZ>*VdU9hE^G211sV+?B1Y0v)AC;D;0 z$60ZDIQwsJ?qx)O74dM#x|{jiZOr`(o*iGHVfH1fN^X}nf15rdf%p&ncnH4{6A;-D zDH&lU%S3R(IgVM&sQPnqC?3j&aq{QGsc_kxsPsACzP%~6hG27dbu?d@L(Cs%j8Qc{ zc%m|p3pK0JCN)zD-^w}U|AhnAzrf!@|6`(K4tPQj3Cs?A%k;tDGZKFWM;j&nBp6q= z+cXX9813ybt;{_xFH{++?KTkV0q%>{Q!jF-jCvnW4G~D8#P61mUSLIxuojBC_U9=xwa?N2$G95chp6o^-)jG%@NJ;J11@Z=@MVsA zYjcPey=umRPcKX1l6g=u-|~@QcT{fFf|6qXwb^@W{^|X|m-T0FvASh`Ge)rAN%?V# zg#3F?_CIp&jMIT})QLi-&uj6?Q(>MB3yH7f%a}_aFU~r4K4H9(FF4;goE!=)FB~Ep z;8XxPO=Z;%?Wq>jo?^a&$R1;y|A7Xz1KVzwjMARf5-!mDAS5byMLudjMag-q>niX?It3M)_#q=R zY6g0dN2*G?_$BKF>yx+7YNgjA7>lt;g>@ZjZ;Vp?H7m%dtu~;*uY`2|_(*_*js@;RP}g+4}GS_wIwyK>KJe9CC* zB5!4W6por@>MF!p^U>-q8u=;hnJb749%2#1b>OAy65xNP(szp*lDFteuC6bDvuH2U zz_-=va(@9&c#Ce5+xTD2B$4R%l*S%M#=7Wrg0Db#>x*%$Q_L89b5_8cT6;w6ardXz V4mDsu=t>#b7Gf{9h(#T@{s-5JmyrMf literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/smallkey_crate_top b/soh/assets/custom/objects/object_kibako2/smallkey_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..542dfb837df5dfe96fc88c97a1be4e27dcff6615 GIT binary patch literal 8284 zcma)BUq~a_n(tj`nn6TFB!~oCM0#WxdSqy3^Rz3=A{i0MWW|jkh-pN$X&NKLF!5zE z4Hs_|X-bh$N(ixOB#~k0@?jv^r{rFmwpv6=kx&t7QkS9W$k6oqy1(Cds_ecm%k`rw zr>f35zwi6b_wO8U-MV$_zy9Mt$NmYwSO2qL=Y{4!{P)l3`ETx}2L1QH-nxbB?yXx^ z%+A^uR?O-)yAIDQXO*+VGqa0NR+Myj&i7`w73JmKl=GP^2UrSZyE z1@oBfBeQw)$;hZ318xjG&+NDMTc^*yRAUc;E^}cfnUS-0AD+9Tb}(w^a{}K{&cyHP zPDv_|gQzkGXTn^<>EDg#*u!(6_d7H8CB~dvU56q+@HkcxIF*)%oQ1yrU$SD5n&V}J zC776ldWNR$OP8|L&Ec6d>&)QluhdEt)Shrookc&F)84UmZcx<>7cy5?W|O4yaX9d@%x5*v)6myn&aC?UAF zC?V`c2$Dc|BuGS}Y#{F|pYcsy^?s5wQ=hH(o3YaP%ai;weJnrbysOXDd#SU^7GxhU zg^jQ=Zfup#tKHR@88fHMDJy5?Xs0CWt(mjl+70_H=d&A_bGANfHSC7vz3Ed}pWSC6 zA&IgUpzEoZCx15e&~jR9b@sqdcWI(DVRRHu3g9Y#l0PYS8kth9RIB={esX}{9xE>d z4y=X+T#R%1B0u$e^?vY{w{qmU+EewH{YK5O%RN<$H*@$t3rWF+l`EYWPV`V-TQ-;1 zg2Oiy3NnNE?V&qE!?-*e9vVg$^|ulvsXwm|f6+(C8zaAg+y8?3zO3F& zeNz>*An$74$m_@}(qv1#HQstRMf$QjcpF&5p_R}Izsdb|##|a@|H&3_yv%|= zYBr1^VZ5T?aNsua2XAw($rc&+n)k$7Viea};%KR3sY9U$ZU=`Wui`E9Bl2xMv7Q*6 zADth;^IBp(dF;{=-pe<4hEe>2(DUzUB;FEwH8lJU@B_n~BYBimBXQTligar?vfK3y z^h6y+UL{7B&2*agU>HIxpyU-%V-XOB3hE#01KORPnNgWwA0 zknwW2bjz3kMPO}qb-Ma6aGR?hTA3e7wZTGQho8up@Y*s4Pevy^Wn7**KYf*69jY&F zIe(&S>9)jZXeDqb-ooA`+O`f%{7S6!n|?b7+nl3KQ2OLrx-EZVbe1M6naVlx(mz7z ziOd74WOxTnfIHz)*OEun!2GD$U8ylPda*^Kd#v%+nQgwmzCUy)02>aiBu3Ma-td9f zEhVko(e`v8(nC9juh?0#%^B;3399xQ5#^@5bB$zm+LP;(Ewq67bw--TO%!$dm?x~5 zGt(?I-(4>TZo}{HgkI4u@>a2vmq$PXRsmW8L5tLUxyO8Q`gQ%~>B5`))%VqR<(YDy zv6I&r+w`$No6G6tbYdi#p8q29*TC(&srV=}uhWYdsUqb=$rL$Ak1TM#5D@t%Tarh* zRfJs-Q6wcE2<-`Kg;dHA`}E11`@4;e>5b{_{C0l-Ub#^2E%)X%eN1a52PE<^{fZtx zzfRpVb2Mj~GrZ#&IR+VF%Jet)7(0T&cuP85q?I5ll2A)vMUk7%55->8I$O`L9$f!? zx&ZY22CzxHjon7MP<>(cGQt}jq*4cCeY$NP7MMI1^j@dGIjivb%xna|X|u8_>Ht4f z^Z_MvSOXUzSRvZT>VE1Ane*KA*T1@YP=C3dr|cWkMD}<%m@CiJzpChhK7NR?#m?oU zcuR04)ef0OcIX=%G-oNheQ9>5TbIqEPvl>jhxHXZE2z3?`LN>7(m3?6g$z~0n+)`^ zRUc63t39hd8`Fz=%3h2-@-69#n`)t4Fnchj10&%B`m@AH1o4{qO7|W<)`EE~r$5ui zteleH#m}&6qSg(d6Z3O&eyzVenA@0M?ICg?t>{r_$|gU%`Tc(Lce6(-!OhZmu`}IH z{U?r^{X`UdL*>()WmREK*;&|hhto&-8GX|2`IAp*qDSH2(BmQF{Bbb1onP%)(!X!} zzHKl_{J~(*{2}znm$Ipa@@##;^jCmh8ZVrr+o1p9fI{Ju@$@Aub#wepmUS$+A49*{gn zr0J8Ih4}D7)Mh)>F>0Q3r&q0id@MD-8!g#oKWl)}Iq#L4F;T(2Vwdd7MRodgVf*>& z^rOh66)*$l;M!n%aHRJRY2b@V?J2Bcw^4s-J;#XiQl{v0^}lZCAo~l}M9mpH2mBr4 zqwbTej6 z(KAucMB#bxJ0aA!PNDgsT-eA#eqUVVhYr$2zx&sLF9y?bi(avvufK#B)|dnGCn>H! za=!*Irw`Z{tbr+i<3i>|mFzrp?T`NFD`h0_Y$4K(!}r__L{1#|UiCe!Z+bD3va#YJ zXdoC^8-NuInSr%O5%GZr*8lfXhE<*ZEQt)vie`E3u*UcYv_30`okzBDVKW9Y3eI@; zw|s=`BR)^d13tW;{x5XyJidBx`h@sP`jQR{g!Dvq?Qcx^V7cIYa2}U3Mn|zj;SUW* zUK^b%0umpW*q_8?*7FJ<@mJxiY+7U#?IgNzfGq1gZhpLau-l-PQ})BoM-${BeiBGe zYLnVxM8(7UOGKyvMgYUb4-Us$CHr#ka?yAT+vkNH0`IVk7h?ax$m>)avMQy8*13LY zBkHL)u-0jC@ZrtZ8_)nFz>*%fegN(dp~Z+70Z;E=|J?it|KGy+4lT6o=6{UlevTUF zjso~jFY__iq&X|q=}Nps3mX%%>*X%Bn|#nl$&I|7a`u}aoDTto%pB=f{W@lD&*f-da9}{Re?B`)=8l!=JVkQAe-4#Mp*)K!^%<%l z)_*7IP+~pwI&f#Qg?f~DhutQ83EF2gAQ7MXNBkevLdFDl{-URt9R+d46hQ(|!#scB>I0wkzpOv} zA5oXN7XFKtIqm#%^}yM8{-}Rd?P-44&ZlhBYR~>X^F=B0QZlvhutkhd1S!sqPOLxj zKlLxtL;u8Q&Vlyj1VZppqXt*vt*Q3Bg}Bcedz|sFVmnWoAK%=6^EGO_g88oc-t+bY zT6<5i1N-)4^uw%jWjH(cHX{Ey<){Cp+WB3GHgIM|;rCLBF#5s&Sbqm6Ta(AAzay-_ zQT3w^ul698f7~BnwYl2Mxc5~2eq;KeaQd}@y_AtDMnJy&iH4mEb^unvqUW+sHzsr| zc})LHtRsE^pQ{8qvv(*zs{#A+bNr=_ZC_EBd~X}1+Cfiw@A*AeJd66$4r)z$zE16z zXHcKuoT1!%&;uNEeng@MV@3p=VU}V>KT94@wgm3XkA5!yA@G6D*w=5xXbC)3z@Geg zyUU!C8XdI?*M;~0y}JJK>buhgaKX3_+HU;iK71WB@I1=Onz3qkx-Hdac1uLM=9KdL>f6Y;SNVe~^S1Updp$>ZHF*c&~PyP`ov7SfNP->!fA%YE!O zq~_nBLymdR85qNHMn~_6@uUv#xW7>x^xBtIzu>=;^*<91TzvMysT@u~fmQene@a=z z^|#mGveG~O^>pDBHMjFo_B+!XxsAN@;d&5$^RW4lvtSSF{njn zJ^d%v^|Pv zpAO>N3s8n;N;JbQ{kF9T_12Bt6esw=Ncg9F4P|( z=1(!ks2U%0qCSudHLKx+epxMG&rm}CPs;ui_&ex-Ms%zJPw2sc*=_Hbe%O2AX8+Il zlVM!h^=TUX813DtR!iASsOy*D_uIK$9|-jTPde1Ej*}i8bpwAjL?DSj86(0uXnjM& z3GDxs{u$X}iHwqn&p3VMzF;pHLT%)+VqZ^tW?tS^m;i^Ovjdnje}Un}0xK z)HErJyu_%UpnxA z3mq$bS)+T+M~D{p)QYQ>MirU0WgS$^#~A?#dPn6(Daa|-Uz;CO__TiD)BlnGSlu$e z857v=t_HbPar&NuGy-(&1E?=gv6$4aP^4$LaC( zCTKhrme#nm*d}eJ!!EH8ddU;t^YWf~GTOm!iQ~!E;L6|~MnIguDl(Uk(x`LjD+V}L zB&Th@0d8e&=ebuj2$drD9vV-6g{6+pn1?|4`2?|eI*$Xqsx6Xov zIt3M)*dZe`Y6e=7N2*Ht^d$ZQe^nsic5Oq4llX6vn3;? zvg6K1oo``xLT{3M(%RU^dWK+oGqYHA?Fmgw58BN&YJZfyW zjN{mDIsfAvQ6)DuBV4(&v8~9{{-b4>^%g@^K{i2)XXiMZ zL8bvdwL$V^=O~g$EE@8(z&RA>o{f`NqPk-^hdhCoo7~MBLh1%hz1aDe}rO5Yty$eH;o z+80SFoxG8^XanDU=gKB?i)@nH_+QN|k!bhi#-2jPl8lD;S^EMP(B1lC3MUZE8R$)Y eV{S_A5fQliQ@%q9*blOj2eySg4v9q>cm5B<3T&GI literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/token_crate_side b/soh/assets/custom/objects/object_kibako2/token_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..6de4f580f866bec141d9e660d032f519448f5ac8 GIT binary patch literal 8284 zcmeHLO=w$J7IwxMTa;ppVyqBKWQI~}QG%9Q%?M$_vnWNZ=z`DlI~Z_>gZe3yF^Px6d6+p14d%rZY<%%%i=5hn^>;f=XLi zB9%|_x%7b6hWx5Ka&1t_f2p8$!hL7-Bs0l;MCZ)-Cel$a`ULKz&9t~d8T~jjB~E1( zpL2kpq4Ld*h@EO)wkWgUu7!_T7m+*lWs zG#QD9E5KjKOkMjwsRrh*&HWE_K~$miRcnmD%%wrL-!*w-%jMSb_kZ&=wlU_hW96Ty zq*x~A#k|Y?7KA6;2*vmGlN+$j%p8L>9}VKguBA*t{>z60AyIf!}wxSw(v z!(50|h7z;sCbKjmt5Tu#39<~YoQwF*Z~17-Ped5o=u?Idqy4FCa~VcA#yLbg#Jd#k z%mS1k={N(64;{lAaYKlQvnzdPSi9~$0=4R&*4`^O-AFMs)ORCpq@1lDmA9(LW#sd8 z6Qe^A@3aau!nqeRlv4C(G99BOa~|bPPvEcg$szNEa$DM|xBQFtQrSl>%T zn1P@dU(SaY~6Iw!lmS2GUG4K4}J3G9!eUIAXrT8kp;0HDnGy9g1f1Lq)x`E=uPar?- zmYAgs-OA~=?PAcRjDp?=7k%Z0EtDS@NHmdc9e0;|&w(!$4*i_#LGe|3N=^%)@*dN+=PtJc9{H(}tbPqJ)>G zopGm0c>jBSe*4DuQwECYzTqyxZ{k~M7 z{#~p;R?K`G`ybY=ue*Ux;;?r3CA|;+r9KbcL(5rzRv-=`_>3zMb4=);G1k<{1@OR%xqu6@(;q5J zqxFaQ#}&!?xBlp~d;Ye)=x3{ql>^P%iRm0X-9`eS&!ij4={WLw{2(#o@3imq?uGxX zT$c!n7;g2y(7?VTDrB*t2kL`18RN_PLvCfXc7yKo^KS3At>cZC79ZL1pfpp3x6$9K z57MjpWdT)1{Gi<2Ywcfj6379x|AhWy4erKtf2g}Mi>)!y%CGp8o*HcbbpH1A%l4vs zJAN>(E>;d4Pd(02y)fefKRFW|?O$}4I|&_4AHw>x`3IiHc!&K2);8_V)u7t18U0KA zQT+oQaq;9yqTAWNQFf@uF|9xc<<-*6Bv)~--1K++SMBfJSID2hHujhGzmOp+clom0 z#+r9`Y%HuSP2#7r+(YX=x_lD8;TmWiRR_rDkWnc)jjY?KHsS~Jo`LMs8-4g*v3IZg zg}cLDyv~wzO#VR?!MzlvA|JFa{f<0b!AJaKQ~<#THgCcQf9~CD9hJXI&a527g|HI5 zYNnh~+b8h0(MRmP)4h5A?dGz0nfls%%2)h&pZt&q&900^HW$^95pDd5_ftM`B`#of zc#nFW!z8?LIcR#3H0(_tQqwu$uj48nlrz-~vth8+{`Byp(;Dgva!!H{QrQW7*x%p} zN;#qv`KtWMtmujL<&arm_etl&)9&e)r~#07T-e>6CbrUsClvZw#J#64l9eTmotT5R zMpYV<+CJVVKWyRb&XD-!6UDFHnY6#z0W${5eta!jZ*?pC7l;F+8erYa9TX38Uh!|_ z0vv=vcJJYfTfL4{qO=`2r?l4o%d`3}D+4~roTKu)!i8ObsJ~_ze{mLo)r$+ywY%Y) z){*a^?$O9|;7+He)0yOS4%*)k4xs;L?|!f2?oe*(O)4nKznnYX7i1IJh>xhVDEV+_ z?0=*9kFyAo9;+xl-2QCu`{0Nbn2mh7gH*&SwMe_z``o)oAnQo%$+Cj9 z`7cI%YM&gy1}eYQBEh8p#TwXAh~1${_|V#X<$5RK2dn_J2H?FIIvy!^Kz~qjr|VIF z$2-dxh@=&SGfW!)WBeCno@_L6`X=^A{5i?b(-V#VBm1x#(Unnyf7X^dAD(yjziVwF z3p>pDzT8I{K6tS|*16?nWazEAzb z0+e4*%$SFPU%V^={lA_r$%!?x7HRu90A_%pafA3=7%)n07h>3mQxQmaD8 zCD_8q-ykYtL+>3-`Rd2EiLb24Y7jpmi04zjZvQaj|ETlFK66>uJyHihad1He6;?l z|E8%^k*)OXIS*c_DL2@>*{$?C*kgSjzV6){{4;#kdwQ5`|5Uq6Y{q;>7uCJkc9j1p zKTnxiS*KCo6PJ;IBe+)W`eU3{R95HKlet$XNzH^9xBK`-GJJh_3mNBi=L_$Qv0f?` zs}W_GHGRRBBUonbu0`Hq~EkPnrg=QQz9dubjqcbrR0PC-w$ zC~<%D3&PntPqCHYeX{%KzB=C5GbK4!>XR?-iAXpBnLPi)yAo<@`-C3$`Pcj}cqGot z*iRxBPQ?r&F;iR%%(9Ni835y51_vg z2V)p7rE=8S4ZiTeJ~FG!EYDc&=&i(9H;Q>^6E7X1qYwK|@Mhi^ACwDx=NLpy#%_JW zo!sDVWFn#<841zbkdCnLc09itsoBrsD=(tip~%esz|pK>uty^~%IF7eqp?FiP3oMQ zun6{v|2kHCi$=wsv?$spWsM?U$h(nWxia=3w{~`}>Pck7p?ZjTiNzE=+7C1yEp>2{ z^ATyJZzI1!H?pXHiOA?G-=IlGuwTk6+BOm^qWB3~tQE8-#y80 z04HTc06`kAM*bVk5BUrtAA+y#W4X~jp0{9SQY4v^^KxcN&z>UAm~z zz2Et}=bU>zF)=am=cPaX;TC>B{JnR@3y;6}?^o#gdvocazy5Aw0#|Zkq7X0TODl!g za?Cw;4>KV5&^_i`Ay$YNVtA7l_TanR<9L#1yxCTLier}JOe>wsv@jFq(V5uF5jqa{ zJg?zfj_1V5lYXLe?G=qY%7#}wyAgd5KCtmrid{&(+ zpJfiyIgV7ViNu)AqEf~YqMd=iE8yS97d(p|g%hAbAJQM=mSbif?F~HiJS(lJwADFM z<*bm;9Mam5Uv)>W4J!FBt*D)F-x)p0OfnzQIWxYAbkvJJfjen4EoHxgew>*Sr*n$W zIl#}c_>EZ41vkn8CBdaShNMInBA%sBTlhv^>{tFOf6}rXOXr+uDv}&74r>pf3up%X zK<-R4-E?ve_!|2!Y^nH^2mOQ>JY&Wk+{Jp7741f1%1gu%uYy{g9qZbOCK}1%Og7Pg z?S05iT-S+`tHog|l8Qn%Xj8A`I)O(383YcjZiN?Ot`Ny`r>j@iq4+fXEMCZubwNp; zXfjv?{!Dh_*8ew6XQyxB0{vVY_(GDe;b-?jwQ})H7gH<5wP@*!Q!o)mf z-X&tlb1TyXadr|`GSF~wt#R%|gJZ^#1uIChQrWN0)r$4D#h*scRD@$052zo`rSmyC zuJ!s}{jz+4*s+8AMai!{tnYc(rJdz?SO-?qGYz#sVu%P5m*};_2!XgOIk9q9E7pqM zrNxK#MS5t<;97|?t=hw0s#op5?)L`0!3R*U_hkDK-#YJmsrnwG3D!5`hu-F@-KAssovO@Foj7}u+Qb#T*v z&2OFe^>$&!Jq9}BSkm|?JW%YPXqZfbs7d_loa9At#5`4-v+^ezuzgeYt~nvytljBX zk7`HG(Y?WHf4=j;-)cs@NHYq``7M8I_jdQPTin0yzT16XzJLzsX=?u{?C+6-L__iz zCJ=2=yguefN1U1&J5hr$CHs1WJNW9$Y`yK5d`0PyLJj=fVLz zha4cQz#i&<$)Rc<_GaFl1^x=FkL6gRG1G8zicjxzqV#WiD`lw84Q`H{{sLrW}`f{bZ`3+Z7252rGU@5 zsei7%Pw^=udzO90pSU&CUiZTw*A@m^XeS6$90^F&Un=Abk;rQs#7muBx3C< zl|Sm6%EgBrI^GDrg^aMdys-seAU~vUtT)6P{?;(OOp&4&CBF~+6DSao81>HyVsT-(C<^n8tdn+r#^ z^IB)t-}0jQAT{Ysx(&DCG3Hqg@Lc|~7^Jh#RAwo?u^k^U16WM8e5 zSHJ_GP`grgjS8dnC;3NLKz;ALfAz65+sv&s77r30DK(jgr<*v47*L+dG@Qw#2RcYi zHFr7>29JUtt9P)1B>GtW&or>FhznV4=z;p6O{(Gi<8mjAp3qkR^;LiH+xF?k_ZB|^ zoYK@9yp8_0_B6AkUuM8t@}Sb{w)d}lse(kc@cK_QxEs^`q3+5oHeb$@D zc>Z-~w)|!CfVHR6;(_a_$GNH(v{N_Elz*~+-CyXXD81Sc>(A6b^fksi>?g3cX?Ly$ z)xOQYntvD(mC9!?QvKfcXBC%v9Md9nP+2NXg}F+4l~!}7dC_@WzCiYq)i3K$*8fbF zs6a<#V|IadcQhJO`(gZaPWSDs)hcJf2d;tk$=V?*3dpGBOs+j$YpgYr2lAeU?2{Wq z_+D}FsQ;wAgRwy4<+wKg=nk85kq=szdM6J*!AJaq^)Z@0usIJO{LkP~`=s)XGqre- z6v9gI*0PnX+CGK1jUi(1gZ}*0cbg01W$J6ObW`z@L-HeaYm2#+vB>5kW@H@5q4{F8D1knt{E^LwYg~{B>N#gGzQS%WUXxb^dhp#d(cqI)($tpU#Ew zVSjoCy`YpQx~&Dm`gd~Nb8-#PTbED|uzPuu*h(9oP|(aF?!A2D zROd8y%6MQg|5LW)5IjNe&_Cv-{M5bT*B*rN%?_9`P%7Z%c)i`P?q4GgjB0>&FMm)x z$a}?qkPC1S__^-0H}?iTW)!gqSiDIVex2Co@@RG7s%<2nW!AYp^=#m3Qdl)El*|`B&u^WUefr6CZv*EBSC| z?0=*9j|x(x$12JkZ-3Q&>z}X!vym@iRkG*T|!6f@2hm7-I zVko%WCAG+d%1`ev`(gh}G*GvS-JwbN@N%qrrU|7vd`3%ktu zO}URUfYb$y#p|dG{jI^{?XOH^MPx7GtVt{2L;!DqRpxA#MyhIMpwU0Ye2U|S=JKCJWCHnAl`|Zwb=RxoDdJ)J&qLp!Lu`V0HlyU%My6FU(@3vtBXfcT87^Z;_fiy4U32lpV{gB$&$Uq()bjRr-M zvhQ8?Utf88)v7#=Rchi0_%5vUp9HV4$887yZXXl1TkJjqKB~k0%fXB8Wq_Sp zeGmIz#te)lQTv+zQ&Bl}hwLDU@QlKUmDqhF0*>Uj_~0DTLt{0ocxtbD$GhBp-g#I5 z_4=WgZ(eMFhTom--=L-KT`wb6Fy69$riXEU#y{PEGydaU(6zpn@9+bjgpbxg_1`je zDzcUA+3_C&~GFvH`>D<>v3>1cy#z<@M`e#$mzVVJtQ{sJ)?{2UTizkKjr5s zGb`&1>U-kSA31_+)viCW|B8ArYXtRD)XDT`ykTu4#_c|TgENq$d&oF9y(iu!W4+Bg z}p>nu7}t25037EQB;c^i#nf1@9?k^9j*+QV~NKDAE>M|!dL z7ZQ8YqLeu#YaH=H-c1{&P%gkZZ7{~7*2Zsq;&=Lukl>hB#l$__U-XXoh&0l-JdNHk zCy9Ea=HS7IuEH7K8QrK=JEuMgw`enR9`i|cVXdHiT3(IS#6p5Zd6|)w5NjE4rH(+3 z=8nN=CWaaY@teKPMepHQ-k~$%5(RWDgkR;0{Ky#TDg9*>buZXf3$%s77anj@X2xL# zW>zad=jXG`tNMyjFDg5^5gO0CVr8N{Mj~K?=nvupV+}xhX#-}9IYTwg>?LGTfu|_4 UekcppDD}WOM?7$hj8NqN0{SG^yZ`_I literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 9e56e51bd..3778f4a70 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -149,6 +149,54 @@ static const ALIGN_ASSET(2) char gBombchuBagBodyDL[] = dgBombchuBagBodyDL; #define dgBombchuBagMaskDL "__OTR__objects/object_bombchubag/gBombchuBagMaskDL" static const ALIGN_ASSET(2) char gBombchuBagMaskDL[] = dgBombchuBagMaskDL; +#define dgLargeMajorCrateDL "__OTR__objects/object_kibako2/gLargeMajorCrateDL" +static const ALIGN_ASSET(2) char gLargeMajorCrateDL[] = dgLargeMajorCrateDL; + +#define dgLargeMinorCrateDL "__OTR__objects/object_kibako2/gLargeMinorCrateDL" +static const ALIGN_ASSET(2) char gLargeMinorCrateDL[] = dgLargeMinorCrateDL; + +#define dgLargeRandoCrateDL "__OTR__objects/object_kibako2/gLargeRandoCrateDL" +static const ALIGN_ASSET(2) char gLargeRandoCrateDL[] = dgLargeRandoCrateDL; + +#define dgLargeSmallKeyCrateDL "__OTR__objects/object_kibako2/gLargeSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeSmallKeyCrateDL[] = dgLargeSmallKeyCrateDL; + +#define dgLargeTokenCrateDL "__OTR__objects/object_kibako2/gLargeTokenCrateDL" +static const ALIGN_ASSET(2) char gLargeTokenCrateDL[] = dgLargeTokenCrateDL; + +#define dgLargeBossKeyCrateDL "__OTR__objects/object_kibako2/gLargeBossKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeBossKeyCrateDL[] = dgLargeBossKeyCrateDL; + +#define dgLargeHeartCrateDL "__OTR__objects/object_kibako2/gLargeHeartCrateDL" +static const ALIGN_ASSET(2) char gLargeHeartCrateDL[] = dgLargeHeartCrateDL; + +#define dgLargeJunkCrateDL "__OTR__objects/object_kibako2/gLargeJunkCrateDL" +static const ALIGN_ASSET(2) char gLargeJunkCrateDL[] = dgLargeJunkCrateDL; + +#define dgSmallMajorCrateDL "__OTR__objects/object_kibako/gSmallMajorCrateDL" +static const ALIGN_ASSET(2) char gSmallMajorCrateDL[] = dgSmallMajorCrateDL; + +#define dgSmallMinorCrateDL "__OTR__objects/object_kibako/gSmallMinorCrateDL" +static const ALIGN_ASSET(2) char gSmallMinorCrateDL[] = dgSmallMinorCrateDL; + +#define dgSmallRandoCrateDL "__OTR__objects/object_kibako/gSmallRandoCrateDL" +static const ALIGN_ASSET(2) char gSmallRandoCrateDL[] = dgSmallRandoCrateDL; + +#define dgSmallSmallKeyCrateDL "__OTR__objects/object_kibako/gSmallSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallSmallKeyCrateDL[] = dgSmallSmallKeyCrateDL; + +#define dgSmallTokenCrateDL "__OTR__objects/object_kibako/gSmallTokenCrateDL" +static const ALIGN_ASSET(2) char gSmallTokenCrateDL[] = dgSmallTokenCrateDL; + +#define dgSmallBossKeyCrateDL "__OTR__objects/object_kibako/gSmallBossKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallBossKeyCrateDL[] = dgSmallBossKeyCrateDL; + +#define dgSmallHeartCrateDL "__OTR__objects/object_kibako/gSmallHeartCrateDL" +static const ALIGN_ASSET(2) char gSmallHeartCrateDL[] = dgSmallHeartCrateDL; + +#define dgSmallJunkCrateDL "__OTR__objects/object_kibako/gSmallJunkCrateDL" +static const ALIGN_ASSET(2) char gSmallJunkCrateDL[] = dgSmallJunkCrateDL; + //boss keys #define dgBossKeyCustomDL "__OTR__objects/object_bosskey/gBossKeyCustomDL" static const ALIGN_ASSET(2) char gBossKeyCustomDL[] = dgBossKeyCustomDL; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 5ce3c2ea0..078d645b5 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -275,6 +275,22 @@ typedef enum { // #### `args` // - `*EnDoor` VB_CONSUME_SMALL_KEY, + + // #### `result` + // ```c + // itemDropped >= 0 && itemDropped < 0x1A + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_SETUP_DRAW, // #### `result` // ```c @@ -1728,6 +1744,22 @@ typedef enum { // - None VB_SHOW_TITLE_CARD, + // #### `result` + // ```c + // (collectible >= 0) && (collectible <= 0x19 + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_SETUP_DRAW, + // #### `result` // ```c // false 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 6e6ec17d6..a54de6b64 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 @@ -126,6 +126,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_DEKU_TREE] = HintText(CustomMessage("They say that a #crate in the Deku Tree# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans l'Arbre Mojo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | DODONGOS CAVERN | @@ -304,7 +308,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", /*german*/ "!!!", /*french*/ "", {QM_RED, QM_GREEN})); - + + hintTextTable[RHT_CRATE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #crate in Dodongo's Cavern# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | JABU JABUS BELLY | @@ -468,6 +475,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_JABU_JABU] = HintText(CustomMessage("They say that a #crate in Jabu Jabu's Belly# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FOREST TEMPLE | @@ -699,6 +710,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #crate in Forest Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | FIRE TEMPLE | ---------------------------*/ @@ -903,6 +918,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*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})); + hintTextTable[RHT_CRATE_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #crate in Fire Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -1050,6 +1069,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_WATER_TEMPLE] = HintText(CustomMessage("They say that a #crate in Water Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1295,6 +1318,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "", /*french*/ "Selon moi, protégé par un #cercle de flammes# dans le Temple de l'Esprit se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #crate in Spirit Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1558,6 +1585,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil près d’un coffre invisible gardé par les morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #crate in Shadow Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1981,6 +2012,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das Sehen einer #Prüfung mit Dinodorus# #[[1]]# enthülle.", /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #crate in Gerudo Training Ground# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ 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 2c28b154e..6d5242a5d 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 @@ -1974,6 +1974,46 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #crate in Gerudo Valley# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans une vallée# a #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #crate in Gerudo Fortress# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_WASTELAND] = HintText(CustomMessage("They say that a #crate in Haunted Wasteland# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Désert Hanté# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_MARKET] = HintText(CustomMessage("They say that a #crate in the Market# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Place du Marché# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #crate in Kakariko Village# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GRAVEYARD] = HintText(CustomMessage("They say that a #crate in the Graveyard# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Cimetière# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GORON_CITY] = HintText(CustomMessage("They say that a #crate in Goron City# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Village Goron# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #crate in Death Mountain Crater# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse sur le Mont du Péril# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_LON_LON_RANCH] = HintText(CustomMessage("They say that a #crate in Lon Lon Ranch# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_LAKESIDE_LABORATORY] = HintText(CustomMessage("They say that a #crate in the Laboratory# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", { QM_RED, QM_GREEN })); // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 8a27f8106..aca9c49d3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -713,6 +713,18 @@ void GenerateItemPool() { bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); + + // Shuffle Crates + bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && + (ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL)); + bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); auto fsMode = ctx->GetOption(RSK_FISHSANITY); if (fsMode.IsNot(RO_FISHSANITY_OFF)) { diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp new file mode 100644 index 000000000..2106b4873 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -0,0 +1,548 @@ +#include "ShuffleCrates.h" +#include "soh_assets.h" +#include "static_data.h" +#include +#include "global.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h" +#include "objects/object_kibako2/object_kibako2.h" +#include "overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h" +#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" +#include "soh/Enhancements/enhancementTypes.h" +#include "soh/ResourceManagerHelpers.h" +extern PlayState* gPlayState; +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto crateActor = ((ObjKibako2*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); + return; + } + + GetItemEntry crateItem = + Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = crateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOMBCHUS_5 || crateItem.getItemId == GI_BOMBCHUS_10 || + crateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && crateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (crateItem.modIndex == MOD_NONE && (crateItem.getItemId == GI_BOTTLE || crateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gLargeTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (crateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gLargeHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeJunkCrateDL); + break; + } +} + +extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto smallCrateActor = ((ObjKibako*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); + return; + } + + GetItemEntry smallCrateItem = Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = smallCrateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (smallCrateItem.modIndex == MOD_NONE && + (smallCrateItem.getItemId == GI_BOMBCHUS_5 || smallCrateItem.getItemId == GI_BOMBCHUS_10 || smallCrateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && + smallCrateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (smallCrateItem.modIndex == MOD_NONE && (smallCrateItem.getItemId == GI_BOTTLE || smallCrateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gSmallTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (smallCrateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); + break; + } +} + +uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { + RandomizerCheck rc = crateActor->crateIdentity.randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(crateActor->crateIdentity.randomizerInf) || + crateActor->crateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* play) { + RandomizerCheck rc = smallCrateActor->smallCrateIdentity.randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(smallCrateActor->smallCrateIdentity.randomizerInf) || + smallCrateActor->smallCrateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &crateActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = crateActor->crateIdentity.randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &smallCrateActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = smallCrateActor->smallCrateIdentity.randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void ObjKibako2_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + uint8_t logicSetting = Rando::Context::GetInstance()->GetOption(RSK_LOGIC_RULES).Get(); + + // don't shuffle two OOB crates in GF and don't shuffle child GV/GF crates when not in no logic + if (actor->id != ACTOR_OBJ_KIBAKO2 || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4051 && (s16)actor->world.pos.z == -3429) || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4571 && (s16)actor->world.pos.z == -3429) || + (logicSetting != RO_LOGIC_NO_LOGIC && + ((gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == 3443 && (s16)actor->world.pos.z == -4876) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -764 && (s16)actor->world.pos.z == 148) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -125) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -150) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -90)))) + return; + + ObjKibako2* crateActor = static_cast(actorRef); + + crateActor->crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); +} + +void ObjKibako_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_OBJ_KIBAKO) return; + + ObjKibako* smallCrateActor = static_cast(actorRef); + + smallCrateActor->smallCrateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate(gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); +} + +void RegisterShuffleCrates() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_CRATES); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO2, shouldRegister, ObjKibako2_RandomizerInit); + + COND_VB_SHOULD(VB_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + crateActor->dyna.actor.draw = (ActorFunc)ObjKibako2_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + ObjKibako2_RandomizerSpawnCollectible(crateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO, shouldRegister, ObjKibako_RandomizerInit); + + COND_VB_SHOULD(VB_SMALL_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + smallCrateActor->actor.draw = (ActorFunc)ObjKibako_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_SMALL_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + ObjKibako_RandomizerSpawnCollectible(smallCrateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + +} + +void Rando::StaticData::RegisterCrateLocations() { + // clang-format off + // Overworld Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_GV_FREESTANDING_POH_CRATE] = Location::Crate(RC_GV_FREESTANDING_POH_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-350, 1480), "Freestanding PoH Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_FREESTANDING_POH_CRATE)); + locationTable[RC_GV_NEAR_COW_CRATE] = Location::Crate(RC_GV_NEAR_COW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-449, 123), "Near Cow Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_NEAR_COW_CRATE)); + locationTable[RC_GF_ABOVE_JAIL_CRATE] = Location::Crate(RC_GF_ABOVE_JAIL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(51, -2997), "Above Jail Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ABOVE_JAIL_CRATE)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1534), "Outside Center Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_1)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1594), "Outside Center Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_2)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_3] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1782), "Outside Center Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_3)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_4] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1842), "Outside Center Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_4)); + locationTable[RC_GF_OUTSIDE_LEFT_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-60, -2210), "Outside Left Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_1)); + locationTable[RC_GF_OUTSIDE_LEFT_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-120, -2210), "Outside Left Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_2)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1780), "Archery Range Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_2)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_3] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2020), "Archery Range Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_3)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_4] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2260), "Archery Range Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_4)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1540), "Archery Range Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_1)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_5] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2500), "Archery Range Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_5)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_6] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2740), "Archery Range Crate 6", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_6)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_7] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2980), "Archery Range Crate 7", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_7)); + locationTable[RC_GF_ARCHERY_START_CRATE_1] = Location::Crate(RC_GF_ARCHERY_START_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3727, -243), "Near Archery Start Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_1)); + locationTable[RC_GF_ARCHERY_START_CRATE_2] = Location::Crate(RC_GF_ARCHERY_START_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3667, -243), "Near Archery Start Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_2)); + locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3446, -4875), "Archery Left End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1)); + locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3303, -5018), "Archery Left End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2)); + locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3406, 414), "Archery Right End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1)); + locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3330, 406), "Archery Right End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2)); + locationTable[RC_GF_KITCHEN_CRATE_1] = Location::Crate(RC_GF_KITCHEN_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1251), "Kitchen Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_1)); + locationTable[RC_GF_KITCHEN_CRATE_2] = Location::Crate(RC_GF_KITCHEN_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1191), "Kitchen Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_2)); + locationTable[RC_GF_KITCHEN_CRATE_3] = Location::Crate(RC_GF_KITCHEN_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -847), "Kitchen Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_3)); + locationTable[RC_GF_KITCHEN_CRATE_4] = Location::Crate(RC_GF_KITCHEN_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -787), "Kitchen Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_4)); + locationTable[RC_GF_KITCHEN_CRATE_5] = Location::Crate(RC_GF_KITCHEN_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1610, -624), "Kitchen Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_5)); + locationTable[RC_GF_BREAK_ROOM_CRATE_1] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1260, -3155), "Break Room Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_1)); + locationTable[RC_GF_BREAK_ROOM_CRATE_4] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3550), "Break Room Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_4)); + locationTable[RC_GF_BREAK_ROOM_CRATE_2] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1360, -3325), "Break Room Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_2)); + locationTable[RC_GF_BREAK_ROOM_CRATE_3] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3502), "Break Room Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_3)); + locationTable[RC_GF_NORTH_F1_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F1_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-510, -2213), "North F1 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_CRATE)); + locationTable[RC_GF_NORTH_F3_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F3_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1090, -2210), "North F3 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F3_CARPENTER_CRATE)); + locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_1] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-49, 11), "South F2 Carpenter Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1)); + locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_2] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(11, 11), "South F2 Carpenter Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2)); + locationTable[RC_HW_BEFORE_QUICKSAND_CRATE] = Location::Crate(RC_HW_BEFORE_QUICKSAND_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3832, 2840), "Before Quicksand Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_BEFORE_QUICKSAND_CRATE)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_1] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3235, 2313), "After Quicksand Crate 1", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_2] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3125, 2459), "After Quicksand Crate 2", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_3] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3026, 2631), "After Quicksand Crate 3", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3)); + locationTable[RC_HW_NEAR_COLOSSUS_CRATE] = Location::Crate(RC_HW_NEAR_COLOSSUS_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(-1531, -976), "Near Colossus Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_NEAR_COLOSSUS_CRATE)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_1] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 338), "Near Bazaar Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_1)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_2] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 132), "Near Bazaar Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_2)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_1] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-150, -576), "Shooting Gallery Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_2] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-90, -576), "Shooting Gallery Crate 2", RHT_CRATE_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2)); + locationTable[RC_MK_LOST_DOG_HOUSE_CRATE] = Location::Crate(RC_MK_LOST_DOG_HOUSE_CRATE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_DOG_LADY_HOUSE, TWO_ACTOR_PARAMS(176, 170), "Lost Dog House Crate", RHT_CRATE_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_LOST_DOG_HOUSE_CRATE)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_1] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(76, -210), "Guard House Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_1)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_2] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -210), "Guard House Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_2)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_3] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 120), "Guard House Crate 3", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_3)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_4] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 168), "Guard House Crate 4", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_4)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_5] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 216), "Guard House Crate 5", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_5)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1039, 10), "Near Open Grotto Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1099, 10), "Near Open Grotto Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(506, -358), "Near Open Grotto Adult Crate 3", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(483, -302), "Near Open Grotto Adult Crate 4", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4)); + locationTable[RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(186, -758), "Near Potion Shop Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(185, 776), "Near Shooting Gallery Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(92, 348), "Near Boarding House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(32, 348), "Near Boarding House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2`", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); + locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_FENCE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_FENCE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 111), "Near Fence Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-60, -46), "Near Boarding House Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BAZAAR_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-636, -478), "Near Bazaar Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE)); + locationTable[RC_GRAVEYARD_CRATE] = Location::Crate(RC_GRAVEYARD_CRATE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1050, -350), "Freestanding PoH Crate", RHT_CRATE_GRAVEYARD, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_CRATE)); + locationTable[RC_GC_MAZE_CRATE] = Location::Crate(RC_GC_MAZE_CRATE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -1339), "Maze Crate", RHT_CRATE_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_CRATE)); + locationTable[RC_DMC_CRATE] = Location::Crate(RC_DMC_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-950, 1892), "Crate", RHT_CRATE_DEATH_MOUNTAIN_CRATER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CRATE)); + locationTable[RC_LLR_NEAR_TREE_CRATE] = Location::Crate(RC_LLR_NEAR_TREE_CRATE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1160, -2376), "Near Tree Crate", RHT_CRATE_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_NEAR_TREE_CRATE)); + locationTable[RC_LH_LAB_CRATE] = Location::Crate(RC_LH_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(90, -119), "Lab Crate", RHT_CRATE_LAKESIDE_LABORATORY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_CRATE)); + + // No Logic Crates + locationTable[RC_GV_CRATE_BRIDGE_1] = Location::NLCrate(RC_GV_CRATE_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-764, 148), "Near Bridge Crate 1", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_1)); + locationTable[RC_GV_CRATE_BRIDGE_2] = Location::NLCrate(RC_GV_CRATE_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -125), "Near Bridge Crate 2", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_2)); + locationTable[RC_GV_CRATE_BRIDGE_3] = Location::NLCrate(RC_GV_CRATE_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -150), "Near Bridge Crate 3", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_3)); + locationTable[RC_GV_CRATE_BRIDGE_4] = Location::NLCrate(RC_GV_CRATE_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -90), "Near Bridge Crate 4", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_4)); + locationTable[RC_GF_ARCHERY_LEFT_END_CHILD_CRATE] = Location::NLCrate(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3443, -4876), "Archery Left End Child Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE)); + + // MQ Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DEKU_TREE_MQ_LOBBY_CRATE] = Location::Crate(RC_DEKU_TREE_MQ_LOBBY_CRATE, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(279, 333), "MQ Lobby Crate", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -62), "MQ Slingshot Room Crate 1", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -2), "MQ Slingshot Room Crate 2", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1886, -744), "MQ Poe Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1826, -744), "MQ Poe Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1391), "MQ Poe Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1451), "MQ Poe Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1824), "MQ Poe Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1884), "MQ Poe Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1161), "MQ Poe Room Crate 7", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1221), "MQ Poe Room Crate 8", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1730, -1836), "MQ Staircase Lower Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2190, -1835), "MQ Staircase Lower Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1510, -1837), "MQ Staircase Upper Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1511, -1084), "MQ Staircase Upper Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2410, -1084), "MQ Staircase Upper Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "MQ Staircase Upper Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3191, -897), "MQ Two Flames Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2776, -810), "MQ Two Flames Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1714), "MQ Larvae Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1774), "MQ Larvae Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1871, -1976), "MQ Larvae Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1811, -1976), "MQ Larvae Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1721), "MQ Larvae Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1781), "MQ Larvae Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 769), "MQ Outside Boss Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 709), "MQ Outside Boss Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1130, -654), "MQ Outside Boss Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1211, -775), "MQ Outside Boss Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -417), "MQ Outside Boss Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -534), "MQ Outside Boss Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2249, -56), "MQ Shortcut Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2189, -56), "MQ Shortcut Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2150, 55), "MQ Shortcut Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2135, -62), "MQ Shortcut Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2090, 55), "MQ Shortcut Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2030, 55), "MQ Shortcut Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1147), "MQ Lizalfos Maze Lower Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1195), "MQ Lizalfos Maze Lower Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2124, 1154), "MQ Lizalfos Maze Lower Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1817, 1330), "MQ Lizalfos Maze Upper Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1288), "MQ Lizalfos Maze Upper Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1336), "MQ Lizalfos Maze Upper Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1407, -756), "MQ Lava Torch Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(384, 351), "MQ Lava Torch Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1409, -1176), "MQ Lava Torch Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(999, -402), "MQ Lava Torch Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-150, -336), "MQ Central Pillar Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-210, -336), "MQ Central Pillar Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(299, 485), "MQ Central Pillar Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 486), "MQ Central Pillar Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(222, 204), "MQ Central Pillar Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 425), "MQ Central Pillar Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 365), "MQ Central Pillar Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 426), "MQ Central Pillar Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 366), "MQ Central Pillar Lower Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(162, 204), "MQ Central Pillar Lower Crate 8", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(31, 636), "MQ Central Pillar Lower Crate 9", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(151, 636), "MQ Central Pillar Lower Crate 10", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(102, 204), "MQ Central Pillar Lower Crate 11", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(91, 636), "MQ Central Pillar Lower Crate 12", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 522), "MQ Central Pillar Lower Crate 13", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 582), "MQ Central Pillar Lower Crate 14", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(698, 399), "MQ Lizalfos Hallway Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(437, 576), "MQ Lizalfos Hallway Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(270, 504), "MQ Lizalfos Hallway Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(686, 1016), "MQ Lizalfos Hallway Room Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 870), "MQ Lizalfos Hallway Room Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 810), "MQ Lizalfos Hallway Room Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(524, 839), "MQ Lizalfos Hallway Room Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(525, 954), "MQ Lizalfos Hallway Room Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 570), "MQ Lizalfos Hallway Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 510), "MQ Lizalfos Hallway Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -712), "MQ Storage Room A Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -821), "MQ Storage Room A Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -922), "MQ Storage Room A Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1434, -1036), "MQ Storage Room A Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1374, -1036), "MQ Storage Room A Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1265, -1036), "MQ Storage Room A Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1205, -1036), "MQ Storage Room A Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-892, -91), "MQ GS Storage Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1149, 173), "MQ GS Storage Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1157, -221), "MQ GS Storage Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-945, -315), "MQ GS Storage Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -141), "MQ GS Storage Room Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1103, -315), "MQ GS Storage Room Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-884, 65), "MQ GS Storage Room Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, 56), "MQ GS Storage Room Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1918), "MQ Dragon Room Torches Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1978), "MQ Dragon Room Torches Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1718, -2006), "MQ Dragon Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1778, -2006), "MQ Dragon Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1912), "MQ Dragon Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1972), "MQ Dragon Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1092, -1926), "MQ Dragon Room Door Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1153, -1926), "MQ Dragon Room Door Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1257, -1567), "MQ BK Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1289, -1205), "MQ BK Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-985, -1333), "MQ BK Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1297, -1300), "MQ BK Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1069, -1402), "MQ BK Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-11, -2075), "MQ Whirlpool Front Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-371, -2077), "MQ Whirlpool Front Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-455, -2394), "MQ Whirlpool Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-498, -2661), "MQ Whirlpool Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, -2737), "MQ Whirlpool Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-251, -2731), "MQ Whirlpool Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-119, -2481), "MQ Whirlpool Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(126, -2485), "MQ Whirlpool Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-7, -3126), "MQ Whirlpool Behind Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-87, -3126), "MQ Whirlpool Behind Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-303, -3126), "MQ Whirlpool Behind Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-390, -3126), "MQ Whirlpool Behind Gate Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-397, -3818), "MQ Dodongo Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(30, -3215), "MQ Dodongo Room Hall Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-85, -3460), "MQ Dodongo Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-271, -3826), "MQ Dodongo Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(36, -3700), "MQ Dodongo Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2766), "MQ Storage Room B Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2866), "MQ Storage Room B Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2926), "MQ Storage Room B Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1435, -2935), "MQ Storage Room B Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2875), "MQ Storage Room B Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-994, 744), "MQ Triple Torch Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-991, 976), "MQ Triple Torch Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1511, 975), "MQ Triple Torch Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 792), "MQ Triple Torch Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 975), "MQ Triple Torch Room Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 744), "MQ Triple Torch Room Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2183, 977), "MQ Triple Torch Room Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2260, 744), "MQ Triple Torch Room Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2200, 743), "MQ Triple Torch Room Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(510, -1558), "MQ Statue Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(570, -1558), "MQ Statue Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1138), "MQ Big Mirror Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1138), "MQ Big Mirror Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1186), "MQ Big Mirror Crate 3", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1186), "MQ Big Mirror Crate 4", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE] = Location::Crate(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-59, -1598), "MQ Maze Crate", RHT_CRATE_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE)); + + // Small Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-141, -1945), "Platform Room Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-189, -1925), "Platform Room Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2030, -1172), "After Hammer Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2072, -1135), "After Hammer Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-971, -940), "Before Child Climb Small Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -939), "Before Child Climb Small Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-512, -4592), "MQ Triple Hallway Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-666, -4671), "MQ Triple Hallway Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1599, -1322), "MQ Frozen Eye Switch Small Crate 1", RHT_CRATE_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "MQ Frozen Eye Switch Small Crate 2", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "MQ Frozen Eye Switch Small Crate 3", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1290), "MQ Lizalfos Maze Upper Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1332), "MQ Lizalfos Maze Upper Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(460, 370), "MQ Lava Torch Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1405, -975), "MQ Lava Torch Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(685, 183), "MQ Lava Torch Small Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Small Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1267, 200), "MQ Lava Torch Small Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1952), "MQ Dragon Room Torches Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1911), "MQ Dragon Room Torches Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1991), "MQ Dragon Room Torches Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1470, -622), "MQ Storage Room A Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1341, -621), "MQ Storage Room A Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1393, -621), "MQ Storage Room A Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1284, -621), "MQ Storage Room A Small Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1166, 97), "MQ GS Storage Room Lower Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-992, 382), "MQ GS Storage Room Upper Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(365, 52), "MQ Truth Spinner Small Crate 1", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -62), "MQ Truth Spinner Small Crate 2", RHT_CRATE_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -7), "MQ Truth Spinner Small Crate 3", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(366, 114), "MQ Truth Spinner Small Crate 4", RHT_CRATE_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-271, -983), "MQ Statue Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1382, 190), "MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)); + + // clang-format on +} + +static RegisterShipInitFunc initFunc(RegisterShuffleCrates, { "IS_RANDO" }); +static RegisterShipInitFunc locFunc(Rando::StaticData::RegisterCrateLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.h b/soh/soh/Enhancements/randomizer/ShuffleCrates.h new file mode 100644 index 000000000..60cd51dc2 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.h @@ -0,0 +1,16 @@ +#ifndef ShuffleCrates_H +#define ShuffleCrates_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void ObjKibako2_RandomizerInit(void* actorRef); +void ObjKibako_RandomizerInit(void* actorRef); +#ifdef __cplusplus +}; +#endif + +#endif //ShuffleCrates_H diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 77f67873e..1f50ad58d 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -45,6 +45,7 @@ Context::Context() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -180,6 +181,9 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || + (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || !mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || @@ -191,7 +195,11 @@ void Context::GenerateLocationPool() { // should not have a shuffled item. if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS))) { + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || + (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -204,7 +212,10 @@ void Context::GenerateLocationPool() { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD))) { + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { continue; } // also add to that dungeon's location list. diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 7b5f98f4b..da65ea681 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -382,6 +382,30 @@ Rando::Location Rando::Location::Pot(RandomizerCheck rc, RandomizerCheckQuest qu collectionCheck }; } +Rando::Location Rando::Location::Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + +Rando::Location Rando::Location::NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + +Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 3806160c8..e66fd58b9 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -204,6 +204,21 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + + static Location NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + + static Location SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 129a842ef..9febbd6d8 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -219,6 +219,7 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -242,6 +243,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), 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 bea5801e5..8cd60f268 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -306,10 +306,12 @@ void RegionTable_Init_DodongosCavern() { //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), }, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), @@ -333,7 +335,11 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), @@ -392,8 +398,14 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts - LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, true), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts + LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, logic->CanBreakCrates()), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return true;}), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts @@ -416,8 +428,10 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return true;}), @@ -467,11 +481,19 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && //could be a seperate room if it gets busy logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), - }, { + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 1af91e7be..8888cdac9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -327,7 +327,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); @@ -430,7 +436,10 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations //If we're using the south torch as the initial torch, or using FAs, we either have to cross to the north to remove the crate, or use a trick to ignore it - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))) + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return true;}), @@ -450,9 +459,15 @@ void RegionTable_Init_FireTemple() { //Fairies cannot be used for this as it is time sensetive, and NL is only useful with sticks as it disables other magic while in use, so it's tunic or raw damage taking ability. //testing tells me you take 3 ticks of lava damage, which is 12 internal damage or 3/4 of a heart at x1 damage multiplier, performing this run //logic->EffectiveHealth() works in half hearts for whatever reason, meaning this needs a deeper refactor to be perfect, but it should be good enough for now - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return true;}), @@ -522,7 +537,10 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return true;}), @@ -544,7 +562,12 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), //Assumes maze access LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, logic->HasExplosives()), }, { @@ -563,7 +586,13 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT, []{return logic->OpenedUpperFireShortcut;}), @@ -600,8 +629,18 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 3e595c735..2f5ba96bf 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -530,7 +530,14 @@ void RegionTable_Init_ForestTemple() { }); //This room exists to show the actual map layout, and for when the crates get added to logic - areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index f95b32239..5466c598c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -152,7 +152,11 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQGTGMazeSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), - }, {}, { + }, + { //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index ed28e8672..3c45682ae 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -28,10 +28,12 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), + LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), //We can kill the Stingers with ruto - LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), - LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), + LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_BEGINNING, []{return true;}), @@ -263,6 +265,8 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 1ed814adb..3be1acac4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -126,7 +126,15 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}) && (logic->CanUse(RG_HOVER_BOOTS) || Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_FIRE_ARROWS);}) || (ctx->GetTrickOption(RT_SHADOW_MQ_GAP) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslashExceptHammer()));}), 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 7982f9ae5..701539ff1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -32,13 +32,15 @@ void RegionTable_Init_SpiritTemple() { EventAccess(&logic->NutCrate, []{return true;}), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), @@ -284,6 +286,10 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakSmallCrates();})), + }, { //Exits //we check possible adult access directly in MQSpiritSharedBrokenWallRoom, so this exit only covers Certain Access @@ -424,6 +430,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, logic->CanKillEnemy(RE_BEAMOS)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->CanAvoidEnemy(RE_BEAMOS, true, 4) && logic->CanUse(RG_SONG_OF_TIME) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_HOOKSHOT);}), @@ -507,10 +514,14 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index ddf72fba0..0ae5ac289 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -427,7 +427,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQWaterOpenedPillarB1, []{return ((logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_DINS_FIRE)) || (ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS))) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslash()));}), - }, {}, { + }, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_ZORA_TUNIC);}), }); @@ -443,15 +447,40 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, logic->CanBreakCrates()), }, {}); //Region exists to add crate/pot/box locations areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterLevel(WL_LOW_OR_MID) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8);}), @@ -459,9 +488,19 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), @@ -479,9 +518,17 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE, []{return logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_DINS_FIRE);}), @@ -497,9 +544,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); //This room exists to hold the wonderitems that drop from the emblems here. Specifically this assumes you are standing on the final ledge @@ -592,7 +641,15 @@ void RegionTable_Init_WaterTemple() { }); //This region assumes Iron boots to access - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), @@ -602,13 +659,28 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQWaterDragonTorches, []{return true;}), - }, {}, { + }, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16;}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_SILVER_SCALE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanUse(RG_HOOKSHOT);}), @@ -618,7 +690,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return true;}), @@ -627,7 +700,15 @@ void RegionTable_Init_WaterTemple() { }); //this exists for the crates in preparation for clips through the grate - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->CanHitSwitch(ED_BOOMERANG);}), }); @@ -653,7 +734,17 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST, []{return logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE) && (logic->MQWaterLevel(WL_LOW) || logic->WaterTimer() >= 24);}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && ((logic->MQWaterLevel(WL_LOW) && logic->HasItem(RG_GOLDEN_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT))));}), Entrance(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->CanUse(RG_FIRE_ARROWS) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->CanUse(RG_LONGSHOT) && Here(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->ScarecrowsSong();})));}) @@ -661,14 +752,30 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + + }, + { //Exits //we can backflip over the spikes, but land in water. Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && (logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE));}), @@ -683,9 +790,15 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, true), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT)));}) @@ -699,8 +812,13 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_4_TORCH_ROOM, []{return (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && Here(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);});}), @@ -709,7 +827,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, logic->CanBreakCrates()), }, { Entrance(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return true;}) }); diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 2dcdf71bb..6233b20ab 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -43,6 +43,42 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), + LOCATION(RC_GF_ABOVE_JAIL_CRATE, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_3, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_4, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_5, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_6, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_7, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_START_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_START_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, logic->IsChild && logic->HasExplosives() && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_3, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_4, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_5, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_1, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_2, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_3, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_4, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_F1_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_F3_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, logic->CanBreakCrates()), + + //RANDOTODO doublecheck when GF isn't a blob LOCATION(RC_GF_KITCHEN_SUN_FAIRY, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_SUNS_SONG)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index cc5601fcb..b05b22c48 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -18,10 +18,12 @@ void RegionTable_Init_DeathMountainCrater() { }, { //Locations LOCATION(RC_DMC_WALL_FREESTANDING_POH, logic->FireTimer() >= 16 || logic->Hearts() >= 3), - LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack()), + LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack() && logic->CanBreakCrates()), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns() && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), + LOCATION(RC_DMC_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DMC_UPPER_NEARBY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 9141f4dcd..86cc1b060 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -36,6 +36,7 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_GOSSIP_STONE, true), + LOCATION(RC_GV_NEAR_COW_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), @@ -57,7 +58,8 @@ void RegionTable_Init_GerudoValley() { areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_GV_CRATE_FREESTANDING_POH, true), + LOCATION(RC_GV_CRATE_FREESTANDING_POH, logic->CanBreakCrates()), + LOCATION(RC_GV_FREESTANDING_POH_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), @@ -70,6 +72,10 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_CRATE_BRIDGE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GERUDO_FORTRESS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index b39a389d2..8081757d2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -33,6 +33,8 @@ void RegionTable_Init_GoronCity() { LOCATION(RC_GC_UPPER_STAIRCASE_POT_1, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), + }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{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 694d0e3ee..012503d9a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -12,7 +12,7 @@ void RegionTable_Init_Graveyard() { EventAccess(&logic->BugRock, []{return true;}), }, { //Locations - LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtNight), //TODO: This needs to change LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->AtNight && logic->CanGetNightTimeGS()), LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()), @@ -31,6 +31,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_GRAVEYARD_CRATE, ((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}), 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 437f93a64..a9b238292 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -5,7 +5,12 @@ using namespace Rando; void RegionTable_Init_HauntedWasteland() { // clang-format off - areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_HW_BEFORE_QUICKSAND_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GF_OUTSIDE_GATE, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), @@ -25,13 +30,21 @@ void RegionTable_Init_HauntedWasteland() { LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_3, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WASTELAND_NEAR_COLOSSUS, []{return ctx->GetTrickOption(RT_LENS_HW) || logic->CanUse(RG_LENS_OF_TRUTH);}), Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_HW_NEAR_COLOSSUS_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 7fffa5d72..c0af2acde 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -12,33 +12,51 @@ void RegionTable_Init_Kakariko() { EventAccess(&logic->KakarikoVillageGateOpen, []{return logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER);}), }, { //Locations - LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), - LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), - LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), - LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), + LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), + LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), + LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), + LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), //Can kill lower kak skulls with pots - LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_GY_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), 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 04ae5fe85..36d3ee1a3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -107,10 +107,11 @@ void RegionTable_Init_LakeHylia() { //Locations LOCATION(RC_LH_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)), - LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanBreakCrates()), LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), 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 00ce5a3ee..fae41664e 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 @@ -23,6 +23,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_RAIN_SHED_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{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 02dea3b56..368cbe2e3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -14,14 +14,18 @@ void RegionTable_Init_Market() { areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), @@ -107,6 +111,11 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_9, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_10, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_4, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_5, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), @@ -210,7 +219,8 @@ void RegionTable_Init_Market() { areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", "Market Dog Lady House", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MK_LOST_DOG_HOUSE_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 62c14e6ff..97d7630e8 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1054,6 +1054,14 @@ namespace Rando { return true; } + bool Logic::CanBreakCrates() { + return true; + } + + bool Logic::CanBreakSmallCrates() { + return true; + } + bool Logic::HasExplosives(){ return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index d8fa9864b..c976287a7 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -237,6 +237,8 @@ class Logic { bool CanBreakUpperBeehives(); bool CanBreakLowerBeehives(); bool CanBreakPots(); + bool CanBreakCrates(); + bool CanBreakSmallCrates(); bool HasFireSource(); bool HasFireSourceWithTorch(); bool TradeQuestStep(RandomizerGet rg); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 576e8c334..fed7e033f 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -271,6 +271,16 @@ void Settings::CreateOptionDescriptions() { "Overworld - Only shuffle pots that are outside of dungeons.\n" "\n" "All pots - Shuffle all pots."; + mOptionDescriptions[RSK_SHUFFLE_CRATES] = "Crates will drop a randomized item the first time they're broken and collected. " + "Crates will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Crates will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle crates that are within dungeons.\n" + "\n" + "Overworld - Only shuffle crates that are outside of dungeons.\n" + "\n" + "All Crates - Shuffle all crates."; mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" "\n" "The fishing pole is required to play the fishing pond minigame."; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f99a38ba3..8d09b6839 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1899,6 +1899,261 @@ std::map rcToRandomizerInf = { { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, + // Crates + { RC_GV_FREESTANDING_POH_CRATE, RAND_INF_GV_FREESTANDING_POH_CRATE, }, + { RC_GV_NEAR_COW_CRATE, RAND_INF_GV_NEAR_COW_CRATE, }, + { RC_GV_CRATE_BRIDGE_1, RAND_INF_GV_CRATE_BRIDGE_1, }, + { RC_GV_CRATE_BRIDGE_2, RAND_INF_GV_CRATE_BRIDGE_2, }, + { RC_GV_CRATE_BRIDGE_3, RAND_INF_GV_CRATE_BRIDGE_3, }, + { RC_GV_CRATE_BRIDGE_4, RAND_INF_GV_CRATE_BRIDGE_4, }, + { RC_GF_ABOVE_JAIL_CRATE, RAND_INF_GF_ABOVE_JAIL_CRATE, }, + { RC_GF_OUTSIDE_CENTER_CRATE_1, RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, }, + { RC_GF_OUTSIDE_CENTER_CRATE_2, RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, }, + { RC_GF_OUTSIDE_CENTER_CRATE_3, RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, }, + { RC_GF_OUTSIDE_CENTER_CRATE_4, RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, }, + { RC_GF_OUTSIDE_LEFT_CRATE_1, RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, }, + { RC_GF_OUTSIDE_LEFT_CRATE_2, RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, }, + { RC_GF_ARCHERY_RANGE_CRATE_1, RAND_INF_GF_ARCHERY_RANGE_CRATE_1, }, + { RC_GF_ARCHERY_RANGE_CRATE_2, RAND_INF_GF_ARCHERY_RANGE_CRATE_2, }, + { RC_GF_ARCHERY_RANGE_CRATE_3, RAND_INF_GF_ARCHERY_RANGE_CRATE_3, }, + { RC_GF_ARCHERY_RANGE_CRATE_4, RAND_INF_GF_ARCHERY_RANGE_CRATE_4, }, + { RC_GF_ARCHERY_RANGE_CRATE_5, RAND_INF_GF_ARCHERY_RANGE_CRATE_5, }, + { RC_GF_ARCHERY_RANGE_CRATE_6, RAND_INF_GF_ARCHERY_RANGE_CRATE_6, }, + { RC_GF_ARCHERY_RANGE_CRATE_7, RAND_INF_GF_ARCHERY_RANGE_CRATE_7, }, + { RC_GF_ARCHERY_START_CRATE_1, RAND_INF_GF_ARCHERY_START_CRATE_1, }, + { RC_GF_ARCHERY_START_CRATE_2, RAND_INF_GF_ARCHERY_START_CRATE_2, }, + { RC_GF_ARCHERY_LEFT_END_CRATE_1, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, }, + { RC_GF_ARCHERY_LEFT_END_CRATE_2, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, }, + { RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, }, + { RC_GF_ARCHERY_RIGHT_END_CRATE_1, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, }, + { RC_GF_ARCHERY_RIGHT_END_CRATE_2, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, }, + { RC_GF_KITCHEN_CRATE_1, RAND_INF_GF_KITCHEN_CRATE_1, }, + { RC_GF_KITCHEN_CRATE_2, RAND_INF_GF_KITCHEN_CRATE_2, }, + { RC_GF_KITCHEN_CRATE_3, RAND_INF_GF_KITCHEN_CRATE_3, }, + { RC_GF_KITCHEN_CRATE_4, RAND_INF_GF_KITCHEN_CRATE_4, }, + { RC_GF_KITCHEN_CRATE_5, RAND_INF_GF_KITCHEN_CRATE_5, }, + { RC_GF_BREAK_ROOM_CRATE_1, RAND_INF_GF_BREAK_ROOM_CRATE_1, }, + { RC_GF_BREAK_ROOM_CRATE_2, RAND_INF_GF_BREAK_ROOM_CRATE_2, }, + { RC_GF_BREAK_ROOM_CRATE_3, RAND_INF_GF_BREAK_ROOM_CRATE_3, }, + { RC_GF_BREAK_ROOM_CRATE_4, RAND_INF_GF_BREAK_ROOM_CRATE_4, }, + { RC_GF_NORTH_F1_CARPENTER_CRATE, RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, }, + { RC_GF_NORTH_F3_CARPENTER_CRATE, RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, }, + { RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, }, + { RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, }, + { RC_HW_BEFORE_QUICKSAND_CRATE, RAND_INF_HW_BEFORE_QUICKSAND_CRATE, }, + { RC_HW_AFTER_QUICKSAND_CRATE_1, RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, }, + { RC_HW_AFTER_QUICKSAND_CRATE_2, RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, }, + { RC_HW_AFTER_QUICKSAND_CRATE_3, RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, }, + { RC_HW_NEAR_COLOSSUS_CRATE, RAND_INF_HW_NEAR_COLOSSUS_CRATE, }, + { RC_MK_NEAR_BAZAAR_CRATE_1, RAND_INF_MK_NEAR_BAZAAR_CRATE_1, }, + { RC_MK_NEAR_BAZAAR_CRATE_2, RAND_INF_MK_NEAR_BAZAAR_CRATE_2, }, + { RC_MK_SHOOTING_GALLERY_CRATE_1, RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, }, + { RC_MK_SHOOTING_GALLERY_CRATE_2, RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, }, + { RC_MK_LOST_DOG_HOUSE_CRATE, RAND_INF_MK_LOST_DOG_HOUSE_CRATE, }, + { RC_MK_GUARD_HOUSE_CRATE_1, RAND_INF_MK_GUARD_HOUSE_CRATE_1, }, + { RC_MK_GUARD_HOUSE_CRATE_2, RAND_INF_MK_GUARD_HOUSE_CRATE_2, }, + { RC_MK_GUARD_HOUSE_CRATE_3, RAND_INF_MK_GUARD_HOUSE_CRATE_3, }, + { RC_MK_GUARD_HOUSE_CRATE_4, RAND_INF_MK_GUARD_HOUSE_CRATE_4, }, + { RC_MK_GUARD_HOUSE_CRATE_5, RAND_INF_MK_GUARD_HOUSE_CRATE_5, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, }, + { RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, }, + { RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, }, + { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, }, + { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, }, + { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, }, + { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, }, + { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, }, + { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, }, + { RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, }, + { RC_KAK_NEAR_GY_CHILD_CRATE, RAND_INF_KAK_NEAR_GY_CHILD_CRATE, }, + { RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, }, + { RC_KAK_NEAR_FENCE_CHILD_CRATE, RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, }, + { RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, }, + { RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, }, + { RC_GRAVEYARD_CRATE, RAND_INF_GRAVEYARD_CRATE, }, + { RC_GC_MAZE_CRATE, RAND_INF_GC_MAZE_CRATE, }, + { RC_DMC_CRATE, RAND_INF_DMC_CRATE, }, + { RC_LLR_NEAR_TREE_CRATE, RAND_INF_LLR_NEAR_TREE_CRATE, }, + { RC_LH_LAB_CRATE, RAND_INF_LH_LAB_CRATE, }, + + { RC_DEKU_TREE_MQ_LOBBY_CRATE, RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, }, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, }, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, }, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, }, + + { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, }, + { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, }, + { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, }, + { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, }, + + { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, }, + { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, }, + { RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, }, }; BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -2246,6 +2501,62 @@ GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 re } return grassIdentity; + +} + +CrateIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct CrateIdentity crateIdentity; + uint32_t crateSceneNum = sceneNum; + + // pretend night is day to align crates in market and align GF child/adult crates + if (sceneNum == SCENE_MARKET_NIGHT) { + crateSceneNum = SCENE_MARKET_DAY; + } else if (sceneNum == SCENE_GERUDOS_FORTRESS && gPlayState->linkAgeOnLoad == 1 && posX == 310) { + if (posZ == -1830) { + posZ = -1842.0f; + } else if (posZ == -1770) { + posZ = -1782.0f; + } + } + + crateIdentity.randomizerInf = RAND_INF_MAX; + crateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO2, crateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + crateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + crateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return crateIdentity; +} + +SmallCrateIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct SmallCrateIdentity smallCrateIdentity; + uint32_t smallCrateSceneNum = sceneNum; + + smallCrateIdentity.randomizerInf = RAND_INF_MAX; + smallCrateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO, smallCrateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + smallCrateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + smallCrateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return smallCrateIdentity; } u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 13718dac4..50bf6636c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -55,6 +55,8 @@ class Randomizer { PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ); FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams); GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); + CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); + SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 9851f614b..8378f25fb 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -288,6 +288,9 @@ typedef enum { RCTYPE_SONG_LOCATION, // Song locations RCTYPE_BOSS_HEART_OR_OTHER_REWARD, // Boss heart container or lesser dungeon rewards (lens, ice arrow) RCTYPE_POT, // Pots + RCTYPE_CRATE, // Crates + RCTYPE_NLCRATE, // NL Crates + RCTYPE_SMALL_CRATE, // Small crates RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps) RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives @@ -2333,6 +2336,266 @@ typedef enum { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, // End Pots + + // Overworld Crates + RC_GV_FREESTANDING_POH_CRATE, + RC_GV_NEAR_COW_CRATE, + RC_GV_CRATE_BRIDGE_1, + RC_GV_CRATE_BRIDGE_2, + RC_GV_CRATE_BRIDGE_3, + RC_GV_CRATE_BRIDGE_4, + RC_GF_ABOVE_JAIL_CRATE, + RC_GF_OUTSIDE_CENTER_CRATE_1, + RC_GF_OUTSIDE_CENTER_CRATE_2, + RC_GF_OUTSIDE_CENTER_CRATE_3, + RC_GF_OUTSIDE_CENTER_CRATE_4, + RC_GF_OUTSIDE_LEFT_CRATE_1, + RC_GF_OUTSIDE_LEFT_CRATE_2, + RC_GF_ARCHERY_RANGE_CRATE_1, + RC_GF_ARCHERY_RANGE_CRATE_2, + RC_GF_ARCHERY_RANGE_CRATE_3, + RC_GF_ARCHERY_RANGE_CRATE_4, + RC_GF_ARCHERY_RANGE_CRATE_5, + RC_GF_ARCHERY_RANGE_CRATE_6, + RC_GF_ARCHERY_RANGE_CRATE_7, + RC_GF_ARCHERY_START_CRATE_1, + RC_GF_ARCHERY_START_CRATE_2, + RC_GF_ARCHERY_LEFT_END_CRATE_1, + RC_GF_ARCHERY_LEFT_END_CRATE_2, + RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RC_GF_ARCHERY_RIGHT_END_CRATE_1, + RC_GF_ARCHERY_RIGHT_END_CRATE_2, + RC_GF_KITCHEN_CRATE_1, + RC_GF_KITCHEN_CRATE_2, + RC_GF_KITCHEN_CRATE_3, + RC_GF_KITCHEN_CRATE_4, + RC_GF_KITCHEN_CRATE_5, + RC_GF_BREAK_ROOM_CRATE_1, + RC_GF_BREAK_ROOM_CRATE_2, + RC_GF_BREAK_ROOM_CRATE_3, + RC_GF_BREAK_ROOM_CRATE_4, + RC_GF_NORTH_F1_CARPENTER_CRATE, + RC_GF_NORTH_F3_CARPENTER_CRATE, + RC_GF_SOUTH_F2_CARPENTER_CRATE_1, + RC_GF_SOUTH_F2_CARPENTER_CRATE_2, + RC_HW_BEFORE_QUICKSAND_CRATE, + RC_HW_AFTER_QUICKSAND_CRATE_1, + RC_HW_AFTER_QUICKSAND_CRATE_2, + RC_HW_AFTER_QUICKSAND_CRATE_3, + RC_HW_NEAR_COLOSSUS_CRATE, + RC_MK_NEAR_BAZAAR_CRATE_1, + RC_MK_NEAR_BAZAAR_CRATE_2, + RC_MK_SHOOTING_GALLERY_CRATE_1, + RC_MK_SHOOTING_GALLERY_CRATE_2, + RC_MK_LOST_DOG_HOUSE_CRATE, + RC_MK_GUARD_HOUSE_CRATE_1, + RC_MK_GUARD_HOUSE_CRATE_2, + RC_MK_GUARD_HOUSE_CRATE_3, + RC_MK_GUARD_HOUSE_CRATE_4, + RC_MK_GUARD_HOUSE_CRATE_5, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RC_KAK_NEAR_GY_CHILD_CRATE, + RC_KAK_NEAR_WINDMILL_CHILD_CRATE, + RC_KAK_NEAR_FENCE_CHILD_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RC_KAK_NEAR_BAZAAR_CHILD_CRATE, + RC_GRAVEYARD_CRATE, + RC_GC_MAZE_CRATE, + RC_DMC_CRATE, + RC_LLR_NEAR_TREE_CRATE, + RC_LH_LAB_CRATE, + + // MQ Dungeon Crates + RC_DEKU_TREE_MQ_LOBBY_CRATE, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + // Dungeon Small Crates + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + // MQ Dungeon Small Crates + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + // End Crates RC_PIERRE, RC_DELIVER_RUTOS_LETTER, @@ -5120,6 +5383,29 @@ typedef enum { RHT_POT_GANONS_CASTLE, RHT_POT_BOTTOM_OF_THE_WELL, RHT_POT_ICE_CAVERN, + // Shuffle Crates + RHT_CRATE_GERUDO_VALLEY, + RHT_CRATE_GERUDOS_FORTRESS, + RHT_CRATE_THIEVES_HIDEOUT, + RHT_CRATE_WASTELAND, + RHT_CRATE_MARKET, + RHT_CRATE_DOG_LADY_HOUSE, + RHT_CRATE_MARKET_GUARD_HOUSE, + RHT_CRATE_KAKARIKO_VILLAGE, + RHT_CRATE_GRAVEYARD, + RHT_CRATE_GORON_CITY, + RHT_CRATE_DEATH_MOUNTAIN_CRATER, + RHT_CRATE_LON_LON_RANCH, + RHT_CRATE_LAKESIDE_LABORATORY, + RHT_CRATE_DEKU_TREE, + RHT_CRATE_DODONGOS_CAVERN, + RHT_CRATE_JABU_JABU, + RHT_CRATE_FOREST_TEMPLE, + RHT_CRATE_FIRE_TEMPLE, + RHT_CRATE_WATER_TEMPLE, + RHT_CRATE_SPIRIT_TEMPLE, + RHT_CRATE_SHADOW_TEMPLE, + RHT_CRATE_GERUDO_TRAINING_GROUND, // Ganon Line RHT_GANON_JOKE01, RHT_GANON_JOKE02, @@ -5458,6 +5744,7 @@ typedef enum { RSK_SHUFFLE_WEIRD_EGG, RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, RSK_SHUFFLE_POTS, + RSK_SHUFFLE_CRATES, RSK_SHUFFLE_FROG_SONG_RUPEES, RSK_ITEM_POOL, RSK_ICE_TRAPS, @@ -5946,6 +6233,14 @@ typedef enum { RO_SHUFFLE_GRASS_ALL, } RandoOptionShuffleGrass; +// Shuffle Crates settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_CRATES_OFF, + RO_SHUFFLE_CRATES_DUNGEONS, + RO_SHUFFLE_CRATES_OVERWORLD, + RO_SHUFFLE_CRATES_ALL, +} RandoOptionShuffleCrates; + //Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, @@ -6046,6 +6341,16 @@ typedef struct GrassIdentity { RandomizerCheck randomizerCheck; } GrassIdentity; +typedef struct CrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} CrateIdentity; + +typedef struct SmallCrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} SmallCrateIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, TRACKER_WINDOW_WINDOW, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9333913a4..55a8deaa7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -173,6 +173,9 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_NLCRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_SMALL_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 7d531cb24..0023204ef 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -61,6 +61,8 @@ bool showOverworldPots; bool showDungeonPots; bool showOverworldGrass; bool showDungeonGrass; +bool showOverworldCrates; +bool showDungeonCrates; bool showFrogSongRupees; bool showFairies; bool showStartingMapsCompasses; @@ -1290,6 +1292,25 @@ void LoadSettings() { showDungeonGrass = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_CRATES)) { + case RO_SHUFFLE_CRATES_ALL: + showOverworldCrates = true; + showDungeonCrates = true; + break; + case RO_SHUFFLE_CRATES_OVERWORLD: + showOverworldCrates = true; + showDungeonCrates = false; + break; + case RO_SHUFFLE_CRATES_DUNGEONS: + showOverworldCrates = false; + showDungeonCrates = true; + break; + default: + showOverworldCrates = false; + showDungeonCrates = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; @@ -1297,6 +1318,8 @@ void LoadSettings() { showDungeonPots = false; showOverworldGrass = false; showDungeonGrass = false; + showOverworldCrates = false; + showDungeonCrates = false; } fortressFast = false; @@ -1380,6 +1403,17 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_GRASS || (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_NLCRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == + RO_LOGIC_NO_LOGIC) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_SMALL_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index f061be660..70aa11c06 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -745,6 +745,260 @@ typedef enum { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, + RAND_INF_GV_FREESTANDING_POH_CRATE, + RAND_INF_GV_NEAR_COW_CRATE, + RAND_INF_GV_CRATE_BRIDGE_1, + RAND_INF_GV_CRATE_BRIDGE_2, + RAND_INF_GV_CRATE_BRIDGE_3, + RAND_INF_GV_CRATE_BRIDGE_4, + RAND_INF_GF_ABOVE_JAIL_CRATE, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_1, + RAND_INF_GF_ARCHERY_RANGE_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_3, + RAND_INF_GF_ARCHERY_RANGE_CRATE_4, + RAND_INF_GF_ARCHERY_RANGE_CRATE_5, + RAND_INF_GF_ARCHERY_RANGE_CRATE_6, + RAND_INF_GF_ARCHERY_RANGE_CRATE_7, + RAND_INF_GF_ARCHERY_START_CRATE_1, + RAND_INF_GF_ARCHERY_START_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_1, + RAND_INF_GF_KITCHEN_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_3, + RAND_INF_GF_KITCHEN_CRATE_4, + RAND_INF_GF_KITCHEN_CRATE_5, + RAND_INF_GF_BREAK_ROOM_CRATE_1, + RAND_INF_GF_BREAK_ROOM_CRATE_2, + RAND_INF_GF_BREAK_ROOM_CRATE_3, + RAND_INF_GF_BREAK_ROOM_CRATE_4, + RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, + RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, + RAND_INF_HW_BEFORE_QUICKSAND_CRATE, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, + RAND_INF_HW_NEAR_COLOSSUS_CRATE, + RAND_INF_MK_NEAR_BAZAAR_CRATE_1, + RAND_INF_MK_NEAR_BAZAAR_CRATE_2, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, + RAND_INF_MK_LOST_DOG_HOUSE_CRATE, + RAND_INF_MK_GUARD_HOUSE_CRATE_1, + RAND_INF_MK_GUARD_HOUSE_CRATE_2, + RAND_INF_MK_GUARD_HOUSE_CRATE_3, + RAND_INF_MK_GUARD_HOUSE_CRATE_4, + RAND_INF_MK_GUARD_HOUSE_CRATE_5, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RAND_INF_KAK_NEAR_GY_CHILD_CRATE, + RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, + RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, + RAND_INF_GRAVEYARD_CRATE, + RAND_INF_GC_MAZE_CRATE, + RAND_INF_DMC_CRATE, + RAND_INF_LLR_NEAR_TREE_CRATE, + RAND_INF_LH_LAB_CRATE, + + RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_CAUGHT_LOACH, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index ba049b32c..8ade6a95a 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -210,6 +210,7 @@ void Settings::CreateOptions() { 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_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF); + OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WidgetType::Combobox, RO_SHUFFLE_CRATES_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); @@ -662,6 +663,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_MERCHANT_PRICES], &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], @@ -902,6 +904,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], &mOptions[RSK_SHUFFLE_OCARINA], &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 1ce04687c..fe2e6441b 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -52,6 +52,7 @@ class StaticData { static void RegisterPotLocations(); static void RegisterFreestandingLocations(); static void RegisterGrassLocations(); + static void RegisterCrateLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; 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 16e27e39e..18218355f 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 @@ -7,6 +7,7 @@ #include "z_obj_kibako.h" #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_CAN_PRESS_SWITCHES) @@ -68,7 +69,7 @@ void ObjKibako_SpawnCollectible(ObjKibako* this, PlayState* play) { s16 collectible; collectible = this->actor.params & 0x1F; - if ((collectible >= 0) && (collectible <= 0x19)) { + if (GameInteractor_Should(VB_SMALL_CRATE_DROP_ITEM,(collectible >= 0) && (collectible <= 0x19), this)) { Item_DropCollectible(play, &this->actor.world.pos, collectible | (((this->actor.params >> 8) & 0x3F) << 8)); } @@ -284,5 +285,9 @@ void ObjKibako_Draw(Actor* thisx, PlayState* play) { s32 pad; ObjKibako* this = (ObjKibako*)thisx; + if (!GameInteractor_Should(VB_SMALL_CRATE_SETUP_DRAW, true, thisx)) { + return; + } + Gfx_DrawDListOpa(play, gSmallWoodenBoxDL); } diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h index 68e871c78..32a35563f 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h @@ -12,6 +12,7 @@ typedef struct ObjKibako { /* 0x0000 */ Actor actor; /* 0x014C */ ObjKibakoActionFunc actionFunc; /* 0x0150 */ ColliderCylinder collider; + /* */ SmallCrateIdentity smallCrateIdentity; } ObjKibako; // size = 0x019C #endif 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 d6452d253..e4008ebed 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 @@ -7,6 +7,7 @@ #include "z_obj_kibako2.h" #include "objects/object_kibako2/object_kibako2.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -110,7 +111,7 @@ void ObjKibako2_SpawnCollectible(ObjKibako2* this, PlayState* play) { collectibleFlagTemp = this->collectibleFlag; itemDropped = this->dyna.actor.home.rot.x; - if (itemDropped >= 0 && itemDropped < 0x1A) { + if (GameInteractor_Should(VB_CRATE_DROP_ITEM,itemDropped >= 0 && itemDropped < 0x1A, this)) { Item_DropCollectible(play, &this->dyna.actor.world.pos, itemDropped | (collectibleFlagTemp << 8)); } } @@ -176,5 +177,9 @@ void ObjKibako2_Update(Actor* thisx, PlayState* play) { } void ObjKibako2_Draw(Actor* thisx, PlayState* play) { + if (!GameInteractor_Should(VB_CRATE_SETUP_DRAW, true, thisx)) { + return; + } + Gfx_DrawDListOpa(play, gLargeCrateDL); } diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h index 48c22154f..7629e6aa1 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h @@ -13,6 +13,7 @@ typedef struct ObjKibako2 { /* 0x0164 */ ColliderCylinder collider; /* 0x01B0 */ ObjKibako2ActionFunc actionFunc; /* 0x01B4 */ s16 collectibleFlag; + /* */ CrateIdentity crateIdentity; } ObjKibako2; // size = 0x01B8 #endif From 057434cdf34f38c8a087bf526bf62e67c8e713a3 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 26 Mar 2025 22:26:11 +0100 Subject: [PATCH 154/267] Update Dev Tools Windows (#5220) * Update dev tools windows * Review comments --- .../{sohConsole.cpp => SohConsoleWindow.cpp} | 2 +- .../{sohConsole.h => SohConsoleWindow.h} | 0 ...xDebugger.cpp => SohGfxDebuggerWindow.cpp} | 2 +- ...ohGfxDebugger.h => SohGfxDebuggerWindow.h} | 0 .../Enhancements/debugger/SohStatsWindow.cpp | 24 +++++++++++++++++++ .../Enhancements/debugger/SohStatsWindow.h | 17 +++++++++++++ soh/soh/SohGui/SohGui.cpp | 10 ++++---- soh/soh/SohGui/SohGui.hpp | 5 ++-- soh/soh/SohGui/SohMenuDevTools.cpp | 4 ++-- 9 files changed, 52 insertions(+), 12 deletions(-) rename soh/soh/Enhancements/debugger/{sohConsole.cpp => SohConsoleWindow.cpp} (97%) rename soh/soh/Enhancements/debugger/{sohConsole.h => SohConsoleWindow.h} (100%) rename soh/soh/Enhancements/debugger/{sohGfxDebugger.cpp => SohGfxDebuggerWindow.cpp} (91%) rename soh/soh/Enhancements/debugger/{sohGfxDebugger.h => SohGfxDebuggerWindow.h} (100%) create mode 100644 soh/soh/Enhancements/debugger/SohStatsWindow.cpp create mode 100644 soh/soh/Enhancements/debugger/SohStatsWindow.h diff --git a/soh/soh/Enhancements/debugger/sohConsole.cpp b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp similarity index 97% rename from soh/soh/Enhancements/debugger/sohConsole.cpp rename to soh/soh/Enhancements/debugger/SohConsoleWindow.cpp index 686152a1f..d5090e7e5 100644 --- a/soh/soh/Enhancements/debugger/sohConsole.cpp +++ b/soh/soh/Enhancements/debugger/SohConsoleWindow.cpp @@ -1,4 +1,4 @@ -#include "sohConsole.h" +#include "SohConsoleWindow.h" #include "soh/OTRGlobals.h" #include "soh/SohGui/UIWidgets.hpp" #include "soh/SohGui/SohGui.hpp" diff --git a/soh/soh/Enhancements/debugger/sohConsole.h b/soh/soh/Enhancements/debugger/SohConsoleWindow.h similarity index 100% rename from soh/soh/Enhancements/debugger/sohConsole.h rename to soh/soh/Enhancements/debugger/SohConsoleWindow.h diff --git a/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp similarity index 91% rename from soh/soh/Enhancements/debugger/sohGfxDebugger.cpp rename to soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp index 20b37ca93..06d81577d 100644 --- a/soh/soh/Enhancements/debugger/sohGfxDebugger.cpp +++ b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.cpp @@ -1,4 +1,4 @@ -#include "sohGfxDebugger.h" +#include "SohGfxDebuggerWindow.h" #include "soh/OTRGlobals.h" void SohGfxDebuggerWindow::InitElement() { diff --git a/soh/soh/Enhancements/debugger/sohGfxDebugger.h b/soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h similarity index 100% rename from soh/soh/Enhancements/debugger/sohGfxDebugger.h rename to soh/soh/Enhancements/debugger/SohGfxDebuggerWindow.h diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.cpp b/soh/soh/Enhancements/debugger/SohStatsWindow.cpp new file mode 100644 index 000000000..56f81bee4 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.cpp @@ -0,0 +1,24 @@ +#include "SohStatsWindow.h" +#include "soh/OTRGlobals.h" + +void SohStatsWindow::DrawElement() { + const float framerate = ImGui::GetIO().Framerate; + const float deltatime = ImGui::GetIO().DeltaTime; + ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + +#if defined(_WIN32) + ImGui::Text("Platform: Windows"); +#elif defined(__IOS__) + ImGui::Text("Platform: iOS"); +#elif defined(__APPLE__) + ImGui::Text("Platform: macOS"); +#elif defined(__linux__) + ImGui::Text("Platform: Linux"); +#else + ImGui::Text("Platform: Unknown"); +#endif + ImGui::Text("Status: %.3f ms/frame (%.1f FPS)", deltatime * 1000.0f, framerate); + ImGui::PopStyleColor(); + ImGui::PopFont(); +} diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.h b/soh/soh/Enhancements/debugger/SohStatsWindow.h new file mode 100644 index 000000000..d68953573 --- /dev/null +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.h @@ -0,0 +1,17 @@ +#ifndef SOH_STATS_H +#define SOH_STATS_H + +#include + +class SohStatsWindow : public Ship::GuiWindow { + public: + using GuiWindow::GuiWindow; + ~SohStatsWindow() {}; + + protected: + void InitElement() override {}; + void DrawElement() override; + void UpdateElement() override {}; +}; + +#endif // SOH_STATS_H diff --git a/soh/soh/SohGui/SohGui.cpp b/soh/soh/SohGui/SohGui.cpp index 213efcfd4..87be00c98 100644 --- a/soh/soh/SohGui/SohGui.cpp +++ b/soh/soh/SohGui/SohGui.cpp @@ -68,7 +68,7 @@ namespace SohGui { std::shared_ptr mSohMenuBar; std::shared_ptr mConsoleWindow; - std::shared_ptr mStatsWindow; + std::shared_ptr mStatsWindow; std::shared_ptr mGfxDebuggerWindow; std::shared_ptr mInputEditorWindow; @@ -120,17 +120,15 @@ namespace SohGui { mSohMenu = std::make_shared(CVAR_WINDOW("Menu"), "Port Menu"); gui->SetMenu(mSohMenu); - mStatsWindow = gui->GetGuiWindow("Stats"); - if (mStatsWindow == nullptr) { - SPDLOG_ERROR("Could not find stats window"); - } - mConsoleWindow = std::make_shared(CVAR_WINDOW("SohConsole"), "Console##SoH", ImVec2(820, 630)); gui->AddGuiWindow(mConsoleWindow); mGfxDebuggerWindow = std::make_shared(CVAR_WINDOW("SohGfxDebugger"), "GfxDebugger##SoH", ImVec2(820, 630)); gui->AddGuiWindow(mGfxDebuggerWindow); + mStatsWindow = std::make_shared(CVAR_WINDOW("SohStats"), "Stats##Soh", ImVec2(400, 100)); + gui->AddGuiWindow(mStatsWindow); + mInputEditorWindow = gui->GetGuiWindow("Controller Configuration"); if (mInputEditorWindow == nullptr) { SPDLOG_ERROR("Could not find input editor window"); diff --git a/soh/soh/SohGui/SohGui.hpp b/soh/soh/SohGui/SohGui.hpp index 35c93b353..b1d278e06 100644 --- a/soh/soh/SohGui/SohGui.hpp +++ b/soh/soh/SohGui/SohGui.hpp @@ -18,8 +18,9 @@ #include "soh/Enhancements/debugger/debugSaveEditor.h" #include "soh/Enhancements/debugger/hookDebugger.h" #include "soh/Enhancements/debugger/dlViewer.h" -#include "soh/Enhancements/debugger/sohConsole.h" -#include "soh/Enhancements/debugger/sohGfxDebugger.h" +#include "soh/Enhancements/debugger/SohConsoleWindow.h" +#include "soh/Enhancements/debugger/SohGfxDebuggerWindow.h" +#include "soh/Enhancements/debugger/SohStatsWindow.h" #include "soh/Enhancements/debugger/valueViewer.h" #include "soh/Enhancements/gameplaystatswindow.h" #include "soh/Enhancements/randomizer/randomizer_check_tracker.h" diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index e6a757f21..3a769aea4 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -90,8 +90,8 @@ void SohMenu::AddMenuDevTools() { path.sidebarName = "Stats"; AddSidebarEntry("Dev Tools", path.sidebarName, 1); AddWidget(path, "Popout Stats Window", WIDGET_WINDOW_BUTTON) - .CVar(CVAR_WINDOW("Stats")) - .WindowName("Stats") + .CVar(CVAR_WINDOW("SohStats")) + .WindowName("Stats##Soh") .Options(WindowButtonOptions().Tooltip("Enables the separate Stats Window.")); // Console From 0ac3f4d6b4aa39b4637fa673cf9369a0df3d5f3b Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 26 Mar 2025 23:42:41 -0700 Subject: [PATCH 155/267] Fix typo in tracker autoscroll tooltip (#5226) --- soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 57ff467f4..6ed15bd8d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -684,7 +684,7 @@ void EntranceTrackerSettingsWindow::DrawElement() { ImGui::Text("List Items"); UIWidgets::CVarCheckbox("Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), - UIWidgets::CheckboxOptions().Tooltip("Automatically scroll to the first aviable entrance in the current scene").Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Tooltip("Automatically scroll to the first available entrance in the current scene").Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"), UIWidgets::CheckboxOptions().Tooltip("Highlight the previous entrance that Link came from").Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Highlight available", CVAR_TRACKER_ENTRANCE("HighlightAvailable"), From 006650d37baa7994ab8c3f50cfb1f5c59dad8477 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Thu, 27 Mar 2025 02:47:19 -0400 Subject: [PATCH 156/267] update break room (#5223) --- .../randomizer/location_access/gerudo_fortress.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 6233b20ab..4b4579210 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -27,8 +27,8 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), LOCATION(RC_GF_GS_ARCHERY_RANGE, logic->IsAdult && logic->HookshotOrBoomerang() && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanGetNightTimeGS()), LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN) || ctx->GetTrickOption(RT_GF_JUMP)) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_BREAK_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_BREAK_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_GF_BREAK_ROOM_POT_1, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), + LOCATION(RC_GF_BREAK_ROOM_POT_2, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), LOCATION(RC_GF_KITCHEN_POT_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), LOCATION(RC_GF_KITCHEN_POT_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), From 3e34934e016442b1983bb763bb1b51db4f553990 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 27 Mar 2025 07:47:36 +0100 Subject: [PATCH 157/267] Add grass and crates to hell preset (#5221) --- soh/soh/Enhancements/Presets/PresetEntries.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp index e09df2862..bfa3197ea 100644 --- a/soh/soh/Enhancements/Presets/PresetEntries.cpp +++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp @@ -579,12 +579,14 @@ const std::vector hellModePresetEntries = { PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCows"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_SHUFFLE_POTS_ALL), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_SHUFFLE_CRATES_ALL), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_ALL), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Shuffle100GSReward"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), 2), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleFairies"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_SHUFFLE_GRASS_ALL), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_ANYWHERE), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_ANYWHERE), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_ANYWHERE), From b417b87d1c176cd5d195068353886e85f8f81088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 27 Mar 2025 06:48:37 +0000 Subject: [PATCH 158/267] Shuffle cleanup (#5222) * Shuffle cleanup * Grass can be cut with Goron's Bracelet * Gohma's grass can be cut without defeating Gohma * more whitespace --- .../Enhancements/randomizer/fishsanity.cpp | 4 +- soh/soh/Enhancements/randomizer/fishsanity.h | 2 +- .../location_access/dungeons/deku_tree.cpp | 20 ++--- .../dungeons/spirit_temple.cpp | 16 ++-- .../location_access/overworld/kakariko.cpp | 88 +++++++++---------- .../location_access/overworld/market.cpp | 24 ++--- soh/soh/Enhancements/randomizer/logic.cpp | 2 +- 7 files changed, 78 insertions(+), 78 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index e2a013906..85f847df4 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -53,7 +53,7 @@ std::unordered_map Rando::StaticData::randomizerGrottoF ActorFunc drawFishing = NULL; ActorFunc drawEnFish = NULL; -Color_RGBA16 fsPulseColor = { 30, 240, 200 }; +Color_RGB8 fsPulseColor = { 30, 240, 200 }; namespace Rando { const FishIdentity Fishsanity::defaultIdentity = { RAND_INF_MAX, RC_UNKNOWN_CHECK }; @@ -562,7 +562,7 @@ extern "C" { Fishsanity_CloseGreyscaleColor(play); } - void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGBA16* color, int16_t frameOffset) { + void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGB8* color, int16_t frameOffset) { OPEN_DISPS(play->state.gfxCtx); gDPSetGrayscaleColor( POLY_OPA_DISP++, color->r, color->g, color->b, diff --git a/soh/soh/Enhancements/randomizer/fishsanity.h b/soh/soh/Enhancements/randomizer/fishsanity.h index 642443136..13ae86583 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.h +++ b/soh/soh/Enhancements/randomizer/fishsanity.h @@ -218,7 +218,7 @@ void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play); void Fishsanity_DrawEnFish(struct Actor* actor, struct PlayState* play); /// Overriden actor draw function for the fishing pond void Fishsanity_DrawFishing(struct Actor* actor, struct PlayState* play); -void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGBA16* color, int16_t frameOffset); +void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGB8* color, int16_t frameOffset); void Fishsanity_CloseGreyscaleColor(PlayState* play); #ifdef __cplusplus } diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 9febbd6d8..f327c9992 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -219,7 +219,7 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_MQ_LOBBY_CRATE, logic->CanBreakCrates()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -243,7 +243,7 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, logic->CanBreakCrates()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, logic->CanBreakCrates()), }, { //Exits @@ -450,14 +450,14 @@ void RegionTable_Init_DekuTree() { // Locations LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear), LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_HEART, logic->DekuTreeClear), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, logic->DekuTreeClear && logic->CanCutShrubs()), - LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->DekuTreeClear && logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->CanCutShrubs()), }, { // Exits Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{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 701539ff1..e7f9c0ee6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -32,14 +32,14 @@ void RegionTable_Init_SpiritTemple() { EventAccess(&logic->NutCrate, []{return true;}), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index c0af2acde..0e51ea173 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -12,51 +12,51 @@ void RegionTable_Init_Kakariko() { EventAccess(&logic->KakarikoVillageGateOpen, []{return logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER);}), }, { //Locations - LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), - LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), - LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), - LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), + LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), + LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), + LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), + LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), //Can kill lower kak skulls with pots - LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), - LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_GY_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_GY_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{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 368cbe2e3..0fd154259 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -14,18 +14,18 @@ void RegionTable_Init_Market() { areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()), - LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 97d7630e8..06b1f4494 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1079,7 +1079,7 @@ namespace Rando { } bool Logic::CanCutShrubs(){ - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_BOOMERANG) || HasExplosives() || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD); + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_BOOMERANG) || HasExplosives() || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD) || HasItem(RG_GORONS_BRACELET); } bool Logic::CanStunDeku(){ From feea29929125d9496c7a17037250532a8d3e3bfd Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 27 Mar 2025 20:27:01 -0700 Subject: [PATCH 159/267] Revert "Set Sample Rate to 32000 hz (#4780)" (#5234) This reverts commit 9455579f4272953ecace1d812e1f43f3e0761193. --- soh/soh/OTRGlobals.cpp | 13 +++++++++--- soh/src/code/audio_init_params.c | 34 ++++++++++++++++---------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 6eb0e667b..4e5f3be8a 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -355,7 +355,7 @@ OTRGlobals::OTRGlobals() { overlay->LoadFont("Fipps", 32.0f, "fonts/Fipps-Regular.otf"); overlay->SetCurrentFont(CVarGetString(CVAR_GAME_OVERLAY_FONT, "Press Start 2P")); - context->InitAudio({ .SampleRate = 32000, .SampleLength = 1024, .DesiredBuffered = 1680 }); + context->InitAudio({ .SampleRate = 44100, .SampleLength = 1024, .DesiredBuffered = 2480 }); SPDLOG_INFO("Starting Ship of Harkinian version {} (Branch: {} | Commit: {})", (char*)gBuildVersion, (char*)gGitBranch, (char*)gGitCommitHash); @@ -531,8 +531,15 @@ void OTRAudio_Thread() { //AudioMgr_ThreadEntry(&gAudioMgr); // 528 and 544 relate to 60 fps at 32 kHz 32000/60 = 533.333.. // in an ideal world, one third of the calls should use num_samples=544 and two thirds num_samples=528 - #define SAMPLES_HIGH 560 - #define SAMPLES_LOW 528 + //#define SAMPLES_HIGH 560 + //#define SAMPLES_LOW 528 + // PAL values + //#define SAMPLES_HIGH 656 + //#define SAMPLES_LOW 624 + + // 44KHZ values + #define SAMPLES_HIGH 752 + #define SAMPLES_LOW 720 #define AUDIO_FRAMES_PER_UPDATE (R_UPDATE_RATE > 0 ? R_UPDATE_RATE : 1 ) #define NUM_AUDIO_CHANNELS 2 diff --git a/soh/src/code/audio_init_params.c b/soh/src/code/audio_init_params.c index 02593f8e4..12653c6dc 100644 --- a/soh/src/code/audio_init_params.c +++ b/soh/src/code/audio_init_params.c @@ -68,22 +68,22 @@ ReverbSettings D_80133420[][3] = { }; AudioSpec gAudioSpecs[18] = { - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x5000, 0, 0, 0, 0 }, - { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x5000, 0x4800, 0, 0, 0 }, - { 32000, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x5000, 0, 0, 0, 0 }, + { 44100, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x5000, 0x4800, 0, 0, 0 }, + { 44100, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, + { 44100, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, { 22050, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2600, 0, 0, 0 }, + { 44100, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2600, 0, 0, 0 }, }; From 32923d83f21e06437123a2d18a4b587bc7486a86 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Thu, 27 Mar 2025 23:31:04 -0400 Subject: [PATCH 160/267] Don't place items on Chest game. (#5233) This causes it to fall back on vanilla behavior, fixing the crash Where it tried to draw something invalid. --- .../Enhancements/randomizer/3drando/item_pool.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index aca9c49d3..9b1fd2bf0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -826,18 +826,7 @@ void GenerateItemPool() { AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys } else if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK)) { AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 - } else { - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RG_GREEN_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RG_GREEN_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RG_BLUE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RG_RED_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4, RG_TREASURE_GAME_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5, RG_TREASURE_GAME_SMALL_KEY, false, true); - }; + } if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) { for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { From b66623c152d24df78fb5ea699e5206a20eafe037 Mon Sep 17 00:00:00 2001 From: Archez Date: Fri, 28 Mar 2025 04:30:56 -0400 Subject: [PATCH 161/267] Fix freezard graphics crash with enemy health scaling (#5232) --- soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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 8aaab1631..3f843446d 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 @@ -720,6 +720,15 @@ void EnFz_Draw(Actor* thisx, PlayState* play) { index = (6 - this->actor.colChkInfo.health) >> 1; + // SOH [Enhancement] - With enemy health scaling, the Freezards health could cause an index out of bounds for the + // displayLists, so we need to recompute the index based on the scaled health (using the maximum health value) and + // clamp the final result for safety. + if (CVarGetInteger(CVAR_ENHANCEMENT("EnemySizeScalesHealth"), 0)) { + u8 scaledHealth = (u8)(((f32)this->actor.colChkInfo.health / this->actor.maximumHealth) * 6); + index = (6 - scaledHealth) >> 1; + index = CLAMP(index, 0, 2); + } + OPEN_DISPS(play->state.gfxCtx); if (this->actor.colChkInfo.health == 0) { From 4d18a36e1a64992cfd8f7c3ab7a3bb9ef5acaaa4 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 28 Mar 2025 19:22:51 -0700 Subject: [PATCH 162/267] Clarify "Outside Temple of Time" entrance names. (#5241) --- .../randomizer_entrance_tracker.cpp | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 6ed15bd8d..0876f48ff 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -344,32 +344,32 @@ const EntranceData entranceData[] = { { ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, -1, SINGLE_SCENE_INFO(SCENE_SPIRIT_TEMPLE_BOSS), "Twinrova Blue Warp", "Spirit Temple Blue Warp", ENTRANCE_GROUP_DESERT_COLOSSUS, ENTRANCE_GROUP_DESERT_COLOSSUS, 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)}, "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"}, + { 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", "ToT Courtyard Gossip Stones Exit", 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)}, "ToT Courtyard Gossip Stones Exit", "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)}, "ToT Courtyard Temple Entry", "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", "ToT Courtyard Temple Entry", 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"}, From 554379fd7068d93c77a7e0b2cd805468b94d3b1c Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Sat, 29 Mar 2025 00:02:38 -0400 Subject: [PATCH 163/267] Fix some options not updating correctly when dropping jsons and applying Presets (#5240) * Re-Run ship init funcs on json drop and preset apply * Prevent registering rando locations from running more than once * Moves registered=true right after early return * Move ShipInit call into applyPreset --- soh/soh/Enhancements/Presets/Presets.cpp | 1 + soh/soh/Enhancements/randomizer/ShuffleCows.cpp | 3 +++ soh/soh/Enhancements/randomizer/ShuffleCrates.cpp | 3 +++ soh/soh/Enhancements/randomizer/ShuffleFairies.cpp | 3 +++ soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp | 3 +++ soh/soh/Enhancements/randomizer/ShuffleGrass.cpp | 3 +++ soh/soh/Enhancements/randomizer/ShufflePots.cpp | 3 +++ soh/soh/Enhancements/randomizer/fishsanity.cpp | 3 +++ soh/soh/OTRGlobals.cpp | 1 + 9 files changed, 23 insertions(+) diff --git a/soh/soh/Enhancements/Presets/Presets.cpp b/soh/soh/Enhancements/Presets/Presets.cpp index 8d08869f5..79552ef5d 100644 --- a/soh/soh/Enhancements/Presets/Presets.cpp +++ b/soh/soh/Enhancements/Presets/Presets.cpp @@ -34,6 +34,7 @@ void applyPreset(std::vector entries) { } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } + ShipInit::Init("*"); } void DrawPresetSelector(PresetType presetTypeId) { diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp index ff4680a17..0f03bd196 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -59,6 +59,9 @@ void RegisterShuffleCows() { static RegisterShipInitFunc initFunc(RegisterShuffleCows, { "IS_RANDO" }); void Rando::StaticData::RegisterCowLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format-off locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW)); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp index 2106b4873..3c75c7c6c 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -278,6 +278,9 @@ void RegisterShuffleCrates() { } void Rando::StaticData::RegisterCrateLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format off // Overworld Crates // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index c9e53e315..a2b8015d4 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -185,6 +185,9 @@ void ShuffleFairies_UnregisterHooks() { } void Rando::StaticData::RegisterFairyLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format off locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index 858e9f3e2..15a7df4db 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -45,6 +45,9 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh } void Rando::StaticData::RegisterFreestandingLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format off locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2)); locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1009, 1556), "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_1)); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index 37d407fb3..ff81778a5 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -157,6 +157,9 @@ void RegisterShuffleGrass() { void Rando::StaticData::RegisterGrassLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format off // Overworld Grass // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 41b586455..0d45df189 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -95,6 +95,9 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va } void Rando::StaticData::RegisterPotLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format off // Overworld Pots // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index 85f847df4..d6a76acc0 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -580,6 +580,9 @@ extern "C" { } void Rando::StaticData::RegisterFishLocations() { + static bool registered = false; + if (registered) return; + registered = true; // clang-format off // Fishing Pond locationTable[RC_LH_CHILD_FISH_1] = Location::Fish(RC_LH_CHILD_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_CHILD_FISH_1, "Child Pond Fish 1", RHT_LH_POND_FISH, RG_NONE); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 4e5f3be8a..b4db2ae7f 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2538,6 +2538,7 @@ void SoH_ProcessDroppedFiles(std::string filePath) { std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->ClearBindings(); gui->SaveConsoleVariablesNextFrame(); + ShipInit::Init("*"); uint32_t finalHash = boost::hash_32{}(configJson.dump()); gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Configuration Loaded. Hash: %d", finalHash); From 0e23adc237f37f8dc4aa3398f10c3b556fb83be1 Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 30 Mar 2025 12:20:21 -0400 Subject: [PATCH 164/267] Change Fullscreen toggle into button (#5236) --- soh/soh/OTRGlobals.cpp | 4 ---- soh/soh/SohGui/SohMenuSettings.cpp | 5 ++--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index b4db2ae7f..2b1eec610 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1385,10 +1385,6 @@ extern "C" void Graph_StartFrame() { break; } #endif - case KbScancode::LUS_KB_F11: { - CVarSetInteger(CVAR_SETTING("Fullscreen"), !CVarGetInteger(CVAR_SETTING("Fullscreen"), 0)); - break; - } case KbScancode::LUS_KB_TAB: { CVarSetInteger(CVAR_ENHANCEMENT("AltAssets"), !CVarGetInteger(CVAR_ENHANCEMENT("AltAssets"), 0)); break; diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 8e3cc5e19..12db748d1 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -231,10 +231,9 @@ void SohMenu::AddMenuSettings() { path.sidebarName = "Graphics"; AddSidebarEntry("Settings", "Graphics", 3); AddWidget(path, "Graphics Options", WIDGET_SEPARATOR_TEXT); - AddWidget(path, "Toggle Fullscreen", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_SETTING("Fullscreen")) + AddWidget(path, "Toggle Fullscreen", WIDGET_BUTTON) .Callback([](WidgetInfo& info) { Ship::Context::GetInstance()->GetWindow()->ToggleFullscreen(); }) - .Options(CheckboxOptions().Tooltip("Toggles Fullscreen On/Off.")); + .Options(ButtonOptions().Tooltip("Toggles Fullscreen On/Off.")); AddWidget(path, "Internal Resolution", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_INTERNAL_RESOLUTION) .Callback([](WidgetInfo& info) { From 6140b2ec8f06e37ce29385096a4425b2a7207736 Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Sun, 30 Mar 2025 17:29:59 +0100 Subject: [PATCH 165/267] NTSC Support (N64) (#4198) * copy n64 pal 10 doing this so i can check diffs i make * transfer german->jp icon item * overlays, message data, icon item jpn, audio, code todo: title_static, gameplay keep * add kanji and fix title cards * title static * spell folder correctly * boss title cards, do action, icon item, item name, map name * headers for jpn stuff * gameplay_keep * Scenes, audio, jp text extraction, rom support, overlay fixes, sheik & darunia todo: test & disable darunia fix cvar for ntsc * msgptr init fix * icon item offsets * comment out title cards until zapd can fix itself (we extract these in a different file anyway) * compile and font implemented to get past title screen * file select * message, kaleido and everything else but rando * uintptr_t * rando and custom messages working! * ntsc-j 1.0 support * n64 logo? * copy ntsc 10 to 11 * ntsc 11 extraction * change title version names * copy ntsc 11 to 12 * ntsc 12 extraction * clean up some todos * re checkout submodules post merge * fix US filename * support cross-version filenames * add new versions to non-mq list * use correct message table init * Fix ntsc nes message table overriding pal nes message table * actual fix, allows extraction * fix file name using wrong font of file being hovered over * Fix barinade crash * re-add pal * better jabu fix and revert LUS * fix gerudo title cards * better better owl select * more owl fixes * build * fix some name decode issues * Switch Language Mid Text * Fix PAL displaying for JP filenames * Fix AskToEquip Crash * Disable Credits Timing Fix on NTSC * Fix JP Text positioning * basic language switching (BIG todo: file select, title screen) * Title Screen Hopefully working * add ntsc to linux appimage stuff, TODO: add .v64/.n64 support * Update OTRExporter * Fix pause to decide offset * Fix bomb item name crash * fix fire arrows and PoH * builds * update asset changes and fix menu language changing * fix name decode * Fix crashes and add rando/boss rush select stuff * Revive debug feature by setting language cvar too * Fix ocarina text speed softlock, and update jp text speed changes * Merge remote-tracking branch 'upstream/develop' into NTSC * Fix options menu and let pal use japanese fully * Resolve some suggestions * match up gTextSpeed changes to english (still broken!) * Fix text speed crash * Set default filename language on save init funcs * bump otrexporter * Display same correct info for n64 ntsc-j and ntsc-u * quicktext more closely aligned with decomp * linux appimage v64/n64 checksums * bump zapd * Credits Fix Tooltip Adjusted * update supported hashes json * update shasums to include JP n64 --- OTRExporter | 2 +- ZAPDTR | 2 +- docs/supportedHashes.json | 24 + scripts/linux/appimage/soh.sh.in | 60 + .../gFileSelBossRushSettingsJPNTex.ia8.png | Bin 0 -> 2368 bytes .../gFileSelPleaseChooseAQuestJPNTex.ia8.png | Bin 0 -> 2739 bytes soh/assets/extractor/Config_N64_NTSC_10.xml | 8 + soh/assets/extractor/Config_N64_NTSC_11.xml | 8 + soh/assets/extractor/Config_N64_NTSC_12.xml | 8 + .../objects/gameplay_keep/gameplay_keep.h | 57 + soh/assets/objects/object_mag/object_mag.h | 3 + .../ovl_File_Choose/ovl_file_choose.h | 9 + soh/assets/soh_assets.h | 6 + .../textures/boss_title_cards/object_bv.h | 3 + .../textures/boss_title_cards/object_fd.h | 3 + .../textures/boss_title_cards/object_fhg.h | 3 + .../textures/boss_title_cards/object_ganon.h | 3 + .../textures/boss_title_cards/object_ganon2.h | 3 + .../textures/boss_title_cards/object_goma.h | 3 + .../boss_title_cards/object_kingdodongo.h | 3 + .../textures/boss_title_cards/object_mo.h | 3 + .../textures/boss_title_cards/object_sst.h | 3 + .../textures/boss_title_cards/object_tw.h | 3 + .../do_action_static/do_action_static.h | 88 + .../icon_item_gameover_static.h | 3 + .../icon_item_jpn_static.h | 100 + .../item_name_static/item_name_static.h | 336 + soh/assets/textures/kanji/kanji.h | 11927 ++++++++++++++++ .../map_name_static/map_name_static.h | 103 + .../textures/title_static/title_static.h | 109 + soh/assets/xml/GC_MQ_D/code/sys_matrix.xml | 2 +- .../xml/GC_MQ_PAL_F/code/sys_matrix.xml | 2 +- soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml | 2 +- .../xml/GC_NMQ_PAL_F/code/sys_matrix.xml | 2 +- soh/assets/xml/N64_NTSC_10/audio/Audio.xml | 1570 ++ .../xml/N64_NTSC_10/code/fbdemo_circle.xml | 13 + .../xml/N64_NTSC_10/code/fbdemo_triforce.xml | 8 + .../xml/N64_NTSC_10/code/fbdemo_wipe1.xml | 10 + .../xml/N64_NTSC_10/code/sys_matrix.xml | 5 + .../xml/N64_NTSC_10/misc/link_animetion.xml | 577 + .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../xml/N64_NTSC_10/objects/gameplay_keep.xml | 1011 ++ .../xml/N64_NTSC_10/objects/object_Bb.xml | 37 + .../xml/N64_NTSC_10/objects/object_ahg.xml | 61 + .../xml/N64_NTSC_10/objects/object_am.xml | 22 + .../xml/N64_NTSC_10/objects/object_ane.xml | 59 + .../xml/N64_NTSC_10/objects/object_ani.xml | 67 + .../N64_NTSC_10/objects/object_anubice.xml | 29 + .../xml/N64_NTSC_10/objects/object_aob.xml | 59 + .../N64_NTSC_10/objects/object_b_heart.xml | 8 + .../xml/N64_NTSC_10/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../xml/N64_NTSC_10/objects/object_bdoor.xml | 15 + .../xml/N64_NTSC_10/objects/object_bg.xml | 50 + .../N64_NTSC_10/objects/object_bigokuta.xml | 58 + .../xml/N64_NTSC_10/objects/object_bird.xml | 30 + .../xml/N64_NTSC_10/objects/object_bji.xml | 56 + .../xml/N64_NTSC_10/objects/object_bl.xml | 32 + .../xml/N64_NTSC_10/objects/object_blkobj.xml | 37 + .../xml/N64_NTSC_10/objects/object_bob.xml | 47 + .../xml/N64_NTSC_10/objects/object_boj.xml | 65 + .../xml/N64_NTSC_10/objects/object_bombf.xml | 14 + .../N64_NTSC_10/objects/object_bombiwa.xml | 7 + .../xml/N64_NTSC_10/objects/object_bowl.xml | 18 + .../xml/N64_NTSC_10/objects/object_box.xml | 30 + .../xml/N64_NTSC_10/objects/object_brob.xml | 25 + .../xml/N64_NTSC_10/objects/object_bubble.xml | 6 + .../xml/N64_NTSC_10/objects/object_bv.xml | 116 + .../xml/N64_NTSC_10/objects/object_bw.xml | 29 + .../xml/N64_NTSC_10/objects/object_bwall.xml | 7 + .../xml/N64_NTSC_10/objects/object_bxa.xml | 13 + .../xml/N64_NTSC_10/objects/object_cne.xml | 53 + .../xml/N64_NTSC_10/objects/object_cob.xml | 41 + .../xml/N64_NTSC_10/objects/object_cow.xml | 55 + .../xml/N64_NTSC_10/objects/object_crow.xml | 11 + .../xml/N64_NTSC_10/objects/object_cs.xml | 60 + .../N64_NTSC_10/objects/object_d_elevator.xml | 7 + .../N64_NTSC_10/objects/object_d_hsblock.xml | 10 + .../xml/N64_NTSC_10/objects/object_d_lift.xml | 8 + .../xml/N64_NTSC_10/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../N64_NTSC_10/objects/object_dekubaba.xml | 38 + .../xml/N64_NTSC_10/objects/object_dekujr.xml | 13 + .../N64_NTSC_10/objects/object_dekunuts.xml | 32 + .../N64_NTSC_10/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/N64_NTSC_10/objects/object_dh.xml | 59 + .../xml/N64_NTSC_10/objects/object_dnk.xml | 35 + .../xml/N64_NTSC_10/objects/object_dns.xml | 40 + .../xml/N64_NTSC_10/objects/object_dodojr.xml | 33 + .../N64_NTSC_10/objects/object_dodongo.xml | 41 + .../xml/N64_NTSC_10/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/N64_NTSC_10/objects/object_ds.xml | 38 + .../xml/N64_NTSC_10/objects/object_ds2.xml | 34 + .../xml/N64_NTSC_10/objects/object_du.xml | 81 + .../xml/N64_NTSC_10/objects/object_dy_obj.xml | 121 + .../xml/N64_NTSC_10/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../N64_NTSC_10/objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../N64_NTSC_10/objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../xml/N64_NTSC_10/objects/object_efc_tw.xml | 13 + .../xml/N64_NTSC_10/objects/object_ei.xml | 56 + .../xml/N64_NTSC_10/objects/object_fa.xml | 15 + .../xml/N64_NTSC_10/objects/object_fd.xml | 103 + .../xml/N64_NTSC_10/objects/object_fd2.xml | 52 + .../xml/N64_NTSC_10/objects/object_fhg.xml | 54 + .../xml/N64_NTSC_10/objects/object_fire.xml | 14 + .../N64_NTSC_10/objects/object_firefly.xml | 21 + .../xml/N64_NTSC_10/objects/object_fish.xml | 180 + .../xml/N64_NTSC_10/objects/object_fr.xml | 65 + .../xml/N64_NTSC_10/objects/object_fu.xml | 55 + .../xml/N64_NTSC_10/objects/object_fw.xml | 106 + .../xml/N64_NTSC_10/objects/object_fz.xml | 12 + .../xml/N64_NTSC_10/objects/object_ganon.xml | 106 + .../xml/N64_NTSC_10/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/N64_NTSC_10/objects/object_ge1.xml | 78 + .../xml/N64_NTSC_10/objects/object_geff.xml | 7 + .../xml/N64_NTSC_10/objects/object_geldb.xml | 44 + .../N64_NTSC_10/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../N64_NTSC_10/objects/object_gi_bean.xml | 5 + .../N64_NTSC_10/objects/object_gi_bomb_1.xml | 5 + .../N64_NTSC_10/objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../N64_NTSC_10/objects/object_gi_boots_2.xml | 7 + .../N64_NTSC_10/objects/object_gi_bosskey.xml | 6 + .../N64_NTSC_10/objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../xml/N64_NTSC_10/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../N64_NTSC_10/objects/object_gi_clothes.xml | 11 + .../N64_NTSC_10/objects/object_gi_coin.xml | 10 + .../N64_NTSC_10/objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../xml/N64_NTSC_10/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../N64_NTSC_10/objects/object_gi_fire.xml | 8 + .../N64_NTSC_10/objects/object_gi_fish.xml | 5 + .../N64_NTSC_10/objects/object_gi_frog.xml | 7 + .../N64_NTSC_10/objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../N64_NTSC_10/objects/object_gi_ghost.xml | 11 + .../N64_NTSC_10/objects/object_gi_glasses.xml | 6 + .../N64_NTSC_10/objects/object_gi_gloves.xml | 11 + .../N64_NTSC_10/objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../N64_NTSC_10/objects/object_gi_grass.xml | 5 + .../N64_NTSC_10/objects/object_gi_hammer.xml | 5 + .../N64_NTSC_10/objects/object_gi_heart.xml | 5 + .../N64_NTSC_10/objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../N64_NTSC_10/objects/object_gi_insect.xml | 6 + .../N64_NTSC_10/objects/object_gi_jewel.xml | 15 + .../xml/N64_NTSC_10/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../N64_NTSC_10/objects/object_gi_letter.xml | 8 + .../N64_NTSC_10/objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../N64_NTSC_10/objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../xml/N64_NTSC_10/objects/object_gi_map.xml | 7 + .../N64_NTSC_10/objects/object_gi_medal.xml | 11 + .../N64_NTSC_10/objects/object_gi_melody.xml | 11 + .../N64_NTSC_10/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../N64_NTSC_10/objects/object_gi_nuts.xml | 6 + .../N64_NTSC_10/objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../N64_NTSC_10/objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../N64_NTSC_10/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../N64_NTSC_10/objects/object_gi_rupy.xml | 16 + .../xml/N64_NTSC_10/objects/object_gi_saw.xml | 5 + .../N64_NTSC_10/objects/object_gi_scale.xml | 10 + .../N64_NTSC_10/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../N64_NTSC_10/objects/object_gi_soldout.xml | 6 + .../N64_NTSC_10/objects/object_gi_soul.xml | 8 + .../N64_NTSC_10/objects/object_gi_stick.xml | 5 + .../N64_NTSC_10/objects/object_gi_sutaru.xml | 6 + .../N64_NTSC_10/objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/N64_NTSC_10/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/N64_NTSC_10/objects/object_gla.xml | 85 + .../xml/N64_NTSC_10/objects/object_gm.xml | 5 + .../xml/N64_NTSC_10/objects/object_gnd.xml | 87 + .../N64_NTSC_10/objects/object_gnd_magic.xml | 7 + .../xml/N64_NTSC_10/objects/object_gndd.xml | 106 + .../N64_NTSC_10/objects/object_god_lgt.xml | 9 + .../xml/N64_NTSC_10/objects/object_gol.xml | 59 + .../xml/N64_NTSC_10/objects/object_goma.xml | 169 + .../N64_NTSC_10/objects/object_goroiwa.xml | 6 + .../xml/N64_NTSC_10/objects/object_gr.xml | 27 + .../xml/N64_NTSC_10/objects/object_gs.xml | 8 + .../xml/N64_NTSC_10/objects/object_gt.xml | 38 + .../xml/N64_NTSC_10/objects/object_haka.xml | 10 + .../N64_NTSC_10/objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/N64_NTSC_10/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../N64_NTSC_10/objects/object_hintnuts.xml | 29 + .../xml/N64_NTSC_10/objects/object_hni.xml | 51 + .../xml/N64_NTSC_10/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/N64_NTSC_10/objects/object_hs.xml | 47 + .../xml/N64_NTSC_10/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/N64_NTSC_10/objects/object_ik.xml | 108 + .../xml/N64_NTSC_10/objects/object_im.xml | 79 + .../xml/N64_NTSC_10/objects/object_in.xml | 142 + .../xml/N64_NTSC_10/objects/object_ingate.xml | 7 + .../xml/N64_NTSC_10/objects/object_jj.xml | 77 + .../xml/N64_NTSC_10/objects/object_js.xml | 55 + .../N64_NTSC_10/objects/object_jya_door.xml | 8 + .../N64_NTSC_10/objects/object_jya_iron.xml | 13 + .../N64_NTSC_10/objects/object_jya_obj.xml | 87 + .../xml/N64_NTSC_10/objects/object_ka.xml | 64 + .../xml/N64_NTSC_10/objects/object_kanban.xml | 18 + .../N64_NTSC_10/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/N64_NTSC_10/objects/object_km1.xml | 39 + .../xml/N64_NTSC_10/objects/object_kusa.xml | 6 + .../xml/N64_NTSC_10/objects/object_kw1.xml | 63 + .../xml/N64_NTSC_10/objects/object_kz.xml | 45 + .../N64_NTSC_10/objects/object_light_ring.xml | 6 + .../N64_NTSC_10/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../N64_NTSC_10/objects/object_link_boy.xml | 282 + .../N64_NTSC_10/objects/object_link_child.xml | 225 + .../xml/N64_NTSC_10/objects/object_ma1.xml | 67 + .../xml/N64_NTSC_10/objects/object_ma2.xml | 75 + .../xml/N64_NTSC_10/objects/object_mag.xml | 20 + .../N64_NTSC_10/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/N64_NTSC_10/objects/object_mb.xml | 73 + .../xml/N64_NTSC_10/objects/object_md.xml | 87 + .../xml/N64_NTSC_10/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../N64_NTSC_10/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/N64_NTSC_10/objects/object_mjin.xml | 8 + .../N64_NTSC_10/objects/object_mjin_dark.xml | 5 + .../N64_NTSC_10/objects/object_mjin_flame.xml | 5 + .../N64_NTSC_10/objects/object_mjin_flash.xml | 5 + .../N64_NTSC_10/objects/object_mjin_ice.xml | 5 + .../N64_NTSC_10/objects/object_mjin_oka.xml | 8 + .../N64_NTSC_10/objects/object_mjin_soul.xml | 5 + .../N64_NTSC_10/objects/object_mjin_wind.xml | 5 + .../xml/N64_NTSC_10/objects/object_mk.xml | 44 + .../xml/N64_NTSC_10/objects/object_mm.xml | 25 + .../xml/N64_NTSC_10/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../N64_NTSC_10/objects/object_mori_tex.xml | 29 + .../xml/N64_NTSC_10/objects/object_ms.xml | 43 + .../xml/N64_NTSC_10/objects/object_mu.xml | 96 + .../xml/N64_NTSC_10/objects/object_nb.xml | 118 + .../xml/N64_NTSC_10/objects/object_niw.xml | 49 + .../xml/N64_NTSC_10/objects/object_nwc.xml | 15 + .../xml/N64_NTSC_10/objects/object_ny.xml | 10 + .../xml/N64_NTSC_10/objects/object_oA1.xml | 69 + .../xml/N64_NTSC_10/objects/object_oA10.xml | 66 + .../xml/N64_NTSC_10/objects/object_oA11.xml | 66 + .../xml/N64_NTSC_10/objects/object_oA2.xml | 58 + .../xml/N64_NTSC_10/objects/object_oA3.xml | 11 + .../xml/N64_NTSC_10/objects/object_oA4.xml | 64 + .../xml/N64_NTSC_10/objects/object_oA5.xml | 64 + .../xml/N64_NTSC_10/objects/object_oA6.xml | 64 + .../xml/N64_NTSC_10/objects/object_oA7.xml | 62 + .../xml/N64_NTSC_10/objects/object_oA8.xml | 61 + .../xml/N64_NTSC_10/objects/object_oA9.xml | 7 + .../xml/N64_NTSC_10/objects/object_oB1.xml | 69 + .../xml/N64_NTSC_10/objects/object_oB2.xml | 76 + .../xml/N64_NTSC_10/objects/object_oB3.xml | 70 + .../xml/N64_NTSC_10/objects/object_oB4.xml | 64 + .../xml/N64_NTSC_10/objects/object_oE1.xml | 70 + .../xml/N64_NTSC_10/objects/object_oE10.xml | 15 + .../xml/N64_NTSC_10/objects/object_oE11.xml | 15 + .../xml/N64_NTSC_10/objects/object_oE12.xml | 15 + .../xml/N64_NTSC_10/objects/object_oE1s.xml | 52 + .../xml/N64_NTSC_10/objects/object_oE2.xml | 71 + .../xml/N64_NTSC_10/objects/object_oE3.xml | 73 + .../xml/N64_NTSC_10/objects/object_oE4.xml | 69 + .../xml/N64_NTSC_10/objects/object_oE4s.xml | 48 + .../xml/N64_NTSC_10/objects/object_oE5.xml | 64 + .../xml/N64_NTSC_10/objects/object_oE6.xml | 15 + .../xml/N64_NTSC_10/objects/object_oE7.xml | 14 + .../xml/N64_NTSC_10/objects/object_oE8.xml | 15 + .../xml/N64_NTSC_10/objects/object_oE9.xml | 15 + .../N64_NTSC_10/objects/object_oE_anime.xml | 10 + .../N64_NTSC_10/objects/object_oF1d_map.xml | 54 + .../xml/N64_NTSC_10/objects/object_oF1s.xml | 58 + .../N64_NTSC_10/objects/object_o_anime.xml | 11 + .../xml/N64_NTSC_10/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/N64_NTSC_10/objects/object_os.xml | 36 + .../N64_NTSC_10/objects/object_os_anime.xml | 69 + .../xml/N64_NTSC_10/objects/object_ossan.xml | 23 + .../N64_NTSC_10/objects/object_ouke_haka.xml | 6 + .../xml/N64_NTSC_10/objects/object_owl.xml | 79 + .../xml/N64_NTSC_10/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../N64_NTSC_10/objects/object_po_field.xml | 31 + .../N64_NTSC_10/objects/object_po_sisters.xml | 56 + .../xml/N64_NTSC_10/objects/object_poh.xml | 25 + .../xml/N64_NTSC_10/objects/object_ps.xml | 42 + .../xml/N64_NTSC_10/objects/object_pu_box.xml | 13 + .../xml/N64_NTSC_10/objects/object_rd.xml | 124 + .../xml/N64_NTSC_10/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/N64_NTSC_10/objects/object_rl.xml | 52 + .../xml/N64_NTSC_10/objects/object_rr.xml | 8 + .../xml/N64_NTSC_10/objects/object_rs.xml | 32 + .../xml/N64_NTSC_10/objects/object_ru1.xml | 83 + .../xml/N64_NTSC_10/objects/object_ru2.xml | 92 + .../xml/N64_NTSC_10/objects/object_sa.xml | 100 + .../xml/N64_NTSC_10/objects/object_sb.xml | 30 + .../xml/N64_NTSC_10/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../N64_NTSC_10/objects/object_shopnuts.xml | 67 + .../N64_NTSC_10/objects/object_siofuki.xml | 7 + .../xml/N64_NTSC_10/objects/object_sk2.xml | 130 + .../xml/N64_NTSC_10/objects/object_skb.xml | 64 + .../xml/N64_NTSC_10/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../N64_NTSC_10/objects/object_spot08_obj.xml | 27 + .../N64_NTSC_10/objects/object_spot09_obj.xml | 35 + .../N64_NTSC_10/objects/object_spot11_obj.xml | 9 + .../N64_NTSC_10/objects/object_spot12_obj.xml | 13 + .../N64_NTSC_10/objects/object_spot15_obj.xml | 13 + .../N64_NTSC_10/objects/object_spot16_obj.xml | 11 + .../N64_NTSC_10/objects/object_spot17_obj.xml | 12 + .../N64_NTSC_10/objects/object_spot18_obj.xml | 36 + .../xml/N64_NTSC_10/objects/object_ssh.xml | 61 + .../xml/N64_NTSC_10/objects/object_sst.xml | 71 + .../xml/N64_NTSC_10/objects/object_st.xml | 71 + .../xml/N64_NTSC_10/objects/object_stream.xml | 6 + .../N64_NTSC_10/objects/object_syokudai.xml | 13 + .../xml/N64_NTSC_10/objects/object_ta.xml | 72 + .../N64_NTSC_10/objects/object_timeblock.xml | 7 + .../xml/N64_NTSC_10/objects/object_tite.xml | 55 + .../xml/N64_NTSC_10/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../xml/N64_NTSC_10/objects/object_torch2.xml | 13 + .../xml/N64_NTSC_10/objects/object_toryo.xml | 53 + .../xml/N64_NTSC_10/objects/object_tp.xml | 17 + .../xml/N64_NTSC_10/objects/object_tr.xml | 149 + .../xml/N64_NTSC_10/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/N64_NTSC_10/objects/object_ts.xml | 34 + .../xml/N64_NTSC_10/objects/object_tsubo.xml | 9 + .../xml/N64_NTSC_10/objects/object_tw.xml | 332 + .../N64_NTSC_10/objects/object_umajump.xml | 8 + .../xml/N64_NTSC_10/objects/object_vali.xml | 63 + .../xml/N64_NTSC_10/objects/object_vase.xml | 7 + .../xml/N64_NTSC_10/objects/object_vm.xml | 41 + .../N64_NTSC_10/objects/object_wallmaster.xml | 35 + .../xml/N64_NTSC_10/objects/object_warp1.xml | 39 + .../xml/N64_NTSC_10/objects/object_warp2.xml | 6 + .../xml/N64_NTSC_10/objects/object_wf.xml | 128 + .../xml/N64_NTSC_10/objects/object_wood02.xml | 35 + .../xml/N64_NTSC_10/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../N64_NTSC_10/objects/object_yukabyun.xml | 9 + .../xml/N64_NTSC_10/objects/object_zf.xml | 182 + .../xml/N64_NTSC_10/objects/object_zg.xml | 8 + .../xml/N64_NTSC_10/objects/object_zl1.xml | 115 + .../xml/N64_NTSC_10/objects/object_zl2.xml | 75 + .../N64_NTSC_10/objects/object_zl2_anime1.xml | 30 + .../N64_NTSC_10/objects/object_zl2_anime2.xml | 40 + .../xml/N64_NTSC_10/objects/object_zl4.xml | 91 + .../xml/N64_NTSC_10/objects/object_zo.xml | 88 + .../N64_NTSC_10/overlays/ovl_Arrow_Fire.xml | 11 + .../N64_NTSC_10/overlays/ovl_Arrow_Ice.xml | 11 + .../N64_NTSC_10/overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml | 6 + .../N64_NTSC_10/overlays/ovl_Boss_Ganon.xml | 68 + .../N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml | 76 + .../xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml | 10 + .../xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml | 10 + .../xml/N64_NTSC_10/overlays/ovl_En_Bili.xml | 7 + .../N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../xml/N64_NTSC_10/overlays/ovl_En_Holl.xml | 8 + .../N64_NTSC_10/overlays/ovl_En_Jsjutan.xml | 38 + .../N64_NTSC_10/overlays/ovl_En_Kanban.xml | 8 + .../xml/N64_NTSC_10/overlays/ovl_En_Sda.xml | 9 + .../xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml | 8 + .../xml/N64_NTSC_10/overlays/ovl_En_St.xml | 8 + .../xml/N64_NTSC_10/overlays/ovl_En_Sth.xml | 15 + .../N64_NTSC_10/overlays/ovl_End_Title.xml | 17 + .../N64_NTSC_10/overlays/ovl_File_Choose.xml | 32 + .../N64_NTSC_10/overlays/ovl_Magic_Dark.xml | 12 + .../N64_NTSC_10/overlays/ovl_Magic_Fire.xml | 10 + .../N64_NTSC_10/overlays/ovl_Magic_Wind.xml | 15 + .../N64_NTSC_10/overlays/ovl_Oceff_Spot.xml | 10 + .../N64_NTSC_10/overlays/ovl_Oceff_Storm.xml | 11 + .../N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml | 10 + .../N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml | 11 + .../N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml | 10 + .../N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml | 11 + .../N64_NTSC_10/scenes/dungeons/Bmori1.xml | 231 + .../N64_NTSC_10/scenes/dungeons/FIRE_bs.xml | 34 + .../N64_NTSC_10/scenes/dungeons/HAKAdan.xml | 191 + .../N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml | 69 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml | 288 + .../N64_NTSC_10/scenes/dungeons/MIZUsin.xml | 262 + .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../xml/N64_NTSC_10/scenes/dungeons/bdan.xml | 96 + .../N64_NTSC_10/scenes/dungeons/bdan_boss.xml | 20 + .../xml/N64_NTSC_10/scenes/dungeons/ddan.xml | 220 + .../N64_NTSC_10/scenes/dungeons/ddan_boss.xml | 22 + .../xml/N64_NTSC_10/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../N64_NTSC_10/scenes/dungeons/ganon_tou.xml | 34 + .../N64_NTSC_10/scenes/dungeons/ganontika.xml | 254 + .../scenes/dungeons/ganontikasonogo.xml | 36 + .../N64_NTSC_10/scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 105 + .../scenes/dungeons/jyasinboss.xml | 49 + .../N64_NTSC_10/scenes/dungeons/jyasinzou.xml | 358 + .../xml/N64_NTSC_10/scenes/dungeons/men.xml | 127 + .../scenes/dungeons/moribossroom.xml | 33 + .../xml/N64_NTSC_10/scenes/dungeons/ydan.xml | 157 + .../N64_NTSC_10/scenes/dungeons/ydan_boss.xml | 26 + .../N64_NTSC_10/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/N64_NTSC_10/scenes/indoors/hut.xml | 8 + .../N64_NTSC_10/scenes/indoors/hylia_labo.xml | 39 + .../xml/N64_NTSC_10/scenes/indoors/impa.xml | 8 + .../N64_NTSC_10/scenes/indoors/kakariko.xml | 8 + .../N64_NTSC_10/scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/N64_NTSC_10/scenes/indoors/labo.xml | 8 + .../N64_NTSC_10/scenes/indoors/link_home.xml | 8 + .../N64_NTSC_10/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../N64_NTSC_10/scenes/indoors/miharigoya.xml | 28 + .../N64_NTSC_10/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../N64_NTSC_10/scenes/indoors/takaraya.xml | 53 + .../xml/N64_NTSC_10/scenes/indoors/tent.xml | 8 + .../N64_NTSC_10/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/N64_NTSC_10/scenes/misc/enrui.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/entra_n.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/hakaana.xml | 18 + .../xml/N64_NTSC_10/scenes/misc/hakaana2.xml | 26 + .../N64_NTSC_10/scenes/misc/hakaana_ouke.xml | 37 + .../N64_NTSC_10/scenes/misc/hiral_demo.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/kakariko3.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/kakusiana.xml | 113 + .../xml/N64_NTSC_10/scenes/misc/kinsuta.xml | 23 + .../N64_NTSC_10/scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../N64_NTSC_10/scenes/misc/market_day.xml | 9 + .../N64_NTSC_10/scenes/misc/market_night.xml | 9 + .../N64_NTSC_10/scenes/misc/market_ruins.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/shrine.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/shrine_n.xml | 9 + .../xml/N64_NTSC_10/scenes/misc/shrine_r.xml | 8 + .../xml/N64_NTSC_10/scenes/misc/turibori.xml | 35 + .../N64_NTSC_10/scenes/overworld/entra.xml | 8 + .../N64_NTSC_10/scenes/overworld/souko.xml | 44 + .../N64_NTSC_10/scenes/overworld/spot00.xml | 69 + .../N64_NTSC_10/scenes/overworld/spot01.xml | 51 + .../N64_NTSC_10/scenes/overworld/spot02.xml | 64 + .../N64_NTSC_10/scenes/overworld/spot03.xml | 41 + .../N64_NTSC_10/scenes/overworld/spot04.xml | 81 + .../N64_NTSC_10/scenes/overworld/spot05.xml | 43 + .../N64_NTSC_10/scenes/overworld/spot06.xml | 58 + .../N64_NTSC_10/scenes/overworld/spot07.xml | 47 + .../N64_NTSC_10/scenes/overworld/spot08.xml | 36 + .../N64_NTSC_10/scenes/overworld/spot09.xml | 37 + .../N64_NTSC_10/scenes/overworld/spot10.xml | 71 + .../N64_NTSC_10/scenes/overworld/spot11.xml | 41 + .../N64_NTSC_10/scenes/overworld/spot12.xml | 52 + .../N64_NTSC_10/scenes/overworld/spot13.xml | 39 + .../N64_NTSC_10/scenes/overworld/spot15.xml | 52 + .../N64_NTSC_10/scenes/overworld/spot16.xml | 50 + .../N64_NTSC_10/scenes/overworld/spot17.xml | 54 + .../N64_NTSC_10/scenes/overworld/spot18.xml | 105 + .../N64_NTSC_10/scenes/overworld/spot20.xml | 36 + .../N64_NTSC_10/scenes/shops/alley_shop.xml | 8 + .../xml/N64_NTSC_10/scenes/shops/drag.xml | 8 + .../N64_NTSC_10/scenes/shops/face_shop.xml | 8 + .../xml/N64_NTSC_10/scenes/shops/golon.xml | 8 + .../N64_NTSC_10/scenes/shops/kokiri_shop.xml | 8 + .../N64_NTSC_10/scenes/shops/night_shop.xml | 8 + .../xml/N64_NTSC_10/scenes/shops/shop1.xml | 8 + .../xml/N64_NTSC_10/scenes/shops/zoora.xml | 8 + .../N64_NTSC_10/text/elf_message_field.xml | 5 + .../xml/N64_NTSC_10/text/elf_message_ydan.xml | 5 + .../N64_NTSC_10/text/message_data_static.xml | 11 + .../xml/N64_NTSC_10/textures/backgrounds.xml | 246 + .../N64_NTSC_10/textures/boss_title_cards.xml | 42 + .../N64_NTSC_10/textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../N64_NTSC_10/textures/icon_item_static.xml | 188 + .../N64_NTSC_10/textures/item_name_static.xml | 250 + soh/assets/xml/N64_NTSC_10/textures/kanji.xml | 3984 ++++++ .../N64_NTSC_10/textures/map_48x85_static.xml | 72 + .../N64_NTSC_10/textures/map_grand_static.xml | 28 + .../xml/N64_NTSC_10/textures/map_i_static.xml | 243 + .../N64_NTSC_10/textures/map_name_static.xml | 72 + .../N64_NTSC_10/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../N64_NTSC_10/textures/nes_font_static.xml | 144 + .../textures/nintendo_rogo_static.xml | 9 + .../N64_NTSC_10/textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/N64_NTSC_10/textures/skyboxes.xml | 113 + .../xml/N64_NTSC_10/textures/title_static.xml | 169 + soh/assets/xml/N64_NTSC_11/audio/Audio.xml | 1570 ++ .../xml/N64_NTSC_11/code/fbdemo_circle.xml | 13 + .../xml/N64_NTSC_11/code/fbdemo_triforce.xml | 8 + .../xml/N64_NTSC_11/code/fbdemo_wipe1.xml | 10 + .../xml/N64_NTSC_11/code/sys_matrix.xml | 5 + .../xml/N64_NTSC_11/misc/link_animetion.xml | 577 + .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../xml/N64_NTSC_11/objects/gameplay_keep.xml | 1011 ++ .../xml/N64_NTSC_11/objects/object_Bb.xml | 37 + .../xml/N64_NTSC_11/objects/object_ahg.xml | 61 + .../xml/N64_NTSC_11/objects/object_am.xml | 22 + .../xml/N64_NTSC_11/objects/object_ane.xml | 59 + .../xml/N64_NTSC_11/objects/object_ani.xml | 67 + .../N64_NTSC_11/objects/object_anubice.xml | 29 + .../xml/N64_NTSC_11/objects/object_aob.xml | 59 + .../N64_NTSC_11/objects/object_b_heart.xml | 8 + .../xml/N64_NTSC_11/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../xml/N64_NTSC_11/objects/object_bdoor.xml | 15 + .../xml/N64_NTSC_11/objects/object_bg.xml | 50 + .../N64_NTSC_11/objects/object_bigokuta.xml | 58 + .../xml/N64_NTSC_11/objects/object_bird.xml | 30 + .../xml/N64_NTSC_11/objects/object_bji.xml | 56 + .../xml/N64_NTSC_11/objects/object_bl.xml | 32 + .../xml/N64_NTSC_11/objects/object_blkobj.xml | 37 + .../xml/N64_NTSC_11/objects/object_bob.xml | 47 + .../xml/N64_NTSC_11/objects/object_boj.xml | 65 + .../xml/N64_NTSC_11/objects/object_bombf.xml | 14 + .../N64_NTSC_11/objects/object_bombiwa.xml | 7 + .../xml/N64_NTSC_11/objects/object_bowl.xml | 18 + .../xml/N64_NTSC_11/objects/object_box.xml | 30 + .../xml/N64_NTSC_11/objects/object_brob.xml | 25 + .../xml/N64_NTSC_11/objects/object_bubble.xml | 6 + .../xml/N64_NTSC_11/objects/object_bv.xml | 116 + .../xml/N64_NTSC_11/objects/object_bw.xml | 29 + .../xml/N64_NTSC_11/objects/object_bwall.xml | 7 + .../xml/N64_NTSC_11/objects/object_bxa.xml | 13 + .../xml/N64_NTSC_11/objects/object_cne.xml | 53 + .../xml/N64_NTSC_11/objects/object_cob.xml | 41 + .../xml/N64_NTSC_11/objects/object_cow.xml | 55 + .../xml/N64_NTSC_11/objects/object_crow.xml | 11 + .../xml/N64_NTSC_11/objects/object_cs.xml | 60 + .../N64_NTSC_11/objects/object_d_elevator.xml | 7 + .../N64_NTSC_11/objects/object_d_hsblock.xml | 10 + .../xml/N64_NTSC_11/objects/object_d_lift.xml | 8 + .../xml/N64_NTSC_11/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../N64_NTSC_11/objects/object_dekubaba.xml | 38 + .../xml/N64_NTSC_11/objects/object_dekujr.xml | 13 + .../N64_NTSC_11/objects/object_dekunuts.xml | 32 + .../N64_NTSC_11/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/N64_NTSC_11/objects/object_dh.xml | 59 + .../xml/N64_NTSC_11/objects/object_dnk.xml | 35 + .../xml/N64_NTSC_11/objects/object_dns.xml | 40 + .../xml/N64_NTSC_11/objects/object_dodojr.xml | 33 + .../N64_NTSC_11/objects/object_dodongo.xml | 41 + .../xml/N64_NTSC_11/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/N64_NTSC_11/objects/object_ds.xml | 38 + .../xml/N64_NTSC_11/objects/object_ds2.xml | 34 + .../xml/N64_NTSC_11/objects/object_du.xml | 81 + .../xml/N64_NTSC_11/objects/object_dy_obj.xml | 121 + .../xml/N64_NTSC_11/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../N64_NTSC_11/objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../N64_NTSC_11/objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../xml/N64_NTSC_11/objects/object_efc_tw.xml | 13 + .../xml/N64_NTSC_11/objects/object_ei.xml | 56 + .../xml/N64_NTSC_11/objects/object_fa.xml | 15 + .../xml/N64_NTSC_11/objects/object_fd.xml | 103 + .../xml/N64_NTSC_11/objects/object_fd2.xml | 52 + .../xml/N64_NTSC_11/objects/object_fhg.xml | 54 + .../xml/N64_NTSC_11/objects/object_fire.xml | 14 + .../N64_NTSC_11/objects/object_firefly.xml | 21 + .../xml/N64_NTSC_11/objects/object_fish.xml | 180 + .../xml/N64_NTSC_11/objects/object_fr.xml | 65 + .../xml/N64_NTSC_11/objects/object_fu.xml | 55 + .../xml/N64_NTSC_11/objects/object_fw.xml | 106 + .../xml/N64_NTSC_11/objects/object_fz.xml | 12 + .../xml/N64_NTSC_11/objects/object_ganon.xml | 106 + .../xml/N64_NTSC_11/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/N64_NTSC_11/objects/object_ge1.xml | 78 + .../xml/N64_NTSC_11/objects/object_geff.xml | 7 + .../xml/N64_NTSC_11/objects/object_geldb.xml | 44 + .../N64_NTSC_11/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../N64_NTSC_11/objects/object_gi_bean.xml | 5 + .../N64_NTSC_11/objects/object_gi_bomb_1.xml | 5 + .../N64_NTSC_11/objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../N64_NTSC_11/objects/object_gi_boots_2.xml | 7 + .../N64_NTSC_11/objects/object_gi_bosskey.xml | 6 + .../N64_NTSC_11/objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../xml/N64_NTSC_11/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../N64_NTSC_11/objects/object_gi_clothes.xml | 11 + .../N64_NTSC_11/objects/object_gi_coin.xml | 10 + .../N64_NTSC_11/objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../xml/N64_NTSC_11/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../N64_NTSC_11/objects/object_gi_fire.xml | 8 + .../N64_NTSC_11/objects/object_gi_fish.xml | 5 + .../N64_NTSC_11/objects/object_gi_frog.xml | 7 + .../N64_NTSC_11/objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../N64_NTSC_11/objects/object_gi_ghost.xml | 11 + .../N64_NTSC_11/objects/object_gi_glasses.xml | 6 + .../N64_NTSC_11/objects/object_gi_gloves.xml | 11 + .../N64_NTSC_11/objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../N64_NTSC_11/objects/object_gi_grass.xml | 5 + .../N64_NTSC_11/objects/object_gi_hammer.xml | 5 + .../N64_NTSC_11/objects/object_gi_heart.xml | 5 + .../N64_NTSC_11/objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../N64_NTSC_11/objects/object_gi_insect.xml | 6 + .../N64_NTSC_11/objects/object_gi_jewel.xml | 15 + .../xml/N64_NTSC_11/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../N64_NTSC_11/objects/object_gi_letter.xml | 8 + .../N64_NTSC_11/objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../N64_NTSC_11/objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../xml/N64_NTSC_11/objects/object_gi_map.xml | 7 + .../N64_NTSC_11/objects/object_gi_medal.xml | 11 + .../N64_NTSC_11/objects/object_gi_melody.xml | 11 + .../N64_NTSC_11/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../N64_NTSC_11/objects/object_gi_nuts.xml | 6 + .../N64_NTSC_11/objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../N64_NTSC_11/objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../N64_NTSC_11/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../N64_NTSC_11/objects/object_gi_rupy.xml | 16 + .../xml/N64_NTSC_11/objects/object_gi_saw.xml | 5 + .../N64_NTSC_11/objects/object_gi_scale.xml | 10 + .../N64_NTSC_11/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../N64_NTSC_11/objects/object_gi_soldout.xml | 6 + .../N64_NTSC_11/objects/object_gi_soul.xml | 8 + .../N64_NTSC_11/objects/object_gi_stick.xml | 5 + .../N64_NTSC_11/objects/object_gi_sutaru.xml | 6 + .../N64_NTSC_11/objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/N64_NTSC_11/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/N64_NTSC_11/objects/object_gla.xml | 85 + .../xml/N64_NTSC_11/objects/object_gm.xml | 5 + .../xml/N64_NTSC_11/objects/object_gnd.xml | 87 + .../N64_NTSC_11/objects/object_gnd_magic.xml | 7 + .../xml/N64_NTSC_11/objects/object_gndd.xml | 106 + .../N64_NTSC_11/objects/object_god_lgt.xml | 9 + .../xml/N64_NTSC_11/objects/object_gol.xml | 59 + .../xml/N64_NTSC_11/objects/object_goma.xml | 169 + .../N64_NTSC_11/objects/object_goroiwa.xml | 6 + .../xml/N64_NTSC_11/objects/object_gr.xml | 27 + .../xml/N64_NTSC_11/objects/object_gs.xml | 8 + .../xml/N64_NTSC_11/objects/object_gt.xml | 38 + .../xml/N64_NTSC_11/objects/object_haka.xml | 10 + .../N64_NTSC_11/objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/N64_NTSC_11/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../N64_NTSC_11/objects/object_hintnuts.xml | 29 + .../xml/N64_NTSC_11/objects/object_hni.xml | 51 + .../xml/N64_NTSC_11/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/N64_NTSC_11/objects/object_hs.xml | 47 + .../xml/N64_NTSC_11/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/N64_NTSC_11/objects/object_ik.xml | 108 + .../xml/N64_NTSC_11/objects/object_im.xml | 79 + .../xml/N64_NTSC_11/objects/object_in.xml | 142 + .../xml/N64_NTSC_11/objects/object_ingate.xml | 7 + .../xml/N64_NTSC_11/objects/object_jj.xml | 77 + .../xml/N64_NTSC_11/objects/object_js.xml | 55 + .../N64_NTSC_11/objects/object_jya_door.xml | 8 + .../N64_NTSC_11/objects/object_jya_iron.xml | 13 + .../N64_NTSC_11/objects/object_jya_obj.xml | 87 + .../xml/N64_NTSC_11/objects/object_ka.xml | 64 + .../xml/N64_NTSC_11/objects/object_kanban.xml | 18 + .../N64_NTSC_11/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/N64_NTSC_11/objects/object_km1.xml | 39 + .../xml/N64_NTSC_11/objects/object_kusa.xml | 6 + .../xml/N64_NTSC_11/objects/object_kw1.xml | 63 + .../xml/N64_NTSC_11/objects/object_kz.xml | 45 + .../N64_NTSC_11/objects/object_light_ring.xml | 6 + .../N64_NTSC_11/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../N64_NTSC_11/objects/object_link_boy.xml | 282 + .../N64_NTSC_11/objects/object_link_child.xml | 225 + .../xml/N64_NTSC_11/objects/object_ma1.xml | 67 + .../xml/N64_NTSC_11/objects/object_ma2.xml | 75 + .../xml/N64_NTSC_11/objects/object_mag.xml | 20 + .../N64_NTSC_11/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/N64_NTSC_11/objects/object_mb.xml | 73 + .../xml/N64_NTSC_11/objects/object_md.xml | 87 + .../xml/N64_NTSC_11/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../N64_NTSC_11/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/N64_NTSC_11/objects/object_mjin.xml | 8 + .../N64_NTSC_11/objects/object_mjin_dark.xml | 5 + .../N64_NTSC_11/objects/object_mjin_flame.xml | 5 + .../N64_NTSC_11/objects/object_mjin_flash.xml | 5 + .../N64_NTSC_11/objects/object_mjin_ice.xml | 5 + .../N64_NTSC_11/objects/object_mjin_oka.xml | 8 + .../N64_NTSC_11/objects/object_mjin_soul.xml | 5 + .../N64_NTSC_11/objects/object_mjin_wind.xml | 5 + .../xml/N64_NTSC_11/objects/object_mk.xml | 44 + .../xml/N64_NTSC_11/objects/object_mm.xml | 25 + .../xml/N64_NTSC_11/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../N64_NTSC_11/objects/object_mori_tex.xml | 29 + .../xml/N64_NTSC_11/objects/object_ms.xml | 43 + .../xml/N64_NTSC_11/objects/object_mu.xml | 96 + .../xml/N64_NTSC_11/objects/object_nb.xml | 118 + .../xml/N64_NTSC_11/objects/object_niw.xml | 49 + .../xml/N64_NTSC_11/objects/object_nwc.xml | 15 + .../xml/N64_NTSC_11/objects/object_ny.xml | 10 + .../xml/N64_NTSC_11/objects/object_oA1.xml | 69 + .../xml/N64_NTSC_11/objects/object_oA10.xml | 66 + .../xml/N64_NTSC_11/objects/object_oA11.xml | 66 + .../xml/N64_NTSC_11/objects/object_oA2.xml | 58 + .../xml/N64_NTSC_11/objects/object_oA3.xml | 11 + .../xml/N64_NTSC_11/objects/object_oA4.xml | 64 + .../xml/N64_NTSC_11/objects/object_oA5.xml | 64 + .../xml/N64_NTSC_11/objects/object_oA6.xml | 64 + .../xml/N64_NTSC_11/objects/object_oA7.xml | 62 + .../xml/N64_NTSC_11/objects/object_oA8.xml | 61 + .../xml/N64_NTSC_11/objects/object_oA9.xml | 7 + .../xml/N64_NTSC_11/objects/object_oB1.xml | 69 + .../xml/N64_NTSC_11/objects/object_oB2.xml | 76 + .../xml/N64_NTSC_11/objects/object_oB3.xml | 70 + .../xml/N64_NTSC_11/objects/object_oB4.xml | 64 + .../xml/N64_NTSC_11/objects/object_oE1.xml | 70 + .../xml/N64_NTSC_11/objects/object_oE10.xml | 15 + .../xml/N64_NTSC_11/objects/object_oE11.xml | 15 + .../xml/N64_NTSC_11/objects/object_oE12.xml | 15 + .../xml/N64_NTSC_11/objects/object_oE1s.xml | 52 + .../xml/N64_NTSC_11/objects/object_oE2.xml | 71 + .../xml/N64_NTSC_11/objects/object_oE3.xml | 73 + .../xml/N64_NTSC_11/objects/object_oE4.xml | 69 + .../xml/N64_NTSC_11/objects/object_oE4s.xml | 48 + .../xml/N64_NTSC_11/objects/object_oE5.xml | 64 + .../xml/N64_NTSC_11/objects/object_oE6.xml | 15 + .../xml/N64_NTSC_11/objects/object_oE7.xml | 14 + .../xml/N64_NTSC_11/objects/object_oE8.xml | 15 + .../xml/N64_NTSC_11/objects/object_oE9.xml | 15 + .../N64_NTSC_11/objects/object_oE_anime.xml | 10 + .../N64_NTSC_11/objects/object_oF1d_map.xml | 54 + .../xml/N64_NTSC_11/objects/object_oF1s.xml | 58 + .../N64_NTSC_11/objects/object_o_anime.xml | 11 + .../xml/N64_NTSC_11/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/N64_NTSC_11/objects/object_os.xml | 36 + .../N64_NTSC_11/objects/object_os_anime.xml | 69 + .../xml/N64_NTSC_11/objects/object_ossan.xml | 23 + .../N64_NTSC_11/objects/object_ouke_haka.xml | 6 + .../xml/N64_NTSC_11/objects/object_owl.xml | 79 + .../xml/N64_NTSC_11/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../N64_NTSC_11/objects/object_po_field.xml | 31 + .../N64_NTSC_11/objects/object_po_sisters.xml | 56 + .../xml/N64_NTSC_11/objects/object_poh.xml | 25 + .../xml/N64_NTSC_11/objects/object_ps.xml | 42 + .../xml/N64_NTSC_11/objects/object_pu_box.xml | 13 + .../xml/N64_NTSC_11/objects/object_rd.xml | 124 + .../xml/N64_NTSC_11/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/N64_NTSC_11/objects/object_rl.xml | 52 + .../xml/N64_NTSC_11/objects/object_rr.xml | 8 + .../xml/N64_NTSC_11/objects/object_rs.xml | 32 + .../xml/N64_NTSC_11/objects/object_ru1.xml | 83 + .../xml/N64_NTSC_11/objects/object_ru2.xml | 92 + .../xml/N64_NTSC_11/objects/object_sa.xml | 100 + .../xml/N64_NTSC_11/objects/object_sb.xml | 30 + .../xml/N64_NTSC_11/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../N64_NTSC_11/objects/object_shopnuts.xml | 67 + .../N64_NTSC_11/objects/object_siofuki.xml | 7 + .../xml/N64_NTSC_11/objects/object_sk2.xml | 130 + .../xml/N64_NTSC_11/objects/object_skb.xml | 64 + .../xml/N64_NTSC_11/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../N64_NTSC_11/objects/object_spot08_obj.xml | 27 + .../N64_NTSC_11/objects/object_spot09_obj.xml | 35 + .../N64_NTSC_11/objects/object_spot11_obj.xml | 9 + .../N64_NTSC_11/objects/object_spot12_obj.xml | 13 + .../N64_NTSC_11/objects/object_spot15_obj.xml | 13 + .../N64_NTSC_11/objects/object_spot16_obj.xml | 11 + .../N64_NTSC_11/objects/object_spot17_obj.xml | 12 + .../N64_NTSC_11/objects/object_spot18_obj.xml | 36 + .../xml/N64_NTSC_11/objects/object_ssh.xml | 61 + .../xml/N64_NTSC_11/objects/object_sst.xml | 71 + .../xml/N64_NTSC_11/objects/object_st.xml | 71 + .../xml/N64_NTSC_11/objects/object_stream.xml | 6 + .../N64_NTSC_11/objects/object_syokudai.xml | 13 + .../xml/N64_NTSC_11/objects/object_ta.xml | 72 + .../N64_NTSC_11/objects/object_timeblock.xml | 7 + .../xml/N64_NTSC_11/objects/object_tite.xml | 55 + .../xml/N64_NTSC_11/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../xml/N64_NTSC_11/objects/object_torch2.xml | 13 + .../xml/N64_NTSC_11/objects/object_toryo.xml | 53 + .../xml/N64_NTSC_11/objects/object_tp.xml | 17 + .../xml/N64_NTSC_11/objects/object_tr.xml | 149 + .../xml/N64_NTSC_11/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/N64_NTSC_11/objects/object_ts.xml | 34 + .../xml/N64_NTSC_11/objects/object_tsubo.xml | 9 + .../xml/N64_NTSC_11/objects/object_tw.xml | 332 + .../N64_NTSC_11/objects/object_umajump.xml | 8 + .../xml/N64_NTSC_11/objects/object_vali.xml | 63 + .../xml/N64_NTSC_11/objects/object_vase.xml | 7 + .../xml/N64_NTSC_11/objects/object_vm.xml | 41 + .../N64_NTSC_11/objects/object_wallmaster.xml | 35 + .../xml/N64_NTSC_11/objects/object_warp1.xml | 39 + .../xml/N64_NTSC_11/objects/object_warp2.xml | 6 + .../xml/N64_NTSC_11/objects/object_wf.xml | 128 + .../xml/N64_NTSC_11/objects/object_wood02.xml | 35 + .../xml/N64_NTSC_11/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../N64_NTSC_11/objects/object_yukabyun.xml | 9 + .../xml/N64_NTSC_11/objects/object_zf.xml | 182 + .../xml/N64_NTSC_11/objects/object_zg.xml | 8 + .../xml/N64_NTSC_11/objects/object_zl1.xml | 115 + .../xml/N64_NTSC_11/objects/object_zl2.xml | 75 + .../N64_NTSC_11/objects/object_zl2_anime1.xml | 30 + .../N64_NTSC_11/objects/object_zl2_anime2.xml | 40 + .../xml/N64_NTSC_11/objects/object_zl4.xml | 91 + .../xml/N64_NTSC_11/objects/object_zo.xml | 88 + .../N64_NTSC_11/overlays/ovl_Arrow_Fire.xml | 11 + .../N64_NTSC_11/overlays/ovl_Arrow_Ice.xml | 11 + .../N64_NTSC_11/overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml | 6 + .../N64_NTSC_11/overlays/ovl_Boss_Ganon.xml | 68 + .../N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml | 76 + .../xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml | 10 + .../xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml | 10 + .../xml/N64_NTSC_11/overlays/ovl_En_Bili.xml | 7 + .../N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../xml/N64_NTSC_11/overlays/ovl_En_Holl.xml | 8 + .../N64_NTSC_11/overlays/ovl_En_Jsjutan.xml | 38 + .../N64_NTSC_11/overlays/ovl_En_Kanban.xml | 8 + .../xml/N64_NTSC_11/overlays/ovl_En_Sda.xml | 9 + .../xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml | 8 + .../xml/N64_NTSC_11/overlays/ovl_En_St.xml | 8 + .../xml/N64_NTSC_11/overlays/ovl_En_Sth.xml | 15 + .../N64_NTSC_11/overlays/ovl_End_Title.xml | 17 + .../N64_NTSC_11/overlays/ovl_File_Choose.xml | 32 + .../N64_NTSC_11/overlays/ovl_Magic_Dark.xml | 12 + .../N64_NTSC_11/overlays/ovl_Magic_Fire.xml | 10 + .../N64_NTSC_11/overlays/ovl_Magic_Wind.xml | 15 + .../N64_NTSC_11/overlays/ovl_Oceff_Spot.xml | 10 + .../N64_NTSC_11/overlays/ovl_Oceff_Storm.xml | 11 + .../N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml | 10 + .../N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml | 11 + .../N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml | 10 + .../N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml | 11 + .../N64_NTSC_11/scenes/dungeons/Bmori1.xml | 231 + .../N64_NTSC_11/scenes/dungeons/FIRE_bs.xml | 34 + .../N64_NTSC_11/scenes/dungeons/HAKAdan.xml | 191 + .../N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml | 69 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml | 288 + .../N64_NTSC_11/scenes/dungeons/MIZUsin.xml | 262 + .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../xml/N64_NTSC_11/scenes/dungeons/bdan.xml | 96 + .../N64_NTSC_11/scenes/dungeons/bdan_boss.xml | 20 + .../xml/N64_NTSC_11/scenes/dungeons/ddan.xml | 220 + .../N64_NTSC_11/scenes/dungeons/ddan_boss.xml | 22 + .../xml/N64_NTSC_11/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../N64_NTSC_11/scenes/dungeons/ganon_tou.xml | 34 + .../N64_NTSC_11/scenes/dungeons/ganontika.xml | 254 + .../scenes/dungeons/ganontikasonogo.xml | 36 + .../N64_NTSC_11/scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 105 + .../scenes/dungeons/jyasinboss.xml | 49 + .../N64_NTSC_11/scenes/dungeons/jyasinzou.xml | 358 + .../xml/N64_NTSC_11/scenes/dungeons/men.xml | 127 + .../scenes/dungeons/moribossroom.xml | 33 + .../xml/N64_NTSC_11/scenes/dungeons/ydan.xml | 157 + .../N64_NTSC_11/scenes/dungeons/ydan_boss.xml | 26 + .../N64_NTSC_11/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/N64_NTSC_11/scenes/indoors/hut.xml | 8 + .../N64_NTSC_11/scenes/indoors/hylia_labo.xml | 39 + .../xml/N64_NTSC_11/scenes/indoors/impa.xml | 8 + .../N64_NTSC_11/scenes/indoors/kakariko.xml | 8 + .../N64_NTSC_11/scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/N64_NTSC_11/scenes/indoors/labo.xml | 8 + .../N64_NTSC_11/scenes/indoors/link_home.xml | 8 + .../N64_NTSC_11/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../N64_NTSC_11/scenes/indoors/miharigoya.xml | 28 + .../N64_NTSC_11/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../N64_NTSC_11/scenes/indoors/takaraya.xml | 53 + .../xml/N64_NTSC_11/scenes/indoors/tent.xml | 8 + .../N64_NTSC_11/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/N64_NTSC_11/scenes/misc/enrui.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/entra_n.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/hakaana.xml | 18 + .../xml/N64_NTSC_11/scenes/misc/hakaana2.xml | 26 + .../N64_NTSC_11/scenes/misc/hakaana_ouke.xml | 37 + .../N64_NTSC_11/scenes/misc/hiral_demo.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/kakariko3.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/kakusiana.xml | 113 + .../xml/N64_NTSC_11/scenes/misc/kinsuta.xml | 23 + .../N64_NTSC_11/scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../N64_NTSC_11/scenes/misc/market_day.xml | 9 + .../N64_NTSC_11/scenes/misc/market_night.xml | 9 + .../N64_NTSC_11/scenes/misc/market_ruins.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/shrine.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/shrine_n.xml | 9 + .../xml/N64_NTSC_11/scenes/misc/shrine_r.xml | 8 + .../xml/N64_NTSC_11/scenes/misc/turibori.xml | 35 + .../N64_NTSC_11/scenes/overworld/entra.xml | 8 + .../N64_NTSC_11/scenes/overworld/souko.xml | 44 + .../N64_NTSC_11/scenes/overworld/spot00.xml | 69 + .../N64_NTSC_11/scenes/overworld/spot01.xml | 51 + .../N64_NTSC_11/scenes/overworld/spot02.xml | 64 + .../N64_NTSC_11/scenes/overworld/spot03.xml | 41 + .../N64_NTSC_11/scenes/overworld/spot04.xml | 81 + .../N64_NTSC_11/scenes/overworld/spot05.xml | 43 + .../N64_NTSC_11/scenes/overworld/spot06.xml | 58 + .../N64_NTSC_11/scenes/overworld/spot07.xml | 47 + .../N64_NTSC_11/scenes/overworld/spot08.xml | 36 + .../N64_NTSC_11/scenes/overworld/spot09.xml | 37 + .../N64_NTSC_11/scenes/overworld/spot10.xml | 71 + .../N64_NTSC_11/scenes/overworld/spot11.xml | 41 + .../N64_NTSC_11/scenes/overworld/spot12.xml | 52 + .../N64_NTSC_11/scenes/overworld/spot13.xml | 39 + .../N64_NTSC_11/scenes/overworld/spot15.xml | 52 + .../N64_NTSC_11/scenes/overworld/spot16.xml | 50 + .../N64_NTSC_11/scenes/overworld/spot17.xml | 54 + .../N64_NTSC_11/scenes/overworld/spot18.xml | 105 + .../N64_NTSC_11/scenes/overworld/spot20.xml | 36 + .../N64_NTSC_11/scenes/shops/alley_shop.xml | 8 + .../xml/N64_NTSC_11/scenes/shops/drag.xml | 8 + .../N64_NTSC_11/scenes/shops/face_shop.xml | 8 + .../xml/N64_NTSC_11/scenes/shops/golon.xml | 8 + .../N64_NTSC_11/scenes/shops/kokiri_shop.xml | 8 + .../N64_NTSC_11/scenes/shops/night_shop.xml | 8 + .../xml/N64_NTSC_11/scenes/shops/shop1.xml | 8 + .../xml/N64_NTSC_11/scenes/shops/zoora.xml | 8 + .../N64_NTSC_11/text/elf_message_field.xml | 5 + .../xml/N64_NTSC_11/text/elf_message_ydan.xml | 5 + .../N64_NTSC_11/text/message_data_static.xml | 11 + .../xml/N64_NTSC_11/textures/backgrounds.xml | 246 + .../N64_NTSC_11/textures/boss_title_cards.xml | 42 + .../N64_NTSC_11/textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../N64_NTSC_11/textures/icon_item_static.xml | 188 + .../N64_NTSC_11/textures/item_name_static.xml | 250 + soh/assets/xml/N64_NTSC_11/textures/kanji.xml | 3984 ++++++ .../N64_NTSC_11/textures/map_48x85_static.xml | 72 + .../N64_NTSC_11/textures/map_grand_static.xml | 28 + .../xml/N64_NTSC_11/textures/map_i_static.xml | 243 + .../N64_NTSC_11/textures/map_name_static.xml | 72 + .../N64_NTSC_11/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../N64_NTSC_11/textures/nes_font_static.xml | 144 + .../textures/nintendo_rogo_static.xml | 9 + .../N64_NTSC_11/textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/N64_NTSC_11/textures/skyboxes.xml | 113 + .../xml/N64_NTSC_11/textures/title_static.xml | 169 + soh/assets/xml/N64_NTSC_12/audio/Audio.xml | 1558 ++ .../xml/N64_NTSC_12/code/fbdemo_circle.xml | 13 + .../xml/N64_NTSC_12/code/fbdemo_triforce.xml | 8 + .../xml/N64_NTSC_12/code/fbdemo_wipe1.xml | 10 + .../xml/N64_NTSC_12/code/sys_matrix.xml | 5 + .../xml/N64_NTSC_12/misc/link_animetion.xml | 577 + .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../xml/N64_NTSC_12/objects/gameplay_keep.xml | 1011 ++ .../xml/N64_NTSC_12/objects/object_Bb.xml | 37 + .../xml/N64_NTSC_12/objects/object_ahg.xml | 61 + .../xml/N64_NTSC_12/objects/object_am.xml | 22 + .../xml/N64_NTSC_12/objects/object_ane.xml | 59 + .../xml/N64_NTSC_12/objects/object_ani.xml | 67 + .../N64_NTSC_12/objects/object_anubice.xml | 29 + .../xml/N64_NTSC_12/objects/object_aob.xml | 59 + .../N64_NTSC_12/objects/object_b_heart.xml | 8 + .../xml/N64_NTSC_12/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../xml/N64_NTSC_12/objects/object_bdoor.xml | 15 + .../xml/N64_NTSC_12/objects/object_bg.xml | 50 + .../N64_NTSC_12/objects/object_bigokuta.xml | 58 + .../xml/N64_NTSC_12/objects/object_bird.xml | 30 + .../xml/N64_NTSC_12/objects/object_bji.xml | 56 + .../xml/N64_NTSC_12/objects/object_bl.xml | 32 + .../xml/N64_NTSC_12/objects/object_blkobj.xml | 37 + .../xml/N64_NTSC_12/objects/object_bob.xml | 47 + .../xml/N64_NTSC_12/objects/object_boj.xml | 65 + .../xml/N64_NTSC_12/objects/object_bombf.xml | 14 + .../N64_NTSC_12/objects/object_bombiwa.xml | 7 + .../xml/N64_NTSC_12/objects/object_bowl.xml | 18 + .../xml/N64_NTSC_12/objects/object_box.xml | 30 + .../xml/N64_NTSC_12/objects/object_brob.xml | 25 + .../xml/N64_NTSC_12/objects/object_bubble.xml | 6 + .../xml/N64_NTSC_12/objects/object_bv.xml | 116 + .../xml/N64_NTSC_12/objects/object_bw.xml | 29 + .../xml/N64_NTSC_12/objects/object_bwall.xml | 7 + .../xml/N64_NTSC_12/objects/object_bxa.xml | 13 + .../xml/N64_NTSC_12/objects/object_cne.xml | 53 + .../xml/N64_NTSC_12/objects/object_cob.xml | 41 + .../xml/N64_NTSC_12/objects/object_cow.xml | 55 + .../xml/N64_NTSC_12/objects/object_crow.xml | 11 + .../xml/N64_NTSC_12/objects/object_cs.xml | 60 + .../N64_NTSC_12/objects/object_d_elevator.xml | 7 + .../N64_NTSC_12/objects/object_d_hsblock.xml | 10 + .../xml/N64_NTSC_12/objects/object_d_lift.xml | 8 + .../xml/N64_NTSC_12/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../N64_NTSC_12/objects/object_dekubaba.xml | 38 + .../xml/N64_NTSC_12/objects/object_dekujr.xml | 13 + .../N64_NTSC_12/objects/object_dekunuts.xml | 32 + .../N64_NTSC_12/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/N64_NTSC_12/objects/object_dh.xml | 59 + .../xml/N64_NTSC_12/objects/object_dnk.xml | 35 + .../xml/N64_NTSC_12/objects/object_dns.xml | 40 + .../xml/N64_NTSC_12/objects/object_dodojr.xml | 33 + .../N64_NTSC_12/objects/object_dodongo.xml | 41 + .../xml/N64_NTSC_12/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/N64_NTSC_12/objects/object_ds.xml | 38 + .../xml/N64_NTSC_12/objects/object_ds2.xml | 34 + .../xml/N64_NTSC_12/objects/object_du.xml | 81 + .../xml/N64_NTSC_12/objects/object_dy_obj.xml | 121 + .../xml/N64_NTSC_12/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../N64_NTSC_12/objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../N64_NTSC_12/objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../xml/N64_NTSC_12/objects/object_efc_tw.xml | 13 + .../xml/N64_NTSC_12/objects/object_ei.xml | 56 + .../xml/N64_NTSC_12/objects/object_fa.xml | 15 + .../xml/N64_NTSC_12/objects/object_fd.xml | 103 + .../xml/N64_NTSC_12/objects/object_fd2.xml | 52 + .../xml/N64_NTSC_12/objects/object_fhg.xml | 54 + .../xml/N64_NTSC_12/objects/object_fire.xml | 14 + .../N64_NTSC_12/objects/object_firefly.xml | 21 + .../xml/N64_NTSC_12/objects/object_fish.xml | 180 + .../xml/N64_NTSC_12/objects/object_fr.xml | 65 + .../xml/N64_NTSC_12/objects/object_fu.xml | 55 + .../xml/N64_NTSC_12/objects/object_fw.xml | 106 + .../xml/N64_NTSC_12/objects/object_fz.xml | 12 + .../xml/N64_NTSC_12/objects/object_ganon.xml | 106 + .../xml/N64_NTSC_12/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/N64_NTSC_12/objects/object_ge1.xml | 78 + .../xml/N64_NTSC_12/objects/object_geff.xml | 7 + .../xml/N64_NTSC_12/objects/object_geldb.xml | 44 + .../N64_NTSC_12/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../N64_NTSC_12/objects/object_gi_bean.xml | 5 + .../N64_NTSC_12/objects/object_gi_bomb_1.xml | 5 + .../N64_NTSC_12/objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../N64_NTSC_12/objects/object_gi_boots_2.xml | 7 + .../N64_NTSC_12/objects/object_gi_bosskey.xml | 6 + .../N64_NTSC_12/objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../xml/N64_NTSC_12/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../N64_NTSC_12/objects/object_gi_clothes.xml | 11 + .../N64_NTSC_12/objects/object_gi_coin.xml | 10 + .../N64_NTSC_12/objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../xml/N64_NTSC_12/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../N64_NTSC_12/objects/object_gi_fire.xml | 8 + .../N64_NTSC_12/objects/object_gi_fish.xml | 5 + .../N64_NTSC_12/objects/object_gi_frog.xml | 7 + .../N64_NTSC_12/objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../N64_NTSC_12/objects/object_gi_ghost.xml | 11 + .../N64_NTSC_12/objects/object_gi_glasses.xml | 6 + .../N64_NTSC_12/objects/object_gi_gloves.xml | 11 + .../N64_NTSC_12/objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../N64_NTSC_12/objects/object_gi_grass.xml | 5 + .../N64_NTSC_12/objects/object_gi_hammer.xml | 5 + .../N64_NTSC_12/objects/object_gi_heart.xml | 5 + .../N64_NTSC_12/objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../N64_NTSC_12/objects/object_gi_insect.xml | 6 + .../N64_NTSC_12/objects/object_gi_jewel.xml | 15 + .../xml/N64_NTSC_12/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../N64_NTSC_12/objects/object_gi_letter.xml | 8 + .../N64_NTSC_12/objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../N64_NTSC_12/objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../xml/N64_NTSC_12/objects/object_gi_map.xml | 7 + .../N64_NTSC_12/objects/object_gi_medal.xml | 11 + .../N64_NTSC_12/objects/object_gi_melody.xml | 11 + .../N64_NTSC_12/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../N64_NTSC_12/objects/object_gi_nuts.xml | 6 + .../N64_NTSC_12/objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../N64_NTSC_12/objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../N64_NTSC_12/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../N64_NTSC_12/objects/object_gi_rupy.xml | 16 + .../xml/N64_NTSC_12/objects/object_gi_saw.xml | 5 + .../N64_NTSC_12/objects/object_gi_scale.xml | 10 + .../N64_NTSC_12/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../N64_NTSC_12/objects/object_gi_soldout.xml | 6 + .../N64_NTSC_12/objects/object_gi_soul.xml | 8 + .../N64_NTSC_12/objects/object_gi_stick.xml | 5 + .../N64_NTSC_12/objects/object_gi_sutaru.xml | 6 + .../N64_NTSC_12/objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/N64_NTSC_12/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/N64_NTSC_12/objects/object_gla.xml | 85 + .../xml/N64_NTSC_12/objects/object_gm.xml | 5 + .../xml/N64_NTSC_12/objects/object_gnd.xml | 87 + .../N64_NTSC_12/objects/object_gnd_magic.xml | 7 + .../xml/N64_NTSC_12/objects/object_gndd.xml | 106 + .../N64_NTSC_12/objects/object_god_lgt.xml | 9 + .../xml/N64_NTSC_12/objects/object_gol.xml | 59 + .../xml/N64_NTSC_12/objects/object_goma.xml | 169 + .../N64_NTSC_12/objects/object_goroiwa.xml | 6 + .../xml/N64_NTSC_12/objects/object_gr.xml | 27 + .../xml/N64_NTSC_12/objects/object_gs.xml | 8 + .../xml/N64_NTSC_12/objects/object_gt.xml | 38 + .../xml/N64_NTSC_12/objects/object_haka.xml | 10 + .../N64_NTSC_12/objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/N64_NTSC_12/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../N64_NTSC_12/objects/object_hintnuts.xml | 29 + .../xml/N64_NTSC_12/objects/object_hni.xml | 51 + .../xml/N64_NTSC_12/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/N64_NTSC_12/objects/object_hs.xml | 47 + .../xml/N64_NTSC_12/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/N64_NTSC_12/objects/object_ik.xml | 108 + .../xml/N64_NTSC_12/objects/object_im.xml | 79 + .../xml/N64_NTSC_12/objects/object_in.xml | 142 + .../xml/N64_NTSC_12/objects/object_ingate.xml | 7 + .../xml/N64_NTSC_12/objects/object_jj.xml | 77 + .../xml/N64_NTSC_12/objects/object_js.xml | 55 + .../N64_NTSC_12/objects/object_jya_door.xml | 8 + .../N64_NTSC_12/objects/object_jya_iron.xml | 13 + .../N64_NTSC_12/objects/object_jya_obj.xml | 87 + .../xml/N64_NTSC_12/objects/object_ka.xml | 64 + .../xml/N64_NTSC_12/objects/object_kanban.xml | 18 + .../N64_NTSC_12/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/N64_NTSC_12/objects/object_km1.xml | 39 + .../xml/N64_NTSC_12/objects/object_kusa.xml | 6 + .../xml/N64_NTSC_12/objects/object_kw1.xml | 63 + .../xml/N64_NTSC_12/objects/object_kz.xml | 45 + .../N64_NTSC_12/objects/object_light_ring.xml | 6 + .../N64_NTSC_12/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../N64_NTSC_12/objects/object_link_boy.xml | 282 + .../N64_NTSC_12/objects/object_link_child.xml | 225 + .../xml/N64_NTSC_12/objects/object_ma1.xml | 67 + .../xml/N64_NTSC_12/objects/object_ma2.xml | 75 + .../xml/N64_NTSC_12/objects/object_mag.xml | 20 + .../N64_NTSC_12/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/N64_NTSC_12/objects/object_mb.xml | 73 + .../xml/N64_NTSC_12/objects/object_md.xml | 87 + .../xml/N64_NTSC_12/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../N64_NTSC_12/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/N64_NTSC_12/objects/object_mjin.xml | 8 + .../N64_NTSC_12/objects/object_mjin_dark.xml | 5 + .../N64_NTSC_12/objects/object_mjin_flame.xml | 5 + .../N64_NTSC_12/objects/object_mjin_flash.xml | 5 + .../N64_NTSC_12/objects/object_mjin_ice.xml | 5 + .../N64_NTSC_12/objects/object_mjin_oka.xml | 8 + .../N64_NTSC_12/objects/object_mjin_soul.xml | 5 + .../N64_NTSC_12/objects/object_mjin_wind.xml | 5 + .../xml/N64_NTSC_12/objects/object_mk.xml | 44 + .../xml/N64_NTSC_12/objects/object_mm.xml | 25 + .../xml/N64_NTSC_12/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../N64_NTSC_12/objects/object_mori_tex.xml | 29 + .../xml/N64_NTSC_12/objects/object_ms.xml | 43 + .../xml/N64_NTSC_12/objects/object_mu.xml | 96 + .../xml/N64_NTSC_12/objects/object_nb.xml | 118 + .../xml/N64_NTSC_12/objects/object_niw.xml | 49 + .../xml/N64_NTSC_12/objects/object_nwc.xml | 15 + .../xml/N64_NTSC_12/objects/object_ny.xml | 10 + .../xml/N64_NTSC_12/objects/object_oA1.xml | 69 + .../xml/N64_NTSC_12/objects/object_oA10.xml | 66 + .../xml/N64_NTSC_12/objects/object_oA11.xml | 66 + .../xml/N64_NTSC_12/objects/object_oA2.xml | 58 + .../xml/N64_NTSC_12/objects/object_oA3.xml | 11 + .../xml/N64_NTSC_12/objects/object_oA4.xml | 64 + .../xml/N64_NTSC_12/objects/object_oA5.xml | 64 + .../xml/N64_NTSC_12/objects/object_oA6.xml | 64 + .../xml/N64_NTSC_12/objects/object_oA7.xml | 62 + .../xml/N64_NTSC_12/objects/object_oA8.xml | 61 + .../xml/N64_NTSC_12/objects/object_oA9.xml | 7 + .../xml/N64_NTSC_12/objects/object_oB1.xml | 69 + .../xml/N64_NTSC_12/objects/object_oB2.xml | 76 + .../xml/N64_NTSC_12/objects/object_oB3.xml | 70 + .../xml/N64_NTSC_12/objects/object_oB4.xml | 64 + .../xml/N64_NTSC_12/objects/object_oE1.xml | 70 + .../xml/N64_NTSC_12/objects/object_oE10.xml | 15 + .../xml/N64_NTSC_12/objects/object_oE11.xml | 15 + .../xml/N64_NTSC_12/objects/object_oE12.xml | 15 + .../xml/N64_NTSC_12/objects/object_oE1s.xml | 52 + .../xml/N64_NTSC_12/objects/object_oE2.xml | 71 + .../xml/N64_NTSC_12/objects/object_oE3.xml | 73 + .../xml/N64_NTSC_12/objects/object_oE4.xml | 69 + .../xml/N64_NTSC_12/objects/object_oE4s.xml | 48 + .../xml/N64_NTSC_12/objects/object_oE5.xml | 64 + .../xml/N64_NTSC_12/objects/object_oE6.xml | 15 + .../xml/N64_NTSC_12/objects/object_oE7.xml | 14 + .../xml/N64_NTSC_12/objects/object_oE8.xml | 15 + .../xml/N64_NTSC_12/objects/object_oE9.xml | 15 + .../N64_NTSC_12/objects/object_oE_anime.xml | 10 + .../N64_NTSC_12/objects/object_oF1d_map.xml | 54 + .../xml/N64_NTSC_12/objects/object_oF1s.xml | 58 + .../N64_NTSC_12/objects/object_o_anime.xml | 11 + .../xml/N64_NTSC_12/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/N64_NTSC_12/objects/object_os.xml | 36 + .../N64_NTSC_12/objects/object_os_anime.xml | 69 + .../xml/N64_NTSC_12/objects/object_ossan.xml | 23 + .../N64_NTSC_12/objects/object_ouke_haka.xml | 6 + .../xml/N64_NTSC_12/objects/object_owl.xml | 79 + .../xml/N64_NTSC_12/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../N64_NTSC_12/objects/object_po_field.xml | 31 + .../N64_NTSC_12/objects/object_po_sisters.xml | 56 + .../xml/N64_NTSC_12/objects/object_poh.xml | 25 + .../xml/N64_NTSC_12/objects/object_ps.xml | 42 + .../xml/N64_NTSC_12/objects/object_pu_box.xml | 13 + .../xml/N64_NTSC_12/objects/object_rd.xml | 124 + .../xml/N64_NTSC_12/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/N64_NTSC_12/objects/object_rl.xml | 52 + .../xml/N64_NTSC_12/objects/object_rr.xml | 8 + .../xml/N64_NTSC_12/objects/object_rs.xml | 32 + .../xml/N64_NTSC_12/objects/object_ru1.xml | 83 + .../xml/N64_NTSC_12/objects/object_ru2.xml | 92 + .../xml/N64_NTSC_12/objects/object_sa.xml | 100 + .../xml/N64_NTSC_12/objects/object_sb.xml | 30 + .../xml/N64_NTSC_12/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../N64_NTSC_12/objects/object_shopnuts.xml | 67 + .../N64_NTSC_12/objects/object_siofuki.xml | 7 + .../xml/N64_NTSC_12/objects/object_sk2.xml | 130 + .../xml/N64_NTSC_12/objects/object_skb.xml | 64 + .../xml/N64_NTSC_12/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../N64_NTSC_12/objects/object_spot08_obj.xml | 27 + .../N64_NTSC_12/objects/object_spot09_obj.xml | 35 + .../N64_NTSC_12/objects/object_spot11_obj.xml | 9 + .../N64_NTSC_12/objects/object_spot12_obj.xml | 13 + .../N64_NTSC_12/objects/object_spot15_obj.xml | 13 + .../N64_NTSC_12/objects/object_spot16_obj.xml | 11 + .../N64_NTSC_12/objects/object_spot17_obj.xml | 12 + .../N64_NTSC_12/objects/object_spot18_obj.xml | 36 + .../xml/N64_NTSC_12/objects/object_ssh.xml | 61 + .../xml/N64_NTSC_12/objects/object_sst.xml | 71 + .../xml/N64_NTSC_12/objects/object_st.xml | 71 + .../xml/N64_NTSC_12/objects/object_stream.xml | 6 + .../N64_NTSC_12/objects/object_syokudai.xml | 13 + .../xml/N64_NTSC_12/objects/object_ta.xml | 72 + .../N64_NTSC_12/objects/object_timeblock.xml | 7 + .../xml/N64_NTSC_12/objects/object_tite.xml | 55 + .../xml/N64_NTSC_12/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../xml/N64_NTSC_12/objects/object_torch2.xml | 13 + .../xml/N64_NTSC_12/objects/object_toryo.xml | 53 + .../xml/N64_NTSC_12/objects/object_tp.xml | 17 + .../xml/N64_NTSC_12/objects/object_tr.xml | 149 + .../xml/N64_NTSC_12/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/N64_NTSC_12/objects/object_ts.xml | 34 + .../xml/N64_NTSC_12/objects/object_tsubo.xml | 9 + .../xml/N64_NTSC_12/objects/object_tw.xml | 332 + .../N64_NTSC_12/objects/object_umajump.xml | 8 + .../xml/N64_NTSC_12/objects/object_vali.xml | 63 + .../xml/N64_NTSC_12/objects/object_vase.xml | 7 + .../xml/N64_NTSC_12/objects/object_vm.xml | 41 + .../N64_NTSC_12/objects/object_wallmaster.xml | 35 + .../xml/N64_NTSC_12/objects/object_warp1.xml | 39 + .../xml/N64_NTSC_12/objects/object_warp2.xml | 6 + .../xml/N64_NTSC_12/objects/object_wf.xml | 128 + .../xml/N64_NTSC_12/objects/object_wood02.xml | 35 + .../xml/N64_NTSC_12/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../N64_NTSC_12/objects/object_yukabyun.xml | 9 + .../xml/N64_NTSC_12/objects/object_zf.xml | 182 + .../xml/N64_NTSC_12/objects/object_zg.xml | 8 + .../xml/N64_NTSC_12/objects/object_zl1.xml | 115 + .../xml/N64_NTSC_12/objects/object_zl2.xml | 75 + .../N64_NTSC_12/objects/object_zl2_anime1.xml | 30 + .../N64_NTSC_12/objects/object_zl2_anime2.xml | 40 + .../xml/N64_NTSC_12/objects/object_zl4.xml | 91 + .../xml/N64_NTSC_12/objects/object_zo.xml | 88 + .../N64_NTSC_12/overlays/ovl_Arrow_Fire.xml | 11 + .../N64_NTSC_12/overlays/ovl_Arrow_Ice.xml | 11 + .../N64_NTSC_12/overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml | 6 + .../N64_NTSC_12/overlays/ovl_Boss_Ganon.xml | 68 + .../N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml | 76 + .../xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml | 10 + .../xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml | 10 + .../xml/N64_NTSC_12/overlays/ovl_En_Bili.xml | 7 + .../N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../xml/N64_NTSC_12/overlays/ovl_En_Holl.xml | 8 + .../N64_NTSC_12/overlays/ovl_En_Jsjutan.xml | 38 + .../N64_NTSC_12/overlays/ovl_En_Kanban.xml | 8 + .../xml/N64_NTSC_12/overlays/ovl_En_Sda.xml | 9 + .../xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml | 8 + .../xml/N64_NTSC_12/overlays/ovl_En_St.xml | 8 + .../xml/N64_NTSC_12/overlays/ovl_En_Sth.xml | 15 + .../N64_NTSC_12/overlays/ovl_End_Title.xml | 17 + .../N64_NTSC_12/overlays/ovl_File_Choose.xml | 32 + .../N64_NTSC_12/overlays/ovl_Magic_Dark.xml | 12 + .../N64_NTSC_12/overlays/ovl_Magic_Fire.xml | 10 + .../N64_NTSC_12/overlays/ovl_Magic_Wind.xml | 15 + .../N64_NTSC_12/overlays/ovl_Oceff_Spot.xml | 10 + .../N64_NTSC_12/overlays/ovl_Oceff_Storm.xml | 11 + .../N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml | 10 + .../N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml | 11 + .../N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml | 10 + .../N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml | 11 + .../N64_NTSC_12/scenes/dungeons/Bmori1.xml | 231 + .../N64_NTSC_12/scenes/dungeons/FIRE_bs.xml | 34 + .../N64_NTSC_12/scenes/dungeons/HAKAdan.xml | 191 + .../N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml | 69 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml | 288 + .../N64_NTSC_12/scenes/dungeons/MIZUsin.xml | 262 + .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../xml/N64_NTSC_12/scenes/dungeons/bdan.xml | 96 + .../N64_NTSC_12/scenes/dungeons/bdan_boss.xml | 20 + .../xml/N64_NTSC_12/scenes/dungeons/ddan.xml | 220 + .../N64_NTSC_12/scenes/dungeons/ddan_boss.xml | 22 + .../xml/N64_NTSC_12/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../N64_NTSC_12/scenes/dungeons/ganon_tou.xml | 34 + .../N64_NTSC_12/scenes/dungeons/ganontika.xml | 254 + .../scenes/dungeons/ganontikasonogo.xml | 36 + .../N64_NTSC_12/scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 105 + .../scenes/dungeons/jyasinboss.xml | 49 + .../N64_NTSC_12/scenes/dungeons/jyasinzou.xml | 358 + .../xml/N64_NTSC_12/scenes/dungeons/men.xml | 127 + .../scenes/dungeons/moribossroom.xml | 33 + .../xml/N64_NTSC_12/scenes/dungeons/ydan.xml | 157 + .../N64_NTSC_12/scenes/dungeons/ydan_boss.xml | 26 + .../N64_NTSC_12/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/N64_NTSC_12/scenes/indoors/hut.xml | 8 + .../N64_NTSC_12/scenes/indoors/hylia_labo.xml | 39 + .../xml/N64_NTSC_12/scenes/indoors/impa.xml | 8 + .../N64_NTSC_12/scenes/indoors/kakariko.xml | 8 + .../N64_NTSC_12/scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/N64_NTSC_12/scenes/indoors/labo.xml | 8 + .../N64_NTSC_12/scenes/indoors/link_home.xml | 8 + .../N64_NTSC_12/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../N64_NTSC_12/scenes/indoors/miharigoya.xml | 28 + .../N64_NTSC_12/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../N64_NTSC_12/scenes/indoors/takaraya.xml | 53 + .../xml/N64_NTSC_12/scenes/indoors/tent.xml | 8 + .../N64_NTSC_12/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/N64_NTSC_12/scenes/misc/enrui.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/entra_n.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/hakaana.xml | 18 + .../xml/N64_NTSC_12/scenes/misc/hakaana2.xml | 26 + .../N64_NTSC_12/scenes/misc/hakaana_ouke.xml | 37 + .../N64_NTSC_12/scenes/misc/hiral_demo.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/kakariko3.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/kakusiana.xml | 113 + .../xml/N64_NTSC_12/scenes/misc/kinsuta.xml | 23 + .../N64_NTSC_12/scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../N64_NTSC_12/scenes/misc/market_day.xml | 9 + .../N64_NTSC_12/scenes/misc/market_night.xml | 9 + .../N64_NTSC_12/scenes/misc/market_ruins.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/shrine.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/shrine_n.xml | 9 + .../xml/N64_NTSC_12/scenes/misc/shrine_r.xml | 8 + .../xml/N64_NTSC_12/scenes/misc/turibori.xml | 35 + .../N64_NTSC_12/scenes/overworld/entra.xml | 8 + .../N64_NTSC_12/scenes/overworld/souko.xml | 44 + .../N64_NTSC_12/scenes/overworld/spot00.xml | 69 + .../N64_NTSC_12/scenes/overworld/spot01.xml | 51 + .../N64_NTSC_12/scenes/overworld/spot02.xml | 64 + .../N64_NTSC_12/scenes/overworld/spot03.xml | 41 + .../N64_NTSC_12/scenes/overworld/spot04.xml | 81 + .../N64_NTSC_12/scenes/overworld/spot05.xml | 43 + .../N64_NTSC_12/scenes/overworld/spot06.xml | 58 + .../N64_NTSC_12/scenes/overworld/spot07.xml | 47 + .../N64_NTSC_12/scenes/overworld/spot08.xml | 36 + .../N64_NTSC_12/scenes/overworld/spot09.xml | 37 + .../N64_NTSC_12/scenes/overworld/spot10.xml | 71 + .../N64_NTSC_12/scenes/overworld/spot11.xml | 41 + .../N64_NTSC_12/scenes/overworld/spot12.xml | 52 + .../N64_NTSC_12/scenes/overworld/spot13.xml | 39 + .../N64_NTSC_12/scenes/overworld/spot15.xml | 52 + .../N64_NTSC_12/scenes/overworld/spot16.xml | 50 + .../N64_NTSC_12/scenes/overworld/spot17.xml | 54 + .../N64_NTSC_12/scenes/overworld/spot18.xml | 105 + .../N64_NTSC_12/scenes/overworld/spot20.xml | 36 + .../N64_NTSC_12/scenes/shops/alley_shop.xml | 8 + .../xml/N64_NTSC_12/scenes/shops/drag.xml | 8 + .../N64_NTSC_12/scenes/shops/face_shop.xml | 8 + .../xml/N64_NTSC_12/scenes/shops/golon.xml | 8 + .../N64_NTSC_12/scenes/shops/kokiri_shop.xml | 8 + .../N64_NTSC_12/scenes/shops/night_shop.xml | 8 + .../xml/N64_NTSC_12/scenes/shops/shop1.xml | 8 + .../xml/N64_NTSC_12/scenes/shops/zoora.xml | 8 + .../N64_NTSC_12/text/elf_message_field.xml | 5 + .../xml/N64_NTSC_12/text/elf_message_ydan.xml | 5 + .../N64_NTSC_12/text/message_data_static.xml | 11 + .../xml/N64_NTSC_12/textures/backgrounds.xml | 246 + .../N64_NTSC_12/textures/boss_title_cards.xml | 42 + .../N64_NTSC_12/textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../N64_NTSC_12/textures/icon_item_static.xml | 188 + .../N64_NTSC_12/textures/item_name_static.xml | 250 + soh/assets/xml/N64_NTSC_12/textures/kanji.xml | 3984 ++++++ .../N64_NTSC_12/textures/map_48x85_static.xml | 72 + .../N64_NTSC_12/textures/map_grand_static.xml | 28 + .../xml/N64_NTSC_12/textures/map_i_static.xml | 243 + .../N64_NTSC_12/textures/map_name_static.xml | 72 + .../N64_NTSC_12/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../N64_NTSC_12/textures/nes_font_static.xml | 144 + .../textures/nintendo_rogo_static.xml | 9 + .../N64_NTSC_12/textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/N64_NTSC_12/textures/skyboxes.xml | 113 + .../xml/N64_NTSC_12/textures/title_static.xml | 169 + soh/assets/xml/N64_PAL_10/code/sys_matrix.xml | 2 +- soh/assets/xml/N64_PAL_11/code/sys_matrix.xml | 2 +- soh/include/functions.h | 5 + soh/include/message_data_fmt.h | 34 + soh/include/z64.h | 10 +- soh/include/z64save.h | 13 +- .../Enhancements/TimeDisplay/TimeDisplay.cpp | 12 +- .../custom-message/CustomMessageManager.cpp | 4 +- .../Enhancements/debugger/MessageViewer.cpp | 12 +- .../Enhancements/debugger/debugSaveEditor.cpp | 8 +- .../randomizer/randomizer_check_tracker.cpp | 4 +- soh/soh/Enhancements/tts/tts.cpp | 13 +- soh/soh/Extractor/Extract.cpp | 23 +- soh/soh/ResourceManagerHelpers.cpp | 5 + soh/soh/ResourceManagerHelpers.h | 1 + soh/soh/SaveManager.cpp | 57 +- soh/soh/SaveManager.h | 9 +- soh/soh/SohGui/SohMenu.h | 1 + soh/soh/SohGui/SohMenuEnhancements.cpp | 4 +- soh/soh/SohGui/SohMenuSettings.cpp | 36 +- soh/soh/z_message_OTR.cpp | 46 +- soh/src/code/game.c | 14 + soh/src/code/z_actor.c | 9 + soh/src/code/z_construct.c | 25 +- soh/src/code/z_demo.c | 4 +- soh/src/code/z_game_over.c | 6 +- soh/src/code/z_kanfont.c | 4030 +++++- soh/src/code/z_kanji.c | 127 + soh/src/code/z_message_PAL.c | 1332 +- soh/src/code/z_parameter.c | 225 +- soh/src/code/z_sram.c | 6 + .../actors/ovl_Bg_Po_Event/z_bg_po_event.c | 8 +- .../ovl_Bg_Relay_Objects/z_bg_relay_objects.c | 2 +- .../ovl_En_Diving_Game/z_en_diving_game.c | 10 +- soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c | 2 +- soh/src/overlays/actors/ovl_En_Eg/z_en_eg.c | 2 +- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 2 +- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 2 +- .../z_en_horse_game_check.c | 16 +- soh/src/overlays/actors/ovl_En_In/z_en_in.c | 8 +- soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c | 22 +- soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c | 829 +- soh/src/overlays/actors/ovl_En_Mag/z_en_mag.h | 3 - soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 2 +- soh/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c | 12 +- soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c | 31 +- .../actors/ovl_En_Po_Relay/z_en_po_relay.c | 20 +- .../ovl_En_Syateki_Niw/z_en_syateki_niw.c | 2 +- soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 10 +- soh/src/overlays/actors/ovl_En_Zl2/z_en_zl2.c | 2 +- soh/src/overlays/actors/ovl_En_Zl3/z_en_zl3.c | 6 +- .../ovl_Obj_Roomtimer/z_obj_roomtimer.c | 8 +- .../actors/ovl_player_actor/z_player.c | 2 +- .../gamestates/ovl_file_choose/file_choose.h | 33 + .../ovl_file_choose/z_file_choose.c | 163 +- .../ovl_file_choose/z_file_nameset_NES.c | 1246 ++ .../ovl_file_choose/z_file_nameset_PAL.c | 10 +- .../ovl_file_choose/z_file_nameset_data.c | 48 + .../overlays/gamestates/ovl_select/z_select.c | 35 +- .../ovl_kaleido_scope/z_kaleido_map_PAL.c | 6 + .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 497 +- 1736 files changed, 107334 insertions(+), 1129 deletions(-) create mode 100644 soh/assets/custom/textures/title_static/gFileSelBossRushSettingsJPNTex.ia8.png create mode 100644 soh/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestJPNTex.ia8.png create mode 100644 soh/assets/extractor/Config_N64_NTSC_10.xml create mode 100644 soh/assets/extractor/Config_N64_NTSC_11.xml create mode 100644 soh/assets/extractor/Config_N64_NTSC_12.xml create mode 100644 soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h create mode 100644 soh/assets/textures/kanji/kanji.h create mode 100644 soh/assets/xml/N64_NTSC_10/audio/Audio.xml create mode 100644 soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml create mode 100644 soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_am.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ane.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ani.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_aob.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bba.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bg.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bird.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bji.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bl.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bob.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_boj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_box.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_brob.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bv.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bw.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_cne.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_cob.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_cow.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_crow.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_cs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dh.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dns.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dog.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ds.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_du.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ec.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ei.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fd.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fire.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fish.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fr.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fu.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fw.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_fz.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_geff.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gla.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gm.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gol.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_goma.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gr.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_gt.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_haka.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_hata.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_hni.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_horse.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_hs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_human.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ik.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_im.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_in.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_jj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_js.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ka.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_km1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_kz.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mag.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mb.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_md.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_medal.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mk.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mm.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ms.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_mu.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_nb.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_niw.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ny.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_os.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_owl.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_poh.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ps.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_rd.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_rl.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_rr.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_rs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_sa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_sb.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_sd.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_skb.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_skj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_sst.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_st.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_stream.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ta.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_tite.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_tk.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_tp.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_tr.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_trap.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ts.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_tw.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_vali.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_vase.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_vm.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_wf.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_xc.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zf.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zg.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml create mode 100644 soh/assets/xml/N64_NTSC_10/objects/object_zo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml create mode 100644 soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/N64_NTSC_10/text/message_data_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/kanji.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/message_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml create mode 100644 soh/assets/xml/N64_NTSC_10/textures/title_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/audio/Audio.xml create mode 100644 soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml create mode 100644 soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_am.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ane.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ani.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_aob.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bba.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bg.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bird.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bji.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bl.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bob.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_boj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_box.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_brob.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bv.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bw.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_cne.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_cob.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_cow.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_crow.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_cs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dh.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dns.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dog.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ds.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_du.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ec.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ei.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fd.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fire.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fish.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fr.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fu.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fw.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_fz.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_geff.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gla.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gm.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gol.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_goma.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gr.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_gt.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_haka.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_hata.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_hni.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_horse.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_hs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_human.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ik.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_im.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_in.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_jj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_js.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ka.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_km1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_kz.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mag.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mb.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_md.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_medal.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mk.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mm.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ms.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_mu.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_nb.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_niw.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ny.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_os.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_owl.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_poh.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ps.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_rd.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_rl.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_rr.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_rs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_sa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_sb.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_sd.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_skb.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_skj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_sst.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_st.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_stream.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ta.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_tite.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_tk.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_tp.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_tr.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_trap.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ts.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_tw.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_vali.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_vase.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_vm.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_wf.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_xc.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zf.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zg.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml create mode 100644 soh/assets/xml/N64_NTSC_11/objects/object_zo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml create mode 100644 soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/N64_NTSC_11/text/message_data_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/kanji.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/message_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml create mode 100644 soh/assets/xml/N64_NTSC_11/textures/title_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/audio/Audio.xml create mode 100644 soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml create mode 100644 soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_am.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ane.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ani.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_aob.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bba.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bg.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bird.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bji.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bl.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bob.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_boj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_box.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_brob.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bv.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bw.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_cne.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_cob.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_cow.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_crow.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_cs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dh.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dns.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dog.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ds.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_du.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ec.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ei.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fd.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fire.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fish.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fr.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fu.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fw.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_fz.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_geff.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gla.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gm.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gol.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_goma.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gr.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_gt.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_haka.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_hata.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_hni.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_horse.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_hs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_human.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ik.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_im.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_in.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_jj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_js.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ka.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_km1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_kz.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mag.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mb.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_md.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_medal.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mk.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mm.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ms.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_mu.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_nb.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_niw.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ny.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_os.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_owl.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_poh.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ps.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_rd.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_rl.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_rr.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_rs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_sa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_sb.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_sd.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_skb.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_skj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_sst.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_st.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_stream.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ta.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_tite.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_tk.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_tp.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_tr.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_trap.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ts.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_tw.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_vali.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_vase.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_vm.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_wf.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_xc.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zf.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zg.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml create mode 100644 soh/assets/xml/N64_NTSC_12/objects/object_zo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml create mode 100644 soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/N64_NTSC_12/text/message_data_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/kanji.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/message_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml create mode 100644 soh/assets/xml/N64_NTSC_12/textures/title_static.xml create mode 100644 soh/src/code/z_kanji.c create mode 100644 soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c diff --git a/OTRExporter b/OTRExporter index 8f7167290..a7f24ae8a 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit 8f71672901987bc3dbf6256e64e228db36a686f5 +Subproject commit a7f24ae8a0da54440f4666c1619283676863ca6a diff --git a/ZAPDTR b/ZAPDTR index 04d42249d..8a26737d4 160000 --- a/ZAPDTR +++ b/ZAPDTR @@ -1 +1 @@ -Subproject commit 04d42249d2c15c3b442a0282a90bc8b7bda25b03 +Subproject commit 8a26737d4783a5282fb2c25ce7028556cbe5a394 diff --git a/docs/supportedHashes.json b/docs/supportedHashes.json index 587a64a55..3e4ab41b4 100644 --- a/docs/supportedHashes.json +++ b/docs/supportedHashes.json @@ -30,5 +30,29 @@ { "name": "PAL MQ (Debug)", "sha1": "cfecfdc58d650e71a200c81f033de4e6d617a9f6" + }, + { + "name": "NTSC 1.0 (US)", + "sha1": "ad69c91157f6705e8ab06c79fe08aad47bb57ba7" + }, + { + "name": "NTSC 1.1 (US)", + "sha1": "d3ecb253776cd847a5aa63d859d8c89a2f37b364" + }, + { + "name": "NTSC 1.2 (US)", + "sha1": "41b3bdc48d98c48529219919015a1af22f5057c2" + }, + { + "name": "NTSC 1.0 (JP)", + "sha1": "c892bbda3993e66bd0d56a10ecd30b1ee612210f" + }, + { + "name": "NTSC 1.1 (JP)", + "sha1": "dbfc81f655187dc6fefd93fa6798face770d579d" + }, + { + "name": "NTSC 1.2 (JP)", + "sha1": "fa5f5942b27480d60243c2d52c0e93e26b9e6b86" } ] diff --git a/scripts/linux/appimage/soh.sh.in b/scripts/linux/appimage/soh.sh.in index 71121a5ff..1d148cdfc 100644 --- a/scripts/linux/appimage/soh.sh.in +++ b/scripts/linux/appimage/soh.sh.in @@ -92,6 +92,42 @@ while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do 166c02770d67fcc3954c443eb400a6a3573d3fc0) # n64 ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f ;; + 79a4f053d34018e59279e6d4b83c7daccd985c87) # v64 + ROMHASH=ad69c91157f6705e8ab06c79fe08aad47bb57ba7 + ;; + 82fafee9c6ac7946739282958364ce606077ac65) # n64 + ROMHASH=ad69c91157f6705e8ab06c79fe08aad47bb57ba7 + ;; + 18cd0eb65914a21d8fa08dfe71c29d865e9d728a) # v64 + ROMHASH=d3ecb253776cd847a5aa63d859d8c89a2f37b364 + ;; + 07940d5609e04b7caac63570731e01189129212e) # n64 + ROMHASH=d3ecb253776cd847a5aa63d859d8c89a2f37b364 + ;; + 3ac86253e0c0d55486d212e647350c1527b9c92d) # v64 + ROMHASH=41b3bdc48d98c48529219919015a1af22f5057c2 + ;; + 70bf30a9980026e615a1ae8d2735a773cf9fcc94) # n64 + ROMHASH=41b3bdc48d98c48529219919015a1af22f5057c2 + ;; + f9e2b6840b9103e9707ea390089a7b6943592a98) # v64 + ROMHASH=c892bbda3993e66bd0d56a10ecd30b1ee612210f + ;; + 2fae1601aa7ae8d3e03ba3f4dcdfca3a36002ac5) # n64 + ROMHASH=c892bbda3993e66bd0d56a10ecd30b1ee612210f + ;; + 1181034d5f9533f53ebe8e1c781badbee115f5aa) # v64 + ROMHASH=dbfc81f655187dc6fefd93fa6798face770d579d + ;; + 07477067943abe8d0c50285eb4a6cb9ece99e79b) # n64 + ROMHASH=dbfc81f655187dc6fefd93fa6798face770d579d + ;; + 2d8fb7140a9c5d11ce614561e5a36ffef0c17540) # v64 + ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86 + ;; + d90bbe422ac728ac54ac6a2c9fec942f7ff04df9) # n64 + ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86 + ;; esac case "$ROMHASH" in @@ -125,6 +161,30 @@ while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do continue fi ;; + ad69c91157f6705e8ab06c79fe08aad47bb57ba7|c892bbda3993e66bd0d56a10ecd30b1ee612210f) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=N64_NTSC_10 + OTRNAME="oot.otr" + else + continue + fi + ;; + d3ecb253776cd847a5aa63d859d8c89a2f37b364|dbfc81f655187dc6fefd93fa6798face770d579d) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=N64_NTSC_11 + OTRNAME="oot.otr" + else + continue + fi + ;; + 41b3bdc48d98c48529219919015a1af22f5057c2|fa5f5942b27480d60243c2d52c0e93e26b9e6b86) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=N64_NTSC_12 + OTRNAME="oot.otr" + else + continue + fi + ;; f46239439f59a2a594ef83cf68ef65043b1bffe2) if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then ROM=GC_MQ_PAL_F diff --git a/soh/assets/custom/textures/title_static/gFileSelBossRushSettingsJPNTex.ia8.png b/soh/assets/custom/textures/title_static/gFileSelBossRushSettingsJPNTex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..445111458b5fd1ec6e72b4e7210aa721fd430dbb GIT binary patch literal 2368 zcmV-G3BUG~u~MJuC0MOWt+rvucquSe?4c<(f8)js#HwT2_Q0(H&86N;*3 zglB~3HZ!Wpd%~ScJQx`5U zL5w&V9HM5WdPHJW^oWcEIkW$N`>IDr+@W6O?Lr}M7~dy`Q8nsId5D41*@!R1vaPnHUIzs32;bRa{vGf6951U69E94oEQKA2TMsrK~!jg z?U{W@)N2;UKhEfA)|6M$anN3@thRjX#chk0NX%kMt`!8fM3IqseWk*}T)I$6QXyif z;CR(*fhBA&o34=-)#OVUW~8aL>2%dvx2|SxHagSUKgJnG+5Xt&R$zVMFz1}-dCv2j z?{oP5p65JD#=-~q6W~9pzXUw(d?w%({~a;FPrw}D3D7^TeHQR$+#J5ZJ3G4{7#QvU zXCMz)4j6y{;CtW?c47j0KJq-@@IT@h@GBs8@(;i`&R30PF>-;2b|RZMZ1k}X@dj1jZhEU~e%V|;Vx&J{ok3kzl4x^?2`=Vyy||NebB zeE6`S685TM~p5jGLvIQqL5_^!6LmS@kN z0bnwjP^;DW`ub8+Q$tr*7vbUIC=?1leE1L&5)#6>bLZ&n?6d`Y^5h9gNl7-_+uNJ8 zv^27^vik1cz588JQ4!0RFDEK03awVl`Sa%~Dk`F)qJsGNcr+RffUARp!x4o-0f0iG zz`?-*wOY-I6DQE?^#JH}I#enZfa+6|G?8IT0Hsn%ZEfwC#^mH=7A#mmc6K&z-n=0^ zJe=(8Y_hVlmI1W4w-Xo`_|f2(E?u(eI-PFB#l^*G%9JTIG&Jz=;X|65n%KK{FEKGO zba!`CQc?mi5EmCWH9I>SfQpI=jvYG&z~je{(d+e%z>>ki!QYI8uNl?^xM?<<|1xjh zJbZn90T>w>Vb!Wt1P2Gx(9nRVrzZgc0r>m-bNcjYYHDi8$;lxvFYlwlZ{NO6Sy>st z6=27iGiT6fG>nXlker-MTwEMVrIPykdaA0b7#bP^7(9FS?9{5NDk>@}IDY&%moHx? zA|it6)2B0I#*8HZPEJmrl9#Urwgdov2@MUMv1^xQPc<+wKze#Qk&%&fbaY@a7&vg? z07j#cj*bpQ?A)wpM-=2y1To{%gdvxstRD?(W6JHuCB(z!-KlIIx;ge(Q36kefpGZ*RC;h=1kn& z+%TC;KVeC*Z}<(+8y6QRWo2bHnKWsVR99C^K|z5;Mn=lOz<~8!o&%&iJ3GtB$cO|6 z1_~e|A~$Z_kn-|!DK9S((vVy?eI+zkD&aCK!AHDK0LS($Z3ij*b=)k*QOs%A7fK zWN>g$dU|?f-@bj;I>3*>zoMd|L_{PbBg2*evu4e*FVfrt3V}30nwpvnM30nf> z93mL@r#oAYox);^5#QuCA`q($XUN`T5e;)+WWp#UdiIcI{g6 z_4O4$KR;QtXpzjGJzD@%OiYZ3h&+1qNGdBUW$V_h;^pNf-rnBg=jSInolc^nqQuF` zNdR$lbd;AbU&@*_Yow#2Lk=A}WUU%r4G9SmlgT72R;&=9;!6@YQD94ezP>&&7z|=C z7$i40SNi(;Bq=FLf`fylva(X%zke?pjYhU@+a}G;&7xAN#Ldl3N=izkt*uRrMx)px zJw07iDwVu=@j|w5-!6%XiPF;2B4)E$#=~SXiL0xtczSw@(P)&x!9iKJY?<`-_F7;6 znON=(oyLfnbSnd0OEL^zIYWI43dkfGD zR9eR<6bezR)ixR32bg?(d<4to&1-8vrBXRY6bglH?x3I`QK?h{h*qn$`mI%`2cvtD zZs71|;%7p_!A{=<{D9@gu6)!N3@EXD$L|Aw9PN_>ytUIG0CR!g0}Fx4c5#P*zuNWv zC$Jh=JZ^rlEb>h($I~Bx$H3o!ougwPj`s7ni}&dN`sd&94c`F&0eD#HTjTv@g#Z8m m4rN$LW=%~1DgXcg2mk;800000(o>TF0000~u~MJuC0MOWt+rvucquSe?4c<(f8)js#HwT2_Q0(H&86N;*3 zglB~3HZ!Wpd%~ScJQx`5U zL5w&V9HM5WdPHJW^oWcEIkW$N`>IDr+@W6O?Lr}M7~dy`Q8nsId5D41*@!R1vaPnHUIzs32;bRa{vGf6951U69E94oEQKA2);=~K~!jg z?U{c}mDd@^KlcZhUr}!OC2~O$6$CPe6l0>O)MBS=ivhtxgUK`&2(*8IAz7M0E<{C| z4wgcUf{qgLN`@Y@nE!uUpNm=_% zPVRZ1^F7ab-shh8Jm)+|!-KILC-7Q%aONT0C?E`23WNZmKqQ_C=P6(Xa3(f3Rx&a&1i0bD z@h*12{~_=Fe~o7W>F@8CqeqXb4jBTj0}a3`Jb&2ld9VWo=mefobe=UDjS?LlEs>Ft z5*ivR5fKq$GMOYIB0}YF^Ri((AQp>7UViyywLQ?s&OfB4rpi0-ydzqzR*oGzCU(1B z>~_19mzRH5x7+O!7#Ju(Juq5WSSS{YMF7dl%95Fxna`EJzCLxl%tz_eZzJ>z$RdHN zZQHi7Y11YyT)4o_ojdXO_fPfr_ou6?EBW5Nd+UIIBqk>AE-x>~;c(z^IM8S`=yW>t zdObRwj^^g(9}f-=0`vieX0w^{^71bXI6ps6T3Q;{u3akwx)re-!0mS9bUIb4)2Hj` z=;$a(Nl6?$c#wvM2AZ3jIdtd{I-QQ^o_h|1!N9=409vgU;HO%x7L7&&fKI2wU@&m^ z?p>aL{&@g4Z{AEnL4m4&$^YWi#RT68U;=)n(P-9IRaF6CHk%O}>Jgy?aCa{QRh`ttB%vlgY_R zrlzJC8XCf8vthMbKhrTaHHFb=1ik=oi?@8$ZU+7=NJAtEAc)~xXk0T+QBMgQYKJ1~G}MYyQZ zXk>VJSV~Gt1ejH9P_Ye=o}L~#d-kl<)zwLGaIgTM0;LLPFYtjn-l+QdLzY z`T6g+?n`St79i-<^KVxj=8Ui}h*UxbB)c~5{h z75RgZ3P^r_zTCQXOAH2s07rZ{nSk{5^+|Vkw@gk>%J}%WT-ZYs^G&MC*UtiDs z{QRfDFMW7A@Wko&-+!Ov5_zp zhf8T`sa(H)UDmE$D-{(LVzb#KIXPJX2@ek!x7#iE@86g4@o~w@%96^;N@;Iz7eMOk z>*e(6)2co3U(cP36Onk9$w;6Uko5F)nVOoCmX;RPF;4?O1Ww@DsQnALXEK?*C%`P8 zB#ImOEuP8rB=GT)B}=5Yw^t@6CZwjOM%-?95e=jX-ca>?A>+~?{!IXMDIbab?Mhk%BLhR;GoW@e_`ym?a{YyUUr z=5G&tPXWu6a$BR(=wEo@1sWS0xp3hErKP0+=ah0{`SRr@MMXu-&CLZmolcf6T?)Xy zefyZ6o(|IM_4xVu(b3WI?C|g~z_aVtt)r!-g_xKaGBPq49vTDmHD}M0|WaJv}`f zKYpCf&Q5@%6B848C||e1V4$F&fa>aMfLj)eWkp0p1W8FrjEsyFDdT;o@Oo5KlvGt! z$wwc3BqAcMt*z=N?L#0|;k6|tC5hE){nE01`*s1Orlv-mPN!I{R_~KSH6UeWWg;T- z(n~L?8&6QekJW0G!-o&6eBTNCYG`PvjEszk+wGRqr%%gUZ@nceSFV)k=xB+Jjg_37 z9BFNBm8hsF0onj5FE5v_t}ZDqE|$s3N$(_)y!YOF^7h+rtK)s=j)ZTlSg}HG-@YxK zot?6A<3`mHf5MX^P_Y%b&BL>RYPk(`ZQQs~8XFtM-``)Asrh#^AWuE@lzQZBROGt> zvDs|i*+}2i>`X;Pg%x1H+w6u7K zmlWX2)~#D*baYe#0s;g$`iT6xXpjcX2L%PGPPq*1dH^>Z&sX|oC0xFb`f`EkWy_YScL^*08>cO1Xcmwq0sHXe`9FNb<1Gd5eFgq*JU4fL$CCx@ z_h~mN?M9_N5YNgIx_~Y>o_8w46H40f+&2U$ea95u5BSe5=(Vq4>-YE`ix2+>z)5)} tRfa)d0000EWmrjOO-%qQ00008000000002eQ + + + + + + + diff --git a/soh/assets/extractor/Config_N64_NTSC_11.xml b/soh/assets/extractor/Config_N64_NTSC_11.xml new file mode 100644 index 000000000..e69608bc2 --- /dev/null +++ b/soh/assets/extractor/Config_N64_NTSC_11.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_N64_NTSC_12.xml b/soh/assets/extractor/Config_N64_NTSC_12.xml new file mode 100644 index 000000000..c72689ccb --- /dev/null +++ b/soh/assets/extractor/Config_N64_NTSC_12.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/objects/gameplay_keep/gameplay_keep.h b/soh/assets/objects/gameplay_keep/gameplay_keep.h index 638125397..afd7b7495 100644 --- a/soh/assets/objects/gameplay_keep/gameplay_keep.h +++ b/soh/assets/objects/gameplay_keep/gameplay_keep.h @@ -2850,5 +2850,62 @@ static const ALIGN_ASSET(2) char gFishSkelLimbsLimb_018FB0DL_018950[] = dgFishSk #define dgFishSkelLimbsLimb_018FBCDL_0188B0 "__OTR__objects/gameplay_keep/gFishSkelLimbsLimb_018FBCDL_0188B0" static const ALIGN_ASSET(2) char gFishSkelLimbsLimb_018FBCDL_0188B0[] = dgFishSkelLimbsLimb_018FBCDL_0188B0; +// #region NTSC + +#define dgameplay_keep_DL_0C8B0 "__OTR__objects/gameplay_keep/gameplay_keep_DL_0C8B0" +static const ALIGN_ASSET(2) char gameplay_keep_DL_0C8B0[] = dgameplay_keep_DL_0C8B0; + +#define dgameplay_keep_Tex_0CE60 "__OTR__objects/gameplay_keep/gameplay_keep_Tex_0CE60" +static const ALIGN_ASSET(2) char gameplay_keep_Tex_0CE60[] = dgameplay_keep_Tex_0CE60; + +#define dgameplay_keep_DL_39890 "__OTR__objects/gameplay_keep/gameplay_keep_DL_39890" +static const ALIGN_ASSET(2) char gameplay_keep_DL_39890[] = dgameplay_keep_DL_39890; + +#define dgameplay_keep_DL_399B0 "__OTR__objects/gameplay_keep/gameplay_keep_DL_399B0" +static const ALIGN_ASSET(2) char gameplay_keep_DL_399B0[] = dgameplay_keep_DL_399B0; + +#define dgameplay_keep_DL_39A80 "__OTR__objects/gameplay_keep/gameplay_keep_DL_39A80" +static const ALIGN_ASSET(2) char gameplay_keep_DL_39A80[] = dgameplay_keep_DL_39A80; + +#define dgameplay_keep_DL_39B50 "__OTR__objects/gameplay_keep/gameplay_keep_DL_39B50" +static const ALIGN_ASSET(2) char gameplay_keep_DL_39B50[] = dgameplay_keep_DL_39B50; + +#define dgameplay_keep_DL_3CFD0 "__OTR__objects/gameplay_keep/gameplay_keep_DL_3CFD0" +static const ALIGN_ASSET(2) char gameplay_keep_DL_3CFD0[] = dgameplay_keep_DL_3CFD0; + +#define dgameplay_keep_DL_3D108 "__OTR__objects/gameplay_keep/gameplay_keep_DL_3D108" +static const ALIGN_ASSET(2) char gameplay_keep_DL_3D108[] = dgameplay_keep_DL_3D108; + +#define dgameplay_keep_DL_3D260 "__OTR__objects/gameplay_keep/gameplay_keep_DL_3D260" +static const ALIGN_ASSET(2) char gameplay_keep_DL_3D260[] = dgameplay_keep_DL_3D260; + +#define dgUnusedDropBombchuTex "__OTR__objects/gameplay_keep/gUnusedDropBombchuTex" +static const ALIGN_ASSET(2) char gUnusedDropBombchuTex[] = dgUnusedDropBombchuTex; + +#define dgUnusedWalletTex "__OTR__objects/gameplay_keep/gUnusedWalletTex" +static const ALIGN_ASSET(2) char gUnusedWalletTex[] = dgUnusedWalletTex; + +#define dgUnusedHeartPieceTex "__OTR__objects/gameplay_keep/gUnusedHeartPieceTex" +static const ALIGN_ASSET(2) char gUnusedHeartPieceTex[] = dgUnusedHeartPieceTex; + +#define dgUnusedDropRecoveryHeartTex "__OTR__objects/gameplay_keep/gUnusedDropRecoveryHeartTex" +static const ALIGN_ASSET(2) char gUnusedDropRecoveryHeartTex[] = dgUnusedDropRecoveryHeartTex; + +#define dgUnusedDropBombTex "__OTR__objects/gameplay_keep/gUnusedDropBombTex" +static const ALIGN_ASSET(2) char gUnusedDropBombTex[] = dgUnusedDropBombTex; + +#define dgUnusedDropArrows1Tex "__OTR__objects/gameplay_keep/gUnusedDropArrows1Tex" +static const ALIGN_ASSET(2) char gUnusedDropArrows1Tex[] = dgUnusedDropArrows1Tex; + +#define dgUnusedRupeeLightBlueTex "__OTR__objects/gameplay_keep/gUnusedRupeeLightBlueTex" +static const ALIGN_ASSET(2) char gUnusedRupeeLightBlueTex[] = dgUnusedRupeeLightBlueTex; + +#define dgUnusedHeartContainerTex "__OTR__objects/gameplay_keep/gUnusedHeartContainerTex" +static const ALIGN_ASSET(2) char gUnusedHeartContainerTex[] = dgUnusedHeartContainerTex; + +#define dgUnusedTreeBarkTex "__OTR__objects/gameplay_keep/gUnusedTreeBarkTex" +static const ALIGN_ASSET(2) char gUnusedTreeBarkTex[] = dgUnusedTreeBarkTex; + + #endif // OBJECTS_GAMEPLAY_KEEP_H diff --git a/soh/assets/objects/object_mag/object_mag.h b/soh/assets/objects/object_mag/object_mag.h index 07ccd88db..b470b71dd 100644 --- a/soh/assets/objects/object_mag/object_mag.h +++ b/soh/assets/objects/object_mag/object_mag.h @@ -9,6 +9,9 @@ static const ALIGN_ASSET(2) char gTitleZeldaShieldLogoMQTex[] = dgTitleZeldaShie #define dgTitleZeldaShieldLogoTex "__OTR__objects/object_mag/gTitleZeldaShieldLogoTex" static const ALIGN_ASSET(2) char gTitleZeldaShieldLogoTex[] = dgTitleZeldaShieldLogoTex; +#define dgTitleCopyright1998Tex "__OTR__objects/object_mag/gTitleCopyright1998Tex" +static const ALIGN_ASSET(2) char gTitleCopyright1998Tex[] = dgTitleCopyright1998Tex; + #define dgTitleCopyright19982002Tex "__OTR__objects/object_mag/gTitleCopyright19982002Tex" static const ALIGN_ASSET(2) char gTitleCopyright19982002Tex[] = dgTitleCopyright19982002Tex; diff --git a/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h b/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h index 9077b1ac5..46342f736 100644 --- a/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h +++ b/soh/assets/overlays/ovl_File_Choose/ovl_file_choose.h @@ -27,4 +27,13 @@ static const ALIGN_ASSET(2) char gOptionsDividerMiddleVtx[] = dgOptionsDividerMi #define dgOptionsDividerBottomVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerBottomVtx" static const ALIGN_ASSET(2) char gOptionsDividerBottomVtx[] = dgOptionsDividerBottomVtx; +#define dD_80811BB0_NTSC "__OTR__overlays/ovl_file_choose/D_80811BB0_NTSC" +static const ALIGN_ASSET(2) char D_80811BB0_NTSC[] = dD_80811BB0_NTSC; + +#define dD_80811D30_NTSC "__OTR__overlays/ovl_file_choose/D_80811D30_NTSC" +static const ALIGN_ASSET(2) char D_80811D30_NTSC[] = dD_80811D30_NTSC; + +#define dD_80811F30_NTSC "__OTR__overlays/ovl_file_choose/D_80811F30_NTSC" +static const ALIGN_ASSET(2) char D_80811F30_NTSC[] = dD_80811F30_NTSC; + #endif // OVERLAYS_OVL_FILE_CHOOSE_H diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 3778f4a70..3c3ddcf5a 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -395,6 +395,9 @@ static const ALIGN_ASSET(2) char gFileSelPleaseChooseAQuestFRATex[] = dgFileSelP #define dgFileSelPleaseChooseAQuestGERTex "__OTR__textures/title_static/gFileSelPleaseChooseAQuestGERTex" static const ALIGN_ASSET(2) char gFileSelPleaseChooseAQuestGERTex[] = dgFileSelPleaseChooseAQuestGERTex; +#define dgFileSelPleaseChooseAQuestJPNTex "__OTR__textures/title_static/gFileSelPleaseChooseAQuestJPNTex" +static const ALIGN_ASSET(2) char gFileSelPleaseChooseAQuestJPNTex[] = dgFileSelPleaseChooseAQuestJPNTex; + #define dgFileSelBossRushSettingsENGTex "__OTR__textures/title_static/gFileSelBossRushSettingsENGTex" static const ALIGN_ASSET(2) char gFileSelBossRushSettingsENGText[] = dgFileSelBossRushSettingsENGTex; @@ -404,6 +407,9 @@ static const ALIGN_ASSET(2) char gFileSelBossRushSettingsFRAText[] = dgFileSelBo #define dgFileSelBossRushSettingsGERTex "__OTR__textures/title_static/gFileSelBossRushSettingsGERTex" static const ALIGN_ASSET(2) char gFileSelBossRushSettingsGERText[] = dgFileSelBossRushSettingsGERTex; +#define dgFileSelBossRushSettingsJPNTex "__OTR__textures/title_static/gFileSelBossRushSettingsJPNTex" +static const ALIGN_ASSET(2) char gFileSelBossRushSettingsJPNText[] = dgFileSelBossRushSettingsJPNTex; + #define dgFileSelRANDButtonTex "__OTR__textures/title_static/gFileSelRANDButtonTex" static const ALIGN_ASSET(2) char gFileSelRANDButtonTex[] = dgFileSelRANDButtonTex; diff --git a/soh/assets/textures/boss_title_cards/object_bv.h b/soh/assets/textures/boss_title_cards/object_bv.h index 60a4d3074..3c4b7c090 100644 --- a/soh/assets/textures/boss_title_cards/object_bv.h +++ b/soh/assets/textures/boss_title_cards/object_bv.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gBarinadeTitleCardGERTex[] = dgBarinadeTitleCar #define dgBarinadeTitleCardFRATex "__OTR__textures/object_bv/gBarinadeTitleCardFRATex" static const ALIGN_ASSET(2) char gBarinadeTitleCardFRATex[] = dgBarinadeTitleCardFRATex; +#define dgBarinadeTitleCardJPNTex "__OTR__textures/object_bv/gBarinadeTitleCardJPNTex" +static const ALIGN_ASSET(2) char gBarinadeTitleCardJPNTex[] = dgBarinadeTitleCardJPNTex; + #endif // TEXTURES_OBJECT_BV_H diff --git a/soh/assets/textures/boss_title_cards/object_fd.h b/soh/assets/textures/boss_title_cards/object_fd.h index 56d765a86..01fa7a534 100644 --- a/soh/assets/textures/boss_title_cards/object_fd.h +++ b/soh/assets/textures/boss_title_cards/object_fd.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardGERTex[] = dgVolvagiaBoss #define dgVolvagiaBossTitleCardFRATex "__OTR__textures/object_fd/gVolvagiaBossTitleCardFRATex" static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardFRATex[] = dgVolvagiaBossTitleCardFRATex; +#define dgVolvagiaBossTitleCardJPNTex "__OTR__textures/object_fd/gVolvagiaBossTitleCardJPNTex" +static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardJPNTex[] = dgVolvagiaBossTitleCardJPNTex; + #endif // TEXTURES_OBJECT_FD_H diff --git a/soh/assets/textures/boss_title_cards/object_fhg.h b/soh/assets/textures/boss_title_cards/object_fhg.h index 68d09d083..81a26cd4d 100644 --- a/soh/assets/textures/boss_title_cards/object_fhg.h +++ b/soh/assets/textures/boss_title_cards/object_fhg.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gPhantomGanonTitleCardGERTex[] = dgPhantomGanon #define dgPhantomGanonTitleCardFRATex "__OTR__textures/object_fhg/gPhantomGanonTitleCardFRATex" static const ALIGN_ASSET(2) char gPhantomGanonTitleCardFRATex[] = dgPhantomGanonTitleCardFRATex; +#define dgPhantomGanonTitleCardJPNTex "__OTR__textures/object_fhg/gPhantomGanonTitleCardJPNTex" +static const ALIGN_ASSET(2) char gPhantomGanonTitleCardJPNTex[] = dgPhantomGanonTitleCardJPNTex; + #endif // TEXTURES_OBJECT_FHG_H diff --git a/soh/assets/textures/boss_title_cards/object_ganon.h b/soh/assets/textures/boss_title_cards/object_ganon.h index 0b855ac80..41db9df96 100644 --- a/soh/assets/textures/boss_title_cards/object_ganon.h +++ b/soh/assets/textures/boss_title_cards/object_ganon.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gGanondorfTitleCardGERTex[] = dgGanondorfTitleC #define dgGanondorfTitleCardFRATex "__OTR__textures/object_ganon/gGanondorfTitleCardFRATex" static const ALIGN_ASSET(2) char gGanondorfTitleCardFRATex[] = dgGanondorfTitleCardFRATex; +#define dgGanondorfTitleCardJPNTex "__OTR__textures/object_ganon/gGanondorfTitleCardJPNTex" +static const ALIGN_ASSET(2) char gGanondorfTitleCardJPNTex[] = dgGanondorfTitleCardJPNTex; + #endif // TEXTURES_OBJECT_GANON_H diff --git a/soh/assets/textures/boss_title_cards/object_ganon2.h b/soh/assets/textures/boss_title_cards/object_ganon2.h index d9eb76cc1..30241aa97 100644 --- a/soh/assets/textures/boss_title_cards/object_ganon2.h +++ b/soh/assets/textures/boss_title_cards/object_ganon2.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gGanonTitleCardGERTex[] = dgGanonTitleCardGERTe #define dgGanonTitleCardFRATex "__OTR__textures/object_ganon2/gGanonTitleCardFRATex" static const ALIGN_ASSET(2) char gGanonTitleCardFRATex[] = dgGanonTitleCardFRATex; +#define dgGanonTitleCardJPNTex "__OTR__textures/object_ganon2/gGanonTitleCardJPNTex" +static const ALIGN_ASSET(2) char gGanonTitleCardJPNTex[] = dgGanonTitleCardJPNTex; + #endif // TEXTURES_OBJECT_GANON2_H diff --git a/soh/assets/textures/boss_title_cards/object_goma.h b/soh/assets/textures/boss_title_cards/object_goma.h index 96243178b..81a962691 100644 --- a/soh/assets/textures/boss_title_cards/object_goma.h +++ b/soh/assets/textures/boss_title_cards/object_goma.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gGohmaTitleCardGERTex[] = dgGohmaTitleCardGERTe #define dgGohmaTitleCardFRATex "__OTR__textures/object_goma/gGohmaTitleCardFRATex" static const ALIGN_ASSET(2) char gGohmaTitleCardFRATex[] = dgGohmaTitleCardFRATex; +#define dgGohmaTitleCardJPNTex "__OTR__textures/object_goma/gGohmaTitleCardJPNTex" +static const ALIGN_ASSET(2) char gGohmaTitleCardJPNTex[] = dgGohmaTitleCardJPNTex; + #endif // TEXTURES_OBJECT_GOMA_H diff --git a/soh/assets/textures/boss_title_cards/object_kingdodongo.h b/soh/assets/textures/boss_title_cards/object_kingdodongo.h index d03784a28..cc8ce47aa 100644 --- a/soh/assets/textures/boss_title_cards/object_kingdodongo.h +++ b/soh/assets/textures/boss_title_cards/object_kingdodongo.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gKingDodongoTitleCardGERTex[] = dgKingDodongoTi #define dgKingDodongoTitleCardFRATex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardFRATex" static const ALIGN_ASSET(2) char gKingDodongoTitleCardFRATex[] = dgKingDodongoTitleCardFRATex; +#define dgKingDodongoTitleCardJPNTex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardJPNTex" +static const ALIGN_ASSET(2) char gKingDodongoTitleCardJPNTex[] = dgKingDodongoTitleCardJPNTex; + #endif // TEXTURES_OBJECT_KINGDODONGO_H diff --git a/soh/assets/textures/boss_title_cards/object_mo.h b/soh/assets/textures/boss_title_cards/object_mo.h index 1d2d1489a..312b8be85 100644 --- a/soh/assets/textures/boss_title_cards/object_mo.h +++ b/soh/assets/textures/boss_title_cards/object_mo.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gMorphaTitleCardGERTex[] = dgMorphaTitleCardGER #define dgMorphaTitleCardFRATex "__OTR__textures/object_mo/gMorphaTitleCardFRATex" static const ALIGN_ASSET(2) char gMorphaTitleCardFRATex[] = dgMorphaTitleCardFRATex; +#define dgMorphaTitleCardJPNTex "__OTR__textures/object_mo/gMorphaTitleCardJPNTex" +static const ALIGN_ASSET(2) char gMorphaTitleCardJPNTex[] = dgMorphaTitleCardJPNTex; + #endif // TEXTURES_OBJECT_MO_H diff --git a/soh/assets/textures/boss_title_cards/object_sst.h b/soh/assets/textures/boss_title_cards/object_sst.h index f98670567..d9148df6c 100644 --- a/soh/assets/textures/boss_title_cards/object_sst.h +++ b/soh/assets/textures/boss_title_cards/object_sst.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gBongoTitleCardGERTex[] = dgBongoTitleCardGERTe #define dgBongoTitleCardFRATex "__OTR__textures/object_sst/gBongoTitleCardFRATex" static const ALIGN_ASSET(2) char gBongoTitleCardFRATex[] = dgBongoTitleCardFRATex; +#define dgBongoTitleCardJPNTex "__OTR__textures/object_sst/gBongoTitleCardJPNTex" +static const ALIGN_ASSET(2) char gBongoTitleCardJPNTex[] = dgBongoTitleCardJPNTex; + #endif // TEXTURES_OBJECT_SST_H diff --git a/soh/assets/textures/boss_title_cards/object_tw.h b/soh/assets/textures/boss_title_cards/object_tw.h index d3a4b22fc..fa6d4fcaa 100644 --- a/soh/assets/textures/boss_title_cards/object_tw.h +++ b/soh/assets/textures/boss_title_cards/object_tw.h @@ -12,4 +12,7 @@ static const ALIGN_ASSET(2) char gTwinrovaTitleCardGERTex[] = dgTwinrovaTitleCar #define dgTwinrovaTitleCardFRATex "__OTR__textures/object_tw/gTwinrovaTitleCardFRATex" static const ALIGN_ASSET(2) char gTwinrovaTitleCardFRATex[] = dgTwinrovaTitleCardFRATex; +#define dgTwinrovaTitleCardJPNTex "__OTR__textures/object_tw/gTwinrovaTitleCardJPNTex" +static const ALIGN_ASSET(2) char gTwinrovaTitleCardJPNTex[] = dgTwinrovaTitleCardJPNTex; + #endif // TEXTURES_OBJECT_TW_H diff --git a/soh/assets/textures/do_action_static/do_action_static.h b/soh/assets/textures/do_action_static/do_action_static.h index 9b721d711..84553ba66 100644 --- a/soh/assets/textures/do_action_static/do_action_static.h +++ b/soh/assets/textures/do_action_static/do_action_static.h @@ -264,4 +264,92 @@ static const ALIGN_ASSET(2) char gNum7DoActionFRATex[] = dgNum7DoActionFRATex; #define dgNum8DoActionFRATex "__OTR__textures/do_action_static/gNum8DoActionFRATex" static const ALIGN_ASSET(2) char gNum8DoActionFRATex[] = dgNum8DoActionFRATex; +#define dgAttackDoActionJPNTex "__OTR__textures/do_action_static/gAttackDoActionJPNTex" +static const ALIGN_ASSET(2) char gAttackDoActionJPNTex[] = dgAttackDoActionJPNTex; + +#define dgCheckDoActionJPNTex "__OTR__textures/do_action_static/gCheckDoActionJPNTex" +static const ALIGN_ASSET(2) char gCheckDoActionJPNTex[] = dgCheckDoActionJPNTex; + +#define dgEnterDoActionJPNTex "__OTR__textures/do_action_static/gEnterDoActionJPNTex" +static const ALIGN_ASSET(2) char gEnterDoActionJPNTex[] = dgEnterDoActionJPNTex; + +#define dgReturnDoActionJPNTex "__OTR__textures/do_action_static/gReturnDoActionJPNTex" +static const ALIGN_ASSET(2) char gReturnDoActionJPNTex[] = dgReturnDoActionJPNTex; + +#define dgOpenDoActionJPNTex "__OTR__textures/do_action_static/gOpenDoActionJPNTex" +static const ALIGN_ASSET(2) char gOpenDoActionJPNTex[] = dgOpenDoActionJPNTex; + +#define dgJumpDoActionJPNTex "__OTR__textures/do_action_static/gJumpDoActionJPNTex" +static const ALIGN_ASSET(2) char gJumpDoActionJPNTex[] = dgJumpDoActionJPNTex; + +#define dgDecideDoActionJPNTex "__OTR__textures/do_action_static/gDecideDoActionJPNTex" +static const ALIGN_ASSET(2) char gDecideDoActionJPNTex[] = dgDecideDoActionJPNTex; + +#define dgDiveDoActionJPNTex "__OTR__textures/do_action_static/gDiveDoActionJPNTex" +static const ALIGN_ASSET(2) char gDiveDoActionJPNTex[] = dgDiveDoActionJPNTex; + +#define dgFasterDoActionJPNTex "__OTR__textures/do_action_static/gFasterDoActionJPNTex" +static const ALIGN_ASSET(2) char gFasterDoActionJPNTex[] = dgFasterDoActionJPNTex; + +#define dgThrowDoActionJPNTex "__OTR__textures/do_action_static/gThrowDoActionJPNTex" +static const ALIGN_ASSET(2) char gThrowDoActionJPNTex[] = dgThrowDoActionJPNTex; + +#define dgUnusedNaviDoActionJPNTex "__OTR__textures/do_action_static/gUnusedNaviDoActionJPNTex" +static const ALIGN_ASSET(2) char gUnusedNaviDoActionJPNTex[] = dgUnusedNaviDoActionJPNTex; + +#define dgClimbDoActionJPNTex "__OTR__textures/do_action_static/gClimbDoActionJPNTex" +static const ALIGN_ASSET(2) char gClimbDoActionJPNTex[] = dgClimbDoActionJPNTex; + +#define dgDropDoActionJPNTex "__OTR__textures/do_action_static/gDropDoActionJPNTex" +static const ALIGN_ASSET(2) char gDropDoActionJPNTex[] = dgDropDoActionJPNTex; + +#define dgDownDoActionJPNTex "__OTR__textures/do_action_static/gDownDoActionJPNTex" +static const ALIGN_ASSET(2) char gDownDoActionJPNTex[] = dgDownDoActionJPNTex; + +#define dgSaveDoActionJPNTex "__OTR__textures/do_action_static/gSaveDoActionJPNTex" +static const ALIGN_ASSET(2) char gSaveDoActionJPNTex[] = dgSaveDoActionJPNTex; + +#define dgSpeakDoActionJPNTex "__OTR__textures/do_action_static/gSpeakDoActionJPNTex" +static const ALIGN_ASSET(2) char gSpeakDoActionJPNTex[] = dgSpeakDoActionJPNTex; + +#define dgNextDoActionJPNTex "__OTR__textures/do_action_static/gNextDoActionJPNTex" +static const ALIGN_ASSET(2) char gNextDoActionJPNTex[] = dgNextDoActionJPNTex; + +#define dgGrabDoActionJPNTex "__OTR__textures/do_action_static/gGrabDoActionJPNTex" +static const ALIGN_ASSET(2) char gGrabDoActionJPNTex[] = dgGrabDoActionJPNTex; + +#define dgStopDoActionJPNTex "__OTR__textures/do_action_static/gStopDoActionJPNTex" +static const ALIGN_ASSET(2) char gStopDoActionJPNTex[] = dgStopDoActionJPNTex; + +#define dgPutAwayDoActionJPNTex "__OTR__textures/do_action_static/gPutAwayDoActionJPNTex" +static const ALIGN_ASSET(2) char gPutAwayDoActionJPNTex[] = dgPutAwayDoActionJPNTex; + +#define dgReelDoActionJPNTex "__OTR__textures/do_action_static/gReelDoActionJPNTex" +static const ALIGN_ASSET(2) char gReelDoActionJPNTex[] = dgReelDoActionJPNTex; + +#define dgNum1DoActionJPNTex "__OTR__textures/do_action_static/gNum1DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum1DoActionJPNTex[] = dgNum1DoActionJPNTex; + +#define dgNum2DoActionJPNTex "__OTR__textures/do_action_static/gNum2DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum2DoActionJPNTex[] = dgNum2DoActionJPNTex; + +#define dgNum3DoActionJPNTex "__OTR__textures/do_action_static/gNum3DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum3DoActionJPNTex[] = dgNum3DoActionJPNTex; + +#define dgNum4DoActionJPNTex "__OTR__textures/do_action_static/gNum4DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum4DoActionJPNTex[] = dgNum4DoActionJPNTex; + +#define dgNum5DoActionJPNTex "__OTR__textures/do_action_static/gNum5DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum5DoActionJPNTex[] = dgNum5DoActionJPNTex; + +#define dgNum6DoActionJPNTex "__OTR__textures/do_action_static/gNum6DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum6DoActionJPNTex[] = dgNum6DoActionJPNTex; + +#define dgNum7DoActionJPNTex "__OTR__textures/do_action_static/gNum7DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum7DoActionJPNTex[] = dgNum7DoActionJPNTex; + +#define dgNum8DoActionJPNTex "__OTR__textures/do_action_static/gNum8DoActionJPNTex" +static const ALIGN_ASSET(2) char gNum8DoActionJPNTex[] = dgNum8DoActionJPNTex; + + #endif // TEXTURES_DO_ACTION_STATIC_H diff --git a/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h b/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h index 2afcd8987..5f04c8faa 100644 --- a/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h +++ b/soh/assets/textures/icon_item_gameover_static/icon_item_gameover_static.h @@ -24,4 +24,7 @@ static const ALIGN_ASSET(2) char gContinuePlayingGERTex[] = dgContinuePlayingGER #define dgContinuePlayingFRATex "__OTR__textures/icon_item_gameover_static/gContinuePlayingFRATex" static const ALIGN_ASSET(2) char gContinuePlayingFRATex[] = dgContinuePlayingFRATex; +#define dgContinuePlayingJPNTex "__OTR__textures/icon_item_gameover_static/gContinuePlayingJPNTex" +static const ALIGN_ASSET(2) char gContinuePlayingJPNTex[] = dgContinuePlayingJPNTex; + #endif // TEXTURES_ICON_ITEM_GAMEOVER_STATIC_H diff --git a/soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h b/soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h new file mode 100644 index 000000000..615e7259e --- /dev/null +++ b/soh/assets/textures/icon_item_jpn_static/icon_item_jpn_static.h @@ -0,0 +1,100 @@ +#ifndef TEXTURES_ICON_ITEM_JPN_STATIC_H +#define TEXTURES_ICON_ITEM_JPN_STATIC_H 1 + +#include "align_asset_macro.h" + +#define dgPauseDekuTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseDekuTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseDekuTitleJPNTex[] = dgPauseDekuTitleJPNTex; + +#define dgPauseDodongoTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseDodongoTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseDodongoTitleJPNTex[] = dgPauseDodongoTitleJPNTex; + +#define dgPauseJabuTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseJabuTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseJabuTitleJPNTex[] = dgPauseJabuTitleJPNTex; + +#define dgPauseForestTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseForestTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseForestTitleJPNTex[] = dgPauseForestTitleJPNTex; + +#define dgPauseFireTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseFireTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseFireTitleJPNTex[] = dgPauseFireTitleJPNTex; + +#define dgPauseWaterTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseWaterTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseWaterTitleJPNTex[] = dgPauseWaterTitleJPNTex; + +#define dgPauseSpiritTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseSpiritTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseSpiritTitleJPNTex[] = dgPauseSpiritTitleJPNTex; + +#define dgPauseShadowTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseShadowTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseShadowTitleJPNTex[] = dgPauseShadowTitleJPNTex; + +#define dgPauseBotWTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseBotWTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseBotWTitleJPNTex[] = dgPauseBotWTitleJPNTex; + +#define dgPauseIceCavernTitleJPNTex "__OTR__textures/icon_item_jpn_static/gPauseIceCavernTitleJPNTex" +static const ALIGN_ASSET(2) char gPauseIceCavernTitleJPNTex[] = dgPauseIceCavernTitleJPNTex; + +#define dgPauseToEquipJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToEquipJPNTex" +static const ALIGN_ASSET(2) char gPauseToEquipJPNTex[] = dgPauseToEquipJPNTex; + +#define dgPauseToDecideJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToDecideJPNTex" +static const ALIGN_ASSET(2) char gPauseToDecideJPNTex[] = dgPauseToDecideJPNTex; + +#define dgPauseToPlayMelodyJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToPlayMelodyJPNTex" +static const ALIGN_ASSET(2) char gPauseToPlayMelodyJPNTex[] = dgPauseToPlayMelodyJPNTex; + +#define dgPauseToSelectItemJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToSelectItemJPNTex" +static const ALIGN_ASSET(2) char gPauseToSelectItemJPNTex[] = dgPauseToSelectItemJPNTex; + +#define dgPauseToMapJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToMapJPNTex" +static const ALIGN_ASSET(2) char gPauseToMapJPNTex[] = dgPauseToMapJPNTex; + +#define dgPauseToQuestStatusJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToQuestStatusJPNTex" +static const ALIGN_ASSET(2) char gPauseToQuestStatusJPNTex[] = dgPauseToQuestStatusJPNTex; + +#define dgPauseToEquipmentJPNTex "__OTR__textures/icon_item_jpn_static/gPauseToEquipmentJPNTex" +static const ALIGN_ASSET(2) char gPauseToEquipmentJPNTex[] = dgPauseToEquipmentJPNTex; + +#define dgPauseSavePromptJPNTex "__OTR__textures/icon_item_jpn_static/gPauseSavePromptJPNTex" +static const ALIGN_ASSET(2) char gPauseSavePromptJPNTex[] = dgPauseSavePromptJPNTex; + +#define dgPauseSaveConfirmationJPNTex "__OTR__textures/icon_item_jpn_static/gPauseSaveConfirmationJPNTex" +static const ALIGN_ASSET(2) char gPauseSaveConfirmationJPNTex[] = dgPauseSaveConfirmationJPNTex; + +#define dgPauseYesJPNTex "__OTR__textures/icon_item_jpn_static/gPauseYesJPNTex" +static const ALIGN_ASSET(2) char gPauseYesJPNTex[] = dgPauseYesJPNTex; + +#define dgPauseNoJPNTex "__OTR__textures/icon_item_jpn_static/gPauseNoJPNTex" +static const ALIGN_ASSET(2) char gPauseNoJPNTex[] = dgPauseNoJPNTex; + +#define dgPauseCurrentPositionJPNTex "__OTR__textures/icon_item_jpn_static/gPauseCurrentPositionJPNTex" +static const ALIGN_ASSET(2) char gPauseCurrentPositionJPNTex[] = dgPauseCurrentPositionJPNTex; + +#define dgPauseEquipment10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseEquipment10JPNTex" +static const ALIGN_ASSET(2) char gPauseEquipment10JPNTex[] = dgPauseEquipment10JPNTex; + +#define dgPauseSelectItem00JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSelectItem00JPNTex" +static const ALIGN_ASSET(2) char gPauseSelectItem00JPNTex[] = dgPauseSelectItem00JPNTex; + +#define dgPauseSelectItem10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSelectItem10JPNTex" +static const ALIGN_ASSET(2) char gPauseSelectItem10JPNTex[] = dgPauseSelectItem10JPNTex; + +#define dgPauseSelectItem20JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSelectItem20JPNTex" +static const ALIGN_ASSET(2) char gPauseSelectItem20JPNTex[] = dgPauseSelectItem20JPNTex; + +#define dgPauseMap10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseMap10JPNTex" +static const ALIGN_ASSET(2) char gPauseMap10JPNTex[] = dgPauseMap10JPNTex; + +#define dgPauseQuestStatus00JPNTex "__OTR__textures/icon_item_jpn_static/gPauseQuestStatus00JPNTex" +static const ALIGN_ASSET(2) char gPauseQuestStatus00JPNTex[] = dgPauseQuestStatus00JPNTex; + +#define dgPauseQuestStatus10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseQuestStatus10JPNTex" +static const ALIGN_ASSET(2) char gPauseQuestStatus10JPNTex[] = dgPauseQuestStatus10JPNTex; + +#define dgPauseQuestStatus20JPNTex "__OTR__textures/icon_item_jpn_static/gPauseQuestStatus20JPNTex" +static const ALIGN_ASSET(2) char gPauseQuestStatus20JPNTex[] = dgPauseQuestStatus20JPNTex; + +#define dgPauseSave10JPNTex "__OTR__textures/icon_item_jpn_static/gPauseSave10JPNTex" +static const ALIGN_ASSET(2) char gPauseSave10JPNTex[] = dgPauseSave10JPNTex; + + +#endif // TEXTURES_ICON_ITEM_JPN_STATIC_H \ No newline at end of file diff --git a/soh/assets/textures/item_name_static/item_name_static.h b/soh/assets/textures/item_name_static/item_name_static.h index 86af0cab0..0f97677a6 100644 --- a/soh/assets/textures/item_name_static/item_name_static.h +++ b/soh/assets/textures/item_name_static/item_name_static.h @@ -1110,4 +1110,340 @@ static const ALIGN_ASSET(2) char gUnusedBossKeyItemName21JPNTex[] = dgUnusedBoss #define dgBiggoronsSwordItemNameFRATex "__OTR__textures/item_name_static/gBiggoronsSwordItemNameFRATex" static const ALIGN_ASSET(2) char gBiggoronsSwordItemNameFRATex[] = dgBiggoronsSwordItemNameFRATex; +#define dgDekuStickItemNameJPNTex "__OTR__textures/item_name_static/gDekuStickItemNameJPNTex" +static const ALIGN_ASSET(2) char gDekuStickItemNameJPNTex[] = dgDekuStickItemNameJPNTex; + +#define dgDekuNutItemNameJPNTex "__OTR__textures/item_name_static/gDekuNutItemNameJPNTex" +static const ALIGN_ASSET(2) char gDekuNutItemNameJPNTex[] = dgDekuNutItemNameJPNTex; + +#define dgBombItemNameJPNTex "__OTR__textures/item_name_static/gBombItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombItemNameJPNTex[] = dgBombItemNameJPNTex; + +#define dgFairyBowItemNameJPNTex "__OTR__textures/item_name_static/gFairyBowItemNameJPNTex" +static const ALIGN_ASSET(2) char gFairyBowItemNameJPNTex[] = dgFairyBowItemNameJPNTex; + +#define dgFireArrowItemNameJPNTex "__OTR__textures/item_name_static/gFireArrowItemNameJPNTex" +static const ALIGN_ASSET(2) char gFireArrowItemNameJPNTex[] = dgFireArrowItemNameJPNTex; + +#define dgDinsFireItemNameJPNTex "__OTR__textures/item_name_static/gDinsFireItemNameJPNTex" +static const ALIGN_ASSET(2) char gDinsFireItemNameJPNTex[] = dgDinsFireItemNameJPNTex; + +#define dgFairySlingshotItemNameJPNTex "__OTR__textures/item_name_static/gFairySlingshotItemNameJPNTex" +static const ALIGN_ASSET(2) char gFairySlingshotItemNameJPNTex[] = dgFairySlingshotItemNameJPNTex; + +#define dgFairyOcarinaItemNameJPNTex "__OTR__textures/item_name_static/gFairyOcarinaItemNameJPNTex" +static const ALIGN_ASSET(2) char gFairyOcarinaItemNameJPNTex[] = dgFairyOcarinaItemNameJPNTex; + +#define dgOcarinaOfTimeItemNameJPNTex "__OTR__textures/item_name_static/gOcarinaOfTimeItemNameJPNTex" +static const ALIGN_ASSET(2) char gOcarinaOfTimeItemNameJPNTex[] = dgOcarinaOfTimeItemNameJPNTex; + +#define dgBombchuItemNameJPNTex "__OTR__textures/item_name_static/gBombchuItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombchuItemNameJPNTex[] = dgBombchuItemNameJPNTex; + +#define dgHookshotItemNameJPNTex "__OTR__textures/item_name_static/gHookshotItemNameJPNTex" +static const ALIGN_ASSET(2) char gHookshotItemNameJPNTex[] = dgHookshotItemNameJPNTex; + +#define dgLongshotItemNameJPNTex "__OTR__textures/item_name_static/gLongshotItemNameJPNTex" +static const ALIGN_ASSET(2) char gLongshotItemNameJPNTex[] = dgLongshotItemNameJPNTex; + +#define dgIceArrowItemNameJPNTex "__OTR__textures/item_name_static/gIceArrowItemNameJPNTex" +static const ALIGN_ASSET(2) char gIceArrowItemNameJPNTex[] = dgIceArrowItemNameJPNTex; + +#define dgFaroresWindItemNameJPNTex "__OTR__textures/item_name_static/gFaroresWindItemNameJPNTex" +static const ALIGN_ASSET(2) char gFaroresWindItemNameJPNTex[] = dgFaroresWindItemNameJPNTex; + +#define dgBoomerangItemNameJPNTex "__OTR__textures/item_name_static/gBoomerangItemNameJPNTex" +static const ALIGN_ASSET(2) char gBoomerangItemNameJPNTex[] = dgBoomerangItemNameJPNTex; + +#define dgLensItemNameJPNTex "__OTR__textures/item_name_static/gLensItemNameJPNTex" +static const ALIGN_ASSET(2) char gLensItemNameJPNTex[] = dgLensItemNameJPNTex; + +#define dgMagicBeansItemNameJPNTex "__OTR__textures/item_name_static/gMagicBeansItemNameJPNTex" +static const ALIGN_ASSET(2) char gMagicBeansItemNameJPNTex[] = dgMagicBeansItemNameJPNTex; + +#define dgMegatonHammerItemNameJPNTex "__OTR__textures/item_name_static/gMegatonHammerItemNameJPNTex" +static const ALIGN_ASSET(2) char gMegatonHammerItemNameJPNTex[] = dgMegatonHammerItemNameJPNTex; + +#define dgLightArrowItemNameJPNTex "__OTR__textures/item_name_static/gLightArrowItemNameJPNTex" +static const ALIGN_ASSET(2) char gLightArrowItemNameJPNTex[] = dgLightArrowItemNameJPNTex; + +#define dgNayrusLoveItemNameJPNTex "__OTR__textures/item_name_static/gNayrusLoveItemNameJPNTex" +static const ALIGN_ASSET(2) char gNayrusLoveItemNameJPNTex[] = dgNayrusLoveItemNameJPNTex; + +#define dgEmptyBottleItemNameJPNTex "__OTR__textures/item_name_static/gEmptyBottleItemNameJPNTex" +static const ALIGN_ASSET(2) char gEmptyBottleItemNameJPNTex[] = dgEmptyBottleItemNameJPNTex; + +#define dgRedPotionItemNameJPNTex "__OTR__textures/item_name_static/gRedPotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gRedPotionItemNameJPNTex[] = dgRedPotionItemNameJPNTex; + +#define dgGreenPotionItemNameJPNTex "__OTR__textures/item_name_static/gGreenPotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gGreenPotionItemNameJPNTex[] = dgGreenPotionItemNameJPNTex; + +#define dgBluePotionItemNameJPNTex "__OTR__textures/item_name_static/gBluePotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gBluePotionItemNameJPNTex[] = dgBluePotionItemNameJPNTex; + +#define dgBottledFairyItemNameJPNTex "__OTR__textures/item_name_static/gBottledFairyItemNameJPNTex" +static const ALIGN_ASSET(2) char gBottledFairyItemNameJPNTex[] = dgBottledFairyItemNameJPNTex; + +#define dgFishItemNameJPNTex "__OTR__textures/item_name_static/gFishItemNameJPNTex" +static const ALIGN_ASSET(2) char gFishItemNameJPNTex[] = dgFishItemNameJPNTex; + +#define dgFullMilkItemNameJPNTex "__OTR__textures/item_name_static/gFullMilkItemNameJPNTex" +static const ALIGN_ASSET(2) char gFullMilkItemNameJPNTex[] = dgFullMilkItemNameJPNTex; + +#define dgRutosLetterItemNameJPNTex "__OTR__textures/item_name_static/gRutosLetterItemNameJPNTex" +static const ALIGN_ASSET(2) char gRutosLetterItemNameJPNTex[] = dgRutosLetterItemNameJPNTex; + +#define dgBlueFireItemNameJPNTex "__OTR__textures/item_name_static/gBlueFireItemNameJPNTex" +static const ALIGN_ASSET(2) char gBlueFireItemNameJPNTex[] = dgBlueFireItemNameJPNTex; + +#define dgBugItemNameJPNTex "__OTR__textures/item_name_static/gBugItemNameJPNTex" +static const ALIGN_ASSET(2) char gBugItemNameJPNTex[] = dgBugItemNameJPNTex; + +#define dgBigPoeItemNameJPNTex "__OTR__textures/item_name_static/gBigPoeItemNameJPNTex" +static const ALIGN_ASSET(2) char gBigPoeItemNameJPNTex[] = dgBigPoeItemNameJPNTex; + +#define dgHalfMilkItemNameJPNTex "__OTR__textures/item_name_static/gHalfMilkItemNameJPNTex" +static const ALIGN_ASSET(2) char gHalfMilkItemNameJPNTex[] = dgHalfMilkItemNameJPNTex; + +#define dgPoeItemNameJPNTex "__OTR__textures/item_name_static/gPoeItemNameJPNTex" +static const ALIGN_ASSET(2) char gPoeItemNameJPNTex[] = dgPoeItemNameJPNTex; + +#define dgWeirdEggItemNameJPNTex "__OTR__textures/item_name_static/gWeirdEggItemNameJPNTex" +static const ALIGN_ASSET(2) char gWeirdEggItemNameJPNTex[] = dgWeirdEggItemNameJPNTex; + +#define dgCuccoItemNameJPNTex "__OTR__textures/item_name_static/gCuccoItemNameJPNTex" +static const ALIGN_ASSET(2) char gCuccoItemNameJPNTex[] = dgCuccoItemNameJPNTex; + +#define dgZeldasLetterItemNameJPNTex "__OTR__textures/item_name_static/gZeldasLetterItemNameJPNTex" +static const ALIGN_ASSET(2) char gZeldasLetterItemNameJPNTex[] = dgZeldasLetterItemNameJPNTex; + +#define dgKeatonMaskItemNameJPNTex "__OTR__textures/item_name_static/gKeatonMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gKeatonMaskItemNameJPNTex[] = dgKeatonMaskItemNameJPNTex; + +#define dgSkullMaskItemNameJPNTex "__OTR__textures/item_name_static/gSkullMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gSkullMaskItemNameJPNTex[] = dgSkullMaskItemNameJPNTex; + +#define dgSpookyMaskItemNameJPNTex "__OTR__textures/item_name_static/gSpookyMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gSpookyMaskItemNameJPNTex[] = dgSpookyMaskItemNameJPNTex; + +#define dgBunnyHoodItemNameJPNTex "__OTR__textures/item_name_static/gBunnyHoodItemNameJPNTex" +static const ALIGN_ASSET(2) char gBunnyHoodItemNameJPNTex[] = dgBunnyHoodItemNameJPNTex; + +#define dgGoronMaskItemNameJPNTex "__OTR__textures/item_name_static/gGoronMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronMaskItemNameJPNTex[] = dgGoronMaskItemNameJPNTex; + +#define dgZoraMaskItemNameJPNTex "__OTR__textures/item_name_static/gZoraMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gZoraMaskItemNameJPNTex[] = dgZoraMaskItemNameJPNTex; + +#define dgGerudoMaskItemNameJPNTex "__OTR__textures/item_name_static/gGerudoMaskItemNameJPNTex" +static const ALIGN_ASSET(2) char gGerudoMaskItemNameJPNTex[] = dgGerudoMaskItemNameJPNTex; + +#define dgMaskofTruthItemNameJPNTex "__OTR__textures/item_name_static/gMaskofTruthItemNameJPNTex" +static const ALIGN_ASSET(2) char gMaskofTruthItemNameJPNTex[] = dgMaskofTruthItemNameJPNTex; + +#define dgSOLDOUTItemNameJPNTex "__OTR__textures/item_name_static/gSOLDOUTItemNameJPNTex" +static const ALIGN_ASSET(2) char gSOLDOUTItemNameJPNTex[] = dgSOLDOUTItemNameJPNTex; + +#define dgPocketEggItemNameJPNTex "__OTR__textures/item_name_static/gPocketEggItemNameJPNTex" +static const ALIGN_ASSET(2) char gPocketEggItemNameJPNTex[] = dgPocketEggItemNameJPNTex; + +#define dgPocketCuccoItemNameJPNTex "__OTR__textures/item_name_static/gPocketCuccoItemNameJPNTex" +static const ALIGN_ASSET(2) char gPocketCuccoItemNameJPNTex[] = dgPocketCuccoItemNameJPNTex; + +#define dgCojiroItemNameJPNTex "__OTR__textures/item_name_static/gCojiroItemNameJPNTex" +static const ALIGN_ASSET(2) char gCojiroItemNameJPNTex[] = dgCojiroItemNameJPNTex; + +#define dgOddMushroomItemNameJPNTex "__OTR__textures/item_name_static/gOddMushroomItemNameJPNTex" +static const ALIGN_ASSET(2) char gOddMushroomItemNameJPNTex[] = dgOddMushroomItemNameJPNTex; + +#define dgOddPotionItemNameJPNTex "__OTR__textures/item_name_static/gOddPotionItemNameJPNTex" +static const ALIGN_ASSET(2) char gOddPotionItemNameJPNTex[] = dgOddPotionItemNameJPNTex; + +#define dgPoachersSawItemNameJPNTex "__OTR__textures/item_name_static/gPoachersSawItemNameJPNTex" +static const ALIGN_ASSET(2) char gPoachersSawItemNameJPNTex[] = dgPoachersSawItemNameJPNTex; + +#define dgBrokenGoronsSwordItemNameJPNTex "__OTR__textures/item_name_static/gBrokenGoronsSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gBrokenGoronsSwordItemNameJPNTex[] = dgBrokenGoronsSwordItemNameJPNTex; + +#define dgPrescriptionItemNameJPNTex "__OTR__textures/item_name_static/gPrescriptionItemNameJPNTex" +static const ALIGN_ASSET(2) char gPrescriptionItemNameJPNTex[] = dgPrescriptionItemNameJPNTex; + +#define dgEyeBallFrogItemNameJPNTex "__OTR__textures/item_name_static/gEyeBallFrogItemNameJPNTex" +static const ALIGN_ASSET(2) char gEyeBallFrogItemNameJPNTex[] = dgEyeBallFrogItemNameJPNTex; + +#define dgEyeDropsItemNameJPNTex "__OTR__textures/item_name_static/gEyeDropsItemNameJPNTex" +static const ALIGN_ASSET(2) char gEyeDropsItemNameJPNTex[] = dgEyeDropsItemNameJPNTex; + +#define dgClaimCheckItemNameJPNTex "__OTR__textures/item_name_static/gClaimCheckItemNameJPNTex" +static const ALIGN_ASSET(2) char gClaimCheckItemNameJPNTex[] = dgClaimCheckItemNameJPNTex; + +#define dgKokiriSwordItemNameJPNTex "__OTR__textures/item_name_static/gKokiriSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriSwordItemNameJPNTex[] = dgKokiriSwordItemNameJPNTex; + +#define dgMasterSwordItemNameJPNTex "__OTR__textures/item_name_static/gMasterSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gMasterSwordItemNameJPNTex[] = dgMasterSwordItemNameJPNTex; + +#define dgGiantsKnifeItemNameJPNTex "__OTR__textures/item_name_static/gGiantsKnifeItemNameJPNTex" +static const ALIGN_ASSET(2) char gGiantsKnifeItemNameJPNTex[] = dgGiantsKnifeItemNameJPNTex; + +#define dgDekuShieldItemNameJPNTex "__OTR__textures/item_name_static/gDekuShieldItemNameJPNTex" +static const ALIGN_ASSET(2) char gDekuShieldItemNameJPNTex[] = dgDekuShieldItemNameJPNTex; + +#define dgHylianShieldItemNameJPNTex "__OTR__textures/item_name_static/gHylianShieldItemNameJPNTex" +static const ALIGN_ASSET(2) char gHylianShieldItemNameJPNTex[] = dgHylianShieldItemNameJPNTex; + +#define dgMirrorShieldItemNameJPNTex "__OTR__textures/item_name_static/gMirrorShieldItemNameJPNTex" +static const ALIGN_ASSET(2) char gMirrorShieldItemNameJPNTex[] = dgMirrorShieldItemNameJPNTex; + +#define dgKokiriTunicItemNameJPNTex "__OTR__textures/item_name_static/gKokiriTunicItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriTunicItemNameJPNTex[] = dgKokiriTunicItemNameJPNTex; + +#define dgGoronTunicItemNameJPNTex "__OTR__textures/item_name_static/gGoronTunicItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronTunicItemNameJPNTex[] = dgGoronTunicItemNameJPNTex; + +#define dgZoraTunicItemNameJPNTex "__OTR__textures/item_name_static/gZoraTunicItemNameJPNTex" +static const ALIGN_ASSET(2) char gZoraTunicItemNameJPNTex[] = dgZoraTunicItemNameJPNTex; + +#define dgKokiriBootsItemNameJPNTex "__OTR__textures/item_name_static/gKokiriBootsItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriBootsItemNameJPNTex[] = dgKokiriBootsItemNameJPNTex; + +#define dgIronBootsItemNameJPNTex "__OTR__textures/item_name_static/gIronBootsItemNameJPNTex" +static const ALIGN_ASSET(2) char gIronBootsItemNameJPNTex[] = dgIronBootsItemNameJPNTex; + +#define dgHoverBootsItemNameJPNTex "__OTR__textures/item_name_static/gHoverBootsItemNameJPNTex" +static const ALIGN_ASSET(2) char gHoverBootsItemNameJPNTex[] = dgHoverBootsItemNameJPNTex; + +#define dgBulletBag30ItemNameJPNTex "__OTR__textures/item_name_static/gBulletBag30ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBulletBag30ItemNameJPNTex[] = dgBulletBag30ItemNameJPNTex; + +#define dgBulletBag40ItemNameJPNTex "__OTR__textures/item_name_static/gBulletBag40ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBulletBag40ItemNameJPNTex[] = dgBulletBag40ItemNameJPNTex; + +#define dgBulletBag50ItemNameJPNTex "__OTR__textures/item_name_static/gBulletBag50ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBulletBag50ItemNameJPNTex[] = dgBulletBag50ItemNameJPNTex; + +#define dgQuiver30ItemNameJPNTex "__OTR__textures/item_name_static/gQuiver30ItemNameJPNTex" +static const ALIGN_ASSET(2) char gQuiver30ItemNameJPNTex[] = dgQuiver30ItemNameJPNTex; + +#define dgQuiver40ItemNameJPNTex "__OTR__textures/item_name_static/gQuiver40ItemNameJPNTex" +static const ALIGN_ASSET(2) char gQuiver40ItemNameJPNTex[] = dgQuiver40ItemNameJPNTex; + +#define dgQuiver50ItemNameJPNTex "__OTR__textures/item_name_static/gQuiver50ItemNameJPNTex" +static const ALIGN_ASSET(2) char gQuiver50ItemNameJPNTex[] = dgQuiver50ItemNameJPNTex; + +#define dgBombBag20ItemNameJPNTex "__OTR__textures/item_name_static/gBombBag20ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombBag20ItemNameJPNTex[] = dgBombBag20ItemNameJPNTex; + +#define dgBombBag30ItemNameJPNTex "__OTR__textures/item_name_static/gBombBag30ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombBag30ItemNameJPNTex[] = dgBombBag30ItemNameJPNTex; + +#define dgBombBag40ItemNameJPNTex "__OTR__textures/item_name_static/gBombBag40ItemNameJPNTex" +static const ALIGN_ASSET(2) char gBombBag40ItemNameJPNTex[] = dgBombBag40ItemNameJPNTex; + +#define dgGoronsBraceletItemNameJPNTex "__OTR__textures/item_name_static/gGoronsBraceletItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronsBraceletItemNameJPNTex[] = dgGoronsBraceletItemNameJPNTex; + +#define dgSilverGauntletsItemNameJPNTex "__OTR__textures/item_name_static/gSilverGauntletsItemNameJPNTex" +static const ALIGN_ASSET(2) char gSilverGauntletsItemNameJPNTex[] = dgSilverGauntletsItemNameJPNTex; + +#define dgGoldenGauntletsItemNameJPNTex "__OTR__textures/item_name_static/gGoldenGauntletsItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoldenGauntletsItemNameJPNTex[] = dgGoldenGauntletsItemNameJPNTex; + +#define dgSilverScaleItemNameJPNTex "__OTR__textures/item_name_static/gSilverScaleItemNameJPNTex" +static const ALIGN_ASSET(2) char gSilverScaleItemNameJPNTex[] = dgSilverScaleItemNameJPNTex; + +#define dgGoldenScaleItemNameJPNTex "__OTR__textures/item_name_static/gGoldenScaleItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoldenScaleItemNameJPNTex[] = dgGoldenScaleItemNameJPNTex; + +#define dgBrokenGiantsKnifeItemNameJPNTex "__OTR__textures/item_name_static/gBrokenGiantsKnifeItemNameJPNTex" +static const ALIGN_ASSET(2) char gBrokenGiantsKnifeItemNameJPNTex[] = dgBrokenGiantsKnifeItemNameJPNTex; + +#define dgMinuetOfForestItemNameJPNTex "__OTR__textures/item_name_static/gMinuetOfForestItemNameJPNTex" +static const ALIGN_ASSET(2) char gMinuetOfForestItemNameJPNTex[] = dgMinuetOfForestItemNameJPNTex; + +#define dgBoleroOfFireItemNameJPNTex "__OTR__textures/item_name_static/gBoleroOfFireItemNameJPNTex" +static const ALIGN_ASSET(2) char gBoleroOfFireItemNameJPNTex[] = dgBoleroOfFireItemNameJPNTex; + +#define dgSerenadeOfWaterItemNameJPNTex "__OTR__textures/item_name_static/gSerenadeOfWaterItemNameJPNTex" +static const ALIGN_ASSET(2) char gSerenadeOfWaterItemNameJPNTex[] = dgSerenadeOfWaterItemNameJPNTex; + +#define dgRequiemOfSpiritItemNameJPNTex "__OTR__textures/item_name_static/gRequiemOfSpiritItemNameJPNTex" +static const ALIGN_ASSET(2) char gRequiemOfSpiritItemNameJPNTex[] = dgRequiemOfSpiritItemNameJPNTex; + +#define dgNocturneOfShadowItemNameJPNTex "__OTR__textures/item_name_static/gNocturneOfShadowItemNameJPNTex" +static const ALIGN_ASSET(2) char gNocturneOfShadowItemNameJPNTex[] = dgNocturneOfShadowItemNameJPNTex; + +#define dgPreludeOfLightItemNameJPNTex "__OTR__textures/item_name_static/gPreludeOfLightItemNameJPNTex" +static const ALIGN_ASSET(2) char gPreludeOfLightItemNameJPNTex[] = dgPreludeOfLightItemNameJPNTex; + +#define dgZeldasLullabyItemNameJPNTex "__OTR__textures/item_name_static/gZeldasLullabyItemNameJPNTex" +static const ALIGN_ASSET(2) char gZeldasLullabyItemNameJPNTex[] = dgZeldasLullabyItemNameJPNTex; + +#define dgEponasSongItemNameJPNTex "__OTR__textures/item_name_static/gEponasSongItemNameJPNTex" +static const ALIGN_ASSET(2) char gEponasSongItemNameJPNTex[] = dgEponasSongItemNameJPNTex; + +#define dgSariasSongItemNameJPNTex "__OTR__textures/item_name_static/gSariasSongItemNameJPNTex" +static const ALIGN_ASSET(2) char gSariasSongItemNameJPNTex[] = dgSariasSongItemNameJPNTex; + +#define dgSunsSongItemNameJPNTex "__OTR__textures/item_name_static/gSunsSongItemNameJPNTex" +static const ALIGN_ASSET(2) char gSunsSongItemNameJPNTex[] = dgSunsSongItemNameJPNTex; + +#define dgSongOfTimeItemNameJPNTex "__OTR__textures/item_name_static/gSongOfTimeItemNameJPNTex" +static const ALIGN_ASSET(2) char gSongOfTimeItemNameJPNTex[] = dgSongOfTimeItemNameJPNTex; + +#define dgSongOfStormsItemNameJPNTex "__OTR__textures/item_name_static/gSongOfStormsItemNameJPNTex" +static const ALIGN_ASSET(2) char gSongOfStormsItemNameJPNTex[] = dgSongOfStormsItemNameJPNTex; + +#define dgForestMedallionItemNameJPNTex "__OTR__textures/item_name_static/gForestMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gForestMedallionItemNameJPNTex[] = dgForestMedallionItemNameJPNTex; + +#define dgFireMedallionItemNameJPNTex "__OTR__textures/item_name_static/gFireMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gFireMedallionItemNameJPNTex[] = dgFireMedallionItemNameJPNTex; + +#define dgWaterMedallionItemNameJPNTex "__OTR__textures/item_name_static/gWaterMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gWaterMedallionItemNameJPNTex[] = dgWaterMedallionItemNameJPNTex; + +#define dgSpiritMedallionItemNameJPNTex "__OTR__textures/item_name_static/gSpiritMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gSpiritMedallionItemNameJPNTex[] = dgSpiritMedallionItemNameJPNTex; + +#define dgShadowMedallionItemNameJPNTex "__OTR__textures/item_name_static/gShadowMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gShadowMedallionItemNameJPNTex[] = dgShadowMedallionItemNameJPNTex; + +#define dgLightMedallionItemNameJPNTex "__OTR__textures/item_name_static/gLightMedallionItemNameJPNTex" +static const ALIGN_ASSET(2) char gLightMedallionItemNameJPNTex[] = dgLightMedallionItemNameJPNTex; + +#define dgKokiriEmeraldItemNameJPNTex "__OTR__textures/item_name_static/gKokiriEmeraldItemNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriEmeraldItemNameJPNTex[] = dgKokiriEmeraldItemNameJPNTex; + +#define dgGoronsRubyItemNameJPNTex "__OTR__textures/item_name_static/gGoronsRubyItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoronsRubyItemNameJPNTex[] = dgGoronsRubyItemNameJPNTex; + +#define dgZorasSapphireItemNameJPNTex "__OTR__textures/item_name_static/gZorasSapphireItemNameJPNTex" +static const ALIGN_ASSET(2) char gZorasSapphireItemNameJPNTex[] = dgZorasSapphireItemNameJPNTex; + +#define dgStoneofAgonyItemNameJPNTex "__OTR__textures/item_name_static/gStoneofAgonyItemNameJPNTex" +static const ALIGN_ASSET(2) char gStoneofAgonyItemNameJPNTex[] = dgStoneofAgonyItemNameJPNTex; + +#define dgGerudosCardItemNameJPNTex "__OTR__textures/item_name_static/gGerudosCardItemNameJPNTex" +static const ALIGN_ASSET(2) char gGerudosCardItemNameJPNTex[] = dgGerudosCardItemNameJPNTex; + +#define dgGoldSkulltulaItemNameJPNTex "__OTR__textures/item_name_static/gGoldSkulltulaItemNameJPNTex" +static const ALIGN_ASSET(2) char gGoldSkulltulaItemNameJPNTex[] = dgGoldSkulltulaItemNameJPNTex; + +#define dgPieceOfHeartItemNameJPNTex "__OTR__textures/item_name_static/gPieceOfHeartItemNameJPNTex" +static const ALIGN_ASSET(2) char gPieceOfHeartItemNameJPNTex[] = dgPieceOfHeartItemNameJPNTex; + +#define dgUnusedBigKeyItemNameJPNTex "__OTR__textures/item_name_static/gUnusedBigKeyItemNameJPNTex" +static const ALIGN_ASSET(2) char gUnusedBigKeyItemNameJPNTex[] = dgUnusedBigKeyItemNameJPNTex; + +#define dgCompassItemNameJPNTex "__OTR__textures/item_name_static/gCompassItemNameJPNTex" +static const ALIGN_ASSET(2) char gCompassItemNameJPNTex[] = dgCompassItemNameJPNTex; + +#define dgDungeonMapItemNameJPNTex "__OTR__textures/item_name_static/gDungeonMapItemNameJPNTex" +static const ALIGN_ASSET(2) char gDungeonMapItemNameJPNTex[] = dgDungeonMapItemNameJPNTex; + +#define dgBiggoronsSwordItemNameJPNTex "__OTR__textures/item_name_static/gBiggoronsSwordItemNameJPNTex" +static const ALIGN_ASSET(2) char gBiggoronsSwordItemNameJPNTex[] = dgBiggoronsSwordItemNameJPNTex; + #endif // TEXTURES_ITEM_NAME_STATIC_H diff --git a/soh/assets/textures/kanji/kanji.h b/soh/assets/textures/kanji/kanji.h new file mode 100644 index 000000000..4f961601e --- /dev/null +++ b/soh/assets/textures/kanji/kanji.h @@ -0,0 +1,11927 @@ +#ifndef INTERFACE_KANJI_H +#define INTERFACE_KANJI_H 1 + +#include "align_asset_macro.h" + +#define dgMsgKanji8140SpaceTex "__OTR__textures/kanji/gMsgKanji8140SpaceTex" +static const ALIGN_ASSET(2) char gMsgKanji8140SpaceTex[] = dgMsgKanji8140SpaceTex; + +#define dgMsgKanji8141ToutenTex "__OTR__textures/kanji/gMsgKanji8141ToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8141ToutenTex[] = dgMsgKanji8141ToutenTex; + +#define dgMsgKanji8142KutenTex "__OTR__textures/kanji/gMsgKanji8142KutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8142KutenTex[] = dgMsgKanji8142KutenTex; + +#define dgMsgKanji8143CommaTex "__OTR__textures/kanji/gMsgKanji8143CommaTex" +static const ALIGN_ASSET(2) char gMsgKanji8143CommaTex[] = dgMsgKanji8143CommaTex; + +#define dgMsgKanji8144PeriodTex "__OTR__textures/kanji/gMsgKanji8144PeriodTex" +static const ALIGN_ASSET(2) char gMsgKanji8144PeriodTex[] = dgMsgKanji8144PeriodTex; + +#define dgMsgKanji8145NakatenTex "__OTR__textures/kanji/gMsgKanji8145NakatenTex" +static const ALIGN_ASSET(2) char gMsgKanji8145NakatenTex[] = dgMsgKanji8145NakatenTex; + +#define dgMsgKanji8146ColonTex "__OTR__textures/kanji/gMsgKanji8146ColonTex" +static const ALIGN_ASSET(2) char gMsgKanji8146ColonTex[] = dgMsgKanji8146ColonTex; + +#define dgMsgKanji8147SemicolonTex "__OTR__textures/kanji/gMsgKanji8147SemicolonTex" +static const ALIGN_ASSET(2) char gMsgKanji8147SemicolonTex[] = dgMsgKanji8147SemicolonTex; + +#define dgMsgKanji8148QuestionMarkTex "__OTR__textures/kanji/gMsgKanji8148QuestionMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8148QuestionMarkTex[] = dgMsgKanji8148QuestionMarkTex; + +#define dgMsgKanji8149ExclamationMarkTex "__OTR__textures/kanji/gMsgKanji8149ExclamationMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8149ExclamationMarkTex[] = dgMsgKanji8149ExclamationMarkTex; + +#define dgMsgKanji814ADakutenTex "__OTR__textures/kanji/gMsgKanji814ADakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji814ADakutenTex[] = dgMsgKanji814ADakutenTex; + +#define dgMsgKanji814BHandakutenTex "__OTR__textures/kanji/gMsgKanji814BHandakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji814BHandakutenTex[] = dgMsgKanji814BHandakutenTex; + +#define dgMsgKanji814CAcuteAccentTex "__OTR__textures/kanji/gMsgKanji814CAcuteAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji814CAcuteAccentTex[] = dgMsgKanji814CAcuteAccentTex; + +#define dgMsgKanji814DGraveAccentTex "__OTR__textures/kanji/gMsgKanji814DGraveAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji814DGraveAccentTex[] = dgMsgKanji814DGraveAccentTex; + +#define dgMsgKanji814EDiaeresisTex "__OTR__textures/kanji/gMsgKanji814EDiaeresisTex" +static const ALIGN_ASSET(2) char gMsgKanji814EDiaeresisTex[] = dgMsgKanji814EDiaeresisTex; + +#define dgMsgKanji814FCircumflexAccentTex "__OTR__textures/kanji/gMsgKanji814FCircumflexAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji814FCircumflexAccentTex[] = dgMsgKanji814FCircumflexAccentTex; + +#define dgMsgKanji8150EmptyTex "__OTR__textures/kanji/gMsgKanji8150EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8150EmptyTex[] = dgMsgKanji8150EmptyTex; + +#define dgMsgKanji8151EmptyTex "__OTR__textures/kanji/gMsgKanji8151EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8151EmptyTex[] = dgMsgKanji8151EmptyTex; + +#define dgMsgKanji8152IchinojitenKatakanaTex "__OTR__textures/kanji/gMsgKanji8152IchinojitenKatakanaTex" +static const ALIGN_ASSET(2) char gMsgKanji8152IchinojitenKatakanaTex[] = dgMsgKanji8152IchinojitenKatakanaTex; + +#define dgMsgKanji8153IchinojitenKatakanaDakutenTex "__OTR__textures/kanji/gMsgKanji8153IchinojitenKatakanaDakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8153IchinojitenKatakanaDakutenTex[] = dgMsgKanji8153IchinojitenKatakanaDakutenTex; + +#define dgMsgKanji8154IchinojitenHiraganaTex "__OTR__textures/kanji/gMsgKanji8154IchinojitenHiraganaTex" +static const ALIGN_ASSET(2) char gMsgKanji8154IchinojitenHiraganaTex[] = dgMsgKanji8154IchinojitenHiraganaTex; + +#define dgMsgKanji8155IchinojitenHiraganaDakutenTex "__OTR__textures/kanji/gMsgKanji8155IchinojitenHiraganaDakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8155IchinojitenHiraganaDakutenTex[] = dgMsgKanji8155IchinojitenHiraganaDakutenTex; + +#define dgMsgKanji8156NonojitenTex "__OTR__textures/kanji/gMsgKanji8156NonojitenTex" +static const ALIGN_ASSET(2) char gMsgKanji8156NonojitenTex[] = dgMsgKanji8156NonojitenTex; + +#define dgMsgKanji8157Tex "__OTR__textures/kanji/gMsgKanji8157Tex" +static const ALIGN_ASSET(2) char gMsgKanji8157Tex[] = dgMsgKanji8157Tex; + +#define dgMsgKanji8158DounojitenTex "__OTR__textures/kanji/gMsgKanji8158DounojitenTex" +static const ALIGN_ASSET(2) char gMsgKanji8158DounojitenTex[] = dgMsgKanji8158DounojitenTex; + +#define dgMsgKanji8159ShimeTex "__OTR__textures/kanji/gMsgKanji8159ShimeTex" +static const ALIGN_ASSET(2) char gMsgKanji8159ShimeTex[] = dgMsgKanji8159ShimeTex; + +#define dgMsgKanji815AZeroTex "__OTR__textures/kanji/gMsgKanji815AZeroTex" +static const ALIGN_ASSET(2) char gMsgKanji815AZeroTex[] = dgMsgKanji815AZeroTex; + +#define dgMsgKanji815BChouonpuTex "__OTR__textures/kanji/gMsgKanji815BChouonpuTex" +static const ALIGN_ASSET(2) char gMsgKanji815BChouonpuTex[] = dgMsgKanji815BChouonpuTex; + +#define dgMsgKanji815CDashTex "__OTR__textures/kanji/gMsgKanji815CDashTex" +static const ALIGN_ASSET(2) char gMsgKanji815CDashTex[] = dgMsgKanji815CDashTex; + +#define dgMsgKanji815DHyphenTex "__OTR__textures/kanji/gMsgKanji815DHyphenTex" +static const ALIGN_ASSET(2) char gMsgKanji815DHyphenTex[] = dgMsgKanji815DHyphenTex; + +#define dgMsgKanji815ESlashTex "__OTR__textures/kanji/gMsgKanji815ESlashTex" +static const ALIGN_ASSET(2) char gMsgKanji815ESlashTex[] = dgMsgKanji815ESlashTex; + +#define dgMsgKanji815FBackSlashTex "__OTR__textures/kanji/gMsgKanji815FBackSlashTex" +static const ALIGN_ASSET(2) char gMsgKanji815FBackSlashTex[] = dgMsgKanji815FBackSlashTex; + +#define dgMsgKanji8160WaveDashTex "__OTR__textures/kanji/gMsgKanji8160WaveDashTex" +static const ALIGN_ASSET(2) char gMsgKanji8160WaveDashTex[] = dgMsgKanji8160WaveDashTex; + +#define dgMsgKanji8161DoubleVerticalLineTex "__OTR__textures/kanji/gMsgKanji8161DoubleVerticalLineTex" +static const ALIGN_ASSET(2) char gMsgKanji8161DoubleVerticalLineTex[] = dgMsgKanji8161DoubleVerticalLineTex; + +#define dgMsgKanji8162VerticalLineTex "__OTR__textures/kanji/gMsgKanji8162VerticalLineTex" +static const ALIGN_ASSET(2) char gMsgKanji8162VerticalLineTex[] = dgMsgKanji8162VerticalLineTex; + +#define dgMsgKanji8163SantenLeaderTex "__OTR__textures/kanji/gMsgKanji8163SantenLeaderTex" +static const ALIGN_ASSET(2) char gMsgKanji8163SantenLeaderTex[] = dgMsgKanji8163SantenLeaderTex; + +#define dgMsgKanji8164NitenLeaderTex "__OTR__textures/kanji/gMsgKanji8164NitenLeaderTex" +static const ALIGN_ASSET(2) char gMsgKanji8164NitenLeaderTex[] = dgMsgKanji8164NitenLeaderTex; + +#define dgMsgKanji8165SingleQuotationMarkLeftTex "__OTR__textures/kanji/gMsgKanji8165SingleQuotationMarkLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8165SingleQuotationMarkLeftTex[] = dgMsgKanji8165SingleQuotationMarkLeftTex; + +#define dgMsgKanji8166SingleQuotationMarkRightTex "__OTR__textures/kanji/gMsgKanji8166SingleQuotationMarkRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8166SingleQuotationMarkRightTex[] = dgMsgKanji8166SingleQuotationMarkRightTex; + +#define dgMsgKanji8167DoubleQuotationMarkLeftTex "__OTR__textures/kanji/gMsgKanji8167DoubleQuotationMarkLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8167DoubleQuotationMarkLeftTex[] = dgMsgKanji8167DoubleQuotationMarkLeftTex; + +#define dgMsgKanji8168DoubleQuotationMarkRightTex "__OTR__textures/kanji/gMsgKanji8168DoubleQuotationMarkRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8168DoubleQuotationMarkRightTex[] = dgMsgKanji8168DoubleQuotationMarkRightTex; + +#define dgMsgKanji8169ParenthesesLeftTex "__OTR__textures/kanji/gMsgKanji8169ParenthesesLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8169ParenthesesLeftTex[] = dgMsgKanji8169ParenthesesLeftTex; + +#define dgMsgKanji816AParenthesesRightTex "__OTR__textures/kanji/gMsgKanji816AParenthesesRightTex" +static const ALIGN_ASSET(2) char gMsgKanji816AParenthesesRightTex[] = dgMsgKanji816AParenthesesRightTex; + +#define dgMsgKanji816BKikkoukakkoLeftTex "__OTR__textures/kanji/gMsgKanji816BKikkoukakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji816BKikkoukakkoLeftTex[] = dgMsgKanji816BKikkoukakkoLeftTex; + +#define dgMsgKanji816CKikkoukakkoRightTex "__OTR__textures/kanji/gMsgKanji816CKikkoukakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji816CKikkoukakkoRightTex[] = dgMsgKanji816CKikkoukakkoRightTex; + +#define dgMsgKanji816DSquareBracketLeftTex "__OTR__textures/kanji/gMsgKanji816DSquareBracketLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji816DSquareBracketLeftTex[] = dgMsgKanji816DSquareBracketLeftTex; + +#define dgMsgKanji816ESquareBracketRightTex "__OTR__textures/kanji/gMsgKanji816ESquareBracketRightTex" +static const ALIGN_ASSET(2) char gMsgKanji816ESquareBracketRightTex[] = dgMsgKanji816ESquareBracketRightTex; + +#define dgMsgKanji816FCurlyBracketLeftTex "__OTR__textures/kanji/gMsgKanji816FCurlyBracketLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji816FCurlyBracketLeftTex[] = dgMsgKanji816FCurlyBracketLeftTex; + +#define dgMsgKanji8170CurlyBracketRightTex "__OTR__textures/kanji/gMsgKanji8170CurlyBracketRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8170CurlyBracketRightTex[] = dgMsgKanji8170CurlyBracketRightTex; + +#define dgMsgKanji8171YamakakkoLeftTex "__OTR__textures/kanji/gMsgKanji8171YamakakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8171YamakakkoLeftTex[] = dgMsgKanji8171YamakakkoLeftTex; + +#define dgMsgKanji8172YamakakkoRightTex "__OTR__textures/kanji/gMsgKanji8172YamakakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8172YamakakkoRightTex[] = dgMsgKanji8172YamakakkoRightTex; + +#define dgMsgKanji8173NijyuuyamakakkoLeftTex "__OTR__textures/kanji/gMsgKanji8173NijyuuyamakakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8173NijyuuyamakakkoLeftTex[] = dgMsgKanji8173NijyuuyamakakkoLeftTex; + +#define dgMsgKanji8174NijyuuyamakakkoRightTex "__OTR__textures/kanji/gMsgKanji8174NijyuuyamakakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8174NijyuuyamakakkoRightTex[] = dgMsgKanji8174NijyuuyamakakkoRightTex; + +#define dgMsgKanji8175KagikakkoLeftTex "__OTR__textures/kanji/gMsgKanji8175KagikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8175KagikakkoLeftTex[] = dgMsgKanji8175KagikakkoLeftTex; + +#define dgMsgKanji8176KagikakkoRightTex "__OTR__textures/kanji/gMsgKanji8176KagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8176KagikakkoRightTex[] = dgMsgKanji8176KagikakkoRightTex; + +#define dgMsgKanji8177NijyuukagikakkoLeftTex "__OTR__textures/kanji/gMsgKanji8177NijyuukagikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8177NijyuukagikakkoLeftTex[] = dgMsgKanji8177NijyuukagikakkoLeftTex; + +#define dgMsgKanji8178NijyuukagikakkoRightTex "__OTR__textures/kanji/gMsgKanji8178NijyuukagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8178NijyuukagikakkoRightTex[] = dgMsgKanji8178NijyuukagikakkoRightTex; + +#define dgMsgKanji8179SumitsukikakkoLeftTex "__OTR__textures/kanji/gMsgKanji8179SumitsukikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8179SumitsukikakkoLeftTex[] = dgMsgKanji8179SumitsukikakkoLeftTex; + +#define dgMsgKanji817ASumitsukikakkoRightTex "__OTR__textures/kanji/gMsgKanji817ASumitsukikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji817ASumitsukikakkoRightTex[] = dgMsgKanji817ASumitsukikakkoRightTex; + +#define dgMsgKanji817BPlusSignTex "__OTR__textures/kanji/gMsgKanji817BPlusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817BPlusSignTex[] = dgMsgKanji817BPlusSignTex; + +#define dgMsgKanji817CMinusSignTex "__OTR__textures/kanji/gMsgKanji817CMinusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817CMinusSignTex[] = dgMsgKanji817CMinusSignTex; + +#define dgMsgKanji817DPlusMinusSignTex "__OTR__textures/kanji/gMsgKanji817DPlusMinusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817DPlusMinusSignTex[] = dgMsgKanji817DPlusMinusSignTex; + +#define dgMsgKanji817EMultiplicationSignTex "__OTR__textures/kanji/gMsgKanji817EMultiplicationSignTex" +static const ALIGN_ASSET(2) char gMsgKanji817EMultiplicationSignTex[] = dgMsgKanji817EMultiplicationSignTex; + +#define dgMsgKanji8180DivisionSignTex "__OTR__textures/kanji/gMsgKanji8180DivisionSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8180DivisionSignTex[] = dgMsgKanji8180DivisionSignTex; + +#define dgMsgKanji8181EqualsSignTex "__OTR__textures/kanji/gMsgKanji8181EqualsSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8181EqualsSignTex[] = dgMsgKanji8181EqualsSignTex; + +#define dgMsgKanji8182NotEqualSignTex "__OTR__textures/kanji/gMsgKanji8182NotEqualSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8182NotEqualSignTex[] = dgMsgKanji8182NotEqualSignTex; + +#define dgMsgKanji8183LessThanSignTex "__OTR__textures/kanji/gMsgKanji8183LessThanSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8183LessThanSignTex[] = dgMsgKanji8183LessThanSignTex; + +#define dgMsgKanji8184GreaterThanSignTex "__OTR__textures/kanji/gMsgKanji8184GreaterThanSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8184GreaterThanSignTex[] = dgMsgKanji8184GreaterThanSignTex; + +#define dgMsgKanji8185LessThanOrEqualToTex "__OTR__textures/kanji/gMsgKanji8185LessThanOrEqualToTex" +static const ALIGN_ASSET(2) char gMsgKanji8185LessThanOrEqualToTex[] = dgMsgKanji8185LessThanOrEqualToTex; + +#define dgMsgKanji8186GreaterThanOrEqualToTex "__OTR__textures/kanji/gMsgKanji8186GreaterThanOrEqualToTex" +static const ALIGN_ASSET(2) char gMsgKanji8186GreaterThanOrEqualToTex[] = dgMsgKanji8186GreaterThanOrEqualToTex; + +#define dgMsgKanji8187InfinityTex "__OTR__textures/kanji/gMsgKanji8187InfinityTex" +static const ALIGN_ASSET(2) char gMsgKanji8187InfinityTex[] = dgMsgKanji8187InfinityTex; + +#define dgMsgKanji8188ThereforeTex "__OTR__textures/kanji/gMsgKanji8188ThereforeTex" +static const ALIGN_ASSET(2) char gMsgKanji8188ThereforeTex[] = dgMsgKanji8188ThereforeTex; + +#define dgMsgKanji8189MaleTex "__OTR__textures/kanji/gMsgKanji8189MaleTex" +static const ALIGN_ASSET(2) char gMsgKanji8189MaleTex[] = dgMsgKanji8189MaleTex; + +#define dgMsgKanji818AFemaleTex "__OTR__textures/kanji/gMsgKanji818AFemaleTex" +static const ALIGN_ASSET(2) char gMsgKanji818AFemaleTex[] = dgMsgKanji818AFemaleTex; + +#define dgMsgKanji818BDegreeSignTex "__OTR__textures/kanji/gMsgKanji818BDegreeSignTex" +static const ALIGN_ASSET(2) char gMsgKanji818BDegreeSignTex[] = dgMsgKanji818BDegreeSignTex; + +#define dgMsgKanji818CPrimeTex "__OTR__textures/kanji/gMsgKanji818CPrimeTex" +static const ALIGN_ASSET(2) char gMsgKanji818CPrimeTex[] = dgMsgKanji818CPrimeTex; + +#define dgMsgKanji818DDoublePrimeTex "__OTR__textures/kanji/gMsgKanji818DDoublePrimeTex" +static const ALIGN_ASSET(2) char gMsgKanji818DDoublePrimeTex[] = dgMsgKanji818DDoublePrimeTex; + +#define dgMsgKanji818ECelciusTex "__OTR__textures/kanji/gMsgKanji818ECelciusTex" +static const ALIGN_ASSET(2) char gMsgKanji818ECelciusTex[] = dgMsgKanji818ECelciusTex; + +#define dgMsgKanji818FYenSignTex "__OTR__textures/kanji/gMsgKanji818FYenSignTex" +static const ALIGN_ASSET(2) char gMsgKanji818FYenSignTex[] = dgMsgKanji818FYenSignTex; + +#define dgMsgKanji8190DollarSignTex "__OTR__textures/kanji/gMsgKanji8190DollarSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8190DollarSignTex[] = dgMsgKanji8190DollarSignTex; + +#define dgMsgKanji8191CentSignTex "__OTR__textures/kanji/gMsgKanji8191CentSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8191CentSignTex[] = dgMsgKanji8191CentSignTex; + +#define dgMsgKanji8192PoundSignTex "__OTR__textures/kanji/gMsgKanji8192PoundSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8192PoundSignTex[] = dgMsgKanji8192PoundSignTex; + +#define dgMsgKanji8193PercentSignTex "__OTR__textures/kanji/gMsgKanji8193PercentSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8193PercentSignTex[] = dgMsgKanji8193PercentSignTex; + +#define dgMsgKanji8194NumberSignTex "__OTR__textures/kanji/gMsgKanji8194NumberSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8194NumberSignTex[] = dgMsgKanji8194NumberSignTex; + +#define dgMsgKanji8195AmpersandTex "__OTR__textures/kanji/gMsgKanji8195AmpersandTex" +static const ALIGN_ASSET(2) char gMsgKanji8195AmpersandTex[] = dgMsgKanji8195AmpersandTex; + +#define dgMsgKanji8196AsteriskTex "__OTR__textures/kanji/gMsgKanji8196AsteriskTex" +static const ALIGN_ASSET(2) char gMsgKanji8196AsteriskTex[] = dgMsgKanji8196AsteriskTex; + +#define dgMsgKanji8197AtSignTex "__OTR__textures/kanji/gMsgKanji8197AtSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8197AtSignTex[] = dgMsgKanji8197AtSignTex; + +#define dgMsgKanji8198SectionSignTex "__OTR__textures/kanji/gMsgKanji8198SectionSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8198SectionSignTex[] = dgMsgKanji8198SectionSignTex; + +#define dgMsgKanji8199WhiteStarTex "__OTR__textures/kanji/gMsgKanji8199WhiteStarTex" +static const ALIGN_ASSET(2) char gMsgKanji8199WhiteStarTex[] = dgMsgKanji8199WhiteStarTex; + +#define dgMsgKanji819ABlackStarTex "__OTR__textures/kanji/gMsgKanji819ABlackStarTex" +static const ALIGN_ASSET(2) char gMsgKanji819ABlackStarTex[] = dgMsgKanji819ABlackStarTex; + +#define dgMsgKanji819BWhiteCircleTex "__OTR__textures/kanji/gMsgKanji819BWhiteCircleTex" +static const ALIGN_ASSET(2) char gMsgKanji819BWhiteCircleTex[] = dgMsgKanji819BWhiteCircleTex; + +#define dgMsgKanji819CBlackCircleTex "__OTR__textures/kanji/gMsgKanji819CBlackCircleTex" +static const ALIGN_ASSET(2) char gMsgKanji819CBlackCircleTex[] = dgMsgKanji819CBlackCircleTex; + +#define dgMsgKanji819DDoubleCircleTex "__OTR__textures/kanji/gMsgKanji819DDoubleCircleTex" +static const ALIGN_ASSET(2) char gMsgKanji819DDoubleCircleTex[] = dgMsgKanji819DDoubleCircleTex; + +#define dgMsgKanji819EWhiteDiamondTex "__OTR__textures/kanji/gMsgKanji819EWhiteDiamondTex" +static const ALIGN_ASSET(2) char gMsgKanji819EWhiteDiamondTex[] = dgMsgKanji819EWhiteDiamondTex; + +#define dgMsgKanji819FBlackDiamondTex "__OTR__textures/kanji/gMsgKanji819FBlackDiamondTex" +static const ALIGN_ASSET(2) char gMsgKanji819FBlackDiamondTex[] = dgMsgKanji819FBlackDiamondTex; + +#define dgMsgKanji81A0WhiteSquareTex "__OTR__textures/kanji/gMsgKanji81A0WhiteSquareTex" +static const ALIGN_ASSET(2) char gMsgKanji81A0WhiteSquareTex[] = dgMsgKanji81A0WhiteSquareTex; + +#define dgMsgKanji81A1BlackSquareTex "__OTR__textures/kanji/gMsgKanji81A1BlackSquareTex" +static const ALIGN_ASSET(2) char gMsgKanji81A1BlackSquareTex[] = dgMsgKanji81A1BlackSquareTex; + +#define dgMsgKanji81A2WhiteTriangleTex "__OTR__textures/kanji/gMsgKanji81A2WhiteTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A2WhiteTriangleTex[] = dgMsgKanji81A2WhiteTriangleTex; + +#define dgMsgKanji81A3BlackTriangleTex "__OTR__textures/kanji/gMsgKanji81A3BlackTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A3BlackTriangleTex[] = dgMsgKanji81A3BlackTriangleTex; + +#define dgMsgKanji81A4WhiteInvertedTriangleTex "__OTR__textures/kanji/gMsgKanji81A4WhiteInvertedTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A4WhiteInvertedTriangleTex[] = dgMsgKanji81A4WhiteInvertedTriangleTex; + +#define dgMsgKanji81A5BlackInvertedTriangleTex "__OTR__textures/kanji/gMsgKanji81A5BlackInvertedTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji81A5BlackInvertedTriangleTex[] = dgMsgKanji81A5BlackInvertedTriangleTex; + +#define dgMsgKanji81A6KomejirushiTex "__OTR__textures/kanji/gMsgKanji81A6KomejirushiTex" +static const ALIGN_ASSET(2) char gMsgKanji81A6KomejirushiTex[] = dgMsgKanji81A6KomejirushiTex; + +#define dgMsgKanji81A7PostalMarkTex "__OTR__textures/kanji/gMsgKanji81A7PostalMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji81A7PostalMarkTex[] = dgMsgKanji81A7PostalMarkTex; + +#define dgMsgKanji81A8ArrowRightTex "__OTR__textures/kanji/gMsgKanji81A8ArrowRightTex" +static const ALIGN_ASSET(2) char gMsgKanji81A8ArrowRightTex[] = dgMsgKanji81A8ArrowRightTex; + +#define dgMsgKanji81A9ArrowLeftTex "__OTR__textures/kanji/gMsgKanji81A9ArrowLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji81A9ArrowLeftTex[] = dgMsgKanji81A9ArrowLeftTex; + +#define dgMsgKanji81AAArrowUpTex "__OTR__textures/kanji/gMsgKanji81AAArrowUpTex" +static const ALIGN_ASSET(2) char gMsgKanji81AAArrowUpTex[] = dgMsgKanji81AAArrowUpTex; + +#define dgMsgKanji81ABArrowDownTex "__OTR__textures/kanji/gMsgKanji81ABArrowDownTex" +static const ALIGN_ASSET(2) char gMsgKanji81ABArrowDownTex[] = dgMsgKanji81ABArrowDownTex; + +#define dgMsgKanji81ACGetaTex "__OTR__textures/kanji/gMsgKanji81ACGetaTex" +static const ALIGN_ASSET(2) char gMsgKanji81ACGetaTex[] = dgMsgKanji81ACGetaTex; + +#define dgMsgKanji81B8EmptyTex "__OTR__textures/kanji/gMsgKanji81B8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81B8EmptyTex[] = dgMsgKanji81B8EmptyTex; + +#define dgMsgKanji81B9EmptyTex "__OTR__textures/kanji/gMsgKanji81B9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81B9EmptyTex[] = dgMsgKanji81B9EmptyTex; + +#define dgMsgKanji81BAEmptyTex "__OTR__textures/kanji/gMsgKanji81BAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BAEmptyTex[] = dgMsgKanji81BAEmptyTex; + +#define dgMsgKanji81BBEmptyTex "__OTR__textures/kanji/gMsgKanji81BBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BBEmptyTex[] = dgMsgKanji81BBEmptyTex; + +#define dgMsgKanji81BCEmptyTex "__OTR__textures/kanji/gMsgKanji81BCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BCEmptyTex[] = dgMsgKanji81BCEmptyTex; + +#define dgMsgKanji81BDEmptyTex "__OTR__textures/kanji/gMsgKanji81BDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BDEmptyTex[] = dgMsgKanji81BDEmptyTex; + +#define dgMsgKanji81BEEmptyTex "__OTR__textures/kanji/gMsgKanji81BEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81BEEmptyTex[] = dgMsgKanji81BEEmptyTex; + +#define dgMsgKanji81BFIntersectionTex "__OTR__textures/kanji/gMsgKanji81BFIntersectionTex" +static const ALIGN_ASSET(2) char gMsgKanji81BFIntersectionTex[] = dgMsgKanji81BFIntersectionTex; + +#define dgMsgKanji81C8EmptyTex "__OTR__textures/kanji/gMsgKanji81C8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81C8EmptyTex[] = dgMsgKanji81C8EmptyTex; + +#define dgMsgKanji81C9EmptyTex "__OTR__textures/kanji/gMsgKanji81C9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81C9EmptyTex[] = dgMsgKanji81C9EmptyTex; + +#define dgMsgKanji81CAEmptyTex "__OTR__textures/kanji/gMsgKanji81CAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CAEmptyTex[] = dgMsgKanji81CAEmptyTex; + +#define dgMsgKanji81CBEmptyTex "__OTR__textures/kanji/gMsgKanji81CBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CBEmptyTex[] = dgMsgKanji81CBEmptyTex; + +#define dgMsgKanji81CCEmptyTex "__OTR__textures/kanji/gMsgKanji81CCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CCEmptyTex[] = dgMsgKanji81CCEmptyTex; + +#define dgMsgKanji81CDEmptyTex "__OTR__textures/kanji/gMsgKanji81CDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CDEmptyTex[] = dgMsgKanji81CDEmptyTex; + +#define dgMsgKanji81CEEmptyTex "__OTR__textures/kanji/gMsgKanji81CEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81CEEmptyTex[] = dgMsgKanji81CEEmptyTex; + +#define dgMsgKanji81DBEmptyTex "__OTR__textures/kanji/gMsgKanji81DBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DBEmptyTex[] = dgMsgKanji81DBEmptyTex; + +#define dgMsgKanji81DCEmptyTex "__OTR__textures/kanji/gMsgKanji81DCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DCEmptyTex[] = dgMsgKanji81DCEmptyTex; + +#define dgMsgKanji81DDEmptyTex "__OTR__textures/kanji/gMsgKanji81DDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DDEmptyTex[] = dgMsgKanji81DDEmptyTex; + +#define dgMsgKanji81DEEmptyTex "__OTR__textures/kanji/gMsgKanji81DEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DEEmptyTex[] = dgMsgKanji81DEEmptyTex; + +#define dgMsgKanji81DFEmptyTex "__OTR__textures/kanji/gMsgKanji81DFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81DFEmptyTex[] = dgMsgKanji81DFEmptyTex; + +#define dgMsgKanji81E0ApproximatelyEqualToTex "__OTR__textures/kanji/gMsgKanji81E0ApproximatelyEqualToTex" +static const ALIGN_ASSET(2) char gMsgKanji81E0ApproximatelyEqualToTex[] = dgMsgKanji81E0ApproximatelyEqualToTex; + +#define dgMsgKanji81E1MuchLessThanTex "__OTR__textures/kanji/gMsgKanji81E1MuchLessThanTex" +static const ALIGN_ASSET(2) char gMsgKanji81E1MuchLessThanTex[] = dgMsgKanji81E1MuchLessThanTex; + +#define dgMsgKanji81E2MuchGreaterThanTex "__OTR__textures/kanji/gMsgKanji81E2MuchGreaterThanTex" +static const ALIGN_ASSET(2) char gMsgKanji81E2MuchGreaterThanTex[] = dgMsgKanji81E2MuchGreaterThanTex; + +#define dgMsgKanji81E3SquareRootTex "__OTR__textures/kanji/gMsgKanji81E3SquareRootTex" +static const ALIGN_ASSET(2) char gMsgKanji81E3SquareRootTex[] = dgMsgKanji81E3SquareRootTex; + +#define dgMsgKanji81E4SimilarTex "__OTR__textures/kanji/gMsgKanji81E4SimilarTex" +static const ALIGN_ASSET(2) char gMsgKanji81E4SimilarTex[] = dgMsgKanji81E4SimilarTex; + +#define dgMsgKanji81E5ProportionalTex "__OTR__textures/kanji/gMsgKanji81E5ProportionalTex" +static const ALIGN_ASSET(2) char gMsgKanji81E5ProportionalTex[] = dgMsgKanji81E5ProportionalTex; + +#define dgMsgKanji81E6BecauseTex "__OTR__textures/kanji/gMsgKanji81E6BecauseTex" +static const ALIGN_ASSET(2) char gMsgKanji81E6BecauseTex[] = dgMsgKanji81E6BecauseTex; + +#define dgMsgKanji81E7IntegralTex "__OTR__textures/kanji/gMsgKanji81E7IntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji81E7IntegralTex[] = dgMsgKanji81E7IntegralTex; + +#define dgMsgKanji81E8DoubleIntegralTex "__OTR__textures/kanji/gMsgKanji81E8DoubleIntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji81E8DoubleIntegralTex[] = dgMsgKanji81E8DoubleIntegralTex; + +#define dgMsgKanji81F0EmptyTex "__OTR__textures/kanji/gMsgKanji81F0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F0EmptyTex[] = dgMsgKanji81F0EmptyTex; + +#define dgMsgKanji81F1EmptyTex "__OTR__textures/kanji/gMsgKanji81F1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F1EmptyTex[] = dgMsgKanji81F1EmptyTex; + +#define dgMsgKanji81F2EmptyTex "__OTR__textures/kanji/gMsgKanji81F2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F2EmptyTex[] = dgMsgKanji81F2EmptyTex; + +#define dgMsgKanji81F3EmptyTex "__OTR__textures/kanji/gMsgKanji81F3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F3EmptyTex[] = dgMsgKanji81F3EmptyTex; + +#define dgMsgKanji81F4EmptyTex "__OTR__textures/kanji/gMsgKanji81F4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F4EmptyTex[] = dgMsgKanji81F4EmptyTex; + +#define dgMsgKanji81F5EmptyTex "__OTR__textures/kanji/gMsgKanji81F5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F5EmptyTex[] = dgMsgKanji81F5EmptyTex; + +#define dgMsgKanji81F6EmptyTex "__OTR__textures/kanji/gMsgKanji81F6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F6EmptyTex[] = dgMsgKanji81F6EmptyTex; + +#define dgMsgKanji81F7EmptyTex "__OTR__textures/kanji/gMsgKanji81F7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81F7EmptyTex[] = dgMsgKanji81F7EmptyTex; + +#define dgMsgKanji81FCEmptyTex "__OTR__textures/kanji/gMsgKanji81FCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji81FCEmptyTex[] = dgMsgKanji81FCEmptyTex; + +#define dgMsgKanji824FZeroTex "__OTR__textures/kanji/gMsgKanji824FZeroTex" +static const ALIGN_ASSET(2) char gMsgKanji824FZeroTex[] = dgMsgKanji824FZeroTex; + +#define dgMsgKanji8250OneTex "__OTR__textures/kanji/gMsgKanji8250OneTex" +static const ALIGN_ASSET(2) char gMsgKanji8250OneTex[] = dgMsgKanji8250OneTex; + +#define dgMsgKanji8251TwoTex "__OTR__textures/kanji/gMsgKanji8251TwoTex" +static const ALIGN_ASSET(2) char gMsgKanji8251TwoTex[] = dgMsgKanji8251TwoTex; + +#define dgMsgKanji8252ThreeTex "__OTR__textures/kanji/gMsgKanji8252ThreeTex" +static const ALIGN_ASSET(2) char gMsgKanji8252ThreeTex[] = dgMsgKanji8252ThreeTex; + +#define dgMsgKanji8253FourTex "__OTR__textures/kanji/gMsgKanji8253FourTex" +static const ALIGN_ASSET(2) char gMsgKanji8253FourTex[] = dgMsgKanji8253FourTex; + +#define dgMsgKanji8254FiveTex "__OTR__textures/kanji/gMsgKanji8254FiveTex" +static const ALIGN_ASSET(2) char gMsgKanji8254FiveTex[] = dgMsgKanji8254FiveTex; + +#define dgMsgKanji8255SixTex "__OTR__textures/kanji/gMsgKanji8255SixTex" +static const ALIGN_ASSET(2) char gMsgKanji8255SixTex[] = dgMsgKanji8255SixTex; + +#define dgMsgKanji8256SevenTex "__OTR__textures/kanji/gMsgKanji8256SevenTex" +static const ALIGN_ASSET(2) char gMsgKanji8256SevenTex[] = dgMsgKanji8256SevenTex; + +#define dgMsgKanji8257EightTex "__OTR__textures/kanji/gMsgKanji8257EightTex" +static const ALIGN_ASSET(2) char gMsgKanji8257EightTex[] = dgMsgKanji8257EightTex; + +#define dgMsgKanji8258NineTex "__OTR__textures/kanji/gMsgKanji8258NineTex" +static const ALIGN_ASSET(2) char gMsgKanji8258NineTex[] = dgMsgKanji8258NineTex; + +#define dgMsgKanji8260CapitalATex "__OTR__textures/kanji/gMsgKanji8260CapitalATex" +static const ALIGN_ASSET(2) char gMsgKanji8260CapitalATex[] = dgMsgKanji8260CapitalATex; + +#define dgMsgKanji8261CapitalBTex "__OTR__textures/kanji/gMsgKanji8261CapitalBTex" +static const ALIGN_ASSET(2) char gMsgKanji8261CapitalBTex[] = dgMsgKanji8261CapitalBTex; + +#define dgMsgKanji8262CapitalCTex "__OTR__textures/kanji/gMsgKanji8262CapitalCTex" +static const ALIGN_ASSET(2) char gMsgKanji8262CapitalCTex[] = dgMsgKanji8262CapitalCTex; + +#define dgMsgKanji8263CapitalDTex "__OTR__textures/kanji/gMsgKanji8263CapitalDTex" +static const ALIGN_ASSET(2) char gMsgKanji8263CapitalDTex[] = dgMsgKanji8263CapitalDTex; + +#define dgMsgKanji8264CapitalETex "__OTR__textures/kanji/gMsgKanji8264CapitalETex" +static const ALIGN_ASSET(2) char gMsgKanji8264CapitalETex[] = dgMsgKanji8264CapitalETex; + +#define dgMsgKanji8265CapitalFTex "__OTR__textures/kanji/gMsgKanji8265CapitalFTex" +static const ALIGN_ASSET(2) char gMsgKanji8265CapitalFTex[] = dgMsgKanji8265CapitalFTex; + +#define dgMsgKanji8266CapitalGTex "__OTR__textures/kanji/gMsgKanji8266CapitalGTex" +static const ALIGN_ASSET(2) char gMsgKanji8266CapitalGTex[] = dgMsgKanji8266CapitalGTex; + +#define dgMsgKanji8267CapitalHTex "__OTR__textures/kanji/gMsgKanji8267CapitalHTex" +static const ALIGN_ASSET(2) char gMsgKanji8267CapitalHTex[] = dgMsgKanji8267CapitalHTex; + +#define dgMsgKanji8268CapitalITex "__OTR__textures/kanji/gMsgKanji8268CapitalITex" +static const ALIGN_ASSET(2) char gMsgKanji8268CapitalITex[] = dgMsgKanji8268CapitalITex; + +#define dgMsgKanji8269CapitalJTex "__OTR__textures/kanji/gMsgKanji8269CapitalJTex" +static const ALIGN_ASSET(2) char gMsgKanji8269CapitalJTex[] = dgMsgKanji8269CapitalJTex; + +#define dgMsgKanji826ACapitalKTex "__OTR__textures/kanji/gMsgKanji826ACapitalKTex" +static const ALIGN_ASSET(2) char gMsgKanji826ACapitalKTex[] = dgMsgKanji826ACapitalKTex; + +#define dgMsgKanji826BCapitalLTex "__OTR__textures/kanji/gMsgKanji826BCapitalLTex" +static const ALIGN_ASSET(2) char gMsgKanji826BCapitalLTex[] = dgMsgKanji826BCapitalLTex; + +#define dgMsgKanji826CCapitalMTex "__OTR__textures/kanji/gMsgKanji826CCapitalMTex" +static const ALIGN_ASSET(2) char gMsgKanji826CCapitalMTex[] = dgMsgKanji826CCapitalMTex; + +#define dgMsgKanji826DCapitalNTex "__OTR__textures/kanji/gMsgKanji826DCapitalNTex" +static const ALIGN_ASSET(2) char gMsgKanji826DCapitalNTex[] = dgMsgKanji826DCapitalNTex; + +#define dgMsgKanji826ECapitalOTex "__OTR__textures/kanji/gMsgKanji826ECapitalOTex" +static const ALIGN_ASSET(2) char gMsgKanji826ECapitalOTex[] = dgMsgKanji826ECapitalOTex; + +#define dgMsgKanji826FCapitalPTex "__OTR__textures/kanji/gMsgKanji826FCapitalPTex" +static const ALIGN_ASSET(2) char gMsgKanji826FCapitalPTex[] = dgMsgKanji826FCapitalPTex; + +#define dgMsgKanji8270CapitalQTex "__OTR__textures/kanji/gMsgKanji8270CapitalQTex" +static const ALIGN_ASSET(2) char gMsgKanji8270CapitalQTex[] = dgMsgKanji8270CapitalQTex; + +#define dgMsgKanji8271CapitalRTex "__OTR__textures/kanji/gMsgKanji8271CapitalRTex" +static const ALIGN_ASSET(2) char gMsgKanji8271CapitalRTex[] = dgMsgKanji8271CapitalRTex; + +#define dgMsgKanji8272CapitalSTex "__OTR__textures/kanji/gMsgKanji8272CapitalSTex" +static const ALIGN_ASSET(2) char gMsgKanji8272CapitalSTex[] = dgMsgKanji8272CapitalSTex; + +#define dgMsgKanji8273CapitalTTex "__OTR__textures/kanji/gMsgKanji8273CapitalTTex" +static const ALIGN_ASSET(2) char gMsgKanji8273CapitalTTex[] = dgMsgKanji8273CapitalTTex; + +#define dgMsgKanji8274CapitalUTex "__OTR__textures/kanji/gMsgKanji8274CapitalUTex" +static const ALIGN_ASSET(2) char gMsgKanji8274CapitalUTex[] = dgMsgKanji8274CapitalUTex; + +#define dgMsgKanji8275CapitalVTex "__OTR__textures/kanji/gMsgKanji8275CapitalVTex" +static const ALIGN_ASSET(2) char gMsgKanji8275CapitalVTex[] = dgMsgKanji8275CapitalVTex; + +#define dgMsgKanji8276CapitalWTex "__OTR__textures/kanji/gMsgKanji8276CapitalWTex" +static const ALIGN_ASSET(2) char gMsgKanji8276CapitalWTex[] = dgMsgKanji8276CapitalWTex; + +#define dgMsgKanji8277CapitalXTex "__OTR__textures/kanji/gMsgKanji8277CapitalXTex" +static const ALIGN_ASSET(2) char gMsgKanji8277CapitalXTex[] = dgMsgKanji8277CapitalXTex; + +#define dgMsgKanji8278CapitalYTex "__OTR__textures/kanji/gMsgKanji8278CapitalYTex" +static const ALIGN_ASSET(2) char gMsgKanji8278CapitalYTex[] = dgMsgKanji8278CapitalYTex; + +#define dgMsgKanji8279CapitalZTex "__OTR__textures/kanji/gMsgKanji8279CapitalZTex" +static const ALIGN_ASSET(2) char gMsgKanji8279CapitalZTex[] = dgMsgKanji8279CapitalZTex; + +#define dgMsgKanji8281LowercaseATex "__OTR__textures/kanji/gMsgKanji8281LowercaseATex" +static const ALIGN_ASSET(2) char gMsgKanji8281LowercaseATex[] = dgMsgKanji8281LowercaseATex; + +#define dgMsgKanji8282LowercaseBTex "__OTR__textures/kanji/gMsgKanji8282LowercaseBTex" +static const ALIGN_ASSET(2) char gMsgKanji8282LowercaseBTex[] = dgMsgKanji8282LowercaseBTex; + +#define dgMsgKanji8283LowercaseCTex "__OTR__textures/kanji/gMsgKanji8283LowercaseCTex" +static const ALIGN_ASSET(2) char gMsgKanji8283LowercaseCTex[] = dgMsgKanji8283LowercaseCTex; + +#define dgMsgKanji8284LowercaseDTex "__OTR__textures/kanji/gMsgKanji8284LowercaseDTex" +static const ALIGN_ASSET(2) char gMsgKanji8284LowercaseDTex[] = dgMsgKanji8284LowercaseDTex; + +#define dgMsgKanji8285LowercaseETex "__OTR__textures/kanji/gMsgKanji8285LowercaseETex" +static const ALIGN_ASSET(2) char gMsgKanji8285LowercaseETex[] = dgMsgKanji8285LowercaseETex; + +#define dgMsgKanji8286LowercaseFTex "__OTR__textures/kanji/gMsgKanji8286LowercaseFTex" +static const ALIGN_ASSET(2) char gMsgKanji8286LowercaseFTex[] = dgMsgKanji8286LowercaseFTex; + +#define dgMsgKanji8287LowercaseGTex "__OTR__textures/kanji/gMsgKanji8287LowercaseGTex" +static const ALIGN_ASSET(2) char gMsgKanji8287LowercaseGTex[] = dgMsgKanji8287LowercaseGTex; + +#define dgMsgKanji8288LowercaseHTex "__OTR__textures/kanji/gMsgKanji8288LowercaseHTex" +static const ALIGN_ASSET(2) char gMsgKanji8288LowercaseHTex[] = dgMsgKanji8288LowercaseHTex; + +#define dgMsgKanji8289LowercaseITex "__OTR__textures/kanji/gMsgKanji8289LowercaseITex" +static const ALIGN_ASSET(2) char gMsgKanji8289LowercaseITex[] = dgMsgKanji8289LowercaseITex; + +#define dgMsgKanji828ALowercaseJTex "__OTR__textures/kanji/gMsgKanji828ALowercaseJTex" +static const ALIGN_ASSET(2) char gMsgKanji828ALowercaseJTex[] = dgMsgKanji828ALowercaseJTex; + +#define dgMsgKanji828BLowercaseKTex "__OTR__textures/kanji/gMsgKanji828BLowercaseKTex" +static const ALIGN_ASSET(2) char gMsgKanji828BLowercaseKTex[] = dgMsgKanji828BLowercaseKTex; + +#define dgMsgKanji828CLowercaseLTex "__OTR__textures/kanji/gMsgKanji828CLowercaseLTex" +static const ALIGN_ASSET(2) char gMsgKanji828CLowercaseLTex[] = dgMsgKanji828CLowercaseLTex; + +#define dgMsgKanji828DLowercaseMTex "__OTR__textures/kanji/gMsgKanji828DLowercaseMTex" +static const ALIGN_ASSET(2) char gMsgKanji828DLowercaseMTex[] = dgMsgKanji828DLowercaseMTex; + +#define dgMsgKanji828ELowercaseNTex "__OTR__textures/kanji/gMsgKanji828ELowercaseNTex" +static const ALIGN_ASSET(2) char gMsgKanji828ELowercaseNTex[] = dgMsgKanji828ELowercaseNTex; + +#define dgMsgKanji828FLowercaseOTex "__OTR__textures/kanji/gMsgKanji828FLowercaseOTex" +static const ALIGN_ASSET(2) char gMsgKanji828FLowercaseOTex[] = dgMsgKanji828FLowercaseOTex; + +#define dgMsgKanji8290LowercasePTex "__OTR__textures/kanji/gMsgKanji8290LowercasePTex" +static const ALIGN_ASSET(2) char gMsgKanji8290LowercasePTex[] = dgMsgKanji8290LowercasePTex; + +#define dgMsgKanji8291LowercaseQTex "__OTR__textures/kanji/gMsgKanji8291LowercaseQTex" +static const ALIGN_ASSET(2) char gMsgKanji8291LowercaseQTex[] = dgMsgKanji8291LowercaseQTex; + +#define dgMsgKanji8292LowercaseRTex "__OTR__textures/kanji/gMsgKanji8292LowercaseRTex" +static const ALIGN_ASSET(2) char gMsgKanji8292LowercaseRTex[] = dgMsgKanji8292LowercaseRTex; + +#define dgMsgKanji8293LowercaseSTex "__OTR__textures/kanji/gMsgKanji8293LowercaseSTex" +static const ALIGN_ASSET(2) char gMsgKanji8293LowercaseSTex[] = dgMsgKanji8293LowercaseSTex; + +#define dgMsgKanji8294LowercaseTTex "__OTR__textures/kanji/gMsgKanji8294LowercaseTTex" +static const ALIGN_ASSET(2) char gMsgKanji8294LowercaseTTex[] = dgMsgKanji8294LowercaseTTex; + +#define dgMsgKanji8295LowercaseUTex "__OTR__textures/kanji/gMsgKanji8295LowercaseUTex" +static const ALIGN_ASSET(2) char gMsgKanji8295LowercaseUTex[] = dgMsgKanji8295LowercaseUTex; + +#define dgMsgKanji8296LowercaseVTex "__OTR__textures/kanji/gMsgKanji8296LowercaseVTex" +static const ALIGN_ASSET(2) char gMsgKanji8296LowercaseVTex[] = dgMsgKanji8296LowercaseVTex; + +#define dgMsgKanji8297LowercaseWTex "__OTR__textures/kanji/gMsgKanji8297LowercaseWTex" +static const ALIGN_ASSET(2) char gMsgKanji8297LowercaseWTex[] = dgMsgKanji8297LowercaseWTex; + +#define dgMsgKanji8298LowercaseXTex "__OTR__textures/kanji/gMsgKanji8298LowercaseXTex" +static const ALIGN_ASSET(2) char gMsgKanji8298LowercaseXTex[] = dgMsgKanji8298LowercaseXTex; + +#define dgMsgKanji8299LowercaseYTex "__OTR__textures/kanji/gMsgKanji8299LowercaseYTex" +static const ALIGN_ASSET(2) char gMsgKanji8299LowercaseYTex[] = dgMsgKanji8299LowercaseYTex; + +#define dgMsgKanji829ALowercaseZTex "__OTR__textures/kanji/gMsgKanji829ALowercaseZTex" +static const ALIGN_ASSET(2) char gMsgKanji829ALowercaseZTex[] = dgMsgKanji829ALowercaseZTex; + +#define dgMsgKanji829FHiraganaSmallATex "__OTR__textures/kanji/gMsgKanji829FHiraganaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji829FHiraganaSmallATex[] = dgMsgKanji829FHiraganaSmallATex; + +#define dgMsgKanji82A0HiraganaATex "__OTR__textures/kanji/gMsgKanji82A0HiraganaATex" +static const ALIGN_ASSET(2) char gMsgKanji82A0HiraganaATex[] = dgMsgKanji82A0HiraganaATex; + +#define dgMsgKanji82A1HiraganaSmallITex "__OTR__textures/kanji/gMsgKanji82A1HiraganaSmallITex" +static const ALIGN_ASSET(2) char gMsgKanji82A1HiraganaSmallITex[] = dgMsgKanji82A1HiraganaSmallITex; + +#define dgMsgKanji82A2HiraganaITex "__OTR__textures/kanji/gMsgKanji82A2HiraganaITex" +static const ALIGN_ASSET(2) char gMsgKanji82A2HiraganaITex[] = dgMsgKanji82A2HiraganaITex; + +#define dgMsgKanji82A3HiraganaSmallUTex "__OTR__textures/kanji/gMsgKanji82A3HiraganaSmallUTex" +static const ALIGN_ASSET(2) char gMsgKanji82A3HiraganaSmallUTex[] = dgMsgKanji82A3HiraganaSmallUTex; + +#define dgMsgKanji82A4HiraganaUTex "__OTR__textures/kanji/gMsgKanji82A4HiraganaUTex" +static const ALIGN_ASSET(2) char gMsgKanji82A4HiraganaUTex[] = dgMsgKanji82A4HiraganaUTex; + +#define dgMsgKanji82A5HiraganaSmallETex "__OTR__textures/kanji/gMsgKanji82A5HiraganaSmallETex" +static const ALIGN_ASSET(2) char gMsgKanji82A5HiraganaSmallETex[] = dgMsgKanji82A5HiraganaSmallETex; + +#define dgMsgKanji82A6HiraganaETex "__OTR__textures/kanji/gMsgKanji82A6HiraganaETex" +static const ALIGN_ASSET(2) char gMsgKanji82A6HiraganaETex[] = dgMsgKanji82A6HiraganaETex; + +#define dgMsgKanji82A7HiraganaSmallOTex "__OTR__textures/kanji/gMsgKanji82A7HiraganaSmallOTex" +static const ALIGN_ASSET(2) char gMsgKanji82A7HiraganaSmallOTex[] = dgMsgKanji82A7HiraganaSmallOTex; + +#define dgMsgKanji82A8HiraganaOTex "__OTR__textures/kanji/gMsgKanji82A8HiraganaOTex" +static const ALIGN_ASSET(2) char gMsgKanji82A8HiraganaOTex[] = dgMsgKanji82A8HiraganaOTex; + +#define dgMsgKanji82A9HiraganaKaTex "__OTR__textures/kanji/gMsgKanji82A9HiraganaKaTex" +static const ALIGN_ASSET(2) char gMsgKanji82A9HiraganaKaTex[] = dgMsgKanji82A9HiraganaKaTex; + +#define dgMsgKanji82AAHiraganaGaTex "__OTR__textures/kanji/gMsgKanji82AAHiraganaGaTex" +static const ALIGN_ASSET(2) char gMsgKanji82AAHiraganaGaTex[] = dgMsgKanji82AAHiraganaGaTex; + +#define dgMsgKanji82ABHiraganaKiTex "__OTR__textures/kanji/gMsgKanji82ABHiraganaKiTex" +static const ALIGN_ASSET(2) char gMsgKanji82ABHiraganaKiTex[] = dgMsgKanji82ABHiraganaKiTex; + +#define dgMsgKanji82ACHiraganaGiTex "__OTR__textures/kanji/gMsgKanji82ACHiraganaGiTex" +static const ALIGN_ASSET(2) char gMsgKanji82ACHiraganaGiTex[] = dgMsgKanji82ACHiraganaGiTex; + +#define dgMsgKanji82ADHiraganaKuTex "__OTR__textures/kanji/gMsgKanji82ADHiraganaKuTex" +static const ALIGN_ASSET(2) char gMsgKanji82ADHiraganaKuTex[] = dgMsgKanji82ADHiraganaKuTex; + +#define dgMsgKanji82AEHiraganaGuTex "__OTR__textures/kanji/gMsgKanji82AEHiraganaGuTex" +static const ALIGN_ASSET(2) char gMsgKanji82AEHiraganaGuTex[] = dgMsgKanji82AEHiraganaGuTex; + +#define dgMsgKanji82AFHiraganaKeTex "__OTR__textures/kanji/gMsgKanji82AFHiraganaKeTex" +static const ALIGN_ASSET(2) char gMsgKanji82AFHiraganaKeTex[] = dgMsgKanji82AFHiraganaKeTex; + +#define dgMsgKanji82B0HiraganaGeTex "__OTR__textures/kanji/gMsgKanji82B0HiraganaGeTex" +static const ALIGN_ASSET(2) char gMsgKanji82B0HiraganaGeTex[] = dgMsgKanji82B0HiraganaGeTex; + +#define dgMsgKanji82B1HiraganaKoTex "__OTR__textures/kanji/gMsgKanji82B1HiraganaKoTex" +static const ALIGN_ASSET(2) char gMsgKanji82B1HiraganaKoTex[] = dgMsgKanji82B1HiraganaKoTex; + +#define dgMsgKanji82B2HiraganaGoTex "__OTR__textures/kanji/gMsgKanji82B2HiraganaGoTex" +static const ALIGN_ASSET(2) char gMsgKanji82B2HiraganaGoTex[] = dgMsgKanji82B2HiraganaGoTex; + +#define dgMsgKanji82B3HiraganaSaTex "__OTR__textures/kanji/gMsgKanji82B3HiraganaSaTex" +static const ALIGN_ASSET(2) char gMsgKanji82B3HiraganaSaTex[] = dgMsgKanji82B3HiraganaSaTex; + +#define dgMsgKanji82B4HiraganaZaTex "__OTR__textures/kanji/gMsgKanji82B4HiraganaZaTex" +static const ALIGN_ASSET(2) char gMsgKanji82B4HiraganaZaTex[] = dgMsgKanji82B4HiraganaZaTex; + +#define dgMsgKanji82B5HiraganaShiTex "__OTR__textures/kanji/gMsgKanji82B5HiraganaShiTex" +static const ALIGN_ASSET(2) char gMsgKanji82B5HiraganaShiTex[] = dgMsgKanji82B5HiraganaShiTex; + +#define dgMsgKanji82B6HiraganaJiTex "__OTR__textures/kanji/gMsgKanji82B6HiraganaJiTex" +static const ALIGN_ASSET(2) char gMsgKanji82B6HiraganaJiTex[] = dgMsgKanji82B6HiraganaJiTex; + +#define dgMsgKanji82B7HiraganaSuTex "__OTR__textures/kanji/gMsgKanji82B7HiraganaSuTex" +static const ALIGN_ASSET(2) char gMsgKanji82B7HiraganaSuTex[] = dgMsgKanji82B7HiraganaSuTex; + +#define dgMsgKanji82B8HiraganaZuTex "__OTR__textures/kanji/gMsgKanji82B8HiraganaZuTex" +static const ALIGN_ASSET(2) char gMsgKanji82B8HiraganaZuTex[] = dgMsgKanji82B8HiraganaZuTex; + +#define dgMsgKanji82B9HiraganaSeTex "__OTR__textures/kanji/gMsgKanji82B9HiraganaSeTex" +static const ALIGN_ASSET(2) char gMsgKanji82B9HiraganaSeTex[] = dgMsgKanji82B9HiraganaSeTex; + +#define dgMsgKanji82BAHiraganaZeTex "__OTR__textures/kanji/gMsgKanji82BAHiraganaZeTex" +static const ALIGN_ASSET(2) char gMsgKanji82BAHiraganaZeTex[] = dgMsgKanji82BAHiraganaZeTex; + +#define dgMsgKanji82BBHiraganaSoTex "__OTR__textures/kanji/gMsgKanji82BBHiraganaSoTex" +static const ALIGN_ASSET(2) char gMsgKanji82BBHiraganaSoTex[] = dgMsgKanji82BBHiraganaSoTex; + +#define dgMsgKanji82BCHiraganaZoTex "__OTR__textures/kanji/gMsgKanji82BCHiraganaZoTex" +static const ALIGN_ASSET(2) char gMsgKanji82BCHiraganaZoTex[] = dgMsgKanji82BCHiraganaZoTex; + +#define dgMsgKanji82BDHiraganaTaTex "__OTR__textures/kanji/gMsgKanji82BDHiraganaTaTex" +static const ALIGN_ASSET(2) char gMsgKanji82BDHiraganaTaTex[] = dgMsgKanji82BDHiraganaTaTex; + +#define dgMsgKanji82BEHiraganaDaTex "__OTR__textures/kanji/gMsgKanji82BEHiraganaDaTex" +static const ALIGN_ASSET(2) char gMsgKanji82BEHiraganaDaTex[] = dgMsgKanji82BEHiraganaDaTex; + +#define dgMsgKanji82BFHiraganaChiTex "__OTR__textures/kanji/gMsgKanji82BFHiraganaChiTex" +static const ALIGN_ASSET(2) char gMsgKanji82BFHiraganaChiTex[] = dgMsgKanji82BFHiraganaChiTex; + +#define dgMsgKanji82C0HiraganaDiTex "__OTR__textures/kanji/gMsgKanji82C0HiraganaDiTex" +static const ALIGN_ASSET(2) char gMsgKanji82C0HiraganaDiTex[] = dgMsgKanji82C0HiraganaDiTex; + +#define dgMsgKanji82C1HiraganaSmallTsuTex "__OTR__textures/kanji/gMsgKanji82C1HiraganaSmallTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji82C1HiraganaSmallTsuTex[] = dgMsgKanji82C1HiraganaSmallTsuTex; + +#define dgMsgKanji82C2HiraganaTsuTex "__OTR__textures/kanji/gMsgKanji82C2HiraganaTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji82C2HiraganaTsuTex[] = dgMsgKanji82C2HiraganaTsuTex; + +#define dgMsgKanji82C3HiraganaDuTex "__OTR__textures/kanji/gMsgKanji82C3HiraganaDuTex" +static const ALIGN_ASSET(2) char gMsgKanji82C3HiraganaDuTex[] = dgMsgKanji82C3HiraganaDuTex; + +#define dgMsgKanji82C4HiraganaTeTex "__OTR__textures/kanji/gMsgKanji82C4HiraganaTeTex" +static const ALIGN_ASSET(2) char gMsgKanji82C4HiraganaTeTex[] = dgMsgKanji82C4HiraganaTeTex; + +#define dgMsgKanji82C5HiraganaDeTex "__OTR__textures/kanji/gMsgKanji82C5HiraganaDeTex" +static const ALIGN_ASSET(2) char gMsgKanji82C5HiraganaDeTex[] = dgMsgKanji82C5HiraganaDeTex; + +#define dgMsgKanji82C6HiraganaToTex "__OTR__textures/kanji/gMsgKanji82C6HiraganaToTex" +static const ALIGN_ASSET(2) char gMsgKanji82C6HiraganaToTex[] = dgMsgKanji82C6HiraganaToTex; + +#define dgMsgKanji82C7HiraganaDoTex "__OTR__textures/kanji/gMsgKanji82C7HiraganaDoTex" +static const ALIGN_ASSET(2) char gMsgKanji82C7HiraganaDoTex[] = dgMsgKanji82C7HiraganaDoTex; + +#define dgMsgKanji82C8HiraganaNaTex "__OTR__textures/kanji/gMsgKanji82C8HiraganaNaTex" +static const ALIGN_ASSET(2) char gMsgKanji82C8HiraganaNaTex[] = dgMsgKanji82C8HiraganaNaTex; + +#define dgMsgKanji82C9HiraganaNiTex "__OTR__textures/kanji/gMsgKanji82C9HiraganaNiTex" +static const ALIGN_ASSET(2) char gMsgKanji82C9HiraganaNiTex[] = dgMsgKanji82C9HiraganaNiTex; + +#define dgMsgKanji82CAHiraganaNuTex "__OTR__textures/kanji/gMsgKanji82CAHiraganaNuTex" +static const ALIGN_ASSET(2) char gMsgKanji82CAHiraganaNuTex[] = dgMsgKanji82CAHiraganaNuTex; + +#define dgMsgKanji82CBHiraganaNeTex "__OTR__textures/kanji/gMsgKanji82CBHiraganaNeTex" +static const ALIGN_ASSET(2) char gMsgKanji82CBHiraganaNeTex[] = dgMsgKanji82CBHiraganaNeTex; + +#define dgMsgKanji82CCHiraganaNoTex "__OTR__textures/kanji/gMsgKanji82CCHiraganaNoTex" +static const ALIGN_ASSET(2) char gMsgKanji82CCHiraganaNoTex[] = dgMsgKanji82CCHiraganaNoTex; + +#define dgMsgKanji82CDHiraganaHaTex "__OTR__textures/kanji/gMsgKanji82CDHiraganaHaTex" +static const ALIGN_ASSET(2) char gMsgKanji82CDHiraganaHaTex[] = dgMsgKanji82CDHiraganaHaTex; + +#define dgMsgKanji82CEHiraganaBaTex "__OTR__textures/kanji/gMsgKanji82CEHiraganaBaTex" +static const ALIGN_ASSET(2) char gMsgKanji82CEHiraganaBaTex[] = dgMsgKanji82CEHiraganaBaTex; + +#define dgMsgKanji82CFHiraganaPaTex "__OTR__textures/kanji/gMsgKanji82CFHiraganaPaTex" +static const ALIGN_ASSET(2) char gMsgKanji82CFHiraganaPaTex[] = dgMsgKanji82CFHiraganaPaTex; + +#define dgMsgKanji82D0HiraganaHiTex "__OTR__textures/kanji/gMsgKanji82D0HiraganaHiTex" +static const ALIGN_ASSET(2) char gMsgKanji82D0HiraganaHiTex[] = dgMsgKanji82D0HiraganaHiTex; + +#define dgMsgKanji82D1HiraganaBiTex "__OTR__textures/kanji/gMsgKanji82D1HiraganaBiTex" +static const ALIGN_ASSET(2) char gMsgKanji82D1HiraganaBiTex[] = dgMsgKanji82D1HiraganaBiTex; + +#define dgMsgKanji82D2HiraganaPiTex "__OTR__textures/kanji/gMsgKanji82D2HiraganaPiTex" +static const ALIGN_ASSET(2) char gMsgKanji82D2HiraganaPiTex[] = dgMsgKanji82D2HiraganaPiTex; + +#define dgMsgKanji82D3HiraganaFuTex "__OTR__textures/kanji/gMsgKanji82D3HiraganaFuTex" +static const ALIGN_ASSET(2) char gMsgKanji82D3HiraganaFuTex[] = dgMsgKanji82D3HiraganaFuTex; + +#define dgMsgKanji82D4HiraganaBuTex "__OTR__textures/kanji/gMsgKanji82D4HiraganaBuTex" +static const ALIGN_ASSET(2) char gMsgKanji82D4HiraganaBuTex[] = dgMsgKanji82D4HiraganaBuTex; + +#define dgMsgKanji82D5HiraganaPuTex "__OTR__textures/kanji/gMsgKanji82D5HiraganaPuTex" +static const ALIGN_ASSET(2) char gMsgKanji82D5HiraganaPuTex[] = dgMsgKanji82D5HiraganaPuTex; + +#define dgMsgKanji82D6HiraganaHeTex "__OTR__textures/kanji/gMsgKanji82D6HiraganaHeTex" +static const ALIGN_ASSET(2) char gMsgKanji82D6HiraganaHeTex[] = dgMsgKanji82D6HiraganaHeTex; + +#define dgMsgKanji82D7HiraganaBeTex "__OTR__textures/kanji/gMsgKanji82D7HiraganaBeTex" +static const ALIGN_ASSET(2) char gMsgKanji82D7HiraganaBeTex[] = dgMsgKanji82D7HiraganaBeTex; + +#define dgMsgKanji82D8HiraganaPeTex "__OTR__textures/kanji/gMsgKanji82D8HiraganaPeTex" +static const ALIGN_ASSET(2) char gMsgKanji82D8HiraganaPeTex[] = dgMsgKanji82D8HiraganaPeTex; + +#define dgMsgKanji82D9HiraganaHoTex "__OTR__textures/kanji/gMsgKanji82D9HiraganaHoTex" +static const ALIGN_ASSET(2) char gMsgKanji82D9HiraganaHoTex[] = dgMsgKanji82D9HiraganaHoTex; + +#define dgMsgKanji82DAHiraganaBoTex "__OTR__textures/kanji/gMsgKanji82DAHiraganaBoTex" +static const ALIGN_ASSET(2) char gMsgKanji82DAHiraganaBoTex[] = dgMsgKanji82DAHiraganaBoTex; + +#define dgMsgKanji82DBHiraganaPoTex "__OTR__textures/kanji/gMsgKanji82DBHiraganaPoTex" +static const ALIGN_ASSET(2) char gMsgKanji82DBHiraganaPoTex[] = dgMsgKanji82DBHiraganaPoTex; + +#define dgMsgKanji82DCHiraganaMaTex "__OTR__textures/kanji/gMsgKanji82DCHiraganaMaTex" +static const ALIGN_ASSET(2) char gMsgKanji82DCHiraganaMaTex[] = dgMsgKanji82DCHiraganaMaTex; + +#define dgMsgKanji82DDHiraganaMiTex "__OTR__textures/kanji/gMsgKanji82DDHiraganaMiTex" +static const ALIGN_ASSET(2) char gMsgKanji82DDHiraganaMiTex[] = dgMsgKanji82DDHiraganaMiTex; + +#define dgMsgKanji82DEHiraganaMuTex "__OTR__textures/kanji/gMsgKanji82DEHiraganaMuTex" +static const ALIGN_ASSET(2) char gMsgKanji82DEHiraganaMuTex[] = dgMsgKanji82DEHiraganaMuTex; + +#define dgMsgKanji82DFHiraganaMeTex "__OTR__textures/kanji/gMsgKanji82DFHiraganaMeTex" +static const ALIGN_ASSET(2) char gMsgKanji82DFHiraganaMeTex[] = dgMsgKanji82DFHiraganaMeTex; + +#define dgMsgKanji82E0HiraganaMoTex "__OTR__textures/kanji/gMsgKanji82E0HiraganaMoTex" +static const ALIGN_ASSET(2) char gMsgKanji82E0HiraganaMoTex[] = dgMsgKanji82E0HiraganaMoTex; + +#define dgMsgKanji82E1HiraganaSmallYaTex "__OTR__textures/kanji/gMsgKanji82E1HiraganaSmallYaTex" +static const ALIGN_ASSET(2) char gMsgKanji82E1HiraganaSmallYaTex[] = dgMsgKanji82E1HiraganaSmallYaTex; + +#define dgMsgKanji82E2HiraganaYaTex "__OTR__textures/kanji/gMsgKanji82E2HiraganaYaTex" +static const ALIGN_ASSET(2) char gMsgKanji82E2HiraganaYaTex[] = dgMsgKanji82E2HiraganaYaTex; + +#define dgMsgKanji82E3HiraganaSmallYuTex "__OTR__textures/kanji/gMsgKanji82E3HiraganaSmallYuTex" +static const ALIGN_ASSET(2) char gMsgKanji82E3HiraganaSmallYuTex[] = dgMsgKanji82E3HiraganaSmallYuTex; + +#define dgMsgKanji82E4HiraganaYuTex "__OTR__textures/kanji/gMsgKanji82E4HiraganaYuTex" +static const ALIGN_ASSET(2) char gMsgKanji82E4HiraganaYuTex[] = dgMsgKanji82E4HiraganaYuTex; + +#define dgMsgKanji82E5HiraganaSmallYoTex "__OTR__textures/kanji/gMsgKanji82E5HiraganaSmallYoTex" +static const ALIGN_ASSET(2) char gMsgKanji82E5HiraganaSmallYoTex[] = dgMsgKanji82E5HiraganaSmallYoTex; + +#define dgMsgKanji82E6HiraganaYoTex "__OTR__textures/kanji/gMsgKanji82E6HiraganaYoTex" +static const ALIGN_ASSET(2) char gMsgKanji82E6HiraganaYoTex[] = dgMsgKanji82E6HiraganaYoTex; + +#define dgMsgKanji82E7HiraganaRaTex "__OTR__textures/kanji/gMsgKanji82E7HiraganaRaTex" +static const ALIGN_ASSET(2) char gMsgKanji82E7HiraganaRaTex[] = dgMsgKanji82E7HiraganaRaTex; + +#define dgMsgKanji82E8HiraganaRiTex "__OTR__textures/kanji/gMsgKanji82E8HiraganaRiTex" +static const ALIGN_ASSET(2) char gMsgKanji82E8HiraganaRiTex[] = dgMsgKanji82E8HiraganaRiTex; + +#define dgMsgKanji82E9HiraganaRuTex "__OTR__textures/kanji/gMsgKanji82E9HiraganaRuTex" +static const ALIGN_ASSET(2) char gMsgKanji82E9HiraganaRuTex[] = dgMsgKanji82E9HiraganaRuTex; + +#define dgMsgKanji82EAHiraganaReTex "__OTR__textures/kanji/gMsgKanji82EAHiraganaReTex" +static const ALIGN_ASSET(2) char gMsgKanji82EAHiraganaReTex[] = dgMsgKanji82EAHiraganaReTex; + +#define dgMsgKanji82EBHiraganaRoTex "__OTR__textures/kanji/gMsgKanji82EBHiraganaRoTex" +static const ALIGN_ASSET(2) char gMsgKanji82EBHiraganaRoTex[] = dgMsgKanji82EBHiraganaRoTex; + +#define dgMsgKanji82ECHiraganaSmallWaTex "__OTR__textures/kanji/gMsgKanji82ECHiraganaSmallWaTex" +static const ALIGN_ASSET(2) char gMsgKanji82ECHiraganaSmallWaTex[] = dgMsgKanji82ECHiraganaSmallWaTex; + +#define dgMsgKanji82EDHiraganaWaTex "__OTR__textures/kanji/gMsgKanji82EDHiraganaWaTex" +static const ALIGN_ASSET(2) char gMsgKanji82EDHiraganaWaTex[] = dgMsgKanji82EDHiraganaWaTex; + +#define dgMsgKanji82EEHiraganaWiTex "__OTR__textures/kanji/gMsgKanji82EEHiraganaWiTex" +static const ALIGN_ASSET(2) char gMsgKanji82EEHiraganaWiTex[] = dgMsgKanji82EEHiraganaWiTex; + +#define dgMsgKanji82EFHiraganaWeTex "__OTR__textures/kanji/gMsgKanji82EFHiraganaWeTex" +static const ALIGN_ASSET(2) char gMsgKanji82EFHiraganaWeTex[] = dgMsgKanji82EFHiraganaWeTex; + +#define dgMsgKanji82F0HiraganaWoTex "__OTR__textures/kanji/gMsgKanji82F0HiraganaWoTex" +static const ALIGN_ASSET(2) char gMsgKanji82F0HiraganaWoTex[] = dgMsgKanji82F0HiraganaWoTex; + +#define dgMsgKanji82F1HiraganaNTex "__OTR__textures/kanji/gMsgKanji82F1HiraganaNTex" +static const ALIGN_ASSET(2) char gMsgKanji82F1HiraganaNTex[] = dgMsgKanji82F1HiraganaNTex; + +#define dgMsgKanji82F2EmptyTex "__OTR__textures/kanji/gMsgKanji82F2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji82F2EmptyTex[] = dgMsgKanji82F2EmptyTex; + +#define dgMsgKanji8340KatakanaSmallATex "__OTR__textures/kanji/gMsgKanji8340KatakanaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji8340KatakanaSmallATex[] = dgMsgKanji8340KatakanaSmallATex; + +#define dgMsgKanji8341KatakanaATex "__OTR__textures/kanji/gMsgKanji8341KatakanaATex" +static const ALIGN_ASSET(2) char gMsgKanji8341KatakanaATex[] = dgMsgKanji8341KatakanaATex; + +#define dgMsgKanji8342KatakanaSmallITex "__OTR__textures/kanji/gMsgKanji8342KatakanaSmallITex" +static const ALIGN_ASSET(2) char gMsgKanji8342KatakanaSmallITex[] = dgMsgKanji8342KatakanaSmallITex; + +#define dgMsgKanji8343KatakanaITex "__OTR__textures/kanji/gMsgKanji8343KatakanaITex" +static const ALIGN_ASSET(2) char gMsgKanji8343KatakanaITex[] = dgMsgKanji8343KatakanaITex; + +#define dgMsgKanji8344KatakanaSmallUTex "__OTR__textures/kanji/gMsgKanji8344KatakanaSmallUTex" +static const ALIGN_ASSET(2) char gMsgKanji8344KatakanaSmallUTex[] = dgMsgKanji8344KatakanaSmallUTex; + +#define dgMsgKanji8345KatakanaUTex "__OTR__textures/kanji/gMsgKanji8345KatakanaUTex" +static const ALIGN_ASSET(2) char gMsgKanji8345KatakanaUTex[] = dgMsgKanji8345KatakanaUTex; + +#define dgMsgKanji8346KatakanaSmallETex "__OTR__textures/kanji/gMsgKanji8346KatakanaSmallETex" +static const ALIGN_ASSET(2) char gMsgKanji8346KatakanaSmallETex[] = dgMsgKanji8346KatakanaSmallETex; + +#define dgMsgKanji8347KatakanaETex "__OTR__textures/kanji/gMsgKanji8347KatakanaETex" +static const ALIGN_ASSET(2) char gMsgKanji8347KatakanaETex[] = dgMsgKanji8347KatakanaETex; + +#define dgMsgKanji8348KatakanaSmallOTex "__OTR__textures/kanji/gMsgKanji8348KatakanaSmallOTex" +static const ALIGN_ASSET(2) char gMsgKanji8348KatakanaSmallOTex[] = dgMsgKanji8348KatakanaSmallOTex; + +#define dgMsgKanji8349KatakanaOTex "__OTR__textures/kanji/gMsgKanji8349KatakanaOTex" +static const ALIGN_ASSET(2) char gMsgKanji8349KatakanaOTex[] = dgMsgKanji8349KatakanaOTex; + +#define dgMsgKanji834AKatakanaKaTex "__OTR__textures/kanji/gMsgKanji834AKatakanaKaTex" +static const ALIGN_ASSET(2) char gMsgKanji834AKatakanaKaTex[] = dgMsgKanji834AKatakanaKaTex; + +#define dgMsgKanji834BKatakanaGaTex "__OTR__textures/kanji/gMsgKanji834BKatakanaGaTex" +static const ALIGN_ASSET(2) char gMsgKanji834BKatakanaGaTex[] = dgMsgKanji834BKatakanaGaTex; + +#define dgMsgKanji834CKatakanaKiTex "__OTR__textures/kanji/gMsgKanji834CKatakanaKiTex" +static const ALIGN_ASSET(2) char gMsgKanji834CKatakanaKiTex[] = dgMsgKanji834CKatakanaKiTex; + +#define dgMsgKanji834DKatakanaGiTex "__OTR__textures/kanji/gMsgKanji834DKatakanaGiTex" +static const ALIGN_ASSET(2) char gMsgKanji834DKatakanaGiTex[] = dgMsgKanji834DKatakanaGiTex; + +#define dgMsgKanji834EKatakanaKuTex "__OTR__textures/kanji/gMsgKanji834EKatakanaKuTex" +static const ALIGN_ASSET(2) char gMsgKanji834EKatakanaKuTex[] = dgMsgKanji834EKatakanaKuTex; + +#define dgMsgKanji834FKatakanaGuTex "__OTR__textures/kanji/gMsgKanji834FKatakanaGuTex" +static const ALIGN_ASSET(2) char gMsgKanji834FKatakanaGuTex[] = dgMsgKanji834FKatakanaGuTex; + +#define dgMsgKanji8350KatakanaKeTex "__OTR__textures/kanji/gMsgKanji8350KatakanaKeTex" +static const ALIGN_ASSET(2) char gMsgKanji8350KatakanaKeTex[] = dgMsgKanji8350KatakanaKeTex; + +#define dgMsgKanji8351KatakanaGeTex "__OTR__textures/kanji/gMsgKanji8351KatakanaGeTex" +static const ALIGN_ASSET(2) char gMsgKanji8351KatakanaGeTex[] = dgMsgKanji8351KatakanaGeTex; + +#define dgMsgKanji8352KatakanaKoTex "__OTR__textures/kanji/gMsgKanji8352KatakanaKoTex" +static const ALIGN_ASSET(2) char gMsgKanji8352KatakanaKoTex[] = dgMsgKanji8352KatakanaKoTex; + +#define dgMsgKanji8353KatakanaGoTex "__OTR__textures/kanji/gMsgKanji8353KatakanaGoTex" +static const ALIGN_ASSET(2) char gMsgKanji8353KatakanaGoTex[] = dgMsgKanji8353KatakanaGoTex; + +#define dgMsgKanji8354KatakanaSaTex "__OTR__textures/kanji/gMsgKanji8354KatakanaSaTex" +static const ALIGN_ASSET(2) char gMsgKanji8354KatakanaSaTex[] = dgMsgKanji8354KatakanaSaTex; + +#define dgMsgKanji8355KatakanaZaTex "__OTR__textures/kanji/gMsgKanji8355KatakanaZaTex" +static const ALIGN_ASSET(2) char gMsgKanji8355KatakanaZaTex[] = dgMsgKanji8355KatakanaZaTex; + +#define dgMsgKanji8356KatakanaShiTex "__OTR__textures/kanji/gMsgKanji8356KatakanaShiTex" +static const ALIGN_ASSET(2) char gMsgKanji8356KatakanaShiTex[] = dgMsgKanji8356KatakanaShiTex; + +#define dgMsgKanji8357KatakanaJiTex "__OTR__textures/kanji/gMsgKanji8357KatakanaJiTex" +static const ALIGN_ASSET(2) char gMsgKanji8357KatakanaJiTex[] = dgMsgKanji8357KatakanaJiTex; + +#define dgMsgKanji8358KatakanaSuTex "__OTR__textures/kanji/gMsgKanji8358KatakanaSuTex" +static const ALIGN_ASSET(2) char gMsgKanji8358KatakanaSuTex[] = dgMsgKanji8358KatakanaSuTex; + +#define dgMsgKanji8359KatakanaZuTex "__OTR__textures/kanji/gMsgKanji8359KatakanaZuTex" +static const ALIGN_ASSET(2) char gMsgKanji8359KatakanaZuTex[] = dgMsgKanji8359KatakanaZuTex; + +#define dgMsgKanji835AKatakanaSeTex "__OTR__textures/kanji/gMsgKanji835AKatakanaSeTex" +static const ALIGN_ASSET(2) char gMsgKanji835AKatakanaSeTex[] = dgMsgKanji835AKatakanaSeTex; + +#define dgMsgKanji835BKatakanaZeTex "__OTR__textures/kanji/gMsgKanji835BKatakanaZeTex" +static const ALIGN_ASSET(2) char gMsgKanji835BKatakanaZeTex[] = dgMsgKanji835BKatakanaZeTex; + +#define dgMsgKanji835CKatakanaSoTex "__OTR__textures/kanji/gMsgKanji835CKatakanaSoTex" +static const ALIGN_ASSET(2) char gMsgKanji835CKatakanaSoTex[] = dgMsgKanji835CKatakanaSoTex; + +#define dgMsgKanji835DKatakanaZoTex "__OTR__textures/kanji/gMsgKanji835DKatakanaZoTex" +static const ALIGN_ASSET(2) char gMsgKanji835DKatakanaZoTex[] = dgMsgKanji835DKatakanaZoTex; + +#define dgMsgKanji835EKatakanaTaTex "__OTR__textures/kanji/gMsgKanji835EKatakanaTaTex" +static const ALIGN_ASSET(2) char gMsgKanji835EKatakanaTaTex[] = dgMsgKanji835EKatakanaTaTex; + +#define dgMsgKanji835FKatakanaDaTex "__OTR__textures/kanji/gMsgKanji835FKatakanaDaTex" +static const ALIGN_ASSET(2) char gMsgKanji835FKatakanaDaTex[] = dgMsgKanji835FKatakanaDaTex; + +#define dgMsgKanji8360KatakanaChiTex "__OTR__textures/kanji/gMsgKanji8360KatakanaChiTex" +static const ALIGN_ASSET(2) char gMsgKanji8360KatakanaChiTex[] = dgMsgKanji8360KatakanaChiTex; + +#define dgMsgKanji8361KatakanaDiTex "__OTR__textures/kanji/gMsgKanji8361KatakanaDiTex" +static const ALIGN_ASSET(2) char gMsgKanji8361KatakanaDiTex[] = dgMsgKanji8361KatakanaDiTex; + +#define dgMsgKanji8362KatakanaSmallTsuTex "__OTR__textures/kanji/gMsgKanji8362KatakanaSmallTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji8362KatakanaSmallTsuTex[] = dgMsgKanji8362KatakanaSmallTsuTex; + +#define dgMsgKanji8363KatakanaTsuTex "__OTR__textures/kanji/gMsgKanji8363KatakanaTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji8363KatakanaTsuTex[] = dgMsgKanji8363KatakanaTsuTex; + +#define dgMsgKanji8364KatakanaDuTex "__OTR__textures/kanji/gMsgKanji8364KatakanaDuTex" +static const ALIGN_ASSET(2) char gMsgKanji8364KatakanaDuTex[] = dgMsgKanji8364KatakanaDuTex; + +#define dgMsgKanji8365KatakanaTeTex "__OTR__textures/kanji/gMsgKanji8365KatakanaTeTex" +static const ALIGN_ASSET(2) char gMsgKanji8365KatakanaTeTex[] = dgMsgKanji8365KatakanaTeTex; + +#define dgMsgKanji8366KatakanaDeTex "__OTR__textures/kanji/gMsgKanji8366KatakanaDeTex" +static const ALIGN_ASSET(2) char gMsgKanji8366KatakanaDeTex[] = dgMsgKanji8366KatakanaDeTex; + +#define dgMsgKanji8367KatakanaToTex "__OTR__textures/kanji/gMsgKanji8367KatakanaToTex" +static const ALIGN_ASSET(2) char gMsgKanji8367KatakanaToTex[] = dgMsgKanji8367KatakanaToTex; + +#define dgMsgKanji8368KatakanaDoTex "__OTR__textures/kanji/gMsgKanji8368KatakanaDoTex" +static const ALIGN_ASSET(2) char gMsgKanji8368KatakanaDoTex[] = dgMsgKanji8368KatakanaDoTex; + +#define dgMsgKanji8369KatakanaNaTex "__OTR__textures/kanji/gMsgKanji8369KatakanaNaTex" +static const ALIGN_ASSET(2) char gMsgKanji8369KatakanaNaTex[] = dgMsgKanji8369KatakanaNaTex; + +#define dgMsgKanji836AKatakanaNiTex "__OTR__textures/kanji/gMsgKanji836AKatakanaNiTex" +static const ALIGN_ASSET(2) char gMsgKanji836AKatakanaNiTex[] = dgMsgKanji836AKatakanaNiTex; + +#define dgMsgKanji836BKatakanaNuTex "__OTR__textures/kanji/gMsgKanji836BKatakanaNuTex" +static const ALIGN_ASSET(2) char gMsgKanji836BKatakanaNuTex[] = dgMsgKanji836BKatakanaNuTex; + +#define dgMsgKanji836CKatakanaNeTex "__OTR__textures/kanji/gMsgKanji836CKatakanaNeTex" +static const ALIGN_ASSET(2) char gMsgKanji836CKatakanaNeTex[] = dgMsgKanji836CKatakanaNeTex; + +#define dgMsgKanji836DKatakanaNoTex "__OTR__textures/kanji/gMsgKanji836DKatakanaNoTex" +static const ALIGN_ASSET(2) char gMsgKanji836DKatakanaNoTex[] = dgMsgKanji836DKatakanaNoTex; + +#define dgMsgKanji836EKatakanaHaTex "__OTR__textures/kanji/gMsgKanji836EKatakanaHaTex" +static const ALIGN_ASSET(2) char gMsgKanji836EKatakanaHaTex[] = dgMsgKanji836EKatakanaHaTex; + +#define dgMsgKanji836FKatakanaBaTex "__OTR__textures/kanji/gMsgKanji836FKatakanaBaTex" +static const ALIGN_ASSET(2) char gMsgKanji836FKatakanaBaTex[] = dgMsgKanji836FKatakanaBaTex; + +#define dgMsgKanji8370KatakanaPaTex "__OTR__textures/kanji/gMsgKanji8370KatakanaPaTex" +static const ALIGN_ASSET(2) char gMsgKanji8370KatakanaPaTex[] = dgMsgKanji8370KatakanaPaTex; + +#define dgMsgKanji8371KatakanaHiTex "__OTR__textures/kanji/gMsgKanji8371KatakanaHiTex" +static const ALIGN_ASSET(2) char gMsgKanji8371KatakanaHiTex[] = dgMsgKanji8371KatakanaHiTex; + +#define dgMsgKanji8372KatakanaBiTex "__OTR__textures/kanji/gMsgKanji8372KatakanaBiTex" +static const ALIGN_ASSET(2) char gMsgKanji8372KatakanaBiTex[] = dgMsgKanji8372KatakanaBiTex; + +#define dgMsgKanji8373KatakanaPiTex "__OTR__textures/kanji/gMsgKanji8373KatakanaPiTex" +static const ALIGN_ASSET(2) char gMsgKanji8373KatakanaPiTex[] = dgMsgKanji8373KatakanaPiTex; + +#define dgMsgKanji8374KatakanaFuTex "__OTR__textures/kanji/gMsgKanji8374KatakanaFuTex" +static const ALIGN_ASSET(2) char gMsgKanji8374KatakanaFuTex[] = dgMsgKanji8374KatakanaFuTex; + +#define dgMsgKanji8375KatakanaBuTex "__OTR__textures/kanji/gMsgKanji8375KatakanaBuTex" +static const ALIGN_ASSET(2) char gMsgKanji8375KatakanaBuTex[] = dgMsgKanji8375KatakanaBuTex; + +#define dgMsgKanji8376KatakanaPuTex "__OTR__textures/kanji/gMsgKanji8376KatakanaPuTex" +static const ALIGN_ASSET(2) char gMsgKanji8376KatakanaPuTex[] = dgMsgKanji8376KatakanaPuTex; + +#define dgMsgKanji8377KatakanaHeTex "__OTR__textures/kanji/gMsgKanji8377KatakanaHeTex" +static const ALIGN_ASSET(2) char gMsgKanji8377KatakanaHeTex[] = dgMsgKanji8377KatakanaHeTex; + +#define dgMsgKanji8378KatakanaBeTex "__OTR__textures/kanji/gMsgKanji8378KatakanaBeTex" +static const ALIGN_ASSET(2) char gMsgKanji8378KatakanaBeTex[] = dgMsgKanji8378KatakanaBeTex; + +#define dgMsgKanji8379KatakanaPeTex "__OTR__textures/kanji/gMsgKanji8379KatakanaPeTex" +static const ALIGN_ASSET(2) char gMsgKanji8379KatakanaPeTex[] = dgMsgKanji8379KatakanaPeTex; + +#define dgMsgKanji837AKatakanaHoTex "__OTR__textures/kanji/gMsgKanji837AKatakanaHoTex" +static const ALIGN_ASSET(2) char gMsgKanji837AKatakanaHoTex[] = dgMsgKanji837AKatakanaHoTex; + +#define dgMsgKanji837BKatakanaBoTex "__OTR__textures/kanji/gMsgKanji837BKatakanaBoTex" +static const ALIGN_ASSET(2) char gMsgKanji837BKatakanaBoTex[] = dgMsgKanji837BKatakanaBoTex; + +#define dgMsgKanji837CKatakanaPoTex "__OTR__textures/kanji/gMsgKanji837CKatakanaPoTex" +static const ALIGN_ASSET(2) char gMsgKanji837CKatakanaPoTex[] = dgMsgKanji837CKatakanaPoTex; + +#define dgMsgKanji837DKatakanaMaTex "__OTR__textures/kanji/gMsgKanji837DKatakanaMaTex" +static const ALIGN_ASSET(2) char gMsgKanji837DKatakanaMaTex[] = dgMsgKanji837DKatakanaMaTex; + +#define dgMsgKanji837EKatakanaMiTex "__OTR__textures/kanji/gMsgKanji837EKatakanaMiTex" +static const ALIGN_ASSET(2) char gMsgKanji837EKatakanaMiTex[] = dgMsgKanji837EKatakanaMiTex; + +#define dgMsgKanji8380KatakanaMuTex "__OTR__textures/kanji/gMsgKanji8380KatakanaMuTex" +static const ALIGN_ASSET(2) char gMsgKanji8380KatakanaMuTex[] = dgMsgKanji8380KatakanaMuTex; + +#define dgMsgKanji8381KatakanaMeTex "__OTR__textures/kanji/gMsgKanji8381KatakanaMeTex" +static const ALIGN_ASSET(2) char gMsgKanji8381KatakanaMeTex[] = dgMsgKanji8381KatakanaMeTex; + +#define dgMsgKanji8382KatakanaMoTex "__OTR__textures/kanji/gMsgKanji8382KatakanaMoTex" +static const ALIGN_ASSET(2) char gMsgKanji8382KatakanaMoTex[] = dgMsgKanji8382KatakanaMoTex; + +#define dgMsgKanji8383KatakanaSmallYaTex "__OTR__textures/kanji/gMsgKanji8383KatakanaSmallYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8383KatakanaSmallYaTex[] = dgMsgKanji8383KatakanaSmallYaTex; + +#define dgMsgKanji8384KatakanaYaTex "__OTR__textures/kanji/gMsgKanji8384KatakanaYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8384KatakanaYaTex[] = dgMsgKanji8384KatakanaYaTex; + +#define dgMsgKanji8385KatakanaSmallYuTex "__OTR__textures/kanji/gMsgKanji8385KatakanaSmallYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8385KatakanaSmallYuTex[] = dgMsgKanji8385KatakanaSmallYuTex; + +#define dgMsgKanji8386KatakanaYuTex "__OTR__textures/kanji/gMsgKanji8386KatakanaYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8386KatakanaYuTex[] = dgMsgKanji8386KatakanaYuTex; + +#define dgMsgKanji8387KatakanaSmallYoTex "__OTR__textures/kanji/gMsgKanji8387KatakanaSmallYoTex" +static const ALIGN_ASSET(2) char gMsgKanji8387KatakanaSmallYoTex[] = dgMsgKanji8387KatakanaSmallYoTex; + +#define dgMsgKanji8388KatakanaYoTex "__OTR__textures/kanji/gMsgKanji8388KatakanaYoTex" +static const ALIGN_ASSET(2) char gMsgKanji8388KatakanaYoTex[] = dgMsgKanji8388KatakanaYoTex; + +#define dgMsgKanji8389KatakanaRaTex "__OTR__textures/kanji/gMsgKanji8389KatakanaRaTex" +static const ALIGN_ASSET(2) char gMsgKanji8389KatakanaRaTex[] = dgMsgKanji8389KatakanaRaTex; + +#define dgMsgKanji838AKatakanaRiTex "__OTR__textures/kanji/gMsgKanji838AKatakanaRiTex" +static const ALIGN_ASSET(2) char gMsgKanji838AKatakanaRiTex[] = dgMsgKanji838AKatakanaRiTex; + +#define dgMsgKanji838BKatakanaRuTex "__OTR__textures/kanji/gMsgKanji838BKatakanaRuTex" +static const ALIGN_ASSET(2) char gMsgKanji838BKatakanaRuTex[] = dgMsgKanji838BKatakanaRuTex; + +#define dgMsgKanji838CKatakanaReTex "__OTR__textures/kanji/gMsgKanji838CKatakanaReTex" +static const ALIGN_ASSET(2) char gMsgKanji838CKatakanaReTex[] = dgMsgKanji838CKatakanaReTex; + +#define dgMsgKanji838DKatakanaRoTex "__OTR__textures/kanji/gMsgKanji838DKatakanaRoTex" +static const ALIGN_ASSET(2) char gMsgKanji838DKatakanaRoTex[] = dgMsgKanji838DKatakanaRoTex; + +#define dgMsgKanji838EKatakanaSmallWaTex "__OTR__textures/kanji/gMsgKanji838EKatakanaSmallWaTex" +static const ALIGN_ASSET(2) char gMsgKanji838EKatakanaSmallWaTex[] = dgMsgKanji838EKatakanaSmallWaTex; + +#define dgMsgKanji838FKatakanaWaTex "__OTR__textures/kanji/gMsgKanji838FKatakanaWaTex" +static const ALIGN_ASSET(2) char gMsgKanji838FKatakanaWaTex[] = dgMsgKanji838FKatakanaWaTex; + +#define dgMsgKanji8390KatakanaWiTex "__OTR__textures/kanji/gMsgKanji8390KatakanaWiTex" +static const ALIGN_ASSET(2) char gMsgKanji8390KatakanaWiTex[] = dgMsgKanji8390KatakanaWiTex; + +#define dgMsgKanji8391KatakanaWeTex "__OTR__textures/kanji/gMsgKanji8391KatakanaWeTex" +static const ALIGN_ASSET(2) char gMsgKanji8391KatakanaWeTex[] = dgMsgKanji8391KatakanaWeTex; + +#define dgMsgKanji8392KatakanaWoTex "__OTR__textures/kanji/gMsgKanji8392KatakanaWoTex" +static const ALIGN_ASSET(2) char gMsgKanji8392KatakanaWoTex[] = dgMsgKanji8392KatakanaWoTex; + +#define dgMsgKanji8393KatakanaNTex "__OTR__textures/kanji/gMsgKanji8393KatakanaNTex" +static const ALIGN_ASSET(2) char gMsgKanji8393KatakanaNTex[] = dgMsgKanji8393KatakanaNTex; + +#define dgMsgKanji8394KatakanaVuTex "__OTR__textures/kanji/gMsgKanji8394KatakanaVuTex" +static const ALIGN_ASSET(2) char gMsgKanji8394KatakanaVuTex[] = dgMsgKanji8394KatakanaVuTex; + +#define dgMsgKanji8395KatakanaSmallKaTex "__OTR__textures/kanji/gMsgKanji8395KatakanaSmallKaTex" +static const ALIGN_ASSET(2) char gMsgKanji8395KatakanaSmallKaTex[] = dgMsgKanji8395KatakanaSmallKaTex; + +#define dgMsgKanji8396KatakanaSmallKeTex "__OTR__textures/kanji/gMsgKanji8396KatakanaSmallKeTex" +static const ALIGN_ASSET(2) char gMsgKanji8396KatakanaSmallKeTex[] = dgMsgKanji8396KatakanaSmallKeTex; + +#define dgMsgKanji839FButtonATex "__OTR__textures/kanji/gMsgKanji839FButtonATex" +static const ALIGN_ASSET(2) char gMsgKanji839FButtonATex[] = dgMsgKanji839FButtonATex; + +#define dgMsgKanji83A0ButtonBTex "__OTR__textures/kanji/gMsgKanji83A0ButtonBTex" +static const ALIGN_ASSET(2) char gMsgKanji83A0ButtonBTex[] = dgMsgKanji83A0ButtonBTex; + +#define dgMsgKanji83A1ButtonCTex "__OTR__textures/kanji/gMsgKanji83A1ButtonCTex" +static const ALIGN_ASSET(2) char gMsgKanji83A1ButtonCTex[] = dgMsgKanji83A1ButtonCTex; + +#define dgMsgKanji83A2ButtonLTex "__OTR__textures/kanji/gMsgKanji83A2ButtonLTex" +static const ALIGN_ASSET(2) char gMsgKanji83A2ButtonLTex[] = dgMsgKanji83A2ButtonLTex; + +#define dgMsgKanji83A3ButtonRTex "__OTR__textures/kanji/gMsgKanji83A3ButtonRTex" +static const ALIGN_ASSET(2) char gMsgKanji83A3ButtonRTex[] = dgMsgKanji83A3ButtonRTex; + +#define dgMsgKanji83A4ButtonZTex "__OTR__textures/kanji/gMsgKanji83A4ButtonZTex" +static const ALIGN_ASSET(2) char gMsgKanji83A4ButtonZTex[] = dgMsgKanji83A4ButtonZTex; + +#define dgMsgKanji83A5ButtonCUpTex "__OTR__textures/kanji/gMsgKanji83A5ButtonCUpTex" +static const ALIGN_ASSET(2) char gMsgKanji83A5ButtonCUpTex[] = dgMsgKanji83A5ButtonCUpTex; + +#define dgMsgKanji83A6ButtonCDownTex "__OTR__textures/kanji/gMsgKanji83A6ButtonCDownTex" +static const ALIGN_ASSET(2) char gMsgKanji83A6ButtonCDownTex[] = dgMsgKanji83A6ButtonCDownTex; + +#define dgMsgKanji83A7ButtonCLeftTex "__OTR__textures/kanji/gMsgKanji83A7ButtonCLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji83A7ButtonCLeftTex[] = dgMsgKanji83A7ButtonCLeftTex; + +#define dgMsgKanji83A8ButtonCRightTex "__OTR__textures/kanji/gMsgKanji83A8ButtonCRightTex" +static const ALIGN_ASSET(2) char gMsgKanji83A8ButtonCRightTex[] = dgMsgKanji83A8ButtonCRightTex; + +#define dgMsgKanji83A9ZTargetSignTex "__OTR__textures/kanji/gMsgKanji83A9ZTargetSignTex" +static const ALIGN_ASSET(2) char gMsgKanji83A9ZTargetSignTex[] = dgMsgKanji83A9ZTargetSignTex; + +#define dgMsgKanji83AAControlStickTex "__OTR__textures/kanji/gMsgKanji83AAControlStickTex" +static const ALIGN_ASSET(2) char gMsgKanji83AAControlStickTex[] = dgMsgKanji83AAControlStickTex; + +#define dgMsgKanji83ABGreekCapitalNuTex "__OTR__textures/kanji/gMsgKanji83ABGreekCapitalNuTex" +static const ALIGN_ASSET(2) char gMsgKanji83ABGreekCapitalNuTex[] = dgMsgKanji83ABGreekCapitalNuTex; + +#define dgMsgKanji83ACGreekCapitalXiTex "__OTR__textures/kanji/gMsgKanji83ACGreekCapitalXiTex" +static const ALIGN_ASSET(2) char gMsgKanji83ACGreekCapitalXiTex[] = dgMsgKanji83ACGreekCapitalXiTex; + +#define dgMsgKanji83ADGreekCapitalOmicronTex "__OTR__textures/kanji/gMsgKanji83ADGreekCapitalOmicronTex" +static const ALIGN_ASSET(2) char gMsgKanji83ADGreekCapitalOmicronTex[] = dgMsgKanji83ADGreekCapitalOmicronTex; + +#define dgMsgKanji83AEGreekCapitalPiTex "__OTR__textures/kanji/gMsgKanji83AEGreekCapitalPiTex" +static const ALIGN_ASSET(2) char gMsgKanji83AEGreekCapitalPiTex[] = dgMsgKanji83AEGreekCapitalPiTex; + +#define dgMsgKanji83AFGreekCapitalRhoTex "__OTR__textures/kanji/gMsgKanji83AFGreekCapitalRhoTex" +static const ALIGN_ASSET(2) char gMsgKanji83AFGreekCapitalRhoTex[] = dgMsgKanji83AFGreekCapitalRhoTex; + +#define dgMsgKanji83B0GreekCapitalSigmaTex "__OTR__textures/kanji/gMsgKanji83B0GreekCapitalSigmaTex" +static const ALIGN_ASSET(2) char gMsgKanji83B0GreekCapitalSigmaTex[] = dgMsgKanji83B0GreekCapitalSigmaTex; + +#define dgMsgKanji83B1GreekCapitalTauTex "__OTR__textures/kanji/gMsgKanji83B1GreekCapitalTauTex" +static const ALIGN_ASSET(2) char gMsgKanji83B1GreekCapitalTauTex[] = dgMsgKanji83B1GreekCapitalTauTex; + +#define dgMsgKanji83B2GreekCapitalUpsilonTex "__OTR__textures/kanji/gMsgKanji83B2GreekCapitalUpsilonTex" +static const ALIGN_ASSET(2) char gMsgKanji83B2GreekCapitalUpsilonTex[] = dgMsgKanji83B2GreekCapitalUpsilonTex; + +#define dgMsgKanji83B3GreekCapitalPhiTex "__OTR__textures/kanji/gMsgKanji83B3GreekCapitalPhiTex" +static const ALIGN_ASSET(2) char gMsgKanji83B3GreekCapitalPhiTex[] = dgMsgKanji83B3GreekCapitalPhiTex; + +#define dgMsgKanji83B4GreekCapitalChiTex "__OTR__textures/kanji/gMsgKanji83B4GreekCapitalChiTex" +static const ALIGN_ASSET(2) char gMsgKanji83B4GreekCapitalChiTex[] = dgMsgKanji83B4GreekCapitalChiTex; + +#define dgMsgKanji83B5GreekCapitalPsiTex "__OTR__textures/kanji/gMsgKanji83B5GreekCapitalPsiTex" +static const ALIGN_ASSET(2) char gMsgKanji83B5GreekCapitalPsiTex[] = dgMsgKanji83B5GreekCapitalPsiTex; + +#define dgMsgKanji83B6GreekCapitalOmegaTex "__OTR__textures/kanji/gMsgKanji83B6GreekCapitalOmegaTex" +static const ALIGN_ASSET(2) char gMsgKanji83B6GreekCapitalOmegaTex[] = dgMsgKanji83B6GreekCapitalOmegaTex; + +#define dgMsgKanji83BFGreekLowercaseAlphaTex "__OTR__textures/kanji/gMsgKanji83BFGreekLowercaseAlphaTex" +static const ALIGN_ASSET(2) char gMsgKanji83BFGreekLowercaseAlphaTex[] = dgMsgKanji83BFGreekLowercaseAlphaTex; + +#define dgMsgKanji83C0GreekLowercaseBetaTex "__OTR__textures/kanji/gMsgKanji83C0GreekLowercaseBetaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C0GreekLowercaseBetaTex[] = dgMsgKanji83C0GreekLowercaseBetaTex; + +#define dgMsgKanji83C1GreekLowercaseGammaTex "__OTR__textures/kanji/gMsgKanji83C1GreekLowercaseGammaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C1GreekLowercaseGammaTex[] = dgMsgKanji83C1GreekLowercaseGammaTex; + +#define dgMsgKanji83C2GreekLowercaseDeltaTex "__OTR__textures/kanji/gMsgKanji83C2GreekLowercaseDeltaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C2GreekLowercaseDeltaTex[] = dgMsgKanji83C2GreekLowercaseDeltaTex; + +#define dgMsgKanji83C3GreekLowercaseEpsilonTex "__OTR__textures/kanji/gMsgKanji83C3GreekLowercaseEpsilonTex" +static const ALIGN_ASSET(2) char gMsgKanji83C3GreekLowercaseEpsilonTex[] = dgMsgKanji83C3GreekLowercaseEpsilonTex; + +#define dgMsgKanji83C4GreekLowercaseZetaTex "__OTR__textures/kanji/gMsgKanji83C4GreekLowercaseZetaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C4GreekLowercaseZetaTex[] = dgMsgKanji83C4GreekLowercaseZetaTex; + +#define dgMsgKanji83C5GreekLowercaseEtaTex "__OTR__textures/kanji/gMsgKanji83C5GreekLowercaseEtaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C5GreekLowercaseEtaTex[] = dgMsgKanji83C5GreekLowercaseEtaTex; + +#define dgMsgKanji83C6GreekLowercaseThetaTex "__OTR__textures/kanji/gMsgKanji83C6GreekLowercaseThetaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C6GreekLowercaseThetaTex[] = dgMsgKanji83C6GreekLowercaseThetaTex; + +#define dgMsgKanji83C7GreekLowercaseIotaTex "__OTR__textures/kanji/gMsgKanji83C7GreekLowercaseIotaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C7GreekLowercaseIotaTex[] = dgMsgKanji83C7GreekLowercaseIotaTex; + +#define dgMsgKanji83C8GreekLowercaseKappaTex "__OTR__textures/kanji/gMsgKanji83C8GreekLowercaseKappaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C8GreekLowercaseKappaTex[] = dgMsgKanji83C8GreekLowercaseKappaTex; + +#define dgMsgKanji83C9GreekLowercaseLamdaTex "__OTR__textures/kanji/gMsgKanji83C9GreekLowercaseLamdaTex" +static const ALIGN_ASSET(2) char gMsgKanji83C9GreekLowercaseLamdaTex[] = dgMsgKanji83C9GreekLowercaseLamdaTex; + +#define dgMsgKanji83CAGreekLowercaseMuTex "__OTR__textures/kanji/gMsgKanji83CAGreekLowercaseMuTex" +static const ALIGN_ASSET(2) char gMsgKanji83CAGreekLowercaseMuTex[] = dgMsgKanji83CAGreekLowercaseMuTex; + +#define dgMsgKanji83CBGreekLowercaseNuTex "__OTR__textures/kanji/gMsgKanji83CBGreekLowercaseNuTex" +static const ALIGN_ASSET(2) char gMsgKanji83CBGreekLowercaseNuTex[] = dgMsgKanji83CBGreekLowercaseNuTex; + +#define dgMsgKanji83CCGreekLowercaseXiTex "__OTR__textures/kanji/gMsgKanji83CCGreekLowercaseXiTex" +static const ALIGN_ASSET(2) char gMsgKanji83CCGreekLowercaseXiTex[] = dgMsgKanji83CCGreekLowercaseXiTex; + +#define dgMsgKanji83CDGreekLowercaseOmicronTex "__OTR__textures/kanji/gMsgKanji83CDGreekLowercaseOmicronTex" +static const ALIGN_ASSET(2) char gMsgKanji83CDGreekLowercaseOmicronTex[] = dgMsgKanji83CDGreekLowercaseOmicronTex; + +#define dgMsgKanji83CEGreekLowercasePiTex "__OTR__textures/kanji/gMsgKanji83CEGreekLowercasePiTex" +static const ALIGN_ASSET(2) char gMsgKanji83CEGreekLowercasePiTex[] = dgMsgKanji83CEGreekLowercasePiTex; + +#define dgMsgKanji83CFGreekLowercaseRhoTex "__OTR__textures/kanji/gMsgKanji83CFGreekLowercaseRhoTex" +static const ALIGN_ASSET(2) char gMsgKanji83CFGreekLowercaseRhoTex[] = dgMsgKanji83CFGreekLowercaseRhoTex; + +#define dgMsgKanji83D0GreekLowercaseSigmaTex "__OTR__textures/kanji/gMsgKanji83D0GreekLowercaseSigmaTex" +static const ALIGN_ASSET(2) char gMsgKanji83D0GreekLowercaseSigmaTex[] = dgMsgKanji83D0GreekLowercaseSigmaTex; + +#define dgMsgKanji83D1GreekLowercaseTauTex "__OTR__textures/kanji/gMsgKanji83D1GreekLowercaseTauTex" +static const ALIGN_ASSET(2) char gMsgKanji83D1GreekLowercaseTauTex[] = dgMsgKanji83D1GreekLowercaseTauTex; + +#define dgMsgKanji83D2GreekLowercaseUpsilonTex "__OTR__textures/kanji/gMsgKanji83D2GreekLowercaseUpsilonTex" +static const ALIGN_ASSET(2) char gMsgKanji83D2GreekLowercaseUpsilonTex[] = dgMsgKanji83D2GreekLowercaseUpsilonTex; + +#define dgMsgKanji83D3GreekLowercasePhiTex "__OTR__textures/kanji/gMsgKanji83D3GreekLowercasePhiTex" +static const ALIGN_ASSET(2) char gMsgKanji83D3GreekLowercasePhiTex[] = dgMsgKanji83D3GreekLowercasePhiTex; + +#define dgMsgKanji83D4GreekLowercaseChiTex "__OTR__textures/kanji/gMsgKanji83D4GreekLowercaseChiTex" +static const ALIGN_ASSET(2) char gMsgKanji83D4GreekLowercaseChiTex[] = dgMsgKanji83D4GreekLowercaseChiTex; + +#define dgMsgKanji83D5GreekLowercasePsiTex "__OTR__textures/kanji/gMsgKanji83D5GreekLowercasePsiTex" +static const ALIGN_ASSET(2) char gMsgKanji83D5GreekLowercasePsiTex[] = dgMsgKanji83D5GreekLowercasePsiTex; + +#define dgMsgKanji83D6GreekLowercaseOmegaTex "__OTR__textures/kanji/gMsgKanji83D6GreekLowercaseOmegaTex" +static const ALIGN_ASSET(2) char gMsgKanji83D6GreekLowercaseOmegaTex[] = dgMsgKanji83D6GreekLowercaseOmegaTex; + +#define dgMsgKanji83D7EmptyTex "__OTR__textures/kanji/gMsgKanji83D7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji83D7EmptyTex[] = dgMsgKanji83D7EmptyTex; + +#define dgMsgKanji8440HylianATex "__OTR__textures/kanji/gMsgKanji8440HylianATex" +static const ALIGN_ASSET(2) char gMsgKanji8440HylianATex[] = dgMsgKanji8440HylianATex; + +#define dgMsgKanji8441HylianITex "__OTR__textures/kanji/gMsgKanji8441HylianITex" +static const ALIGN_ASSET(2) char gMsgKanji8441HylianITex[] = dgMsgKanji8441HylianITex; + +#define dgMsgKanji8442HylianUTex "__OTR__textures/kanji/gMsgKanji8442HylianUTex" +static const ALIGN_ASSET(2) char gMsgKanji8442HylianUTex[] = dgMsgKanji8442HylianUTex; + +#define dgMsgKanji8443HylianETex "__OTR__textures/kanji/gMsgKanji8443HylianETex" +static const ALIGN_ASSET(2) char gMsgKanji8443HylianETex[] = dgMsgKanji8443HylianETex; + +#define dgMsgKanji8444HylianOTex "__OTR__textures/kanji/gMsgKanji8444HylianOTex" +static const ALIGN_ASSET(2) char gMsgKanji8444HylianOTex[] = dgMsgKanji8444HylianOTex; + +#define dgMsgKanji8445HylianKaTex "__OTR__textures/kanji/gMsgKanji8445HylianKaTex" +static const ALIGN_ASSET(2) char gMsgKanji8445HylianKaTex[] = dgMsgKanji8445HylianKaTex; + +#define dgMsgKanji8446HylianKiTex "__OTR__textures/kanji/gMsgKanji8446HylianKiTex" +static const ALIGN_ASSET(2) char gMsgKanji8446HylianKiTex[] = dgMsgKanji8446HylianKiTex; + +#define dgMsgKanji8447HylianKuTex "__OTR__textures/kanji/gMsgKanji8447HylianKuTex" +static const ALIGN_ASSET(2) char gMsgKanji8447HylianKuTex[] = dgMsgKanji8447HylianKuTex; + +#define dgMsgKanji8448HylianKeTex "__OTR__textures/kanji/gMsgKanji8448HylianKeTex" +static const ALIGN_ASSET(2) char gMsgKanji8448HylianKeTex[] = dgMsgKanji8448HylianKeTex; + +#define dgMsgKanji8449HylianKoTex "__OTR__textures/kanji/gMsgKanji8449HylianKoTex" +static const ALIGN_ASSET(2) char gMsgKanji8449HylianKoTex[] = dgMsgKanji8449HylianKoTex; + +#define dgMsgKanji844AHylianSaTex "__OTR__textures/kanji/gMsgKanji844AHylianSaTex" +static const ALIGN_ASSET(2) char gMsgKanji844AHylianSaTex[] = dgMsgKanji844AHylianSaTex; + +#define dgMsgKanji844BHylianShiTex "__OTR__textures/kanji/gMsgKanji844BHylianShiTex" +static const ALIGN_ASSET(2) char gMsgKanji844BHylianShiTex[] = dgMsgKanji844BHylianShiTex; + +#define dgMsgKanji844CHylianSuTex "__OTR__textures/kanji/gMsgKanji844CHylianSuTex" +static const ALIGN_ASSET(2) char gMsgKanji844CHylianSuTex[] = dgMsgKanji844CHylianSuTex; + +#define dgMsgKanji844DHylianSeTex "__OTR__textures/kanji/gMsgKanji844DHylianSeTex" +static const ALIGN_ASSET(2) char gMsgKanji844DHylianSeTex[] = dgMsgKanji844DHylianSeTex; + +#define dgMsgKanji844EHylianSoTex "__OTR__textures/kanji/gMsgKanji844EHylianSoTex" +static const ALIGN_ASSET(2) char gMsgKanji844EHylianSoTex[] = dgMsgKanji844EHylianSoTex; + +#define dgMsgKanji844FHylianTaTex "__OTR__textures/kanji/gMsgKanji844FHylianTaTex" +static const ALIGN_ASSET(2) char gMsgKanji844FHylianTaTex[] = dgMsgKanji844FHylianTaTex; + +#define dgMsgKanji8450HylianChiTex "__OTR__textures/kanji/gMsgKanji8450HylianChiTex" +static const ALIGN_ASSET(2) char gMsgKanji8450HylianChiTex[] = dgMsgKanji8450HylianChiTex; + +#define dgMsgKanji8451HylianTsuTex "__OTR__textures/kanji/gMsgKanji8451HylianTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji8451HylianTsuTex[] = dgMsgKanji8451HylianTsuTex; + +#define dgMsgKanji8452HylianTeTex "__OTR__textures/kanji/gMsgKanji8452HylianTeTex" +static const ALIGN_ASSET(2) char gMsgKanji8452HylianTeTex[] = dgMsgKanji8452HylianTeTex; + +#define dgMsgKanji8453HylianToTex "__OTR__textures/kanji/gMsgKanji8453HylianToTex" +static const ALIGN_ASSET(2) char gMsgKanji8453HylianToTex[] = dgMsgKanji8453HylianToTex; + +#define dgMsgKanji8454HylianNaTex "__OTR__textures/kanji/gMsgKanji8454HylianNaTex" +static const ALIGN_ASSET(2) char gMsgKanji8454HylianNaTex[] = dgMsgKanji8454HylianNaTex; + +#define dgMsgKanji8455HylianNiTex "__OTR__textures/kanji/gMsgKanji8455HylianNiTex" +static const ALIGN_ASSET(2) char gMsgKanji8455HylianNiTex[] = dgMsgKanji8455HylianNiTex; + +#define dgMsgKanji8456HylianNuTex "__OTR__textures/kanji/gMsgKanji8456HylianNuTex" +static const ALIGN_ASSET(2) char gMsgKanji8456HylianNuTex[] = dgMsgKanji8456HylianNuTex; + +#define dgMsgKanji8457HylianNeTex "__OTR__textures/kanji/gMsgKanji8457HylianNeTex" +static const ALIGN_ASSET(2) char gMsgKanji8457HylianNeTex[] = dgMsgKanji8457HylianNeTex; + +#define dgMsgKanji8458HylianNoTex "__OTR__textures/kanji/gMsgKanji8458HylianNoTex" +static const ALIGN_ASSET(2) char gMsgKanji8458HylianNoTex[] = dgMsgKanji8458HylianNoTex; + +#define dgMsgKanji8459HylianHaTex "__OTR__textures/kanji/gMsgKanji8459HylianHaTex" +static const ALIGN_ASSET(2) char gMsgKanji8459HylianHaTex[] = dgMsgKanji8459HylianHaTex; + +#define dgMsgKanji845AHylianHiTex "__OTR__textures/kanji/gMsgKanji845AHylianHiTex" +static const ALIGN_ASSET(2) char gMsgKanji845AHylianHiTex[] = dgMsgKanji845AHylianHiTex; + +#define dgMsgKanji845BHylianFuTex "__OTR__textures/kanji/gMsgKanji845BHylianFuTex" +static const ALIGN_ASSET(2) char gMsgKanji845BHylianFuTex[] = dgMsgKanji845BHylianFuTex; + +#define dgMsgKanji845CHylianHeTex "__OTR__textures/kanji/gMsgKanji845CHylianHeTex" +static const ALIGN_ASSET(2) char gMsgKanji845CHylianHeTex[] = dgMsgKanji845CHylianHeTex; + +#define dgMsgKanji845DHylianHoTex "__OTR__textures/kanji/gMsgKanji845DHylianHoTex" +static const ALIGN_ASSET(2) char gMsgKanji845DHylianHoTex[] = dgMsgKanji845DHylianHoTex; + +#define dgMsgKanji845EHylianMaTex "__OTR__textures/kanji/gMsgKanji845EHylianMaTex" +static const ALIGN_ASSET(2) char gMsgKanji845EHylianMaTex[] = dgMsgKanji845EHylianMaTex; + +#define dgMsgKanji845FHylianMiTex "__OTR__textures/kanji/gMsgKanji845FHylianMiTex" +static const ALIGN_ASSET(2) char gMsgKanji845FHylianMiTex[] = dgMsgKanji845FHylianMiTex; + +#define dgMsgKanji8460HylianMuTex "__OTR__textures/kanji/gMsgKanji8460HylianMuTex" +static const ALIGN_ASSET(2) char gMsgKanji8460HylianMuTex[] = dgMsgKanji8460HylianMuTex; + +#define dgMsgKanji8470HylianMeTex "__OTR__textures/kanji/gMsgKanji8470HylianMeTex" +static const ALIGN_ASSET(2) char gMsgKanji8470HylianMeTex[] = dgMsgKanji8470HylianMeTex; + +#define dgMsgKanji8471HylianMoTex "__OTR__textures/kanji/gMsgKanji8471HylianMoTex" +static const ALIGN_ASSET(2) char gMsgKanji8471HylianMoTex[] = dgMsgKanji8471HylianMoTex; + +#define dgMsgKanji8472HylianYaTex "__OTR__textures/kanji/gMsgKanji8472HylianYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8472HylianYaTex[] = dgMsgKanji8472HylianYaTex; + +#define dgMsgKanji8473HylianYuTex "__OTR__textures/kanji/gMsgKanji8473HylianYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8473HylianYuTex[] = dgMsgKanji8473HylianYuTex; + +#define dgMsgKanji8474HylianYoTex "__OTR__textures/kanji/gMsgKanji8474HylianYoTex" +static const ALIGN_ASSET(2) char gMsgKanji8474HylianYoTex[] = dgMsgKanji8474HylianYoTex; + +#define dgMsgKanji8475HylianRaTex "__OTR__textures/kanji/gMsgKanji8475HylianRaTex" +static const ALIGN_ASSET(2) char gMsgKanji8475HylianRaTex[] = dgMsgKanji8475HylianRaTex; + +#define dgMsgKanji8476HylianRiTex "__OTR__textures/kanji/gMsgKanji8476HylianRiTex" +static const ALIGN_ASSET(2) char gMsgKanji8476HylianRiTex[] = dgMsgKanji8476HylianRiTex; + +#define dgMsgKanji8477HylianRuTex "__OTR__textures/kanji/gMsgKanji8477HylianRuTex" +static const ALIGN_ASSET(2) char gMsgKanji8477HylianRuTex[] = dgMsgKanji8477HylianRuTex; + +#define dgMsgKanji8478HylianReTex "__OTR__textures/kanji/gMsgKanji8478HylianReTex" +static const ALIGN_ASSET(2) char gMsgKanji8478HylianReTex[] = dgMsgKanji8478HylianReTex; + +#define dgMsgKanji8479HylianRoTex "__OTR__textures/kanji/gMsgKanji8479HylianRoTex" +static const ALIGN_ASSET(2) char gMsgKanji8479HylianRoTex[] = dgMsgKanji8479HylianRoTex; + +#define dgMsgKanji847AHylianWaTex "__OTR__textures/kanji/gMsgKanji847AHylianWaTex" +static const ALIGN_ASSET(2) char gMsgKanji847AHylianWaTex[] = dgMsgKanji847AHylianWaTex; + +#define dgMsgKanji847BHylianWoTex "__OTR__textures/kanji/gMsgKanji847BHylianWoTex" +static const ALIGN_ASSET(2) char gMsgKanji847BHylianWoTex[] = dgMsgKanji847BHylianWoTex; + +#define dgMsgKanji847CHylianNTex "__OTR__textures/kanji/gMsgKanji847CHylianNTex" +static const ALIGN_ASSET(2) char gMsgKanji847CHylianNTex[] = dgMsgKanji847CHylianNTex; + +#define dgMsgKanji847DHylianToutenTex "__OTR__textures/kanji/gMsgKanji847DHylianToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji847DHylianToutenTex[] = dgMsgKanji847DHylianToutenTex; + +#define dgMsgKanji847EHylianKutenTex "__OTR__textures/kanji/gMsgKanji847EHylianKutenTex" +static const ALIGN_ASSET(2) char gMsgKanji847EHylianKutenTex[] = dgMsgKanji847EHylianKutenTex; + +#define dgMsgKanji8480CyrillicLowercaseOTex "__OTR__textures/kanji/gMsgKanji8480CyrillicLowercaseOTex" +static const ALIGN_ASSET(2) char gMsgKanji8480CyrillicLowercaseOTex[] = dgMsgKanji8480CyrillicLowercaseOTex; + +#define dgMsgKanji8481CyrillicLowercasePeTex "__OTR__textures/kanji/gMsgKanji8481CyrillicLowercasePeTex" +static const ALIGN_ASSET(2) char gMsgKanji8481CyrillicLowercasePeTex[] = dgMsgKanji8481CyrillicLowercasePeTex; + +#define dgMsgKanji8482CyrillicLowercaseErTex "__OTR__textures/kanji/gMsgKanji8482CyrillicLowercaseErTex" +static const ALIGN_ASSET(2) char gMsgKanji8482CyrillicLowercaseErTex[] = dgMsgKanji8482CyrillicLowercaseErTex; + +#define dgMsgKanji8483CyrillicLowercaseEsTex "__OTR__textures/kanji/gMsgKanji8483CyrillicLowercaseEsTex" +static const ALIGN_ASSET(2) char gMsgKanji8483CyrillicLowercaseEsTex[] = dgMsgKanji8483CyrillicLowercaseEsTex; + +#define dgMsgKanji8484CyrillicLowercaseTeTex "__OTR__textures/kanji/gMsgKanji8484CyrillicLowercaseTeTex" +static const ALIGN_ASSET(2) char gMsgKanji8484CyrillicLowercaseTeTex[] = dgMsgKanji8484CyrillicLowercaseTeTex; + +#define dgMsgKanji8485CyrillicLowercaseUTex "__OTR__textures/kanji/gMsgKanji8485CyrillicLowercaseUTex" +static const ALIGN_ASSET(2) char gMsgKanji8485CyrillicLowercaseUTex[] = dgMsgKanji8485CyrillicLowercaseUTex; + +#define dgMsgKanji8486CyrillicLowercaseEfTex "__OTR__textures/kanji/gMsgKanji8486CyrillicLowercaseEfTex" +static const ALIGN_ASSET(2) char gMsgKanji8486CyrillicLowercaseEfTex[] = dgMsgKanji8486CyrillicLowercaseEfTex; + +#define dgMsgKanji8487CyrillicLowercaseHaTex "__OTR__textures/kanji/gMsgKanji8487CyrillicLowercaseHaTex" +static const ALIGN_ASSET(2) char gMsgKanji8487CyrillicLowercaseHaTex[] = dgMsgKanji8487CyrillicLowercaseHaTex; + +#define dgMsgKanji8488CyrillicLowercaseTseTex "__OTR__textures/kanji/gMsgKanji8488CyrillicLowercaseTseTex" +static const ALIGN_ASSET(2) char gMsgKanji8488CyrillicLowercaseTseTex[] = dgMsgKanji8488CyrillicLowercaseTseTex; + +#define dgMsgKanji8489CyrillicLowercaseCheTex "__OTR__textures/kanji/gMsgKanji8489CyrillicLowercaseCheTex" +static const ALIGN_ASSET(2) char gMsgKanji8489CyrillicLowercaseCheTex[] = dgMsgKanji8489CyrillicLowercaseCheTex; + +#define dgMsgKanji848ACyrillicLowercaseShaTex "__OTR__textures/kanji/gMsgKanji848ACyrillicLowercaseShaTex" +static const ALIGN_ASSET(2) char gMsgKanji848ACyrillicLowercaseShaTex[] = dgMsgKanji848ACyrillicLowercaseShaTex; + +#define dgMsgKanji848BCyrillicLowercaseShchaTex "__OTR__textures/kanji/gMsgKanji848BCyrillicLowercaseShchaTex" +static const ALIGN_ASSET(2) char gMsgKanji848BCyrillicLowercaseShchaTex[] = dgMsgKanji848BCyrillicLowercaseShchaTex; + +#define dgMsgKanji848CCyrillicLowercaseHardSignTex "__OTR__textures/kanji/gMsgKanji848CCyrillicLowercaseHardSignTex" +static const ALIGN_ASSET(2) char gMsgKanji848CCyrillicLowercaseHardSignTex[] = dgMsgKanji848CCyrillicLowercaseHardSignTex; + +#define dgMsgKanji848DCyrillicLowercaseYeruTex "__OTR__textures/kanji/gMsgKanji848DCyrillicLowercaseYeruTex" +static const ALIGN_ASSET(2) char gMsgKanji848DCyrillicLowercaseYeruTex[] = dgMsgKanji848DCyrillicLowercaseYeruTex; + +#define dgMsgKanji848ECyrillicLowercaseSoftSignTex "__OTR__textures/kanji/gMsgKanji848ECyrillicLowercaseSoftSignTex" +static const ALIGN_ASSET(2) char gMsgKanji848ECyrillicLowercaseSoftSignTex[] = dgMsgKanji848ECyrillicLowercaseSoftSignTex; + +#define dgMsgKanji848FCyrillicLowercaseETex "__OTR__textures/kanji/gMsgKanji848FCyrillicLowercaseETex" +static const ALIGN_ASSET(2) char gMsgKanji848FCyrillicLowercaseETex[] = dgMsgKanji848FCyrillicLowercaseETex; + +#define dgMsgKanji8490CyrillicLowercaseYuTex "__OTR__textures/kanji/gMsgKanji8490CyrillicLowercaseYuTex" +static const ALIGN_ASSET(2) char gMsgKanji8490CyrillicLowercaseYuTex[] = dgMsgKanji8490CyrillicLowercaseYuTex; + +#define dgMsgKanji8491CyrillicLowercaseYaTex "__OTR__textures/kanji/gMsgKanji8491CyrillicLowercaseYaTex" +static const ALIGN_ASSET(2) char gMsgKanji8491CyrillicLowercaseYaTex[] = dgMsgKanji8491CyrillicLowercaseYaTex; + +#define dgMsgKanji849FBoxThinHorizontalTex "__OTR__textures/kanji/gMsgKanji849FBoxThinHorizontalTex" +static const ALIGN_ASSET(2) char gMsgKanji849FBoxThinHorizontalTex[] = dgMsgKanji849FBoxThinHorizontalTex; + +#define dgMsgKanji84A0BoxThinVerticalTex "__OTR__textures/kanji/gMsgKanji84A0BoxThinVerticalTex" +static const ALIGN_ASSET(2) char gMsgKanji84A0BoxThinVerticalTex[] = dgMsgKanji84A0BoxThinVerticalTex; + +#define dgMsgKanji84A1BoxThinTopLeftTex "__OTR__textures/kanji/gMsgKanji84A1BoxThinTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84A1BoxThinTopLeftTex[] = dgMsgKanji84A1BoxThinTopLeftTex; + +#define dgMsgKanji84A2BoxThinTopRightTex "__OTR__textures/kanji/gMsgKanji84A2BoxThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84A2BoxThinTopRightTex[] = dgMsgKanji84A2BoxThinTopRightTex; + +#define dgMsgKanji84A3BoxThinBottomRightTex "__OTR__textures/kanji/gMsgKanji84A3BoxThinBottomRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84A3BoxThinBottomRightTex[] = dgMsgKanji84A3BoxThinBottomRightTex; + +#define dgMsgKanji84A4BoxThinBottomLeftTex "__OTR__textures/kanji/gMsgKanji84A4BoxThinBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84A4BoxThinBottomLeftTex[] = dgMsgKanji84A4BoxThinBottomLeftTex; + +#define dgMsgKanji84A5BoxThinLeftTex "__OTR__textures/kanji/gMsgKanji84A5BoxThinLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84A5BoxThinLeftTex[] = dgMsgKanji84A5BoxThinLeftTex; + +#define dgMsgKanji84A6BoxThinTopTex "__OTR__textures/kanji/gMsgKanji84A6BoxThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84A6BoxThinTopTex[] = dgMsgKanji84A6BoxThinTopTex; + +#define dgMsgKanji84A7BoxThinRightTex "__OTR__textures/kanji/gMsgKanji84A7BoxThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84A7BoxThinRightTex[] = dgMsgKanji84A7BoxThinRightTex; + +#define dgMsgKanji84A8BoxThinBottomTex "__OTR__textures/kanji/gMsgKanji84A8BoxThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84A8BoxThinBottomTex[] = dgMsgKanji84A8BoxThinBottomTex; + +#define dgMsgKanji84A9BoxThinCenterTex "__OTR__textures/kanji/gMsgKanji84A9BoxThinCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84A9BoxThinCenterTex[] = dgMsgKanji84A9BoxThinCenterTex; + +#define dgMsgKanji84AABoxThickHorizontalTex "__OTR__textures/kanji/gMsgKanji84AABoxThickHorizontalTex" +static const ALIGN_ASSET(2) char gMsgKanji84AABoxThickHorizontalTex[] = dgMsgKanji84AABoxThickHorizontalTex; + +#define dgMsgKanji84ABBoxThickVerticalTex "__OTR__textures/kanji/gMsgKanji84ABBoxThickVerticalTex" +static const ALIGN_ASSET(2) char gMsgKanji84ABBoxThickVerticalTex[] = dgMsgKanji84ABBoxThickVerticalTex; + +#define dgMsgKanji84ACBoxThickTopLeftTex "__OTR__textures/kanji/gMsgKanji84ACBoxThickTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84ACBoxThickTopLeftTex[] = dgMsgKanji84ACBoxThickTopLeftTex; + +#define dgMsgKanji84ADBoxThickTopRightTex "__OTR__textures/kanji/gMsgKanji84ADBoxThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84ADBoxThickTopRightTex[] = dgMsgKanji84ADBoxThickTopRightTex; + +#define dgMsgKanji84AEBoxThickBottomRightTex "__OTR__textures/kanji/gMsgKanji84AEBoxThickBottomRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84AEBoxThickBottomRightTex[] = dgMsgKanji84AEBoxThickBottomRightTex; + +#define dgMsgKanji84AFBoxThickBottomLeftTex "__OTR__textures/kanji/gMsgKanji84AFBoxThickBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84AFBoxThickBottomLeftTex[] = dgMsgKanji84AFBoxThickBottomLeftTex; + +#define dgMsgKanji84B0BoxThickLeftTex "__OTR__textures/kanji/gMsgKanji84B0BoxThickLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84B0BoxThickLeftTex[] = dgMsgKanji84B0BoxThickLeftTex; + +#define dgMsgKanji84B1BoxThickTopTex "__OTR__textures/kanji/gMsgKanji84B1BoxThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84B1BoxThickTopTex[] = dgMsgKanji84B1BoxThickTopTex; + +#define dgMsgKanji84B2BoxThickRightTex "__OTR__textures/kanji/gMsgKanji84B2BoxThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84B2BoxThickRightTex[] = dgMsgKanji84B2BoxThickRightTex; + +#define dgMsgKanji84B3BoxThickBottomTex "__OTR__textures/kanji/gMsgKanji84B3BoxThickBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84B3BoxThickBottomTex[] = dgMsgKanji84B3BoxThickBottomTex; + +#define dgMsgKanji84B4BoxThickCenterTex "__OTR__textures/kanji/gMsgKanji84B4BoxThickCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84B4BoxThickCenterTex[] = dgMsgKanji84B4BoxThickCenterTex; + +#define dgMsgKanji84B5BoxVertThickHorizThinLeftTex "__OTR__textures/kanji/gMsgKanji84B5BoxVertThickHorizThinLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84B5BoxVertThickHorizThinLeftTex[] = dgMsgKanji84B5BoxVertThickHorizThinLeftTex; + +#define dgMsgKanji84B6BoxVertThinHorizThickTopTex "__OTR__textures/kanji/gMsgKanji84B6BoxVertThinHorizThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84B6BoxVertThinHorizThickTopTex[] = dgMsgKanji84B6BoxVertThinHorizThickTopTex; + +#define dgMsgKanji84B7BoxVertThickHorizThinRightTex "__OTR__textures/kanji/gMsgKanji84B7BoxVertThickHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84B7BoxVertThickHorizThinRightTex[] = dgMsgKanji84B7BoxVertThickHorizThinRightTex; + +#define dgMsgKanji84B8BoxVertThinHorizThickBottomTex "__OTR__textures/kanji/gMsgKanji84B8BoxVertThinHorizThickBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84B8BoxVertThinHorizThickBottomTex[] = dgMsgKanji84B8BoxVertThinHorizThickBottomTex; + +#define dgMsgKanji84B9BoxVertThinHorizThickCenterTex "__OTR__textures/kanji/gMsgKanji84B9BoxVertThinHorizThickCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84B9BoxVertThinHorizThickCenterTex[] = dgMsgKanji84B9BoxVertThinHorizThickCenterTex; + +#define dgMsgKanji84BABoxVertThinHorizThickLeftTex "__OTR__textures/kanji/gMsgKanji84BABoxVertThinHorizThickLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji84BABoxVertThinHorizThickLeftTex[] = dgMsgKanji84BABoxVertThinHorizThickLeftTex; + +#define dgMsgKanji84BBBoxVertThickHorizThinTopTex "__OTR__textures/kanji/gMsgKanji84BBBoxVertThickHorizThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji84BBBoxVertThickHorizThinTopTex[] = dgMsgKanji84BBBoxVertThickHorizThinTopTex; + +#define dgMsgKanji84BCBoxVertThinHorizThickRightTex "__OTR__textures/kanji/gMsgKanji84BCBoxVertThinHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji84BCBoxVertThinHorizThickRightTex[] = dgMsgKanji84BCBoxVertThinHorizThickRightTex; + +#define dgMsgKanji84BDBoxVertThickHorizThinBottomTex "__OTR__textures/kanji/gMsgKanji84BDBoxVertThickHorizThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji84BDBoxVertThickHorizThinBottomTex[] = dgMsgKanji84BDBoxVertThickHorizThinBottomTex; + +#define dgMsgKanji84BEBoxVertThickHorizThinCenterTex "__OTR__textures/kanji/gMsgKanji84BEBoxVertThickHorizThinCenterTex" +static const ALIGN_ASSET(2) char gMsgKanji84BEBoxVertThickHorizThinCenterTex[] = dgMsgKanji84BEBoxVertThickHorizThinCenterTex; + +#define dgMsgKanji84BFEmptyTex "__OTR__textures/kanji/gMsgKanji84BFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji84BFEmptyTex[] = dgMsgKanji84BFEmptyTex; + +#define dgMsgKanji8540HalfwidthExclamationMarkTex "__OTR__textures/kanji/gMsgKanji8540HalfwidthExclamationMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8540HalfwidthExclamationMarkTex[] = dgMsgKanji8540HalfwidthExclamationMarkTex; + +#define dgMsgKanji8541HalfwidthQuotationMarkTex "__OTR__textures/kanji/gMsgKanji8541HalfwidthQuotationMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji8541HalfwidthQuotationMarkTex[] = dgMsgKanji8541HalfwidthQuotationMarkTex; + +#define dgMsgKanji8542HalfwidthNumberSignTex "__OTR__textures/kanji/gMsgKanji8542HalfwidthNumberSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8542HalfwidthNumberSignTex[] = dgMsgKanji8542HalfwidthNumberSignTex; + +#define dgMsgKanji8543HalfwidthDollarSignTex "__OTR__textures/kanji/gMsgKanji8543HalfwidthDollarSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8543HalfwidthDollarSignTex[] = dgMsgKanji8543HalfwidthDollarSignTex; + +#define dgMsgKanji8544HalfwidthPercentSignTex "__OTR__textures/kanji/gMsgKanji8544HalfwidthPercentSignTex" +static const ALIGN_ASSET(2) char gMsgKanji8544HalfwidthPercentSignTex[] = dgMsgKanji8544HalfwidthPercentSignTex; + +#define dgMsgKanji8545HalfwidthAmpersandTex "__OTR__textures/kanji/gMsgKanji8545HalfwidthAmpersandTex" +static const ALIGN_ASSET(2) char gMsgKanji8545HalfwidthAmpersandTex[] = dgMsgKanji8545HalfwidthAmpersandTex; + +#define dgMsgKanji8546HalfwidthApostropheTex "__OTR__textures/kanji/gMsgKanji8546HalfwidthApostropheTex" +static const ALIGN_ASSET(2) char gMsgKanji8546HalfwidthApostropheTex[] = dgMsgKanji8546HalfwidthApostropheTex; + +#define dgMsgKanji8547HalfwidthParenthesesLeftTex "__OTR__textures/kanji/gMsgKanji8547HalfwidthParenthesesLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8547HalfwidthParenthesesLeftTex[] = dgMsgKanji8547HalfwidthParenthesesLeftTex; + +#define dgMsgKanji8548HalfwidthParenthesesRightTex "__OTR__textures/kanji/gMsgKanji8548HalfwidthParenthesesRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8548HalfwidthParenthesesRightTex[] = dgMsgKanji8548HalfwidthParenthesesRightTex; + +#define dgMsgKanji8549HalfwidthAsteriskTex "__OTR__textures/kanji/gMsgKanji8549HalfwidthAsteriskTex" +static const ALIGN_ASSET(2) char gMsgKanji8549HalfwidthAsteriskTex[] = dgMsgKanji8549HalfwidthAsteriskTex; + +#define dgMsgKanji854AHalfwidthPlusSignTex "__OTR__textures/kanji/gMsgKanji854AHalfwidthPlusSignTex" +static const ALIGN_ASSET(2) char gMsgKanji854AHalfwidthPlusSignTex[] = dgMsgKanji854AHalfwidthPlusSignTex; + +#define dgMsgKanji854BHalfwidthCommaTex "__OTR__textures/kanji/gMsgKanji854BHalfwidthCommaTex" +static const ALIGN_ASSET(2) char gMsgKanji854BHalfwidthCommaTex[] = dgMsgKanji854BHalfwidthCommaTex; + +#define dgMsgKanji854CHalfwidthHyphenMinusTex "__OTR__textures/kanji/gMsgKanji854CHalfwidthHyphenMinusTex" +static const ALIGN_ASSET(2) char gMsgKanji854CHalfwidthHyphenMinusTex[] = dgMsgKanji854CHalfwidthHyphenMinusTex; + +#define dgMsgKanji854DHalfwidthPeriodTex "__OTR__textures/kanji/gMsgKanji854DHalfwidthPeriodTex" +static const ALIGN_ASSET(2) char gMsgKanji854DHalfwidthPeriodTex[] = dgMsgKanji854DHalfwidthPeriodTex; + +#define dgMsgKanji854EHalfwidthSlashTex "__OTR__textures/kanji/gMsgKanji854EHalfwidthSlashTex" +static const ALIGN_ASSET(2) char gMsgKanji854EHalfwidthSlashTex[] = dgMsgKanji854EHalfwidthSlashTex; + +#define dgMsgKanji854FHalfwidth0Tex "__OTR__textures/kanji/gMsgKanji854FHalfwidth0Tex" +static const ALIGN_ASSET(2) char gMsgKanji854FHalfwidth0Tex[] = dgMsgKanji854FHalfwidth0Tex; + +#define dgMsgKanji8550Halfwidth1Tex "__OTR__textures/kanji/gMsgKanji8550Halfwidth1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8550Halfwidth1Tex[] = dgMsgKanji8550Halfwidth1Tex; + +#define dgMsgKanji8551Halfwidth2Tex "__OTR__textures/kanji/gMsgKanji8551Halfwidth2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8551Halfwidth2Tex[] = dgMsgKanji8551Halfwidth2Tex; + +#define dgMsgKanji8552Halfwidth3Tex "__OTR__textures/kanji/gMsgKanji8552Halfwidth3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8552Halfwidth3Tex[] = dgMsgKanji8552Halfwidth3Tex; + +#define dgMsgKanji8553Halfwidth4Tex "__OTR__textures/kanji/gMsgKanji8553Halfwidth4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8553Halfwidth4Tex[] = dgMsgKanji8553Halfwidth4Tex; + +#define dgMsgKanji855EHalfwidthQuestionMarkTex "__OTR__textures/kanji/gMsgKanji855EHalfwidthQuestionMarkTex" +static const ALIGN_ASSET(2) char gMsgKanji855EHalfwidthQuestionMarkTex[] = dgMsgKanji855EHalfwidthQuestionMarkTex; + +#define dgMsgKanji855FHalfwidthAtSignTex "__OTR__textures/kanji/gMsgKanji855FHalfwidthAtSignTex" +static const ALIGN_ASSET(2) char gMsgKanji855FHalfwidthAtSignTex[] = dgMsgKanji855FHalfwidthAtSignTex; + +#define dgMsgKanji8560HalfwidthCapitalATex "__OTR__textures/kanji/gMsgKanji8560HalfwidthCapitalATex" +static const ALIGN_ASSET(2) char gMsgKanji8560HalfwidthCapitalATex[] = dgMsgKanji8560HalfwidthCapitalATex; + +#define dgMsgKanji8561HalfwidthCapitalBTex "__OTR__textures/kanji/gMsgKanji8561HalfwidthCapitalBTex" +static const ALIGN_ASSET(2) char gMsgKanji8561HalfwidthCapitalBTex[] = dgMsgKanji8561HalfwidthCapitalBTex; + +#define dgMsgKanji8562HalfwidthCapitalCTex "__OTR__textures/kanji/gMsgKanji8562HalfwidthCapitalCTex" +static const ALIGN_ASSET(2) char gMsgKanji8562HalfwidthCapitalCTex[] = dgMsgKanji8562HalfwidthCapitalCTex; + +#define dgMsgKanji8563HalfwidthCapitalDTex "__OTR__textures/kanji/gMsgKanji8563HalfwidthCapitalDTex" +static const ALIGN_ASSET(2) char gMsgKanji8563HalfwidthCapitalDTex[] = dgMsgKanji8563HalfwidthCapitalDTex; + +#define dgMsgKanji8564HalfwidthCapitalETex "__OTR__textures/kanji/gMsgKanji8564HalfwidthCapitalETex" +static const ALIGN_ASSET(2) char gMsgKanji8564HalfwidthCapitalETex[] = dgMsgKanji8564HalfwidthCapitalETex; + +#define dgMsgKanji8565HalfwidthCapitalFTex "__OTR__textures/kanji/gMsgKanji8565HalfwidthCapitalFTex" +static const ALIGN_ASSET(2) char gMsgKanji8565HalfwidthCapitalFTex[] = dgMsgKanji8565HalfwidthCapitalFTex; + +#define dgMsgKanji8566HalfwidthCapitalGTex "__OTR__textures/kanji/gMsgKanji8566HalfwidthCapitalGTex" +static const ALIGN_ASSET(2) char gMsgKanji8566HalfwidthCapitalGTex[] = dgMsgKanji8566HalfwidthCapitalGTex; + +#define dgMsgKanji8567HalfwidthCapitalHTex "__OTR__textures/kanji/gMsgKanji8567HalfwidthCapitalHTex" +static const ALIGN_ASSET(2) char gMsgKanji8567HalfwidthCapitalHTex[] = dgMsgKanji8567HalfwidthCapitalHTex; + +#define dgMsgKanji8568HalfwidthCapitalITex "__OTR__textures/kanji/gMsgKanji8568HalfwidthCapitalITex" +static const ALIGN_ASSET(2) char gMsgKanji8568HalfwidthCapitalITex[] = dgMsgKanji8568HalfwidthCapitalITex; + +#define dgMsgKanji8569HalfwidthCapitalJTex "__OTR__textures/kanji/gMsgKanji8569HalfwidthCapitalJTex" +static const ALIGN_ASSET(2) char gMsgKanji8569HalfwidthCapitalJTex[] = dgMsgKanji8569HalfwidthCapitalJTex; + +#define dgMsgKanji856AHalfwidthCapitalKTex "__OTR__textures/kanji/gMsgKanji856AHalfwidthCapitalKTex" +static const ALIGN_ASSET(2) char gMsgKanji856AHalfwidthCapitalKTex[] = dgMsgKanji856AHalfwidthCapitalKTex; + +#define dgMsgKanji856BHalfwidthCapitalLTex "__OTR__textures/kanji/gMsgKanji856BHalfwidthCapitalLTex" +static const ALIGN_ASSET(2) char gMsgKanji856BHalfwidthCapitalLTex[] = dgMsgKanji856BHalfwidthCapitalLTex; + +#define dgMsgKanji856CHalfwidthCapitalMTex "__OTR__textures/kanji/gMsgKanji856CHalfwidthCapitalMTex" +static const ALIGN_ASSET(2) char gMsgKanji856CHalfwidthCapitalMTex[] = dgMsgKanji856CHalfwidthCapitalMTex; + +#define dgMsgKanji856DHalfwidthCapitalNTex "__OTR__textures/kanji/gMsgKanji856DHalfwidthCapitalNTex" +static const ALIGN_ASSET(2) char gMsgKanji856DHalfwidthCapitalNTex[] = dgMsgKanji856DHalfwidthCapitalNTex; + +#define dgMsgKanji856EHalfwidthCapitalOTex "__OTR__textures/kanji/gMsgKanji856EHalfwidthCapitalOTex" +static const ALIGN_ASSET(2) char gMsgKanji856EHalfwidthCapitalOTex[] = dgMsgKanji856EHalfwidthCapitalOTex; + +#define dgMsgKanji856FHalfwidthCapitalPTex "__OTR__textures/kanji/gMsgKanji856FHalfwidthCapitalPTex" +static const ALIGN_ASSET(2) char gMsgKanji856FHalfwidthCapitalPTex[] = dgMsgKanji856FHalfwidthCapitalPTex; + +#define dgMsgKanji8570HalfwidthCapitalQTex "__OTR__textures/kanji/gMsgKanji8570HalfwidthCapitalQTex" +static const ALIGN_ASSET(2) char gMsgKanji8570HalfwidthCapitalQTex[] = dgMsgKanji8570HalfwidthCapitalQTex; + +#define dgMsgKanji8571HalfwidthCapitalRTex "__OTR__textures/kanji/gMsgKanji8571HalfwidthCapitalRTex" +static const ALIGN_ASSET(2) char gMsgKanji8571HalfwidthCapitalRTex[] = dgMsgKanji8571HalfwidthCapitalRTex; + +#define dgMsgKanji857CHalfwidthSquareBracketRightTex "__OTR__textures/kanji/gMsgKanji857CHalfwidthSquareBracketRightTex" +static const ALIGN_ASSET(2) char gMsgKanji857CHalfwidthSquareBracketRightTex[] = dgMsgKanji857CHalfwidthSquareBracketRightTex; + +#define dgMsgKanji857DHalfwidthCircumflexAccentTex "__OTR__textures/kanji/gMsgKanji857DHalfwidthCircumflexAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji857DHalfwidthCircumflexAccentTex[] = dgMsgKanji857DHalfwidthCircumflexAccentTex; + +#define dgMsgKanji857EEmptyTex "__OTR__textures/kanji/gMsgKanji857EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji857EEmptyTex[] = dgMsgKanji857EEmptyTex; + +#define dgMsgKanji8580HalfwidthGraveAccentTex "__OTR__textures/kanji/gMsgKanji8580HalfwidthGraveAccentTex" +static const ALIGN_ASSET(2) char gMsgKanji8580HalfwidthGraveAccentTex[] = dgMsgKanji8580HalfwidthGraveAccentTex; + +#define dgMsgKanji8581HalfwidthLowercaseATex "__OTR__textures/kanji/gMsgKanji8581HalfwidthLowercaseATex" +static const ALIGN_ASSET(2) char gMsgKanji8581HalfwidthLowercaseATex[] = dgMsgKanji8581HalfwidthLowercaseATex; + +#define dgMsgKanji8582HalfwidthLowercaseBTex "__OTR__textures/kanji/gMsgKanji8582HalfwidthLowercaseBTex" +static const ALIGN_ASSET(2) char gMsgKanji8582HalfwidthLowercaseBTex[] = dgMsgKanji8582HalfwidthLowercaseBTex; + +#define dgMsgKanji8583HalfwidthLowercaseCTex "__OTR__textures/kanji/gMsgKanji8583HalfwidthLowercaseCTex" +static const ALIGN_ASSET(2) char gMsgKanji8583HalfwidthLowercaseCTex[] = dgMsgKanji8583HalfwidthLowercaseCTex; + +#define dgMsgKanji8584HalfwidthLowercaseDTex "__OTR__textures/kanji/gMsgKanji8584HalfwidthLowercaseDTex" +static const ALIGN_ASSET(2) char gMsgKanji8584HalfwidthLowercaseDTex[] = dgMsgKanji8584HalfwidthLowercaseDTex; + +#define dgMsgKanji8585HalfwidthLowercaseETex "__OTR__textures/kanji/gMsgKanji8585HalfwidthLowercaseETex" +static const ALIGN_ASSET(2) char gMsgKanji8585HalfwidthLowercaseETex[] = dgMsgKanji8585HalfwidthLowercaseETex; + +#define dgMsgKanji8591HalfwidthLowercaseQTex "__OTR__textures/kanji/gMsgKanji8591HalfwidthLowercaseQTex" +static const ALIGN_ASSET(2) char gMsgKanji8591HalfwidthLowercaseQTex[] = dgMsgKanji8591HalfwidthLowercaseQTex; + +#define dgMsgKanji8592HalfwidthLowercaseRTex "__OTR__textures/kanji/gMsgKanji8592HalfwidthLowercaseRTex" +static const ALIGN_ASSET(2) char gMsgKanji8592HalfwidthLowercaseRTex[] = dgMsgKanji8592HalfwidthLowercaseRTex; + +#define dgMsgKanji8593HalfwidthLowercaseSTex "__OTR__textures/kanji/gMsgKanji8593HalfwidthLowercaseSTex" +static const ALIGN_ASSET(2) char gMsgKanji8593HalfwidthLowercaseSTex[] = dgMsgKanji8593HalfwidthLowercaseSTex; + +#define dgMsgKanji8594HalfwidthLowercaseTTex "__OTR__textures/kanji/gMsgKanji8594HalfwidthLowercaseTTex" +static const ALIGN_ASSET(2) char gMsgKanji8594HalfwidthLowercaseTTex[] = dgMsgKanji8594HalfwidthLowercaseTTex; + +#define dgMsgKanji8595HalfwidthLowercaseUTex "__OTR__textures/kanji/gMsgKanji8595HalfwidthLowercaseUTex" +static const ALIGN_ASSET(2) char gMsgKanji8595HalfwidthLowercaseUTex[] = dgMsgKanji8595HalfwidthLowercaseUTex; + +#define dgMsgKanji8596HalfwidthLowercaseVTex "__OTR__textures/kanji/gMsgKanji8596HalfwidthLowercaseVTex" +static const ALIGN_ASSET(2) char gMsgKanji8596HalfwidthLowercaseVTex[] = dgMsgKanji8596HalfwidthLowercaseVTex; + +#define dgMsgKanji8597HalfwidthLowercaseWTex "__OTR__textures/kanji/gMsgKanji8597HalfwidthLowercaseWTex" +static const ALIGN_ASSET(2) char gMsgKanji8597HalfwidthLowercaseWTex[] = dgMsgKanji8597HalfwidthLowercaseWTex; + +#define dgMsgKanji8598HalfwidthLowercaseXTex "__OTR__textures/kanji/gMsgKanji8598HalfwidthLowercaseXTex" +static const ALIGN_ASSET(2) char gMsgKanji8598HalfwidthLowercaseXTex[] = dgMsgKanji8598HalfwidthLowercaseXTex; + +#define dgMsgKanji8599HalfwidthLowercaseYTex "__OTR__textures/kanji/gMsgKanji8599HalfwidthLowercaseYTex" +static const ALIGN_ASSET(2) char gMsgKanji8599HalfwidthLowercaseYTex[] = dgMsgKanji8599HalfwidthLowercaseYTex; + +#define dgMsgKanji859AHalfwidthLowercaseZTex "__OTR__textures/kanji/gMsgKanji859AHalfwidthLowercaseZTex" +static const ALIGN_ASSET(2) char gMsgKanji859AHalfwidthLowercaseZTex[] = dgMsgKanji859AHalfwidthLowercaseZTex; + +#define dgMsgKanji859FHalfwidthKutenTex "__OTR__textures/kanji/gMsgKanji859FHalfwidthKutenTex" +static const ALIGN_ASSET(2) char gMsgKanji859FHalfwidthKutenTex[] = dgMsgKanji859FHalfwidthKutenTex; + +#define dgMsgKanji85A0HalfwidthKagikakkoLeftTex "__OTR__textures/kanji/gMsgKanji85A0HalfwidthKagikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji85A0HalfwidthKagikakkoLeftTex[] = dgMsgKanji85A0HalfwidthKagikakkoLeftTex; + +#define dgMsgKanji85A1HalfwidthKagikakkoRightTex "__OTR__textures/kanji/gMsgKanji85A1HalfwidthKagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji85A1HalfwidthKagikakkoRightTex[] = dgMsgKanji85A1HalfwidthKagikakkoRightTex; + +#define dgMsgKanji85A2HalfwidthToutenTex "__OTR__textures/kanji/gMsgKanji85A2HalfwidthToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji85A2HalfwidthToutenTex[] = dgMsgKanji85A2HalfwidthToutenTex; + +#define dgMsgKanji85A3HalfwidthNakatenTex "__OTR__textures/kanji/gMsgKanji85A3HalfwidthNakatenTex" +static const ALIGN_ASSET(2) char gMsgKanji85A3HalfwidthNakatenTex[] = dgMsgKanji85A3HalfwidthNakatenTex; + +#define dgMsgKanji85A4HalfwidthKatakanaWoTex "__OTR__textures/kanji/gMsgKanji85A4HalfwidthKatakanaWoTex" +static const ALIGN_ASSET(2) char gMsgKanji85A4HalfwidthKatakanaWoTex[] = dgMsgKanji85A4HalfwidthKatakanaWoTex; + +#define dgMsgKanji85A5HalfwidthKatakanaSmallATex "__OTR__textures/kanji/gMsgKanji85A5HalfwidthKatakanaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji85A5HalfwidthKatakanaSmallATex[] = dgMsgKanji85A5HalfwidthKatakanaSmallATex; + +#define dgMsgKanji85A6HalfwidthKatakanaSmallITex "__OTR__textures/kanji/gMsgKanji85A6HalfwidthKatakanaSmallITex" +static const ALIGN_ASSET(2) char gMsgKanji85A6HalfwidthKatakanaSmallITex[] = dgMsgKanji85A6HalfwidthKatakanaSmallITex; + +#define dgMsgKanji85A7HalfwidthKatakanaSmallUTex "__OTR__textures/kanji/gMsgKanji85A7HalfwidthKatakanaSmallUTex" +static const ALIGN_ASSET(2) char gMsgKanji85A7HalfwidthKatakanaSmallUTex[] = dgMsgKanji85A7HalfwidthKatakanaSmallUTex; + +#define dgMsgKanji85A8HalfwidthKatakanaSmallETex "__OTR__textures/kanji/gMsgKanji85A8HalfwidthKatakanaSmallETex" +static const ALIGN_ASSET(2) char gMsgKanji85A8HalfwidthKatakanaSmallETex[] = dgMsgKanji85A8HalfwidthKatakanaSmallETex; + +#define dgMsgKanji85A9HalfwidthKatakanaSmallOTex "__OTR__textures/kanji/gMsgKanji85A9HalfwidthKatakanaSmallOTex" +static const ALIGN_ASSET(2) char gMsgKanji85A9HalfwidthKatakanaSmallOTex[] = dgMsgKanji85A9HalfwidthKatakanaSmallOTex; + +#define dgMsgKanji85AAHalfwidthKatakanaSmallYaTex "__OTR__textures/kanji/gMsgKanji85AAHalfwidthKatakanaSmallYaTex" +static const ALIGN_ASSET(2) char gMsgKanji85AAHalfwidthKatakanaSmallYaTex[] = dgMsgKanji85AAHalfwidthKatakanaSmallYaTex; + +#define dgMsgKanji85ABHalfwidthKatakanaSmallYuTex "__OTR__textures/kanji/gMsgKanji85ABHalfwidthKatakanaSmallYuTex" +static const ALIGN_ASSET(2) char gMsgKanji85ABHalfwidthKatakanaSmallYuTex[] = dgMsgKanji85ABHalfwidthKatakanaSmallYuTex; + +#define dgMsgKanji85ACHalfwidthKatakanaSmallYoTex "__OTR__textures/kanji/gMsgKanji85ACHalfwidthKatakanaSmallYoTex" +static const ALIGN_ASSET(2) char gMsgKanji85ACHalfwidthKatakanaSmallYoTex[] = dgMsgKanji85ACHalfwidthKatakanaSmallYoTex; + +#define dgMsgKanji85ADHalfwidthKatakanaSmallTsuTex "__OTR__textures/kanji/gMsgKanji85ADHalfwidthKatakanaSmallTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji85ADHalfwidthKatakanaSmallTsuTex[] = dgMsgKanji85ADHalfwidthKatakanaSmallTsuTex; + +#define dgMsgKanji85B3HalfwidthKatakanaOTex "__OTR__textures/kanji/gMsgKanji85B3HalfwidthKatakanaOTex" +static const ALIGN_ASSET(2) char gMsgKanji85B3HalfwidthKatakanaOTex[] = dgMsgKanji85B3HalfwidthKatakanaOTex; + +#define dgMsgKanji85B4HalfwidthKatakanaKaTex "__OTR__textures/kanji/gMsgKanji85B4HalfwidthKatakanaKaTex" +static const ALIGN_ASSET(2) char gMsgKanji85B4HalfwidthKatakanaKaTex[] = dgMsgKanji85B4HalfwidthKatakanaKaTex; + +#define dgMsgKanji85B5HalfwidthKatakanaKiTex "__OTR__textures/kanji/gMsgKanji85B5HalfwidthKatakanaKiTex" +static const ALIGN_ASSET(2) char gMsgKanji85B5HalfwidthKatakanaKiTex[] = dgMsgKanji85B5HalfwidthKatakanaKiTex; + +#define dgMsgKanji85B6HalfwidthKatakanaKuTex "__OTR__textures/kanji/gMsgKanji85B6HalfwidthKatakanaKuTex" +static const ALIGN_ASSET(2) char gMsgKanji85B6HalfwidthKatakanaKuTex[] = dgMsgKanji85B6HalfwidthKatakanaKuTex; + +#define dgMsgKanji85B7HalfwidthKatakanaKeTex "__OTR__textures/kanji/gMsgKanji85B7HalfwidthKatakanaKeTex" +static const ALIGN_ASSET(2) char gMsgKanji85B7HalfwidthKatakanaKeTex[] = dgMsgKanji85B7HalfwidthKatakanaKeTex; + +#define dgMsgKanji85B8HalfwidthKatakanaKoTex "__OTR__textures/kanji/gMsgKanji85B8HalfwidthKatakanaKoTex" +static const ALIGN_ASSET(2) char gMsgKanji85B8HalfwidthKatakanaKoTex[] = dgMsgKanji85B8HalfwidthKatakanaKoTex; + +#define dgMsgKanji85B9HalfwidthKatakanaSaTex "__OTR__textures/kanji/gMsgKanji85B9HalfwidthKatakanaSaTex" +static const ALIGN_ASSET(2) char gMsgKanji85B9HalfwidthKatakanaSaTex[] = dgMsgKanji85B9HalfwidthKatakanaSaTex; + +#define dgMsgKanji85BAHalfwidthKatakanaShiTex "__OTR__textures/kanji/gMsgKanji85BAHalfwidthKatakanaShiTex" +static const ALIGN_ASSET(2) char gMsgKanji85BAHalfwidthKatakanaShiTex[] = dgMsgKanji85BAHalfwidthKatakanaShiTex; + +#define dgMsgKanji85BBHalfwidthKatakanaSuTex "__OTR__textures/kanji/gMsgKanji85BBHalfwidthKatakanaSuTex" +static const ALIGN_ASSET(2) char gMsgKanji85BBHalfwidthKatakanaSuTex[] = dgMsgKanji85BBHalfwidthKatakanaSuTex; + +#define dgMsgKanji85BCHalfwidthKatakanaSeTex "__OTR__textures/kanji/gMsgKanji85BCHalfwidthKatakanaSeTex" +static const ALIGN_ASSET(2) char gMsgKanji85BCHalfwidthKatakanaSeTex[] = dgMsgKanji85BCHalfwidthKatakanaSeTex; + +#define dgMsgKanji85BDHalfwidthKatakanaSoTex "__OTR__textures/kanji/gMsgKanji85BDHalfwidthKatakanaSoTex" +static const ALIGN_ASSET(2) char gMsgKanji85BDHalfwidthKatakanaSoTex[] = dgMsgKanji85BDHalfwidthKatakanaSoTex; + +#define dgMsgKanji85BEHalfwidthKatakanaTaTex "__OTR__textures/kanji/gMsgKanji85BEHalfwidthKatakanaTaTex" +static const ALIGN_ASSET(2) char gMsgKanji85BEHalfwidthKatakanaTaTex[] = dgMsgKanji85BEHalfwidthKatakanaTaTex; + +#define dgMsgKanji85BFHalfwidthKatakanaChiTex "__OTR__textures/kanji/gMsgKanji85BFHalfwidthKatakanaChiTex" +static const ALIGN_ASSET(2) char gMsgKanji85BFHalfwidthKatakanaChiTex[] = dgMsgKanji85BFHalfwidthKatakanaChiTex; + +#define dgMsgKanji85C0HalfwidthKatakanaTsuTex "__OTR__textures/kanji/gMsgKanji85C0HalfwidthKatakanaTsuTex" +static const ALIGN_ASSET(2) char gMsgKanji85C0HalfwidthKatakanaTsuTex[] = dgMsgKanji85C0HalfwidthKatakanaTsuTex; + +#define dgMsgKanji85C1HalfwidthKatakanaTeTex "__OTR__textures/kanji/gMsgKanji85C1HalfwidthKatakanaTeTex" +static const ALIGN_ASSET(2) char gMsgKanji85C1HalfwidthKatakanaTeTex[] = dgMsgKanji85C1HalfwidthKatakanaTeTex; + +#define dgMsgKanji85DBHalfwidthKatakanaNTex "__OTR__textures/kanji/gMsgKanji85DBHalfwidthKatakanaNTex" +static const ALIGN_ASSET(2) char gMsgKanji85DBHalfwidthKatakanaNTex[] = dgMsgKanji85DBHalfwidthKatakanaNTex; + +#define dgMsgKanji85DCHalfwidthDakutenTex "__OTR__textures/kanji/gMsgKanji85DCHalfwidthDakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji85DCHalfwidthDakutenTex[] = dgMsgKanji85DCHalfwidthDakutenTex; + +#define dgMsgKanji85DDHalfwidthHandakutenTex "__OTR__textures/kanji/gMsgKanji85DDHalfwidthHandakutenTex" +static const ALIGN_ASSET(2) char gMsgKanji85DDHalfwidthHandakutenTex[] = dgMsgKanji85DDHalfwidthHandakutenTex; + +#define dgMsgKanji85DEHalfwidthKatakanaWiTex "__OTR__textures/kanji/gMsgKanji85DEHalfwidthKatakanaWiTex" +static const ALIGN_ASSET(2) char gMsgKanji85DEHalfwidthKatakanaWiTex[] = dgMsgKanji85DEHalfwidthKatakanaWiTex; + +#define dgMsgKanji85DFHalfwidthKatakanaWeTex "__OTR__textures/kanji/gMsgKanji85DFHalfwidthKatakanaWeTex" +static const ALIGN_ASSET(2) char gMsgKanji85DFHalfwidthKatakanaWeTex[] = dgMsgKanji85DFHalfwidthKatakanaWeTex; + +#define dgMsgKanji85E0HalfwidthKatakanaSmallWaTex "__OTR__textures/kanji/gMsgKanji85E0HalfwidthKatakanaSmallWaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E0HalfwidthKatakanaSmallWaTex[] = dgMsgKanji85E0HalfwidthKatakanaSmallWaTex; + +#define dgMsgKanji85E1HalfwidthKatakanaSmallKaTex "__OTR__textures/kanji/gMsgKanji85E1HalfwidthKatakanaSmallKaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E1HalfwidthKatakanaSmallKaTex[] = dgMsgKanji85E1HalfwidthKatakanaSmallKaTex; + +#define dgMsgKanji85E2HalfwidthKatakanaSmallKeTex "__OTR__textures/kanji/gMsgKanji85E2HalfwidthKatakanaSmallKeTex" +static const ALIGN_ASSET(2) char gMsgKanji85E2HalfwidthKatakanaSmallKeTex[] = dgMsgKanji85E2HalfwidthKatakanaSmallKeTex; + +#define dgMsgKanji85E3HalfwidthKatakanaVuTex "__OTR__textures/kanji/gMsgKanji85E3HalfwidthKatakanaVuTex" +static const ALIGN_ASSET(2) char gMsgKanji85E3HalfwidthKatakanaVuTex[] = dgMsgKanji85E3HalfwidthKatakanaVuTex; + +#define dgMsgKanji85E4HalfwidthKatakanaGaTex "__OTR__textures/kanji/gMsgKanji85E4HalfwidthKatakanaGaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E4HalfwidthKatakanaGaTex[] = dgMsgKanji85E4HalfwidthKatakanaGaTex; + +#define dgMsgKanji85E5HalfwidthKatakanaGiTex "__OTR__textures/kanji/gMsgKanji85E5HalfwidthKatakanaGiTex" +static const ALIGN_ASSET(2) char gMsgKanji85E5HalfwidthKatakanaGiTex[] = dgMsgKanji85E5HalfwidthKatakanaGiTex; + +#define dgMsgKanji85E6HalfwidthKatakanaGuTex "__OTR__textures/kanji/gMsgKanji85E6HalfwidthKatakanaGuTex" +static const ALIGN_ASSET(2) char gMsgKanji85E6HalfwidthKatakanaGuTex[] = dgMsgKanji85E6HalfwidthKatakanaGuTex; + +#define dgMsgKanji85E7HalfwidthKatakanaGeTex "__OTR__textures/kanji/gMsgKanji85E7HalfwidthKatakanaGeTex" +static const ALIGN_ASSET(2) char gMsgKanji85E7HalfwidthKatakanaGeTex[] = dgMsgKanji85E7HalfwidthKatakanaGeTex; + +#define dgMsgKanji85E8HalfwidthKatakanaGoTex "__OTR__textures/kanji/gMsgKanji85E8HalfwidthKatakanaGoTex" +static const ALIGN_ASSET(2) char gMsgKanji85E8HalfwidthKatakanaGoTex[] = dgMsgKanji85E8HalfwidthKatakanaGoTex; + +#define dgMsgKanji85E9HalfwidthKatakanaZaTex "__OTR__textures/kanji/gMsgKanji85E9HalfwidthKatakanaZaTex" +static const ALIGN_ASSET(2) char gMsgKanji85E9HalfwidthKatakanaZaTex[] = dgMsgKanji85E9HalfwidthKatakanaZaTex; + +#define dgMsgKanji85EAHalfwidthKatakanaJiTex "__OTR__textures/kanji/gMsgKanji85EAHalfwidthKatakanaJiTex" +static const ALIGN_ASSET(2) char gMsgKanji85EAHalfwidthKatakanaJiTex[] = dgMsgKanji85EAHalfwidthKatakanaJiTex; + +#define dgMsgKanji85EBHalfwidthKatakanaZuTex "__OTR__textures/kanji/gMsgKanji85EBHalfwidthKatakanaZuTex" +static const ALIGN_ASSET(2) char gMsgKanji85EBHalfwidthKatakanaZuTex[] = dgMsgKanji85EBHalfwidthKatakanaZuTex; + +#define dgMsgKanji85ECHalfwidthKatakanaZeTex "__OTR__textures/kanji/gMsgKanji85ECHalfwidthKatakanaZeTex" +static const ALIGN_ASSET(2) char gMsgKanji85ECHalfwidthKatakanaZeTex[] = dgMsgKanji85ECHalfwidthKatakanaZeTex; + +#define dgMsgKanji85EDHalfwidthKatakanaZoTex "__OTR__textures/kanji/gMsgKanji85EDHalfwidthKatakanaZoTex" +static const ALIGN_ASSET(2) char gMsgKanji85EDHalfwidthKatakanaZoTex[] = dgMsgKanji85EDHalfwidthKatakanaZoTex; + +#define dgMsgKanji85EEHalfwidthKatakanaDaTex "__OTR__textures/kanji/gMsgKanji85EEHalfwidthKatakanaDaTex" +static const ALIGN_ASSET(2) char gMsgKanji85EEHalfwidthKatakanaDaTex[] = dgMsgKanji85EEHalfwidthKatakanaDaTex; + +#define dgMsgKanji85EFHalfwidthKatakanaDiTex "__OTR__textures/kanji/gMsgKanji85EFHalfwidthKatakanaDiTex" +static const ALIGN_ASSET(2) char gMsgKanji85EFHalfwidthKatakanaDiTex[] = dgMsgKanji85EFHalfwidthKatakanaDiTex; + +#define dgMsgKanji85F0HalfwidthKatakanaDuTex "__OTR__textures/kanji/gMsgKanji85F0HalfwidthKatakanaDuTex" +static const ALIGN_ASSET(2) char gMsgKanji85F0HalfwidthKatakanaDuTex[] = dgMsgKanji85F0HalfwidthKatakanaDuTex; + +#define dgMsgKanji85F1HalfwidthKatakanaDeTex "__OTR__textures/kanji/gMsgKanji85F1HalfwidthKatakanaDeTex" +static const ALIGN_ASSET(2) char gMsgKanji85F1HalfwidthKatakanaDeTex[] = dgMsgKanji85F1HalfwidthKatakanaDeTex; + +#define dgMsgKanji85F2HalfwidthKatakanaDoTex "__OTR__textures/kanji/gMsgKanji85F2HalfwidthKatakanaDoTex" +static const ALIGN_ASSET(2) char gMsgKanji85F2HalfwidthKatakanaDoTex[] = dgMsgKanji85F2HalfwidthKatakanaDoTex; + +#define dgMsgKanji85F3HalfwidthKatakanaBaTex "__OTR__textures/kanji/gMsgKanji85F3HalfwidthKatakanaBaTex" +static const ALIGN_ASSET(2) char gMsgKanji85F3HalfwidthKatakanaBaTex[] = dgMsgKanji85F3HalfwidthKatakanaBaTex; + +#define dgMsgKanji85F4HalfwidthKatakanaPaTex "__OTR__textures/kanji/gMsgKanji85F4HalfwidthKatakanaPaTex" +static const ALIGN_ASSET(2) char gMsgKanji85F4HalfwidthKatakanaPaTex[] = dgMsgKanji85F4HalfwidthKatakanaPaTex; + +#define dgMsgKanji85F5HalfwidthKatakanaBiTex "__OTR__textures/kanji/gMsgKanji85F5HalfwidthKatakanaBiTex" +static const ALIGN_ASSET(2) char gMsgKanji85F5HalfwidthKatakanaBiTex[] = dgMsgKanji85F5HalfwidthKatakanaBiTex; + +#define dgMsgKanji8640EmptyTex "__OTR__textures/kanji/gMsgKanji8640EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8640EmptyTex[] = dgMsgKanji8640EmptyTex; + +#define dgMsgKanji8641TategakiToutenTex "__OTR__textures/kanji/gMsgKanji8641TategakiToutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8641TategakiToutenTex[] = dgMsgKanji8641TategakiToutenTex; + +#define dgMsgKanji8642TategakiKutenTex "__OTR__textures/kanji/gMsgKanji8642TategakiKutenTex" +static const ALIGN_ASSET(2) char gMsgKanji8642TategakiKutenTex[] = dgMsgKanji8642TategakiKutenTex; + +#define dgMsgKanji8643HalfwidthHorizontalThinTex "__OTR__textures/kanji/gMsgKanji8643HalfwidthHorizontalThinTex" +static const ALIGN_ASSET(2) char gMsgKanji8643HalfwidthHorizontalThinTex[] = dgMsgKanji8643HalfwidthHorizontalThinTex; + +#define dgMsgKanji8644HalfwidthHorizontalThickTex "__OTR__textures/kanji/gMsgKanji8644HalfwidthHorizontalThickTex" +static const ALIGN_ASSET(2) char gMsgKanji8644HalfwidthHorizontalThickTex[] = dgMsgKanji8644HalfwidthHorizontalThickTex; + +#define dgMsgKanji8645HalfwidthVerticalThinTex "__OTR__textures/kanji/gMsgKanji8645HalfwidthVerticalThinTex" +static const ALIGN_ASSET(2) char gMsgKanji8645HalfwidthVerticalThinTex[] = dgMsgKanji8645HalfwidthVerticalThinTex; + +#define dgMsgKanji8646HalfwidthVerticalThickTex "__OTR__textures/kanji/gMsgKanji8646HalfwidthVerticalThickTex" +static const ALIGN_ASSET(2) char gMsgKanji8646HalfwidthVerticalThickTex[] = dgMsgKanji8646HalfwidthVerticalThickTex; + +#define dgMsgKanji8647HalfwidthHorizontalThinDottedTex "__OTR__textures/kanji/gMsgKanji8647HalfwidthHorizontalThinDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji8647HalfwidthHorizontalThinDottedTex[] = dgMsgKanji8647HalfwidthHorizontalThinDottedTex; + +#define dgMsgKanji8648HalfwidthHorizontalThickDottedTex "__OTR__textures/kanji/gMsgKanji8648HalfwidthHorizontalThickDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji8648HalfwidthHorizontalThickDottedTex[] = dgMsgKanji8648HalfwidthHorizontalThickDottedTex; + +#define dgMsgKanji8649HalfwidthVerticalThinDottedTex "__OTR__textures/kanji/gMsgKanji8649HalfwidthVerticalThinDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji8649HalfwidthVerticalThinDottedTex[] = dgMsgKanji8649HalfwidthVerticalThinDottedTex; + +#define dgMsgKanji864AHalfwidthVerticalThickDottedTex "__OTR__textures/kanji/gMsgKanji864AHalfwidthVerticalThickDottedTex" +static const ALIGN_ASSET(2) char gMsgKanji864AHalfwidthVerticalThickDottedTex[] = dgMsgKanji864AHalfwidthVerticalThickDottedTex; + +#define dgMsgKanji864BHalfwidthHorizontalThinDotted2Tex "__OTR__textures/kanji/gMsgKanji864BHalfwidthHorizontalThinDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864BHalfwidthHorizontalThinDotted2Tex[] = dgMsgKanji864BHalfwidthHorizontalThinDotted2Tex; + +#define dgMsgKanji864CHalfwidthHorizontalThickDotted2Tex "__OTR__textures/kanji/gMsgKanji864CHalfwidthHorizontalThickDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864CHalfwidthHorizontalThickDotted2Tex[] = dgMsgKanji864CHalfwidthHorizontalThickDotted2Tex; + +#define dgMsgKanji864DHalfwidthVerticalThinDotted2Tex "__OTR__textures/kanji/gMsgKanji864DHalfwidthVerticalThinDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864DHalfwidthVerticalThinDotted2Tex[] = dgMsgKanji864DHalfwidthVerticalThinDotted2Tex; + +#define dgMsgKanji864EHalfwidthVerticalThickDotted2Tex "__OTR__textures/kanji/gMsgKanji864EHalfwidthVerticalThickDotted2Tex" +static const ALIGN_ASSET(2) char gMsgKanji864EHalfwidthVerticalThickDotted2Tex[] = dgMsgKanji864EHalfwidthVerticalThickDotted2Tex; + +#define dgMsgKanji864FHalfwidthBoxThinTopLeftTex "__OTR__textures/kanji/gMsgKanji864FHalfwidthBoxThinTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji864FHalfwidthBoxThinTopLeftTex[] = dgMsgKanji864FHalfwidthBoxThinTopLeftTex; + +#define dgMsgKanji8650VerticalFarRightTex "__OTR__textures/kanji/gMsgKanji8650VerticalFarRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8650VerticalFarRightTex[] = dgMsgKanji8650VerticalFarRightTex; + +#define dgMsgKanji8651VerticalFarLeftTex "__OTR__textures/kanji/gMsgKanji8651VerticalFarLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8651VerticalFarLeftTex[] = dgMsgKanji8651VerticalFarLeftTex; + +#define dgMsgKanji8652HalfwidthBoxThickTopLeftTex "__OTR__textures/kanji/gMsgKanji8652HalfwidthBoxThickTopLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8652HalfwidthBoxThickTopLeftTex[] = dgMsgKanji8652HalfwidthBoxThickTopLeftTex; + +#define dgMsgKanji8653HalfwidthBoxThinTopRightTex "__OTR__textures/kanji/gMsgKanji8653HalfwidthBoxThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8653HalfwidthBoxThinTopRightTex[] = dgMsgKanji8653HalfwidthBoxThinTopRightTex; + +#define dgMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex "__OTR__textures/kanji/gMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex[] = dgMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex; + +#define dgMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex "__OTR__textures/kanji/gMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex[] = dgMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex; + +#define dgMsgKanji8656HalfwidthBoxThickTopRightTex "__OTR__textures/kanji/gMsgKanji8656HalfwidthBoxThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji8656HalfwidthBoxThickTopRightTex[] = dgMsgKanji8656HalfwidthBoxThickTopRightTex; + +#define dgMsgKanji8657HalfwidthBoxThinBottomLeftTex "__OTR__textures/kanji/gMsgKanji8657HalfwidthBoxThinBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8657HalfwidthBoxThinBottomLeftTex[] = dgMsgKanji8657HalfwidthBoxThinBottomLeftTex; + +#define dgMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex "__OTR__textures/kanji/gMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex[] = dgMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex; + +#define dgMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex "__OTR__textures/kanji/gMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex[] = dgMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex; + +#define dgMsgKanji865AHalfwidthBoxThickBottomLeftTex "__OTR__textures/kanji/gMsgKanji865AHalfwidthBoxThickBottomLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji865AHalfwidthBoxThickBottomLeftTex[] = dgMsgKanji865AHalfwidthBoxThickBottomLeftTex; + +#define dgMsgKanji865BTategakiChouonpuTex "__OTR__textures/kanji/gMsgKanji865BTategakiChouonpuTex" +static const ALIGN_ASSET(2) char gMsgKanji865BTategakiChouonpuTex[] = dgMsgKanji865BTategakiChouonpuTex; + +#define dgMsgKanji865CTategakiDashTex "__OTR__textures/kanji/gMsgKanji865CTategakiDashTex" +static const ALIGN_ASSET(2) char gMsgKanji865CTategakiDashTex[] = dgMsgKanji865CTategakiDashTex; + +#define dgMsgKanji865DTategakiHyphenTex "__OTR__textures/kanji/gMsgKanji865DTategakiHyphenTex" +static const ALIGN_ASSET(2) char gMsgKanji865DTategakiHyphenTex[] = dgMsgKanji865DTategakiHyphenTex; + +#define dgMsgKanji869BHalfwidthNijyuukagikakkoRightTex "__OTR__textures/kanji/gMsgKanji869BHalfwidthNijyuukagikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji869BHalfwidthNijyuukagikakkoRightTex[] = dgMsgKanji869BHalfwidthNijyuukagikakkoRightTex; + +#define dgMsgKanji869CHalfwidthSumitsukikakkoLeftTex "__OTR__textures/kanji/gMsgKanji869CHalfwidthSumitsukikakkoLeftTex" +static const ALIGN_ASSET(2) char gMsgKanji869CHalfwidthSumitsukikakkoLeftTex[] = dgMsgKanji869CHalfwidthSumitsukikakkoLeftTex; + +#define dgMsgKanji869DHalfwidthSumitsukikakkoRightTex "__OTR__textures/kanji/gMsgKanji869DHalfwidthSumitsukikakkoRightTex" +static const ALIGN_ASSET(2) char gMsgKanji869DHalfwidthSumitsukikakkoRightTex[] = dgMsgKanji869DHalfwidthSumitsukikakkoRightTex; + +#define dgMsgKanji869EHalfwidthHyphenTex "__OTR__textures/kanji/gMsgKanji869EHalfwidthHyphenTex" +static const ALIGN_ASSET(2) char gMsgKanji869EHalfwidthHyphenTex[] = dgMsgKanji869EHalfwidthHyphenTex; + +#define dgMsgKanji869FEmptyTex "__OTR__textures/kanji/gMsgKanji869FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji869FEmptyTex[] = dgMsgKanji869FEmptyTex; + +#define dgMsgKanji86A0EmptyTex "__OTR__textures/kanji/gMsgKanji86A0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A0EmptyTex[] = dgMsgKanji86A0EmptyTex; + +#define dgMsgKanji86A1EmptyTex "__OTR__textures/kanji/gMsgKanji86A1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A1EmptyTex[] = dgMsgKanji86A1EmptyTex; + +#define dgMsgKanji86A2EmptyTex "__OTR__textures/kanji/gMsgKanji86A2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A2EmptyTex[] = dgMsgKanji86A2EmptyTex; + +#define dgMsgKanji86A3EmptyTex "__OTR__textures/kanji/gMsgKanji86A3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A3EmptyTex[] = dgMsgKanji86A3EmptyTex; + +#define dgMsgKanji86A4EmptyTex "__OTR__textures/kanji/gMsgKanji86A4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A4EmptyTex[] = dgMsgKanji86A4EmptyTex; + +#define dgMsgKanji86A5EmptyTex "__OTR__textures/kanji/gMsgKanji86A5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A5EmptyTex[] = dgMsgKanji86A5EmptyTex; + +#define dgMsgKanji86A6EmptyTex "__OTR__textures/kanji/gMsgKanji86A6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji86A6EmptyTex[] = dgMsgKanji86A6EmptyTex; + +#define dgMsgKanji86B3BoxVertThinHorizThickTopRightTex "__OTR__textures/kanji/gMsgKanji86B3BoxVertThinHorizThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86B3BoxVertThinHorizThickTopRightTex[] = dgMsgKanji86B3BoxVertThinHorizThickTopRightTex; + +#define dgMsgKanji86B4BoxVertThickHorizThinTopRightTex "__OTR__textures/kanji/gMsgKanji86B4BoxVertThickHorizThinTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86B4BoxVertThickHorizThinTopRightTex[] = dgMsgKanji86B4BoxVertThickHorizThinTopRightTex; + +#define dgMsgKanji86B5BoxThickTopRightTex "__OTR__textures/kanji/gMsgKanji86B5BoxThickTopRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86B5BoxThickTopRightTex[] = dgMsgKanji86B5BoxThickTopRightTex; + +#define dgMsgKanji86C7BoxVertThinHorizThickRightTex "__OTR__textures/kanji/gMsgKanji86C7BoxVertThinHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86C7BoxVertThinHorizThickRightTex[] = dgMsgKanji86C7BoxVertThinHorizThickRightTex; + +#define dgMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex "__OTR__textures/kanji/gMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex[] = dgMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex; + +#define dgMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex "__OTR__textures/kanji/gMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex[] = dgMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex; + +#define dgMsgKanji86CABoxVertThickHorizThinRightTex "__OTR__textures/kanji/gMsgKanji86CABoxVertThickHorizThinRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CABoxVertThickHorizThinRightTex[] = dgMsgKanji86CABoxVertThickHorizThinRightTex; + +#define dgMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex "__OTR__textures/kanji/gMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex[] = dgMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex; + +#define dgMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex "__OTR__textures/kanji/gMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex[] = dgMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex; + +#define dgMsgKanji86CDBoxThickRightTex "__OTR__textures/kanji/gMsgKanji86CDBoxThickRightTex" +static const ALIGN_ASSET(2) char gMsgKanji86CDBoxThickRightTex[] = dgMsgKanji86CDBoxThickRightTex; + +#define dgMsgKanji86CEBoxThinTopTex "__OTR__textures/kanji/gMsgKanji86CEBoxThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86CEBoxThinTopTex[] = dgMsgKanji86CEBoxThinTopTex; + +#define dgMsgKanji86CFBoxVertThinLeftThickRightThinTopTex "__OTR__textures/kanji/gMsgKanji86CFBoxVertThinLeftThickRightThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86CFBoxVertThinLeftThickRightThinTopTex[] = dgMsgKanji86CFBoxVertThinLeftThickRightThinTopTex; + +#define dgMsgKanji86D0BoxVertThinLeftThinRightThickTopTex "__OTR__textures/kanji/gMsgKanji86D0BoxVertThinLeftThinRightThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D0BoxVertThinLeftThinRightThickTopTex[] = dgMsgKanji86D0BoxVertThinLeftThinRightThickTopTex; + +#define dgMsgKanji86D1BoxVertThinHorizThickTopTex "__OTR__textures/kanji/gMsgKanji86D1BoxVertThinHorizThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D1BoxVertThinHorizThickTopTex[] = dgMsgKanji86D1BoxVertThinHorizThickTopTex; + +#define dgMsgKanji86D2BoxVertThickHorizThinTopTex "__OTR__textures/kanji/gMsgKanji86D2BoxVertThickHorizThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D2BoxVertThickHorizThinTopTex[] = dgMsgKanji86D2BoxVertThickHorizThinTopTex; + +#define dgMsgKanji86D3BoxVertThickLeftThickRightThinTopTex "__OTR__textures/kanji/gMsgKanji86D3BoxVertThickLeftThickRightThinTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D3BoxVertThickLeftThickRightThinTopTex[] = dgMsgKanji86D3BoxVertThickLeftThickRightThinTopTex; + +#define dgMsgKanji86D4BoxVertThickLeftThinRightThickTopTex "__OTR__textures/kanji/gMsgKanji86D4BoxVertThickLeftThinRightThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D4BoxVertThickLeftThinRightThickTopTex[] = dgMsgKanji86D4BoxVertThickLeftThinRightThickTopTex; + +#define dgMsgKanji86D5BoxThickTopTex "__OTR__textures/kanji/gMsgKanji86D5BoxThickTopTex" +static const ALIGN_ASSET(2) char gMsgKanji86D5BoxThickTopTex[] = dgMsgKanji86D5BoxThickTopTex; + +#define dgMsgKanji86D6BoxThinBottomTex "__OTR__textures/kanji/gMsgKanji86D6BoxThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji86D6BoxThinBottomTex[] = dgMsgKanji86D6BoxThinBottomTex; + +#define dgMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex "__OTR__textures/kanji/gMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex" +static const ALIGN_ASSET(2) char gMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex[] = dgMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex; + +#define dgMsgKanji8740Circled1Tex "__OTR__textures/kanji/gMsgKanji8740Circled1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8740Circled1Tex[] = dgMsgKanji8740Circled1Tex; + +#define dgMsgKanji8741Circled2Tex "__OTR__textures/kanji/gMsgKanji8741Circled2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8741Circled2Tex[] = dgMsgKanji8741Circled2Tex; + +#define dgMsgKanji8742Circled3Tex "__OTR__textures/kanji/gMsgKanji8742Circled3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8742Circled3Tex[] = dgMsgKanji8742Circled3Tex; + +#define dgMsgKanji8743Circled4Tex "__OTR__textures/kanji/gMsgKanji8743Circled4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8743Circled4Tex[] = dgMsgKanji8743Circled4Tex; + +#define dgMsgKanji8744Circled5Tex "__OTR__textures/kanji/gMsgKanji8744Circled5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8744Circled5Tex[] = dgMsgKanji8744Circled5Tex; + +#define dgMsgKanji8745Circled6Tex "__OTR__textures/kanji/gMsgKanji8745Circled6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8745Circled6Tex[] = dgMsgKanji8745Circled6Tex; + +#define dgMsgKanji8746Circled7Tex "__OTR__textures/kanji/gMsgKanji8746Circled7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8746Circled7Tex[] = dgMsgKanji8746Circled7Tex; + +#define dgMsgKanji8747Circled8Tex "__OTR__textures/kanji/gMsgKanji8747Circled8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8747Circled8Tex[] = dgMsgKanji8747Circled8Tex; + +#define dgMsgKanji8748Circled9Tex "__OTR__textures/kanji/gMsgKanji8748Circled9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8748Circled9Tex[] = dgMsgKanji8748Circled9Tex; + +#define dgMsgKanji8749Circled10Tex "__OTR__textures/kanji/gMsgKanji8749Circled10Tex" +static const ALIGN_ASSET(2) char gMsgKanji8749Circled10Tex[] = dgMsgKanji8749Circled10Tex; + +#define dgMsgKanji874ACircled11Tex "__OTR__textures/kanji/gMsgKanji874ACircled11Tex" +static const ALIGN_ASSET(2) char gMsgKanji874ACircled11Tex[] = dgMsgKanji874ACircled11Tex; + +#define dgMsgKanji874BCircled12Tex "__OTR__textures/kanji/gMsgKanji874BCircled12Tex" +static const ALIGN_ASSET(2) char gMsgKanji874BCircled12Tex[] = dgMsgKanji874BCircled12Tex; + +#define dgMsgKanji874CCircled13Tex "__OTR__textures/kanji/gMsgKanji874CCircled13Tex" +static const ALIGN_ASSET(2) char gMsgKanji874CCircled13Tex[] = dgMsgKanji874CCircled13Tex; + +#define dgMsgKanji874DCircled14Tex "__OTR__textures/kanji/gMsgKanji874DCircled14Tex" +static const ALIGN_ASSET(2) char gMsgKanji874DCircled14Tex[] = dgMsgKanji874DCircled14Tex; + +#define dgMsgKanji874ECircled15Tex "__OTR__textures/kanji/gMsgKanji874ECircled15Tex" +static const ALIGN_ASSET(2) char gMsgKanji874ECircled15Tex[] = dgMsgKanji874ECircled15Tex; + +#define dgMsgKanji874FCircled16Tex "__OTR__textures/kanji/gMsgKanji874FCircled16Tex" +static const ALIGN_ASSET(2) char gMsgKanji874FCircled16Tex[] = dgMsgKanji874FCircled16Tex; + +#define dgMsgKanji8750Circled17Tex "__OTR__textures/kanji/gMsgKanji8750Circled17Tex" +static const ALIGN_ASSET(2) char gMsgKanji8750Circled17Tex[] = dgMsgKanji8750Circled17Tex; + +#define dgMsgKanji8751Circled18Tex "__OTR__textures/kanji/gMsgKanji8751Circled18Tex" +static const ALIGN_ASSET(2) char gMsgKanji8751Circled18Tex[] = dgMsgKanji8751Circled18Tex; + +#define dgMsgKanji8752Circled19Tex "__OTR__textures/kanji/gMsgKanji8752Circled19Tex" +static const ALIGN_ASSET(2) char gMsgKanji8752Circled19Tex[] = dgMsgKanji8752Circled19Tex; + +#define dgMsgKanji8753Circled20Tex "__OTR__textures/kanji/gMsgKanji8753Circled20Tex" +static const ALIGN_ASSET(2) char gMsgKanji8753Circled20Tex[] = dgMsgKanji8753Circled20Tex; + +#define dgMsgKanji8754RomanNumeral1Tex "__OTR__textures/kanji/gMsgKanji8754RomanNumeral1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8754RomanNumeral1Tex[] = dgMsgKanji8754RomanNumeral1Tex; + +#define dgMsgKanji8755RomanNumeral2Tex "__OTR__textures/kanji/gMsgKanji8755RomanNumeral2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8755RomanNumeral2Tex[] = dgMsgKanji8755RomanNumeral2Tex; + +#define dgMsgKanji8756RomanNumeral3Tex "__OTR__textures/kanji/gMsgKanji8756RomanNumeral3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8756RomanNumeral3Tex[] = dgMsgKanji8756RomanNumeral3Tex; + +#define dgMsgKanji8757RomanNumeral4Tex "__OTR__textures/kanji/gMsgKanji8757RomanNumeral4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8757RomanNumeral4Tex[] = dgMsgKanji8757RomanNumeral4Tex; + +#define dgMsgKanji8758RomanNumeral5Tex "__OTR__textures/kanji/gMsgKanji8758RomanNumeral5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8758RomanNumeral5Tex[] = dgMsgKanji8758RomanNumeral5Tex; + +#define dgMsgKanji8791IdenticalToTex "__OTR__textures/kanji/gMsgKanji8791IdenticalToTex" +static const ALIGN_ASSET(2) char gMsgKanji8791IdenticalToTex[] = dgMsgKanji8791IdenticalToTex; + +#define dgMsgKanji8792IntegralTex "__OTR__textures/kanji/gMsgKanji8792IntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji8792IntegralTex[] = dgMsgKanji8792IntegralTex; + +#define dgMsgKanji8793CountourIntegralTex "__OTR__textures/kanji/gMsgKanji8793CountourIntegralTex" +static const ALIGN_ASSET(2) char gMsgKanji8793CountourIntegralTex[] = dgMsgKanji8793CountourIntegralTex; + +#define dgMsgKanji8794SummationTex "__OTR__textures/kanji/gMsgKanji8794SummationTex" +static const ALIGN_ASSET(2) char gMsgKanji8794SummationTex[] = dgMsgKanji8794SummationTex; + +#define dgMsgKanji8795SquareRootTex "__OTR__textures/kanji/gMsgKanji8795SquareRootTex" +static const ALIGN_ASSET(2) char gMsgKanji8795SquareRootTex[] = dgMsgKanji8795SquareRootTex; + +#define dgMsgKanji8796PerpendicularSymbolTex "__OTR__textures/kanji/gMsgKanji8796PerpendicularSymbolTex" +static const ALIGN_ASSET(2) char gMsgKanji8796PerpendicularSymbolTex[] = dgMsgKanji8796PerpendicularSymbolTex; + +#define dgMsgKanji8797AngleTex "__OTR__textures/kanji/gMsgKanji8797AngleTex" +static const ALIGN_ASSET(2) char gMsgKanji8797AngleTex[] = dgMsgKanji8797AngleTex; + +#define dgMsgKanji8798RightAngleTex "__OTR__textures/kanji/gMsgKanji8798RightAngleTex" +static const ALIGN_ASSET(2) char gMsgKanji8798RightAngleTex[] = dgMsgKanji8798RightAngleTex; + +#define dgMsgKanji8799RightTriangleTex "__OTR__textures/kanji/gMsgKanji8799RightTriangleTex" +static const ALIGN_ASSET(2) char gMsgKanji8799RightTriangleTex[] = dgMsgKanji8799RightTriangleTex; + +#define dgMsgKanji879ABecauseTex "__OTR__textures/kanji/gMsgKanji879ABecauseTex" +static const ALIGN_ASSET(2) char gMsgKanji879ABecauseTex[] = dgMsgKanji879ABecauseTex; + +#define dgMsgKanji879BIntersectionTex "__OTR__textures/kanji/gMsgKanji879BIntersectionTex" +static const ALIGN_ASSET(2) char gMsgKanji879BIntersectionTex[] = dgMsgKanji879BIntersectionTex; + +#define dgMsgKanji879CUnionTex "__OTR__textures/kanji/gMsgKanji879CUnionTex" +static const ALIGN_ASSET(2) char gMsgKanji879CUnionTex[] = dgMsgKanji879CUnionTex; + +#define dgMsgKanji879DEmptyTex "__OTR__textures/kanji/gMsgKanji879DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji879DEmptyTex[] = dgMsgKanji879DEmptyTex; + +#define dgMsgKanji879EEmptyTex "__OTR__textures/kanji/gMsgKanji879EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji879EEmptyTex[] = dgMsgKanji879EEmptyTex; + +#define dgMsgKanji879FHiraganaSmallATex "__OTR__textures/kanji/gMsgKanji879FHiraganaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji879FHiraganaSmallATex[] = dgMsgKanji879FHiraganaSmallATex; + +#define dgMsgKanji87A0EmptyTex "__OTR__textures/kanji/gMsgKanji87A0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A0EmptyTex[] = dgMsgKanji87A0EmptyTex; + +#define dgMsgKanji87A1EmptyTex "__OTR__textures/kanji/gMsgKanji87A1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A1EmptyTex[] = dgMsgKanji87A1EmptyTex; + +#define dgMsgKanji87A2EmptyTex "__OTR__textures/kanji/gMsgKanji87A2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A2EmptyTex[] = dgMsgKanji87A2EmptyTex; + +#define dgMsgKanji87A3EmptyTex "__OTR__textures/kanji/gMsgKanji87A3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A3EmptyTex[] = dgMsgKanji87A3EmptyTex; + +#define dgMsgKanji87A4EmptyTex "__OTR__textures/kanji/gMsgKanji87A4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A4EmptyTex[] = dgMsgKanji87A4EmptyTex; + +#define dgMsgKanji87A5EmptyTex "__OTR__textures/kanji/gMsgKanji87A5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A5EmptyTex[] = dgMsgKanji87A5EmptyTex; + +#define dgMsgKanji87A6EmptyTex "__OTR__textures/kanji/gMsgKanji87A6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A6EmptyTex[] = dgMsgKanji87A6EmptyTex; + +#define dgMsgKanji87A7EmptyTex "__OTR__textures/kanji/gMsgKanji87A7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A7EmptyTex[] = dgMsgKanji87A7EmptyTex; + +#define dgMsgKanji87A8EmptyTex "__OTR__textures/kanji/gMsgKanji87A8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A8EmptyTex[] = dgMsgKanji87A8EmptyTex; + +#define dgMsgKanji87A9EmptyTex "__OTR__textures/kanji/gMsgKanji87A9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87A9EmptyTex[] = dgMsgKanji87A9EmptyTex; + +#define dgMsgKanji87AAEmptyTex "__OTR__textures/kanji/gMsgKanji87AAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87AAEmptyTex[] = dgMsgKanji87AAEmptyTex; + +#define dgMsgKanji87ABEmptyTex "__OTR__textures/kanji/gMsgKanji87ABEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87ABEmptyTex[] = dgMsgKanji87ABEmptyTex; + +#define dgMsgKanji87ACEmptyTex "__OTR__textures/kanji/gMsgKanji87ACEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87ACEmptyTex[] = dgMsgKanji87ACEmptyTex; + +#define dgMsgKanji87ADEmptyTex "__OTR__textures/kanji/gMsgKanji87ADEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87ADEmptyTex[] = dgMsgKanji87ADEmptyTex; + +#define dgMsgKanji87AEEmptyTex "__OTR__textures/kanji/gMsgKanji87AEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87AEEmptyTex[] = dgMsgKanji87AEEmptyTex; + +#define dgMsgKanji87AFEmptyTex "__OTR__textures/kanji/gMsgKanji87AFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87AFEmptyTex[] = dgMsgKanji87AFEmptyTex; + +#define dgMsgKanji87B0EmptyTex "__OTR__textures/kanji/gMsgKanji87B0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B0EmptyTex[] = dgMsgKanji87B0EmptyTex; + +#define dgMsgKanji87B1EmptyTex "__OTR__textures/kanji/gMsgKanji87B1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B1EmptyTex[] = dgMsgKanji87B1EmptyTex; + +#define dgMsgKanji87B2EmptyTex "__OTR__textures/kanji/gMsgKanji87B2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B2EmptyTex[] = dgMsgKanji87B2EmptyTex; + +#define dgMsgKanji87B3EmptyTex "__OTR__textures/kanji/gMsgKanji87B3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B3EmptyTex[] = dgMsgKanji87B3EmptyTex; + +#define dgMsgKanji87B4EmptyTex "__OTR__textures/kanji/gMsgKanji87B4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B4EmptyTex[] = dgMsgKanji87B4EmptyTex; + +#define dgMsgKanji87B5EmptyTex "__OTR__textures/kanji/gMsgKanji87B5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87B5EmptyTex[] = dgMsgKanji87B5EmptyTex; + +#define dgMsgKanji87BDEmptyTex "__OTR__textures/kanji/gMsgKanji87BDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87BDEmptyTex[] = dgMsgKanji87BDEmptyTex; + +#define dgMsgKanji87BEEmptyTex "__OTR__textures/kanji/gMsgKanji87BEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87BEEmptyTex[] = dgMsgKanji87BEEmptyTex; + +#define dgMsgKanji87BFEmptyTex "__OTR__textures/kanji/gMsgKanji87BFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87BFEmptyTex[] = dgMsgKanji87BFEmptyTex; + +#define dgMsgKanji87C0EmptyTex "__OTR__textures/kanji/gMsgKanji87C0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87C0EmptyTex[] = dgMsgKanji87C0EmptyTex; + +#define dgMsgKanji87C1EmptyTex "__OTR__textures/kanji/gMsgKanji87C1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87C1EmptyTex[] = dgMsgKanji87C1EmptyTex; + +#define dgMsgKanji87E5EmptyTex "__OTR__textures/kanji/gMsgKanji87E5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E5EmptyTex[] = dgMsgKanji87E5EmptyTex; + +#define dgMsgKanji87E6EmptyTex "__OTR__textures/kanji/gMsgKanji87E6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E6EmptyTex[] = dgMsgKanji87E6EmptyTex; + +#define dgMsgKanji87E7EmptyTex "__OTR__textures/kanji/gMsgKanji87E7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E7EmptyTex[] = dgMsgKanji87E7EmptyTex; + +#define dgMsgKanji87E8EmptyTex "__OTR__textures/kanji/gMsgKanji87E8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87E8EmptyTex[] = dgMsgKanji87E8EmptyTex; + +#define dgMsgKanji87FAEmptyTex "__OTR__textures/kanji/gMsgKanji87FAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87FAEmptyTex[] = dgMsgKanji87FAEmptyTex; + +#define dgMsgKanji87FBEmptyTex "__OTR__textures/kanji/gMsgKanji87FBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87FBEmptyTex[] = dgMsgKanji87FBEmptyTex; + +#define dgMsgKanji87FCEmptyTex "__OTR__textures/kanji/gMsgKanji87FCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji87FCEmptyTex[] = dgMsgKanji87FCEmptyTex; + +#define dgMsgKanji8840KatakanaSmallATex "__OTR__textures/kanji/gMsgKanji8840KatakanaSmallATex" +static const ALIGN_ASSET(2) char gMsgKanji8840KatakanaSmallATex[] = dgMsgKanji8840KatakanaSmallATex; + +#define dgMsgKanji8841EmptyTex "__OTR__textures/kanji/gMsgKanji8841EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8841EmptyTex[] = dgMsgKanji8841EmptyTex; + +#define dgMsgKanji8842EmptyTex "__OTR__textures/kanji/gMsgKanji8842EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8842EmptyTex[] = dgMsgKanji8842EmptyTex; + +#define dgMsgKanji8843EmptyTex "__OTR__textures/kanji/gMsgKanji8843EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8843EmptyTex[] = dgMsgKanji8843EmptyTex; + +#define dgMsgKanji8844EmptyTex "__OTR__textures/kanji/gMsgKanji8844EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8844EmptyTex[] = dgMsgKanji8844EmptyTex; + +#define dgMsgKanji8845EmptyTex "__OTR__textures/kanji/gMsgKanji8845EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8845EmptyTex[] = dgMsgKanji8845EmptyTex; + +#define dgMsgKanji8846EmptyTex "__OTR__textures/kanji/gMsgKanji8846EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8846EmptyTex[] = dgMsgKanji8846EmptyTex; + +#define dgMsgKanji8847EmptyTex "__OTR__textures/kanji/gMsgKanji8847EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8847EmptyTex[] = dgMsgKanji8847EmptyTex; + +#define dgMsgKanji8848EmptyTex "__OTR__textures/kanji/gMsgKanji8848EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8848EmptyTex[] = dgMsgKanji8848EmptyTex; + +#define dgMsgKanji8849EmptyTex "__OTR__textures/kanji/gMsgKanji8849EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8849EmptyTex[] = dgMsgKanji8849EmptyTex; + +#define dgMsgKanji884AEmptyTex "__OTR__textures/kanji/gMsgKanji884AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884AEmptyTex[] = dgMsgKanji884AEmptyTex; + +#define dgMsgKanji884BEmptyTex "__OTR__textures/kanji/gMsgKanji884BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884BEmptyTex[] = dgMsgKanji884BEmptyTex; + +#define dgMsgKanji884CEmptyTex "__OTR__textures/kanji/gMsgKanji884CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884CEmptyTex[] = dgMsgKanji884CEmptyTex; + +#define dgMsgKanji884DEmptyTex "__OTR__textures/kanji/gMsgKanji884DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884DEmptyTex[] = dgMsgKanji884DEmptyTex; + +#define dgMsgKanji884EEmptyTex "__OTR__textures/kanji/gMsgKanji884EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884EEmptyTex[] = dgMsgKanji884EEmptyTex; + +#define dgMsgKanji884FEmptyTex "__OTR__textures/kanji/gMsgKanji884FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji884FEmptyTex[] = dgMsgKanji884FEmptyTex; + +#define dgMsgKanji8850EmptyTex "__OTR__textures/kanji/gMsgKanji8850EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8850EmptyTex[] = dgMsgKanji8850EmptyTex; + +#define dgMsgKanji8851EmptyTex "__OTR__textures/kanji/gMsgKanji8851EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8851EmptyTex[] = dgMsgKanji8851EmptyTex; + +#define dgMsgKanji8852EmptyTex "__OTR__textures/kanji/gMsgKanji8852EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8852EmptyTex[] = dgMsgKanji8852EmptyTex; + +#define dgMsgKanji8853EmptyTex "__OTR__textures/kanji/gMsgKanji8853EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8853EmptyTex[] = dgMsgKanji8853EmptyTex; + +#define dgMsgKanji8854EmptyTex "__OTR__textures/kanji/gMsgKanji8854EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8854EmptyTex[] = dgMsgKanji8854EmptyTex; + +#define dgMsgKanji8855EmptyTex "__OTR__textures/kanji/gMsgKanji8855EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8855EmptyTex[] = dgMsgKanji8855EmptyTex; + +#define dgMsgKanji8856EmptyTex "__OTR__textures/kanji/gMsgKanji8856EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8856EmptyTex[] = dgMsgKanji8856EmptyTex; + +#define dgMsgKanji8857EmptyTex "__OTR__textures/kanji/gMsgKanji8857EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8857EmptyTex[] = dgMsgKanji8857EmptyTex; + +#define dgMsgKanji8858EmptyTex "__OTR__textures/kanji/gMsgKanji8858EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8858EmptyTex[] = dgMsgKanji8858EmptyTex; + +#define dgMsgKanji8859EmptyTex "__OTR__textures/kanji/gMsgKanji8859EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8859EmptyTex[] = dgMsgKanji8859EmptyTex; + +#define dgMsgKanji885AEmptyTex "__OTR__textures/kanji/gMsgKanji885AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885AEmptyTex[] = dgMsgKanji885AEmptyTex; + +#define dgMsgKanji885BEmptyTex "__OTR__textures/kanji/gMsgKanji885BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885BEmptyTex[] = dgMsgKanji885BEmptyTex; + +#define dgMsgKanji885CEmptyTex "__OTR__textures/kanji/gMsgKanji885CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885CEmptyTex[] = dgMsgKanji885CEmptyTex; + +#define dgMsgKanji885DEmptyTex "__OTR__textures/kanji/gMsgKanji885DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885DEmptyTex[] = dgMsgKanji885DEmptyTex; + +#define dgMsgKanji885EEmptyTex "__OTR__textures/kanji/gMsgKanji885EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885EEmptyTex[] = dgMsgKanji885EEmptyTex; + +#define dgMsgKanji885FEmptyTex "__OTR__textures/kanji/gMsgKanji885FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji885FEmptyTex[] = dgMsgKanji885FEmptyTex; + +#define dgMsgKanji8860EmptyTex "__OTR__textures/kanji/gMsgKanji8860EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8860EmptyTex[] = dgMsgKanji8860EmptyTex; + +#define dgMsgKanji8861EmptyTex "__OTR__textures/kanji/gMsgKanji8861EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8861EmptyTex[] = dgMsgKanji8861EmptyTex; + +#define dgMsgKanji8862EmptyTex "__OTR__textures/kanji/gMsgKanji8862EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8862EmptyTex[] = dgMsgKanji8862EmptyTex; + +#define dgMsgKanji8863EmptyTex "__OTR__textures/kanji/gMsgKanji8863EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8863EmptyTex[] = dgMsgKanji8863EmptyTex; + +#define dgMsgKanji8864EmptyTex "__OTR__textures/kanji/gMsgKanji8864EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8864EmptyTex[] = dgMsgKanji8864EmptyTex; + +#define dgMsgKanji8865EmptyTex "__OTR__textures/kanji/gMsgKanji8865EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8865EmptyTex[] = dgMsgKanji8865EmptyTex; + +#define dgMsgKanji8866EmptyTex "__OTR__textures/kanji/gMsgKanji8866EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8866EmptyTex[] = dgMsgKanji8866EmptyTex; + +#define dgMsgKanji8867EmptyTex "__OTR__textures/kanji/gMsgKanji8867EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8867EmptyTex[] = dgMsgKanji8867EmptyTex; + +#define dgMsgKanji8868EmptyTex "__OTR__textures/kanji/gMsgKanji8868EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8868EmptyTex[] = dgMsgKanji8868EmptyTex; + +#define dgMsgKanji8869EmptyTex "__OTR__textures/kanji/gMsgKanji8869EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8869EmptyTex[] = dgMsgKanji8869EmptyTex; + +#define dgMsgKanji886AEmptyTex "__OTR__textures/kanji/gMsgKanji886AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886AEmptyTex[] = dgMsgKanji886AEmptyTex; + +#define dgMsgKanji886BEmptyTex "__OTR__textures/kanji/gMsgKanji886BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886BEmptyTex[] = dgMsgKanji886BEmptyTex; + +#define dgMsgKanji886CEmptyTex "__OTR__textures/kanji/gMsgKanji886CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886CEmptyTex[] = dgMsgKanji886CEmptyTex; + +#define dgMsgKanji886DEmptyTex "__OTR__textures/kanji/gMsgKanji886DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886DEmptyTex[] = dgMsgKanji886DEmptyTex; + +#define dgMsgKanji886EEmptyTex "__OTR__textures/kanji/gMsgKanji886EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886EEmptyTex[] = dgMsgKanji886EEmptyTex; + +#define dgMsgKanji886FEmptyTex "__OTR__textures/kanji/gMsgKanji886FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji886FEmptyTex[] = dgMsgKanji886FEmptyTex; + +#define dgMsgKanji8870EmptyTex "__OTR__textures/kanji/gMsgKanji8870EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8870EmptyTex[] = dgMsgKanji8870EmptyTex; + +#define dgMsgKanji8871EmptyTex "__OTR__textures/kanji/gMsgKanji8871EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8871EmptyTex[] = dgMsgKanji8871EmptyTex; + +#define dgMsgKanji8872EmptyTex "__OTR__textures/kanji/gMsgKanji8872EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8872EmptyTex[] = dgMsgKanji8872EmptyTex; + +#define dgMsgKanji8873EmptyTex "__OTR__textures/kanji/gMsgKanji8873EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8873EmptyTex[] = dgMsgKanji8873EmptyTex; + +#define dgMsgKanji8874EmptyTex "__OTR__textures/kanji/gMsgKanji8874EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8874EmptyTex[] = dgMsgKanji8874EmptyTex; + +#define dgMsgKanji8875EmptyTex "__OTR__textures/kanji/gMsgKanji8875EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8875EmptyTex[] = dgMsgKanji8875EmptyTex; + +#define dgMsgKanji8876EmptyTex "__OTR__textures/kanji/gMsgKanji8876EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8876EmptyTex[] = dgMsgKanji8876EmptyTex; + +#define dgMsgKanji8877EmptyTex "__OTR__textures/kanji/gMsgKanji8877EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8877EmptyTex[] = dgMsgKanji8877EmptyTex; + +#define dgMsgKanji8878EmptyTex "__OTR__textures/kanji/gMsgKanji8878EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8878EmptyTex[] = dgMsgKanji8878EmptyTex; + +#define dgMsgKanji8879EmptyTex "__OTR__textures/kanji/gMsgKanji8879EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8879EmptyTex[] = dgMsgKanji8879EmptyTex; + +#define dgMsgKanji887AEmptyTex "__OTR__textures/kanji/gMsgKanji887AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887AEmptyTex[] = dgMsgKanji887AEmptyTex; + +#define dgMsgKanji887BEmptyTex "__OTR__textures/kanji/gMsgKanji887BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887BEmptyTex[] = dgMsgKanji887BEmptyTex; + +#define dgMsgKanji887CEmptyTex "__OTR__textures/kanji/gMsgKanji887CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887CEmptyTex[] = dgMsgKanji887CEmptyTex; + +#define dgMsgKanji887DEmptyTex "__OTR__textures/kanji/gMsgKanji887DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887DEmptyTex[] = dgMsgKanji887DEmptyTex; + +#define dgMsgKanji887EEmptyTex "__OTR__textures/kanji/gMsgKanji887EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji887EEmptyTex[] = dgMsgKanji887EEmptyTex; + +#define dgMsgKanji8880EmptyTex "__OTR__textures/kanji/gMsgKanji8880EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8880EmptyTex[] = dgMsgKanji8880EmptyTex; + +#define dgMsgKanji8881EmptyTex "__OTR__textures/kanji/gMsgKanji8881EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8881EmptyTex[] = dgMsgKanji8881EmptyTex; + +#define dgMsgKanji8882EmptyTex "__OTR__textures/kanji/gMsgKanji8882EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8882EmptyTex[] = dgMsgKanji8882EmptyTex; + +#define dgMsgKanji8883EmptyTex "__OTR__textures/kanji/gMsgKanji8883EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8883EmptyTex[] = dgMsgKanji8883EmptyTex; + +#define dgMsgKanji8884EmptyTex "__OTR__textures/kanji/gMsgKanji8884EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8884EmptyTex[] = dgMsgKanji8884EmptyTex; + +#define dgMsgKanji8885EmptyTex "__OTR__textures/kanji/gMsgKanji8885EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8885EmptyTex[] = dgMsgKanji8885EmptyTex; + +#define dgMsgKanji8886EmptyTex "__OTR__textures/kanji/gMsgKanji8886EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8886EmptyTex[] = dgMsgKanji8886EmptyTex; + +#define dgMsgKanji8887EmptyTex "__OTR__textures/kanji/gMsgKanji8887EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8887EmptyTex[] = dgMsgKanji8887EmptyTex; + +#define dgMsgKanji8888EmptyTex "__OTR__textures/kanji/gMsgKanji8888EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8888EmptyTex[] = dgMsgKanji8888EmptyTex; + +#define dgMsgKanji8889EmptyTex "__OTR__textures/kanji/gMsgKanji8889EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8889EmptyTex[] = dgMsgKanji8889EmptyTex; + +#define dgMsgKanji888AEmptyTex "__OTR__textures/kanji/gMsgKanji888AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888AEmptyTex[] = dgMsgKanji888AEmptyTex; + +#define dgMsgKanji888BEmptyTex "__OTR__textures/kanji/gMsgKanji888BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888BEmptyTex[] = dgMsgKanji888BEmptyTex; + +#define dgMsgKanji888CEmptyTex "__OTR__textures/kanji/gMsgKanji888CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888CEmptyTex[] = dgMsgKanji888CEmptyTex; + +#define dgMsgKanji888DEmptyTex "__OTR__textures/kanji/gMsgKanji888DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888DEmptyTex[] = dgMsgKanji888DEmptyTex; + +#define dgMsgKanji888EEmptyTex "__OTR__textures/kanji/gMsgKanji888EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888EEmptyTex[] = dgMsgKanji888EEmptyTex; + +#define dgMsgKanji888FEmptyTex "__OTR__textures/kanji/gMsgKanji888FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji888FEmptyTex[] = dgMsgKanji888FEmptyTex; + +#define dgMsgKanji8890EmptyTex "__OTR__textures/kanji/gMsgKanji8890EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8890EmptyTex[] = dgMsgKanji8890EmptyTex; + +#define dgMsgKanji8891EmptyTex "__OTR__textures/kanji/gMsgKanji8891EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8891EmptyTex[] = dgMsgKanji8891EmptyTex; + +#define dgMsgKanji8892EmptyTex "__OTR__textures/kanji/gMsgKanji8892EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8892EmptyTex[] = dgMsgKanji8892EmptyTex; + +#define dgMsgKanji8893EmptyTex "__OTR__textures/kanji/gMsgKanji8893EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8893EmptyTex[] = dgMsgKanji8893EmptyTex; + +#define dgMsgKanji8894EmptyTex "__OTR__textures/kanji/gMsgKanji8894EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8894EmptyTex[] = dgMsgKanji8894EmptyTex; + +#define dgMsgKanji8895EmptyTex "__OTR__textures/kanji/gMsgKanji8895EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8895EmptyTex[] = dgMsgKanji8895EmptyTex; + +#define dgMsgKanji8896EmptyTex "__OTR__textures/kanji/gMsgKanji8896EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8896EmptyTex[] = dgMsgKanji8896EmptyTex; + +#define dgMsgKanji8897EmptyTex "__OTR__textures/kanji/gMsgKanji8897EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8897EmptyTex[] = dgMsgKanji8897EmptyTex; + +#define dgMsgKanji8898EmptyTex "__OTR__textures/kanji/gMsgKanji8898EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8898EmptyTex[] = dgMsgKanji8898EmptyTex; + +#define dgMsgKanji8899EmptyTex "__OTR__textures/kanji/gMsgKanji8899EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji8899EmptyTex[] = dgMsgKanji8899EmptyTex; + +#define dgMsgKanji889AEmptyTex "__OTR__textures/kanji/gMsgKanji889AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889AEmptyTex[] = dgMsgKanji889AEmptyTex; + +#define dgMsgKanji889BEmptyTex "__OTR__textures/kanji/gMsgKanji889BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889BEmptyTex[] = dgMsgKanji889BEmptyTex; + +#define dgMsgKanji889CEmptyTex "__OTR__textures/kanji/gMsgKanji889CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889CEmptyTex[] = dgMsgKanji889CEmptyTex; + +#define dgMsgKanji889DEmptyTex "__OTR__textures/kanji/gMsgKanji889DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889DEmptyTex[] = dgMsgKanji889DEmptyTex; + +#define dgMsgKanji889EEmptyTex "__OTR__textures/kanji/gMsgKanji889EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji889EEmptyTex[] = dgMsgKanji889EEmptyTex; + +#define dgMsgKanji889FTex "__OTR__textures/kanji/gMsgKanji889FTex" +static const ALIGN_ASSET(2) char gMsgKanji889FTex[] = dgMsgKanji889FTex; + +#define dgMsgKanji88A0Tex "__OTR__textures/kanji/gMsgKanji88A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A0Tex[] = dgMsgKanji88A0Tex; + +#define dgMsgKanji88A1Tex "__OTR__textures/kanji/gMsgKanji88A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A1Tex[] = dgMsgKanji88A1Tex; + +#define dgMsgKanji88A2Tex "__OTR__textures/kanji/gMsgKanji88A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A2Tex[] = dgMsgKanji88A2Tex; + +#define dgMsgKanji88A3Tex "__OTR__textures/kanji/gMsgKanji88A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A3Tex[] = dgMsgKanji88A3Tex; + +#define dgMsgKanji88A4Tex "__OTR__textures/kanji/gMsgKanji88A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A4Tex[] = dgMsgKanji88A4Tex; + +#define dgMsgKanji88A5Tex "__OTR__textures/kanji/gMsgKanji88A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A5Tex[] = dgMsgKanji88A5Tex; + +#define dgMsgKanji88A6Tex "__OTR__textures/kanji/gMsgKanji88A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A6Tex[] = dgMsgKanji88A6Tex; + +#define dgMsgKanji88A7Tex "__OTR__textures/kanji/gMsgKanji88A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A7Tex[] = dgMsgKanji88A7Tex; + +#define dgMsgKanji88A8Tex "__OTR__textures/kanji/gMsgKanji88A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A8Tex[] = dgMsgKanji88A8Tex; + +#define dgMsgKanji88A9Tex "__OTR__textures/kanji/gMsgKanji88A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88A9Tex[] = dgMsgKanji88A9Tex; + +#define dgMsgKanji88AATex "__OTR__textures/kanji/gMsgKanji88AATex" +static const ALIGN_ASSET(2) char gMsgKanji88AATex[] = dgMsgKanji88AATex; + +#define dgMsgKanji88ABTex "__OTR__textures/kanji/gMsgKanji88ABTex" +static const ALIGN_ASSET(2) char gMsgKanji88ABTex[] = dgMsgKanji88ABTex; + +#define dgMsgKanji88ACTex "__OTR__textures/kanji/gMsgKanji88ACTex" +static const ALIGN_ASSET(2) char gMsgKanji88ACTex[] = dgMsgKanji88ACTex; + +#define dgMsgKanji88ADTex "__OTR__textures/kanji/gMsgKanji88ADTex" +static const ALIGN_ASSET(2) char gMsgKanji88ADTex[] = dgMsgKanji88ADTex; + +#define dgMsgKanji88AETex "__OTR__textures/kanji/gMsgKanji88AETex" +static const ALIGN_ASSET(2) char gMsgKanji88AETex[] = dgMsgKanji88AETex; + +#define dgMsgKanji88AFTex "__OTR__textures/kanji/gMsgKanji88AFTex" +static const ALIGN_ASSET(2) char gMsgKanji88AFTex[] = dgMsgKanji88AFTex; + +#define dgMsgKanji88B0Tex "__OTR__textures/kanji/gMsgKanji88B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B0Tex[] = dgMsgKanji88B0Tex; + +#define dgMsgKanji88B1Tex "__OTR__textures/kanji/gMsgKanji88B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B1Tex[] = dgMsgKanji88B1Tex; + +#define dgMsgKanji88B2Tex "__OTR__textures/kanji/gMsgKanji88B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B2Tex[] = dgMsgKanji88B2Tex; + +#define dgMsgKanji88B3Tex "__OTR__textures/kanji/gMsgKanji88B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B3Tex[] = dgMsgKanji88B3Tex; + +#define dgMsgKanji88B4Tex "__OTR__textures/kanji/gMsgKanji88B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B4Tex[] = dgMsgKanji88B4Tex; + +#define dgMsgKanji88B5Tex "__OTR__textures/kanji/gMsgKanji88B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B5Tex[] = dgMsgKanji88B5Tex; + +#define dgMsgKanji88B6Tex "__OTR__textures/kanji/gMsgKanji88B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B6Tex[] = dgMsgKanji88B6Tex; + +#define dgMsgKanji88B7Tex "__OTR__textures/kanji/gMsgKanji88B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B7Tex[] = dgMsgKanji88B7Tex; + +#define dgMsgKanji88B8Tex "__OTR__textures/kanji/gMsgKanji88B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B8Tex[] = dgMsgKanji88B8Tex; + +#define dgMsgKanji88B9Tex "__OTR__textures/kanji/gMsgKanji88B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88B9Tex[] = dgMsgKanji88B9Tex; + +#define dgMsgKanji88BATex "__OTR__textures/kanji/gMsgKanji88BATex" +static const ALIGN_ASSET(2) char gMsgKanji88BATex[] = dgMsgKanji88BATex; + +#define dgMsgKanji88BBTex "__OTR__textures/kanji/gMsgKanji88BBTex" +static const ALIGN_ASSET(2) char gMsgKanji88BBTex[] = dgMsgKanji88BBTex; + +#define dgMsgKanji88BCTex "__OTR__textures/kanji/gMsgKanji88BCTex" +static const ALIGN_ASSET(2) char gMsgKanji88BCTex[] = dgMsgKanji88BCTex; + +#define dgMsgKanji88BDTex "__OTR__textures/kanji/gMsgKanji88BDTex" +static const ALIGN_ASSET(2) char gMsgKanji88BDTex[] = dgMsgKanji88BDTex; + +#define dgMsgKanji88BETex "__OTR__textures/kanji/gMsgKanji88BETex" +static const ALIGN_ASSET(2) char gMsgKanji88BETex[] = dgMsgKanji88BETex; + +#define dgMsgKanji88BFTex "__OTR__textures/kanji/gMsgKanji88BFTex" +static const ALIGN_ASSET(2) char gMsgKanji88BFTex[] = dgMsgKanji88BFTex; + +#define dgMsgKanji88C0Tex "__OTR__textures/kanji/gMsgKanji88C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C0Tex[] = dgMsgKanji88C0Tex; + +#define dgMsgKanji88C1Tex "__OTR__textures/kanji/gMsgKanji88C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C1Tex[] = dgMsgKanji88C1Tex; + +#define dgMsgKanji88C2Tex "__OTR__textures/kanji/gMsgKanji88C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C2Tex[] = dgMsgKanji88C2Tex; + +#define dgMsgKanji88C3Tex "__OTR__textures/kanji/gMsgKanji88C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C3Tex[] = dgMsgKanji88C3Tex; + +#define dgMsgKanji88C4Tex "__OTR__textures/kanji/gMsgKanji88C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C4Tex[] = dgMsgKanji88C4Tex; + +#define dgMsgKanji88C5Tex "__OTR__textures/kanji/gMsgKanji88C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C5Tex[] = dgMsgKanji88C5Tex; + +#define dgMsgKanji88C6Tex "__OTR__textures/kanji/gMsgKanji88C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C6Tex[] = dgMsgKanji88C6Tex; + +#define dgMsgKanji88C7Tex "__OTR__textures/kanji/gMsgKanji88C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C7Tex[] = dgMsgKanji88C7Tex; + +#define dgMsgKanji88C8Tex "__OTR__textures/kanji/gMsgKanji88C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C8Tex[] = dgMsgKanji88C8Tex; + +#define dgMsgKanji88C9Tex "__OTR__textures/kanji/gMsgKanji88C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88C9Tex[] = dgMsgKanji88C9Tex; + +#define dgMsgKanji88CATex "__OTR__textures/kanji/gMsgKanji88CATex" +static const ALIGN_ASSET(2) char gMsgKanji88CATex[] = dgMsgKanji88CATex; + +#define dgMsgKanji88CBTex "__OTR__textures/kanji/gMsgKanji88CBTex" +static const ALIGN_ASSET(2) char gMsgKanji88CBTex[] = dgMsgKanji88CBTex; + +#define dgMsgKanji88CCTex "__OTR__textures/kanji/gMsgKanji88CCTex" +static const ALIGN_ASSET(2) char gMsgKanji88CCTex[] = dgMsgKanji88CCTex; + +#define dgMsgKanji88CDTex "__OTR__textures/kanji/gMsgKanji88CDTex" +static const ALIGN_ASSET(2) char gMsgKanji88CDTex[] = dgMsgKanji88CDTex; + +#define dgMsgKanji88CETex "__OTR__textures/kanji/gMsgKanji88CETex" +static const ALIGN_ASSET(2) char gMsgKanji88CETex[] = dgMsgKanji88CETex; + +#define dgMsgKanji88CFTex "__OTR__textures/kanji/gMsgKanji88CFTex" +static const ALIGN_ASSET(2) char gMsgKanji88CFTex[] = dgMsgKanji88CFTex; + +#define dgMsgKanji88D0Tex "__OTR__textures/kanji/gMsgKanji88D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D0Tex[] = dgMsgKanji88D0Tex; + +#define dgMsgKanji88D1Tex "__OTR__textures/kanji/gMsgKanji88D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D1Tex[] = dgMsgKanji88D1Tex; + +#define dgMsgKanji88D2Tex "__OTR__textures/kanji/gMsgKanji88D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D2Tex[] = dgMsgKanji88D2Tex; + +#define dgMsgKanji88D3Tex "__OTR__textures/kanji/gMsgKanji88D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D3Tex[] = dgMsgKanji88D3Tex; + +#define dgMsgKanji88D4Tex "__OTR__textures/kanji/gMsgKanji88D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D4Tex[] = dgMsgKanji88D4Tex; + +#define dgMsgKanji88D5Tex "__OTR__textures/kanji/gMsgKanji88D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D5Tex[] = dgMsgKanji88D5Tex; + +#define dgMsgKanji88D6Tex "__OTR__textures/kanji/gMsgKanji88D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D6Tex[] = dgMsgKanji88D6Tex; + +#define dgMsgKanji88D7Tex "__OTR__textures/kanji/gMsgKanji88D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D7Tex[] = dgMsgKanji88D7Tex; + +#define dgMsgKanji88D8Tex "__OTR__textures/kanji/gMsgKanji88D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D8Tex[] = dgMsgKanji88D8Tex; + +#define dgMsgKanji88D9Tex "__OTR__textures/kanji/gMsgKanji88D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88D9Tex[] = dgMsgKanji88D9Tex; + +#define dgMsgKanji88DATex "__OTR__textures/kanji/gMsgKanji88DATex" +static const ALIGN_ASSET(2) char gMsgKanji88DATex[] = dgMsgKanji88DATex; + +#define dgMsgKanji88DBTex "__OTR__textures/kanji/gMsgKanji88DBTex" +static const ALIGN_ASSET(2) char gMsgKanji88DBTex[] = dgMsgKanji88DBTex; + +#define dgMsgKanji88DCTex "__OTR__textures/kanji/gMsgKanji88DCTex" +static const ALIGN_ASSET(2) char gMsgKanji88DCTex[] = dgMsgKanji88DCTex; + +#define dgMsgKanji88DDTex "__OTR__textures/kanji/gMsgKanji88DDTex" +static const ALIGN_ASSET(2) char gMsgKanji88DDTex[] = dgMsgKanji88DDTex; + +#define dgMsgKanji88DETex "__OTR__textures/kanji/gMsgKanji88DETex" +static const ALIGN_ASSET(2) char gMsgKanji88DETex[] = dgMsgKanji88DETex; + +#define dgMsgKanji88DFTex "__OTR__textures/kanji/gMsgKanji88DFTex" +static const ALIGN_ASSET(2) char gMsgKanji88DFTex[] = dgMsgKanji88DFTex; + +#define dgMsgKanji88E0Tex "__OTR__textures/kanji/gMsgKanji88E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E0Tex[] = dgMsgKanji88E0Tex; + +#define dgMsgKanji88E1Tex "__OTR__textures/kanji/gMsgKanji88E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E1Tex[] = dgMsgKanji88E1Tex; + +#define dgMsgKanji88E2Tex "__OTR__textures/kanji/gMsgKanji88E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E2Tex[] = dgMsgKanji88E2Tex; + +#define dgMsgKanji88E3Tex "__OTR__textures/kanji/gMsgKanji88E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E3Tex[] = dgMsgKanji88E3Tex; + +#define dgMsgKanji88E4Tex "__OTR__textures/kanji/gMsgKanji88E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E4Tex[] = dgMsgKanji88E4Tex; + +#define dgMsgKanji88E5Tex "__OTR__textures/kanji/gMsgKanji88E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E5Tex[] = dgMsgKanji88E5Tex; + +#define dgMsgKanji88E6Tex "__OTR__textures/kanji/gMsgKanji88E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E6Tex[] = dgMsgKanji88E6Tex; + +#define dgMsgKanji88E7Tex "__OTR__textures/kanji/gMsgKanji88E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E7Tex[] = dgMsgKanji88E7Tex; + +#define dgMsgKanji88E8Tex "__OTR__textures/kanji/gMsgKanji88E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E8Tex[] = dgMsgKanji88E8Tex; + +#define dgMsgKanji88E9Tex "__OTR__textures/kanji/gMsgKanji88E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88E9Tex[] = dgMsgKanji88E9Tex; + +#define dgMsgKanji88EATex "__OTR__textures/kanji/gMsgKanji88EATex" +static const ALIGN_ASSET(2) char gMsgKanji88EATex[] = dgMsgKanji88EATex; + +#define dgMsgKanji88EBTex "__OTR__textures/kanji/gMsgKanji88EBTex" +static const ALIGN_ASSET(2) char gMsgKanji88EBTex[] = dgMsgKanji88EBTex; + +#define dgMsgKanji88ECTex "__OTR__textures/kanji/gMsgKanji88ECTex" +static const ALIGN_ASSET(2) char gMsgKanji88ECTex[] = dgMsgKanji88ECTex; + +#define dgMsgKanji88EDTex "__OTR__textures/kanji/gMsgKanji88EDTex" +static const ALIGN_ASSET(2) char gMsgKanji88EDTex[] = dgMsgKanji88EDTex; + +#define dgMsgKanji88EETex "__OTR__textures/kanji/gMsgKanji88EETex" +static const ALIGN_ASSET(2) char gMsgKanji88EETex[] = dgMsgKanji88EETex; + +#define dgMsgKanji88EFTex "__OTR__textures/kanji/gMsgKanji88EFTex" +static const ALIGN_ASSET(2) char gMsgKanji88EFTex[] = dgMsgKanji88EFTex; + +#define dgMsgKanji88F0Tex "__OTR__textures/kanji/gMsgKanji88F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F0Tex[] = dgMsgKanji88F0Tex; + +#define dgMsgKanji88F1Tex "__OTR__textures/kanji/gMsgKanji88F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F1Tex[] = dgMsgKanji88F1Tex; + +#define dgMsgKanji88F2Tex "__OTR__textures/kanji/gMsgKanji88F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F2Tex[] = dgMsgKanji88F2Tex; + +#define dgMsgKanji88F3Tex "__OTR__textures/kanji/gMsgKanji88F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F3Tex[] = dgMsgKanji88F3Tex; + +#define dgMsgKanji88F4Tex "__OTR__textures/kanji/gMsgKanji88F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F4Tex[] = dgMsgKanji88F4Tex; + +#define dgMsgKanji88F5Tex "__OTR__textures/kanji/gMsgKanji88F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F5Tex[] = dgMsgKanji88F5Tex; + +#define dgMsgKanji88F6Tex "__OTR__textures/kanji/gMsgKanji88F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F6Tex[] = dgMsgKanji88F6Tex; + +#define dgMsgKanji88F7Tex "__OTR__textures/kanji/gMsgKanji88F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F7Tex[] = dgMsgKanji88F7Tex; + +#define dgMsgKanji88F8Tex "__OTR__textures/kanji/gMsgKanji88F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F8Tex[] = dgMsgKanji88F8Tex; + +#define dgMsgKanji88F9Tex "__OTR__textures/kanji/gMsgKanji88F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji88F9Tex[] = dgMsgKanji88F9Tex; + +#define dgMsgKanji88FATex "__OTR__textures/kanji/gMsgKanji88FATex" +static const ALIGN_ASSET(2) char gMsgKanji88FATex[] = dgMsgKanji88FATex; + +#define dgMsgKanji88FBTex "__OTR__textures/kanji/gMsgKanji88FBTex" +static const ALIGN_ASSET(2) char gMsgKanji88FBTex[] = dgMsgKanji88FBTex; + +#define dgMsgKanji88FCTex "__OTR__textures/kanji/gMsgKanji88FCTex" +static const ALIGN_ASSET(2) char gMsgKanji88FCTex[] = dgMsgKanji88FCTex; + +#define dgMsgKanji8940Tex "__OTR__textures/kanji/gMsgKanji8940Tex" +static const ALIGN_ASSET(2) char gMsgKanji8940Tex[] = dgMsgKanji8940Tex; + +#define dgMsgKanji8941Tex "__OTR__textures/kanji/gMsgKanji8941Tex" +static const ALIGN_ASSET(2) char gMsgKanji8941Tex[] = dgMsgKanji8941Tex; + +#define dgMsgKanji8942Tex "__OTR__textures/kanji/gMsgKanji8942Tex" +static const ALIGN_ASSET(2) char gMsgKanji8942Tex[] = dgMsgKanji8942Tex; + +#define dgMsgKanji8943Tex "__OTR__textures/kanji/gMsgKanji8943Tex" +static const ALIGN_ASSET(2) char gMsgKanji8943Tex[] = dgMsgKanji8943Tex; + +#define dgMsgKanji8944Tex "__OTR__textures/kanji/gMsgKanji8944Tex" +static const ALIGN_ASSET(2) char gMsgKanji8944Tex[] = dgMsgKanji8944Tex; + +#define dgMsgKanji8945Tex "__OTR__textures/kanji/gMsgKanji8945Tex" +static const ALIGN_ASSET(2) char gMsgKanji8945Tex[] = dgMsgKanji8945Tex; + +#define dgMsgKanji8946Tex "__OTR__textures/kanji/gMsgKanji8946Tex" +static const ALIGN_ASSET(2) char gMsgKanji8946Tex[] = dgMsgKanji8946Tex; + +#define dgMsgKanji8947Tex "__OTR__textures/kanji/gMsgKanji8947Tex" +static const ALIGN_ASSET(2) char gMsgKanji8947Tex[] = dgMsgKanji8947Tex; + +#define dgMsgKanji8948Tex "__OTR__textures/kanji/gMsgKanji8948Tex" +static const ALIGN_ASSET(2) char gMsgKanji8948Tex[] = dgMsgKanji8948Tex; + +#define dgMsgKanji8949Tex "__OTR__textures/kanji/gMsgKanji8949Tex" +static const ALIGN_ASSET(2) char gMsgKanji8949Tex[] = dgMsgKanji8949Tex; + +#define dgMsgKanji894ATex "__OTR__textures/kanji/gMsgKanji894ATex" +static const ALIGN_ASSET(2) char gMsgKanji894ATex[] = dgMsgKanji894ATex; + +#define dgMsgKanji894BTex "__OTR__textures/kanji/gMsgKanji894BTex" +static const ALIGN_ASSET(2) char gMsgKanji894BTex[] = dgMsgKanji894BTex; + +#define dgMsgKanji894CTex "__OTR__textures/kanji/gMsgKanji894CTex" +static const ALIGN_ASSET(2) char gMsgKanji894CTex[] = dgMsgKanji894CTex; + +#define dgMsgKanji894DTex "__OTR__textures/kanji/gMsgKanji894DTex" +static const ALIGN_ASSET(2) char gMsgKanji894DTex[] = dgMsgKanji894DTex; + +#define dgMsgKanji894ETex "__OTR__textures/kanji/gMsgKanji894ETex" +static const ALIGN_ASSET(2) char gMsgKanji894ETex[] = dgMsgKanji894ETex; + +#define dgMsgKanji894FTex "__OTR__textures/kanji/gMsgKanji894FTex" +static const ALIGN_ASSET(2) char gMsgKanji894FTex[] = dgMsgKanji894FTex; + +#define dgMsgKanji8950Tex "__OTR__textures/kanji/gMsgKanji8950Tex" +static const ALIGN_ASSET(2) char gMsgKanji8950Tex[] = dgMsgKanji8950Tex; + +#define dgMsgKanji8951Tex "__OTR__textures/kanji/gMsgKanji8951Tex" +static const ALIGN_ASSET(2) char gMsgKanji8951Tex[] = dgMsgKanji8951Tex; + +#define dgMsgKanji8952Tex "__OTR__textures/kanji/gMsgKanji8952Tex" +static const ALIGN_ASSET(2) char gMsgKanji8952Tex[] = dgMsgKanji8952Tex; + +#define dgMsgKanji8953Tex "__OTR__textures/kanji/gMsgKanji8953Tex" +static const ALIGN_ASSET(2) char gMsgKanji8953Tex[] = dgMsgKanji8953Tex; + +#define dgMsgKanji8954Tex "__OTR__textures/kanji/gMsgKanji8954Tex" +static const ALIGN_ASSET(2) char gMsgKanji8954Tex[] = dgMsgKanji8954Tex; + +#define dgMsgKanji8955Tex "__OTR__textures/kanji/gMsgKanji8955Tex" +static const ALIGN_ASSET(2) char gMsgKanji8955Tex[] = dgMsgKanji8955Tex; + +#define dgMsgKanji8956Tex "__OTR__textures/kanji/gMsgKanji8956Tex" +static const ALIGN_ASSET(2) char gMsgKanji8956Tex[] = dgMsgKanji8956Tex; + +#define dgMsgKanji8957Tex "__OTR__textures/kanji/gMsgKanji8957Tex" +static const ALIGN_ASSET(2) char gMsgKanji8957Tex[] = dgMsgKanji8957Tex; + +#define dgMsgKanji8958Tex "__OTR__textures/kanji/gMsgKanji8958Tex" +static const ALIGN_ASSET(2) char gMsgKanji8958Tex[] = dgMsgKanji8958Tex; + +#define dgMsgKanji8959Tex "__OTR__textures/kanji/gMsgKanji8959Tex" +static const ALIGN_ASSET(2) char gMsgKanji8959Tex[] = dgMsgKanji8959Tex; + +#define dgMsgKanji895ATex "__OTR__textures/kanji/gMsgKanji895ATex" +static const ALIGN_ASSET(2) char gMsgKanji895ATex[] = dgMsgKanji895ATex; + +#define dgMsgKanji895BTex "__OTR__textures/kanji/gMsgKanji895BTex" +static const ALIGN_ASSET(2) char gMsgKanji895BTex[] = dgMsgKanji895BTex; + +#define dgMsgKanji895CTex "__OTR__textures/kanji/gMsgKanji895CTex" +static const ALIGN_ASSET(2) char gMsgKanji895CTex[] = dgMsgKanji895CTex; + +#define dgMsgKanji895DTex "__OTR__textures/kanji/gMsgKanji895DTex" +static const ALIGN_ASSET(2) char gMsgKanji895DTex[] = dgMsgKanji895DTex; + +#define dgMsgKanji895ETex "__OTR__textures/kanji/gMsgKanji895ETex" +static const ALIGN_ASSET(2) char gMsgKanji895ETex[] = dgMsgKanji895ETex; + +#define dgMsgKanji895FTex "__OTR__textures/kanji/gMsgKanji895FTex" +static const ALIGN_ASSET(2) char gMsgKanji895FTex[] = dgMsgKanji895FTex; + +#define dgMsgKanji8960Tex "__OTR__textures/kanji/gMsgKanji8960Tex" +static const ALIGN_ASSET(2) char gMsgKanji8960Tex[] = dgMsgKanji8960Tex; + +#define dgMsgKanji8961Tex "__OTR__textures/kanji/gMsgKanji8961Tex" +static const ALIGN_ASSET(2) char gMsgKanji8961Tex[] = dgMsgKanji8961Tex; + +#define dgMsgKanji8962Tex "__OTR__textures/kanji/gMsgKanji8962Tex" +static const ALIGN_ASSET(2) char gMsgKanji8962Tex[] = dgMsgKanji8962Tex; + +#define dgMsgKanji8963Tex "__OTR__textures/kanji/gMsgKanji8963Tex" +static const ALIGN_ASSET(2) char gMsgKanji8963Tex[] = dgMsgKanji8963Tex; + +#define dgMsgKanji8964Tex "__OTR__textures/kanji/gMsgKanji8964Tex" +static const ALIGN_ASSET(2) char gMsgKanji8964Tex[] = dgMsgKanji8964Tex; + +#define dgMsgKanji8965Tex "__OTR__textures/kanji/gMsgKanji8965Tex" +static const ALIGN_ASSET(2) char gMsgKanji8965Tex[] = dgMsgKanji8965Tex; + +#define dgMsgKanji8966Tex "__OTR__textures/kanji/gMsgKanji8966Tex" +static const ALIGN_ASSET(2) char gMsgKanji8966Tex[] = dgMsgKanji8966Tex; + +#define dgMsgKanji8967Tex "__OTR__textures/kanji/gMsgKanji8967Tex" +static const ALIGN_ASSET(2) char gMsgKanji8967Tex[] = dgMsgKanji8967Tex; + +#define dgMsgKanji8968Tex "__OTR__textures/kanji/gMsgKanji8968Tex" +static const ALIGN_ASSET(2) char gMsgKanji8968Tex[] = dgMsgKanji8968Tex; + +#define dgMsgKanji8969Tex "__OTR__textures/kanji/gMsgKanji8969Tex" +static const ALIGN_ASSET(2) char gMsgKanji8969Tex[] = dgMsgKanji8969Tex; + +#define dgMsgKanji896ATex "__OTR__textures/kanji/gMsgKanji896ATex" +static const ALIGN_ASSET(2) char gMsgKanji896ATex[] = dgMsgKanji896ATex; + +#define dgMsgKanji896BTex "__OTR__textures/kanji/gMsgKanji896BTex" +static const ALIGN_ASSET(2) char gMsgKanji896BTex[] = dgMsgKanji896BTex; + +#define dgMsgKanji896CTex "__OTR__textures/kanji/gMsgKanji896CTex" +static const ALIGN_ASSET(2) char gMsgKanji896CTex[] = dgMsgKanji896CTex; + +#define dgMsgKanji896DTex "__OTR__textures/kanji/gMsgKanji896DTex" +static const ALIGN_ASSET(2) char gMsgKanji896DTex[] = dgMsgKanji896DTex; + +#define dgMsgKanji896ETex "__OTR__textures/kanji/gMsgKanji896ETex" +static const ALIGN_ASSET(2) char gMsgKanji896ETex[] = dgMsgKanji896ETex; + +#define dgMsgKanji896FTex "__OTR__textures/kanji/gMsgKanji896FTex" +static const ALIGN_ASSET(2) char gMsgKanji896FTex[] = dgMsgKanji896FTex; + +#define dgMsgKanji8970Tex "__OTR__textures/kanji/gMsgKanji8970Tex" +static const ALIGN_ASSET(2) char gMsgKanji8970Tex[] = dgMsgKanji8970Tex; + +#define dgMsgKanji8971Tex "__OTR__textures/kanji/gMsgKanji8971Tex" +static const ALIGN_ASSET(2) char gMsgKanji8971Tex[] = dgMsgKanji8971Tex; + +#define dgMsgKanji8972Tex "__OTR__textures/kanji/gMsgKanji8972Tex" +static const ALIGN_ASSET(2) char gMsgKanji8972Tex[] = dgMsgKanji8972Tex; + +#define dgMsgKanji8973Tex "__OTR__textures/kanji/gMsgKanji8973Tex" +static const ALIGN_ASSET(2) char gMsgKanji8973Tex[] = dgMsgKanji8973Tex; + +#define dgMsgKanji8974Tex "__OTR__textures/kanji/gMsgKanji8974Tex" +static const ALIGN_ASSET(2) char gMsgKanji8974Tex[] = dgMsgKanji8974Tex; + +#define dgMsgKanji8975Tex "__OTR__textures/kanji/gMsgKanji8975Tex" +static const ALIGN_ASSET(2) char gMsgKanji8975Tex[] = dgMsgKanji8975Tex; + +#define dgMsgKanji8976Tex "__OTR__textures/kanji/gMsgKanji8976Tex" +static const ALIGN_ASSET(2) char gMsgKanji8976Tex[] = dgMsgKanji8976Tex; + +#define dgMsgKanji8977Tex "__OTR__textures/kanji/gMsgKanji8977Tex" +static const ALIGN_ASSET(2) char gMsgKanji8977Tex[] = dgMsgKanji8977Tex; + +#define dgMsgKanji8978Tex "__OTR__textures/kanji/gMsgKanji8978Tex" +static const ALIGN_ASSET(2) char gMsgKanji8978Tex[] = dgMsgKanji8978Tex; + +#define dgMsgKanji8979Tex "__OTR__textures/kanji/gMsgKanji8979Tex" +static const ALIGN_ASSET(2) char gMsgKanji8979Tex[] = dgMsgKanji8979Tex; + +#define dgMsgKanji897ATex "__OTR__textures/kanji/gMsgKanji897ATex" +static const ALIGN_ASSET(2) char gMsgKanji897ATex[] = dgMsgKanji897ATex; + +#define dgMsgKanji897BTex "__OTR__textures/kanji/gMsgKanji897BTex" +static const ALIGN_ASSET(2) char gMsgKanji897BTex[] = dgMsgKanji897BTex; + +#define dgMsgKanji897CTex "__OTR__textures/kanji/gMsgKanji897CTex" +static const ALIGN_ASSET(2) char gMsgKanji897CTex[] = dgMsgKanji897CTex; + +#define dgMsgKanji897DTex "__OTR__textures/kanji/gMsgKanji897DTex" +static const ALIGN_ASSET(2) char gMsgKanji897DTex[] = dgMsgKanji897DTex; + +#define dgMsgKanji897ETex "__OTR__textures/kanji/gMsgKanji897ETex" +static const ALIGN_ASSET(2) char gMsgKanji897ETex[] = dgMsgKanji897ETex; + +#define dgMsgKanji8980Tex "__OTR__textures/kanji/gMsgKanji8980Tex" +static const ALIGN_ASSET(2) char gMsgKanji8980Tex[] = dgMsgKanji8980Tex; + +#define dgMsgKanji8981Tex "__OTR__textures/kanji/gMsgKanji8981Tex" +static const ALIGN_ASSET(2) char gMsgKanji8981Tex[] = dgMsgKanji8981Tex; + +#define dgMsgKanji8982Tex "__OTR__textures/kanji/gMsgKanji8982Tex" +static const ALIGN_ASSET(2) char gMsgKanji8982Tex[] = dgMsgKanji8982Tex; + +#define dgMsgKanji8983Tex "__OTR__textures/kanji/gMsgKanji8983Tex" +static const ALIGN_ASSET(2) char gMsgKanji8983Tex[] = dgMsgKanji8983Tex; + +#define dgMsgKanji8984Tex "__OTR__textures/kanji/gMsgKanji8984Tex" +static const ALIGN_ASSET(2) char gMsgKanji8984Tex[] = dgMsgKanji8984Tex; + +#define dgMsgKanji8985Tex "__OTR__textures/kanji/gMsgKanji8985Tex" +static const ALIGN_ASSET(2) char gMsgKanji8985Tex[] = dgMsgKanji8985Tex; + +#define dgMsgKanji8986Tex "__OTR__textures/kanji/gMsgKanji8986Tex" +static const ALIGN_ASSET(2) char gMsgKanji8986Tex[] = dgMsgKanji8986Tex; + +#define dgMsgKanji8987Tex "__OTR__textures/kanji/gMsgKanji8987Tex" +static const ALIGN_ASSET(2) char gMsgKanji8987Tex[] = dgMsgKanji8987Tex; + +#define dgMsgKanji8988Tex "__OTR__textures/kanji/gMsgKanji8988Tex" +static const ALIGN_ASSET(2) char gMsgKanji8988Tex[] = dgMsgKanji8988Tex; + +#define dgMsgKanji8989Tex "__OTR__textures/kanji/gMsgKanji8989Tex" +static const ALIGN_ASSET(2) char gMsgKanji8989Tex[] = dgMsgKanji8989Tex; + +#define dgMsgKanji898ATex "__OTR__textures/kanji/gMsgKanji898ATex" +static const ALIGN_ASSET(2) char gMsgKanji898ATex[] = dgMsgKanji898ATex; + +#define dgMsgKanji898BTex "__OTR__textures/kanji/gMsgKanji898BTex" +static const ALIGN_ASSET(2) char gMsgKanji898BTex[] = dgMsgKanji898BTex; + +#define dgMsgKanji898CTex "__OTR__textures/kanji/gMsgKanji898CTex" +static const ALIGN_ASSET(2) char gMsgKanji898CTex[] = dgMsgKanji898CTex; + +#define dgMsgKanji898DTex "__OTR__textures/kanji/gMsgKanji898DTex" +static const ALIGN_ASSET(2) char gMsgKanji898DTex[] = dgMsgKanji898DTex; + +#define dgMsgKanji898ETex "__OTR__textures/kanji/gMsgKanji898ETex" +static const ALIGN_ASSET(2) char gMsgKanji898ETex[] = dgMsgKanji898ETex; + +#define dgMsgKanji898FTex "__OTR__textures/kanji/gMsgKanji898FTex" +static const ALIGN_ASSET(2) char gMsgKanji898FTex[] = dgMsgKanji898FTex; + +#define dgMsgKanji8990Tex "__OTR__textures/kanji/gMsgKanji8990Tex" +static const ALIGN_ASSET(2) char gMsgKanji8990Tex[] = dgMsgKanji8990Tex; + +#define dgMsgKanji8991Tex "__OTR__textures/kanji/gMsgKanji8991Tex" +static const ALIGN_ASSET(2) char gMsgKanji8991Tex[] = dgMsgKanji8991Tex; + +#define dgMsgKanji8992Tex "__OTR__textures/kanji/gMsgKanji8992Tex" +static const ALIGN_ASSET(2) char gMsgKanji8992Tex[] = dgMsgKanji8992Tex; + +#define dgMsgKanji8993Tex "__OTR__textures/kanji/gMsgKanji8993Tex" +static const ALIGN_ASSET(2) char gMsgKanji8993Tex[] = dgMsgKanji8993Tex; + +#define dgMsgKanji8994Tex "__OTR__textures/kanji/gMsgKanji8994Tex" +static const ALIGN_ASSET(2) char gMsgKanji8994Tex[] = dgMsgKanji8994Tex; + +#define dgMsgKanji8995Tex "__OTR__textures/kanji/gMsgKanji8995Tex" +static const ALIGN_ASSET(2) char gMsgKanji8995Tex[] = dgMsgKanji8995Tex; + +#define dgMsgKanji8996Tex "__OTR__textures/kanji/gMsgKanji8996Tex" +static const ALIGN_ASSET(2) char gMsgKanji8996Tex[] = dgMsgKanji8996Tex; + +#define dgMsgKanji8997Tex "__OTR__textures/kanji/gMsgKanji8997Tex" +static const ALIGN_ASSET(2) char gMsgKanji8997Tex[] = dgMsgKanji8997Tex; + +#define dgMsgKanji8998Tex "__OTR__textures/kanji/gMsgKanji8998Tex" +static const ALIGN_ASSET(2) char gMsgKanji8998Tex[] = dgMsgKanji8998Tex; + +#define dgMsgKanji8999Tex "__OTR__textures/kanji/gMsgKanji8999Tex" +static const ALIGN_ASSET(2) char gMsgKanji8999Tex[] = dgMsgKanji8999Tex; + +#define dgMsgKanji899ATex "__OTR__textures/kanji/gMsgKanji899ATex" +static const ALIGN_ASSET(2) char gMsgKanji899ATex[] = dgMsgKanji899ATex; + +#define dgMsgKanji899BTex "__OTR__textures/kanji/gMsgKanji899BTex" +static const ALIGN_ASSET(2) char gMsgKanji899BTex[] = dgMsgKanji899BTex; + +#define dgMsgKanji899CTex "__OTR__textures/kanji/gMsgKanji899CTex" +static const ALIGN_ASSET(2) char gMsgKanji899CTex[] = dgMsgKanji899CTex; + +#define dgMsgKanji899DTex "__OTR__textures/kanji/gMsgKanji899DTex" +static const ALIGN_ASSET(2) char gMsgKanji899DTex[] = dgMsgKanji899DTex; + +#define dgMsgKanji899ETex "__OTR__textures/kanji/gMsgKanji899ETex" +static const ALIGN_ASSET(2) char gMsgKanji899ETex[] = dgMsgKanji899ETex; + +#define dgMsgKanji899FTex "__OTR__textures/kanji/gMsgKanji899FTex" +static const ALIGN_ASSET(2) char gMsgKanji899FTex[] = dgMsgKanji899FTex; + +#define dgMsgKanji89A0Tex "__OTR__textures/kanji/gMsgKanji89A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A0Tex[] = dgMsgKanji89A0Tex; + +#define dgMsgKanji89A1Tex "__OTR__textures/kanji/gMsgKanji89A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A1Tex[] = dgMsgKanji89A1Tex; + +#define dgMsgKanji89A2Tex "__OTR__textures/kanji/gMsgKanji89A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A2Tex[] = dgMsgKanji89A2Tex; + +#define dgMsgKanji89A3Tex "__OTR__textures/kanji/gMsgKanji89A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A3Tex[] = dgMsgKanji89A3Tex; + +#define dgMsgKanji89A4Tex "__OTR__textures/kanji/gMsgKanji89A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A4Tex[] = dgMsgKanji89A4Tex; + +#define dgMsgKanji89A5Tex "__OTR__textures/kanji/gMsgKanji89A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A5Tex[] = dgMsgKanji89A5Tex; + +#define dgMsgKanji89A6Tex "__OTR__textures/kanji/gMsgKanji89A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A6Tex[] = dgMsgKanji89A6Tex; + +#define dgMsgKanji89A7Tex "__OTR__textures/kanji/gMsgKanji89A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A7Tex[] = dgMsgKanji89A7Tex; + +#define dgMsgKanji89A8Tex "__OTR__textures/kanji/gMsgKanji89A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A8Tex[] = dgMsgKanji89A8Tex; + +#define dgMsgKanji89A9Tex "__OTR__textures/kanji/gMsgKanji89A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89A9Tex[] = dgMsgKanji89A9Tex; + +#define dgMsgKanji89AATex "__OTR__textures/kanji/gMsgKanji89AATex" +static const ALIGN_ASSET(2) char gMsgKanji89AATex[] = dgMsgKanji89AATex; + +#define dgMsgKanji89ABTex "__OTR__textures/kanji/gMsgKanji89ABTex" +static const ALIGN_ASSET(2) char gMsgKanji89ABTex[] = dgMsgKanji89ABTex; + +#define dgMsgKanji89ACTex "__OTR__textures/kanji/gMsgKanji89ACTex" +static const ALIGN_ASSET(2) char gMsgKanji89ACTex[] = dgMsgKanji89ACTex; + +#define dgMsgKanji89ADTex "__OTR__textures/kanji/gMsgKanji89ADTex" +static const ALIGN_ASSET(2) char gMsgKanji89ADTex[] = dgMsgKanji89ADTex; + +#define dgMsgKanji89AETex "__OTR__textures/kanji/gMsgKanji89AETex" +static const ALIGN_ASSET(2) char gMsgKanji89AETex[] = dgMsgKanji89AETex; + +#define dgMsgKanji89AFTex "__OTR__textures/kanji/gMsgKanji89AFTex" +static const ALIGN_ASSET(2) char gMsgKanji89AFTex[] = dgMsgKanji89AFTex; + +#define dgMsgKanji89B0Tex "__OTR__textures/kanji/gMsgKanji89B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B0Tex[] = dgMsgKanji89B0Tex; + +#define dgMsgKanji89B1Tex "__OTR__textures/kanji/gMsgKanji89B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B1Tex[] = dgMsgKanji89B1Tex; + +#define dgMsgKanji89B2Tex "__OTR__textures/kanji/gMsgKanji89B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B2Tex[] = dgMsgKanji89B2Tex; + +#define dgMsgKanji89B3Tex "__OTR__textures/kanji/gMsgKanji89B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B3Tex[] = dgMsgKanji89B3Tex; + +#define dgMsgKanji89B4Tex "__OTR__textures/kanji/gMsgKanji89B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B4Tex[] = dgMsgKanji89B4Tex; + +#define dgMsgKanji89B5Tex "__OTR__textures/kanji/gMsgKanji89B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B5Tex[] = dgMsgKanji89B5Tex; + +#define dgMsgKanji89B6Tex "__OTR__textures/kanji/gMsgKanji89B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B6Tex[] = dgMsgKanji89B6Tex; + +#define dgMsgKanji89B7Tex "__OTR__textures/kanji/gMsgKanji89B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B7Tex[] = dgMsgKanji89B7Tex; + +#define dgMsgKanji89B8Tex "__OTR__textures/kanji/gMsgKanji89B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B8Tex[] = dgMsgKanji89B8Tex; + +#define dgMsgKanji89B9Tex "__OTR__textures/kanji/gMsgKanji89B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89B9Tex[] = dgMsgKanji89B9Tex; + +#define dgMsgKanji89BATex "__OTR__textures/kanji/gMsgKanji89BATex" +static const ALIGN_ASSET(2) char gMsgKanji89BATex[] = dgMsgKanji89BATex; + +#define dgMsgKanji89BBTex "__OTR__textures/kanji/gMsgKanji89BBTex" +static const ALIGN_ASSET(2) char gMsgKanji89BBTex[] = dgMsgKanji89BBTex; + +#define dgMsgKanji89BCTex "__OTR__textures/kanji/gMsgKanji89BCTex" +static const ALIGN_ASSET(2) char gMsgKanji89BCTex[] = dgMsgKanji89BCTex; + +#define dgMsgKanji89BDTex "__OTR__textures/kanji/gMsgKanji89BDTex" +static const ALIGN_ASSET(2) char gMsgKanji89BDTex[] = dgMsgKanji89BDTex; + +#define dgMsgKanji89BETex "__OTR__textures/kanji/gMsgKanji89BETex" +static const ALIGN_ASSET(2) char gMsgKanji89BETex[] = dgMsgKanji89BETex; + +#define dgMsgKanji89BFTex "__OTR__textures/kanji/gMsgKanji89BFTex" +static const ALIGN_ASSET(2) char gMsgKanji89BFTex[] = dgMsgKanji89BFTex; + +#define dgMsgKanji89C0Tex "__OTR__textures/kanji/gMsgKanji89C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C0Tex[] = dgMsgKanji89C0Tex; + +#define dgMsgKanji89C1Tex "__OTR__textures/kanji/gMsgKanji89C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C1Tex[] = dgMsgKanji89C1Tex; + +#define dgMsgKanji89C2Tex "__OTR__textures/kanji/gMsgKanji89C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C2Tex[] = dgMsgKanji89C2Tex; + +#define dgMsgKanji89C3Tex "__OTR__textures/kanji/gMsgKanji89C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C3Tex[] = dgMsgKanji89C3Tex; + +#define dgMsgKanji89C4Tex "__OTR__textures/kanji/gMsgKanji89C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C4Tex[] = dgMsgKanji89C4Tex; + +#define dgMsgKanji89C5Tex "__OTR__textures/kanji/gMsgKanji89C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C5Tex[] = dgMsgKanji89C5Tex; + +#define dgMsgKanji89C6Tex "__OTR__textures/kanji/gMsgKanji89C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C6Tex[] = dgMsgKanji89C6Tex; + +#define dgMsgKanji89C7Tex "__OTR__textures/kanji/gMsgKanji89C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C7Tex[] = dgMsgKanji89C7Tex; + +#define dgMsgKanji89C8Tex "__OTR__textures/kanji/gMsgKanji89C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C8Tex[] = dgMsgKanji89C8Tex; + +#define dgMsgKanji89C9Tex "__OTR__textures/kanji/gMsgKanji89C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89C9Tex[] = dgMsgKanji89C9Tex; + +#define dgMsgKanji89CATex "__OTR__textures/kanji/gMsgKanji89CATex" +static const ALIGN_ASSET(2) char gMsgKanji89CATex[] = dgMsgKanji89CATex; + +#define dgMsgKanji89CBTex "__OTR__textures/kanji/gMsgKanji89CBTex" +static const ALIGN_ASSET(2) char gMsgKanji89CBTex[] = dgMsgKanji89CBTex; + +#define dgMsgKanji89CCTex "__OTR__textures/kanji/gMsgKanji89CCTex" +static const ALIGN_ASSET(2) char gMsgKanji89CCTex[] = dgMsgKanji89CCTex; + +#define dgMsgKanji89CDTex "__OTR__textures/kanji/gMsgKanji89CDTex" +static const ALIGN_ASSET(2) char gMsgKanji89CDTex[] = dgMsgKanji89CDTex; + +#define dgMsgKanji89CETex "__OTR__textures/kanji/gMsgKanji89CETex" +static const ALIGN_ASSET(2) char gMsgKanji89CETex[] = dgMsgKanji89CETex; + +#define dgMsgKanji89CFTex "__OTR__textures/kanji/gMsgKanji89CFTex" +static const ALIGN_ASSET(2) char gMsgKanji89CFTex[] = dgMsgKanji89CFTex; + +#define dgMsgKanji89D0Tex "__OTR__textures/kanji/gMsgKanji89D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D0Tex[] = dgMsgKanji89D0Tex; + +#define dgMsgKanji89D1Tex "__OTR__textures/kanji/gMsgKanji89D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D1Tex[] = dgMsgKanji89D1Tex; + +#define dgMsgKanji89D2Tex "__OTR__textures/kanji/gMsgKanji89D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D2Tex[] = dgMsgKanji89D2Tex; + +#define dgMsgKanji89D3Tex "__OTR__textures/kanji/gMsgKanji89D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D3Tex[] = dgMsgKanji89D3Tex; + +#define dgMsgKanji89D4Tex "__OTR__textures/kanji/gMsgKanji89D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D4Tex[] = dgMsgKanji89D4Tex; + +#define dgMsgKanji89D5Tex "__OTR__textures/kanji/gMsgKanji89D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D5Tex[] = dgMsgKanji89D5Tex; + +#define dgMsgKanji89D6Tex "__OTR__textures/kanji/gMsgKanji89D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D6Tex[] = dgMsgKanji89D6Tex; + +#define dgMsgKanji89D7Tex "__OTR__textures/kanji/gMsgKanji89D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D7Tex[] = dgMsgKanji89D7Tex; + +#define dgMsgKanji89D8Tex "__OTR__textures/kanji/gMsgKanji89D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D8Tex[] = dgMsgKanji89D8Tex; + +#define dgMsgKanji89D9Tex "__OTR__textures/kanji/gMsgKanji89D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89D9Tex[] = dgMsgKanji89D9Tex; + +#define dgMsgKanji89DATex "__OTR__textures/kanji/gMsgKanji89DATex" +static const ALIGN_ASSET(2) char gMsgKanji89DATex[] = dgMsgKanji89DATex; + +#define dgMsgKanji89DBTex "__OTR__textures/kanji/gMsgKanji89DBTex" +static const ALIGN_ASSET(2) char gMsgKanji89DBTex[] = dgMsgKanji89DBTex; + +#define dgMsgKanji89DCTex "__OTR__textures/kanji/gMsgKanji89DCTex" +static const ALIGN_ASSET(2) char gMsgKanji89DCTex[] = dgMsgKanji89DCTex; + +#define dgMsgKanji89DDTex "__OTR__textures/kanji/gMsgKanji89DDTex" +static const ALIGN_ASSET(2) char gMsgKanji89DDTex[] = dgMsgKanji89DDTex; + +#define dgMsgKanji89DETex "__OTR__textures/kanji/gMsgKanji89DETex" +static const ALIGN_ASSET(2) char gMsgKanji89DETex[] = dgMsgKanji89DETex; + +#define dgMsgKanji89DFTex "__OTR__textures/kanji/gMsgKanji89DFTex" +static const ALIGN_ASSET(2) char gMsgKanji89DFTex[] = dgMsgKanji89DFTex; + +#define dgMsgKanji89E0Tex "__OTR__textures/kanji/gMsgKanji89E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E0Tex[] = dgMsgKanji89E0Tex; + +#define dgMsgKanji89E1Tex "__OTR__textures/kanji/gMsgKanji89E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E1Tex[] = dgMsgKanji89E1Tex; + +#define dgMsgKanji89E2Tex "__OTR__textures/kanji/gMsgKanji89E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E2Tex[] = dgMsgKanji89E2Tex; + +#define dgMsgKanji89E3Tex "__OTR__textures/kanji/gMsgKanji89E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E3Tex[] = dgMsgKanji89E3Tex; + +#define dgMsgKanji89E4Tex "__OTR__textures/kanji/gMsgKanji89E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E4Tex[] = dgMsgKanji89E4Tex; + +#define dgMsgKanji89E5Tex "__OTR__textures/kanji/gMsgKanji89E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E5Tex[] = dgMsgKanji89E5Tex; + +#define dgMsgKanji89E6Tex "__OTR__textures/kanji/gMsgKanji89E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E6Tex[] = dgMsgKanji89E6Tex; + +#define dgMsgKanji89E7Tex "__OTR__textures/kanji/gMsgKanji89E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E7Tex[] = dgMsgKanji89E7Tex; + +#define dgMsgKanji89E8Tex "__OTR__textures/kanji/gMsgKanji89E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E8Tex[] = dgMsgKanji89E8Tex; + +#define dgMsgKanji89E9Tex "__OTR__textures/kanji/gMsgKanji89E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89E9Tex[] = dgMsgKanji89E9Tex; + +#define dgMsgKanji89EATex "__OTR__textures/kanji/gMsgKanji89EATex" +static const ALIGN_ASSET(2) char gMsgKanji89EATex[] = dgMsgKanji89EATex; + +#define dgMsgKanji89EBTex "__OTR__textures/kanji/gMsgKanji89EBTex" +static const ALIGN_ASSET(2) char gMsgKanji89EBTex[] = dgMsgKanji89EBTex; + +#define dgMsgKanji89ECTex "__OTR__textures/kanji/gMsgKanji89ECTex" +static const ALIGN_ASSET(2) char gMsgKanji89ECTex[] = dgMsgKanji89ECTex; + +#define dgMsgKanji89EDTex "__OTR__textures/kanji/gMsgKanji89EDTex" +static const ALIGN_ASSET(2) char gMsgKanji89EDTex[] = dgMsgKanji89EDTex; + +#define dgMsgKanji89EETex "__OTR__textures/kanji/gMsgKanji89EETex" +static const ALIGN_ASSET(2) char gMsgKanji89EETex[] = dgMsgKanji89EETex; + +#define dgMsgKanji89EFTex "__OTR__textures/kanji/gMsgKanji89EFTex" +static const ALIGN_ASSET(2) char gMsgKanji89EFTex[] = dgMsgKanji89EFTex; + +#define dgMsgKanji89F0Tex "__OTR__textures/kanji/gMsgKanji89F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F0Tex[] = dgMsgKanji89F0Tex; + +#define dgMsgKanji89F1Tex "__OTR__textures/kanji/gMsgKanji89F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F1Tex[] = dgMsgKanji89F1Tex; + +#define dgMsgKanji89F2Tex "__OTR__textures/kanji/gMsgKanji89F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F2Tex[] = dgMsgKanji89F2Tex; + +#define dgMsgKanji89F3Tex "__OTR__textures/kanji/gMsgKanji89F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F3Tex[] = dgMsgKanji89F3Tex; + +#define dgMsgKanji89F4Tex "__OTR__textures/kanji/gMsgKanji89F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F4Tex[] = dgMsgKanji89F4Tex; + +#define dgMsgKanji89F5Tex "__OTR__textures/kanji/gMsgKanji89F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F5Tex[] = dgMsgKanji89F5Tex; + +#define dgMsgKanji89F6Tex "__OTR__textures/kanji/gMsgKanji89F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F6Tex[] = dgMsgKanji89F6Tex; + +#define dgMsgKanji89F7Tex "__OTR__textures/kanji/gMsgKanji89F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F7Tex[] = dgMsgKanji89F7Tex; + +#define dgMsgKanji89F8Tex "__OTR__textures/kanji/gMsgKanji89F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F8Tex[] = dgMsgKanji89F8Tex; + +#define dgMsgKanji89F9Tex "__OTR__textures/kanji/gMsgKanji89F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji89F9Tex[] = dgMsgKanji89F9Tex; + +#define dgMsgKanji89FATex "__OTR__textures/kanji/gMsgKanji89FATex" +static const ALIGN_ASSET(2) char gMsgKanji89FATex[] = dgMsgKanji89FATex; + +#define dgMsgKanji89FBTex "__OTR__textures/kanji/gMsgKanji89FBTex" +static const ALIGN_ASSET(2) char gMsgKanji89FBTex[] = dgMsgKanji89FBTex; + +#define dgMsgKanji89FCTex "__OTR__textures/kanji/gMsgKanji89FCTex" +static const ALIGN_ASSET(2) char gMsgKanji89FCTex[] = dgMsgKanji89FCTex; + +#define dgMsgKanji8A40Tex "__OTR__textures/kanji/gMsgKanji8A40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A40Tex[] = dgMsgKanji8A40Tex; + +#define dgMsgKanji8A41Tex "__OTR__textures/kanji/gMsgKanji8A41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A41Tex[] = dgMsgKanji8A41Tex; + +#define dgMsgKanji8A42Tex "__OTR__textures/kanji/gMsgKanji8A42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A42Tex[] = dgMsgKanji8A42Tex; + +#define dgMsgKanji8A43Tex "__OTR__textures/kanji/gMsgKanji8A43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A43Tex[] = dgMsgKanji8A43Tex; + +#define dgMsgKanji8A44Tex "__OTR__textures/kanji/gMsgKanji8A44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A44Tex[] = dgMsgKanji8A44Tex; + +#define dgMsgKanji8A45Tex "__OTR__textures/kanji/gMsgKanji8A45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A45Tex[] = dgMsgKanji8A45Tex; + +#define dgMsgKanji8A46Tex "__OTR__textures/kanji/gMsgKanji8A46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A46Tex[] = dgMsgKanji8A46Tex; + +#define dgMsgKanji8A47Tex "__OTR__textures/kanji/gMsgKanji8A47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A47Tex[] = dgMsgKanji8A47Tex; + +#define dgMsgKanji8A48Tex "__OTR__textures/kanji/gMsgKanji8A48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A48Tex[] = dgMsgKanji8A48Tex; + +#define dgMsgKanji8A49Tex "__OTR__textures/kanji/gMsgKanji8A49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A49Tex[] = dgMsgKanji8A49Tex; + +#define dgMsgKanji8A4ATex "__OTR__textures/kanji/gMsgKanji8A4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A4ATex[] = dgMsgKanji8A4ATex; + +#define dgMsgKanji8A4BTex "__OTR__textures/kanji/gMsgKanji8A4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4BTex[] = dgMsgKanji8A4BTex; + +#define dgMsgKanji8A4CTex "__OTR__textures/kanji/gMsgKanji8A4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4CTex[] = dgMsgKanji8A4CTex; + +#define dgMsgKanji8A4DTex "__OTR__textures/kanji/gMsgKanji8A4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4DTex[] = dgMsgKanji8A4DTex; + +#define dgMsgKanji8A4ETex "__OTR__textures/kanji/gMsgKanji8A4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A4ETex[] = dgMsgKanji8A4ETex; + +#define dgMsgKanji8A4FTex "__OTR__textures/kanji/gMsgKanji8A4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A4FTex[] = dgMsgKanji8A4FTex; + +#define dgMsgKanji8A50Tex "__OTR__textures/kanji/gMsgKanji8A50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A50Tex[] = dgMsgKanji8A50Tex; + +#define dgMsgKanji8A51Tex "__OTR__textures/kanji/gMsgKanji8A51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A51Tex[] = dgMsgKanji8A51Tex; + +#define dgMsgKanji8A52Tex "__OTR__textures/kanji/gMsgKanji8A52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A52Tex[] = dgMsgKanji8A52Tex; + +#define dgMsgKanji8A53Tex "__OTR__textures/kanji/gMsgKanji8A53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A53Tex[] = dgMsgKanji8A53Tex; + +#define dgMsgKanji8A54Tex "__OTR__textures/kanji/gMsgKanji8A54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A54Tex[] = dgMsgKanji8A54Tex; + +#define dgMsgKanji8A55Tex "__OTR__textures/kanji/gMsgKanji8A55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A55Tex[] = dgMsgKanji8A55Tex; + +#define dgMsgKanji8A56Tex "__OTR__textures/kanji/gMsgKanji8A56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A56Tex[] = dgMsgKanji8A56Tex; + +#define dgMsgKanji8A57Tex "__OTR__textures/kanji/gMsgKanji8A57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A57Tex[] = dgMsgKanji8A57Tex; + +#define dgMsgKanji8A58Tex "__OTR__textures/kanji/gMsgKanji8A58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A58Tex[] = dgMsgKanji8A58Tex; + +#define dgMsgKanji8A59Tex "__OTR__textures/kanji/gMsgKanji8A59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A59Tex[] = dgMsgKanji8A59Tex; + +#define dgMsgKanji8A5ATex "__OTR__textures/kanji/gMsgKanji8A5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A5ATex[] = dgMsgKanji8A5ATex; + +#define dgMsgKanji8A5BTex "__OTR__textures/kanji/gMsgKanji8A5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5BTex[] = dgMsgKanji8A5BTex; + +#define dgMsgKanji8A5CTex "__OTR__textures/kanji/gMsgKanji8A5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5CTex[] = dgMsgKanji8A5CTex; + +#define dgMsgKanji8A5DTex "__OTR__textures/kanji/gMsgKanji8A5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5DTex[] = dgMsgKanji8A5DTex; + +#define dgMsgKanji8A5ETex "__OTR__textures/kanji/gMsgKanji8A5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A5ETex[] = dgMsgKanji8A5ETex; + +#define dgMsgKanji8A5FTex "__OTR__textures/kanji/gMsgKanji8A5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A5FTex[] = dgMsgKanji8A5FTex; + +#define dgMsgKanji8A60Tex "__OTR__textures/kanji/gMsgKanji8A60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A60Tex[] = dgMsgKanji8A60Tex; + +#define dgMsgKanji8A61Tex "__OTR__textures/kanji/gMsgKanji8A61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A61Tex[] = dgMsgKanji8A61Tex; + +#define dgMsgKanji8A62Tex "__OTR__textures/kanji/gMsgKanji8A62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A62Tex[] = dgMsgKanji8A62Tex; + +#define dgMsgKanji8A63Tex "__OTR__textures/kanji/gMsgKanji8A63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A63Tex[] = dgMsgKanji8A63Tex; + +#define dgMsgKanji8A64Tex "__OTR__textures/kanji/gMsgKanji8A64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A64Tex[] = dgMsgKanji8A64Tex; + +#define dgMsgKanji8A65Tex "__OTR__textures/kanji/gMsgKanji8A65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A65Tex[] = dgMsgKanji8A65Tex; + +#define dgMsgKanji8A66Tex "__OTR__textures/kanji/gMsgKanji8A66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A66Tex[] = dgMsgKanji8A66Tex; + +#define dgMsgKanji8A67Tex "__OTR__textures/kanji/gMsgKanji8A67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A67Tex[] = dgMsgKanji8A67Tex; + +#define dgMsgKanji8A68Tex "__OTR__textures/kanji/gMsgKanji8A68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A68Tex[] = dgMsgKanji8A68Tex; + +#define dgMsgKanji8A69Tex "__OTR__textures/kanji/gMsgKanji8A69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A69Tex[] = dgMsgKanji8A69Tex; + +#define dgMsgKanji8A6ATex "__OTR__textures/kanji/gMsgKanji8A6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A6ATex[] = dgMsgKanji8A6ATex; + +#define dgMsgKanji8A6BTex "__OTR__textures/kanji/gMsgKanji8A6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6BTex[] = dgMsgKanji8A6BTex; + +#define dgMsgKanji8A6CTex "__OTR__textures/kanji/gMsgKanji8A6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6CTex[] = dgMsgKanji8A6CTex; + +#define dgMsgKanji8A6DTex "__OTR__textures/kanji/gMsgKanji8A6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6DTex[] = dgMsgKanji8A6DTex; + +#define dgMsgKanji8A6ETex "__OTR__textures/kanji/gMsgKanji8A6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A6ETex[] = dgMsgKanji8A6ETex; + +#define dgMsgKanji8A6FTex "__OTR__textures/kanji/gMsgKanji8A6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A6FTex[] = dgMsgKanji8A6FTex; + +#define dgMsgKanji8A70Tex "__OTR__textures/kanji/gMsgKanji8A70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A70Tex[] = dgMsgKanji8A70Tex; + +#define dgMsgKanji8A71Tex "__OTR__textures/kanji/gMsgKanji8A71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A71Tex[] = dgMsgKanji8A71Tex; + +#define dgMsgKanji8A72Tex "__OTR__textures/kanji/gMsgKanji8A72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A72Tex[] = dgMsgKanji8A72Tex; + +#define dgMsgKanji8A73Tex "__OTR__textures/kanji/gMsgKanji8A73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A73Tex[] = dgMsgKanji8A73Tex; + +#define dgMsgKanji8A74Tex "__OTR__textures/kanji/gMsgKanji8A74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A74Tex[] = dgMsgKanji8A74Tex; + +#define dgMsgKanji8A75Tex "__OTR__textures/kanji/gMsgKanji8A75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A75Tex[] = dgMsgKanji8A75Tex; + +#define dgMsgKanji8A76Tex "__OTR__textures/kanji/gMsgKanji8A76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A76Tex[] = dgMsgKanji8A76Tex; + +#define dgMsgKanji8A77Tex "__OTR__textures/kanji/gMsgKanji8A77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A77Tex[] = dgMsgKanji8A77Tex; + +#define dgMsgKanji8A78Tex "__OTR__textures/kanji/gMsgKanji8A78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A78Tex[] = dgMsgKanji8A78Tex; + +#define dgMsgKanji8A79Tex "__OTR__textures/kanji/gMsgKanji8A79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A79Tex[] = dgMsgKanji8A79Tex; + +#define dgMsgKanji8A7ATex "__OTR__textures/kanji/gMsgKanji8A7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A7ATex[] = dgMsgKanji8A7ATex; + +#define dgMsgKanji8A7BTex "__OTR__textures/kanji/gMsgKanji8A7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A7BTex[] = dgMsgKanji8A7BTex; + +#define dgMsgKanji8A7CTex "__OTR__textures/kanji/gMsgKanji8A7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A7CTex[] = dgMsgKanji8A7CTex; + +#define dgMsgKanji8A7DTex "__OTR__textures/kanji/gMsgKanji8A7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A7DTex[] = dgMsgKanji8A7DTex; + +#define dgMsgKanji8A7ETex "__OTR__textures/kanji/gMsgKanji8A7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A7ETex[] = dgMsgKanji8A7ETex; + +#define dgMsgKanji8A80Tex "__OTR__textures/kanji/gMsgKanji8A80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A80Tex[] = dgMsgKanji8A80Tex; + +#define dgMsgKanji8A81Tex "__OTR__textures/kanji/gMsgKanji8A81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A81Tex[] = dgMsgKanji8A81Tex; + +#define dgMsgKanji8A82Tex "__OTR__textures/kanji/gMsgKanji8A82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A82Tex[] = dgMsgKanji8A82Tex; + +#define dgMsgKanji8A83Tex "__OTR__textures/kanji/gMsgKanji8A83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A83Tex[] = dgMsgKanji8A83Tex; + +#define dgMsgKanji8A84Tex "__OTR__textures/kanji/gMsgKanji8A84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A84Tex[] = dgMsgKanji8A84Tex; + +#define dgMsgKanji8A85Tex "__OTR__textures/kanji/gMsgKanji8A85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A85Tex[] = dgMsgKanji8A85Tex; + +#define dgMsgKanji8A86Tex "__OTR__textures/kanji/gMsgKanji8A86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A86Tex[] = dgMsgKanji8A86Tex; + +#define dgMsgKanji8A87Tex "__OTR__textures/kanji/gMsgKanji8A87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A87Tex[] = dgMsgKanji8A87Tex; + +#define dgMsgKanji8A88Tex "__OTR__textures/kanji/gMsgKanji8A88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A88Tex[] = dgMsgKanji8A88Tex; + +#define dgMsgKanji8A89Tex "__OTR__textures/kanji/gMsgKanji8A89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A89Tex[] = dgMsgKanji8A89Tex; + +#define dgMsgKanji8A8ATex "__OTR__textures/kanji/gMsgKanji8A8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A8ATex[] = dgMsgKanji8A8ATex; + +#define dgMsgKanji8A8BTex "__OTR__textures/kanji/gMsgKanji8A8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8BTex[] = dgMsgKanji8A8BTex; + +#define dgMsgKanji8A8CTex "__OTR__textures/kanji/gMsgKanji8A8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8CTex[] = dgMsgKanji8A8CTex; + +#define dgMsgKanji8A8DTex "__OTR__textures/kanji/gMsgKanji8A8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8DTex[] = dgMsgKanji8A8DTex; + +#define dgMsgKanji8A8ETex "__OTR__textures/kanji/gMsgKanji8A8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A8ETex[] = dgMsgKanji8A8ETex; + +#define dgMsgKanji8A8FTex "__OTR__textures/kanji/gMsgKanji8A8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A8FTex[] = dgMsgKanji8A8FTex; + +#define dgMsgKanji8A90Tex "__OTR__textures/kanji/gMsgKanji8A90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A90Tex[] = dgMsgKanji8A90Tex; + +#define dgMsgKanji8A91Tex "__OTR__textures/kanji/gMsgKanji8A91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A91Tex[] = dgMsgKanji8A91Tex; + +#define dgMsgKanji8A92Tex "__OTR__textures/kanji/gMsgKanji8A92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A92Tex[] = dgMsgKanji8A92Tex; + +#define dgMsgKanji8A93Tex "__OTR__textures/kanji/gMsgKanji8A93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A93Tex[] = dgMsgKanji8A93Tex; + +#define dgMsgKanji8A94Tex "__OTR__textures/kanji/gMsgKanji8A94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A94Tex[] = dgMsgKanji8A94Tex; + +#define dgMsgKanji8A95Tex "__OTR__textures/kanji/gMsgKanji8A95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A95Tex[] = dgMsgKanji8A95Tex; + +#define dgMsgKanji8A96Tex "__OTR__textures/kanji/gMsgKanji8A96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A96Tex[] = dgMsgKanji8A96Tex; + +#define dgMsgKanji8A97Tex "__OTR__textures/kanji/gMsgKanji8A97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A97Tex[] = dgMsgKanji8A97Tex; + +#define dgMsgKanji8A98Tex "__OTR__textures/kanji/gMsgKanji8A98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A98Tex[] = dgMsgKanji8A98Tex; + +#define dgMsgKanji8A99Tex "__OTR__textures/kanji/gMsgKanji8A99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8A99Tex[] = dgMsgKanji8A99Tex; + +#define dgMsgKanji8A9ATex "__OTR__textures/kanji/gMsgKanji8A9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8A9ATex[] = dgMsgKanji8A9ATex; + +#define dgMsgKanji8A9BTex "__OTR__textures/kanji/gMsgKanji8A9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9BTex[] = dgMsgKanji8A9BTex; + +#define dgMsgKanji8A9CTex "__OTR__textures/kanji/gMsgKanji8A9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9CTex[] = dgMsgKanji8A9CTex; + +#define dgMsgKanji8A9DTex "__OTR__textures/kanji/gMsgKanji8A9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9DTex[] = dgMsgKanji8A9DTex; + +#define dgMsgKanji8A9ETex "__OTR__textures/kanji/gMsgKanji8A9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8A9ETex[] = dgMsgKanji8A9ETex; + +#define dgMsgKanji8A9FTex "__OTR__textures/kanji/gMsgKanji8A9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8A9FTex[] = dgMsgKanji8A9FTex; + +#define dgMsgKanji8AA0Tex "__OTR__textures/kanji/gMsgKanji8AA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA0Tex[] = dgMsgKanji8AA0Tex; + +#define dgMsgKanji8AA1Tex "__OTR__textures/kanji/gMsgKanji8AA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA1Tex[] = dgMsgKanji8AA1Tex; + +#define dgMsgKanji8AA2Tex "__OTR__textures/kanji/gMsgKanji8AA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA2Tex[] = dgMsgKanji8AA2Tex; + +#define dgMsgKanji8AA3Tex "__OTR__textures/kanji/gMsgKanji8AA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA3Tex[] = dgMsgKanji8AA3Tex; + +#define dgMsgKanji8AA4Tex "__OTR__textures/kanji/gMsgKanji8AA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA4Tex[] = dgMsgKanji8AA4Tex; + +#define dgMsgKanji8AA5Tex "__OTR__textures/kanji/gMsgKanji8AA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA5Tex[] = dgMsgKanji8AA5Tex; + +#define dgMsgKanji8AA6Tex "__OTR__textures/kanji/gMsgKanji8AA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA6Tex[] = dgMsgKanji8AA6Tex; + +#define dgMsgKanji8AA7Tex "__OTR__textures/kanji/gMsgKanji8AA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA7Tex[] = dgMsgKanji8AA7Tex; + +#define dgMsgKanji8AA8Tex "__OTR__textures/kanji/gMsgKanji8AA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA8Tex[] = dgMsgKanji8AA8Tex; + +#define dgMsgKanji8AA9Tex "__OTR__textures/kanji/gMsgKanji8AA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AA9Tex[] = dgMsgKanji8AA9Tex; + +#define dgMsgKanji8AAATex "__OTR__textures/kanji/gMsgKanji8AAATex" +static const ALIGN_ASSET(2) char gMsgKanji8AAATex[] = dgMsgKanji8AAATex; + +#define dgMsgKanji8AABTex "__OTR__textures/kanji/gMsgKanji8AABTex" +static const ALIGN_ASSET(2) char gMsgKanji8AABTex[] = dgMsgKanji8AABTex; + +#define dgMsgKanji8AACTex "__OTR__textures/kanji/gMsgKanji8AACTex" +static const ALIGN_ASSET(2) char gMsgKanji8AACTex[] = dgMsgKanji8AACTex; + +#define dgMsgKanji8AADTex "__OTR__textures/kanji/gMsgKanji8AADTex" +static const ALIGN_ASSET(2) char gMsgKanji8AADTex[] = dgMsgKanji8AADTex; + +#define dgMsgKanji8AAETex "__OTR__textures/kanji/gMsgKanji8AAETex" +static const ALIGN_ASSET(2) char gMsgKanji8AAETex[] = dgMsgKanji8AAETex; + +#define dgMsgKanji8AAFTex "__OTR__textures/kanji/gMsgKanji8AAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8AAFTex[] = dgMsgKanji8AAFTex; + +#define dgMsgKanji8AB0Tex "__OTR__textures/kanji/gMsgKanji8AB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB0Tex[] = dgMsgKanji8AB0Tex; + +#define dgMsgKanji8AB1Tex "__OTR__textures/kanji/gMsgKanji8AB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB1Tex[] = dgMsgKanji8AB1Tex; + +#define dgMsgKanji8AB2Tex "__OTR__textures/kanji/gMsgKanji8AB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB2Tex[] = dgMsgKanji8AB2Tex; + +#define dgMsgKanji8AB3Tex "__OTR__textures/kanji/gMsgKanji8AB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB3Tex[] = dgMsgKanji8AB3Tex; + +#define dgMsgKanji8AB4Tex "__OTR__textures/kanji/gMsgKanji8AB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB4Tex[] = dgMsgKanji8AB4Tex; + +#define dgMsgKanji8AB5Tex "__OTR__textures/kanji/gMsgKanji8AB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB5Tex[] = dgMsgKanji8AB5Tex; + +#define dgMsgKanji8AB6Tex "__OTR__textures/kanji/gMsgKanji8AB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB6Tex[] = dgMsgKanji8AB6Tex; + +#define dgMsgKanji8AB7Tex "__OTR__textures/kanji/gMsgKanji8AB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB7Tex[] = dgMsgKanji8AB7Tex; + +#define dgMsgKanji8AB8Tex "__OTR__textures/kanji/gMsgKanji8AB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB8Tex[] = dgMsgKanji8AB8Tex; + +#define dgMsgKanji8AB9Tex "__OTR__textures/kanji/gMsgKanji8AB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AB9Tex[] = dgMsgKanji8AB9Tex; + +#define dgMsgKanji8ABATex "__OTR__textures/kanji/gMsgKanji8ABATex" +static const ALIGN_ASSET(2) char gMsgKanji8ABATex[] = dgMsgKanji8ABATex; + +#define dgMsgKanji8ABBTex "__OTR__textures/kanji/gMsgKanji8ABBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABBTex[] = dgMsgKanji8ABBTex; + +#define dgMsgKanji8ABCTex "__OTR__textures/kanji/gMsgKanji8ABCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABCTex[] = dgMsgKanji8ABCTex; + +#define dgMsgKanji8ABDTex "__OTR__textures/kanji/gMsgKanji8ABDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABDTex[] = dgMsgKanji8ABDTex; + +#define dgMsgKanji8ABETex "__OTR__textures/kanji/gMsgKanji8ABETex" +static const ALIGN_ASSET(2) char gMsgKanji8ABETex[] = dgMsgKanji8ABETex; + +#define dgMsgKanji8ABFTex "__OTR__textures/kanji/gMsgKanji8ABFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ABFTex[] = dgMsgKanji8ABFTex; + +#define dgMsgKanji8AC0Tex "__OTR__textures/kanji/gMsgKanji8AC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC0Tex[] = dgMsgKanji8AC0Tex; + +#define dgMsgKanji8AC1Tex "__OTR__textures/kanji/gMsgKanji8AC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC1Tex[] = dgMsgKanji8AC1Tex; + +#define dgMsgKanji8AC2Tex "__OTR__textures/kanji/gMsgKanji8AC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC2Tex[] = dgMsgKanji8AC2Tex; + +#define dgMsgKanji8AC3Tex "__OTR__textures/kanji/gMsgKanji8AC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC3Tex[] = dgMsgKanji8AC3Tex; + +#define dgMsgKanji8AC4Tex "__OTR__textures/kanji/gMsgKanji8AC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC4Tex[] = dgMsgKanji8AC4Tex; + +#define dgMsgKanji8AC5Tex "__OTR__textures/kanji/gMsgKanji8AC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC5Tex[] = dgMsgKanji8AC5Tex; + +#define dgMsgKanji8AC6Tex "__OTR__textures/kanji/gMsgKanji8AC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC6Tex[] = dgMsgKanji8AC6Tex; + +#define dgMsgKanji8AC7Tex "__OTR__textures/kanji/gMsgKanji8AC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC7Tex[] = dgMsgKanji8AC7Tex; + +#define dgMsgKanji8AC8Tex "__OTR__textures/kanji/gMsgKanji8AC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC8Tex[] = dgMsgKanji8AC8Tex; + +#define dgMsgKanji8AC9Tex "__OTR__textures/kanji/gMsgKanji8AC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AC9Tex[] = dgMsgKanji8AC9Tex; + +#define dgMsgKanji8ACATex "__OTR__textures/kanji/gMsgKanji8ACATex" +static const ALIGN_ASSET(2) char gMsgKanji8ACATex[] = dgMsgKanji8ACATex; + +#define dgMsgKanji8ACBTex "__OTR__textures/kanji/gMsgKanji8ACBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACBTex[] = dgMsgKanji8ACBTex; + +#define dgMsgKanji8ACCTex "__OTR__textures/kanji/gMsgKanji8ACCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACCTex[] = dgMsgKanji8ACCTex; + +#define dgMsgKanji8ACDTex "__OTR__textures/kanji/gMsgKanji8ACDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACDTex[] = dgMsgKanji8ACDTex; + +#define dgMsgKanji8ACETex "__OTR__textures/kanji/gMsgKanji8ACETex" +static const ALIGN_ASSET(2) char gMsgKanji8ACETex[] = dgMsgKanji8ACETex; + +#define dgMsgKanji8ACFTex "__OTR__textures/kanji/gMsgKanji8ACFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ACFTex[] = dgMsgKanji8ACFTex; + +#define dgMsgKanji8AD0Tex "__OTR__textures/kanji/gMsgKanji8AD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD0Tex[] = dgMsgKanji8AD0Tex; + +#define dgMsgKanji8AD1Tex "__OTR__textures/kanji/gMsgKanji8AD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD1Tex[] = dgMsgKanji8AD1Tex; + +#define dgMsgKanji8AD2Tex "__OTR__textures/kanji/gMsgKanji8AD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD2Tex[] = dgMsgKanji8AD2Tex; + +#define dgMsgKanji8AD3Tex "__OTR__textures/kanji/gMsgKanji8AD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD3Tex[] = dgMsgKanji8AD3Tex; + +#define dgMsgKanji8AD4Tex "__OTR__textures/kanji/gMsgKanji8AD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD4Tex[] = dgMsgKanji8AD4Tex; + +#define dgMsgKanji8AD5Tex "__OTR__textures/kanji/gMsgKanji8AD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD5Tex[] = dgMsgKanji8AD5Tex; + +#define dgMsgKanji8AD6Tex "__OTR__textures/kanji/gMsgKanji8AD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD6Tex[] = dgMsgKanji8AD6Tex; + +#define dgMsgKanji8AD7Tex "__OTR__textures/kanji/gMsgKanji8AD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD7Tex[] = dgMsgKanji8AD7Tex; + +#define dgMsgKanji8AD8Tex "__OTR__textures/kanji/gMsgKanji8AD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD8Tex[] = dgMsgKanji8AD8Tex; + +#define dgMsgKanji8AD9Tex "__OTR__textures/kanji/gMsgKanji8AD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AD9Tex[] = dgMsgKanji8AD9Tex; + +#define dgMsgKanji8ADATex "__OTR__textures/kanji/gMsgKanji8ADATex" +static const ALIGN_ASSET(2) char gMsgKanji8ADATex[] = dgMsgKanji8ADATex; + +#define dgMsgKanji8ADBTex "__OTR__textures/kanji/gMsgKanji8ADBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADBTex[] = dgMsgKanji8ADBTex; + +#define dgMsgKanji8ADCTex "__OTR__textures/kanji/gMsgKanji8ADCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADCTex[] = dgMsgKanji8ADCTex; + +#define dgMsgKanji8ADDTex "__OTR__textures/kanji/gMsgKanji8ADDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADDTex[] = dgMsgKanji8ADDTex; + +#define dgMsgKanji8ADETex "__OTR__textures/kanji/gMsgKanji8ADETex" +static const ALIGN_ASSET(2) char gMsgKanji8ADETex[] = dgMsgKanji8ADETex; + +#define dgMsgKanji8ADFTex "__OTR__textures/kanji/gMsgKanji8ADFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ADFTex[] = dgMsgKanji8ADFTex; + +#define dgMsgKanji8AE0Tex "__OTR__textures/kanji/gMsgKanji8AE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE0Tex[] = dgMsgKanji8AE0Tex; + +#define dgMsgKanji8AE1Tex "__OTR__textures/kanji/gMsgKanji8AE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE1Tex[] = dgMsgKanji8AE1Tex; + +#define dgMsgKanji8AE2Tex "__OTR__textures/kanji/gMsgKanji8AE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE2Tex[] = dgMsgKanji8AE2Tex; + +#define dgMsgKanji8AE3Tex "__OTR__textures/kanji/gMsgKanji8AE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE3Tex[] = dgMsgKanji8AE3Tex; + +#define dgMsgKanji8AE4Tex "__OTR__textures/kanji/gMsgKanji8AE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE4Tex[] = dgMsgKanji8AE4Tex; + +#define dgMsgKanji8AE5Tex "__OTR__textures/kanji/gMsgKanji8AE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE5Tex[] = dgMsgKanji8AE5Tex; + +#define dgMsgKanji8AE6Tex "__OTR__textures/kanji/gMsgKanji8AE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE6Tex[] = dgMsgKanji8AE6Tex; + +#define dgMsgKanji8AE7Tex "__OTR__textures/kanji/gMsgKanji8AE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE7Tex[] = dgMsgKanji8AE7Tex; + +#define dgMsgKanji8AE8Tex "__OTR__textures/kanji/gMsgKanji8AE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE8Tex[] = dgMsgKanji8AE8Tex; + +#define dgMsgKanji8AE9Tex "__OTR__textures/kanji/gMsgKanji8AE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AE9Tex[] = dgMsgKanji8AE9Tex; + +#define dgMsgKanji8AEATex "__OTR__textures/kanji/gMsgKanji8AEATex" +static const ALIGN_ASSET(2) char gMsgKanji8AEATex[] = dgMsgKanji8AEATex; + +#define dgMsgKanji8AEBTex "__OTR__textures/kanji/gMsgKanji8AEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8AEBTex[] = dgMsgKanji8AEBTex; + +#define dgMsgKanji8AECTex "__OTR__textures/kanji/gMsgKanji8AECTex" +static const ALIGN_ASSET(2) char gMsgKanji8AECTex[] = dgMsgKanji8AECTex; + +#define dgMsgKanji8AEDTex "__OTR__textures/kanji/gMsgKanji8AEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8AEDTex[] = dgMsgKanji8AEDTex; + +#define dgMsgKanji8AEETex "__OTR__textures/kanji/gMsgKanji8AEETex" +static const ALIGN_ASSET(2) char gMsgKanji8AEETex[] = dgMsgKanji8AEETex; + +#define dgMsgKanji8AEFTex "__OTR__textures/kanji/gMsgKanji8AEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8AEFTex[] = dgMsgKanji8AEFTex; + +#define dgMsgKanji8AF0Tex "__OTR__textures/kanji/gMsgKanji8AF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF0Tex[] = dgMsgKanji8AF0Tex; + +#define dgMsgKanji8AF1Tex "__OTR__textures/kanji/gMsgKanji8AF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF1Tex[] = dgMsgKanji8AF1Tex; + +#define dgMsgKanji8AF2Tex "__OTR__textures/kanji/gMsgKanji8AF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF2Tex[] = dgMsgKanji8AF2Tex; + +#define dgMsgKanji8AF3Tex "__OTR__textures/kanji/gMsgKanji8AF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF3Tex[] = dgMsgKanji8AF3Tex; + +#define dgMsgKanji8AF4Tex "__OTR__textures/kanji/gMsgKanji8AF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF4Tex[] = dgMsgKanji8AF4Tex; + +#define dgMsgKanji8AF5Tex "__OTR__textures/kanji/gMsgKanji8AF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF5Tex[] = dgMsgKanji8AF5Tex; + +#define dgMsgKanji8AF6Tex "__OTR__textures/kanji/gMsgKanji8AF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF6Tex[] = dgMsgKanji8AF6Tex; + +#define dgMsgKanji8AF7Tex "__OTR__textures/kanji/gMsgKanji8AF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF7Tex[] = dgMsgKanji8AF7Tex; + +#define dgMsgKanji8AF8Tex "__OTR__textures/kanji/gMsgKanji8AF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF8Tex[] = dgMsgKanji8AF8Tex; + +#define dgMsgKanji8AF9Tex "__OTR__textures/kanji/gMsgKanji8AF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8AF9Tex[] = dgMsgKanji8AF9Tex; + +#define dgMsgKanji8AFATex "__OTR__textures/kanji/gMsgKanji8AFATex" +static const ALIGN_ASSET(2) char gMsgKanji8AFATex[] = dgMsgKanji8AFATex; + +#define dgMsgKanji8AFBTex "__OTR__textures/kanji/gMsgKanji8AFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8AFBTex[] = dgMsgKanji8AFBTex; + +#define dgMsgKanji8AFCTex "__OTR__textures/kanji/gMsgKanji8AFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8AFCTex[] = dgMsgKanji8AFCTex; + +#define dgMsgKanji8B40Tex "__OTR__textures/kanji/gMsgKanji8B40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B40Tex[] = dgMsgKanji8B40Tex; + +#define dgMsgKanji8B41Tex "__OTR__textures/kanji/gMsgKanji8B41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B41Tex[] = dgMsgKanji8B41Tex; + +#define dgMsgKanji8B42Tex "__OTR__textures/kanji/gMsgKanji8B42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B42Tex[] = dgMsgKanji8B42Tex; + +#define dgMsgKanji8B43Tex "__OTR__textures/kanji/gMsgKanji8B43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B43Tex[] = dgMsgKanji8B43Tex; + +#define dgMsgKanji8B44Tex "__OTR__textures/kanji/gMsgKanji8B44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B44Tex[] = dgMsgKanji8B44Tex; + +#define dgMsgKanji8B45Tex "__OTR__textures/kanji/gMsgKanji8B45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B45Tex[] = dgMsgKanji8B45Tex; + +#define dgMsgKanji8B46Tex "__OTR__textures/kanji/gMsgKanji8B46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B46Tex[] = dgMsgKanji8B46Tex; + +#define dgMsgKanji8B47Tex "__OTR__textures/kanji/gMsgKanji8B47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B47Tex[] = dgMsgKanji8B47Tex; + +#define dgMsgKanji8B48Tex "__OTR__textures/kanji/gMsgKanji8B48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B48Tex[] = dgMsgKanji8B48Tex; + +#define dgMsgKanji8B49Tex "__OTR__textures/kanji/gMsgKanji8B49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B49Tex[] = dgMsgKanji8B49Tex; + +#define dgMsgKanji8B4ATex "__OTR__textures/kanji/gMsgKanji8B4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B4ATex[] = dgMsgKanji8B4ATex; + +#define dgMsgKanji8B4BTex "__OTR__textures/kanji/gMsgKanji8B4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4BTex[] = dgMsgKanji8B4BTex; + +#define dgMsgKanji8B4CTex "__OTR__textures/kanji/gMsgKanji8B4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4CTex[] = dgMsgKanji8B4CTex; + +#define dgMsgKanji8B4DTex "__OTR__textures/kanji/gMsgKanji8B4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4DTex[] = dgMsgKanji8B4DTex; + +#define dgMsgKanji8B4ETex "__OTR__textures/kanji/gMsgKanji8B4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B4ETex[] = dgMsgKanji8B4ETex; + +#define dgMsgKanji8B4FTex "__OTR__textures/kanji/gMsgKanji8B4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B4FTex[] = dgMsgKanji8B4FTex; + +#define dgMsgKanji8B50Tex "__OTR__textures/kanji/gMsgKanji8B50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B50Tex[] = dgMsgKanji8B50Tex; + +#define dgMsgKanji8B51Tex "__OTR__textures/kanji/gMsgKanji8B51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B51Tex[] = dgMsgKanji8B51Tex; + +#define dgMsgKanji8B52Tex "__OTR__textures/kanji/gMsgKanji8B52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B52Tex[] = dgMsgKanji8B52Tex; + +#define dgMsgKanji8B53Tex "__OTR__textures/kanji/gMsgKanji8B53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B53Tex[] = dgMsgKanji8B53Tex; + +#define dgMsgKanji8B54Tex "__OTR__textures/kanji/gMsgKanji8B54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B54Tex[] = dgMsgKanji8B54Tex; + +#define dgMsgKanji8B55Tex "__OTR__textures/kanji/gMsgKanji8B55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B55Tex[] = dgMsgKanji8B55Tex; + +#define dgMsgKanji8B56Tex "__OTR__textures/kanji/gMsgKanji8B56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B56Tex[] = dgMsgKanji8B56Tex; + +#define dgMsgKanji8B57Tex "__OTR__textures/kanji/gMsgKanji8B57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B57Tex[] = dgMsgKanji8B57Tex; + +#define dgMsgKanji8B58Tex "__OTR__textures/kanji/gMsgKanji8B58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B58Tex[] = dgMsgKanji8B58Tex; + +#define dgMsgKanji8B59Tex "__OTR__textures/kanji/gMsgKanji8B59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B59Tex[] = dgMsgKanji8B59Tex; + +#define dgMsgKanji8B5ATex "__OTR__textures/kanji/gMsgKanji8B5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B5ATex[] = dgMsgKanji8B5ATex; + +#define dgMsgKanji8B5BTex "__OTR__textures/kanji/gMsgKanji8B5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5BTex[] = dgMsgKanji8B5BTex; + +#define dgMsgKanji8B5CTex "__OTR__textures/kanji/gMsgKanji8B5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5CTex[] = dgMsgKanji8B5CTex; + +#define dgMsgKanji8B5DTex "__OTR__textures/kanji/gMsgKanji8B5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5DTex[] = dgMsgKanji8B5DTex; + +#define dgMsgKanji8B5ETex "__OTR__textures/kanji/gMsgKanji8B5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B5ETex[] = dgMsgKanji8B5ETex; + +#define dgMsgKanji8B5FTex "__OTR__textures/kanji/gMsgKanji8B5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B5FTex[] = dgMsgKanji8B5FTex; + +#define dgMsgKanji8B60Tex "__OTR__textures/kanji/gMsgKanji8B60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B60Tex[] = dgMsgKanji8B60Tex; + +#define dgMsgKanji8B61Tex "__OTR__textures/kanji/gMsgKanji8B61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B61Tex[] = dgMsgKanji8B61Tex; + +#define dgMsgKanji8B62Tex "__OTR__textures/kanji/gMsgKanji8B62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B62Tex[] = dgMsgKanji8B62Tex; + +#define dgMsgKanji8B63Tex "__OTR__textures/kanji/gMsgKanji8B63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B63Tex[] = dgMsgKanji8B63Tex; + +#define dgMsgKanji8B64Tex "__OTR__textures/kanji/gMsgKanji8B64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B64Tex[] = dgMsgKanji8B64Tex; + +#define dgMsgKanji8B65Tex "__OTR__textures/kanji/gMsgKanji8B65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B65Tex[] = dgMsgKanji8B65Tex; + +#define dgMsgKanji8B66Tex "__OTR__textures/kanji/gMsgKanji8B66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B66Tex[] = dgMsgKanji8B66Tex; + +#define dgMsgKanji8B67Tex "__OTR__textures/kanji/gMsgKanji8B67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B67Tex[] = dgMsgKanji8B67Tex; + +#define dgMsgKanji8B68Tex "__OTR__textures/kanji/gMsgKanji8B68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B68Tex[] = dgMsgKanji8B68Tex; + +#define dgMsgKanji8B69Tex "__OTR__textures/kanji/gMsgKanji8B69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B69Tex[] = dgMsgKanji8B69Tex; + +#define dgMsgKanji8B6ATex "__OTR__textures/kanji/gMsgKanji8B6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B6ATex[] = dgMsgKanji8B6ATex; + +#define dgMsgKanji8B6BTex "__OTR__textures/kanji/gMsgKanji8B6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6BTex[] = dgMsgKanji8B6BTex; + +#define dgMsgKanji8B6CTex "__OTR__textures/kanji/gMsgKanji8B6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6CTex[] = dgMsgKanji8B6CTex; + +#define dgMsgKanji8B6DTex "__OTR__textures/kanji/gMsgKanji8B6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6DTex[] = dgMsgKanji8B6DTex; + +#define dgMsgKanji8B6ETex "__OTR__textures/kanji/gMsgKanji8B6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B6ETex[] = dgMsgKanji8B6ETex; + +#define dgMsgKanji8B6FTex "__OTR__textures/kanji/gMsgKanji8B6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B6FTex[] = dgMsgKanji8B6FTex; + +#define dgMsgKanji8B70Tex "__OTR__textures/kanji/gMsgKanji8B70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B70Tex[] = dgMsgKanji8B70Tex; + +#define dgMsgKanji8B71Tex "__OTR__textures/kanji/gMsgKanji8B71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B71Tex[] = dgMsgKanji8B71Tex; + +#define dgMsgKanji8B72Tex "__OTR__textures/kanji/gMsgKanji8B72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B72Tex[] = dgMsgKanji8B72Tex; + +#define dgMsgKanji8B73Tex "__OTR__textures/kanji/gMsgKanji8B73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B73Tex[] = dgMsgKanji8B73Tex; + +#define dgMsgKanji8B74Tex "__OTR__textures/kanji/gMsgKanji8B74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B74Tex[] = dgMsgKanji8B74Tex; + +#define dgMsgKanji8B75Tex "__OTR__textures/kanji/gMsgKanji8B75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B75Tex[] = dgMsgKanji8B75Tex; + +#define dgMsgKanji8B76Tex "__OTR__textures/kanji/gMsgKanji8B76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B76Tex[] = dgMsgKanji8B76Tex; + +#define dgMsgKanji8B77Tex "__OTR__textures/kanji/gMsgKanji8B77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B77Tex[] = dgMsgKanji8B77Tex; + +#define dgMsgKanji8B78Tex "__OTR__textures/kanji/gMsgKanji8B78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B78Tex[] = dgMsgKanji8B78Tex; + +#define dgMsgKanji8B79Tex "__OTR__textures/kanji/gMsgKanji8B79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B79Tex[] = dgMsgKanji8B79Tex; + +#define dgMsgKanji8B7ATex "__OTR__textures/kanji/gMsgKanji8B7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B7ATex[] = dgMsgKanji8B7ATex; + +#define dgMsgKanji8B7BTex "__OTR__textures/kanji/gMsgKanji8B7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B7BTex[] = dgMsgKanji8B7BTex; + +#define dgMsgKanji8B7CTex "__OTR__textures/kanji/gMsgKanji8B7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B7CTex[] = dgMsgKanji8B7CTex; + +#define dgMsgKanji8B7DTex "__OTR__textures/kanji/gMsgKanji8B7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B7DTex[] = dgMsgKanji8B7DTex; + +#define dgMsgKanji8B7ETex "__OTR__textures/kanji/gMsgKanji8B7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B7ETex[] = dgMsgKanji8B7ETex; + +#define dgMsgKanji8B80Tex "__OTR__textures/kanji/gMsgKanji8B80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B80Tex[] = dgMsgKanji8B80Tex; + +#define dgMsgKanji8B81Tex "__OTR__textures/kanji/gMsgKanji8B81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B81Tex[] = dgMsgKanji8B81Tex; + +#define dgMsgKanji8B82Tex "__OTR__textures/kanji/gMsgKanji8B82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B82Tex[] = dgMsgKanji8B82Tex; + +#define dgMsgKanji8B83Tex "__OTR__textures/kanji/gMsgKanji8B83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B83Tex[] = dgMsgKanji8B83Tex; + +#define dgMsgKanji8B84Tex "__OTR__textures/kanji/gMsgKanji8B84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B84Tex[] = dgMsgKanji8B84Tex; + +#define dgMsgKanji8B85Tex "__OTR__textures/kanji/gMsgKanji8B85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B85Tex[] = dgMsgKanji8B85Tex; + +#define dgMsgKanji8B86Tex "__OTR__textures/kanji/gMsgKanji8B86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B86Tex[] = dgMsgKanji8B86Tex; + +#define dgMsgKanji8B87Tex "__OTR__textures/kanji/gMsgKanji8B87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B87Tex[] = dgMsgKanji8B87Tex; + +#define dgMsgKanji8B88Tex "__OTR__textures/kanji/gMsgKanji8B88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B88Tex[] = dgMsgKanji8B88Tex; + +#define dgMsgKanji8B89Tex "__OTR__textures/kanji/gMsgKanji8B89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B89Tex[] = dgMsgKanji8B89Tex; + +#define dgMsgKanji8B8ATex "__OTR__textures/kanji/gMsgKanji8B8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B8ATex[] = dgMsgKanji8B8ATex; + +#define dgMsgKanji8B8BTex "__OTR__textures/kanji/gMsgKanji8B8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8BTex[] = dgMsgKanji8B8BTex; + +#define dgMsgKanji8B8CTex "__OTR__textures/kanji/gMsgKanji8B8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8CTex[] = dgMsgKanji8B8CTex; + +#define dgMsgKanji8B8DTex "__OTR__textures/kanji/gMsgKanji8B8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8DTex[] = dgMsgKanji8B8DTex; + +#define dgMsgKanji8B8ETex "__OTR__textures/kanji/gMsgKanji8B8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B8ETex[] = dgMsgKanji8B8ETex; + +#define dgMsgKanji8B8FTex "__OTR__textures/kanji/gMsgKanji8B8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B8FTex[] = dgMsgKanji8B8FTex; + +#define dgMsgKanji8B90Tex "__OTR__textures/kanji/gMsgKanji8B90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B90Tex[] = dgMsgKanji8B90Tex; + +#define dgMsgKanji8B91Tex "__OTR__textures/kanji/gMsgKanji8B91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B91Tex[] = dgMsgKanji8B91Tex; + +#define dgMsgKanji8B92Tex "__OTR__textures/kanji/gMsgKanji8B92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B92Tex[] = dgMsgKanji8B92Tex; + +#define dgMsgKanji8B93Tex "__OTR__textures/kanji/gMsgKanji8B93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B93Tex[] = dgMsgKanji8B93Tex; + +#define dgMsgKanji8B94Tex "__OTR__textures/kanji/gMsgKanji8B94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B94Tex[] = dgMsgKanji8B94Tex; + +#define dgMsgKanji8B95Tex "__OTR__textures/kanji/gMsgKanji8B95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B95Tex[] = dgMsgKanji8B95Tex; + +#define dgMsgKanji8B96Tex "__OTR__textures/kanji/gMsgKanji8B96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B96Tex[] = dgMsgKanji8B96Tex; + +#define dgMsgKanji8B97Tex "__OTR__textures/kanji/gMsgKanji8B97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B97Tex[] = dgMsgKanji8B97Tex; + +#define dgMsgKanji8B98Tex "__OTR__textures/kanji/gMsgKanji8B98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B98Tex[] = dgMsgKanji8B98Tex; + +#define dgMsgKanji8B99Tex "__OTR__textures/kanji/gMsgKanji8B99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8B99Tex[] = dgMsgKanji8B99Tex; + +#define dgMsgKanji8B9ATex "__OTR__textures/kanji/gMsgKanji8B9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8B9ATex[] = dgMsgKanji8B9ATex; + +#define dgMsgKanji8B9BTex "__OTR__textures/kanji/gMsgKanji8B9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9BTex[] = dgMsgKanji8B9BTex; + +#define dgMsgKanji8B9CTex "__OTR__textures/kanji/gMsgKanji8B9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9CTex[] = dgMsgKanji8B9CTex; + +#define dgMsgKanji8B9DTex "__OTR__textures/kanji/gMsgKanji8B9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9DTex[] = dgMsgKanji8B9DTex; + +#define dgMsgKanji8B9ETex "__OTR__textures/kanji/gMsgKanji8B9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8B9ETex[] = dgMsgKanji8B9ETex; + +#define dgMsgKanji8B9FTex "__OTR__textures/kanji/gMsgKanji8B9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8B9FTex[] = dgMsgKanji8B9FTex; + +#define dgMsgKanji8BA0Tex "__OTR__textures/kanji/gMsgKanji8BA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA0Tex[] = dgMsgKanji8BA0Tex; + +#define dgMsgKanji8BA1Tex "__OTR__textures/kanji/gMsgKanji8BA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA1Tex[] = dgMsgKanji8BA1Tex; + +#define dgMsgKanji8BA2Tex "__OTR__textures/kanji/gMsgKanji8BA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA2Tex[] = dgMsgKanji8BA2Tex; + +#define dgMsgKanji8BA3Tex "__OTR__textures/kanji/gMsgKanji8BA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA3Tex[] = dgMsgKanji8BA3Tex; + +#define dgMsgKanji8BA4Tex "__OTR__textures/kanji/gMsgKanji8BA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA4Tex[] = dgMsgKanji8BA4Tex; + +#define dgMsgKanji8BA5Tex "__OTR__textures/kanji/gMsgKanji8BA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA5Tex[] = dgMsgKanji8BA5Tex; + +#define dgMsgKanji8BA6Tex "__OTR__textures/kanji/gMsgKanji8BA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA6Tex[] = dgMsgKanji8BA6Tex; + +#define dgMsgKanji8BA7Tex "__OTR__textures/kanji/gMsgKanji8BA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA7Tex[] = dgMsgKanji8BA7Tex; + +#define dgMsgKanji8BA8Tex "__OTR__textures/kanji/gMsgKanji8BA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA8Tex[] = dgMsgKanji8BA8Tex; + +#define dgMsgKanji8BA9Tex "__OTR__textures/kanji/gMsgKanji8BA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BA9Tex[] = dgMsgKanji8BA9Tex; + +#define dgMsgKanji8BAATex "__OTR__textures/kanji/gMsgKanji8BAATex" +static const ALIGN_ASSET(2) char gMsgKanji8BAATex[] = dgMsgKanji8BAATex; + +#define dgMsgKanji8BABTex "__OTR__textures/kanji/gMsgKanji8BABTex" +static const ALIGN_ASSET(2) char gMsgKanji8BABTex[] = dgMsgKanji8BABTex; + +#define dgMsgKanji8BACTex "__OTR__textures/kanji/gMsgKanji8BACTex" +static const ALIGN_ASSET(2) char gMsgKanji8BACTex[] = dgMsgKanji8BACTex; + +#define dgMsgKanji8BADTex "__OTR__textures/kanji/gMsgKanji8BADTex" +static const ALIGN_ASSET(2) char gMsgKanji8BADTex[] = dgMsgKanji8BADTex; + +#define dgMsgKanji8BAETex "__OTR__textures/kanji/gMsgKanji8BAETex" +static const ALIGN_ASSET(2) char gMsgKanji8BAETex[] = dgMsgKanji8BAETex; + +#define dgMsgKanji8BAFTex "__OTR__textures/kanji/gMsgKanji8BAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BAFTex[] = dgMsgKanji8BAFTex; + +#define dgMsgKanji8BB0Tex "__OTR__textures/kanji/gMsgKanji8BB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB0Tex[] = dgMsgKanji8BB0Tex; + +#define dgMsgKanji8BB1Tex "__OTR__textures/kanji/gMsgKanji8BB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB1Tex[] = dgMsgKanji8BB1Tex; + +#define dgMsgKanji8BB2Tex "__OTR__textures/kanji/gMsgKanji8BB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB2Tex[] = dgMsgKanji8BB2Tex; + +#define dgMsgKanji8BB3Tex "__OTR__textures/kanji/gMsgKanji8BB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB3Tex[] = dgMsgKanji8BB3Tex; + +#define dgMsgKanji8BB4Tex "__OTR__textures/kanji/gMsgKanji8BB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB4Tex[] = dgMsgKanji8BB4Tex; + +#define dgMsgKanji8BB5Tex "__OTR__textures/kanji/gMsgKanji8BB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB5Tex[] = dgMsgKanji8BB5Tex; + +#define dgMsgKanji8BB6Tex "__OTR__textures/kanji/gMsgKanji8BB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB6Tex[] = dgMsgKanji8BB6Tex; + +#define dgMsgKanji8BB7Tex "__OTR__textures/kanji/gMsgKanji8BB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB7Tex[] = dgMsgKanji8BB7Tex; + +#define dgMsgKanji8BB8Tex "__OTR__textures/kanji/gMsgKanji8BB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB8Tex[] = dgMsgKanji8BB8Tex; + +#define dgMsgKanji8BB9Tex "__OTR__textures/kanji/gMsgKanji8BB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BB9Tex[] = dgMsgKanji8BB9Tex; + +#define dgMsgKanji8BBATex "__OTR__textures/kanji/gMsgKanji8BBATex" +static const ALIGN_ASSET(2) char gMsgKanji8BBATex[] = dgMsgKanji8BBATex; + +#define dgMsgKanji8BBBTex "__OTR__textures/kanji/gMsgKanji8BBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBBTex[] = dgMsgKanji8BBBTex; + +#define dgMsgKanji8BBCTex "__OTR__textures/kanji/gMsgKanji8BBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBCTex[] = dgMsgKanji8BBCTex; + +#define dgMsgKanji8BBDTex "__OTR__textures/kanji/gMsgKanji8BBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBDTex[] = dgMsgKanji8BBDTex; + +#define dgMsgKanji8BBETex "__OTR__textures/kanji/gMsgKanji8BBETex" +static const ALIGN_ASSET(2) char gMsgKanji8BBETex[] = dgMsgKanji8BBETex; + +#define dgMsgKanji8BBFTex "__OTR__textures/kanji/gMsgKanji8BBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BBFTex[] = dgMsgKanji8BBFTex; + +#define dgMsgKanji8BC0Tex "__OTR__textures/kanji/gMsgKanji8BC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC0Tex[] = dgMsgKanji8BC0Tex; + +#define dgMsgKanji8BC1Tex "__OTR__textures/kanji/gMsgKanji8BC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC1Tex[] = dgMsgKanji8BC1Tex; + +#define dgMsgKanji8BC2Tex "__OTR__textures/kanji/gMsgKanji8BC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC2Tex[] = dgMsgKanji8BC2Tex; + +#define dgMsgKanji8BC3Tex "__OTR__textures/kanji/gMsgKanji8BC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC3Tex[] = dgMsgKanji8BC3Tex; + +#define dgMsgKanji8BC4Tex "__OTR__textures/kanji/gMsgKanji8BC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC4Tex[] = dgMsgKanji8BC4Tex; + +#define dgMsgKanji8BC5Tex "__OTR__textures/kanji/gMsgKanji8BC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC5Tex[] = dgMsgKanji8BC5Tex; + +#define dgMsgKanji8BC6Tex "__OTR__textures/kanji/gMsgKanji8BC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC6Tex[] = dgMsgKanji8BC6Tex; + +#define dgMsgKanji8BC7Tex "__OTR__textures/kanji/gMsgKanji8BC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC7Tex[] = dgMsgKanji8BC7Tex; + +#define dgMsgKanji8BC8Tex "__OTR__textures/kanji/gMsgKanji8BC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC8Tex[] = dgMsgKanji8BC8Tex; + +#define dgMsgKanji8BC9Tex "__OTR__textures/kanji/gMsgKanji8BC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BC9Tex[] = dgMsgKanji8BC9Tex; + +#define dgMsgKanji8BCATex "__OTR__textures/kanji/gMsgKanji8BCATex" +static const ALIGN_ASSET(2) char gMsgKanji8BCATex[] = dgMsgKanji8BCATex; + +#define dgMsgKanji8BCBTex "__OTR__textures/kanji/gMsgKanji8BCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCBTex[] = dgMsgKanji8BCBTex; + +#define dgMsgKanji8BCCTex "__OTR__textures/kanji/gMsgKanji8BCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCCTex[] = dgMsgKanji8BCCTex; + +#define dgMsgKanji8BCDTex "__OTR__textures/kanji/gMsgKanji8BCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCDTex[] = dgMsgKanji8BCDTex; + +#define dgMsgKanji8BCETex "__OTR__textures/kanji/gMsgKanji8BCETex" +static const ALIGN_ASSET(2) char gMsgKanji8BCETex[] = dgMsgKanji8BCETex; + +#define dgMsgKanji8BCFTex "__OTR__textures/kanji/gMsgKanji8BCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BCFTex[] = dgMsgKanji8BCFTex; + +#define dgMsgKanji8BD0Tex "__OTR__textures/kanji/gMsgKanji8BD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD0Tex[] = dgMsgKanji8BD0Tex; + +#define dgMsgKanji8BD1Tex "__OTR__textures/kanji/gMsgKanji8BD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD1Tex[] = dgMsgKanji8BD1Tex; + +#define dgMsgKanji8BD2Tex "__OTR__textures/kanji/gMsgKanji8BD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD2Tex[] = dgMsgKanji8BD2Tex; + +#define dgMsgKanji8BD3Tex "__OTR__textures/kanji/gMsgKanji8BD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD3Tex[] = dgMsgKanji8BD3Tex; + +#define dgMsgKanji8BD4Tex "__OTR__textures/kanji/gMsgKanji8BD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD4Tex[] = dgMsgKanji8BD4Tex; + +#define dgMsgKanji8BD5Tex "__OTR__textures/kanji/gMsgKanji8BD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD5Tex[] = dgMsgKanji8BD5Tex; + +#define dgMsgKanji8BD6Tex "__OTR__textures/kanji/gMsgKanji8BD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD6Tex[] = dgMsgKanji8BD6Tex; + +#define dgMsgKanji8BD7Tex "__OTR__textures/kanji/gMsgKanji8BD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD7Tex[] = dgMsgKanji8BD7Tex; + +#define dgMsgKanji8BD8Tex "__OTR__textures/kanji/gMsgKanji8BD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD8Tex[] = dgMsgKanji8BD8Tex; + +#define dgMsgKanji8BD9Tex "__OTR__textures/kanji/gMsgKanji8BD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BD9Tex[] = dgMsgKanji8BD9Tex; + +#define dgMsgKanji8BDATex "__OTR__textures/kanji/gMsgKanji8BDATex" +static const ALIGN_ASSET(2) char gMsgKanji8BDATex[] = dgMsgKanji8BDATex; + +#define dgMsgKanji8BDBTex "__OTR__textures/kanji/gMsgKanji8BDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDBTex[] = dgMsgKanji8BDBTex; + +#define dgMsgKanji8BDCTex "__OTR__textures/kanji/gMsgKanji8BDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDCTex[] = dgMsgKanji8BDCTex; + +#define dgMsgKanji8BDDTex "__OTR__textures/kanji/gMsgKanji8BDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDDTex[] = dgMsgKanji8BDDTex; + +#define dgMsgKanji8BDETex "__OTR__textures/kanji/gMsgKanji8BDETex" +static const ALIGN_ASSET(2) char gMsgKanji8BDETex[] = dgMsgKanji8BDETex; + +#define dgMsgKanji8BDFTex "__OTR__textures/kanji/gMsgKanji8BDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BDFTex[] = dgMsgKanji8BDFTex; + +#define dgMsgKanji8BE0Tex "__OTR__textures/kanji/gMsgKanji8BE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE0Tex[] = dgMsgKanji8BE0Tex; + +#define dgMsgKanji8BE1Tex "__OTR__textures/kanji/gMsgKanji8BE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE1Tex[] = dgMsgKanji8BE1Tex; + +#define dgMsgKanji8BE2Tex "__OTR__textures/kanji/gMsgKanji8BE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE2Tex[] = dgMsgKanji8BE2Tex; + +#define dgMsgKanji8BE3Tex "__OTR__textures/kanji/gMsgKanji8BE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE3Tex[] = dgMsgKanji8BE3Tex; + +#define dgMsgKanji8BE4Tex "__OTR__textures/kanji/gMsgKanji8BE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE4Tex[] = dgMsgKanji8BE4Tex; + +#define dgMsgKanji8BE5Tex "__OTR__textures/kanji/gMsgKanji8BE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE5Tex[] = dgMsgKanji8BE5Tex; + +#define dgMsgKanji8BE6Tex "__OTR__textures/kanji/gMsgKanji8BE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE6Tex[] = dgMsgKanji8BE6Tex; + +#define dgMsgKanji8BE7Tex "__OTR__textures/kanji/gMsgKanji8BE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE7Tex[] = dgMsgKanji8BE7Tex; + +#define dgMsgKanji8BE8Tex "__OTR__textures/kanji/gMsgKanji8BE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE8Tex[] = dgMsgKanji8BE8Tex; + +#define dgMsgKanji8BE9Tex "__OTR__textures/kanji/gMsgKanji8BE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BE9Tex[] = dgMsgKanji8BE9Tex; + +#define dgMsgKanji8BEATex "__OTR__textures/kanji/gMsgKanji8BEATex" +static const ALIGN_ASSET(2) char gMsgKanji8BEATex[] = dgMsgKanji8BEATex; + +#define dgMsgKanji8BEBTex "__OTR__textures/kanji/gMsgKanji8BEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BEBTex[] = dgMsgKanji8BEBTex; + +#define dgMsgKanji8BECTex "__OTR__textures/kanji/gMsgKanji8BECTex" +static const ALIGN_ASSET(2) char gMsgKanji8BECTex[] = dgMsgKanji8BECTex; + +#define dgMsgKanji8BEDTex "__OTR__textures/kanji/gMsgKanji8BEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8BEDTex[] = dgMsgKanji8BEDTex; + +#define dgMsgKanji8BEETex "__OTR__textures/kanji/gMsgKanji8BEETex" +static const ALIGN_ASSET(2) char gMsgKanji8BEETex[] = dgMsgKanji8BEETex; + +#define dgMsgKanji8BEFTex "__OTR__textures/kanji/gMsgKanji8BEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8BEFTex[] = dgMsgKanji8BEFTex; + +#define dgMsgKanji8BF0Tex "__OTR__textures/kanji/gMsgKanji8BF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF0Tex[] = dgMsgKanji8BF0Tex; + +#define dgMsgKanji8BF1Tex "__OTR__textures/kanji/gMsgKanji8BF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF1Tex[] = dgMsgKanji8BF1Tex; + +#define dgMsgKanji8BF2Tex "__OTR__textures/kanji/gMsgKanji8BF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF2Tex[] = dgMsgKanji8BF2Tex; + +#define dgMsgKanji8BF3Tex "__OTR__textures/kanji/gMsgKanji8BF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF3Tex[] = dgMsgKanji8BF3Tex; + +#define dgMsgKanji8BF4Tex "__OTR__textures/kanji/gMsgKanji8BF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF4Tex[] = dgMsgKanji8BF4Tex; + +#define dgMsgKanji8BF5Tex "__OTR__textures/kanji/gMsgKanji8BF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF5Tex[] = dgMsgKanji8BF5Tex; + +#define dgMsgKanji8BF6Tex "__OTR__textures/kanji/gMsgKanji8BF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF6Tex[] = dgMsgKanji8BF6Tex; + +#define dgMsgKanji8BF7Tex "__OTR__textures/kanji/gMsgKanji8BF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF7Tex[] = dgMsgKanji8BF7Tex; + +#define dgMsgKanji8BF8Tex "__OTR__textures/kanji/gMsgKanji8BF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF8Tex[] = dgMsgKanji8BF8Tex; + +#define dgMsgKanji8BF9Tex "__OTR__textures/kanji/gMsgKanji8BF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8BF9Tex[] = dgMsgKanji8BF9Tex; + +#define dgMsgKanji8BFATex "__OTR__textures/kanji/gMsgKanji8BFATex" +static const ALIGN_ASSET(2) char gMsgKanji8BFATex[] = dgMsgKanji8BFATex; + +#define dgMsgKanji8BFBTex "__OTR__textures/kanji/gMsgKanji8BFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8BFBTex[] = dgMsgKanji8BFBTex; + +#define dgMsgKanji8BFCTex "__OTR__textures/kanji/gMsgKanji8BFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8BFCTex[] = dgMsgKanji8BFCTex; + +#define dgMsgKanji8C40Tex "__OTR__textures/kanji/gMsgKanji8C40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C40Tex[] = dgMsgKanji8C40Tex; + +#define dgMsgKanji8C41Tex "__OTR__textures/kanji/gMsgKanji8C41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C41Tex[] = dgMsgKanji8C41Tex; + +#define dgMsgKanji8C42Tex "__OTR__textures/kanji/gMsgKanji8C42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C42Tex[] = dgMsgKanji8C42Tex; + +#define dgMsgKanji8C43Tex "__OTR__textures/kanji/gMsgKanji8C43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C43Tex[] = dgMsgKanji8C43Tex; + +#define dgMsgKanji8C44Tex "__OTR__textures/kanji/gMsgKanji8C44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C44Tex[] = dgMsgKanji8C44Tex; + +#define dgMsgKanji8C45Tex "__OTR__textures/kanji/gMsgKanji8C45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C45Tex[] = dgMsgKanji8C45Tex; + +#define dgMsgKanji8C46Tex "__OTR__textures/kanji/gMsgKanji8C46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C46Tex[] = dgMsgKanji8C46Tex; + +#define dgMsgKanji8C47Tex "__OTR__textures/kanji/gMsgKanji8C47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C47Tex[] = dgMsgKanji8C47Tex; + +#define dgMsgKanji8C48Tex "__OTR__textures/kanji/gMsgKanji8C48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C48Tex[] = dgMsgKanji8C48Tex; + +#define dgMsgKanji8C49Tex "__OTR__textures/kanji/gMsgKanji8C49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C49Tex[] = dgMsgKanji8C49Tex; + +#define dgMsgKanji8C4ATex "__OTR__textures/kanji/gMsgKanji8C4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C4ATex[] = dgMsgKanji8C4ATex; + +#define dgMsgKanji8C4BTex "__OTR__textures/kanji/gMsgKanji8C4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4BTex[] = dgMsgKanji8C4BTex; + +#define dgMsgKanji8C4CTex "__OTR__textures/kanji/gMsgKanji8C4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4CTex[] = dgMsgKanji8C4CTex; + +#define dgMsgKanji8C4DTex "__OTR__textures/kanji/gMsgKanji8C4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4DTex[] = dgMsgKanji8C4DTex; + +#define dgMsgKanji8C4ETex "__OTR__textures/kanji/gMsgKanji8C4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C4ETex[] = dgMsgKanji8C4ETex; + +#define dgMsgKanji8C4FTex "__OTR__textures/kanji/gMsgKanji8C4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C4FTex[] = dgMsgKanji8C4FTex; + +#define dgMsgKanji8C50Tex "__OTR__textures/kanji/gMsgKanji8C50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C50Tex[] = dgMsgKanji8C50Tex; + +#define dgMsgKanji8C51Tex "__OTR__textures/kanji/gMsgKanji8C51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C51Tex[] = dgMsgKanji8C51Tex; + +#define dgMsgKanji8C52Tex "__OTR__textures/kanji/gMsgKanji8C52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C52Tex[] = dgMsgKanji8C52Tex; + +#define dgMsgKanji8C53Tex "__OTR__textures/kanji/gMsgKanji8C53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C53Tex[] = dgMsgKanji8C53Tex; + +#define dgMsgKanji8C54Tex "__OTR__textures/kanji/gMsgKanji8C54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C54Tex[] = dgMsgKanji8C54Tex; + +#define dgMsgKanji8C55Tex "__OTR__textures/kanji/gMsgKanji8C55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C55Tex[] = dgMsgKanji8C55Tex; + +#define dgMsgKanji8C56Tex "__OTR__textures/kanji/gMsgKanji8C56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C56Tex[] = dgMsgKanji8C56Tex; + +#define dgMsgKanji8C57Tex "__OTR__textures/kanji/gMsgKanji8C57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C57Tex[] = dgMsgKanji8C57Tex; + +#define dgMsgKanji8C58Tex "__OTR__textures/kanji/gMsgKanji8C58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C58Tex[] = dgMsgKanji8C58Tex; + +#define dgMsgKanji8C59Tex "__OTR__textures/kanji/gMsgKanji8C59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C59Tex[] = dgMsgKanji8C59Tex; + +#define dgMsgKanji8C5ATex "__OTR__textures/kanji/gMsgKanji8C5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C5ATex[] = dgMsgKanji8C5ATex; + +#define dgMsgKanji8C5BTex "__OTR__textures/kanji/gMsgKanji8C5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5BTex[] = dgMsgKanji8C5BTex; + +#define dgMsgKanji8C5CTex "__OTR__textures/kanji/gMsgKanji8C5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5CTex[] = dgMsgKanji8C5CTex; + +#define dgMsgKanji8C5DTex "__OTR__textures/kanji/gMsgKanji8C5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5DTex[] = dgMsgKanji8C5DTex; + +#define dgMsgKanji8C5ETex "__OTR__textures/kanji/gMsgKanji8C5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C5ETex[] = dgMsgKanji8C5ETex; + +#define dgMsgKanji8C5FTex "__OTR__textures/kanji/gMsgKanji8C5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C5FTex[] = dgMsgKanji8C5FTex; + +#define dgMsgKanji8C60Tex "__OTR__textures/kanji/gMsgKanji8C60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C60Tex[] = dgMsgKanji8C60Tex; + +#define dgMsgKanji8C61Tex "__OTR__textures/kanji/gMsgKanji8C61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C61Tex[] = dgMsgKanji8C61Tex; + +#define dgMsgKanji8C62Tex "__OTR__textures/kanji/gMsgKanji8C62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C62Tex[] = dgMsgKanji8C62Tex; + +#define dgMsgKanji8C63Tex "__OTR__textures/kanji/gMsgKanji8C63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C63Tex[] = dgMsgKanji8C63Tex; + +#define dgMsgKanji8C64Tex "__OTR__textures/kanji/gMsgKanji8C64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C64Tex[] = dgMsgKanji8C64Tex; + +#define dgMsgKanji8C65Tex "__OTR__textures/kanji/gMsgKanji8C65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C65Tex[] = dgMsgKanji8C65Tex; + +#define dgMsgKanji8C66Tex "__OTR__textures/kanji/gMsgKanji8C66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C66Tex[] = dgMsgKanji8C66Tex; + +#define dgMsgKanji8C67Tex "__OTR__textures/kanji/gMsgKanji8C67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C67Tex[] = dgMsgKanji8C67Tex; + +#define dgMsgKanji8C68Tex "__OTR__textures/kanji/gMsgKanji8C68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C68Tex[] = dgMsgKanji8C68Tex; + +#define dgMsgKanji8C69Tex "__OTR__textures/kanji/gMsgKanji8C69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C69Tex[] = dgMsgKanji8C69Tex; + +#define dgMsgKanji8C6ATex "__OTR__textures/kanji/gMsgKanji8C6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C6ATex[] = dgMsgKanji8C6ATex; + +#define dgMsgKanji8C6BTex "__OTR__textures/kanji/gMsgKanji8C6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6BTex[] = dgMsgKanji8C6BTex; + +#define dgMsgKanji8C6CTex "__OTR__textures/kanji/gMsgKanji8C6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6CTex[] = dgMsgKanji8C6CTex; + +#define dgMsgKanji8C6DTex "__OTR__textures/kanji/gMsgKanji8C6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6DTex[] = dgMsgKanji8C6DTex; + +#define dgMsgKanji8C6ETex "__OTR__textures/kanji/gMsgKanji8C6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C6ETex[] = dgMsgKanji8C6ETex; + +#define dgMsgKanji8C6FTex "__OTR__textures/kanji/gMsgKanji8C6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C6FTex[] = dgMsgKanji8C6FTex; + +#define dgMsgKanji8C70Tex "__OTR__textures/kanji/gMsgKanji8C70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C70Tex[] = dgMsgKanji8C70Tex; + +#define dgMsgKanji8C71Tex "__OTR__textures/kanji/gMsgKanji8C71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C71Tex[] = dgMsgKanji8C71Tex; + +#define dgMsgKanji8C72Tex "__OTR__textures/kanji/gMsgKanji8C72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C72Tex[] = dgMsgKanji8C72Tex; + +#define dgMsgKanji8C73Tex "__OTR__textures/kanji/gMsgKanji8C73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C73Tex[] = dgMsgKanji8C73Tex; + +#define dgMsgKanji8C74Tex "__OTR__textures/kanji/gMsgKanji8C74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C74Tex[] = dgMsgKanji8C74Tex; + +#define dgMsgKanji8C75Tex "__OTR__textures/kanji/gMsgKanji8C75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C75Tex[] = dgMsgKanji8C75Tex; + +#define dgMsgKanji8C76Tex "__OTR__textures/kanji/gMsgKanji8C76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C76Tex[] = dgMsgKanji8C76Tex; + +#define dgMsgKanji8C77Tex "__OTR__textures/kanji/gMsgKanji8C77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C77Tex[] = dgMsgKanji8C77Tex; + +#define dgMsgKanji8C78Tex "__OTR__textures/kanji/gMsgKanji8C78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C78Tex[] = dgMsgKanji8C78Tex; + +#define dgMsgKanji8C79Tex "__OTR__textures/kanji/gMsgKanji8C79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C79Tex[] = dgMsgKanji8C79Tex; + +#define dgMsgKanji8C7ATex "__OTR__textures/kanji/gMsgKanji8C7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C7ATex[] = dgMsgKanji8C7ATex; + +#define dgMsgKanji8C7BTex "__OTR__textures/kanji/gMsgKanji8C7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C7BTex[] = dgMsgKanji8C7BTex; + +#define dgMsgKanji8C7CTex "__OTR__textures/kanji/gMsgKanji8C7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C7CTex[] = dgMsgKanji8C7CTex; + +#define dgMsgKanji8C7DTex "__OTR__textures/kanji/gMsgKanji8C7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C7DTex[] = dgMsgKanji8C7DTex; + +#define dgMsgKanji8C7ETex "__OTR__textures/kanji/gMsgKanji8C7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C7ETex[] = dgMsgKanji8C7ETex; + +#define dgMsgKanji8C80Tex "__OTR__textures/kanji/gMsgKanji8C80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C80Tex[] = dgMsgKanji8C80Tex; + +#define dgMsgKanji8C81Tex "__OTR__textures/kanji/gMsgKanji8C81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C81Tex[] = dgMsgKanji8C81Tex; + +#define dgMsgKanji8C82Tex "__OTR__textures/kanji/gMsgKanji8C82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C82Tex[] = dgMsgKanji8C82Tex; + +#define dgMsgKanji8C83Tex "__OTR__textures/kanji/gMsgKanji8C83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C83Tex[] = dgMsgKanji8C83Tex; + +#define dgMsgKanji8C84Tex "__OTR__textures/kanji/gMsgKanji8C84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C84Tex[] = dgMsgKanji8C84Tex; + +#define dgMsgKanji8C85Tex "__OTR__textures/kanji/gMsgKanji8C85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C85Tex[] = dgMsgKanji8C85Tex; + +#define dgMsgKanji8C86Tex "__OTR__textures/kanji/gMsgKanji8C86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C86Tex[] = dgMsgKanji8C86Tex; + +#define dgMsgKanji8C87Tex "__OTR__textures/kanji/gMsgKanji8C87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C87Tex[] = dgMsgKanji8C87Tex; + +#define dgMsgKanji8C88Tex "__OTR__textures/kanji/gMsgKanji8C88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C88Tex[] = dgMsgKanji8C88Tex; + +#define dgMsgKanji8C89Tex "__OTR__textures/kanji/gMsgKanji8C89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C89Tex[] = dgMsgKanji8C89Tex; + +#define dgMsgKanji8C8ATex "__OTR__textures/kanji/gMsgKanji8C8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C8ATex[] = dgMsgKanji8C8ATex; + +#define dgMsgKanji8C8BTex "__OTR__textures/kanji/gMsgKanji8C8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8BTex[] = dgMsgKanji8C8BTex; + +#define dgMsgKanji8C8CTex "__OTR__textures/kanji/gMsgKanji8C8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8CTex[] = dgMsgKanji8C8CTex; + +#define dgMsgKanji8C8DTex "__OTR__textures/kanji/gMsgKanji8C8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8DTex[] = dgMsgKanji8C8DTex; + +#define dgMsgKanji8C8ETex "__OTR__textures/kanji/gMsgKanji8C8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C8ETex[] = dgMsgKanji8C8ETex; + +#define dgMsgKanji8C8FTex "__OTR__textures/kanji/gMsgKanji8C8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C8FTex[] = dgMsgKanji8C8FTex; + +#define dgMsgKanji8C90Tex "__OTR__textures/kanji/gMsgKanji8C90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C90Tex[] = dgMsgKanji8C90Tex; + +#define dgMsgKanji8C91Tex "__OTR__textures/kanji/gMsgKanji8C91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C91Tex[] = dgMsgKanji8C91Tex; + +#define dgMsgKanji8C92Tex "__OTR__textures/kanji/gMsgKanji8C92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C92Tex[] = dgMsgKanji8C92Tex; + +#define dgMsgKanji8C93Tex "__OTR__textures/kanji/gMsgKanji8C93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C93Tex[] = dgMsgKanji8C93Tex; + +#define dgMsgKanji8C94Tex "__OTR__textures/kanji/gMsgKanji8C94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C94Tex[] = dgMsgKanji8C94Tex; + +#define dgMsgKanji8C95Tex "__OTR__textures/kanji/gMsgKanji8C95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C95Tex[] = dgMsgKanji8C95Tex; + +#define dgMsgKanji8C96Tex "__OTR__textures/kanji/gMsgKanji8C96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C96Tex[] = dgMsgKanji8C96Tex; + +#define dgMsgKanji8C97Tex "__OTR__textures/kanji/gMsgKanji8C97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C97Tex[] = dgMsgKanji8C97Tex; + +#define dgMsgKanji8C98Tex "__OTR__textures/kanji/gMsgKanji8C98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C98Tex[] = dgMsgKanji8C98Tex; + +#define dgMsgKanji8C99Tex "__OTR__textures/kanji/gMsgKanji8C99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8C99Tex[] = dgMsgKanji8C99Tex; + +#define dgMsgKanji8C9ATex "__OTR__textures/kanji/gMsgKanji8C9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8C9ATex[] = dgMsgKanji8C9ATex; + +#define dgMsgKanji8C9BTex "__OTR__textures/kanji/gMsgKanji8C9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9BTex[] = dgMsgKanji8C9BTex; + +#define dgMsgKanji8C9CTex "__OTR__textures/kanji/gMsgKanji8C9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9CTex[] = dgMsgKanji8C9CTex; + +#define dgMsgKanji8C9DTex "__OTR__textures/kanji/gMsgKanji8C9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9DTex[] = dgMsgKanji8C9DTex; + +#define dgMsgKanji8C9ETex "__OTR__textures/kanji/gMsgKanji8C9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8C9ETex[] = dgMsgKanji8C9ETex; + +#define dgMsgKanji8C9FTex "__OTR__textures/kanji/gMsgKanji8C9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8C9FTex[] = dgMsgKanji8C9FTex; + +#define dgMsgKanji8CA0Tex "__OTR__textures/kanji/gMsgKanji8CA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA0Tex[] = dgMsgKanji8CA0Tex; + +#define dgMsgKanji8CA1Tex "__OTR__textures/kanji/gMsgKanji8CA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA1Tex[] = dgMsgKanji8CA1Tex; + +#define dgMsgKanji8CA2Tex "__OTR__textures/kanji/gMsgKanji8CA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA2Tex[] = dgMsgKanji8CA2Tex; + +#define dgMsgKanji8CA3Tex "__OTR__textures/kanji/gMsgKanji8CA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA3Tex[] = dgMsgKanji8CA3Tex; + +#define dgMsgKanji8CA4Tex "__OTR__textures/kanji/gMsgKanji8CA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA4Tex[] = dgMsgKanji8CA4Tex; + +#define dgMsgKanji8CA5Tex "__OTR__textures/kanji/gMsgKanji8CA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA5Tex[] = dgMsgKanji8CA5Tex; + +#define dgMsgKanji8CA6Tex "__OTR__textures/kanji/gMsgKanji8CA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA6Tex[] = dgMsgKanji8CA6Tex; + +#define dgMsgKanji8CA7Tex "__OTR__textures/kanji/gMsgKanji8CA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA7Tex[] = dgMsgKanji8CA7Tex; + +#define dgMsgKanji8CA8Tex "__OTR__textures/kanji/gMsgKanji8CA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA8Tex[] = dgMsgKanji8CA8Tex; + +#define dgMsgKanji8CA9Tex "__OTR__textures/kanji/gMsgKanji8CA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CA9Tex[] = dgMsgKanji8CA9Tex; + +#define dgMsgKanji8CAATex "__OTR__textures/kanji/gMsgKanji8CAATex" +static const ALIGN_ASSET(2) char gMsgKanji8CAATex[] = dgMsgKanji8CAATex; + +#define dgMsgKanji8CABTex "__OTR__textures/kanji/gMsgKanji8CABTex" +static const ALIGN_ASSET(2) char gMsgKanji8CABTex[] = dgMsgKanji8CABTex; + +#define dgMsgKanji8CACTex "__OTR__textures/kanji/gMsgKanji8CACTex" +static const ALIGN_ASSET(2) char gMsgKanji8CACTex[] = dgMsgKanji8CACTex; + +#define dgMsgKanji8CADTex "__OTR__textures/kanji/gMsgKanji8CADTex" +static const ALIGN_ASSET(2) char gMsgKanji8CADTex[] = dgMsgKanji8CADTex; + +#define dgMsgKanji8CAETex "__OTR__textures/kanji/gMsgKanji8CAETex" +static const ALIGN_ASSET(2) char gMsgKanji8CAETex[] = dgMsgKanji8CAETex; + +#define dgMsgKanji8CAFTex "__OTR__textures/kanji/gMsgKanji8CAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CAFTex[] = dgMsgKanji8CAFTex; + +#define dgMsgKanji8CB0Tex "__OTR__textures/kanji/gMsgKanji8CB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB0Tex[] = dgMsgKanji8CB0Tex; + +#define dgMsgKanji8CB1Tex "__OTR__textures/kanji/gMsgKanji8CB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB1Tex[] = dgMsgKanji8CB1Tex; + +#define dgMsgKanji8CB2Tex "__OTR__textures/kanji/gMsgKanji8CB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB2Tex[] = dgMsgKanji8CB2Tex; + +#define dgMsgKanji8CB3Tex "__OTR__textures/kanji/gMsgKanji8CB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB3Tex[] = dgMsgKanji8CB3Tex; + +#define dgMsgKanji8CB4Tex "__OTR__textures/kanji/gMsgKanji8CB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB4Tex[] = dgMsgKanji8CB4Tex; + +#define dgMsgKanji8CB5Tex "__OTR__textures/kanji/gMsgKanji8CB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB5Tex[] = dgMsgKanji8CB5Tex; + +#define dgMsgKanji8CB6Tex "__OTR__textures/kanji/gMsgKanji8CB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB6Tex[] = dgMsgKanji8CB6Tex; + +#define dgMsgKanji8CB7Tex "__OTR__textures/kanji/gMsgKanji8CB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB7Tex[] = dgMsgKanji8CB7Tex; + +#define dgMsgKanji8CB8Tex "__OTR__textures/kanji/gMsgKanji8CB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB8Tex[] = dgMsgKanji8CB8Tex; + +#define dgMsgKanji8CB9Tex "__OTR__textures/kanji/gMsgKanji8CB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CB9Tex[] = dgMsgKanji8CB9Tex; + +#define dgMsgKanji8CBATex "__OTR__textures/kanji/gMsgKanji8CBATex" +static const ALIGN_ASSET(2) char gMsgKanji8CBATex[] = dgMsgKanji8CBATex; + +#define dgMsgKanji8CBBTex "__OTR__textures/kanji/gMsgKanji8CBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBBTex[] = dgMsgKanji8CBBTex; + +#define dgMsgKanji8CBCTex "__OTR__textures/kanji/gMsgKanji8CBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBCTex[] = dgMsgKanji8CBCTex; + +#define dgMsgKanji8CBDTex "__OTR__textures/kanji/gMsgKanji8CBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBDTex[] = dgMsgKanji8CBDTex; + +#define dgMsgKanji8CBETex "__OTR__textures/kanji/gMsgKanji8CBETex" +static const ALIGN_ASSET(2) char gMsgKanji8CBETex[] = dgMsgKanji8CBETex; + +#define dgMsgKanji8CBFTex "__OTR__textures/kanji/gMsgKanji8CBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CBFTex[] = dgMsgKanji8CBFTex; + +#define dgMsgKanji8CC0Tex "__OTR__textures/kanji/gMsgKanji8CC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC0Tex[] = dgMsgKanji8CC0Tex; + +#define dgMsgKanji8CC1Tex "__OTR__textures/kanji/gMsgKanji8CC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC1Tex[] = dgMsgKanji8CC1Tex; + +#define dgMsgKanji8CC2Tex "__OTR__textures/kanji/gMsgKanji8CC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC2Tex[] = dgMsgKanji8CC2Tex; + +#define dgMsgKanji8CC3Tex "__OTR__textures/kanji/gMsgKanji8CC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC3Tex[] = dgMsgKanji8CC3Tex; + +#define dgMsgKanji8CC4Tex "__OTR__textures/kanji/gMsgKanji8CC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC4Tex[] = dgMsgKanji8CC4Tex; + +#define dgMsgKanji8CC5Tex "__OTR__textures/kanji/gMsgKanji8CC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC5Tex[] = dgMsgKanji8CC5Tex; + +#define dgMsgKanji8CC6Tex "__OTR__textures/kanji/gMsgKanji8CC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC6Tex[] = dgMsgKanji8CC6Tex; + +#define dgMsgKanji8CC7Tex "__OTR__textures/kanji/gMsgKanji8CC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC7Tex[] = dgMsgKanji8CC7Tex; + +#define dgMsgKanji8CC8Tex "__OTR__textures/kanji/gMsgKanji8CC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC8Tex[] = dgMsgKanji8CC8Tex; + +#define dgMsgKanji8CC9Tex "__OTR__textures/kanji/gMsgKanji8CC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CC9Tex[] = dgMsgKanji8CC9Tex; + +#define dgMsgKanji8CCATex "__OTR__textures/kanji/gMsgKanji8CCATex" +static const ALIGN_ASSET(2) char gMsgKanji8CCATex[] = dgMsgKanji8CCATex; + +#define dgMsgKanji8CCBTex "__OTR__textures/kanji/gMsgKanji8CCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCBTex[] = dgMsgKanji8CCBTex; + +#define dgMsgKanji8CCCTex "__OTR__textures/kanji/gMsgKanji8CCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCCTex[] = dgMsgKanji8CCCTex; + +#define dgMsgKanji8CCDTex "__OTR__textures/kanji/gMsgKanji8CCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCDTex[] = dgMsgKanji8CCDTex; + +#define dgMsgKanji8CCETex "__OTR__textures/kanji/gMsgKanji8CCETex" +static const ALIGN_ASSET(2) char gMsgKanji8CCETex[] = dgMsgKanji8CCETex; + +#define dgMsgKanji8CCFTex "__OTR__textures/kanji/gMsgKanji8CCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CCFTex[] = dgMsgKanji8CCFTex; + +#define dgMsgKanji8CD0Tex "__OTR__textures/kanji/gMsgKanji8CD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD0Tex[] = dgMsgKanji8CD0Tex; + +#define dgMsgKanji8CD1Tex "__OTR__textures/kanji/gMsgKanji8CD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD1Tex[] = dgMsgKanji8CD1Tex; + +#define dgMsgKanji8CD2Tex "__OTR__textures/kanji/gMsgKanji8CD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD2Tex[] = dgMsgKanji8CD2Tex; + +#define dgMsgKanji8CD3Tex "__OTR__textures/kanji/gMsgKanji8CD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD3Tex[] = dgMsgKanji8CD3Tex; + +#define dgMsgKanji8CD4Tex "__OTR__textures/kanji/gMsgKanji8CD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD4Tex[] = dgMsgKanji8CD4Tex; + +#define dgMsgKanji8CD5Tex "__OTR__textures/kanji/gMsgKanji8CD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD5Tex[] = dgMsgKanji8CD5Tex; + +#define dgMsgKanji8CD6Tex "__OTR__textures/kanji/gMsgKanji8CD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD6Tex[] = dgMsgKanji8CD6Tex; + +#define dgMsgKanji8CD7Tex "__OTR__textures/kanji/gMsgKanji8CD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD7Tex[] = dgMsgKanji8CD7Tex; + +#define dgMsgKanji8CD8Tex "__OTR__textures/kanji/gMsgKanji8CD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD8Tex[] = dgMsgKanji8CD8Tex; + +#define dgMsgKanji8CD9Tex "__OTR__textures/kanji/gMsgKanji8CD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CD9Tex[] = dgMsgKanji8CD9Tex; + +#define dgMsgKanji8CDATex "__OTR__textures/kanji/gMsgKanji8CDATex" +static const ALIGN_ASSET(2) char gMsgKanji8CDATex[] = dgMsgKanji8CDATex; + +#define dgMsgKanji8CDBTex "__OTR__textures/kanji/gMsgKanji8CDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDBTex[] = dgMsgKanji8CDBTex; + +#define dgMsgKanji8CDCTex "__OTR__textures/kanji/gMsgKanji8CDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDCTex[] = dgMsgKanji8CDCTex; + +#define dgMsgKanji8CDDTex "__OTR__textures/kanji/gMsgKanji8CDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDDTex[] = dgMsgKanji8CDDTex; + +#define dgMsgKanji8CDETex "__OTR__textures/kanji/gMsgKanji8CDETex" +static const ALIGN_ASSET(2) char gMsgKanji8CDETex[] = dgMsgKanji8CDETex; + +#define dgMsgKanji8CDFTex "__OTR__textures/kanji/gMsgKanji8CDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CDFTex[] = dgMsgKanji8CDFTex; + +#define dgMsgKanji8CE0Tex "__OTR__textures/kanji/gMsgKanji8CE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE0Tex[] = dgMsgKanji8CE0Tex; + +#define dgMsgKanji8CE1Tex "__OTR__textures/kanji/gMsgKanji8CE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE1Tex[] = dgMsgKanji8CE1Tex; + +#define dgMsgKanji8CE2Tex "__OTR__textures/kanji/gMsgKanji8CE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE2Tex[] = dgMsgKanji8CE2Tex; + +#define dgMsgKanji8CE3Tex "__OTR__textures/kanji/gMsgKanji8CE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE3Tex[] = dgMsgKanji8CE3Tex; + +#define dgMsgKanji8CE4Tex "__OTR__textures/kanji/gMsgKanji8CE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE4Tex[] = dgMsgKanji8CE4Tex; + +#define dgMsgKanji8CE5Tex "__OTR__textures/kanji/gMsgKanji8CE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE5Tex[] = dgMsgKanji8CE5Tex; + +#define dgMsgKanji8CE6Tex "__OTR__textures/kanji/gMsgKanji8CE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE6Tex[] = dgMsgKanji8CE6Tex; + +#define dgMsgKanji8CE7Tex "__OTR__textures/kanji/gMsgKanji8CE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE7Tex[] = dgMsgKanji8CE7Tex; + +#define dgMsgKanji8CE8Tex "__OTR__textures/kanji/gMsgKanji8CE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE8Tex[] = dgMsgKanji8CE8Tex; + +#define dgMsgKanji8CE9Tex "__OTR__textures/kanji/gMsgKanji8CE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CE9Tex[] = dgMsgKanji8CE9Tex; + +#define dgMsgKanji8CEATex "__OTR__textures/kanji/gMsgKanji8CEATex" +static const ALIGN_ASSET(2) char gMsgKanji8CEATex[] = dgMsgKanji8CEATex; + +#define dgMsgKanji8CEBTex "__OTR__textures/kanji/gMsgKanji8CEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CEBTex[] = dgMsgKanji8CEBTex; + +#define dgMsgKanji8CECTex "__OTR__textures/kanji/gMsgKanji8CECTex" +static const ALIGN_ASSET(2) char gMsgKanji8CECTex[] = dgMsgKanji8CECTex; + +#define dgMsgKanji8CEDTex "__OTR__textures/kanji/gMsgKanji8CEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8CEDTex[] = dgMsgKanji8CEDTex; + +#define dgMsgKanji8CEETex "__OTR__textures/kanji/gMsgKanji8CEETex" +static const ALIGN_ASSET(2) char gMsgKanji8CEETex[] = dgMsgKanji8CEETex; + +#define dgMsgKanji8CEFTex "__OTR__textures/kanji/gMsgKanji8CEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8CEFTex[] = dgMsgKanji8CEFTex; + +#define dgMsgKanji8CF0Tex "__OTR__textures/kanji/gMsgKanji8CF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF0Tex[] = dgMsgKanji8CF0Tex; + +#define dgMsgKanji8CF1Tex "__OTR__textures/kanji/gMsgKanji8CF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF1Tex[] = dgMsgKanji8CF1Tex; + +#define dgMsgKanji8CF2Tex "__OTR__textures/kanji/gMsgKanji8CF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF2Tex[] = dgMsgKanji8CF2Tex; + +#define dgMsgKanji8CF3Tex "__OTR__textures/kanji/gMsgKanji8CF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF3Tex[] = dgMsgKanji8CF3Tex; + +#define dgMsgKanji8CF4Tex "__OTR__textures/kanji/gMsgKanji8CF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF4Tex[] = dgMsgKanji8CF4Tex; + +#define dgMsgKanji8CF5Tex "__OTR__textures/kanji/gMsgKanji8CF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF5Tex[] = dgMsgKanji8CF5Tex; + +#define dgMsgKanji8CF6Tex "__OTR__textures/kanji/gMsgKanji8CF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF6Tex[] = dgMsgKanji8CF6Tex; + +#define dgMsgKanji8CF7Tex "__OTR__textures/kanji/gMsgKanji8CF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF7Tex[] = dgMsgKanji8CF7Tex; + +#define dgMsgKanji8CF8Tex "__OTR__textures/kanji/gMsgKanji8CF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF8Tex[] = dgMsgKanji8CF8Tex; + +#define dgMsgKanji8CF9Tex "__OTR__textures/kanji/gMsgKanji8CF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8CF9Tex[] = dgMsgKanji8CF9Tex; + +#define dgMsgKanji8CFATex "__OTR__textures/kanji/gMsgKanji8CFATex" +static const ALIGN_ASSET(2) char gMsgKanji8CFATex[] = dgMsgKanji8CFATex; + +#define dgMsgKanji8CFBTex "__OTR__textures/kanji/gMsgKanji8CFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8CFBTex[] = dgMsgKanji8CFBTex; + +#define dgMsgKanji8CFCTex "__OTR__textures/kanji/gMsgKanji8CFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8CFCTex[] = dgMsgKanji8CFCTex; + +#define dgMsgKanji8D40Tex "__OTR__textures/kanji/gMsgKanji8D40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D40Tex[] = dgMsgKanji8D40Tex; + +#define dgMsgKanji8D41Tex "__OTR__textures/kanji/gMsgKanji8D41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D41Tex[] = dgMsgKanji8D41Tex; + +#define dgMsgKanji8D42Tex "__OTR__textures/kanji/gMsgKanji8D42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D42Tex[] = dgMsgKanji8D42Tex; + +#define dgMsgKanji8D43Tex "__OTR__textures/kanji/gMsgKanji8D43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D43Tex[] = dgMsgKanji8D43Tex; + +#define dgMsgKanji8D44Tex "__OTR__textures/kanji/gMsgKanji8D44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D44Tex[] = dgMsgKanji8D44Tex; + +#define dgMsgKanji8D45Tex "__OTR__textures/kanji/gMsgKanji8D45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D45Tex[] = dgMsgKanji8D45Tex; + +#define dgMsgKanji8D46Tex "__OTR__textures/kanji/gMsgKanji8D46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D46Tex[] = dgMsgKanji8D46Tex; + +#define dgMsgKanji8D47Tex "__OTR__textures/kanji/gMsgKanji8D47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D47Tex[] = dgMsgKanji8D47Tex; + +#define dgMsgKanji8D48Tex "__OTR__textures/kanji/gMsgKanji8D48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D48Tex[] = dgMsgKanji8D48Tex; + +#define dgMsgKanji8D49Tex "__OTR__textures/kanji/gMsgKanji8D49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D49Tex[] = dgMsgKanji8D49Tex; + +#define dgMsgKanji8D4ATex "__OTR__textures/kanji/gMsgKanji8D4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D4ATex[] = dgMsgKanji8D4ATex; + +#define dgMsgKanji8D4BTex "__OTR__textures/kanji/gMsgKanji8D4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4BTex[] = dgMsgKanji8D4BTex; + +#define dgMsgKanji8D4CTex "__OTR__textures/kanji/gMsgKanji8D4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4CTex[] = dgMsgKanji8D4CTex; + +#define dgMsgKanji8D4DTex "__OTR__textures/kanji/gMsgKanji8D4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4DTex[] = dgMsgKanji8D4DTex; + +#define dgMsgKanji8D4ETex "__OTR__textures/kanji/gMsgKanji8D4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D4ETex[] = dgMsgKanji8D4ETex; + +#define dgMsgKanji8D4FTex "__OTR__textures/kanji/gMsgKanji8D4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D4FTex[] = dgMsgKanji8D4FTex; + +#define dgMsgKanji8D50Tex "__OTR__textures/kanji/gMsgKanji8D50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D50Tex[] = dgMsgKanji8D50Tex; + +#define dgMsgKanji8D51Tex "__OTR__textures/kanji/gMsgKanji8D51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D51Tex[] = dgMsgKanji8D51Tex; + +#define dgMsgKanji8D52Tex "__OTR__textures/kanji/gMsgKanji8D52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D52Tex[] = dgMsgKanji8D52Tex; + +#define dgMsgKanji8D53Tex "__OTR__textures/kanji/gMsgKanji8D53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D53Tex[] = dgMsgKanji8D53Tex; + +#define dgMsgKanji8D54Tex "__OTR__textures/kanji/gMsgKanji8D54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D54Tex[] = dgMsgKanji8D54Tex; + +#define dgMsgKanji8D55Tex "__OTR__textures/kanji/gMsgKanji8D55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D55Tex[] = dgMsgKanji8D55Tex; + +#define dgMsgKanji8D56Tex "__OTR__textures/kanji/gMsgKanji8D56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D56Tex[] = dgMsgKanji8D56Tex; + +#define dgMsgKanji8D57Tex "__OTR__textures/kanji/gMsgKanji8D57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D57Tex[] = dgMsgKanji8D57Tex; + +#define dgMsgKanji8D58Tex "__OTR__textures/kanji/gMsgKanji8D58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D58Tex[] = dgMsgKanji8D58Tex; + +#define dgMsgKanji8D59Tex "__OTR__textures/kanji/gMsgKanji8D59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D59Tex[] = dgMsgKanji8D59Tex; + +#define dgMsgKanji8D5ATex "__OTR__textures/kanji/gMsgKanji8D5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D5ATex[] = dgMsgKanji8D5ATex; + +#define dgMsgKanji8D5BTex "__OTR__textures/kanji/gMsgKanji8D5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5BTex[] = dgMsgKanji8D5BTex; + +#define dgMsgKanji8D5CTex "__OTR__textures/kanji/gMsgKanji8D5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5CTex[] = dgMsgKanji8D5CTex; + +#define dgMsgKanji8D5DTex "__OTR__textures/kanji/gMsgKanji8D5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5DTex[] = dgMsgKanji8D5DTex; + +#define dgMsgKanji8D5ETex "__OTR__textures/kanji/gMsgKanji8D5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D5ETex[] = dgMsgKanji8D5ETex; + +#define dgMsgKanji8D5FTex "__OTR__textures/kanji/gMsgKanji8D5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D5FTex[] = dgMsgKanji8D5FTex; + +#define dgMsgKanji8D60Tex "__OTR__textures/kanji/gMsgKanji8D60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D60Tex[] = dgMsgKanji8D60Tex; + +#define dgMsgKanji8D61Tex "__OTR__textures/kanji/gMsgKanji8D61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D61Tex[] = dgMsgKanji8D61Tex; + +#define dgMsgKanji8D62Tex "__OTR__textures/kanji/gMsgKanji8D62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D62Tex[] = dgMsgKanji8D62Tex; + +#define dgMsgKanji8D63Tex "__OTR__textures/kanji/gMsgKanji8D63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D63Tex[] = dgMsgKanji8D63Tex; + +#define dgMsgKanji8D64Tex "__OTR__textures/kanji/gMsgKanji8D64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D64Tex[] = dgMsgKanji8D64Tex; + +#define dgMsgKanji8D65Tex "__OTR__textures/kanji/gMsgKanji8D65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D65Tex[] = dgMsgKanji8D65Tex; + +#define dgMsgKanji8D66Tex "__OTR__textures/kanji/gMsgKanji8D66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D66Tex[] = dgMsgKanji8D66Tex; + +#define dgMsgKanji8D67Tex "__OTR__textures/kanji/gMsgKanji8D67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D67Tex[] = dgMsgKanji8D67Tex; + +#define dgMsgKanji8D68Tex "__OTR__textures/kanji/gMsgKanji8D68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D68Tex[] = dgMsgKanji8D68Tex; + +#define dgMsgKanji8D69Tex "__OTR__textures/kanji/gMsgKanji8D69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D69Tex[] = dgMsgKanji8D69Tex; + +#define dgMsgKanji8D6ATex "__OTR__textures/kanji/gMsgKanji8D6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D6ATex[] = dgMsgKanji8D6ATex; + +#define dgMsgKanji8D6BTex "__OTR__textures/kanji/gMsgKanji8D6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6BTex[] = dgMsgKanji8D6BTex; + +#define dgMsgKanji8D6CTex "__OTR__textures/kanji/gMsgKanji8D6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6CTex[] = dgMsgKanji8D6CTex; + +#define dgMsgKanji8D6DTex "__OTR__textures/kanji/gMsgKanji8D6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6DTex[] = dgMsgKanji8D6DTex; + +#define dgMsgKanji8D6ETex "__OTR__textures/kanji/gMsgKanji8D6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D6ETex[] = dgMsgKanji8D6ETex; + +#define dgMsgKanji8D6FTex "__OTR__textures/kanji/gMsgKanji8D6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D6FTex[] = dgMsgKanji8D6FTex; + +#define dgMsgKanji8D70Tex "__OTR__textures/kanji/gMsgKanji8D70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D70Tex[] = dgMsgKanji8D70Tex; + +#define dgMsgKanji8D71Tex "__OTR__textures/kanji/gMsgKanji8D71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D71Tex[] = dgMsgKanji8D71Tex; + +#define dgMsgKanji8D72Tex "__OTR__textures/kanji/gMsgKanji8D72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D72Tex[] = dgMsgKanji8D72Tex; + +#define dgMsgKanji8D73Tex "__OTR__textures/kanji/gMsgKanji8D73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D73Tex[] = dgMsgKanji8D73Tex; + +#define dgMsgKanji8D74Tex "__OTR__textures/kanji/gMsgKanji8D74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D74Tex[] = dgMsgKanji8D74Tex; + +#define dgMsgKanji8D75Tex "__OTR__textures/kanji/gMsgKanji8D75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D75Tex[] = dgMsgKanji8D75Tex; + +#define dgMsgKanji8D76Tex "__OTR__textures/kanji/gMsgKanji8D76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D76Tex[] = dgMsgKanji8D76Tex; + +#define dgMsgKanji8D77Tex "__OTR__textures/kanji/gMsgKanji8D77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D77Tex[] = dgMsgKanji8D77Tex; + +#define dgMsgKanji8D78Tex "__OTR__textures/kanji/gMsgKanji8D78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D78Tex[] = dgMsgKanji8D78Tex; + +#define dgMsgKanji8D79Tex "__OTR__textures/kanji/gMsgKanji8D79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D79Tex[] = dgMsgKanji8D79Tex; + +#define dgMsgKanji8D7ATex "__OTR__textures/kanji/gMsgKanji8D7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D7ATex[] = dgMsgKanji8D7ATex; + +#define dgMsgKanji8D7BTex "__OTR__textures/kanji/gMsgKanji8D7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D7BTex[] = dgMsgKanji8D7BTex; + +#define dgMsgKanji8D7CTex "__OTR__textures/kanji/gMsgKanji8D7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D7CTex[] = dgMsgKanji8D7CTex; + +#define dgMsgKanji8D7DTex "__OTR__textures/kanji/gMsgKanji8D7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D7DTex[] = dgMsgKanji8D7DTex; + +#define dgMsgKanji8D7ETex "__OTR__textures/kanji/gMsgKanji8D7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D7ETex[] = dgMsgKanji8D7ETex; + +#define dgMsgKanji8D80Tex "__OTR__textures/kanji/gMsgKanji8D80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D80Tex[] = dgMsgKanji8D80Tex; + +#define dgMsgKanji8D81Tex "__OTR__textures/kanji/gMsgKanji8D81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D81Tex[] = dgMsgKanji8D81Tex; + +#define dgMsgKanji8D82Tex "__OTR__textures/kanji/gMsgKanji8D82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D82Tex[] = dgMsgKanji8D82Tex; + +#define dgMsgKanji8D83Tex "__OTR__textures/kanji/gMsgKanji8D83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D83Tex[] = dgMsgKanji8D83Tex; + +#define dgMsgKanji8D84Tex "__OTR__textures/kanji/gMsgKanji8D84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D84Tex[] = dgMsgKanji8D84Tex; + +#define dgMsgKanji8D85Tex "__OTR__textures/kanji/gMsgKanji8D85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D85Tex[] = dgMsgKanji8D85Tex; + +#define dgMsgKanji8D86Tex "__OTR__textures/kanji/gMsgKanji8D86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D86Tex[] = dgMsgKanji8D86Tex; + +#define dgMsgKanji8D87Tex "__OTR__textures/kanji/gMsgKanji8D87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D87Tex[] = dgMsgKanji8D87Tex; + +#define dgMsgKanji8D88Tex "__OTR__textures/kanji/gMsgKanji8D88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D88Tex[] = dgMsgKanji8D88Tex; + +#define dgMsgKanji8D89Tex "__OTR__textures/kanji/gMsgKanji8D89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D89Tex[] = dgMsgKanji8D89Tex; + +#define dgMsgKanji8D8ATex "__OTR__textures/kanji/gMsgKanji8D8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D8ATex[] = dgMsgKanji8D8ATex; + +#define dgMsgKanji8D8BTex "__OTR__textures/kanji/gMsgKanji8D8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8BTex[] = dgMsgKanji8D8BTex; + +#define dgMsgKanji8D8CTex "__OTR__textures/kanji/gMsgKanji8D8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8CTex[] = dgMsgKanji8D8CTex; + +#define dgMsgKanji8D8DTex "__OTR__textures/kanji/gMsgKanji8D8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8DTex[] = dgMsgKanji8D8DTex; + +#define dgMsgKanji8D8ETex "__OTR__textures/kanji/gMsgKanji8D8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D8ETex[] = dgMsgKanji8D8ETex; + +#define dgMsgKanji8D8FTex "__OTR__textures/kanji/gMsgKanji8D8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D8FTex[] = dgMsgKanji8D8FTex; + +#define dgMsgKanji8D90Tex "__OTR__textures/kanji/gMsgKanji8D90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D90Tex[] = dgMsgKanji8D90Tex; + +#define dgMsgKanji8D91Tex "__OTR__textures/kanji/gMsgKanji8D91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D91Tex[] = dgMsgKanji8D91Tex; + +#define dgMsgKanji8D92Tex "__OTR__textures/kanji/gMsgKanji8D92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D92Tex[] = dgMsgKanji8D92Tex; + +#define dgMsgKanji8D93Tex "__OTR__textures/kanji/gMsgKanji8D93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D93Tex[] = dgMsgKanji8D93Tex; + +#define dgMsgKanji8D94Tex "__OTR__textures/kanji/gMsgKanji8D94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D94Tex[] = dgMsgKanji8D94Tex; + +#define dgMsgKanji8D95Tex "__OTR__textures/kanji/gMsgKanji8D95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D95Tex[] = dgMsgKanji8D95Tex; + +#define dgMsgKanji8D96Tex "__OTR__textures/kanji/gMsgKanji8D96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D96Tex[] = dgMsgKanji8D96Tex; + +#define dgMsgKanji8D97Tex "__OTR__textures/kanji/gMsgKanji8D97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D97Tex[] = dgMsgKanji8D97Tex; + +#define dgMsgKanji8D98Tex "__OTR__textures/kanji/gMsgKanji8D98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D98Tex[] = dgMsgKanji8D98Tex; + +#define dgMsgKanji8D99Tex "__OTR__textures/kanji/gMsgKanji8D99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8D99Tex[] = dgMsgKanji8D99Tex; + +#define dgMsgKanji8D9ATex "__OTR__textures/kanji/gMsgKanji8D9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8D9ATex[] = dgMsgKanji8D9ATex; + +#define dgMsgKanji8D9BTex "__OTR__textures/kanji/gMsgKanji8D9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9BTex[] = dgMsgKanji8D9BTex; + +#define dgMsgKanji8D9CTex "__OTR__textures/kanji/gMsgKanji8D9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9CTex[] = dgMsgKanji8D9CTex; + +#define dgMsgKanji8D9DTex "__OTR__textures/kanji/gMsgKanji8D9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9DTex[] = dgMsgKanji8D9DTex; + +#define dgMsgKanji8D9ETex "__OTR__textures/kanji/gMsgKanji8D9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8D9ETex[] = dgMsgKanji8D9ETex; + +#define dgMsgKanji8D9FTex "__OTR__textures/kanji/gMsgKanji8D9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8D9FTex[] = dgMsgKanji8D9FTex; + +#define dgMsgKanji8DA0Tex "__OTR__textures/kanji/gMsgKanji8DA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA0Tex[] = dgMsgKanji8DA0Tex; + +#define dgMsgKanji8DA1Tex "__OTR__textures/kanji/gMsgKanji8DA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA1Tex[] = dgMsgKanji8DA1Tex; + +#define dgMsgKanji8DA2Tex "__OTR__textures/kanji/gMsgKanji8DA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA2Tex[] = dgMsgKanji8DA2Tex; + +#define dgMsgKanji8DA3Tex "__OTR__textures/kanji/gMsgKanji8DA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA3Tex[] = dgMsgKanji8DA3Tex; + +#define dgMsgKanji8DA4Tex "__OTR__textures/kanji/gMsgKanji8DA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA4Tex[] = dgMsgKanji8DA4Tex; + +#define dgMsgKanji8DA5Tex "__OTR__textures/kanji/gMsgKanji8DA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA5Tex[] = dgMsgKanji8DA5Tex; + +#define dgMsgKanji8DA6Tex "__OTR__textures/kanji/gMsgKanji8DA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA6Tex[] = dgMsgKanji8DA6Tex; + +#define dgMsgKanji8DA7Tex "__OTR__textures/kanji/gMsgKanji8DA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA7Tex[] = dgMsgKanji8DA7Tex; + +#define dgMsgKanji8DA8Tex "__OTR__textures/kanji/gMsgKanji8DA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA8Tex[] = dgMsgKanji8DA8Tex; + +#define dgMsgKanji8DA9Tex "__OTR__textures/kanji/gMsgKanji8DA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DA9Tex[] = dgMsgKanji8DA9Tex; + +#define dgMsgKanji8DAATex "__OTR__textures/kanji/gMsgKanji8DAATex" +static const ALIGN_ASSET(2) char gMsgKanji8DAATex[] = dgMsgKanji8DAATex; + +#define dgMsgKanji8DABTex "__OTR__textures/kanji/gMsgKanji8DABTex" +static const ALIGN_ASSET(2) char gMsgKanji8DABTex[] = dgMsgKanji8DABTex; + +#define dgMsgKanji8DACTex "__OTR__textures/kanji/gMsgKanji8DACTex" +static const ALIGN_ASSET(2) char gMsgKanji8DACTex[] = dgMsgKanji8DACTex; + +#define dgMsgKanji8DADTex "__OTR__textures/kanji/gMsgKanji8DADTex" +static const ALIGN_ASSET(2) char gMsgKanji8DADTex[] = dgMsgKanji8DADTex; + +#define dgMsgKanji8DAETex "__OTR__textures/kanji/gMsgKanji8DAETex" +static const ALIGN_ASSET(2) char gMsgKanji8DAETex[] = dgMsgKanji8DAETex; + +#define dgMsgKanji8DAFTex "__OTR__textures/kanji/gMsgKanji8DAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DAFTex[] = dgMsgKanji8DAFTex; + +#define dgMsgKanji8DB0Tex "__OTR__textures/kanji/gMsgKanji8DB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB0Tex[] = dgMsgKanji8DB0Tex; + +#define dgMsgKanji8DB1Tex "__OTR__textures/kanji/gMsgKanji8DB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB1Tex[] = dgMsgKanji8DB1Tex; + +#define dgMsgKanji8DB2Tex "__OTR__textures/kanji/gMsgKanji8DB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB2Tex[] = dgMsgKanji8DB2Tex; + +#define dgMsgKanji8DB3Tex "__OTR__textures/kanji/gMsgKanji8DB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB3Tex[] = dgMsgKanji8DB3Tex; + +#define dgMsgKanji8DB4Tex "__OTR__textures/kanji/gMsgKanji8DB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB4Tex[] = dgMsgKanji8DB4Tex; + +#define dgMsgKanji8DB5Tex "__OTR__textures/kanji/gMsgKanji8DB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB5Tex[] = dgMsgKanji8DB5Tex; + +#define dgMsgKanji8DB6Tex "__OTR__textures/kanji/gMsgKanji8DB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB6Tex[] = dgMsgKanji8DB6Tex; + +#define dgMsgKanji8DB7Tex "__OTR__textures/kanji/gMsgKanji8DB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB7Tex[] = dgMsgKanji8DB7Tex; + +#define dgMsgKanji8DB8Tex "__OTR__textures/kanji/gMsgKanji8DB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB8Tex[] = dgMsgKanji8DB8Tex; + +#define dgMsgKanji8DB9Tex "__OTR__textures/kanji/gMsgKanji8DB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DB9Tex[] = dgMsgKanji8DB9Tex; + +#define dgMsgKanji8DBATex "__OTR__textures/kanji/gMsgKanji8DBATex" +static const ALIGN_ASSET(2) char gMsgKanji8DBATex[] = dgMsgKanji8DBATex; + +#define dgMsgKanji8DBBTex "__OTR__textures/kanji/gMsgKanji8DBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBBTex[] = dgMsgKanji8DBBTex; + +#define dgMsgKanji8DBCTex "__OTR__textures/kanji/gMsgKanji8DBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBCTex[] = dgMsgKanji8DBCTex; + +#define dgMsgKanji8DBDTex "__OTR__textures/kanji/gMsgKanji8DBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBDTex[] = dgMsgKanji8DBDTex; + +#define dgMsgKanji8DBETex "__OTR__textures/kanji/gMsgKanji8DBETex" +static const ALIGN_ASSET(2) char gMsgKanji8DBETex[] = dgMsgKanji8DBETex; + +#define dgMsgKanji8DBFTex "__OTR__textures/kanji/gMsgKanji8DBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DBFTex[] = dgMsgKanji8DBFTex; + +#define dgMsgKanji8DC0Tex "__OTR__textures/kanji/gMsgKanji8DC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC0Tex[] = dgMsgKanji8DC0Tex; + +#define dgMsgKanji8DC1Tex "__OTR__textures/kanji/gMsgKanji8DC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC1Tex[] = dgMsgKanji8DC1Tex; + +#define dgMsgKanji8DC2Tex "__OTR__textures/kanji/gMsgKanji8DC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC2Tex[] = dgMsgKanji8DC2Tex; + +#define dgMsgKanji8DC3Tex "__OTR__textures/kanji/gMsgKanji8DC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC3Tex[] = dgMsgKanji8DC3Tex; + +#define dgMsgKanji8DC4Tex "__OTR__textures/kanji/gMsgKanji8DC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC4Tex[] = dgMsgKanji8DC4Tex; + +#define dgMsgKanji8DC5Tex "__OTR__textures/kanji/gMsgKanji8DC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC5Tex[] = dgMsgKanji8DC5Tex; + +#define dgMsgKanji8DC6Tex "__OTR__textures/kanji/gMsgKanji8DC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC6Tex[] = dgMsgKanji8DC6Tex; + +#define dgMsgKanji8DC7Tex "__OTR__textures/kanji/gMsgKanji8DC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC7Tex[] = dgMsgKanji8DC7Tex; + +#define dgMsgKanji8DC8Tex "__OTR__textures/kanji/gMsgKanji8DC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC8Tex[] = dgMsgKanji8DC8Tex; + +#define dgMsgKanji8DC9Tex "__OTR__textures/kanji/gMsgKanji8DC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DC9Tex[] = dgMsgKanji8DC9Tex; + +#define dgMsgKanji8DCATex "__OTR__textures/kanji/gMsgKanji8DCATex" +static const ALIGN_ASSET(2) char gMsgKanji8DCATex[] = dgMsgKanji8DCATex; + +#define dgMsgKanji8DCBTex "__OTR__textures/kanji/gMsgKanji8DCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCBTex[] = dgMsgKanji8DCBTex; + +#define dgMsgKanji8DCCTex "__OTR__textures/kanji/gMsgKanji8DCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCCTex[] = dgMsgKanji8DCCTex; + +#define dgMsgKanji8DCDTex "__OTR__textures/kanji/gMsgKanji8DCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCDTex[] = dgMsgKanji8DCDTex; + +#define dgMsgKanji8DCETex "__OTR__textures/kanji/gMsgKanji8DCETex" +static const ALIGN_ASSET(2) char gMsgKanji8DCETex[] = dgMsgKanji8DCETex; + +#define dgMsgKanji8DCFTex "__OTR__textures/kanji/gMsgKanji8DCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DCFTex[] = dgMsgKanji8DCFTex; + +#define dgMsgKanji8DD0Tex "__OTR__textures/kanji/gMsgKanji8DD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD0Tex[] = dgMsgKanji8DD0Tex; + +#define dgMsgKanji8DD1Tex "__OTR__textures/kanji/gMsgKanji8DD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD1Tex[] = dgMsgKanji8DD1Tex; + +#define dgMsgKanji8DD2Tex "__OTR__textures/kanji/gMsgKanji8DD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD2Tex[] = dgMsgKanji8DD2Tex; + +#define dgMsgKanji8DD3Tex "__OTR__textures/kanji/gMsgKanji8DD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD3Tex[] = dgMsgKanji8DD3Tex; + +#define dgMsgKanji8DD4Tex "__OTR__textures/kanji/gMsgKanji8DD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD4Tex[] = dgMsgKanji8DD4Tex; + +#define dgMsgKanji8DD5Tex "__OTR__textures/kanji/gMsgKanji8DD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD5Tex[] = dgMsgKanji8DD5Tex; + +#define dgMsgKanji8DD6Tex "__OTR__textures/kanji/gMsgKanji8DD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD6Tex[] = dgMsgKanji8DD6Tex; + +#define dgMsgKanji8DD7Tex "__OTR__textures/kanji/gMsgKanji8DD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD7Tex[] = dgMsgKanji8DD7Tex; + +#define dgMsgKanji8DD8Tex "__OTR__textures/kanji/gMsgKanji8DD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD8Tex[] = dgMsgKanji8DD8Tex; + +#define dgMsgKanji8DD9Tex "__OTR__textures/kanji/gMsgKanji8DD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DD9Tex[] = dgMsgKanji8DD9Tex; + +#define dgMsgKanji8DDATex "__OTR__textures/kanji/gMsgKanji8DDATex" +static const ALIGN_ASSET(2) char gMsgKanji8DDATex[] = dgMsgKanji8DDATex; + +#define dgMsgKanji8DDBTex "__OTR__textures/kanji/gMsgKanji8DDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDBTex[] = dgMsgKanji8DDBTex; + +#define dgMsgKanji8DDCTex "__OTR__textures/kanji/gMsgKanji8DDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDCTex[] = dgMsgKanji8DDCTex; + +#define dgMsgKanji8DDDTex "__OTR__textures/kanji/gMsgKanji8DDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDDTex[] = dgMsgKanji8DDDTex; + +#define dgMsgKanji8DDETex "__OTR__textures/kanji/gMsgKanji8DDETex" +static const ALIGN_ASSET(2) char gMsgKanji8DDETex[] = dgMsgKanji8DDETex; + +#define dgMsgKanji8DDFTex "__OTR__textures/kanji/gMsgKanji8DDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DDFTex[] = dgMsgKanji8DDFTex; + +#define dgMsgKanji8DE0Tex "__OTR__textures/kanji/gMsgKanji8DE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE0Tex[] = dgMsgKanji8DE0Tex; + +#define dgMsgKanji8DE1Tex "__OTR__textures/kanji/gMsgKanji8DE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE1Tex[] = dgMsgKanji8DE1Tex; + +#define dgMsgKanji8DE2Tex "__OTR__textures/kanji/gMsgKanji8DE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE2Tex[] = dgMsgKanji8DE2Tex; + +#define dgMsgKanji8DE3Tex "__OTR__textures/kanji/gMsgKanji8DE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE3Tex[] = dgMsgKanji8DE3Tex; + +#define dgMsgKanji8DE4Tex "__OTR__textures/kanji/gMsgKanji8DE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE4Tex[] = dgMsgKanji8DE4Tex; + +#define dgMsgKanji8DE5Tex "__OTR__textures/kanji/gMsgKanji8DE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE5Tex[] = dgMsgKanji8DE5Tex; + +#define dgMsgKanji8DE6Tex "__OTR__textures/kanji/gMsgKanji8DE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE6Tex[] = dgMsgKanji8DE6Tex; + +#define dgMsgKanji8DE7Tex "__OTR__textures/kanji/gMsgKanji8DE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE7Tex[] = dgMsgKanji8DE7Tex; + +#define dgMsgKanji8DE8Tex "__OTR__textures/kanji/gMsgKanji8DE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE8Tex[] = dgMsgKanji8DE8Tex; + +#define dgMsgKanji8DE9Tex "__OTR__textures/kanji/gMsgKanji8DE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DE9Tex[] = dgMsgKanji8DE9Tex; + +#define dgMsgKanji8DEATex "__OTR__textures/kanji/gMsgKanji8DEATex" +static const ALIGN_ASSET(2) char gMsgKanji8DEATex[] = dgMsgKanji8DEATex; + +#define dgMsgKanji8DEBTex "__OTR__textures/kanji/gMsgKanji8DEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DEBTex[] = dgMsgKanji8DEBTex; + +#define dgMsgKanji8DECTex "__OTR__textures/kanji/gMsgKanji8DECTex" +static const ALIGN_ASSET(2) char gMsgKanji8DECTex[] = dgMsgKanji8DECTex; + +#define dgMsgKanji8DEDTex "__OTR__textures/kanji/gMsgKanji8DEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8DEDTex[] = dgMsgKanji8DEDTex; + +#define dgMsgKanji8DEETex "__OTR__textures/kanji/gMsgKanji8DEETex" +static const ALIGN_ASSET(2) char gMsgKanji8DEETex[] = dgMsgKanji8DEETex; + +#define dgMsgKanji8DEFTex "__OTR__textures/kanji/gMsgKanji8DEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8DEFTex[] = dgMsgKanji8DEFTex; + +#define dgMsgKanji8DF0Tex "__OTR__textures/kanji/gMsgKanji8DF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF0Tex[] = dgMsgKanji8DF0Tex; + +#define dgMsgKanji8DF1Tex "__OTR__textures/kanji/gMsgKanji8DF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF1Tex[] = dgMsgKanji8DF1Tex; + +#define dgMsgKanji8DF2Tex "__OTR__textures/kanji/gMsgKanji8DF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF2Tex[] = dgMsgKanji8DF2Tex; + +#define dgMsgKanji8DF3Tex "__OTR__textures/kanji/gMsgKanji8DF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF3Tex[] = dgMsgKanji8DF3Tex; + +#define dgMsgKanji8DF4Tex "__OTR__textures/kanji/gMsgKanji8DF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF4Tex[] = dgMsgKanji8DF4Tex; + +#define dgMsgKanji8DF5Tex "__OTR__textures/kanji/gMsgKanji8DF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF5Tex[] = dgMsgKanji8DF5Tex; + +#define dgMsgKanji8DF6Tex "__OTR__textures/kanji/gMsgKanji8DF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF6Tex[] = dgMsgKanji8DF6Tex; + +#define dgMsgKanji8DF7Tex "__OTR__textures/kanji/gMsgKanji8DF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF7Tex[] = dgMsgKanji8DF7Tex; + +#define dgMsgKanji8DF8Tex "__OTR__textures/kanji/gMsgKanji8DF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF8Tex[] = dgMsgKanji8DF8Tex; + +#define dgMsgKanji8DF9Tex "__OTR__textures/kanji/gMsgKanji8DF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8DF9Tex[] = dgMsgKanji8DF9Tex; + +#define dgMsgKanji8DFATex "__OTR__textures/kanji/gMsgKanji8DFATex" +static const ALIGN_ASSET(2) char gMsgKanji8DFATex[] = dgMsgKanji8DFATex; + +#define dgMsgKanji8DFBTex "__OTR__textures/kanji/gMsgKanji8DFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8DFBTex[] = dgMsgKanji8DFBTex; + +#define dgMsgKanji8DFCTex "__OTR__textures/kanji/gMsgKanji8DFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8DFCTex[] = dgMsgKanji8DFCTex; + +#define dgMsgKanji8E40Tex "__OTR__textures/kanji/gMsgKanji8E40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E40Tex[] = dgMsgKanji8E40Tex; + +#define dgMsgKanji8E41Tex "__OTR__textures/kanji/gMsgKanji8E41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E41Tex[] = dgMsgKanji8E41Tex; + +#define dgMsgKanji8E42Tex "__OTR__textures/kanji/gMsgKanji8E42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E42Tex[] = dgMsgKanji8E42Tex; + +#define dgMsgKanji8E43Tex "__OTR__textures/kanji/gMsgKanji8E43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E43Tex[] = dgMsgKanji8E43Tex; + +#define dgMsgKanji8E44Tex "__OTR__textures/kanji/gMsgKanji8E44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E44Tex[] = dgMsgKanji8E44Tex; + +#define dgMsgKanji8E45Tex "__OTR__textures/kanji/gMsgKanji8E45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E45Tex[] = dgMsgKanji8E45Tex; + +#define dgMsgKanji8E46Tex "__OTR__textures/kanji/gMsgKanji8E46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E46Tex[] = dgMsgKanji8E46Tex; + +#define dgMsgKanji8E47Tex "__OTR__textures/kanji/gMsgKanji8E47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E47Tex[] = dgMsgKanji8E47Tex; + +#define dgMsgKanji8E48Tex "__OTR__textures/kanji/gMsgKanji8E48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E48Tex[] = dgMsgKanji8E48Tex; + +#define dgMsgKanji8E49Tex "__OTR__textures/kanji/gMsgKanji8E49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E49Tex[] = dgMsgKanji8E49Tex; + +#define dgMsgKanji8E4ATex "__OTR__textures/kanji/gMsgKanji8E4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E4ATex[] = dgMsgKanji8E4ATex; + +#define dgMsgKanji8E4BTex "__OTR__textures/kanji/gMsgKanji8E4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4BTex[] = dgMsgKanji8E4BTex; + +#define dgMsgKanji8E4CTex "__OTR__textures/kanji/gMsgKanji8E4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4CTex[] = dgMsgKanji8E4CTex; + +#define dgMsgKanji8E4DTex "__OTR__textures/kanji/gMsgKanji8E4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4DTex[] = dgMsgKanji8E4DTex; + +#define dgMsgKanji8E4ETex "__OTR__textures/kanji/gMsgKanji8E4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E4ETex[] = dgMsgKanji8E4ETex; + +#define dgMsgKanji8E4FTex "__OTR__textures/kanji/gMsgKanji8E4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E4FTex[] = dgMsgKanji8E4FTex; + +#define dgMsgKanji8E50Tex "__OTR__textures/kanji/gMsgKanji8E50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E50Tex[] = dgMsgKanji8E50Tex; + +#define dgMsgKanji8E51Tex "__OTR__textures/kanji/gMsgKanji8E51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E51Tex[] = dgMsgKanji8E51Tex; + +#define dgMsgKanji8E52Tex "__OTR__textures/kanji/gMsgKanji8E52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E52Tex[] = dgMsgKanji8E52Tex; + +#define dgMsgKanji8E53Tex "__OTR__textures/kanji/gMsgKanji8E53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E53Tex[] = dgMsgKanji8E53Tex; + +#define dgMsgKanji8E54Tex "__OTR__textures/kanji/gMsgKanji8E54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E54Tex[] = dgMsgKanji8E54Tex; + +#define dgMsgKanji8E55Tex "__OTR__textures/kanji/gMsgKanji8E55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E55Tex[] = dgMsgKanji8E55Tex; + +#define dgMsgKanji8E56Tex "__OTR__textures/kanji/gMsgKanji8E56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E56Tex[] = dgMsgKanji8E56Tex; + +#define dgMsgKanji8E57Tex "__OTR__textures/kanji/gMsgKanji8E57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E57Tex[] = dgMsgKanji8E57Tex; + +#define dgMsgKanji8E58Tex "__OTR__textures/kanji/gMsgKanji8E58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E58Tex[] = dgMsgKanji8E58Tex; + +#define dgMsgKanji8E59Tex "__OTR__textures/kanji/gMsgKanji8E59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E59Tex[] = dgMsgKanji8E59Tex; + +#define dgMsgKanji8E5ATex "__OTR__textures/kanji/gMsgKanji8E5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E5ATex[] = dgMsgKanji8E5ATex; + +#define dgMsgKanji8E5BTex "__OTR__textures/kanji/gMsgKanji8E5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5BTex[] = dgMsgKanji8E5BTex; + +#define dgMsgKanji8E5CTex "__OTR__textures/kanji/gMsgKanji8E5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5CTex[] = dgMsgKanji8E5CTex; + +#define dgMsgKanji8E5DTex "__OTR__textures/kanji/gMsgKanji8E5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5DTex[] = dgMsgKanji8E5DTex; + +#define dgMsgKanji8E5ETex "__OTR__textures/kanji/gMsgKanji8E5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E5ETex[] = dgMsgKanji8E5ETex; + +#define dgMsgKanji8E5FTex "__OTR__textures/kanji/gMsgKanji8E5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E5FTex[] = dgMsgKanji8E5FTex; + +#define dgMsgKanji8E60Tex "__OTR__textures/kanji/gMsgKanji8E60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E60Tex[] = dgMsgKanji8E60Tex; + +#define dgMsgKanji8E61Tex "__OTR__textures/kanji/gMsgKanji8E61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E61Tex[] = dgMsgKanji8E61Tex; + +#define dgMsgKanji8E62Tex "__OTR__textures/kanji/gMsgKanji8E62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E62Tex[] = dgMsgKanji8E62Tex; + +#define dgMsgKanji8E63Tex "__OTR__textures/kanji/gMsgKanji8E63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E63Tex[] = dgMsgKanji8E63Tex; + +#define dgMsgKanji8E64Tex "__OTR__textures/kanji/gMsgKanji8E64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E64Tex[] = dgMsgKanji8E64Tex; + +#define dgMsgKanji8E65Tex "__OTR__textures/kanji/gMsgKanji8E65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E65Tex[] = dgMsgKanji8E65Tex; + +#define dgMsgKanji8E66Tex "__OTR__textures/kanji/gMsgKanji8E66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E66Tex[] = dgMsgKanji8E66Tex; + +#define dgMsgKanji8E67Tex "__OTR__textures/kanji/gMsgKanji8E67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E67Tex[] = dgMsgKanji8E67Tex; + +#define dgMsgKanji8E68Tex "__OTR__textures/kanji/gMsgKanji8E68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E68Tex[] = dgMsgKanji8E68Tex; + +#define dgMsgKanji8E69Tex "__OTR__textures/kanji/gMsgKanji8E69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E69Tex[] = dgMsgKanji8E69Tex; + +#define dgMsgKanji8E6ATex "__OTR__textures/kanji/gMsgKanji8E6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E6ATex[] = dgMsgKanji8E6ATex; + +#define dgMsgKanji8E6BTex "__OTR__textures/kanji/gMsgKanji8E6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6BTex[] = dgMsgKanji8E6BTex; + +#define dgMsgKanji8E6CTex "__OTR__textures/kanji/gMsgKanji8E6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6CTex[] = dgMsgKanji8E6CTex; + +#define dgMsgKanji8E6DTex "__OTR__textures/kanji/gMsgKanji8E6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6DTex[] = dgMsgKanji8E6DTex; + +#define dgMsgKanji8E6ETex "__OTR__textures/kanji/gMsgKanji8E6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E6ETex[] = dgMsgKanji8E6ETex; + +#define dgMsgKanji8E6FTex "__OTR__textures/kanji/gMsgKanji8E6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E6FTex[] = dgMsgKanji8E6FTex; + +#define dgMsgKanji8E70Tex "__OTR__textures/kanji/gMsgKanji8E70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E70Tex[] = dgMsgKanji8E70Tex; + +#define dgMsgKanji8E71Tex "__OTR__textures/kanji/gMsgKanji8E71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E71Tex[] = dgMsgKanji8E71Tex; + +#define dgMsgKanji8E72Tex "__OTR__textures/kanji/gMsgKanji8E72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E72Tex[] = dgMsgKanji8E72Tex; + +#define dgMsgKanji8E73Tex "__OTR__textures/kanji/gMsgKanji8E73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E73Tex[] = dgMsgKanji8E73Tex; + +#define dgMsgKanji8E74Tex "__OTR__textures/kanji/gMsgKanji8E74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E74Tex[] = dgMsgKanji8E74Tex; + +#define dgMsgKanji8E75Tex "__OTR__textures/kanji/gMsgKanji8E75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E75Tex[] = dgMsgKanji8E75Tex; + +#define dgMsgKanji8E76Tex "__OTR__textures/kanji/gMsgKanji8E76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E76Tex[] = dgMsgKanji8E76Tex; + +#define dgMsgKanji8E77Tex "__OTR__textures/kanji/gMsgKanji8E77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E77Tex[] = dgMsgKanji8E77Tex; + +#define dgMsgKanji8E78Tex "__OTR__textures/kanji/gMsgKanji8E78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E78Tex[] = dgMsgKanji8E78Tex; + +#define dgMsgKanji8E79Tex "__OTR__textures/kanji/gMsgKanji8E79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E79Tex[] = dgMsgKanji8E79Tex; + +#define dgMsgKanji8E7ATex "__OTR__textures/kanji/gMsgKanji8E7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E7ATex[] = dgMsgKanji8E7ATex; + +#define dgMsgKanji8E7BTex "__OTR__textures/kanji/gMsgKanji8E7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E7BTex[] = dgMsgKanji8E7BTex; + +#define dgMsgKanji8E7CTex "__OTR__textures/kanji/gMsgKanji8E7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E7CTex[] = dgMsgKanji8E7CTex; + +#define dgMsgKanji8E7DTex "__OTR__textures/kanji/gMsgKanji8E7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E7DTex[] = dgMsgKanji8E7DTex; + +#define dgMsgKanji8E7ETex "__OTR__textures/kanji/gMsgKanji8E7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E7ETex[] = dgMsgKanji8E7ETex; + +#define dgMsgKanji8E80Tex "__OTR__textures/kanji/gMsgKanji8E80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E80Tex[] = dgMsgKanji8E80Tex; + +#define dgMsgKanji8E81Tex "__OTR__textures/kanji/gMsgKanji8E81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E81Tex[] = dgMsgKanji8E81Tex; + +#define dgMsgKanji8E82Tex "__OTR__textures/kanji/gMsgKanji8E82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E82Tex[] = dgMsgKanji8E82Tex; + +#define dgMsgKanji8E83Tex "__OTR__textures/kanji/gMsgKanji8E83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E83Tex[] = dgMsgKanji8E83Tex; + +#define dgMsgKanji8E84Tex "__OTR__textures/kanji/gMsgKanji8E84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E84Tex[] = dgMsgKanji8E84Tex; + +#define dgMsgKanji8E85Tex "__OTR__textures/kanji/gMsgKanji8E85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E85Tex[] = dgMsgKanji8E85Tex; + +#define dgMsgKanji8E86Tex "__OTR__textures/kanji/gMsgKanji8E86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E86Tex[] = dgMsgKanji8E86Tex; + +#define dgMsgKanji8E87Tex "__OTR__textures/kanji/gMsgKanji8E87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E87Tex[] = dgMsgKanji8E87Tex; + +#define dgMsgKanji8E88Tex "__OTR__textures/kanji/gMsgKanji8E88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E88Tex[] = dgMsgKanji8E88Tex; + +#define dgMsgKanji8E89Tex "__OTR__textures/kanji/gMsgKanji8E89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E89Tex[] = dgMsgKanji8E89Tex; + +#define dgMsgKanji8E8ATex "__OTR__textures/kanji/gMsgKanji8E8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E8ATex[] = dgMsgKanji8E8ATex; + +#define dgMsgKanji8E8BTex "__OTR__textures/kanji/gMsgKanji8E8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8BTex[] = dgMsgKanji8E8BTex; + +#define dgMsgKanji8E8CTex "__OTR__textures/kanji/gMsgKanji8E8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8CTex[] = dgMsgKanji8E8CTex; + +#define dgMsgKanji8E8DTex "__OTR__textures/kanji/gMsgKanji8E8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8DTex[] = dgMsgKanji8E8DTex; + +#define dgMsgKanji8E8ETex "__OTR__textures/kanji/gMsgKanji8E8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E8ETex[] = dgMsgKanji8E8ETex; + +#define dgMsgKanji8E8FTex "__OTR__textures/kanji/gMsgKanji8E8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E8FTex[] = dgMsgKanji8E8FTex; + +#define dgMsgKanji8E90Tex "__OTR__textures/kanji/gMsgKanji8E90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E90Tex[] = dgMsgKanji8E90Tex; + +#define dgMsgKanji8E91Tex "__OTR__textures/kanji/gMsgKanji8E91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E91Tex[] = dgMsgKanji8E91Tex; + +#define dgMsgKanji8E92Tex "__OTR__textures/kanji/gMsgKanji8E92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E92Tex[] = dgMsgKanji8E92Tex; + +#define dgMsgKanji8E93Tex "__OTR__textures/kanji/gMsgKanji8E93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E93Tex[] = dgMsgKanji8E93Tex; + +#define dgMsgKanji8E94Tex "__OTR__textures/kanji/gMsgKanji8E94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E94Tex[] = dgMsgKanji8E94Tex; + +#define dgMsgKanji8E95Tex "__OTR__textures/kanji/gMsgKanji8E95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E95Tex[] = dgMsgKanji8E95Tex; + +#define dgMsgKanji8E96Tex "__OTR__textures/kanji/gMsgKanji8E96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E96Tex[] = dgMsgKanji8E96Tex; + +#define dgMsgKanji8E97Tex "__OTR__textures/kanji/gMsgKanji8E97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E97Tex[] = dgMsgKanji8E97Tex; + +#define dgMsgKanji8E98Tex "__OTR__textures/kanji/gMsgKanji8E98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E98Tex[] = dgMsgKanji8E98Tex; + +#define dgMsgKanji8E99Tex "__OTR__textures/kanji/gMsgKanji8E99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8E99Tex[] = dgMsgKanji8E99Tex; + +#define dgMsgKanji8E9ATex "__OTR__textures/kanji/gMsgKanji8E9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8E9ATex[] = dgMsgKanji8E9ATex; + +#define dgMsgKanji8E9BTex "__OTR__textures/kanji/gMsgKanji8E9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9BTex[] = dgMsgKanji8E9BTex; + +#define dgMsgKanji8E9CTex "__OTR__textures/kanji/gMsgKanji8E9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9CTex[] = dgMsgKanji8E9CTex; + +#define dgMsgKanji8E9DTex "__OTR__textures/kanji/gMsgKanji8E9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9DTex[] = dgMsgKanji8E9DTex; + +#define dgMsgKanji8E9ETex "__OTR__textures/kanji/gMsgKanji8E9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8E9ETex[] = dgMsgKanji8E9ETex; + +#define dgMsgKanji8E9FTex "__OTR__textures/kanji/gMsgKanji8E9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8E9FTex[] = dgMsgKanji8E9FTex; + +#define dgMsgKanji8EA0Tex "__OTR__textures/kanji/gMsgKanji8EA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA0Tex[] = dgMsgKanji8EA0Tex; + +#define dgMsgKanji8EA1Tex "__OTR__textures/kanji/gMsgKanji8EA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA1Tex[] = dgMsgKanji8EA1Tex; + +#define dgMsgKanji8EA2Tex "__OTR__textures/kanji/gMsgKanji8EA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA2Tex[] = dgMsgKanji8EA2Tex; + +#define dgMsgKanji8EA3Tex "__OTR__textures/kanji/gMsgKanji8EA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA3Tex[] = dgMsgKanji8EA3Tex; + +#define dgMsgKanji8EA4Tex "__OTR__textures/kanji/gMsgKanji8EA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA4Tex[] = dgMsgKanji8EA4Tex; + +#define dgMsgKanji8EA5Tex "__OTR__textures/kanji/gMsgKanji8EA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA5Tex[] = dgMsgKanji8EA5Tex; + +#define dgMsgKanji8EA6Tex "__OTR__textures/kanji/gMsgKanji8EA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA6Tex[] = dgMsgKanji8EA6Tex; + +#define dgMsgKanji8EA7Tex "__OTR__textures/kanji/gMsgKanji8EA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA7Tex[] = dgMsgKanji8EA7Tex; + +#define dgMsgKanji8EA8Tex "__OTR__textures/kanji/gMsgKanji8EA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA8Tex[] = dgMsgKanji8EA8Tex; + +#define dgMsgKanji8EA9Tex "__OTR__textures/kanji/gMsgKanji8EA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EA9Tex[] = dgMsgKanji8EA9Tex; + +#define dgMsgKanji8EAATex "__OTR__textures/kanji/gMsgKanji8EAATex" +static const ALIGN_ASSET(2) char gMsgKanji8EAATex[] = dgMsgKanji8EAATex; + +#define dgMsgKanji8EABTex "__OTR__textures/kanji/gMsgKanji8EABTex" +static const ALIGN_ASSET(2) char gMsgKanji8EABTex[] = dgMsgKanji8EABTex; + +#define dgMsgKanji8EACTex "__OTR__textures/kanji/gMsgKanji8EACTex" +static const ALIGN_ASSET(2) char gMsgKanji8EACTex[] = dgMsgKanji8EACTex; + +#define dgMsgKanji8EADTex "__OTR__textures/kanji/gMsgKanji8EADTex" +static const ALIGN_ASSET(2) char gMsgKanji8EADTex[] = dgMsgKanji8EADTex; + +#define dgMsgKanji8EAETex "__OTR__textures/kanji/gMsgKanji8EAETex" +static const ALIGN_ASSET(2) char gMsgKanji8EAETex[] = dgMsgKanji8EAETex; + +#define dgMsgKanji8EAFTex "__OTR__textures/kanji/gMsgKanji8EAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EAFTex[] = dgMsgKanji8EAFTex; + +#define dgMsgKanji8EB0Tex "__OTR__textures/kanji/gMsgKanji8EB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB0Tex[] = dgMsgKanji8EB0Tex; + +#define dgMsgKanji8EB1Tex "__OTR__textures/kanji/gMsgKanji8EB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB1Tex[] = dgMsgKanji8EB1Tex; + +#define dgMsgKanji8EB2Tex "__OTR__textures/kanji/gMsgKanji8EB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB2Tex[] = dgMsgKanji8EB2Tex; + +#define dgMsgKanji8EB3Tex "__OTR__textures/kanji/gMsgKanji8EB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB3Tex[] = dgMsgKanji8EB3Tex; + +#define dgMsgKanji8EB4Tex "__OTR__textures/kanji/gMsgKanji8EB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB4Tex[] = dgMsgKanji8EB4Tex; + +#define dgMsgKanji8EB5Tex "__OTR__textures/kanji/gMsgKanji8EB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB5Tex[] = dgMsgKanji8EB5Tex; + +#define dgMsgKanji8EB6Tex "__OTR__textures/kanji/gMsgKanji8EB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB6Tex[] = dgMsgKanji8EB6Tex; + +#define dgMsgKanji8EB7Tex "__OTR__textures/kanji/gMsgKanji8EB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB7Tex[] = dgMsgKanji8EB7Tex; + +#define dgMsgKanji8EB8Tex "__OTR__textures/kanji/gMsgKanji8EB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB8Tex[] = dgMsgKanji8EB8Tex; + +#define dgMsgKanji8EB9Tex "__OTR__textures/kanji/gMsgKanji8EB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EB9Tex[] = dgMsgKanji8EB9Tex; + +#define dgMsgKanji8EBATex "__OTR__textures/kanji/gMsgKanji8EBATex" +static const ALIGN_ASSET(2) char gMsgKanji8EBATex[] = dgMsgKanji8EBATex; + +#define dgMsgKanji8EBBTex "__OTR__textures/kanji/gMsgKanji8EBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBBTex[] = dgMsgKanji8EBBTex; + +#define dgMsgKanji8EBCTex "__OTR__textures/kanji/gMsgKanji8EBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBCTex[] = dgMsgKanji8EBCTex; + +#define dgMsgKanji8EBDTex "__OTR__textures/kanji/gMsgKanji8EBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBDTex[] = dgMsgKanji8EBDTex; + +#define dgMsgKanji8EBETex "__OTR__textures/kanji/gMsgKanji8EBETex" +static const ALIGN_ASSET(2) char gMsgKanji8EBETex[] = dgMsgKanji8EBETex; + +#define dgMsgKanji8EBFTex "__OTR__textures/kanji/gMsgKanji8EBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EBFTex[] = dgMsgKanji8EBFTex; + +#define dgMsgKanji8EC0Tex "__OTR__textures/kanji/gMsgKanji8EC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC0Tex[] = dgMsgKanji8EC0Tex; + +#define dgMsgKanji8EC1Tex "__OTR__textures/kanji/gMsgKanji8EC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC1Tex[] = dgMsgKanji8EC1Tex; + +#define dgMsgKanji8EC2Tex "__OTR__textures/kanji/gMsgKanji8EC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC2Tex[] = dgMsgKanji8EC2Tex; + +#define dgMsgKanji8EC3Tex "__OTR__textures/kanji/gMsgKanji8EC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC3Tex[] = dgMsgKanji8EC3Tex; + +#define dgMsgKanji8EC4Tex "__OTR__textures/kanji/gMsgKanji8EC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC4Tex[] = dgMsgKanji8EC4Tex; + +#define dgMsgKanji8EC5Tex "__OTR__textures/kanji/gMsgKanji8EC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC5Tex[] = dgMsgKanji8EC5Tex; + +#define dgMsgKanji8EC6Tex "__OTR__textures/kanji/gMsgKanji8EC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC6Tex[] = dgMsgKanji8EC6Tex; + +#define dgMsgKanji8EC7Tex "__OTR__textures/kanji/gMsgKanji8EC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC7Tex[] = dgMsgKanji8EC7Tex; + +#define dgMsgKanji8EC8Tex "__OTR__textures/kanji/gMsgKanji8EC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC8Tex[] = dgMsgKanji8EC8Tex; + +#define dgMsgKanji8EC9Tex "__OTR__textures/kanji/gMsgKanji8EC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EC9Tex[] = dgMsgKanji8EC9Tex; + +#define dgMsgKanji8ECATex "__OTR__textures/kanji/gMsgKanji8ECATex" +static const ALIGN_ASSET(2) char gMsgKanji8ECATex[] = dgMsgKanji8ECATex; + +#define dgMsgKanji8ECBTex "__OTR__textures/kanji/gMsgKanji8ECBTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECBTex[] = dgMsgKanji8ECBTex; + +#define dgMsgKanji8ECCTex "__OTR__textures/kanji/gMsgKanji8ECCTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECCTex[] = dgMsgKanji8ECCTex; + +#define dgMsgKanji8ECDTex "__OTR__textures/kanji/gMsgKanji8ECDTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECDTex[] = dgMsgKanji8ECDTex; + +#define dgMsgKanji8ECETex "__OTR__textures/kanji/gMsgKanji8ECETex" +static const ALIGN_ASSET(2) char gMsgKanji8ECETex[] = dgMsgKanji8ECETex; + +#define dgMsgKanji8ECFTex "__OTR__textures/kanji/gMsgKanji8ECFTex" +static const ALIGN_ASSET(2) char gMsgKanji8ECFTex[] = dgMsgKanji8ECFTex; + +#define dgMsgKanji8ED0Tex "__OTR__textures/kanji/gMsgKanji8ED0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED0Tex[] = dgMsgKanji8ED0Tex; + +#define dgMsgKanji8ED1Tex "__OTR__textures/kanji/gMsgKanji8ED1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED1Tex[] = dgMsgKanji8ED1Tex; + +#define dgMsgKanji8ED2Tex "__OTR__textures/kanji/gMsgKanji8ED2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED2Tex[] = dgMsgKanji8ED2Tex; + +#define dgMsgKanji8ED3Tex "__OTR__textures/kanji/gMsgKanji8ED3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED3Tex[] = dgMsgKanji8ED3Tex; + +#define dgMsgKanji8ED4Tex "__OTR__textures/kanji/gMsgKanji8ED4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED4Tex[] = dgMsgKanji8ED4Tex; + +#define dgMsgKanji8ED5Tex "__OTR__textures/kanji/gMsgKanji8ED5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED5Tex[] = dgMsgKanji8ED5Tex; + +#define dgMsgKanji8ED6Tex "__OTR__textures/kanji/gMsgKanji8ED6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED6Tex[] = dgMsgKanji8ED6Tex; + +#define dgMsgKanji8ED7Tex "__OTR__textures/kanji/gMsgKanji8ED7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED7Tex[] = dgMsgKanji8ED7Tex; + +#define dgMsgKanji8ED8Tex "__OTR__textures/kanji/gMsgKanji8ED8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED8Tex[] = dgMsgKanji8ED8Tex; + +#define dgMsgKanji8ED9Tex "__OTR__textures/kanji/gMsgKanji8ED9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8ED9Tex[] = dgMsgKanji8ED9Tex; + +#define dgMsgKanji8EDATex "__OTR__textures/kanji/gMsgKanji8EDATex" +static const ALIGN_ASSET(2) char gMsgKanji8EDATex[] = dgMsgKanji8EDATex; + +#define dgMsgKanji8EDBTex "__OTR__textures/kanji/gMsgKanji8EDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDBTex[] = dgMsgKanji8EDBTex; + +#define dgMsgKanji8EDCTex "__OTR__textures/kanji/gMsgKanji8EDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDCTex[] = dgMsgKanji8EDCTex; + +#define dgMsgKanji8EDDTex "__OTR__textures/kanji/gMsgKanji8EDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDDTex[] = dgMsgKanji8EDDTex; + +#define dgMsgKanji8EDETex "__OTR__textures/kanji/gMsgKanji8EDETex" +static const ALIGN_ASSET(2) char gMsgKanji8EDETex[] = dgMsgKanji8EDETex; + +#define dgMsgKanji8EDFTex "__OTR__textures/kanji/gMsgKanji8EDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EDFTex[] = dgMsgKanji8EDFTex; + +#define dgMsgKanji8EE0Tex "__OTR__textures/kanji/gMsgKanji8EE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE0Tex[] = dgMsgKanji8EE0Tex; + +#define dgMsgKanji8EE1Tex "__OTR__textures/kanji/gMsgKanji8EE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE1Tex[] = dgMsgKanji8EE1Tex; + +#define dgMsgKanji8EE2Tex "__OTR__textures/kanji/gMsgKanji8EE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE2Tex[] = dgMsgKanji8EE2Tex; + +#define dgMsgKanji8EE3Tex "__OTR__textures/kanji/gMsgKanji8EE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE3Tex[] = dgMsgKanji8EE3Tex; + +#define dgMsgKanji8EE4Tex "__OTR__textures/kanji/gMsgKanji8EE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE4Tex[] = dgMsgKanji8EE4Tex; + +#define dgMsgKanji8EE5Tex "__OTR__textures/kanji/gMsgKanji8EE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE5Tex[] = dgMsgKanji8EE5Tex; + +#define dgMsgKanji8EE6Tex "__OTR__textures/kanji/gMsgKanji8EE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE6Tex[] = dgMsgKanji8EE6Tex; + +#define dgMsgKanji8EE7Tex "__OTR__textures/kanji/gMsgKanji8EE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE7Tex[] = dgMsgKanji8EE7Tex; + +#define dgMsgKanji8EE8Tex "__OTR__textures/kanji/gMsgKanji8EE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE8Tex[] = dgMsgKanji8EE8Tex; + +#define dgMsgKanji8EE9Tex "__OTR__textures/kanji/gMsgKanji8EE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EE9Tex[] = dgMsgKanji8EE9Tex; + +#define dgMsgKanji8EEATex "__OTR__textures/kanji/gMsgKanji8EEATex" +static const ALIGN_ASSET(2) char gMsgKanji8EEATex[] = dgMsgKanji8EEATex; + +#define dgMsgKanji8EEBTex "__OTR__textures/kanji/gMsgKanji8EEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EEBTex[] = dgMsgKanji8EEBTex; + +#define dgMsgKanji8EECTex "__OTR__textures/kanji/gMsgKanji8EECTex" +static const ALIGN_ASSET(2) char gMsgKanji8EECTex[] = dgMsgKanji8EECTex; + +#define dgMsgKanji8EEDTex "__OTR__textures/kanji/gMsgKanji8EEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8EEDTex[] = dgMsgKanji8EEDTex; + +#define dgMsgKanji8EEETex "__OTR__textures/kanji/gMsgKanji8EEETex" +static const ALIGN_ASSET(2) char gMsgKanji8EEETex[] = dgMsgKanji8EEETex; + +#define dgMsgKanji8EEFTex "__OTR__textures/kanji/gMsgKanji8EEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8EEFTex[] = dgMsgKanji8EEFTex; + +#define dgMsgKanji8EF0Tex "__OTR__textures/kanji/gMsgKanji8EF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF0Tex[] = dgMsgKanji8EF0Tex; + +#define dgMsgKanji8EF1Tex "__OTR__textures/kanji/gMsgKanji8EF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF1Tex[] = dgMsgKanji8EF1Tex; + +#define dgMsgKanji8EF2Tex "__OTR__textures/kanji/gMsgKanji8EF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF2Tex[] = dgMsgKanji8EF2Tex; + +#define dgMsgKanji8EF3Tex "__OTR__textures/kanji/gMsgKanji8EF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF3Tex[] = dgMsgKanji8EF3Tex; + +#define dgMsgKanji8EF4Tex "__OTR__textures/kanji/gMsgKanji8EF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF4Tex[] = dgMsgKanji8EF4Tex; + +#define dgMsgKanji8EF5Tex "__OTR__textures/kanji/gMsgKanji8EF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF5Tex[] = dgMsgKanji8EF5Tex; + +#define dgMsgKanji8EF6Tex "__OTR__textures/kanji/gMsgKanji8EF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF6Tex[] = dgMsgKanji8EF6Tex; + +#define dgMsgKanji8EF7Tex "__OTR__textures/kanji/gMsgKanji8EF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF7Tex[] = dgMsgKanji8EF7Tex; + +#define dgMsgKanji8EF8Tex "__OTR__textures/kanji/gMsgKanji8EF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF8Tex[] = dgMsgKanji8EF8Tex; + +#define dgMsgKanji8EF9Tex "__OTR__textures/kanji/gMsgKanji8EF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8EF9Tex[] = dgMsgKanji8EF9Tex; + +#define dgMsgKanji8EFATex "__OTR__textures/kanji/gMsgKanji8EFATex" +static const ALIGN_ASSET(2) char gMsgKanji8EFATex[] = dgMsgKanji8EFATex; + +#define dgMsgKanji8EFBTex "__OTR__textures/kanji/gMsgKanji8EFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8EFBTex[] = dgMsgKanji8EFBTex; + +#define dgMsgKanji8EFCTex "__OTR__textures/kanji/gMsgKanji8EFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8EFCTex[] = dgMsgKanji8EFCTex; + +#define dgMsgKanji8F40Tex "__OTR__textures/kanji/gMsgKanji8F40Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F40Tex[] = dgMsgKanji8F40Tex; + +#define dgMsgKanji8F41Tex "__OTR__textures/kanji/gMsgKanji8F41Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F41Tex[] = dgMsgKanji8F41Tex; + +#define dgMsgKanji8F42Tex "__OTR__textures/kanji/gMsgKanji8F42Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F42Tex[] = dgMsgKanji8F42Tex; + +#define dgMsgKanji8F43Tex "__OTR__textures/kanji/gMsgKanji8F43Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F43Tex[] = dgMsgKanji8F43Tex; + +#define dgMsgKanji8F44Tex "__OTR__textures/kanji/gMsgKanji8F44Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F44Tex[] = dgMsgKanji8F44Tex; + +#define dgMsgKanji8F45Tex "__OTR__textures/kanji/gMsgKanji8F45Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F45Tex[] = dgMsgKanji8F45Tex; + +#define dgMsgKanji8F46Tex "__OTR__textures/kanji/gMsgKanji8F46Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F46Tex[] = dgMsgKanji8F46Tex; + +#define dgMsgKanji8F47Tex "__OTR__textures/kanji/gMsgKanji8F47Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F47Tex[] = dgMsgKanji8F47Tex; + +#define dgMsgKanji8F48Tex "__OTR__textures/kanji/gMsgKanji8F48Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F48Tex[] = dgMsgKanji8F48Tex; + +#define dgMsgKanji8F49Tex "__OTR__textures/kanji/gMsgKanji8F49Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F49Tex[] = dgMsgKanji8F49Tex; + +#define dgMsgKanji8F4ATex "__OTR__textures/kanji/gMsgKanji8F4ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F4ATex[] = dgMsgKanji8F4ATex; + +#define dgMsgKanji8F4BTex "__OTR__textures/kanji/gMsgKanji8F4BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4BTex[] = dgMsgKanji8F4BTex; + +#define dgMsgKanji8F4CTex "__OTR__textures/kanji/gMsgKanji8F4CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4CTex[] = dgMsgKanji8F4CTex; + +#define dgMsgKanji8F4DTex "__OTR__textures/kanji/gMsgKanji8F4DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4DTex[] = dgMsgKanji8F4DTex; + +#define dgMsgKanji8F4ETex "__OTR__textures/kanji/gMsgKanji8F4ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F4ETex[] = dgMsgKanji8F4ETex; + +#define dgMsgKanji8F4FTex "__OTR__textures/kanji/gMsgKanji8F4FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F4FTex[] = dgMsgKanji8F4FTex; + +#define dgMsgKanji8F50Tex "__OTR__textures/kanji/gMsgKanji8F50Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F50Tex[] = dgMsgKanji8F50Tex; + +#define dgMsgKanji8F51Tex "__OTR__textures/kanji/gMsgKanji8F51Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F51Tex[] = dgMsgKanji8F51Tex; + +#define dgMsgKanji8F52Tex "__OTR__textures/kanji/gMsgKanji8F52Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F52Tex[] = dgMsgKanji8F52Tex; + +#define dgMsgKanji8F53Tex "__OTR__textures/kanji/gMsgKanji8F53Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F53Tex[] = dgMsgKanji8F53Tex; + +#define dgMsgKanji8F54Tex "__OTR__textures/kanji/gMsgKanji8F54Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F54Tex[] = dgMsgKanji8F54Tex; + +#define dgMsgKanji8F55Tex "__OTR__textures/kanji/gMsgKanji8F55Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F55Tex[] = dgMsgKanji8F55Tex; + +#define dgMsgKanji8F56Tex "__OTR__textures/kanji/gMsgKanji8F56Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F56Tex[] = dgMsgKanji8F56Tex; + +#define dgMsgKanji8F57Tex "__OTR__textures/kanji/gMsgKanji8F57Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F57Tex[] = dgMsgKanji8F57Tex; + +#define dgMsgKanji8F58Tex "__OTR__textures/kanji/gMsgKanji8F58Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F58Tex[] = dgMsgKanji8F58Tex; + +#define dgMsgKanji8F59Tex "__OTR__textures/kanji/gMsgKanji8F59Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F59Tex[] = dgMsgKanji8F59Tex; + +#define dgMsgKanji8F5ATex "__OTR__textures/kanji/gMsgKanji8F5ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F5ATex[] = dgMsgKanji8F5ATex; + +#define dgMsgKanji8F5BTex "__OTR__textures/kanji/gMsgKanji8F5BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5BTex[] = dgMsgKanji8F5BTex; + +#define dgMsgKanji8F5CTex "__OTR__textures/kanji/gMsgKanji8F5CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5CTex[] = dgMsgKanji8F5CTex; + +#define dgMsgKanji8F5DTex "__OTR__textures/kanji/gMsgKanji8F5DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5DTex[] = dgMsgKanji8F5DTex; + +#define dgMsgKanji8F5ETex "__OTR__textures/kanji/gMsgKanji8F5ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F5ETex[] = dgMsgKanji8F5ETex; + +#define dgMsgKanji8F5FTex "__OTR__textures/kanji/gMsgKanji8F5FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F5FTex[] = dgMsgKanji8F5FTex; + +#define dgMsgKanji8F60Tex "__OTR__textures/kanji/gMsgKanji8F60Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F60Tex[] = dgMsgKanji8F60Tex; + +#define dgMsgKanji8F61Tex "__OTR__textures/kanji/gMsgKanji8F61Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F61Tex[] = dgMsgKanji8F61Tex; + +#define dgMsgKanji8F62Tex "__OTR__textures/kanji/gMsgKanji8F62Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F62Tex[] = dgMsgKanji8F62Tex; + +#define dgMsgKanji8F63Tex "__OTR__textures/kanji/gMsgKanji8F63Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F63Tex[] = dgMsgKanji8F63Tex; + +#define dgMsgKanji8F64Tex "__OTR__textures/kanji/gMsgKanji8F64Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F64Tex[] = dgMsgKanji8F64Tex; + +#define dgMsgKanji8F65Tex "__OTR__textures/kanji/gMsgKanji8F65Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F65Tex[] = dgMsgKanji8F65Tex; + +#define dgMsgKanji8F66Tex "__OTR__textures/kanji/gMsgKanji8F66Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F66Tex[] = dgMsgKanji8F66Tex; + +#define dgMsgKanji8F67Tex "__OTR__textures/kanji/gMsgKanji8F67Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F67Tex[] = dgMsgKanji8F67Tex; + +#define dgMsgKanji8F68Tex "__OTR__textures/kanji/gMsgKanji8F68Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F68Tex[] = dgMsgKanji8F68Tex; + +#define dgMsgKanji8F69Tex "__OTR__textures/kanji/gMsgKanji8F69Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F69Tex[] = dgMsgKanji8F69Tex; + +#define dgMsgKanji8F6ATex "__OTR__textures/kanji/gMsgKanji8F6ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F6ATex[] = dgMsgKanji8F6ATex; + +#define dgMsgKanji8F6BTex "__OTR__textures/kanji/gMsgKanji8F6BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6BTex[] = dgMsgKanji8F6BTex; + +#define dgMsgKanji8F6CTex "__OTR__textures/kanji/gMsgKanji8F6CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6CTex[] = dgMsgKanji8F6CTex; + +#define dgMsgKanji8F6DTex "__OTR__textures/kanji/gMsgKanji8F6DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6DTex[] = dgMsgKanji8F6DTex; + +#define dgMsgKanji8F6ETex "__OTR__textures/kanji/gMsgKanji8F6ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F6ETex[] = dgMsgKanji8F6ETex; + +#define dgMsgKanji8F6FTex "__OTR__textures/kanji/gMsgKanji8F6FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F6FTex[] = dgMsgKanji8F6FTex; + +#define dgMsgKanji8F70Tex "__OTR__textures/kanji/gMsgKanji8F70Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F70Tex[] = dgMsgKanji8F70Tex; + +#define dgMsgKanji8F71Tex "__OTR__textures/kanji/gMsgKanji8F71Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F71Tex[] = dgMsgKanji8F71Tex; + +#define dgMsgKanji8F72Tex "__OTR__textures/kanji/gMsgKanji8F72Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F72Tex[] = dgMsgKanji8F72Tex; + +#define dgMsgKanji8F73Tex "__OTR__textures/kanji/gMsgKanji8F73Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F73Tex[] = dgMsgKanji8F73Tex; + +#define dgMsgKanji8F74Tex "__OTR__textures/kanji/gMsgKanji8F74Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F74Tex[] = dgMsgKanji8F74Tex; + +#define dgMsgKanji8F75Tex "__OTR__textures/kanji/gMsgKanji8F75Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F75Tex[] = dgMsgKanji8F75Tex; + +#define dgMsgKanji8F76Tex "__OTR__textures/kanji/gMsgKanji8F76Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F76Tex[] = dgMsgKanji8F76Tex; + +#define dgMsgKanji8F77Tex "__OTR__textures/kanji/gMsgKanji8F77Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F77Tex[] = dgMsgKanji8F77Tex; + +#define dgMsgKanji8F78Tex "__OTR__textures/kanji/gMsgKanji8F78Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F78Tex[] = dgMsgKanji8F78Tex; + +#define dgMsgKanji8F79Tex "__OTR__textures/kanji/gMsgKanji8F79Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F79Tex[] = dgMsgKanji8F79Tex; + +#define dgMsgKanji8F7ATex "__OTR__textures/kanji/gMsgKanji8F7ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F7ATex[] = dgMsgKanji8F7ATex; + +#define dgMsgKanji8F7BTex "__OTR__textures/kanji/gMsgKanji8F7BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F7BTex[] = dgMsgKanji8F7BTex; + +#define dgMsgKanji8F7CTex "__OTR__textures/kanji/gMsgKanji8F7CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F7CTex[] = dgMsgKanji8F7CTex; + +#define dgMsgKanji8F7DTex "__OTR__textures/kanji/gMsgKanji8F7DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F7DTex[] = dgMsgKanji8F7DTex; + +#define dgMsgKanji8F7ETex "__OTR__textures/kanji/gMsgKanji8F7ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F7ETex[] = dgMsgKanji8F7ETex; + +#define dgMsgKanji8F80Tex "__OTR__textures/kanji/gMsgKanji8F80Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F80Tex[] = dgMsgKanji8F80Tex; + +#define dgMsgKanji8F81Tex "__OTR__textures/kanji/gMsgKanji8F81Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F81Tex[] = dgMsgKanji8F81Tex; + +#define dgMsgKanji8F82Tex "__OTR__textures/kanji/gMsgKanji8F82Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F82Tex[] = dgMsgKanji8F82Tex; + +#define dgMsgKanji8F83Tex "__OTR__textures/kanji/gMsgKanji8F83Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F83Tex[] = dgMsgKanji8F83Tex; + +#define dgMsgKanji8F84Tex "__OTR__textures/kanji/gMsgKanji8F84Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F84Tex[] = dgMsgKanji8F84Tex; + +#define dgMsgKanji8F85Tex "__OTR__textures/kanji/gMsgKanji8F85Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F85Tex[] = dgMsgKanji8F85Tex; + +#define dgMsgKanji8F86Tex "__OTR__textures/kanji/gMsgKanji8F86Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F86Tex[] = dgMsgKanji8F86Tex; + +#define dgMsgKanji8F87Tex "__OTR__textures/kanji/gMsgKanji8F87Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F87Tex[] = dgMsgKanji8F87Tex; + +#define dgMsgKanji8F88Tex "__OTR__textures/kanji/gMsgKanji8F88Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F88Tex[] = dgMsgKanji8F88Tex; + +#define dgMsgKanji8F89Tex "__OTR__textures/kanji/gMsgKanji8F89Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F89Tex[] = dgMsgKanji8F89Tex; + +#define dgMsgKanji8F8ATex "__OTR__textures/kanji/gMsgKanji8F8ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F8ATex[] = dgMsgKanji8F8ATex; + +#define dgMsgKanji8F8BTex "__OTR__textures/kanji/gMsgKanji8F8BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8BTex[] = dgMsgKanji8F8BTex; + +#define dgMsgKanji8F8CTex "__OTR__textures/kanji/gMsgKanji8F8CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8CTex[] = dgMsgKanji8F8CTex; + +#define dgMsgKanji8F8DTex "__OTR__textures/kanji/gMsgKanji8F8DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8DTex[] = dgMsgKanji8F8DTex; + +#define dgMsgKanji8F8ETex "__OTR__textures/kanji/gMsgKanji8F8ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F8ETex[] = dgMsgKanji8F8ETex; + +#define dgMsgKanji8F8FTex "__OTR__textures/kanji/gMsgKanji8F8FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F8FTex[] = dgMsgKanji8F8FTex; + +#define dgMsgKanji8F90Tex "__OTR__textures/kanji/gMsgKanji8F90Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F90Tex[] = dgMsgKanji8F90Tex; + +#define dgMsgKanji8F91Tex "__OTR__textures/kanji/gMsgKanji8F91Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F91Tex[] = dgMsgKanji8F91Tex; + +#define dgMsgKanji8F92Tex "__OTR__textures/kanji/gMsgKanji8F92Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F92Tex[] = dgMsgKanji8F92Tex; + +#define dgMsgKanji8F93Tex "__OTR__textures/kanji/gMsgKanji8F93Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F93Tex[] = dgMsgKanji8F93Tex; + +#define dgMsgKanji8F94Tex "__OTR__textures/kanji/gMsgKanji8F94Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F94Tex[] = dgMsgKanji8F94Tex; + +#define dgMsgKanji8F95Tex "__OTR__textures/kanji/gMsgKanji8F95Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F95Tex[] = dgMsgKanji8F95Tex; + +#define dgMsgKanji8F96Tex "__OTR__textures/kanji/gMsgKanji8F96Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F96Tex[] = dgMsgKanji8F96Tex; + +#define dgMsgKanji8F97Tex "__OTR__textures/kanji/gMsgKanji8F97Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F97Tex[] = dgMsgKanji8F97Tex; + +#define dgMsgKanji8F98Tex "__OTR__textures/kanji/gMsgKanji8F98Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F98Tex[] = dgMsgKanji8F98Tex; + +#define dgMsgKanji8F99Tex "__OTR__textures/kanji/gMsgKanji8F99Tex" +static const ALIGN_ASSET(2) char gMsgKanji8F99Tex[] = dgMsgKanji8F99Tex; + +#define dgMsgKanji8F9ATex "__OTR__textures/kanji/gMsgKanji8F9ATex" +static const ALIGN_ASSET(2) char gMsgKanji8F9ATex[] = dgMsgKanji8F9ATex; + +#define dgMsgKanji8F9BTex "__OTR__textures/kanji/gMsgKanji8F9BTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9BTex[] = dgMsgKanji8F9BTex; + +#define dgMsgKanji8F9CTex "__OTR__textures/kanji/gMsgKanji8F9CTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9CTex[] = dgMsgKanji8F9CTex; + +#define dgMsgKanji8F9DTex "__OTR__textures/kanji/gMsgKanji8F9DTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9DTex[] = dgMsgKanji8F9DTex; + +#define dgMsgKanji8F9ETex "__OTR__textures/kanji/gMsgKanji8F9ETex" +static const ALIGN_ASSET(2) char gMsgKanji8F9ETex[] = dgMsgKanji8F9ETex; + +#define dgMsgKanji8F9FTex "__OTR__textures/kanji/gMsgKanji8F9FTex" +static const ALIGN_ASSET(2) char gMsgKanji8F9FTex[] = dgMsgKanji8F9FTex; + +#define dgMsgKanji8FA0Tex "__OTR__textures/kanji/gMsgKanji8FA0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA0Tex[] = dgMsgKanji8FA0Tex; + +#define dgMsgKanji8FA1Tex "__OTR__textures/kanji/gMsgKanji8FA1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA1Tex[] = dgMsgKanji8FA1Tex; + +#define dgMsgKanji8FA2Tex "__OTR__textures/kanji/gMsgKanji8FA2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA2Tex[] = dgMsgKanji8FA2Tex; + +#define dgMsgKanji8FA3Tex "__OTR__textures/kanji/gMsgKanji8FA3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA3Tex[] = dgMsgKanji8FA3Tex; + +#define dgMsgKanji8FA4Tex "__OTR__textures/kanji/gMsgKanji8FA4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA4Tex[] = dgMsgKanji8FA4Tex; + +#define dgMsgKanji8FA5Tex "__OTR__textures/kanji/gMsgKanji8FA5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA5Tex[] = dgMsgKanji8FA5Tex; + +#define dgMsgKanji8FA6Tex "__OTR__textures/kanji/gMsgKanji8FA6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA6Tex[] = dgMsgKanji8FA6Tex; + +#define dgMsgKanji8FA7Tex "__OTR__textures/kanji/gMsgKanji8FA7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA7Tex[] = dgMsgKanji8FA7Tex; + +#define dgMsgKanji8FA8Tex "__OTR__textures/kanji/gMsgKanji8FA8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA8Tex[] = dgMsgKanji8FA8Tex; + +#define dgMsgKanji8FA9Tex "__OTR__textures/kanji/gMsgKanji8FA9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FA9Tex[] = dgMsgKanji8FA9Tex; + +#define dgMsgKanji8FAATex "__OTR__textures/kanji/gMsgKanji8FAATex" +static const ALIGN_ASSET(2) char gMsgKanji8FAATex[] = dgMsgKanji8FAATex; + +#define dgMsgKanji8FABTex "__OTR__textures/kanji/gMsgKanji8FABTex" +static const ALIGN_ASSET(2) char gMsgKanji8FABTex[] = dgMsgKanji8FABTex; + +#define dgMsgKanji8FACTex "__OTR__textures/kanji/gMsgKanji8FACTex" +static const ALIGN_ASSET(2) char gMsgKanji8FACTex[] = dgMsgKanji8FACTex; + +#define dgMsgKanji8FADTex "__OTR__textures/kanji/gMsgKanji8FADTex" +static const ALIGN_ASSET(2) char gMsgKanji8FADTex[] = dgMsgKanji8FADTex; + +#define dgMsgKanji8FAETex "__OTR__textures/kanji/gMsgKanji8FAETex" +static const ALIGN_ASSET(2) char gMsgKanji8FAETex[] = dgMsgKanji8FAETex; + +#define dgMsgKanji8FAFTex "__OTR__textures/kanji/gMsgKanji8FAFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FAFTex[] = dgMsgKanji8FAFTex; + +#define dgMsgKanji8FB0Tex "__OTR__textures/kanji/gMsgKanji8FB0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB0Tex[] = dgMsgKanji8FB0Tex; + +#define dgMsgKanji8FB1Tex "__OTR__textures/kanji/gMsgKanji8FB1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB1Tex[] = dgMsgKanji8FB1Tex; + +#define dgMsgKanji8FB2Tex "__OTR__textures/kanji/gMsgKanji8FB2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB2Tex[] = dgMsgKanji8FB2Tex; + +#define dgMsgKanji8FB3Tex "__OTR__textures/kanji/gMsgKanji8FB3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB3Tex[] = dgMsgKanji8FB3Tex; + +#define dgMsgKanji8FB4Tex "__OTR__textures/kanji/gMsgKanji8FB4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB4Tex[] = dgMsgKanji8FB4Tex; + +#define dgMsgKanji8FB5Tex "__OTR__textures/kanji/gMsgKanji8FB5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB5Tex[] = dgMsgKanji8FB5Tex; + +#define dgMsgKanji8FB6Tex "__OTR__textures/kanji/gMsgKanji8FB6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB6Tex[] = dgMsgKanji8FB6Tex; + +#define dgMsgKanji8FB7Tex "__OTR__textures/kanji/gMsgKanji8FB7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB7Tex[] = dgMsgKanji8FB7Tex; + +#define dgMsgKanji8FB8Tex "__OTR__textures/kanji/gMsgKanji8FB8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB8Tex[] = dgMsgKanji8FB8Tex; + +#define dgMsgKanji8FB9Tex "__OTR__textures/kanji/gMsgKanji8FB9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FB9Tex[] = dgMsgKanji8FB9Tex; + +#define dgMsgKanji8FBATex "__OTR__textures/kanji/gMsgKanji8FBATex" +static const ALIGN_ASSET(2) char gMsgKanji8FBATex[] = dgMsgKanji8FBATex; + +#define dgMsgKanji8FBBTex "__OTR__textures/kanji/gMsgKanji8FBBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBBTex[] = dgMsgKanji8FBBTex; + +#define dgMsgKanji8FBCTex "__OTR__textures/kanji/gMsgKanji8FBCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBCTex[] = dgMsgKanji8FBCTex; + +#define dgMsgKanji8FBDTex "__OTR__textures/kanji/gMsgKanji8FBDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBDTex[] = dgMsgKanji8FBDTex; + +#define dgMsgKanji8FBETex "__OTR__textures/kanji/gMsgKanji8FBETex" +static const ALIGN_ASSET(2) char gMsgKanji8FBETex[] = dgMsgKanji8FBETex; + +#define dgMsgKanji8FBFTex "__OTR__textures/kanji/gMsgKanji8FBFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FBFTex[] = dgMsgKanji8FBFTex; + +#define dgMsgKanji8FC0Tex "__OTR__textures/kanji/gMsgKanji8FC0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC0Tex[] = dgMsgKanji8FC0Tex; + +#define dgMsgKanji8FC1Tex "__OTR__textures/kanji/gMsgKanji8FC1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC1Tex[] = dgMsgKanji8FC1Tex; + +#define dgMsgKanji8FC2Tex "__OTR__textures/kanji/gMsgKanji8FC2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC2Tex[] = dgMsgKanji8FC2Tex; + +#define dgMsgKanji8FC3Tex "__OTR__textures/kanji/gMsgKanji8FC3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC3Tex[] = dgMsgKanji8FC3Tex; + +#define dgMsgKanji8FC4Tex "__OTR__textures/kanji/gMsgKanji8FC4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC4Tex[] = dgMsgKanji8FC4Tex; + +#define dgMsgKanji8FC5Tex "__OTR__textures/kanji/gMsgKanji8FC5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC5Tex[] = dgMsgKanji8FC5Tex; + +#define dgMsgKanji8FC6Tex "__OTR__textures/kanji/gMsgKanji8FC6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC6Tex[] = dgMsgKanji8FC6Tex; + +#define dgMsgKanji8FC7Tex "__OTR__textures/kanji/gMsgKanji8FC7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC7Tex[] = dgMsgKanji8FC7Tex; + +#define dgMsgKanji8FC8Tex "__OTR__textures/kanji/gMsgKanji8FC8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC8Tex[] = dgMsgKanji8FC8Tex; + +#define dgMsgKanji8FC9Tex "__OTR__textures/kanji/gMsgKanji8FC9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FC9Tex[] = dgMsgKanji8FC9Tex; + +#define dgMsgKanji8FCATex "__OTR__textures/kanji/gMsgKanji8FCATex" +static const ALIGN_ASSET(2) char gMsgKanji8FCATex[] = dgMsgKanji8FCATex; + +#define dgMsgKanji8FCBTex "__OTR__textures/kanji/gMsgKanji8FCBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCBTex[] = dgMsgKanji8FCBTex; + +#define dgMsgKanji8FCCTex "__OTR__textures/kanji/gMsgKanji8FCCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCCTex[] = dgMsgKanji8FCCTex; + +#define dgMsgKanji8FCDTex "__OTR__textures/kanji/gMsgKanji8FCDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCDTex[] = dgMsgKanji8FCDTex; + +#define dgMsgKanji8FCETex "__OTR__textures/kanji/gMsgKanji8FCETex" +static const ALIGN_ASSET(2) char gMsgKanji8FCETex[] = dgMsgKanji8FCETex; + +#define dgMsgKanji8FCFTex "__OTR__textures/kanji/gMsgKanji8FCFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FCFTex[] = dgMsgKanji8FCFTex; + +#define dgMsgKanji8FD0Tex "__OTR__textures/kanji/gMsgKanji8FD0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD0Tex[] = dgMsgKanji8FD0Tex; + +#define dgMsgKanji8FD1Tex "__OTR__textures/kanji/gMsgKanji8FD1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD1Tex[] = dgMsgKanji8FD1Tex; + +#define dgMsgKanji8FD2Tex "__OTR__textures/kanji/gMsgKanji8FD2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD2Tex[] = dgMsgKanji8FD2Tex; + +#define dgMsgKanji8FD3Tex "__OTR__textures/kanji/gMsgKanji8FD3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD3Tex[] = dgMsgKanji8FD3Tex; + +#define dgMsgKanji8FD4Tex "__OTR__textures/kanji/gMsgKanji8FD4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD4Tex[] = dgMsgKanji8FD4Tex; + +#define dgMsgKanji8FD5Tex "__OTR__textures/kanji/gMsgKanji8FD5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD5Tex[] = dgMsgKanji8FD5Tex; + +#define dgMsgKanji8FD6Tex "__OTR__textures/kanji/gMsgKanji8FD6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD6Tex[] = dgMsgKanji8FD6Tex; + +#define dgMsgKanji8FD7Tex "__OTR__textures/kanji/gMsgKanji8FD7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD7Tex[] = dgMsgKanji8FD7Tex; + +#define dgMsgKanji8FD8Tex "__OTR__textures/kanji/gMsgKanji8FD8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD8Tex[] = dgMsgKanji8FD8Tex; + +#define dgMsgKanji8FD9Tex "__OTR__textures/kanji/gMsgKanji8FD9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FD9Tex[] = dgMsgKanji8FD9Tex; + +#define dgMsgKanji8FDATex "__OTR__textures/kanji/gMsgKanji8FDATex" +static const ALIGN_ASSET(2) char gMsgKanji8FDATex[] = dgMsgKanji8FDATex; + +#define dgMsgKanji8FDBTex "__OTR__textures/kanji/gMsgKanji8FDBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDBTex[] = dgMsgKanji8FDBTex; + +#define dgMsgKanji8FDCTex "__OTR__textures/kanji/gMsgKanji8FDCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDCTex[] = dgMsgKanji8FDCTex; + +#define dgMsgKanji8FDDTex "__OTR__textures/kanji/gMsgKanji8FDDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDDTex[] = dgMsgKanji8FDDTex; + +#define dgMsgKanji8FDETex "__OTR__textures/kanji/gMsgKanji8FDETex" +static const ALIGN_ASSET(2) char gMsgKanji8FDETex[] = dgMsgKanji8FDETex; + +#define dgMsgKanji8FDFTex "__OTR__textures/kanji/gMsgKanji8FDFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FDFTex[] = dgMsgKanji8FDFTex; + +#define dgMsgKanji8FE0Tex "__OTR__textures/kanji/gMsgKanji8FE0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE0Tex[] = dgMsgKanji8FE0Tex; + +#define dgMsgKanji8FE1Tex "__OTR__textures/kanji/gMsgKanji8FE1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE1Tex[] = dgMsgKanji8FE1Tex; + +#define dgMsgKanji8FE2Tex "__OTR__textures/kanji/gMsgKanji8FE2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE2Tex[] = dgMsgKanji8FE2Tex; + +#define dgMsgKanji8FE3Tex "__OTR__textures/kanji/gMsgKanji8FE3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE3Tex[] = dgMsgKanji8FE3Tex; + +#define dgMsgKanji8FE4Tex "__OTR__textures/kanji/gMsgKanji8FE4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE4Tex[] = dgMsgKanji8FE4Tex; + +#define dgMsgKanji8FE5Tex "__OTR__textures/kanji/gMsgKanji8FE5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE5Tex[] = dgMsgKanji8FE5Tex; + +#define dgMsgKanji8FE6Tex "__OTR__textures/kanji/gMsgKanji8FE6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE6Tex[] = dgMsgKanji8FE6Tex; + +#define dgMsgKanji8FE7Tex "__OTR__textures/kanji/gMsgKanji8FE7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE7Tex[] = dgMsgKanji8FE7Tex; + +#define dgMsgKanji8FE8Tex "__OTR__textures/kanji/gMsgKanji8FE8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE8Tex[] = dgMsgKanji8FE8Tex; + +#define dgMsgKanji8FE9Tex "__OTR__textures/kanji/gMsgKanji8FE9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FE9Tex[] = dgMsgKanji8FE9Tex; + +#define dgMsgKanji8FEATex "__OTR__textures/kanji/gMsgKanji8FEATex" +static const ALIGN_ASSET(2) char gMsgKanji8FEATex[] = dgMsgKanji8FEATex; + +#define dgMsgKanji8FEBTex "__OTR__textures/kanji/gMsgKanji8FEBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FEBTex[] = dgMsgKanji8FEBTex; + +#define dgMsgKanji8FECTex "__OTR__textures/kanji/gMsgKanji8FECTex" +static const ALIGN_ASSET(2) char gMsgKanji8FECTex[] = dgMsgKanji8FECTex; + +#define dgMsgKanji8FEDTex "__OTR__textures/kanji/gMsgKanji8FEDTex" +static const ALIGN_ASSET(2) char gMsgKanji8FEDTex[] = dgMsgKanji8FEDTex; + +#define dgMsgKanji8FEETex "__OTR__textures/kanji/gMsgKanji8FEETex" +static const ALIGN_ASSET(2) char gMsgKanji8FEETex[] = dgMsgKanji8FEETex; + +#define dgMsgKanji8FEFTex "__OTR__textures/kanji/gMsgKanji8FEFTex" +static const ALIGN_ASSET(2) char gMsgKanji8FEFTex[] = dgMsgKanji8FEFTex; + +#define dgMsgKanji8FF0Tex "__OTR__textures/kanji/gMsgKanji8FF0Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF0Tex[] = dgMsgKanji8FF0Tex; + +#define dgMsgKanji8FF1Tex "__OTR__textures/kanji/gMsgKanji8FF1Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF1Tex[] = dgMsgKanji8FF1Tex; + +#define dgMsgKanji8FF2Tex "__OTR__textures/kanji/gMsgKanji8FF2Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF2Tex[] = dgMsgKanji8FF2Tex; + +#define dgMsgKanji8FF3Tex "__OTR__textures/kanji/gMsgKanji8FF3Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF3Tex[] = dgMsgKanji8FF3Tex; + +#define dgMsgKanji8FF4Tex "__OTR__textures/kanji/gMsgKanji8FF4Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF4Tex[] = dgMsgKanji8FF4Tex; + +#define dgMsgKanji8FF5Tex "__OTR__textures/kanji/gMsgKanji8FF5Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF5Tex[] = dgMsgKanji8FF5Tex; + +#define dgMsgKanji8FF6Tex "__OTR__textures/kanji/gMsgKanji8FF6Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF6Tex[] = dgMsgKanji8FF6Tex; + +#define dgMsgKanji8FF7Tex "__OTR__textures/kanji/gMsgKanji8FF7Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF7Tex[] = dgMsgKanji8FF7Tex; + +#define dgMsgKanji8FF8Tex "__OTR__textures/kanji/gMsgKanji8FF8Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF8Tex[] = dgMsgKanji8FF8Tex; + +#define dgMsgKanji8FF9Tex "__OTR__textures/kanji/gMsgKanji8FF9Tex" +static const ALIGN_ASSET(2) char gMsgKanji8FF9Tex[] = dgMsgKanji8FF9Tex; + +#define dgMsgKanji8FFATex "__OTR__textures/kanji/gMsgKanji8FFATex" +static const ALIGN_ASSET(2) char gMsgKanji8FFATex[] = dgMsgKanji8FFATex; + +#define dgMsgKanji8FFBTex "__OTR__textures/kanji/gMsgKanji8FFBTex" +static const ALIGN_ASSET(2) char gMsgKanji8FFBTex[] = dgMsgKanji8FFBTex; + +#define dgMsgKanji8FFCTex "__OTR__textures/kanji/gMsgKanji8FFCTex" +static const ALIGN_ASSET(2) char gMsgKanji8FFCTex[] = dgMsgKanji8FFCTex; + +#define dgMsgKanji9040Tex "__OTR__textures/kanji/gMsgKanji9040Tex" +static const ALIGN_ASSET(2) char gMsgKanji9040Tex[] = dgMsgKanji9040Tex; + +#define dgMsgKanji9041Tex "__OTR__textures/kanji/gMsgKanji9041Tex" +static const ALIGN_ASSET(2) char gMsgKanji9041Tex[] = dgMsgKanji9041Tex; + +#define dgMsgKanji9042Tex "__OTR__textures/kanji/gMsgKanji9042Tex" +static const ALIGN_ASSET(2) char gMsgKanji9042Tex[] = dgMsgKanji9042Tex; + +#define dgMsgKanji9043Tex "__OTR__textures/kanji/gMsgKanji9043Tex" +static const ALIGN_ASSET(2) char gMsgKanji9043Tex[] = dgMsgKanji9043Tex; + +#define dgMsgKanji9044Tex "__OTR__textures/kanji/gMsgKanji9044Tex" +static const ALIGN_ASSET(2) char gMsgKanji9044Tex[] = dgMsgKanji9044Tex; + +#define dgMsgKanji9045Tex "__OTR__textures/kanji/gMsgKanji9045Tex" +static const ALIGN_ASSET(2) char gMsgKanji9045Tex[] = dgMsgKanji9045Tex; + +#define dgMsgKanji9046Tex "__OTR__textures/kanji/gMsgKanji9046Tex" +static const ALIGN_ASSET(2) char gMsgKanji9046Tex[] = dgMsgKanji9046Tex; + +#define dgMsgKanji9047Tex "__OTR__textures/kanji/gMsgKanji9047Tex" +static const ALIGN_ASSET(2) char gMsgKanji9047Tex[] = dgMsgKanji9047Tex; + +#define dgMsgKanji9048Tex "__OTR__textures/kanji/gMsgKanji9048Tex" +static const ALIGN_ASSET(2) char gMsgKanji9048Tex[] = dgMsgKanji9048Tex; + +#define dgMsgKanji9049Tex "__OTR__textures/kanji/gMsgKanji9049Tex" +static const ALIGN_ASSET(2) char gMsgKanji9049Tex[] = dgMsgKanji9049Tex; + +#define dgMsgKanji904ATex "__OTR__textures/kanji/gMsgKanji904ATex" +static const ALIGN_ASSET(2) char gMsgKanji904ATex[] = dgMsgKanji904ATex; + +#define dgMsgKanji904BTex "__OTR__textures/kanji/gMsgKanji904BTex" +static const ALIGN_ASSET(2) char gMsgKanji904BTex[] = dgMsgKanji904BTex; + +#define dgMsgKanji904CTex "__OTR__textures/kanji/gMsgKanji904CTex" +static const ALIGN_ASSET(2) char gMsgKanji904CTex[] = dgMsgKanji904CTex; + +#define dgMsgKanji904DTex "__OTR__textures/kanji/gMsgKanji904DTex" +static const ALIGN_ASSET(2) char gMsgKanji904DTex[] = dgMsgKanji904DTex; + +#define dgMsgKanji904ETex "__OTR__textures/kanji/gMsgKanji904ETex" +static const ALIGN_ASSET(2) char gMsgKanji904ETex[] = dgMsgKanji904ETex; + +#define dgMsgKanji904FTex "__OTR__textures/kanji/gMsgKanji904FTex" +static const ALIGN_ASSET(2) char gMsgKanji904FTex[] = dgMsgKanji904FTex; + +#define dgMsgKanji9050Tex "__OTR__textures/kanji/gMsgKanji9050Tex" +static const ALIGN_ASSET(2) char gMsgKanji9050Tex[] = dgMsgKanji9050Tex; + +#define dgMsgKanji9051Tex "__OTR__textures/kanji/gMsgKanji9051Tex" +static const ALIGN_ASSET(2) char gMsgKanji9051Tex[] = dgMsgKanji9051Tex; + +#define dgMsgKanji9052Tex "__OTR__textures/kanji/gMsgKanji9052Tex" +static const ALIGN_ASSET(2) char gMsgKanji9052Tex[] = dgMsgKanji9052Tex; + +#define dgMsgKanji9053Tex "__OTR__textures/kanji/gMsgKanji9053Tex" +static const ALIGN_ASSET(2) char gMsgKanji9053Tex[] = dgMsgKanji9053Tex; + +#define dgMsgKanji9054Tex "__OTR__textures/kanji/gMsgKanji9054Tex" +static const ALIGN_ASSET(2) char gMsgKanji9054Tex[] = dgMsgKanji9054Tex; + +#define dgMsgKanji9055Tex "__OTR__textures/kanji/gMsgKanji9055Tex" +static const ALIGN_ASSET(2) char gMsgKanji9055Tex[] = dgMsgKanji9055Tex; + +#define dgMsgKanji9056Tex "__OTR__textures/kanji/gMsgKanji9056Tex" +static const ALIGN_ASSET(2) char gMsgKanji9056Tex[] = dgMsgKanji9056Tex; + +#define dgMsgKanji9057Tex "__OTR__textures/kanji/gMsgKanji9057Tex" +static const ALIGN_ASSET(2) char gMsgKanji9057Tex[] = dgMsgKanji9057Tex; + +#define dgMsgKanji9058Tex "__OTR__textures/kanji/gMsgKanji9058Tex" +static const ALIGN_ASSET(2) char gMsgKanji9058Tex[] = dgMsgKanji9058Tex; + +#define dgMsgKanji9059Tex "__OTR__textures/kanji/gMsgKanji9059Tex" +static const ALIGN_ASSET(2) char gMsgKanji9059Tex[] = dgMsgKanji9059Tex; + +#define dgMsgKanji905ATex "__OTR__textures/kanji/gMsgKanji905ATex" +static const ALIGN_ASSET(2) char gMsgKanji905ATex[] = dgMsgKanji905ATex; + +#define dgMsgKanji905BTex "__OTR__textures/kanji/gMsgKanji905BTex" +static const ALIGN_ASSET(2) char gMsgKanji905BTex[] = dgMsgKanji905BTex; + +#define dgMsgKanji905CTex "__OTR__textures/kanji/gMsgKanji905CTex" +static const ALIGN_ASSET(2) char gMsgKanji905CTex[] = dgMsgKanji905CTex; + +#define dgMsgKanji905DTex "__OTR__textures/kanji/gMsgKanji905DTex" +static const ALIGN_ASSET(2) char gMsgKanji905DTex[] = dgMsgKanji905DTex; + +#define dgMsgKanji905ETex "__OTR__textures/kanji/gMsgKanji905ETex" +static const ALIGN_ASSET(2) char gMsgKanji905ETex[] = dgMsgKanji905ETex; + +#define dgMsgKanji905FTex "__OTR__textures/kanji/gMsgKanji905FTex" +static const ALIGN_ASSET(2) char gMsgKanji905FTex[] = dgMsgKanji905FTex; + +#define dgMsgKanji9060Tex "__OTR__textures/kanji/gMsgKanji9060Tex" +static const ALIGN_ASSET(2) char gMsgKanji9060Tex[] = dgMsgKanji9060Tex; + +#define dgMsgKanji9061Tex "__OTR__textures/kanji/gMsgKanji9061Tex" +static const ALIGN_ASSET(2) char gMsgKanji9061Tex[] = dgMsgKanji9061Tex; + +#define dgMsgKanji9062Tex "__OTR__textures/kanji/gMsgKanji9062Tex" +static const ALIGN_ASSET(2) char gMsgKanji9062Tex[] = dgMsgKanji9062Tex; + +#define dgMsgKanji9063Tex "__OTR__textures/kanji/gMsgKanji9063Tex" +static const ALIGN_ASSET(2) char gMsgKanji9063Tex[] = dgMsgKanji9063Tex; + +#define dgMsgKanji9064Tex "__OTR__textures/kanji/gMsgKanji9064Tex" +static const ALIGN_ASSET(2) char gMsgKanji9064Tex[] = dgMsgKanji9064Tex; + +#define dgMsgKanji9065Tex "__OTR__textures/kanji/gMsgKanji9065Tex" +static const ALIGN_ASSET(2) char gMsgKanji9065Tex[] = dgMsgKanji9065Tex; + +#define dgMsgKanji9066Tex "__OTR__textures/kanji/gMsgKanji9066Tex" +static const ALIGN_ASSET(2) char gMsgKanji9066Tex[] = dgMsgKanji9066Tex; + +#define dgMsgKanji9067Tex "__OTR__textures/kanji/gMsgKanji9067Tex" +static const ALIGN_ASSET(2) char gMsgKanji9067Tex[] = dgMsgKanji9067Tex; + +#define dgMsgKanji9068Tex "__OTR__textures/kanji/gMsgKanji9068Tex" +static const ALIGN_ASSET(2) char gMsgKanji9068Tex[] = dgMsgKanji9068Tex; + +#define dgMsgKanji9069Tex "__OTR__textures/kanji/gMsgKanji9069Tex" +static const ALIGN_ASSET(2) char gMsgKanji9069Tex[] = dgMsgKanji9069Tex; + +#define dgMsgKanji906ATex "__OTR__textures/kanji/gMsgKanji906ATex" +static const ALIGN_ASSET(2) char gMsgKanji906ATex[] = dgMsgKanji906ATex; + +#define dgMsgKanji906BTex "__OTR__textures/kanji/gMsgKanji906BTex" +static const ALIGN_ASSET(2) char gMsgKanji906BTex[] = dgMsgKanji906BTex; + +#define dgMsgKanji906CTex "__OTR__textures/kanji/gMsgKanji906CTex" +static const ALIGN_ASSET(2) char gMsgKanji906CTex[] = dgMsgKanji906CTex; + +#define dgMsgKanji906DTex "__OTR__textures/kanji/gMsgKanji906DTex" +static const ALIGN_ASSET(2) char gMsgKanji906DTex[] = dgMsgKanji906DTex; + +#define dgMsgKanji906ETex "__OTR__textures/kanji/gMsgKanji906ETex" +static const ALIGN_ASSET(2) char gMsgKanji906ETex[] = dgMsgKanji906ETex; + +#define dgMsgKanji906FTex "__OTR__textures/kanji/gMsgKanji906FTex" +static const ALIGN_ASSET(2) char gMsgKanji906FTex[] = dgMsgKanji906FTex; + +#define dgMsgKanji9070Tex "__OTR__textures/kanji/gMsgKanji9070Tex" +static const ALIGN_ASSET(2) char gMsgKanji9070Tex[] = dgMsgKanji9070Tex; + +#define dgMsgKanji9071Tex "__OTR__textures/kanji/gMsgKanji9071Tex" +static const ALIGN_ASSET(2) char gMsgKanji9071Tex[] = dgMsgKanji9071Tex; + +#define dgMsgKanji9072Tex "__OTR__textures/kanji/gMsgKanji9072Tex" +static const ALIGN_ASSET(2) char gMsgKanji9072Tex[] = dgMsgKanji9072Tex; + +#define dgMsgKanji9073Tex "__OTR__textures/kanji/gMsgKanji9073Tex" +static const ALIGN_ASSET(2) char gMsgKanji9073Tex[] = dgMsgKanji9073Tex; + +#define dgMsgKanji9074Tex "__OTR__textures/kanji/gMsgKanji9074Tex" +static const ALIGN_ASSET(2) char gMsgKanji9074Tex[] = dgMsgKanji9074Tex; + +#define dgMsgKanji9075Tex "__OTR__textures/kanji/gMsgKanji9075Tex" +static const ALIGN_ASSET(2) char gMsgKanji9075Tex[] = dgMsgKanji9075Tex; + +#define dgMsgKanji9076Tex "__OTR__textures/kanji/gMsgKanji9076Tex" +static const ALIGN_ASSET(2) char gMsgKanji9076Tex[] = dgMsgKanji9076Tex; + +#define dgMsgKanji9077Tex "__OTR__textures/kanji/gMsgKanji9077Tex" +static const ALIGN_ASSET(2) char gMsgKanji9077Tex[] = dgMsgKanji9077Tex; + +#define dgMsgKanji9078Tex "__OTR__textures/kanji/gMsgKanji9078Tex" +static const ALIGN_ASSET(2) char gMsgKanji9078Tex[] = dgMsgKanji9078Tex; + +#define dgMsgKanji9079Tex "__OTR__textures/kanji/gMsgKanji9079Tex" +static const ALIGN_ASSET(2) char gMsgKanji9079Tex[] = dgMsgKanji9079Tex; + +#define dgMsgKanji907ATex "__OTR__textures/kanji/gMsgKanji907ATex" +static const ALIGN_ASSET(2) char gMsgKanji907ATex[] = dgMsgKanji907ATex; + +#define dgMsgKanji907BTex "__OTR__textures/kanji/gMsgKanji907BTex" +static const ALIGN_ASSET(2) char gMsgKanji907BTex[] = dgMsgKanji907BTex; + +#define dgMsgKanji907CTex "__OTR__textures/kanji/gMsgKanji907CTex" +static const ALIGN_ASSET(2) char gMsgKanji907CTex[] = dgMsgKanji907CTex; + +#define dgMsgKanji907DTex "__OTR__textures/kanji/gMsgKanji907DTex" +static const ALIGN_ASSET(2) char gMsgKanji907DTex[] = dgMsgKanji907DTex; + +#define dgMsgKanji907ETex "__OTR__textures/kanji/gMsgKanji907ETex" +static const ALIGN_ASSET(2) char gMsgKanji907ETex[] = dgMsgKanji907ETex; + +#define dgMsgKanji9080Tex "__OTR__textures/kanji/gMsgKanji9080Tex" +static const ALIGN_ASSET(2) char gMsgKanji9080Tex[] = dgMsgKanji9080Tex; + +#define dgMsgKanji9081Tex "__OTR__textures/kanji/gMsgKanji9081Tex" +static const ALIGN_ASSET(2) char gMsgKanji9081Tex[] = dgMsgKanji9081Tex; + +#define dgMsgKanji9082Tex "__OTR__textures/kanji/gMsgKanji9082Tex" +static const ALIGN_ASSET(2) char gMsgKanji9082Tex[] = dgMsgKanji9082Tex; + +#define dgMsgKanji9083Tex "__OTR__textures/kanji/gMsgKanji9083Tex" +static const ALIGN_ASSET(2) char gMsgKanji9083Tex[] = dgMsgKanji9083Tex; + +#define dgMsgKanji9084Tex "__OTR__textures/kanji/gMsgKanji9084Tex" +static const ALIGN_ASSET(2) char gMsgKanji9084Tex[] = dgMsgKanji9084Tex; + +#define dgMsgKanji9085Tex "__OTR__textures/kanji/gMsgKanji9085Tex" +static const ALIGN_ASSET(2) char gMsgKanji9085Tex[] = dgMsgKanji9085Tex; + +#define dgMsgKanji9086Tex "__OTR__textures/kanji/gMsgKanji9086Tex" +static const ALIGN_ASSET(2) char gMsgKanji9086Tex[] = dgMsgKanji9086Tex; + +#define dgMsgKanji9087Tex "__OTR__textures/kanji/gMsgKanji9087Tex" +static const ALIGN_ASSET(2) char gMsgKanji9087Tex[] = dgMsgKanji9087Tex; + +#define dgMsgKanji9088Tex "__OTR__textures/kanji/gMsgKanji9088Tex" +static const ALIGN_ASSET(2) char gMsgKanji9088Tex[] = dgMsgKanji9088Tex; + +#define dgMsgKanji9089Tex "__OTR__textures/kanji/gMsgKanji9089Tex" +static const ALIGN_ASSET(2) char gMsgKanji9089Tex[] = dgMsgKanji9089Tex; + +#define dgMsgKanji908ATex "__OTR__textures/kanji/gMsgKanji908ATex" +static const ALIGN_ASSET(2) char gMsgKanji908ATex[] = dgMsgKanji908ATex; + +#define dgMsgKanji908BTex "__OTR__textures/kanji/gMsgKanji908BTex" +static const ALIGN_ASSET(2) char gMsgKanji908BTex[] = dgMsgKanji908BTex; + +#define dgMsgKanji908CTex "__OTR__textures/kanji/gMsgKanji908CTex" +static const ALIGN_ASSET(2) char gMsgKanji908CTex[] = dgMsgKanji908CTex; + +#define dgMsgKanji908DTex "__OTR__textures/kanji/gMsgKanji908DTex" +static const ALIGN_ASSET(2) char gMsgKanji908DTex[] = dgMsgKanji908DTex; + +#define dgMsgKanji908ETex "__OTR__textures/kanji/gMsgKanji908ETex" +static const ALIGN_ASSET(2) char gMsgKanji908ETex[] = dgMsgKanji908ETex; + +#define dgMsgKanji908FTex "__OTR__textures/kanji/gMsgKanji908FTex" +static const ALIGN_ASSET(2) char gMsgKanji908FTex[] = dgMsgKanji908FTex; + +#define dgMsgKanji9090Tex "__OTR__textures/kanji/gMsgKanji9090Tex" +static const ALIGN_ASSET(2) char gMsgKanji9090Tex[] = dgMsgKanji9090Tex; + +#define dgMsgKanji9091Tex "__OTR__textures/kanji/gMsgKanji9091Tex" +static const ALIGN_ASSET(2) char gMsgKanji9091Tex[] = dgMsgKanji9091Tex; + +#define dgMsgKanji9092Tex "__OTR__textures/kanji/gMsgKanji9092Tex" +static const ALIGN_ASSET(2) char gMsgKanji9092Tex[] = dgMsgKanji9092Tex; + +#define dgMsgKanji9093Tex "__OTR__textures/kanji/gMsgKanji9093Tex" +static const ALIGN_ASSET(2) char gMsgKanji9093Tex[] = dgMsgKanji9093Tex; + +#define dgMsgKanji9094Tex "__OTR__textures/kanji/gMsgKanji9094Tex" +static const ALIGN_ASSET(2) char gMsgKanji9094Tex[] = dgMsgKanji9094Tex; + +#define dgMsgKanji9095Tex "__OTR__textures/kanji/gMsgKanji9095Tex" +static const ALIGN_ASSET(2) char gMsgKanji9095Tex[] = dgMsgKanji9095Tex; + +#define dgMsgKanji9096Tex "__OTR__textures/kanji/gMsgKanji9096Tex" +static const ALIGN_ASSET(2) char gMsgKanji9096Tex[] = dgMsgKanji9096Tex; + +#define dgMsgKanji9097Tex "__OTR__textures/kanji/gMsgKanji9097Tex" +static const ALIGN_ASSET(2) char gMsgKanji9097Tex[] = dgMsgKanji9097Tex; + +#define dgMsgKanji9098Tex "__OTR__textures/kanji/gMsgKanji9098Tex" +static const ALIGN_ASSET(2) char gMsgKanji9098Tex[] = dgMsgKanji9098Tex; + +#define dgMsgKanji9099Tex "__OTR__textures/kanji/gMsgKanji9099Tex" +static const ALIGN_ASSET(2) char gMsgKanji9099Tex[] = dgMsgKanji9099Tex; + +#define dgMsgKanji909ATex "__OTR__textures/kanji/gMsgKanji909ATex" +static const ALIGN_ASSET(2) char gMsgKanji909ATex[] = dgMsgKanji909ATex; + +#define dgMsgKanji909BTex "__OTR__textures/kanji/gMsgKanji909BTex" +static const ALIGN_ASSET(2) char gMsgKanji909BTex[] = dgMsgKanji909BTex; + +#define dgMsgKanji909CTex "__OTR__textures/kanji/gMsgKanji909CTex" +static const ALIGN_ASSET(2) char gMsgKanji909CTex[] = dgMsgKanji909CTex; + +#define dgMsgKanji909DTex "__OTR__textures/kanji/gMsgKanji909DTex" +static const ALIGN_ASSET(2) char gMsgKanji909DTex[] = dgMsgKanji909DTex; + +#define dgMsgKanji909ETex "__OTR__textures/kanji/gMsgKanji909ETex" +static const ALIGN_ASSET(2) char gMsgKanji909ETex[] = dgMsgKanji909ETex; + +#define dgMsgKanji909FTex "__OTR__textures/kanji/gMsgKanji909FTex" +static const ALIGN_ASSET(2) char gMsgKanji909FTex[] = dgMsgKanji909FTex; + +#define dgMsgKanji90A0Tex "__OTR__textures/kanji/gMsgKanji90A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A0Tex[] = dgMsgKanji90A0Tex; + +#define dgMsgKanji90A1Tex "__OTR__textures/kanji/gMsgKanji90A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A1Tex[] = dgMsgKanji90A1Tex; + +#define dgMsgKanji90A2Tex "__OTR__textures/kanji/gMsgKanji90A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A2Tex[] = dgMsgKanji90A2Tex; + +#define dgMsgKanji90A3Tex "__OTR__textures/kanji/gMsgKanji90A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A3Tex[] = dgMsgKanji90A3Tex; + +#define dgMsgKanji90A4Tex "__OTR__textures/kanji/gMsgKanji90A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A4Tex[] = dgMsgKanji90A4Tex; + +#define dgMsgKanji90A5Tex "__OTR__textures/kanji/gMsgKanji90A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A5Tex[] = dgMsgKanji90A5Tex; + +#define dgMsgKanji90A6Tex "__OTR__textures/kanji/gMsgKanji90A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A6Tex[] = dgMsgKanji90A6Tex; + +#define dgMsgKanji90A7Tex "__OTR__textures/kanji/gMsgKanji90A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A7Tex[] = dgMsgKanji90A7Tex; + +#define dgMsgKanji90A8Tex "__OTR__textures/kanji/gMsgKanji90A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A8Tex[] = dgMsgKanji90A8Tex; + +#define dgMsgKanji90A9Tex "__OTR__textures/kanji/gMsgKanji90A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90A9Tex[] = dgMsgKanji90A9Tex; + +#define dgMsgKanji90AATex "__OTR__textures/kanji/gMsgKanji90AATex" +static const ALIGN_ASSET(2) char gMsgKanji90AATex[] = dgMsgKanji90AATex; + +#define dgMsgKanji90ABTex "__OTR__textures/kanji/gMsgKanji90ABTex" +static const ALIGN_ASSET(2) char gMsgKanji90ABTex[] = dgMsgKanji90ABTex; + +#define dgMsgKanji90ACTex "__OTR__textures/kanji/gMsgKanji90ACTex" +static const ALIGN_ASSET(2) char gMsgKanji90ACTex[] = dgMsgKanji90ACTex; + +#define dgMsgKanji90ADTex "__OTR__textures/kanji/gMsgKanji90ADTex" +static const ALIGN_ASSET(2) char gMsgKanji90ADTex[] = dgMsgKanji90ADTex; + +#define dgMsgKanji90AETex "__OTR__textures/kanji/gMsgKanji90AETex" +static const ALIGN_ASSET(2) char gMsgKanji90AETex[] = dgMsgKanji90AETex; + +#define dgMsgKanji90AFTex "__OTR__textures/kanji/gMsgKanji90AFTex" +static const ALIGN_ASSET(2) char gMsgKanji90AFTex[] = dgMsgKanji90AFTex; + +#define dgMsgKanji90B0Tex "__OTR__textures/kanji/gMsgKanji90B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B0Tex[] = dgMsgKanji90B0Tex; + +#define dgMsgKanji90B1Tex "__OTR__textures/kanji/gMsgKanji90B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B1Tex[] = dgMsgKanji90B1Tex; + +#define dgMsgKanji90B2Tex "__OTR__textures/kanji/gMsgKanji90B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B2Tex[] = dgMsgKanji90B2Tex; + +#define dgMsgKanji90B3Tex "__OTR__textures/kanji/gMsgKanji90B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B3Tex[] = dgMsgKanji90B3Tex; + +#define dgMsgKanji90B4Tex "__OTR__textures/kanji/gMsgKanji90B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B4Tex[] = dgMsgKanji90B4Tex; + +#define dgMsgKanji90B5Tex "__OTR__textures/kanji/gMsgKanji90B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B5Tex[] = dgMsgKanji90B5Tex; + +#define dgMsgKanji90B6Tex "__OTR__textures/kanji/gMsgKanji90B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B6Tex[] = dgMsgKanji90B6Tex; + +#define dgMsgKanji90B7Tex "__OTR__textures/kanji/gMsgKanji90B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B7Tex[] = dgMsgKanji90B7Tex; + +#define dgMsgKanji90B8Tex "__OTR__textures/kanji/gMsgKanji90B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B8Tex[] = dgMsgKanji90B8Tex; + +#define dgMsgKanji90B9Tex "__OTR__textures/kanji/gMsgKanji90B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90B9Tex[] = dgMsgKanji90B9Tex; + +#define dgMsgKanji90BATex "__OTR__textures/kanji/gMsgKanji90BATex" +static const ALIGN_ASSET(2) char gMsgKanji90BATex[] = dgMsgKanji90BATex; + +#define dgMsgKanji90BBTex "__OTR__textures/kanji/gMsgKanji90BBTex" +static const ALIGN_ASSET(2) char gMsgKanji90BBTex[] = dgMsgKanji90BBTex; + +#define dgMsgKanji90BCTex "__OTR__textures/kanji/gMsgKanji90BCTex" +static const ALIGN_ASSET(2) char gMsgKanji90BCTex[] = dgMsgKanji90BCTex; + +#define dgMsgKanji90BDTex "__OTR__textures/kanji/gMsgKanji90BDTex" +static const ALIGN_ASSET(2) char gMsgKanji90BDTex[] = dgMsgKanji90BDTex; + +#define dgMsgKanji90BETex "__OTR__textures/kanji/gMsgKanji90BETex" +static const ALIGN_ASSET(2) char gMsgKanji90BETex[] = dgMsgKanji90BETex; + +#define dgMsgKanji90BFTex "__OTR__textures/kanji/gMsgKanji90BFTex" +static const ALIGN_ASSET(2) char gMsgKanji90BFTex[] = dgMsgKanji90BFTex; + +#define dgMsgKanji90C0Tex "__OTR__textures/kanji/gMsgKanji90C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C0Tex[] = dgMsgKanji90C0Tex; + +#define dgMsgKanji90C1Tex "__OTR__textures/kanji/gMsgKanji90C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C1Tex[] = dgMsgKanji90C1Tex; + +#define dgMsgKanji90C2Tex "__OTR__textures/kanji/gMsgKanji90C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C2Tex[] = dgMsgKanji90C2Tex; + +#define dgMsgKanji90C3Tex "__OTR__textures/kanji/gMsgKanji90C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C3Tex[] = dgMsgKanji90C3Tex; + +#define dgMsgKanji90C4Tex "__OTR__textures/kanji/gMsgKanji90C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C4Tex[] = dgMsgKanji90C4Tex; + +#define dgMsgKanji90C5Tex "__OTR__textures/kanji/gMsgKanji90C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C5Tex[] = dgMsgKanji90C5Tex; + +#define dgMsgKanji90C6Tex "__OTR__textures/kanji/gMsgKanji90C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C6Tex[] = dgMsgKanji90C6Tex; + +#define dgMsgKanji90C7Tex "__OTR__textures/kanji/gMsgKanji90C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C7Tex[] = dgMsgKanji90C7Tex; + +#define dgMsgKanji90C8Tex "__OTR__textures/kanji/gMsgKanji90C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C8Tex[] = dgMsgKanji90C8Tex; + +#define dgMsgKanji90C9Tex "__OTR__textures/kanji/gMsgKanji90C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90C9Tex[] = dgMsgKanji90C9Tex; + +#define dgMsgKanji90CATex "__OTR__textures/kanji/gMsgKanji90CATex" +static const ALIGN_ASSET(2) char gMsgKanji90CATex[] = dgMsgKanji90CATex; + +#define dgMsgKanji90CBTex "__OTR__textures/kanji/gMsgKanji90CBTex" +static const ALIGN_ASSET(2) char gMsgKanji90CBTex[] = dgMsgKanji90CBTex; + +#define dgMsgKanji90CCTex "__OTR__textures/kanji/gMsgKanji90CCTex" +static const ALIGN_ASSET(2) char gMsgKanji90CCTex[] = dgMsgKanji90CCTex; + +#define dgMsgKanji90CDTex "__OTR__textures/kanji/gMsgKanji90CDTex" +static const ALIGN_ASSET(2) char gMsgKanji90CDTex[] = dgMsgKanji90CDTex; + +#define dgMsgKanji90CETex "__OTR__textures/kanji/gMsgKanji90CETex" +static const ALIGN_ASSET(2) char gMsgKanji90CETex[] = dgMsgKanji90CETex; + +#define dgMsgKanji90CFTex "__OTR__textures/kanji/gMsgKanji90CFTex" +static const ALIGN_ASSET(2) char gMsgKanji90CFTex[] = dgMsgKanji90CFTex; + +#define dgMsgKanji90D0Tex "__OTR__textures/kanji/gMsgKanji90D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D0Tex[] = dgMsgKanji90D0Tex; + +#define dgMsgKanji90D1Tex "__OTR__textures/kanji/gMsgKanji90D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D1Tex[] = dgMsgKanji90D1Tex; + +#define dgMsgKanji90D2Tex "__OTR__textures/kanji/gMsgKanji90D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D2Tex[] = dgMsgKanji90D2Tex; + +#define dgMsgKanji90D3Tex "__OTR__textures/kanji/gMsgKanji90D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D3Tex[] = dgMsgKanji90D3Tex; + +#define dgMsgKanji90D4Tex "__OTR__textures/kanji/gMsgKanji90D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D4Tex[] = dgMsgKanji90D4Tex; + +#define dgMsgKanji90D5Tex "__OTR__textures/kanji/gMsgKanji90D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D5Tex[] = dgMsgKanji90D5Tex; + +#define dgMsgKanji90D6Tex "__OTR__textures/kanji/gMsgKanji90D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D6Tex[] = dgMsgKanji90D6Tex; + +#define dgMsgKanji90D7Tex "__OTR__textures/kanji/gMsgKanji90D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D7Tex[] = dgMsgKanji90D7Tex; + +#define dgMsgKanji90D8Tex "__OTR__textures/kanji/gMsgKanji90D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D8Tex[] = dgMsgKanji90D8Tex; + +#define dgMsgKanji90D9Tex "__OTR__textures/kanji/gMsgKanji90D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90D9Tex[] = dgMsgKanji90D9Tex; + +#define dgMsgKanji90DATex "__OTR__textures/kanji/gMsgKanji90DATex" +static const ALIGN_ASSET(2) char gMsgKanji90DATex[] = dgMsgKanji90DATex; + +#define dgMsgKanji90DBTex "__OTR__textures/kanji/gMsgKanji90DBTex" +static const ALIGN_ASSET(2) char gMsgKanji90DBTex[] = dgMsgKanji90DBTex; + +#define dgMsgKanji90DCTex "__OTR__textures/kanji/gMsgKanji90DCTex" +static const ALIGN_ASSET(2) char gMsgKanji90DCTex[] = dgMsgKanji90DCTex; + +#define dgMsgKanji90DDTex "__OTR__textures/kanji/gMsgKanji90DDTex" +static const ALIGN_ASSET(2) char gMsgKanji90DDTex[] = dgMsgKanji90DDTex; + +#define dgMsgKanji90DETex "__OTR__textures/kanji/gMsgKanji90DETex" +static const ALIGN_ASSET(2) char gMsgKanji90DETex[] = dgMsgKanji90DETex; + +#define dgMsgKanji90DFTex "__OTR__textures/kanji/gMsgKanji90DFTex" +static const ALIGN_ASSET(2) char gMsgKanji90DFTex[] = dgMsgKanji90DFTex; + +#define dgMsgKanji90E0Tex "__OTR__textures/kanji/gMsgKanji90E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E0Tex[] = dgMsgKanji90E0Tex; + +#define dgMsgKanji90E1Tex "__OTR__textures/kanji/gMsgKanji90E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E1Tex[] = dgMsgKanji90E1Tex; + +#define dgMsgKanji90E2Tex "__OTR__textures/kanji/gMsgKanji90E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E2Tex[] = dgMsgKanji90E2Tex; + +#define dgMsgKanji90E3Tex "__OTR__textures/kanji/gMsgKanji90E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E3Tex[] = dgMsgKanji90E3Tex; + +#define dgMsgKanji90E4Tex "__OTR__textures/kanji/gMsgKanji90E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E4Tex[] = dgMsgKanji90E4Tex; + +#define dgMsgKanji90E5Tex "__OTR__textures/kanji/gMsgKanji90E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E5Tex[] = dgMsgKanji90E5Tex; + +#define dgMsgKanji90E6Tex "__OTR__textures/kanji/gMsgKanji90E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E6Tex[] = dgMsgKanji90E6Tex; + +#define dgMsgKanji90E7Tex "__OTR__textures/kanji/gMsgKanji90E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E7Tex[] = dgMsgKanji90E7Tex; + +#define dgMsgKanji90E8Tex "__OTR__textures/kanji/gMsgKanji90E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E8Tex[] = dgMsgKanji90E8Tex; + +#define dgMsgKanji90E9Tex "__OTR__textures/kanji/gMsgKanji90E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90E9Tex[] = dgMsgKanji90E9Tex; + +#define dgMsgKanji90EATex "__OTR__textures/kanji/gMsgKanji90EATex" +static const ALIGN_ASSET(2) char gMsgKanji90EATex[] = dgMsgKanji90EATex; + +#define dgMsgKanji90EBTex "__OTR__textures/kanji/gMsgKanji90EBTex" +static const ALIGN_ASSET(2) char gMsgKanji90EBTex[] = dgMsgKanji90EBTex; + +#define dgMsgKanji90ECTex "__OTR__textures/kanji/gMsgKanji90ECTex" +static const ALIGN_ASSET(2) char gMsgKanji90ECTex[] = dgMsgKanji90ECTex; + +#define dgMsgKanji90EDTex "__OTR__textures/kanji/gMsgKanji90EDTex" +static const ALIGN_ASSET(2) char gMsgKanji90EDTex[] = dgMsgKanji90EDTex; + +#define dgMsgKanji90EETex "__OTR__textures/kanji/gMsgKanji90EETex" +static const ALIGN_ASSET(2) char gMsgKanji90EETex[] = dgMsgKanji90EETex; + +#define dgMsgKanji90EFTex "__OTR__textures/kanji/gMsgKanji90EFTex" +static const ALIGN_ASSET(2) char gMsgKanji90EFTex[] = dgMsgKanji90EFTex; + +#define dgMsgKanji90F0Tex "__OTR__textures/kanji/gMsgKanji90F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F0Tex[] = dgMsgKanji90F0Tex; + +#define dgMsgKanji90F1Tex "__OTR__textures/kanji/gMsgKanji90F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F1Tex[] = dgMsgKanji90F1Tex; + +#define dgMsgKanji90F2Tex "__OTR__textures/kanji/gMsgKanji90F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F2Tex[] = dgMsgKanji90F2Tex; + +#define dgMsgKanji90F3Tex "__OTR__textures/kanji/gMsgKanji90F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F3Tex[] = dgMsgKanji90F3Tex; + +#define dgMsgKanji90F4Tex "__OTR__textures/kanji/gMsgKanji90F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F4Tex[] = dgMsgKanji90F4Tex; + +#define dgMsgKanji90F5Tex "__OTR__textures/kanji/gMsgKanji90F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F5Tex[] = dgMsgKanji90F5Tex; + +#define dgMsgKanji90F6Tex "__OTR__textures/kanji/gMsgKanji90F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F6Tex[] = dgMsgKanji90F6Tex; + +#define dgMsgKanji90F7Tex "__OTR__textures/kanji/gMsgKanji90F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F7Tex[] = dgMsgKanji90F7Tex; + +#define dgMsgKanji90F8Tex "__OTR__textures/kanji/gMsgKanji90F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F8Tex[] = dgMsgKanji90F8Tex; + +#define dgMsgKanji90F9Tex "__OTR__textures/kanji/gMsgKanji90F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji90F9Tex[] = dgMsgKanji90F9Tex; + +#define dgMsgKanji90FATex "__OTR__textures/kanji/gMsgKanji90FATex" +static const ALIGN_ASSET(2) char gMsgKanji90FATex[] = dgMsgKanji90FATex; + +#define dgMsgKanji90FBTex "__OTR__textures/kanji/gMsgKanji90FBTex" +static const ALIGN_ASSET(2) char gMsgKanji90FBTex[] = dgMsgKanji90FBTex; + +#define dgMsgKanji90FCTex "__OTR__textures/kanji/gMsgKanji90FCTex" +static const ALIGN_ASSET(2) char gMsgKanji90FCTex[] = dgMsgKanji90FCTex; + +#define dgMsgKanji9140Tex "__OTR__textures/kanji/gMsgKanji9140Tex" +static const ALIGN_ASSET(2) char gMsgKanji9140Tex[] = dgMsgKanji9140Tex; + +#define dgMsgKanji9141Tex "__OTR__textures/kanji/gMsgKanji9141Tex" +static const ALIGN_ASSET(2) char gMsgKanji9141Tex[] = dgMsgKanji9141Tex; + +#define dgMsgKanji9142Tex "__OTR__textures/kanji/gMsgKanji9142Tex" +static const ALIGN_ASSET(2) char gMsgKanji9142Tex[] = dgMsgKanji9142Tex; + +#define dgMsgKanji9143Tex "__OTR__textures/kanji/gMsgKanji9143Tex" +static const ALIGN_ASSET(2) char gMsgKanji9143Tex[] = dgMsgKanji9143Tex; + +#define dgMsgKanji9144Tex "__OTR__textures/kanji/gMsgKanji9144Tex" +static const ALIGN_ASSET(2) char gMsgKanji9144Tex[] = dgMsgKanji9144Tex; + +#define dgMsgKanji9145Tex "__OTR__textures/kanji/gMsgKanji9145Tex" +static const ALIGN_ASSET(2) char gMsgKanji9145Tex[] = dgMsgKanji9145Tex; + +#define dgMsgKanji9146Tex "__OTR__textures/kanji/gMsgKanji9146Tex" +static const ALIGN_ASSET(2) char gMsgKanji9146Tex[] = dgMsgKanji9146Tex; + +#define dgMsgKanji9147Tex "__OTR__textures/kanji/gMsgKanji9147Tex" +static const ALIGN_ASSET(2) char gMsgKanji9147Tex[] = dgMsgKanji9147Tex; + +#define dgMsgKanji9148Tex "__OTR__textures/kanji/gMsgKanji9148Tex" +static const ALIGN_ASSET(2) char gMsgKanji9148Tex[] = dgMsgKanji9148Tex; + +#define dgMsgKanji9149Tex "__OTR__textures/kanji/gMsgKanji9149Tex" +static const ALIGN_ASSET(2) char gMsgKanji9149Tex[] = dgMsgKanji9149Tex; + +#define dgMsgKanji914ATex "__OTR__textures/kanji/gMsgKanji914ATex" +static const ALIGN_ASSET(2) char gMsgKanji914ATex[] = dgMsgKanji914ATex; + +#define dgMsgKanji914BTex "__OTR__textures/kanji/gMsgKanji914BTex" +static const ALIGN_ASSET(2) char gMsgKanji914BTex[] = dgMsgKanji914BTex; + +#define dgMsgKanji914CTex "__OTR__textures/kanji/gMsgKanji914CTex" +static const ALIGN_ASSET(2) char gMsgKanji914CTex[] = dgMsgKanji914CTex; + +#define dgMsgKanji914DTex "__OTR__textures/kanji/gMsgKanji914DTex" +static const ALIGN_ASSET(2) char gMsgKanji914DTex[] = dgMsgKanji914DTex; + +#define dgMsgKanji914ETex "__OTR__textures/kanji/gMsgKanji914ETex" +static const ALIGN_ASSET(2) char gMsgKanji914ETex[] = dgMsgKanji914ETex; + +#define dgMsgKanji914FTex "__OTR__textures/kanji/gMsgKanji914FTex" +static const ALIGN_ASSET(2) char gMsgKanji914FTex[] = dgMsgKanji914FTex; + +#define dgMsgKanji9150Tex "__OTR__textures/kanji/gMsgKanji9150Tex" +static const ALIGN_ASSET(2) char gMsgKanji9150Tex[] = dgMsgKanji9150Tex; + +#define dgMsgKanji9151Tex "__OTR__textures/kanji/gMsgKanji9151Tex" +static const ALIGN_ASSET(2) char gMsgKanji9151Tex[] = dgMsgKanji9151Tex; + +#define dgMsgKanji9152Tex "__OTR__textures/kanji/gMsgKanji9152Tex" +static const ALIGN_ASSET(2) char gMsgKanji9152Tex[] = dgMsgKanji9152Tex; + +#define dgMsgKanji9153Tex "__OTR__textures/kanji/gMsgKanji9153Tex" +static const ALIGN_ASSET(2) char gMsgKanji9153Tex[] = dgMsgKanji9153Tex; + +#define dgMsgKanji9154Tex "__OTR__textures/kanji/gMsgKanji9154Tex" +static const ALIGN_ASSET(2) char gMsgKanji9154Tex[] = dgMsgKanji9154Tex; + +#define dgMsgKanji9155Tex "__OTR__textures/kanji/gMsgKanji9155Tex" +static const ALIGN_ASSET(2) char gMsgKanji9155Tex[] = dgMsgKanji9155Tex; + +#define dgMsgKanji9156Tex "__OTR__textures/kanji/gMsgKanji9156Tex" +static const ALIGN_ASSET(2) char gMsgKanji9156Tex[] = dgMsgKanji9156Tex; + +#define dgMsgKanji9157Tex "__OTR__textures/kanji/gMsgKanji9157Tex" +static const ALIGN_ASSET(2) char gMsgKanji9157Tex[] = dgMsgKanji9157Tex; + +#define dgMsgKanji9158Tex "__OTR__textures/kanji/gMsgKanji9158Tex" +static const ALIGN_ASSET(2) char gMsgKanji9158Tex[] = dgMsgKanji9158Tex; + +#define dgMsgKanji9159Tex "__OTR__textures/kanji/gMsgKanji9159Tex" +static const ALIGN_ASSET(2) char gMsgKanji9159Tex[] = dgMsgKanji9159Tex; + +#define dgMsgKanji915ATex "__OTR__textures/kanji/gMsgKanji915ATex" +static const ALIGN_ASSET(2) char gMsgKanji915ATex[] = dgMsgKanji915ATex; + +#define dgMsgKanji915BTex "__OTR__textures/kanji/gMsgKanji915BTex" +static const ALIGN_ASSET(2) char gMsgKanji915BTex[] = dgMsgKanji915BTex; + +#define dgMsgKanji915CTex "__OTR__textures/kanji/gMsgKanji915CTex" +static const ALIGN_ASSET(2) char gMsgKanji915CTex[] = dgMsgKanji915CTex; + +#define dgMsgKanji915DTex "__OTR__textures/kanji/gMsgKanji915DTex" +static const ALIGN_ASSET(2) char gMsgKanji915DTex[] = dgMsgKanji915DTex; + +#define dgMsgKanji915ETex "__OTR__textures/kanji/gMsgKanji915ETex" +static const ALIGN_ASSET(2) char gMsgKanji915ETex[] = dgMsgKanji915ETex; + +#define dgMsgKanji915FTex "__OTR__textures/kanji/gMsgKanji915FTex" +static const ALIGN_ASSET(2) char gMsgKanji915FTex[] = dgMsgKanji915FTex; + +#define dgMsgKanji9160Tex "__OTR__textures/kanji/gMsgKanji9160Tex" +static const ALIGN_ASSET(2) char gMsgKanji9160Tex[] = dgMsgKanji9160Tex; + +#define dgMsgKanji9161Tex "__OTR__textures/kanji/gMsgKanji9161Tex" +static const ALIGN_ASSET(2) char gMsgKanji9161Tex[] = dgMsgKanji9161Tex; + +#define dgMsgKanji9162Tex "__OTR__textures/kanji/gMsgKanji9162Tex" +static const ALIGN_ASSET(2) char gMsgKanji9162Tex[] = dgMsgKanji9162Tex; + +#define dgMsgKanji9163Tex "__OTR__textures/kanji/gMsgKanji9163Tex" +static const ALIGN_ASSET(2) char gMsgKanji9163Tex[] = dgMsgKanji9163Tex; + +#define dgMsgKanji9164Tex "__OTR__textures/kanji/gMsgKanji9164Tex" +static const ALIGN_ASSET(2) char gMsgKanji9164Tex[] = dgMsgKanji9164Tex; + +#define dgMsgKanji9165Tex "__OTR__textures/kanji/gMsgKanji9165Tex" +static const ALIGN_ASSET(2) char gMsgKanji9165Tex[] = dgMsgKanji9165Tex; + +#define dgMsgKanji9166Tex "__OTR__textures/kanji/gMsgKanji9166Tex" +static const ALIGN_ASSET(2) char gMsgKanji9166Tex[] = dgMsgKanji9166Tex; + +#define dgMsgKanji9167Tex "__OTR__textures/kanji/gMsgKanji9167Tex" +static const ALIGN_ASSET(2) char gMsgKanji9167Tex[] = dgMsgKanji9167Tex; + +#define dgMsgKanji9168Tex "__OTR__textures/kanji/gMsgKanji9168Tex" +static const ALIGN_ASSET(2) char gMsgKanji9168Tex[] = dgMsgKanji9168Tex; + +#define dgMsgKanji9169Tex "__OTR__textures/kanji/gMsgKanji9169Tex" +static const ALIGN_ASSET(2) char gMsgKanji9169Tex[] = dgMsgKanji9169Tex; + +#define dgMsgKanji916ATex "__OTR__textures/kanji/gMsgKanji916ATex" +static const ALIGN_ASSET(2) char gMsgKanji916ATex[] = dgMsgKanji916ATex; + +#define dgMsgKanji916BTex "__OTR__textures/kanji/gMsgKanji916BTex" +static const ALIGN_ASSET(2) char gMsgKanji916BTex[] = dgMsgKanji916BTex; + +#define dgMsgKanji916CTex "__OTR__textures/kanji/gMsgKanji916CTex" +static const ALIGN_ASSET(2) char gMsgKanji916CTex[] = dgMsgKanji916CTex; + +#define dgMsgKanji916DTex "__OTR__textures/kanji/gMsgKanji916DTex" +static const ALIGN_ASSET(2) char gMsgKanji916DTex[] = dgMsgKanji916DTex; + +#define dgMsgKanji916ETex "__OTR__textures/kanji/gMsgKanji916ETex" +static const ALIGN_ASSET(2) char gMsgKanji916ETex[] = dgMsgKanji916ETex; + +#define dgMsgKanji916FTex "__OTR__textures/kanji/gMsgKanji916FTex" +static const ALIGN_ASSET(2) char gMsgKanji916FTex[] = dgMsgKanji916FTex; + +#define dgMsgKanji9170Tex "__OTR__textures/kanji/gMsgKanji9170Tex" +static const ALIGN_ASSET(2) char gMsgKanji9170Tex[] = dgMsgKanji9170Tex; + +#define dgMsgKanji9171Tex "__OTR__textures/kanji/gMsgKanji9171Tex" +static const ALIGN_ASSET(2) char gMsgKanji9171Tex[] = dgMsgKanji9171Tex; + +#define dgMsgKanji9172Tex "__OTR__textures/kanji/gMsgKanji9172Tex" +static const ALIGN_ASSET(2) char gMsgKanji9172Tex[] = dgMsgKanji9172Tex; + +#define dgMsgKanji9173Tex "__OTR__textures/kanji/gMsgKanji9173Tex" +static const ALIGN_ASSET(2) char gMsgKanji9173Tex[] = dgMsgKanji9173Tex; + +#define dgMsgKanji9174Tex "__OTR__textures/kanji/gMsgKanji9174Tex" +static const ALIGN_ASSET(2) char gMsgKanji9174Tex[] = dgMsgKanji9174Tex; + +#define dgMsgKanji9175Tex "__OTR__textures/kanji/gMsgKanji9175Tex" +static const ALIGN_ASSET(2) char gMsgKanji9175Tex[] = dgMsgKanji9175Tex; + +#define dgMsgKanji9176Tex "__OTR__textures/kanji/gMsgKanji9176Tex" +static const ALIGN_ASSET(2) char gMsgKanji9176Tex[] = dgMsgKanji9176Tex; + +#define dgMsgKanji9177Tex "__OTR__textures/kanji/gMsgKanji9177Tex" +static const ALIGN_ASSET(2) char gMsgKanji9177Tex[] = dgMsgKanji9177Tex; + +#define dgMsgKanji9178Tex "__OTR__textures/kanji/gMsgKanji9178Tex" +static const ALIGN_ASSET(2) char gMsgKanji9178Tex[] = dgMsgKanji9178Tex; + +#define dgMsgKanji9179Tex "__OTR__textures/kanji/gMsgKanji9179Tex" +static const ALIGN_ASSET(2) char gMsgKanji9179Tex[] = dgMsgKanji9179Tex; + +#define dgMsgKanji917ATex "__OTR__textures/kanji/gMsgKanji917ATex" +static const ALIGN_ASSET(2) char gMsgKanji917ATex[] = dgMsgKanji917ATex; + +#define dgMsgKanji917BTex "__OTR__textures/kanji/gMsgKanji917BTex" +static const ALIGN_ASSET(2) char gMsgKanji917BTex[] = dgMsgKanji917BTex; + +#define dgMsgKanji917CTex "__OTR__textures/kanji/gMsgKanji917CTex" +static const ALIGN_ASSET(2) char gMsgKanji917CTex[] = dgMsgKanji917CTex; + +#define dgMsgKanji917DTex "__OTR__textures/kanji/gMsgKanji917DTex" +static const ALIGN_ASSET(2) char gMsgKanji917DTex[] = dgMsgKanji917DTex; + +#define dgMsgKanji917ETex "__OTR__textures/kanji/gMsgKanji917ETex" +static const ALIGN_ASSET(2) char gMsgKanji917ETex[] = dgMsgKanji917ETex; + +#define dgMsgKanji9180Tex "__OTR__textures/kanji/gMsgKanji9180Tex" +static const ALIGN_ASSET(2) char gMsgKanji9180Tex[] = dgMsgKanji9180Tex; + +#define dgMsgKanji9181Tex "__OTR__textures/kanji/gMsgKanji9181Tex" +static const ALIGN_ASSET(2) char gMsgKanji9181Tex[] = dgMsgKanji9181Tex; + +#define dgMsgKanji9182Tex "__OTR__textures/kanji/gMsgKanji9182Tex" +static const ALIGN_ASSET(2) char gMsgKanji9182Tex[] = dgMsgKanji9182Tex; + +#define dgMsgKanji9183Tex "__OTR__textures/kanji/gMsgKanji9183Tex" +static const ALIGN_ASSET(2) char gMsgKanji9183Tex[] = dgMsgKanji9183Tex; + +#define dgMsgKanji9184Tex "__OTR__textures/kanji/gMsgKanji9184Tex" +static const ALIGN_ASSET(2) char gMsgKanji9184Tex[] = dgMsgKanji9184Tex; + +#define dgMsgKanji9185Tex "__OTR__textures/kanji/gMsgKanji9185Tex" +static const ALIGN_ASSET(2) char gMsgKanji9185Tex[] = dgMsgKanji9185Tex; + +#define dgMsgKanji9186Tex "__OTR__textures/kanji/gMsgKanji9186Tex" +static const ALIGN_ASSET(2) char gMsgKanji9186Tex[] = dgMsgKanji9186Tex; + +#define dgMsgKanji9187Tex "__OTR__textures/kanji/gMsgKanji9187Tex" +static const ALIGN_ASSET(2) char gMsgKanji9187Tex[] = dgMsgKanji9187Tex; + +#define dgMsgKanji9188Tex "__OTR__textures/kanji/gMsgKanji9188Tex" +static const ALIGN_ASSET(2) char gMsgKanji9188Tex[] = dgMsgKanji9188Tex; + +#define dgMsgKanji9189Tex "__OTR__textures/kanji/gMsgKanji9189Tex" +static const ALIGN_ASSET(2) char gMsgKanji9189Tex[] = dgMsgKanji9189Tex; + +#define dgMsgKanji918ATex "__OTR__textures/kanji/gMsgKanji918ATex" +static const ALIGN_ASSET(2) char gMsgKanji918ATex[] = dgMsgKanji918ATex; + +#define dgMsgKanji918BTex "__OTR__textures/kanji/gMsgKanji918BTex" +static const ALIGN_ASSET(2) char gMsgKanji918BTex[] = dgMsgKanji918BTex; + +#define dgMsgKanji918CTex "__OTR__textures/kanji/gMsgKanji918CTex" +static const ALIGN_ASSET(2) char gMsgKanji918CTex[] = dgMsgKanji918CTex; + +#define dgMsgKanji918DTex "__OTR__textures/kanji/gMsgKanji918DTex" +static const ALIGN_ASSET(2) char gMsgKanji918DTex[] = dgMsgKanji918DTex; + +#define dgMsgKanji918ETex "__OTR__textures/kanji/gMsgKanji918ETex" +static const ALIGN_ASSET(2) char gMsgKanji918ETex[] = dgMsgKanji918ETex; + +#define dgMsgKanji918FTex "__OTR__textures/kanji/gMsgKanji918FTex" +static const ALIGN_ASSET(2) char gMsgKanji918FTex[] = dgMsgKanji918FTex; + +#define dgMsgKanji9190Tex "__OTR__textures/kanji/gMsgKanji9190Tex" +static const ALIGN_ASSET(2) char gMsgKanji9190Tex[] = dgMsgKanji9190Tex; + +#define dgMsgKanji9191Tex "__OTR__textures/kanji/gMsgKanji9191Tex" +static const ALIGN_ASSET(2) char gMsgKanji9191Tex[] = dgMsgKanji9191Tex; + +#define dgMsgKanji9192Tex "__OTR__textures/kanji/gMsgKanji9192Tex" +static const ALIGN_ASSET(2) char gMsgKanji9192Tex[] = dgMsgKanji9192Tex; + +#define dgMsgKanji9193Tex "__OTR__textures/kanji/gMsgKanji9193Tex" +static const ALIGN_ASSET(2) char gMsgKanji9193Tex[] = dgMsgKanji9193Tex; + +#define dgMsgKanji9194Tex "__OTR__textures/kanji/gMsgKanji9194Tex" +static const ALIGN_ASSET(2) char gMsgKanji9194Tex[] = dgMsgKanji9194Tex; + +#define dgMsgKanji9195Tex "__OTR__textures/kanji/gMsgKanji9195Tex" +static const ALIGN_ASSET(2) char gMsgKanji9195Tex[] = dgMsgKanji9195Tex; + +#define dgMsgKanji9196Tex "__OTR__textures/kanji/gMsgKanji9196Tex" +static const ALIGN_ASSET(2) char gMsgKanji9196Tex[] = dgMsgKanji9196Tex; + +#define dgMsgKanji9197Tex "__OTR__textures/kanji/gMsgKanji9197Tex" +static const ALIGN_ASSET(2) char gMsgKanji9197Tex[] = dgMsgKanji9197Tex; + +#define dgMsgKanji9198Tex "__OTR__textures/kanji/gMsgKanji9198Tex" +static const ALIGN_ASSET(2) char gMsgKanji9198Tex[] = dgMsgKanji9198Tex; + +#define dgMsgKanji9199Tex "__OTR__textures/kanji/gMsgKanji9199Tex" +static const ALIGN_ASSET(2) char gMsgKanji9199Tex[] = dgMsgKanji9199Tex; + +#define dgMsgKanji919ATex "__OTR__textures/kanji/gMsgKanji919ATex" +static const ALIGN_ASSET(2) char gMsgKanji919ATex[] = dgMsgKanji919ATex; + +#define dgMsgKanji919BTex "__OTR__textures/kanji/gMsgKanji919BTex" +static const ALIGN_ASSET(2) char gMsgKanji919BTex[] = dgMsgKanji919BTex; + +#define dgMsgKanji919CTex "__OTR__textures/kanji/gMsgKanji919CTex" +static const ALIGN_ASSET(2) char gMsgKanji919CTex[] = dgMsgKanji919CTex; + +#define dgMsgKanji919DTex "__OTR__textures/kanji/gMsgKanji919DTex" +static const ALIGN_ASSET(2) char gMsgKanji919DTex[] = dgMsgKanji919DTex; + +#define dgMsgKanji919ETex "__OTR__textures/kanji/gMsgKanji919ETex" +static const ALIGN_ASSET(2) char gMsgKanji919ETex[] = dgMsgKanji919ETex; + +#define dgMsgKanji919FTex "__OTR__textures/kanji/gMsgKanji919FTex" +static const ALIGN_ASSET(2) char gMsgKanji919FTex[] = dgMsgKanji919FTex; + +#define dgMsgKanji91A0Tex "__OTR__textures/kanji/gMsgKanji91A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A0Tex[] = dgMsgKanji91A0Tex; + +#define dgMsgKanji91A1Tex "__OTR__textures/kanji/gMsgKanji91A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A1Tex[] = dgMsgKanji91A1Tex; + +#define dgMsgKanji91A2Tex "__OTR__textures/kanji/gMsgKanji91A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A2Tex[] = dgMsgKanji91A2Tex; + +#define dgMsgKanji91A3Tex "__OTR__textures/kanji/gMsgKanji91A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A3Tex[] = dgMsgKanji91A3Tex; + +#define dgMsgKanji91A4Tex "__OTR__textures/kanji/gMsgKanji91A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A4Tex[] = dgMsgKanji91A4Tex; + +#define dgMsgKanji91A5Tex "__OTR__textures/kanji/gMsgKanji91A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A5Tex[] = dgMsgKanji91A5Tex; + +#define dgMsgKanji91A6Tex "__OTR__textures/kanji/gMsgKanji91A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A6Tex[] = dgMsgKanji91A6Tex; + +#define dgMsgKanji91A7Tex "__OTR__textures/kanji/gMsgKanji91A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A7Tex[] = dgMsgKanji91A7Tex; + +#define dgMsgKanji91A8Tex "__OTR__textures/kanji/gMsgKanji91A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A8Tex[] = dgMsgKanji91A8Tex; + +#define dgMsgKanji91A9Tex "__OTR__textures/kanji/gMsgKanji91A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91A9Tex[] = dgMsgKanji91A9Tex; + +#define dgMsgKanji91AATex "__OTR__textures/kanji/gMsgKanji91AATex" +static const ALIGN_ASSET(2) char gMsgKanji91AATex[] = dgMsgKanji91AATex; + +#define dgMsgKanji91ABTex "__OTR__textures/kanji/gMsgKanji91ABTex" +static const ALIGN_ASSET(2) char gMsgKanji91ABTex[] = dgMsgKanji91ABTex; + +#define dgMsgKanji91ACTex "__OTR__textures/kanji/gMsgKanji91ACTex" +static const ALIGN_ASSET(2) char gMsgKanji91ACTex[] = dgMsgKanji91ACTex; + +#define dgMsgKanji91ADTex "__OTR__textures/kanji/gMsgKanji91ADTex" +static const ALIGN_ASSET(2) char gMsgKanji91ADTex[] = dgMsgKanji91ADTex; + +#define dgMsgKanji91AETex "__OTR__textures/kanji/gMsgKanji91AETex" +static const ALIGN_ASSET(2) char gMsgKanji91AETex[] = dgMsgKanji91AETex; + +#define dgMsgKanji91AFTex "__OTR__textures/kanji/gMsgKanji91AFTex" +static const ALIGN_ASSET(2) char gMsgKanji91AFTex[] = dgMsgKanji91AFTex; + +#define dgMsgKanji91B0Tex "__OTR__textures/kanji/gMsgKanji91B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B0Tex[] = dgMsgKanji91B0Tex; + +#define dgMsgKanji91B1Tex "__OTR__textures/kanji/gMsgKanji91B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B1Tex[] = dgMsgKanji91B1Tex; + +#define dgMsgKanji91B2Tex "__OTR__textures/kanji/gMsgKanji91B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B2Tex[] = dgMsgKanji91B2Tex; + +#define dgMsgKanji91B3Tex "__OTR__textures/kanji/gMsgKanji91B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B3Tex[] = dgMsgKanji91B3Tex; + +#define dgMsgKanji91B4Tex "__OTR__textures/kanji/gMsgKanji91B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B4Tex[] = dgMsgKanji91B4Tex; + +#define dgMsgKanji91B5Tex "__OTR__textures/kanji/gMsgKanji91B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B5Tex[] = dgMsgKanji91B5Tex; + +#define dgMsgKanji91B6Tex "__OTR__textures/kanji/gMsgKanji91B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B6Tex[] = dgMsgKanji91B6Tex; + +#define dgMsgKanji91B7Tex "__OTR__textures/kanji/gMsgKanji91B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B7Tex[] = dgMsgKanji91B7Tex; + +#define dgMsgKanji91B8Tex "__OTR__textures/kanji/gMsgKanji91B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B8Tex[] = dgMsgKanji91B8Tex; + +#define dgMsgKanji91B9Tex "__OTR__textures/kanji/gMsgKanji91B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91B9Tex[] = dgMsgKanji91B9Tex; + +#define dgMsgKanji91BATex "__OTR__textures/kanji/gMsgKanji91BATex" +static const ALIGN_ASSET(2) char gMsgKanji91BATex[] = dgMsgKanji91BATex; + +#define dgMsgKanji91BBTex "__OTR__textures/kanji/gMsgKanji91BBTex" +static const ALIGN_ASSET(2) char gMsgKanji91BBTex[] = dgMsgKanji91BBTex; + +#define dgMsgKanji91BCTex "__OTR__textures/kanji/gMsgKanji91BCTex" +static const ALIGN_ASSET(2) char gMsgKanji91BCTex[] = dgMsgKanji91BCTex; + +#define dgMsgKanji91BDTex "__OTR__textures/kanji/gMsgKanji91BDTex" +static const ALIGN_ASSET(2) char gMsgKanji91BDTex[] = dgMsgKanji91BDTex; + +#define dgMsgKanji91BETex "__OTR__textures/kanji/gMsgKanji91BETex" +static const ALIGN_ASSET(2) char gMsgKanji91BETex[] = dgMsgKanji91BETex; + +#define dgMsgKanji91BFTex "__OTR__textures/kanji/gMsgKanji91BFTex" +static const ALIGN_ASSET(2) char gMsgKanji91BFTex[] = dgMsgKanji91BFTex; + +#define dgMsgKanji91C0Tex "__OTR__textures/kanji/gMsgKanji91C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C0Tex[] = dgMsgKanji91C0Tex; + +#define dgMsgKanji91C1Tex "__OTR__textures/kanji/gMsgKanji91C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C1Tex[] = dgMsgKanji91C1Tex; + +#define dgMsgKanji91C2Tex "__OTR__textures/kanji/gMsgKanji91C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C2Tex[] = dgMsgKanji91C2Tex; + +#define dgMsgKanji91C3Tex "__OTR__textures/kanji/gMsgKanji91C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C3Tex[] = dgMsgKanji91C3Tex; + +#define dgMsgKanji91C4Tex "__OTR__textures/kanji/gMsgKanji91C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C4Tex[] = dgMsgKanji91C4Tex; + +#define dgMsgKanji91C5Tex "__OTR__textures/kanji/gMsgKanji91C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C5Tex[] = dgMsgKanji91C5Tex; + +#define dgMsgKanji91C6Tex "__OTR__textures/kanji/gMsgKanji91C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C6Tex[] = dgMsgKanji91C6Tex; + +#define dgMsgKanji91C7Tex "__OTR__textures/kanji/gMsgKanji91C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C7Tex[] = dgMsgKanji91C7Tex; + +#define dgMsgKanji91C8Tex "__OTR__textures/kanji/gMsgKanji91C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C8Tex[] = dgMsgKanji91C8Tex; + +#define dgMsgKanji91C9Tex "__OTR__textures/kanji/gMsgKanji91C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91C9Tex[] = dgMsgKanji91C9Tex; + +#define dgMsgKanji91CATex "__OTR__textures/kanji/gMsgKanji91CATex" +static const ALIGN_ASSET(2) char gMsgKanji91CATex[] = dgMsgKanji91CATex; + +#define dgMsgKanji91CBTex "__OTR__textures/kanji/gMsgKanji91CBTex" +static const ALIGN_ASSET(2) char gMsgKanji91CBTex[] = dgMsgKanji91CBTex; + +#define dgMsgKanji91CCTex "__OTR__textures/kanji/gMsgKanji91CCTex" +static const ALIGN_ASSET(2) char gMsgKanji91CCTex[] = dgMsgKanji91CCTex; + +#define dgMsgKanji91CDTex "__OTR__textures/kanji/gMsgKanji91CDTex" +static const ALIGN_ASSET(2) char gMsgKanji91CDTex[] = dgMsgKanji91CDTex; + +#define dgMsgKanji91CETex "__OTR__textures/kanji/gMsgKanji91CETex" +static const ALIGN_ASSET(2) char gMsgKanji91CETex[] = dgMsgKanji91CETex; + +#define dgMsgKanji91CFTex "__OTR__textures/kanji/gMsgKanji91CFTex" +static const ALIGN_ASSET(2) char gMsgKanji91CFTex[] = dgMsgKanji91CFTex; + +#define dgMsgKanji91D0Tex "__OTR__textures/kanji/gMsgKanji91D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D0Tex[] = dgMsgKanji91D0Tex; + +#define dgMsgKanji91D1Tex "__OTR__textures/kanji/gMsgKanji91D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D1Tex[] = dgMsgKanji91D1Tex; + +#define dgMsgKanji91D2Tex "__OTR__textures/kanji/gMsgKanji91D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D2Tex[] = dgMsgKanji91D2Tex; + +#define dgMsgKanji91D3Tex "__OTR__textures/kanji/gMsgKanji91D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D3Tex[] = dgMsgKanji91D3Tex; + +#define dgMsgKanji91D4Tex "__OTR__textures/kanji/gMsgKanji91D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D4Tex[] = dgMsgKanji91D4Tex; + +#define dgMsgKanji91D5Tex "__OTR__textures/kanji/gMsgKanji91D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D5Tex[] = dgMsgKanji91D5Tex; + +#define dgMsgKanji91D6Tex "__OTR__textures/kanji/gMsgKanji91D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D6Tex[] = dgMsgKanji91D6Tex; + +#define dgMsgKanji91D7Tex "__OTR__textures/kanji/gMsgKanji91D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D7Tex[] = dgMsgKanji91D7Tex; + +#define dgMsgKanji91D8Tex "__OTR__textures/kanji/gMsgKanji91D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D8Tex[] = dgMsgKanji91D8Tex; + +#define dgMsgKanji91D9Tex "__OTR__textures/kanji/gMsgKanji91D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91D9Tex[] = dgMsgKanji91D9Tex; + +#define dgMsgKanji91DATex "__OTR__textures/kanji/gMsgKanji91DATex" +static const ALIGN_ASSET(2) char gMsgKanji91DATex[] = dgMsgKanji91DATex; + +#define dgMsgKanji91DBTex "__OTR__textures/kanji/gMsgKanji91DBTex" +static const ALIGN_ASSET(2) char gMsgKanji91DBTex[] = dgMsgKanji91DBTex; + +#define dgMsgKanji91DCTex "__OTR__textures/kanji/gMsgKanji91DCTex" +static const ALIGN_ASSET(2) char gMsgKanji91DCTex[] = dgMsgKanji91DCTex; + +#define dgMsgKanji91DDTex "__OTR__textures/kanji/gMsgKanji91DDTex" +static const ALIGN_ASSET(2) char gMsgKanji91DDTex[] = dgMsgKanji91DDTex; + +#define dgMsgKanji91DETex "__OTR__textures/kanji/gMsgKanji91DETex" +static const ALIGN_ASSET(2) char gMsgKanji91DETex[] = dgMsgKanji91DETex; + +#define dgMsgKanji91DFTex "__OTR__textures/kanji/gMsgKanji91DFTex" +static const ALIGN_ASSET(2) char gMsgKanji91DFTex[] = dgMsgKanji91DFTex; + +#define dgMsgKanji91E0Tex "__OTR__textures/kanji/gMsgKanji91E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E0Tex[] = dgMsgKanji91E0Tex; + +#define dgMsgKanji91E1Tex "__OTR__textures/kanji/gMsgKanji91E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E1Tex[] = dgMsgKanji91E1Tex; + +#define dgMsgKanji91E2Tex "__OTR__textures/kanji/gMsgKanji91E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E2Tex[] = dgMsgKanji91E2Tex; + +#define dgMsgKanji91E3Tex "__OTR__textures/kanji/gMsgKanji91E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E3Tex[] = dgMsgKanji91E3Tex; + +#define dgMsgKanji91E4Tex "__OTR__textures/kanji/gMsgKanji91E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E4Tex[] = dgMsgKanji91E4Tex; + +#define dgMsgKanji91E5Tex "__OTR__textures/kanji/gMsgKanji91E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E5Tex[] = dgMsgKanji91E5Tex; + +#define dgMsgKanji91E6Tex "__OTR__textures/kanji/gMsgKanji91E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E6Tex[] = dgMsgKanji91E6Tex; + +#define dgMsgKanji91E7Tex "__OTR__textures/kanji/gMsgKanji91E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E7Tex[] = dgMsgKanji91E7Tex; + +#define dgMsgKanji91E8Tex "__OTR__textures/kanji/gMsgKanji91E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E8Tex[] = dgMsgKanji91E8Tex; + +#define dgMsgKanji91E9Tex "__OTR__textures/kanji/gMsgKanji91E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91E9Tex[] = dgMsgKanji91E9Tex; + +#define dgMsgKanji91EATex "__OTR__textures/kanji/gMsgKanji91EATex" +static const ALIGN_ASSET(2) char gMsgKanji91EATex[] = dgMsgKanji91EATex; + +#define dgMsgKanji91EBTex "__OTR__textures/kanji/gMsgKanji91EBTex" +static const ALIGN_ASSET(2) char gMsgKanji91EBTex[] = dgMsgKanji91EBTex; + +#define dgMsgKanji91ECTex "__OTR__textures/kanji/gMsgKanji91ECTex" +static const ALIGN_ASSET(2) char gMsgKanji91ECTex[] = dgMsgKanji91ECTex; + +#define dgMsgKanji91EDTex "__OTR__textures/kanji/gMsgKanji91EDTex" +static const ALIGN_ASSET(2) char gMsgKanji91EDTex[] = dgMsgKanji91EDTex; + +#define dgMsgKanji91EETex "__OTR__textures/kanji/gMsgKanji91EETex" +static const ALIGN_ASSET(2) char gMsgKanji91EETex[] = dgMsgKanji91EETex; + +#define dgMsgKanji91EFTex "__OTR__textures/kanji/gMsgKanji91EFTex" +static const ALIGN_ASSET(2) char gMsgKanji91EFTex[] = dgMsgKanji91EFTex; + +#define dgMsgKanji91F0Tex "__OTR__textures/kanji/gMsgKanji91F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F0Tex[] = dgMsgKanji91F0Tex; + +#define dgMsgKanji91F1Tex "__OTR__textures/kanji/gMsgKanji91F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F1Tex[] = dgMsgKanji91F1Tex; + +#define dgMsgKanji91F2Tex "__OTR__textures/kanji/gMsgKanji91F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F2Tex[] = dgMsgKanji91F2Tex; + +#define dgMsgKanji91F3Tex "__OTR__textures/kanji/gMsgKanji91F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F3Tex[] = dgMsgKanji91F3Tex; + +#define dgMsgKanji91F4Tex "__OTR__textures/kanji/gMsgKanji91F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F4Tex[] = dgMsgKanji91F4Tex; + +#define dgMsgKanji91F5Tex "__OTR__textures/kanji/gMsgKanji91F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F5Tex[] = dgMsgKanji91F5Tex; + +#define dgMsgKanji91F6Tex "__OTR__textures/kanji/gMsgKanji91F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F6Tex[] = dgMsgKanji91F6Tex; + +#define dgMsgKanji91F7Tex "__OTR__textures/kanji/gMsgKanji91F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F7Tex[] = dgMsgKanji91F7Tex; + +#define dgMsgKanji91F8Tex "__OTR__textures/kanji/gMsgKanji91F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F8Tex[] = dgMsgKanji91F8Tex; + +#define dgMsgKanji91F9Tex "__OTR__textures/kanji/gMsgKanji91F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji91F9Tex[] = dgMsgKanji91F9Tex; + +#define dgMsgKanji91FATex "__OTR__textures/kanji/gMsgKanji91FATex" +static const ALIGN_ASSET(2) char gMsgKanji91FATex[] = dgMsgKanji91FATex; + +#define dgMsgKanji91FBTex "__OTR__textures/kanji/gMsgKanji91FBTex" +static const ALIGN_ASSET(2) char gMsgKanji91FBTex[] = dgMsgKanji91FBTex; + +#define dgMsgKanji91FCTex "__OTR__textures/kanji/gMsgKanji91FCTex" +static const ALIGN_ASSET(2) char gMsgKanji91FCTex[] = dgMsgKanji91FCTex; + +#define dgMsgKanji9240Tex "__OTR__textures/kanji/gMsgKanji9240Tex" +static const ALIGN_ASSET(2) char gMsgKanji9240Tex[] = dgMsgKanji9240Tex; + +#define dgMsgKanji9241Tex "__OTR__textures/kanji/gMsgKanji9241Tex" +static const ALIGN_ASSET(2) char gMsgKanji9241Tex[] = dgMsgKanji9241Tex; + +#define dgMsgKanji9242Tex "__OTR__textures/kanji/gMsgKanji9242Tex" +static const ALIGN_ASSET(2) char gMsgKanji9242Tex[] = dgMsgKanji9242Tex; + +#define dgMsgKanji9243Tex "__OTR__textures/kanji/gMsgKanji9243Tex" +static const ALIGN_ASSET(2) char gMsgKanji9243Tex[] = dgMsgKanji9243Tex; + +#define dgMsgKanji9244Tex "__OTR__textures/kanji/gMsgKanji9244Tex" +static const ALIGN_ASSET(2) char gMsgKanji9244Tex[] = dgMsgKanji9244Tex; + +#define dgMsgKanji9245Tex "__OTR__textures/kanji/gMsgKanji9245Tex" +static const ALIGN_ASSET(2) char gMsgKanji9245Tex[] = dgMsgKanji9245Tex; + +#define dgMsgKanji9246Tex "__OTR__textures/kanji/gMsgKanji9246Tex" +static const ALIGN_ASSET(2) char gMsgKanji9246Tex[] = dgMsgKanji9246Tex; + +#define dgMsgKanji9247Tex "__OTR__textures/kanji/gMsgKanji9247Tex" +static const ALIGN_ASSET(2) char gMsgKanji9247Tex[] = dgMsgKanji9247Tex; + +#define dgMsgKanji9248Tex "__OTR__textures/kanji/gMsgKanji9248Tex" +static const ALIGN_ASSET(2) char gMsgKanji9248Tex[] = dgMsgKanji9248Tex; + +#define dgMsgKanji9249Tex "__OTR__textures/kanji/gMsgKanji9249Tex" +static const ALIGN_ASSET(2) char gMsgKanji9249Tex[] = dgMsgKanji9249Tex; + +#define dgMsgKanji924ATex "__OTR__textures/kanji/gMsgKanji924ATex" +static const ALIGN_ASSET(2) char gMsgKanji924ATex[] = dgMsgKanji924ATex; + +#define dgMsgKanji924BTex "__OTR__textures/kanji/gMsgKanji924BTex" +static const ALIGN_ASSET(2) char gMsgKanji924BTex[] = dgMsgKanji924BTex; + +#define dgMsgKanji924CTex "__OTR__textures/kanji/gMsgKanji924CTex" +static const ALIGN_ASSET(2) char gMsgKanji924CTex[] = dgMsgKanji924CTex; + +#define dgMsgKanji924DTex "__OTR__textures/kanji/gMsgKanji924DTex" +static const ALIGN_ASSET(2) char gMsgKanji924DTex[] = dgMsgKanji924DTex; + +#define dgMsgKanji924ETex "__OTR__textures/kanji/gMsgKanji924ETex" +static const ALIGN_ASSET(2) char gMsgKanji924ETex[] = dgMsgKanji924ETex; + +#define dgMsgKanji924FTex "__OTR__textures/kanji/gMsgKanji924FTex" +static const ALIGN_ASSET(2) char gMsgKanji924FTex[] = dgMsgKanji924FTex; + +#define dgMsgKanji9250Tex "__OTR__textures/kanji/gMsgKanji9250Tex" +static const ALIGN_ASSET(2) char gMsgKanji9250Tex[] = dgMsgKanji9250Tex; + +#define dgMsgKanji9251Tex "__OTR__textures/kanji/gMsgKanji9251Tex" +static const ALIGN_ASSET(2) char gMsgKanji9251Tex[] = dgMsgKanji9251Tex; + +#define dgMsgKanji9252Tex "__OTR__textures/kanji/gMsgKanji9252Tex" +static const ALIGN_ASSET(2) char gMsgKanji9252Tex[] = dgMsgKanji9252Tex; + +#define dgMsgKanji9253Tex "__OTR__textures/kanji/gMsgKanji9253Tex" +static const ALIGN_ASSET(2) char gMsgKanji9253Tex[] = dgMsgKanji9253Tex; + +#define dgMsgKanji9254Tex "__OTR__textures/kanji/gMsgKanji9254Tex" +static const ALIGN_ASSET(2) char gMsgKanji9254Tex[] = dgMsgKanji9254Tex; + +#define dgMsgKanji9255Tex "__OTR__textures/kanji/gMsgKanji9255Tex" +static const ALIGN_ASSET(2) char gMsgKanji9255Tex[] = dgMsgKanji9255Tex; + +#define dgMsgKanji9256Tex "__OTR__textures/kanji/gMsgKanji9256Tex" +static const ALIGN_ASSET(2) char gMsgKanji9256Tex[] = dgMsgKanji9256Tex; + +#define dgMsgKanji9257Tex "__OTR__textures/kanji/gMsgKanji9257Tex" +static const ALIGN_ASSET(2) char gMsgKanji9257Tex[] = dgMsgKanji9257Tex; + +#define dgMsgKanji9258Tex "__OTR__textures/kanji/gMsgKanji9258Tex" +static const ALIGN_ASSET(2) char gMsgKanji9258Tex[] = dgMsgKanji9258Tex; + +#define dgMsgKanji9259Tex "__OTR__textures/kanji/gMsgKanji9259Tex" +static const ALIGN_ASSET(2) char gMsgKanji9259Tex[] = dgMsgKanji9259Tex; + +#define dgMsgKanji925ATex "__OTR__textures/kanji/gMsgKanji925ATex" +static const ALIGN_ASSET(2) char gMsgKanji925ATex[] = dgMsgKanji925ATex; + +#define dgMsgKanji925BTex "__OTR__textures/kanji/gMsgKanji925BTex" +static const ALIGN_ASSET(2) char gMsgKanji925BTex[] = dgMsgKanji925BTex; + +#define dgMsgKanji925CTex "__OTR__textures/kanji/gMsgKanji925CTex" +static const ALIGN_ASSET(2) char gMsgKanji925CTex[] = dgMsgKanji925CTex; + +#define dgMsgKanji925DTex "__OTR__textures/kanji/gMsgKanji925DTex" +static const ALIGN_ASSET(2) char gMsgKanji925DTex[] = dgMsgKanji925DTex; + +#define dgMsgKanji925ETex "__OTR__textures/kanji/gMsgKanji925ETex" +static const ALIGN_ASSET(2) char gMsgKanji925ETex[] = dgMsgKanji925ETex; + +#define dgMsgKanji925FTex "__OTR__textures/kanji/gMsgKanji925FTex" +static const ALIGN_ASSET(2) char gMsgKanji925FTex[] = dgMsgKanji925FTex; + +#define dgMsgKanji9260Tex "__OTR__textures/kanji/gMsgKanji9260Tex" +static const ALIGN_ASSET(2) char gMsgKanji9260Tex[] = dgMsgKanji9260Tex; + +#define dgMsgKanji9261Tex "__OTR__textures/kanji/gMsgKanji9261Tex" +static const ALIGN_ASSET(2) char gMsgKanji9261Tex[] = dgMsgKanji9261Tex; + +#define dgMsgKanji9262Tex "__OTR__textures/kanji/gMsgKanji9262Tex" +static const ALIGN_ASSET(2) char gMsgKanji9262Tex[] = dgMsgKanji9262Tex; + +#define dgMsgKanji9263Tex "__OTR__textures/kanji/gMsgKanji9263Tex" +static const ALIGN_ASSET(2) char gMsgKanji9263Tex[] = dgMsgKanji9263Tex; + +#define dgMsgKanji9264Tex "__OTR__textures/kanji/gMsgKanji9264Tex" +static const ALIGN_ASSET(2) char gMsgKanji9264Tex[] = dgMsgKanji9264Tex; + +#define dgMsgKanji9265Tex "__OTR__textures/kanji/gMsgKanji9265Tex" +static const ALIGN_ASSET(2) char gMsgKanji9265Tex[] = dgMsgKanji9265Tex; + +#define dgMsgKanji9266Tex "__OTR__textures/kanji/gMsgKanji9266Tex" +static const ALIGN_ASSET(2) char gMsgKanji9266Tex[] = dgMsgKanji9266Tex; + +#define dgMsgKanji9267Tex "__OTR__textures/kanji/gMsgKanji9267Tex" +static const ALIGN_ASSET(2) char gMsgKanji9267Tex[] = dgMsgKanji9267Tex; + +#define dgMsgKanji9268Tex "__OTR__textures/kanji/gMsgKanji9268Tex" +static const ALIGN_ASSET(2) char gMsgKanji9268Tex[] = dgMsgKanji9268Tex; + +#define dgMsgKanji9269Tex "__OTR__textures/kanji/gMsgKanji9269Tex" +static const ALIGN_ASSET(2) char gMsgKanji9269Tex[] = dgMsgKanji9269Tex; + +#define dgMsgKanji926ATex "__OTR__textures/kanji/gMsgKanji926ATex" +static const ALIGN_ASSET(2) char gMsgKanji926ATex[] = dgMsgKanji926ATex; + +#define dgMsgKanji926BTex "__OTR__textures/kanji/gMsgKanji926BTex" +static const ALIGN_ASSET(2) char gMsgKanji926BTex[] = dgMsgKanji926BTex; + +#define dgMsgKanji926CTex "__OTR__textures/kanji/gMsgKanji926CTex" +static const ALIGN_ASSET(2) char gMsgKanji926CTex[] = dgMsgKanji926CTex; + +#define dgMsgKanji926DTex "__OTR__textures/kanji/gMsgKanji926DTex" +static const ALIGN_ASSET(2) char gMsgKanji926DTex[] = dgMsgKanji926DTex; + +#define dgMsgKanji926ETex "__OTR__textures/kanji/gMsgKanji926ETex" +static const ALIGN_ASSET(2) char gMsgKanji926ETex[] = dgMsgKanji926ETex; + +#define dgMsgKanji926FTex "__OTR__textures/kanji/gMsgKanji926FTex" +static const ALIGN_ASSET(2) char gMsgKanji926FTex[] = dgMsgKanji926FTex; + +#define dgMsgKanji9270Tex "__OTR__textures/kanji/gMsgKanji9270Tex" +static const ALIGN_ASSET(2) char gMsgKanji9270Tex[] = dgMsgKanji9270Tex; + +#define dgMsgKanji9271Tex "__OTR__textures/kanji/gMsgKanji9271Tex" +static const ALIGN_ASSET(2) char gMsgKanji9271Tex[] = dgMsgKanji9271Tex; + +#define dgMsgKanji9272Tex "__OTR__textures/kanji/gMsgKanji9272Tex" +static const ALIGN_ASSET(2) char gMsgKanji9272Tex[] = dgMsgKanji9272Tex; + +#define dgMsgKanji9273Tex "__OTR__textures/kanji/gMsgKanji9273Tex" +static const ALIGN_ASSET(2) char gMsgKanji9273Tex[] = dgMsgKanji9273Tex; + +#define dgMsgKanji9274Tex "__OTR__textures/kanji/gMsgKanji9274Tex" +static const ALIGN_ASSET(2) char gMsgKanji9274Tex[] = dgMsgKanji9274Tex; + +#define dgMsgKanji9275Tex "__OTR__textures/kanji/gMsgKanji9275Tex" +static const ALIGN_ASSET(2) char gMsgKanji9275Tex[] = dgMsgKanji9275Tex; + +#define dgMsgKanji9276Tex "__OTR__textures/kanji/gMsgKanji9276Tex" +static const ALIGN_ASSET(2) char gMsgKanji9276Tex[] = dgMsgKanji9276Tex; + +#define dgMsgKanji9277Tex "__OTR__textures/kanji/gMsgKanji9277Tex" +static const ALIGN_ASSET(2) char gMsgKanji9277Tex[] = dgMsgKanji9277Tex; + +#define dgMsgKanji9278Tex "__OTR__textures/kanji/gMsgKanji9278Tex" +static const ALIGN_ASSET(2) char gMsgKanji9278Tex[] = dgMsgKanji9278Tex; + +#define dgMsgKanji9279Tex "__OTR__textures/kanji/gMsgKanji9279Tex" +static const ALIGN_ASSET(2) char gMsgKanji9279Tex[] = dgMsgKanji9279Tex; + +#define dgMsgKanji927ATex "__OTR__textures/kanji/gMsgKanji927ATex" +static const ALIGN_ASSET(2) char gMsgKanji927ATex[] = dgMsgKanji927ATex; + +#define dgMsgKanji927BTex "__OTR__textures/kanji/gMsgKanji927BTex" +static const ALIGN_ASSET(2) char gMsgKanji927BTex[] = dgMsgKanji927BTex; + +#define dgMsgKanji927CTex "__OTR__textures/kanji/gMsgKanji927CTex" +static const ALIGN_ASSET(2) char gMsgKanji927CTex[] = dgMsgKanji927CTex; + +#define dgMsgKanji927DTex "__OTR__textures/kanji/gMsgKanji927DTex" +static const ALIGN_ASSET(2) char gMsgKanji927DTex[] = dgMsgKanji927DTex; + +#define dgMsgKanji927ETex "__OTR__textures/kanji/gMsgKanji927ETex" +static const ALIGN_ASSET(2) char gMsgKanji927ETex[] = dgMsgKanji927ETex; + +#define dgMsgKanji9280Tex "__OTR__textures/kanji/gMsgKanji9280Tex" +static const ALIGN_ASSET(2) char gMsgKanji9280Tex[] = dgMsgKanji9280Tex; + +#define dgMsgKanji9281Tex "__OTR__textures/kanji/gMsgKanji9281Tex" +static const ALIGN_ASSET(2) char gMsgKanji9281Tex[] = dgMsgKanji9281Tex; + +#define dgMsgKanji9282Tex "__OTR__textures/kanji/gMsgKanji9282Tex" +static const ALIGN_ASSET(2) char gMsgKanji9282Tex[] = dgMsgKanji9282Tex; + +#define dgMsgKanji9283Tex "__OTR__textures/kanji/gMsgKanji9283Tex" +static const ALIGN_ASSET(2) char gMsgKanji9283Tex[] = dgMsgKanji9283Tex; + +#define dgMsgKanji9284Tex "__OTR__textures/kanji/gMsgKanji9284Tex" +static const ALIGN_ASSET(2) char gMsgKanji9284Tex[] = dgMsgKanji9284Tex; + +#define dgMsgKanji9285Tex "__OTR__textures/kanji/gMsgKanji9285Tex" +static const ALIGN_ASSET(2) char gMsgKanji9285Tex[] = dgMsgKanji9285Tex; + +#define dgMsgKanji9286Tex "__OTR__textures/kanji/gMsgKanji9286Tex" +static const ALIGN_ASSET(2) char gMsgKanji9286Tex[] = dgMsgKanji9286Tex; + +#define dgMsgKanji9287Tex "__OTR__textures/kanji/gMsgKanji9287Tex" +static const ALIGN_ASSET(2) char gMsgKanji9287Tex[] = dgMsgKanji9287Tex; + +#define dgMsgKanji9288Tex "__OTR__textures/kanji/gMsgKanji9288Tex" +static const ALIGN_ASSET(2) char gMsgKanji9288Tex[] = dgMsgKanji9288Tex; + +#define dgMsgKanji9289Tex "__OTR__textures/kanji/gMsgKanji9289Tex" +static const ALIGN_ASSET(2) char gMsgKanji9289Tex[] = dgMsgKanji9289Tex; + +#define dgMsgKanji928ATex "__OTR__textures/kanji/gMsgKanji928ATex" +static const ALIGN_ASSET(2) char gMsgKanji928ATex[] = dgMsgKanji928ATex; + +#define dgMsgKanji928BTex "__OTR__textures/kanji/gMsgKanji928BTex" +static const ALIGN_ASSET(2) char gMsgKanji928BTex[] = dgMsgKanji928BTex; + +#define dgMsgKanji928CTex "__OTR__textures/kanji/gMsgKanji928CTex" +static const ALIGN_ASSET(2) char gMsgKanji928CTex[] = dgMsgKanji928CTex; + +#define dgMsgKanji928DTex "__OTR__textures/kanji/gMsgKanji928DTex" +static const ALIGN_ASSET(2) char gMsgKanji928DTex[] = dgMsgKanji928DTex; + +#define dgMsgKanji928ETex "__OTR__textures/kanji/gMsgKanji928ETex" +static const ALIGN_ASSET(2) char gMsgKanji928ETex[] = dgMsgKanji928ETex; + +#define dgMsgKanji928FTex "__OTR__textures/kanji/gMsgKanji928FTex" +static const ALIGN_ASSET(2) char gMsgKanji928FTex[] = dgMsgKanji928FTex; + +#define dgMsgKanji9290Tex "__OTR__textures/kanji/gMsgKanji9290Tex" +static const ALIGN_ASSET(2) char gMsgKanji9290Tex[] = dgMsgKanji9290Tex; + +#define dgMsgKanji9291Tex "__OTR__textures/kanji/gMsgKanji9291Tex" +static const ALIGN_ASSET(2) char gMsgKanji9291Tex[] = dgMsgKanji9291Tex; + +#define dgMsgKanji9292Tex "__OTR__textures/kanji/gMsgKanji9292Tex" +static const ALIGN_ASSET(2) char gMsgKanji9292Tex[] = dgMsgKanji9292Tex; + +#define dgMsgKanji9293Tex "__OTR__textures/kanji/gMsgKanji9293Tex" +static const ALIGN_ASSET(2) char gMsgKanji9293Tex[] = dgMsgKanji9293Tex; + +#define dgMsgKanji9294Tex "__OTR__textures/kanji/gMsgKanji9294Tex" +static const ALIGN_ASSET(2) char gMsgKanji9294Tex[] = dgMsgKanji9294Tex; + +#define dgMsgKanji9295Tex "__OTR__textures/kanji/gMsgKanji9295Tex" +static const ALIGN_ASSET(2) char gMsgKanji9295Tex[] = dgMsgKanji9295Tex; + +#define dgMsgKanji9296Tex "__OTR__textures/kanji/gMsgKanji9296Tex" +static const ALIGN_ASSET(2) char gMsgKanji9296Tex[] = dgMsgKanji9296Tex; + +#define dgMsgKanji9297Tex "__OTR__textures/kanji/gMsgKanji9297Tex" +static const ALIGN_ASSET(2) char gMsgKanji9297Tex[] = dgMsgKanji9297Tex; + +#define dgMsgKanji9298Tex "__OTR__textures/kanji/gMsgKanji9298Tex" +static const ALIGN_ASSET(2) char gMsgKanji9298Tex[] = dgMsgKanji9298Tex; + +#define dgMsgKanji9299Tex "__OTR__textures/kanji/gMsgKanji9299Tex" +static const ALIGN_ASSET(2) char gMsgKanji9299Tex[] = dgMsgKanji9299Tex; + +#define dgMsgKanji929ATex "__OTR__textures/kanji/gMsgKanji929ATex" +static const ALIGN_ASSET(2) char gMsgKanji929ATex[] = dgMsgKanji929ATex; + +#define dgMsgKanji929BTex "__OTR__textures/kanji/gMsgKanji929BTex" +static const ALIGN_ASSET(2) char gMsgKanji929BTex[] = dgMsgKanji929BTex; + +#define dgMsgKanji929CTex "__OTR__textures/kanji/gMsgKanji929CTex" +static const ALIGN_ASSET(2) char gMsgKanji929CTex[] = dgMsgKanji929CTex; + +#define dgMsgKanji929DTex "__OTR__textures/kanji/gMsgKanji929DTex" +static const ALIGN_ASSET(2) char gMsgKanji929DTex[] = dgMsgKanji929DTex; + +#define dgMsgKanji929ETex "__OTR__textures/kanji/gMsgKanji929ETex" +static const ALIGN_ASSET(2) char gMsgKanji929ETex[] = dgMsgKanji929ETex; + +#define dgMsgKanji929FTex "__OTR__textures/kanji/gMsgKanji929FTex" +static const ALIGN_ASSET(2) char gMsgKanji929FTex[] = dgMsgKanji929FTex; + +#define dgMsgKanji92A0Tex "__OTR__textures/kanji/gMsgKanji92A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A0Tex[] = dgMsgKanji92A0Tex; + +#define dgMsgKanji92A1Tex "__OTR__textures/kanji/gMsgKanji92A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A1Tex[] = dgMsgKanji92A1Tex; + +#define dgMsgKanji92A2Tex "__OTR__textures/kanji/gMsgKanji92A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A2Tex[] = dgMsgKanji92A2Tex; + +#define dgMsgKanji92A3Tex "__OTR__textures/kanji/gMsgKanji92A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A3Tex[] = dgMsgKanji92A3Tex; + +#define dgMsgKanji92A4Tex "__OTR__textures/kanji/gMsgKanji92A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A4Tex[] = dgMsgKanji92A4Tex; + +#define dgMsgKanji92A5Tex "__OTR__textures/kanji/gMsgKanji92A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A5Tex[] = dgMsgKanji92A5Tex; + +#define dgMsgKanji92A6Tex "__OTR__textures/kanji/gMsgKanji92A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A6Tex[] = dgMsgKanji92A6Tex; + +#define dgMsgKanji92A7Tex "__OTR__textures/kanji/gMsgKanji92A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A7Tex[] = dgMsgKanji92A7Tex; + +#define dgMsgKanji92A8Tex "__OTR__textures/kanji/gMsgKanji92A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A8Tex[] = dgMsgKanji92A8Tex; + +#define dgMsgKanji92A9Tex "__OTR__textures/kanji/gMsgKanji92A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92A9Tex[] = dgMsgKanji92A9Tex; + +#define dgMsgKanji92AATex "__OTR__textures/kanji/gMsgKanji92AATex" +static const ALIGN_ASSET(2) char gMsgKanji92AATex[] = dgMsgKanji92AATex; + +#define dgMsgKanji92ABTex "__OTR__textures/kanji/gMsgKanji92ABTex" +static const ALIGN_ASSET(2) char gMsgKanji92ABTex[] = dgMsgKanji92ABTex; + +#define dgMsgKanji92ACTex "__OTR__textures/kanji/gMsgKanji92ACTex" +static const ALIGN_ASSET(2) char gMsgKanji92ACTex[] = dgMsgKanji92ACTex; + +#define dgMsgKanji92ADTex "__OTR__textures/kanji/gMsgKanji92ADTex" +static const ALIGN_ASSET(2) char gMsgKanji92ADTex[] = dgMsgKanji92ADTex; + +#define dgMsgKanji92AETex "__OTR__textures/kanji/gMsgKanji92AETex" +static const ALIGN_ASSET(2) char gMsgKanji92AETex[] = dgMsgKanji92AETex; + +#define dgMsgKanji92AFTex "__OTR__textures/kanji/gMsgKanji92AFTex" +static const ALIGN_ASSET(2) char gMsgKanji92AFTex[] = dgMsgKanji92AFTex; + +#define dgMsgKanji92B0Tex "__OTR__textures/kanji/gMsgKanji92B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B0Tex[] = dgMsgKanji92B0Tex; + +#define dgMsgKanji92B1Tex "__OTR__textures/kanji/gMsgKanji92B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B1Tex[] = dgMsgKanji92B1Tex; + +#define dgMsgKanji92B2Tex "__OTR__textures/kanji/gMsgKanji92B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B2Tex[] = dgMsgKanji92B2Tex; + +#define dgMsgKanji92B3Tex "__OTR__textures/kanji/gMsgKanji92B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B3Tex[] = dgMsgKanji92B3Tex; + +#define dgMsgKanji92B4Tex "__OTR__textures/kanji/gMsgKanji92B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B4Tex[] = dgMsgKanji92B4Tex; + +#define dgMsgKanji92B5Tex "__OTR__textures/kanji/gMsgKanji92B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B5Tex[] = dgMsgKanji92B5Tex; + +#define dgMsgKanji92B6Tex "__OTR__textures/kanji/gMsgKanji92B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B6Tex[] = dgMsgKanji92B6Tex; + +#define dgMsgKanji92B7Tex "__OTR__textures/kanji/gMsgKanji92B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B7Tex[] = dgMsgKanji92B7Tex; + +#define dgMsgKanji92B8Tex "__OTR__textures/kanji/gMsgKanji92B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B8Tex[] = dgMsgKanji92B8Tex; + +#define dgMsgKanji92B9Tex "__OTR__textures/kanji/gMsgKanji92B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92B9Tex[] = dgMsgKanji92B9Tex; + +#define dgMsgKanji92BATex "__OTR__textures/kanji/gMsgKanji92BATex" +static const ALIGN_ASSET(2) char gMsgKanji92BATex[] = dgMsgKanji92BATex; + +#define dgMsgKanji92BBTex "__OTR__textures/kanji/gMsgKanji92BBTex" +static const ALIGN_ASSET(2) char gMsgKanji92BBTex[] = dgMsgKanji92BBTex; + +#define dgMsgKanji92BCTex "__OTR__textures/kanji/gMsgKanji92BCTex" +static const ALIGN_ASSET(2) char gMsgKanji92BCTex[] = dgMsgKanji92BCTex; + +#define dgMsgKanji92BDTex "__OTR__textures/kanji/gMsgKanji92BDTex" +static const ALIGN_ASSET(2) char gMsgKanji92BDTex[] = dgMsgKanji92BDTex; + +#define dgMsgKanji92BETex "__OTR__textures/kanji/gMsgKanji92BETex" +static const ALIGN_ASSET(2) char gMsgKanji92BETex[] = dgMsgKanji92BETex; + +#define dgMsgKanji92BFTex "__OTR__textures/kanji/gMsgKanji92BFTex" +static const ALIGN_ASSET(2) char gMsgKanji92BFTex[] = dgMsgKanji92BFTex; + +#define dgMsgKanji92C0Tex "__OTR__textures/kanji/gMsgKanji92C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C0Tex[] = dgMsgKanji92C0Tex; + +#define dgMsgKanji92C1Tex "__OTR__textures/kanji/gMsgKanji92C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C1Tex[] = dgMsgKanji92C1Tex; + +#define dgMsgKanji92C2Tex "__OTR__textures/kanji/gMsgKanji92C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C2Tex[] = dgMsgKanji92C2Tex; + +#define dgMsgKanji92C3Tex "__OTR__textures/kanji/gMsgKanji92C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C3Tex[] = dgMsgKanji92C3Tex; + +#define dgMsgKanji92C4Tex "__OTR__textures/kanji/gMsgKanji92C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C4Tex[] = dgMsgKanji92C4Tex; + +#define dgMsgKanji92C5Tex "__OTR__textures/kanji/gMsgKanji92C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C5Tex[] = dgMsgKanji92C5Tex; + +#define dgMsgKanji92C6Tex "__OTR__textures/kanji/gMsgKanji92C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C6Tex[] = dgMsgKanji92C6Tex; + +#define dgMsgKanji92C7Tex "__OTR__textures/kanji/gMsgKanji92C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C7Tex[] = dgMsgKanji92C7Tex; + +#define dgMsgKanji92C8Tex "__OTR__textures/kanji/gMsgKanji92C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C8Tex[] = dgMsgKanji92C8Tex; + +#define dgMsgKanji92C9Tex "__OTR__textures/kanji/gMsgKanji92C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92C9Tex[] = dgMsgKanji92C9Tex; + +#define dgMsgKanji92CATex "__OTR__textures/kanji/gMsgKanji92CATex" +static const ALIGN_ASSET(2) char gMsgKanji92CATex[] = dgMsgKanji92CATex; + +#define dgMsgKanji92CBTex "__OTR__textures/kanji/gMsgKanji92CBTex" +static const ALIGN_ASSET(2) char gMsgKanji92CBTex[] = dgMsgKanji92CBTex; + +#define dgMsgKanji92CCTex "__OTR__textures/kanji/gMsgKanji92CCTex" +static const ALIGN_ASSET(2) char gMsgKanji92CCTex[] = dgMsgKanji92CCTex; + +#define dgMsgKanji92CDTex "__OTR__textures/kanji/gMsgKanji92CDTex" +static const ALIGN_ASSET(2) char gMsgKanji92CDTex[] = dgMsgKanji92CDTex; + +#define dgMsgKanji92CETex "__OTR__textures/kanji/gMsgKanji92CETex" +static const ALIGN_ASSET(2) char gMsgKanji92CETex[] = dgMsgKanji92CETex; + +#define dgMsgKanji92CFTex "__OTR__textures/kanji/gMsgKanji92CFTex" +static const ALIGN_ASSET(2) char gMsgKanji92CFTex[] = dgMsgKanji92CFTex; + +#define dgMsgKanji92D0Tex "__OTR__textures/kanji/gMsgKanji92D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D0Tex[] = dgMsgKanji92D0Tex; + +#define dgMsgKanji92D1Tex "__OTR__textures/kanji/gMsgKanji92D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D1Tex[] = dgMsgKanji92D1Tex; + +#define dgMsgKanji92D2Tex "__OTR__textures/kanji/gMsgKanji92D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D2Tex[] = dgMsgKanji92D2Tex; + +#define dgMsgKanji92D3Tex "__OTR__textures/kanji/gMsgKanji92D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D3Tex[] = dgMsgKanji92D3Tex; + +#define dgMsgKanji92D4Tex "__OTR__textures/kanji/gMsgKanji92D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D4Tex[] = dgMsgKanji92D4Tex; + +#define dgMsgKanji92D5Tex "__OTR__textures/kanji/gMsgKanji92D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D5Tex[] = dgMsgKanji92D5Tex; + +#define dgMsgKanji92D6Tex "__OTR__textures/kanji/gMsgKanji92D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D6Tex[] = dgMsgKanji92D6Tex; + +#define dgMsgKanji92D7Tex "__OTR__textures/kanji/gMsgKanji92D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D7Tex[] = dgMsgKanji92D7Tex; + +#define dgMsgKanji92D8Tex "__OTR__textures/kanji/gMsgKanji92D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D8Tex[] = dgMsgKanji92D8Tex; + +#define dgMsgKanji92D9Tex "__OTR__textures/kanji/gMsgKanji92D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92D9Tex[] = dgMsgKanji92D9Tex; + +#define dgMsgKanji92DATex "__OTR__textures/kanji/gMsgKanji92DATex" +static const ALIGN_ASSET(2) char gMsgKanji92DATex[] = dgMsgKanji92DATex; + +#define dgMsgKanji92DBTex "__OTR__textures/kanji/gMsgKanji92DBTex" +static const ALIGN_ASSET(2) char gMsgKanji92DBTex[] = dgMsgKanji92DBTex; + +#define dgMsgKanji92DCTex "__OTR__textures/kanji/gMsgKanji92DCTex" +static const ALIGN_ASSET(2) char gMsgKanji92DCTex[] = dgMsgKanji92DCTex; + +#define dgMsgKanji92DDTex "__OTR__textures/kanji/gMsgKanji92DDTex" +static const ALIGN_ASSET(2) char gMsgKanji92DDTex[] = dgMsgKanji92DDTex; + +#define dgMsgKanji92DETex "__OTR__textures/kanji/gMsgKanji92DETex" +static const ALIGN_ASSET(2) char gMsgKanji92DETex[] = dgMsgKanji92DETex; + +#define dgMsgKanji92DFTex "__OTR__textures/kanji/gMsgKanji92DFTex" +static const ALIGN_ASSET(2) char gMsgKanji92DFTex[] = dgMsgKanji92DFTex; + +#define dgMsgKanji92E0Tex "__OTR__textures/kanji/gMsgKanji92E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E0Tex[] = dgMsgKanji92E0Tex; + +#define dgMsgKanji92E1Tex "__OTR__textures/kanji/gMsgKanji92E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E1Tex[] = dgMsgKanji92E1Tex; + +#define dgMsgKanji92E2Tex "__OTR__textures/kanji/gMsgKanji92E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E2Tex[] = dgMsgKanji92E2Tex; + +#define dgMsgKanji92E3Tex "__OTR__textures/kanji/gMsgKanji92E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E3Tex[] = dgMsgKanji92E3Tex; + +#define dgMsgKanji92E4Tex "__OTR__textures/kanji/gMsgKanji92E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E4Tex[] = dgMsgKanji92E4Tex; + +#define dgMsgKanji92E5Tex "__OTR__textures/kanji/gMsgKanji92E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E5Tex[] = dgMsgKanji92E5Tex; + +#define dgMsgKanji92E6Tex "__OTR__textures/kanji/gMsgKanji92E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E6Tex[] = dgMsgKanji92E6Tex; + +#define dgMsgKanji92E7Tex "__OTR__textures/kanji/gMsgKanji92E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E7Tex[] = dgMsgKanji92E7Tex; + +#define dgMsgKanji92E8Tex "__OTR__textures/kanji/gMsgKanji92E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E8Tex[] = dgMsgKanji92E8Tex; + +#define dgMsgKanji92E9Tex "__OTR__textures/kanji/gMsgKanji92E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92E9Tex[] = dgMsgKanji92E9Tex; + +#define dgMsgKanji92EATex "__OTR__textures/kanji/gMsgKanji92EATex" +static const ALIGN_ASSET(2) char gMsgKanji92EATex[] = dgMsgKanji92EATex; + +#define dgMsgKanji92EBTex "__OTR__textures/kanji/gMsgKanji92EBTex" +static const ALIGN_ASSET(2) char gMsgKanji92EBTex[] = dgMsgKanji92EBTex; + +#define dgMsgKanji92ECTex "__OTR__textures/kanji/gMsgKanji92ECTex" +static const ALIGN_ASSET(2) char gMsgKanji92ECTex[] = dgMsgKanji92ECTex; + +#define dgMsgKanji92EDTex "__OTR__textures/kanji/gMsgKanji92EDTex" +static const ALIGN_ASSET(2) char gMsgKanji92EDTex[] = dgMsgKanji92EDTex; + +#define dgMsgKanji92EETex "__OTR__textures/kanji/gMsgKanji92EETex" +static const ALIGN_ASSET(2) char gMsgKanji92EETex[] = dgMsgKanji92EETex; + +#define dgMsgKanji92EFTex "__OTR__textures/kanji/gMsgKanji92EFTex" +static const ALIGN_ASSET(2) char gMsgKanji92EFTex[] = dgMsgKanji92EFTex; + +#define dgMsgKanji92F0Tex "__OTR__textures/kanji/gMsgKanji92F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F0Tex[] = dgMsgKanji92F0Tex; + +#define dgMsgKanji92F1Tex "__OTR__textures/kanji/gMsgKanji92F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F1Tex[] = dgMsgKanji92F1Tex; + +#define dgMsgKanji92F2Tex "__OTR__textures/kanji/gMsgKanji92F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F2Tex[] = dgMsgKanji92F2Tex; + +#define dgMsgKanji92F3Tex "__OTR__textures/kanji/gMsgKanji92F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F3Tex[] = dgMsgKanji92F3Tex; + +#define dgMsgKanji92F4Tex "__OTR__textures/kanji/gMsgKanji92F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F4Tex[] = dgMsgKanji92F4Tex; + +#define dgMsgKanji92F5Tex "__OTR__textures/kanji/gMsgKanji92F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F5Tex[] = dgMsgKanji92F5Tex; + +#define dgMsgKanji92F6Tex "__OTR__textures/kanji/gMsgKanji92F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F6Tex[] = dgMsgKanji92F6Tex; + +#define dgMsgKanji92F7Tex "__OTR__textures/kanji/gMsgKanji92F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F7Tex[] = dgMsgKanji92F7Tex; + +#define dgMsgKanji92F8Tex "__OTR__textures/kanji/gMsgKanji92F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F8Tex[] = dgMsgKanji92F8Tex; + +#define dgMsgKanji92F9Tex "__OTR__textures/kanji/gMsgKanji92F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji92F9Tex[] = dgMsgKanji92F9Tex; + +#define dgMsgKanji92FATex "__OTR__textures/kanji/gMsgKanji92FATex" +static const ALIGN_ASSET(2) char gMsgKanji92FATex[] = dgMsgKanji92FATex; + +#define dgMsgKanji92FBTex "__OTR__textures/kanji/gMsgKanji92FBTex" +static const ALIGN_ASSET(2) char gMsgKanji92FBTex[] = dgMsgKanji92FBTex; + +#define dgMsgKanji92FCTex "__OTR__textures/kanji/gMsgKanji92FCTex" +static const ALIGN_ASSET(2) char gMsgKanji92FCTex[] = dgMsgKanji92FCTex; + +#define dgMsgKanji9340Tex "__OTR__textures/kanji/gMsgKanji9340Tex" +static const ALIGN_ASSET(2) char gMsgKanji9340Tex[] = dgMsgKanji9340Tex; + +#define dgMsgKanji9341Tex "__OTR__textures/kanji/gMsgKanji9341Tex" +static const ALIGN_ASSET(2) char gMsgKanji9341Tex[] = dgMsgKanji9341Tex; + +#define dgMsgKanji9342Tex "__OTR__textures/kanji/gMsgKanji9342Tex" +static const ALIGN_ASSET(2) char gMsgKanji9342Tex[] = dgMsgKanji9342Tex; + +#define dgMsgKanji9343Tex "__OTR__textures/kanji/gMsgKanji9343Tex" +static const ALIGN_ASSET(2) char gMsgKanji9343Tex[] = dgMsgKanji9343Tex; + +#define dgMsgKanji9344Tex "__OTR__textures/kanji/gMsgKanji9344Tex" +static const ALIGN_ASSET(2) char gMsgKanji9344Tex[] = dgMsgKanji9344Tex; + +#define dgMsgKanji9345Tex "__OTR__textures/kanji/gMsgKanji9345Tex" +static const ALIGN_ASSET(2) char gMsgKanji9345Tex[] = dgMsgKanji9345Tex; + +#define dgMsgKanji9346Tex "__OTR__textures/kanji/gMsgKanji9346Tex" +static const ALIGN_ASSET(2) char gMsgKanji9346Tex[] = dgMsgKanji9346Tex; + +#define dgMsgKanji9347Tex "__OTR__textures/kanji/gMsgKanji9347Tex" +static const ALIGN_ASSET(2) char gMsgKanji9347Tex[] = dgMsgKanji9347Tex; + +#define dgMsgKanji9348Tex "__OTR__textures/kanji/gMsgKanji9348Tex" +static const ALIGN_ASSET(2) char gMsgKanji9348Tex[] = dgMsgKanji9348Tex; + +#define dgMsgKanji9349Tex "__OTR__textures/kanji/gMsgKanji9349Tex" +static const ALIGN_ASSET(2) char gMsgKanji9349Tex[] = dgMsgKanji9349Tex; + +#define dgMsgKanji934ATex "__OTR__textures/kanji/gMsgKanji934ATex" +static const ALIGN_ASSET(2) char gMsgKanji934ATex[] = dgMsgKanji934ATex; + +#define dgMsgKanji934BTex "__OTR__textures/kanji/gMsgKanji934BTex" +static const ALIGN_ASSET(2) char gMsgKanji934BTex[] = dgMsgKanji934BTex; + +#define dgMsgKanji934CTex "__OTR__textures/kanji/gMsgKanji934CTex" +static const ALIGN_ASSET(2) char gMsgKanji934CTex[] = dgMsgKanji934CTex; + +#define dgMsgKanji934DTex "__OTR__textures/kanji/gMsgKanji934DTex" +static const ALIGN_ASSET(2) char gMsgKanji934DTex[] = dgMsgKanji934DTex; + +#define dgMsgKanji934ETex "__OTR__textures/kanji/gMsgKanji934ETex" +static const ALIGN_ASSET(2) char gMsgKanji934ETex[] = dgMsgKanji934ETex; + +#define dgMsgKanji934FTex "__OTR__textures/kanji/gMsgKanji934FTex" +static const ALIGN_ASSET(2) char gMsgKanji934FTex[] = dgMsgKanji934FTex; + +#define dgMsgKanji9350Tex "__OTR__textures/kanji/gMsgKanji9350Tex" +static const ALIGN_ASSET(2) char gMsgKanji9350Tex[] = dgMsgKanji9350Tex; + +#define dgMsgKanji9351Tex "__OTR__textures/kanji/gMsgKanji9351Tex" +static const ALIGN_ASSET(2) char gMsgKanji9351Tex[] = dgMsgKanji9351Tex; + +#define dgMsgKanji9352Tex "__OTR__textures/kanji/gMsgKanji9352Tex" +static const ALIGN_ASSET(2) char gMsgKanji9352Tex[] = dgMsgKanji9352Tex; + +#define dgMsgKanji9353Tex "__OTR__textures/kanji/gMsgKanji9353Tex" +static const ALIGN_ASSET(2) char gMsgKanji9353Tex[] = dgMsgKanji9353Tex; + +#define dgMsgKanji9354Tex "__OTR__textures/kanji/gMsgKanji9354Tex" +static const ALIGN_ASSET(2) char gMsgKanji9354Tex[] = dgMsgKanji9354Tex; + +#define dgMsgKanji9355Tex "__OTR__textures/kanji/gMsgKanji9355Tex" +static const ALIGN_ASSET(2) char gMsgKanji9355Tex[] = dgMsgKanji9355Tex; + +#define dgMsgKanji9356Tex "__OTR__textures/kanji/gMsgKanji9356Tex" +static const ALIGN_ASSET(2) char gMsgKanji9356Tex[] = dgMsgKanji9356Tex; + +#define dgMsgKanji9357Tex "__OTR__textures/kanji/gMsgKanji9357Tex" +static const ALIGN_ASSET(2) char gMsgKanji9357Tex[] = dgMsgKanji9357Tex; + +#define dgMsgKanji9358Tex "__OTR__textures/kanji/gMsgKanji9358Tex" +static const ALIGN_ASSET(2) char gMsgKanji9358Tex[] = dgMsgKanji9358Tex; + +#define dgMsgKanji9359Tex "__OTR__textures/kanji/gMsgKanji9359Tex" +static const ALIGN_ASSET(2) char gMsgKanji9359Tex[] = dgMsgKanji9359Tex; + +#define dgMsgKanji935ATex "__OTR__textures/kanji/gMsgKanji935ATex" +static const ALIGN_ASSET(2) char gMsgKanji935ATex[] = dgMsgKanji935ATex; + +#define dgMsgKanji935BTex "__OTR__textures/kanji/gMsgKanji935BTex" +static const ALIGN_ASSET(2) char gMsgKanji935BTex[] = dgMsgKanji935BTex; + +#define dgMsgKanji935CTex "__OTR__textures/kanji/gMsgKanji935CTex" +static const ALIGN_ASSET(2) char gMsgKanji935CTex[] = dgMsgKanji935CTex; + +#define dgMsgKanji935DTex "__OTR__textures/kanji/gMsgKanji935DTex" +static const ALIGN_ASSET(2) char gMsgKanji935DTex[] = dgMsgKanji935DTex; + +#define dgMsgKanji935ETex "__OTR__textures/kanji/gMsgKanji935ETex" +static const ALIGN_ASSET(2) char gMsgKanji935ETex[] = dgMsgKanji935ETex; + +#define dgMsgKanji935FTex "__OTR__textures/kanji/gMsgKanji935FTex" +static const ALIGN_ASSET(2) char gMsgKanji935FTex[] = dgMsgKanji935FTex; + +#define dgMsgKanji9360Tex "__OTR__textures/kanji/gMsgKanji9360Tex" +static const ALIGN_ASSET(2) char gMsgKanji9360Tex[] = dgMsgKanji9360Tex; + +#define dgMsgKanji9361Tex "__OTR__textures/kanji/gMsgKanji9361Tex" +static const ALIGN_ASSET(2) char gMsgKanji9361Tex[] = dgMsgKanji9361Tex; + +#define dgMsgKanji9362Tex "__OTR__textures/kanji/gMsgKanji9362Tex" +static const ALIGN_ASSET(2) char gMsgKanji9362Tex[] = dgMsgKanji9362Tex; + +#define dgMsgKanji9363Tex "__OTR__textures/kanji/gMsgKanji9363Tex" +static const ALIGN_ASSET(2) char gMsgKanji9363Tex[] = dgMsgKanji9363Tex; + +#define dgMsgKanji9364Tex "__OTR__textures/kanji/gMsgKanji9364Tex" +static const ALIGN_ASSET(2) char gMsgKanji9364Tex[] = dgMsgKanji9364Tex; + +#define dgMsgKanji9365Tex "__OTR__textures/kanji/gMsgKanji9365Tex" +static const ALIGN_ASSET(2) char gMsgKanji9365Tex[] = dgMsgKanji9365Tex; + +#define dgMsgKanji9366Tex "__OTR__textures/kanji/gMsgKanji9366Tex" +static const ALIGN_ASSET(2) char gMsgKanji9366Tex[] = dgMsgKanji9366Tex; + +#define dgMsgKanji9367Tex "__OTR__textures/kanji/gMsgKanji9367Tex" +static const ALIGN_ASSET(2) char gMsgKanji9367Tex[] = dgMsgKanji9367Tex; + +#define dgMsgKanji9368Tex "__OTR__textures/kanji/gMsgKanji9368Tex" +static const ALIGN_ASSET(2) char gMsgKanji9368Tex[] = dgMsgKanji9368Tex; + +#define dgMsgKanji9369Tex "__OTR__textures/kanji/gMsgKanji9369Tex" +static const ALIGN_ASSET(2) char gMsgKanji9369Tex[] = dgMsgKanji9369Tex; + +#define dgMsgKanji936ATex "__OTR__textures/kanji/gMsgKanji936ATex" +static const ALIGN_ASSET(2) char gMsgKanji936ATex[] = dgMsgKanji936ATex; + +#define dgMsgKanji936BTex "__OTR__textures/kanji/gMsgKanji936BTex" +static const ALIGN_ASSET(2) char gMsgKanji936BTex[] = dgMsgKanji936BTex; + +#define dgMsgKanji936CTex "__OTR__textures/kanji/gMsgKanji936CTex" +static const ALIGN_ASSET(2) char gMsgKanji936CTex[] = dgMsgKanji936CTex; + +#define dgMsgKanji936DTex "__OTR__textures/kanji/gMsgKanji936DTex" +static const ALIGN_ASSET(2) char gMsgKanji936DTex[] = dgMsgKanji936DTex; + +#define dgMsgKanji936ETex "__OTR__textures/kanji/gMsgKanji936ETex" +static const ALIGN_ASSET(2) char gMsgKanji936ETex[] = dgMsgKanji936ETex; + +#define dgMsgKanji936FTex "__OTR__textures/kanji/gMsgKanji936FTex" +static const ALIGN_ASSET(2) char gMsgKanji936FTex[] = dgMsgKanji936FTex; + +#define dgMsgKanji9370Tex "__OTR__textures/kanji/gMsgKanji9370Tex" +static const ALIGN_ASSET(2) char gMsgKanji9370Tex[] = dgMsgKanji9370Tex; + +#define dgMsgKanji9371Tex "__OTR__textures/kanji/gMsgKanji9371Tex" +static const ALIGN_ASSET(2) char gMsgKanji9371Tex[] = dgMsgKanji9371Tex; + +#define dgMsgKanji9372Tex "__OTR__textures/kanji/gMsgKanji9372Tex" +static const ALIGN_ASSET(2) char gMsgKanji9372Tex[] = dgMsgKanji9372Tex; + +#define dgMsgKanji9373Tex "__OTR__textures/kanji/gMsgKanji9373Tex" +static const ALIGN_ASSET(2) char gMsgKanji9373Tex[] = dgMsgKanji9373Tex; + +#define dgMsgKanji9374Tex "__OTR__textures/kanji/gMsgKanji9374Tex" +static const ALIGN_ASSET(2) char gMsgKanji9374Tex[] = dgMsgKanji9374Tex; + +#define dgMsgKanji9375Tex "__OTR__textures/kanji/gMsgKanji9375Tex" +static const ALIGN_ASSET(2) char gMsgKanji9375Tex[] = dgMsgKanji9375Tex; + +#define dgMsgKanji9376Tex "__OTR__textures/kanji/gMsgKanji9376Tex" +static const ALIGN_ASSET(2) char gMsgKanji9376Tex[] = dgMsgKanji9376Tex; + +#define dgMsgKanji9377Tex "__OTR__textures/kanji/gMsgKanji9377Tex" +static const ALIGN_ASSET(2) char gMsgKanji9377Tex[] = dgMsgKanji9377Tex; + +#define dgMsgKanji9378Tex "__OTR__textures/kanji/gMsgKanji9378Tex" +static const ALIGN_ASSET(2) char gMsgKanji9378Tex[] = dgMsgKanji9378Tex; + +#define dgMsgKanji9379Tex "__OTR__textures/kanji/gMsgKanji9379Tex" +static const ALIGN_ASSET(2) char gMsgKanji9379Tex[] = dgMsgKanji9379Tex; + +#define dgMsgKanji937ATex "__OTR__textures/kanji/gMsgKanji937ATex" +static const ALIGN_ASSET(2) char gMsgKanji937ATex[] = dgMsgKanji937ATex; + +#define dgMsgKanji937BTex "__OTR__textures/kanji/gMsgKanji937BTex" +static const ALIGN_ASSET(2) char gMsgKanji937BTex[] = dgMsgKanji937BTex; + +#define dgMsgKanji937CTex "__OTR__textures/kanji/gMsgKanji937CTex" +static const ALIGN_ASSET(2) char gMsgKanji937CTex[] = dgMsgKanji937CTex; + +#define dgMsgKanji937DTex "__OTR__textures/kanji/gMsgKanji937DTex" +static const ALIGN_ASSET(2) char gMsgKanji937DTex[] = dgMsgKanji937DTex; + +#define dgMsgKanji937ETex "__OTR__textures/kanji/gMsgKanji937ETex" +static const ALIGN_ASSET(2) char gMsgKanji937ETex[] = dgMsgKanji937ETex; + +#define dgMsgKanji9380Tex "__OTR__textures/kanji/gMsgKanji9380Tex" +static const ALIGN_ASSET(2) char gMsgKanji9380Tex[] = dgMsgKanji9380Tex; + +#define dgMsgKanji9381Tex "__OTR__textures/kanji/gMsgKanji9381Tex" +static const ALIGN_ASSET(2) char gMsgKanji9381Tex[] = dgMsgKanji9381Tex; + +#define dgMsgKanji9382Tex "__OTR__textures/kanji/gMsgKanji9382Tex" +static const ALIGN_ASSET(2) char gMsgKanji9382Tex[] = dgMsgKanji9382Tex; + +#define dgMsgKanji9383Tex "__OTR__textures/kanji/gMsgKanji9383Tex" +static const ALIGN_ASSET(2) char gMsgKanji9383Tex[] = dgMsgKanji9383Tex; + +#define dgMsgKanji9384Tex "__OTR__textures/kanji/gMsgKanji9384Tex" +static const ALIGN_ASSET(2) char gMsgKanji9384Tex[] = dgMsgKanji9384Tex; + +#define dgMsgKanji9385Tex "__OTR__textures/kanji/gMsgKanji9385Tex" +static const ALIGN_ASSET(2) char gMsgKanji9385Tex[] = dgMsgKanji9385Tex; + +#define dgMsgKanji9386Tex "__OTR__textures/kanji/gMsgKanji9386Tex" +static const ALIGN_ASSET(2) char gMsgKanji9386Tex[] = dgMsgKanji9386Tex; + +#define dgMsgKanji9387Tex "__OTR__textures/kanji/gMsgKanji9387Tex" +static const ALIGN_ASSET(2) char gMsgKanji9387Tex[] = dgMsgKanji9387Tex; + +#define dgMsgKanji9388Tex "__OTR__textures/kanji/gMsgKanji9388Tex" +static const ALIGN_ASSET(2) char gMsgKanji9388Tex[] = dgMsgKanji9388Tex; + +#define dgMsgKanji9389Tex "__OTR__textures/kanji/gMsgKanji9389Tex" +static const ALIGN_ASSET(2) char gMsgKanji9389Tex[] = dgMsgKanji9389Tex; + +#define dgMsgKanji938ATex "__OTR__textures/kanji/gMsgKanji938ATex" +static const ALIGN_ASSET(2) char gMsgKanji938ATex[] = dgMsgKanji938ATex; + +#define dgMsgKanji938BTex "__OTR__textures/kanji/gMsgKanji938BTex" +static const ALIGN_ASSET(2) char gMsgKanji938BTex[] = dgMsgKanji938BTex; + +#define dgMsgKanji938CTex "__OTR__textures/kanji/gMsgKanji938CTex" +static const ALIGN_ASSET(2) char gMsgKanji938CTex[] = dgMsgKanji938CTex; + +#define dgMsgKanji938DTex "__OTR__textures/kanji/gMsgKanji938DTex" +static const ALIGN_ASSET(2) char gMsgKanji938DTex[] = dgMsgKanji938DTex; + +#define dgMsgKanji938ETex "__OTR__textures/kanji/gMsgKanji938ETex" +static const ALIGN_ASSET(2) char gMsgKanji938ETex[] = dgMsgKanji938ETex; + +#define dgMsgKanji938FTex "__OTR__textures/kanji/gMsgKanji938FTex" +static const ALIGN_ASSET(2) char gMsgKanji938FTex[] = dgMsgKanji938FTex; + +#define dgMsgKanji9390Tex "__OTR__textures/kanji/gMsgKanji9390Tex" +static const ALIGN_ASSET(2) char gMsgKanji9390Tex[] = dgMsgKanji9390Tex; + +#define dgMsgKanji9391Tex "__OTR__textures/kanji/gMsgKanji9391Tex" +static const ALIGN_ASSET(2) char gMsgKanji9391Tex[] = dgMsgKanji9391Tex; + +#define dgMsgKanji9392Tex "__OTR__textures/kanji/gMsgKanji9392Tex" +static const ALIGN_ASSET(2) char gMsgKanji9392Tex[] = dgMsgKanji9392Tex; + +#define dgMsgKanji9393Tex "__OTR__textures/kanji/gMsgKanji9393Tex" +static const ALIGN_ASSET(2) char gMsgKanji9393Tex[] = dgMsgKanji9393Tex; + +#define dgMsgKanji9394Tex "__OTR__textures/kanji/gMsgKanji9394Tex" +static const ALIGN_ASSET(2) char gMsgKanji9394Tex[] = dgMsgKanji9394Tex; + +#define dgMsgKanji9395Tex "__OTR__textures/kanji/gMsgKanji9395Tex" +static const ALIGN_ASSET(2) char gMsgKanji9395Tex[] = dgMsgKanji9395Tex; + +#define dgMsgKanji9396Tex "__OTR__textures/kanji/gMsgKanji9396Tex" +static const ALIGN_ASSET(2) char gMsgKanji9396Tex[] = dgMsgKanji9396Tex; + +#define dgMsgKanji9397Tex "__OTR__textures/kanji/gMsgKanji9397Tex" +static const ALIGN_ASSET(2) char gMsgKanji9397Tex[] = dgMsgKanji9397Tex; + +#define dgMsgKanji9398Tex "__OTR__textures/kanji/gMsgKanji9398Tex" +static const ALIGN_ASSET(2) char gMsgKanji9398Tex[] = dgMsgKanji9398Tex; + +#define dgMsgKanji9399Tex "__OTR__textures/kanji/gMsgKanji9399Tex" +static const ALIGN_ASSET(2) char gMsgKanji9399Tex[] = dgMsgKanji9399Tex; + +#define dgMsgKanji939ATex "__OTR__textures/kanji/gMsgKanji939ATex" +static const ALIGN_ASSET(2) char gMsgKanji939ATex[] = dgMsgKanji939ATex; + +#define dgMsgKanji939BTex "__OTR__textures/kanji/gMsgKanji939BTex" +static const ALIGN_ASSET(2) char gMsgKanji939BTex[] = dgMsgKanji939BTex; + +#define dgMsgKanji939CTex "__OTR__textures/kanji/gMsgKanji939CTex" +static const ALIGN_ASSET(2) char gMsgKanji939CTex[] = dgMsgKanji939CTex; + +#define dgMsgKanji939DTex "__OTR__textures/kanji/gMsgKanji939DTex" +static const ALIGN_ASSET(2) char gMsgKanji939DTex[] = dgMsgKanji939DTex; + +#define dgMsgKanji939ETex "__OTR__textures/kanji/gMsgKanji939ETex" +static const ALIGN_ASSET(2) char gMsgKanji939ETex[] = dgMsgKanji939ETex; + +#define dgMsgKanji939FTex "__OTR__textures/kanji/gMsgKanji939FTex" +static const ALIGN_ASSET(2) char gMsgKanji939FTex[] = dgMsgKanji939FTex; + +#define dgMsgKanji93A0Tex "__OTR__textures/kanji/gMsgKanji93A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A0Tex[] = dgMsgKanji93A0Tex; + +#define dgMsgKanji93A1Tex "__OTR__textures/kanji/gMsgKanji93A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A1Tex[] = dgMsgKanji93A1Tex; + +#define dgMsgKanji93A2Tex "__OTR__textures/kanji/gMsgKanji93A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A2Tex[] = dgMsgKanji93A2Tex; + +#define dgMsgKanji93A3Tex "__OTR__textures/kanji/gMsgKanji93A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A3Tex[] = dgMsgKanji93A3Tex; + +#define dgMsgKanji93A4Tex "__OTR__textures/kanji/gMsgKanji93A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A4Tex[] = dgMsgKanji93A4Tex; + +#define dgMsgKanji93A5Tex "__OTR__textures/kanji/gMsgKanji93A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A5Tex[] = dgMsgKanji93A5Tex; + +#define dgMsgKanji93A6Tex "__OTR__textures/kanji/gMsgKanji93A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A6Tex[] = dgMsgKanji93A6Tex; + +#define dgMsgKanji93A7Tex "__OTR__textures/kanji/gMsgKanji93A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A7Tex[] = dgMsgKanji93A7Tex; + +#define dgMsgKanji93A8Tex "__OTR__textures/kanji/gMsgKanji93A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A8Tex[] = dgMsgKanji93A8Tex; + +#define dgMsgKanji93A9Tex "__OTR__textures/kanji/gMsgKanji93A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93A9Tex[] = dgMsgKanji93A9Tex; + +#define dgMsgKanji93AATex "__OTR__textures/kanji/gMsgKanji93AATex" +static const ALIGN_ASSET(2) char gMsgKanji93AATex[] = dgMsgKanji93AATex; + +#define dgMsgKanji93ABTex "__OTR__textures/kanji/gMsgKanji93ABTex" +static const ALIGN_ASSET(2) char gMsgKanji93ABTex[] = dgMsgKanji93ABTex; + +#define dgMsgKanji93ACTex "__OTR__textures/kanji/gMsgKanji93ACTex" +static const ALIGN_ASSET(2) char gMsgKanji93ACTex[] = dgMsgKanji93ACTex; + +#define dgMsgKanji93ADTex "__OTR__textures/kanji/gMsgKanji93ADTex" +static const ALIGN_ASSET(2) char gMsgKanji93ADTex[] = dgMsgKanji93ADTex; + +#define dgMsgKanji93AETex "__OTR__textures/kanji/gMsgKanji93AETex" +static const ALIGN_ASSET(2) char gMsgKanji93AETex[] = dgMsgKanji93AETex; + +#define dgMsgKanji93AFTex "__OTR__textures/kanji/gMsgKanji93AFTex" +static const ALIGN_ASSET(2) char gMsgKanji93AFTex[] = dgMsgKanji93AFTex; + +#define dgMsgKanji93B0Tex "__OTR__textures/kanji/gMsgKanji93B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B0Tex[] = dgMsgKanji93B0Tex; + +#define dgMsgKanji93B1Tex "__OTR__textures/kanji/gMsgKanji93B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B1Tex[] = dgMsgKanji93B1Tex; + +#define dgMsgKanji93B2Tex "__OTR__textures/kanji/gMsgKanji93B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B2Tex[] = dgMsgKanji93B2Tex; + +#define dgMsgKanji93B3Tex "__OTR__textures/kanji/gMsgKanji93B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B3Tex[] = dgMsgKanji93B3Tex; + +#define dgMsgKanji93B4Tex "__OTR__textures/kanji/gMsgKanji93B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B4Tex[] = dgMsgKanji93B4Tex; + +#define dgMsgKanji93B5Tex "__OTR__textures/kanji/gMsgKanji93B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B5Tex[] = dgMsgKanji93B5Tex; + +#define dgMsgKanji93B6Tex "__OTR__textures/kanji/gMsgKanji93B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B6Tex[] = dgMsgKanji93B6Tex; + +#define dgMsgKanji93B7Tex "__OTR__textures/kanji/gMsgKanji93B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B7Tex[] = dgMsgKanji93B7Tex; + +#define dgMsgKanji93B8Tex "__OTR__textures/kanji/gMsgKanji93B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B8Tex[] = dgMsgKanji93B8Tex; + +#define dgMsgKanji93B9Tex "__OTR__textures/kanji/gMsgKanji93B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93B9Tex[] = dgMsgKanji93B9Tex; + +#define dgMsgKanji93BATex "__OTR__textures/kanji/gMsgKanji93BATex" +static const ALIGN_ASSET(2) char gMsgKanji93BATex[] = dgMsgKanji93BATex; + +#define dgMsgKanji93BBTex "__OTR__textures/kanji/gMsgKanji93BBTex" +static const ALIGN_ASSET(2) char gMsgKanji93BBTex[] = dgMsgKanji93BBTex; + +#define dgMsgKanji93BCTex "__OTR__textures/kanji/gMsgKanji93BCTex" +static const ALIGN_ASSET(2) char gMsgKanji93BCTex[] = dgMsgKanji93BCTex; + +#define dgMsgKanji93BDTex "__OTR__textures/kanji/gMsgKanji93BDTex" +static const ALIGN_ASSET(2) char gMsgKanji93BDTex[] = dgMsgKanji93BDTex; + +#define dgMsgKanji93BETex "__OTR__textures/kanji/gMsgKanji93BETex" +static const ALIGN_ASSET(2) char gMsgKanji93BETex[] = dgMsgKanji93BETex; + +#define dgMsgKanji93BFTex "__OTR__textures/kanji/gMsgKanji93BFTex" +static const ALIGN_ASSET(2) char gMsgKanji93BFTex[] = dgMsgKanji93BFTex; + +#define dgMsgKanji93C0Tex "__OTR__textures/kanji/gMsgKanji93C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C0Tex[] = dgMsgKanji93C0Tex; + +#define dgMsgKanji93C1Tex "__OTR__textures/kanji/gMsgKanji93C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C1Tex[] = dgMsgKanji93C1Tex; + +#define dgMsgKanji93C2Tex "__OTR__textures/kanji/gMsgKanji93C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C2Tex[] = dgMsgKanji93C2Tex; + +#define dgMsgKanji93C3Tex "__OTR__textures/kanji/gMsgKanji93C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C3Tex[] = dgMsgKanji93C3Tex; + +#define dgMsgKanji93C4Tex "__OTR__textures/kanji/gMsgKanji93C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C4Tex[] = dgMsgKanji93C4Tex; + +#define dgMsgKanji93C5Tex "__OTR__textures/kanji/gMsgKanji93C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C5Tex[] = dgMsgKanji93C5Tex; + +#define dgMsgKanji93C6Tex "__OTR__textures/kanji/gMsgKanji93C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C6Tex[] = dgMsgKanji93C6Tex; + +#define dgMsgKanji93C7Tex "__OTR__textures/kanji/gMsgKanji93C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C7Tex[] = dgMsgKanji93C7Tex; + +#define dgMsgKanji93C8Tex "__OTR__textures/kanji/gMsgKanji93C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C8Tex[] = dgMsgKanji93C8Tex; + +#define dgMsgKanji93C9Tex "__OTR__textures/kanji/gMsgKanji93C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93C9Tex[] = dgMsgKanji93C9Tex; + +#define dgMsgKanji93CATex "__OTR__textures/kanji/gMsgKanji93CATex" +static const ALIGN_ASSET(2) char gMsgKanji93CATex[] = dgMsgKanji93CATex; + +#define dgMsgKanji93CBTex "__OTR__textures/kanji/gMsgKanji93CBTex" +static const ALIGN_ASSET(2) char gMsgKanji93CBTex[] = dgMsgKanji93CBTex; + +#define dgMsgKanji93CCTex "__OTR__textures/kanji/gMsgKanji93CCTex" +static const ALIGN_ASSET(2) char gMsgKanji93CCTex[] = dgMsgKanji93CCTex; + +#define dgMsgKanji93CDTex "__OTR__textures/kanji/gMsgKanji93CDTex" +static const ALIGN_ASSET(2) char gMsgKanji93CDTex[] = dgMsgKanji93CDTex; + +#define dgMsgKanji93CETex "__OTR__textures/kanji/gMsgKanji93CETex" +static const ALIGN_ASSET(2) char gMsgKanji93CETex[] = dgMsgKanji93CETex; + +#define dgMsgKanji93CFTex "__OTR__textures/kanji/gMsgKanji93CFTex" +static const ALIGN_ASSET(2) char gMsgKanji93CFTex[] = dgMsgKanji93CFTex; + +#define dgMsgKanji93D0Tex "__OTR__textures/kanji/gMsgKanji93D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D0Tex[] = dgMsgKanji93D0Tex; + +#define dgMsgKanji93D1Tex "__OTR__textures/kanji/gMsgKanji93D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D1Tex[] = dgMsgKanji93D1Tex; + +#define dgMsgKanji93D2Tex "__OTR__textures/kanji/gMsgKanji93D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D2Tex[] = dgMsgKanji93D2Tex; + +#define dgMsgKanji93D3Tex "__OTR__textures/kanji/gMsgKanji93D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D3Tex[] = dgMsgKanji93D3Tex; + +#define dgMsgKanji93D4Tex "__OTR__textures/kanji/gMsgKanji93D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D4Tex[] = dgMsgKanji93D4Tex; + +#define dgMsgKanji93D5Tex "__OTR__textures/kanji/gMsgKanji93D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D5Tex[] = dgMsgKanji93D5Tex; + +#define dgMsgKanji93D6Tex "__OTR__textures/kanji/gMsgKanji93D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D6Tex[] = dgMsgKanji93D6Tex; + +#define dgMsgKanji93D7Tex "__OTR__textures/kanji/gMsgKanji93D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D7Tex[] = dgMsgKanji93D7Tex; + +#define dgMsgKanji93D8Tex "__OTR__textures/kanji/gMsgKanji93D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D8Tex[] = dgMsgKanji93D8Tex; + +#define dgMsgKanji93D9Tex "__OTR__textures/kanji/gMsgKanji93D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93D9Tex[] = dgMsgKanji93D9Tex; + +#define dgMsgKanji93DATex "__OTR__textures/kanji/gMsgKanji93DATex" +static const ALIGN_ASSET(2) char gMsgKanji93DATex[] = dgMsgKanji93DATex; + +#define dgMsgKanji93DBTex "__OTR__textures/kanji/gMsgKanji93DBTex" +static const ALIGN_ASSET(2) char gMsgKanji93DBTex[] = dgMsgKanji93DBTex; + +#define dgMsgKanji93DCTex "__OTR__textures/kanji/gMsgKanji93DCTex" +static const ALIGN_ASSET(2) char gMsgKanji93DCTex[] = dgMsgKanji93DCTex; + +#define dgMsgKanji93DDTex "__OTR__textures/kanji/gMsgKanji93DDTex" +static const ALIGN_ASSET(2) char gMsgKanji93DDTex[] = dgMsgKanji93DDTex; + +#define dgMsgKanji93DETex "__OTR__textures/kanji/gMsgKanji93DETex" +static const ALIGN_ASSET(2) char gMsgKanji93DETex[] = dgMsgKanji93DETex; + +#define dgMsgKanji93DFTex "__OTR__textures/kanji/gMsgKanji93DFTex" +static const ALIGN_ASSET(2) char gMsgKanji93DFTex[] = dgMsgKanji93DFTex; + +#define dgMsgKanji93E0Tex "__OTR__textures/kanji/gMsgKanji93E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E0Tex[] = dgMsgKanji93E0Tex; + +#define dgMsgKanji93E1Tex "__OTR__textures/kanji/gMsgKanji93E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E1Tex[] = dgMsgKanji93E1Tex; + +#define dgMsgKanji93E2Tex "__OTR__textures/kanji/gMsgKanji93E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E2Tex[] = dgMsgKanji93E2Tex; + +#define dgMsgKanji93E3Tex "__OTR__textures/kanji/gMsgKanji93E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E3Tex[] = dgMsgKanji93E3Tex; + +#define dgMsgKanji93E4Tex "__OTR__textures/kanji/gMsgKanji93E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E4Tex[] = dgMsgKanji93E4Tex; + +#define dgMsgKanji93E5Tex "__OTR__textures/kanji/gMsgKanji93E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E5Tex[] = dgMsgKanji93E5Tex; + +#define dgMsgKanji93E6Tex "__OTR__textures/kanji/gMsgKanji93E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E6Tex[] = dgMsgKanji93E6Tex; + +#define dgMsgKanji93E7Tex "__OTR__textures/kanji/gMsgKanji93E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E7Tex[] = dgMsgKanji93E7Tex; + +#define dgMsgKanji93E8Tex "__OTR__textures/kanji/gMsgKanji93E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E8Tex[] = dgMsgKanji93E8Tex; + +#define dgMsgKanji93E9Tex "__OTR__textures/kanji/gMsgKanji93E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93E9Tex[] = dgMsgKanji93E9Tex; + +#define dgMsgKanji93EATex "__OTR__textures/kanji/gMsgKanji93EATex" +static const ALIGN_ASSET(2) char gMsgKanji93EATex[] = dgMsgKanji93EATex; + +#define dgMsgKanji93EBTex "__OTR__textures/kanji/gMsgKanji93EBTex" +static const ALIGN_ASSET(2) char gMsgKanji93EBTex[] = dgMsgKanji93EBTex; + +#define dgMsgKanji93ECTex "__OTR__textures/kanji/gMsgKanji93ECTex" +static const ALIGN_ASSET(2) char gMsgKanji93ECTex[] = dgMsgKanji93ECTex; + +#define dgMsgKanji93EDTex "__OTR__textures/kanji/gMsgKanji93EDTex" +static const ALIGN_ASSET(2) char gMsgKanji93EDTex[] = dgMsgKanji93EDTex; + +#define dgMsgKanji93EETex "__OTR__textures/kanji/gMsgKanji93EETex" +static const ALIGN_ASSET(2) char gMsgKanji93EETex[] = dgMsgKanji93EETex; + +#define dgMsgKanji93EFTex "__OTR__textures/kanji/gMsgKanji93EFTex" +static const ALIGN_ASSET(2) char gMsgKanji93EFTex[] = dgMsgKanji93EFTex; + +#define dgMsgKanji93F0Tex "__OTR__textures/kanji/gMsgKanji93F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F0Tex[] = dgMsgKanji93F0Tex; + +#define dgMsgKanji93F1Tex "__OTR__textures/kanji/gMsgKanji93F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F1Tex[] = dgMsgKanji93F1Tex; + +#define dgMsgKanji93F2Tex "__OTR__textures/kanji/gMsgKanji93F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F2Tex[] = dgMsgKanji93F2Tex; + +#define dgMsgKanji93F3Tex "__OTR__textures/kanji/gMsgKanji93F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F3Tex[] = dgMsgKanji93F3Tex; + +#define dgMsgKanji93F4Tex "__OTR__textures/kanji/gMsgKanji93F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F4Tex[] = dgMsgKanji93F4Tex; + +#define dgMsgKanji93F5Tex "__OTR__textures/kanji/gMsgKanji93F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F5Tex[] = dgMsgKanji93F5Tex; + +#define dgMsgKanji93F6Tex "__OTR__textures/kanji/gMsgKanji93F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F6Tex[] = dgMsgKanji93F6Tex; + +#define dgMsgKanji93F7Tex "__OTR__textures/kanji/gMsgKanji93F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F7Tex[] = dgMsgKanji93F7Tex; + +#define dgMsgKanji93F8Tex "__OTR__textures/kanji/gMsgKanji93F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F8Tex[] = dgMsgKanji93F8Tex; + +#define dgMsgKanji93F9Tex "__OTR__textures/kanji/gMsgKanji93F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji93F9Tex[] = dgMsgKanji93F9Tex; + +#define dgMsgKanji93FATex "__OTR__textures/kanji/gMsgKanji93FATex" +static const ALIGN_ASSET(2) char gMsgKanji93FATex[] = dgMsgKanji93FATex; + +#define dgMsgKanji93FBTex "__OTR__textures/kanji/gMsgKanji93FBTex" +static const ALIGN_ASSET(2) char gMsgKanji93FBTex[] = dgMsgKanji93FBTex; + +#define dgMsgKanji93FCTex "__OTR__textures/kanji/gMsgKanji93FCTex" +static const ALIGN_ASSET(2) char gMsgKanji93FCTex[] = dgMsgKanji93FCTex; + +#define dgMsgKanji9440Tex "__OTR__textures/kanji/gMsgKanji9440Tex" +static const ALIGN_ASSET(2) char gMsgKanji9440Tex[] = dgMsgKanji9440Tex; + +#define dgMsgKanji9441Tex "__OTR__textures/kanji/gMsgKanji9441Tex" +static const ALIGN_ASSET(2) char gMsgKanji9441Tex[] = dgMsgKanji9441Tex; + +#define dgMsgKanji9442Tex "__OTR__textures/kanji/gMsgKanji9442Tex" +static const ALIGN_ASSET(2) char gMsgKanji9442Tex[] = dgMsgKanji9442Tex; + +#define dgMsgKanji9443Tex "__OTR__textures/kanji/gMsgKanji9443Tex" +static const ALIGN_ASSET(2) char gMsgKanji9443Tex[] = dgMsgKanji9443Tex; + +#define dgMsgKanji9444Tex "__OTR__textures/kanji/gMsgKanji9444Tex" +static const ALIGN_ASSET(2) char gMsgKanji9444Tex[] = dgMsgKanji9444Tex; + +#define dgMsgKanji9445Tex "__OTR__textures/kanji/gMsgKanji9445Tex" +static const ALIGN_ASSET(2) char gMsgKanji9445Tex[] = dgMsgKanji9445Tex; + +#define dgMsgKanji9446Tex "__OTR__textures/kanji/gMsgKanji9446Tex" +static const ALIGN_ASSET(2) char gMsgKanji9446Tex[] = dgMsgKanji9446Tex; + +#define dgMsgKanji9447Tex "__OTR__textures/kanji/gMsgKanji9447Tex" +static const ALIGN_ASSET(2) char gMsgKanji9447Tex[] = dgMsgKanji9447Tex; + +#define dgMsgKanji9448Tex "__OTR__textures/kanji/gMsgKanji9448Tex" +static const ALIGN_ASSET(2) char gMsgKanji9448Tex[] = dgMsgKanji9448Tex; + +#define dgMsgKanji9449Tex "__OTR__textures/kanji/gMsgKanji9449Tex" +static const ALIGN_ASSET(2) char gMsgKanji9449Tex[] = dgMsgKanji9449Tex; + +#define dgMsgKanji944ATex "__OTR__textures/kanji/gMsgKanji944ATex" +static const ALIGN_ASSET(2) char gMsgKanji944ATex[] = dgMsgKanji944ATex; + +#define dgMsgKanji944BTex "__OTR__textures/kanji/gMsgKanji944BTex" +static const ALIGN_ASSET(2) char gMsgKanji944BTex[] = dgMsgKanji944BTex; + +#define dgMsgKanji944CTex "__OTR__textures/kanji/gMsgKanji944CTex" +static const ALIGN_ASSET(2) char gMsgKanji944CTex[] = dgMsgKanji944CTex; + +#define dgMsgKanji944DTex "__OTR__textures/kanji/gMsgKanji944DTex" +static const ALIGN_ASSET(2) char gMsgKanji944DTex[] = dgMsgKanji944DTex; + +#define dgMsgKanji944ETex "__OTR__textures/kanji/gMsgKanji944ETex" +static const ALIGN_ASSET(2) char gMsgKanji944ETex[] = dgMsgKanji944ETex; + +#define dgMsgKanji944FTex "__OTR__textures/kanji/gMsgKanji944FTex" +static const ALIGN_ASSET(2) char gMsgKanji944FTex[] = dgMsgKanji944FTex; + +#define dgMsgKanji9450Tex "__OTR__textures/kanji/gMsgKanji9450Tex" +static const ALIGN_ASSET(2) char gMsgKanji9450Tex[] = dgMsgKanji9450Tex; + +#define dgMsgKanji9451Tex "__OTR__textures/kanji/gMsgKanji9451Tex" +static const ALIGN_ASSET(2) char gMsgKanji9451Tex[] = dgMsgKanji9451Tex; + +#define dgMsgKanji9452Tex "__OTR__textures/kanji/gMsgKanji9452Tex" +static const ALIGN_ASSET(2) char gMsgKanji9452Tex[] = dgMsgKanji9452Tex; + +#define dgMsgKanji9453Tex "__OTR__textures/kanji/gMsgKanji9453Tex" +static const ALIGN_ASSET(2) char gMsgKanji9453Tex[] = dgMsgKanji9453Tex; + +#define dgMsgKanji9454Tex "__OTR__textures/kanji/gMsgKanji9454Tex" +static const ALIGN_ASSET(2) char gMsgKanji9454Tex[] = dgMsgKanji9454Tex; + +#define dgMsgKanji9455Tex "__OTR__textures/kanji/gMsgKanji9455Tex" +static const ALIGN_ASSET(2) char gMsgKanji9455Tex[] = dgMsgKanji9455Tex; + +#define dgMsgKanji9456Tex "__OTR__textures/kanji/gMsgKanji9456Tex" +static const ALIGN_ASSET(2) char gMsgKanji9456Tex[] = dgMsgKanji9456Tex; + +#define dgMsgKanji9457Tex "__OTR__textures/kanji/gMsgKanji9457Tex" +static const ALIGN_ASSET(2) char gMsgKanji9457Tex[] = dgMsgKanji9457Tex; + +#define dgMsgKanji9458Tex "__OTR__textures/kanji/gMsgKanji9458Tex" +static const ALIGN_ASSET(2) char gMsgKanji9458Tex[] = dgMsgKanji9458Tex; + +#define dgMsgKanji9459Tex "__OTR__textures/kanji/gMsgKanji9459Tex" +static const ALIGN_ASSET(2) char gMsgKanji9459Tex[] = dgMsgKanji9459Tex; + +#define dgMsgKanji945ATex "__OTR__textures/kanji/gMsgKanji945ATex" +static const ALIGN_ASSET(2) char gMsgKanji945ATex[] = dgMsgKanji945ATex; + +#define dgMsgKanji945BTex "__OTR__textures/kanji/gMsgKanji945BTex" +static const ALIGN_ASSET(2) char gMsgKanji945BTex[] = dgMsgKanji945BTex; + +#define dgMsgKanji945CTex "__OTR__textures/kanji/gMsgKanji945CTex" +static const ALIGN_ASSET(2) char gMsgKanji945CTex[] = dgMsgKanji945CTex; + +#define dgMsgKanji945DTex "__OTR__textures/kanji/gMsgKanji945DTex" +static const ALIGN_ASSET(2) char gMsgKanji945DTex[] = dgMsgKanji945DTex; + +#define dgMsgKanji945ETex "__OTR__textures/kanji/gMsgKanji945ETex" +static const ALIGN_ASSET(2) char gMsgKanji945ETex[] = dgMsgKanji945ETex; + +#define dgMsgKanji945FTex "__OTR__textures/kanji/gMsgKanji945FTex" +static const ALIGN_ASSET(2) char gMsgKanji945FTex[] = dgMsgKanji945FTex; + +#define dgMsgKanji9460Tex "__OTR__textures/kanji/gMsgKanji9460Tex" +static const ALIGN_ASSET(2) char gMsgKanji9460Tex[] = dgMsgKanji9460Tex; + +#define dgMsgKanji9461Tex "__OTR__textures/kanji/gMsgKanji9461Tex" +static const ALIGN_ASSET(2) char gMsgKanji9461Tex[] = dgMsgKanji9461Tex; + +#define dgMsgKanji9462Tex "__OTR__textures/kanji/gMsgKanji9462Tex" +static const ALIGN_ASSET(2) char gMsgKanji9462Tex[] = dgMsgKanji9462Tex; + +#define dgMsgKanji9463Tex "__OTR__textures/kanji/gMsgKanji9463Tex" +static const ALIGN_ASSET(2) char gMsgKanji9463Tex[] = dgMsgKanji9463Tex; + +#define dgMsgKanji9464Tex "__OTR__textures/kanji/gMsgKanji9464Tex" +static const ALIGN_ASSET(2) char gMsgKanji9464Tex[] = dgMsgKanji9464Tex; + +#define dgMsgKanji9465Tex "__OTR__textures/kanji/gMsgKanji9465Tex" +static const ALIGN_ASSET(2) char gMsgKanji9465Tex[] = dgMsgKanji9465Tex; + +#define dgMsgKanji9466Tex "__OTR__textures/kanji/gMsgKanji9466Tex" +static const ALIGN_ASSET(2) char gMsgKanji9466Tex[] = dgMsgKanji9466Tex; + +#define dgMsgKanji9467Tex "__OTR__textures/kanji/gMsgKanji9467Tex" +static const ALIGN_ASSET(2) char gMsgKanji9467Tex[] = dgMsgKanji9467Tex; + +#define dgMsgKanji9468Tex "__OTR__textures/kanji/gMsgKanji9468Tex" +static const ALIGN_ASSET(2) char gMsgKanji9468Tex[] = dgMsgKanji9468Tex; + +#define dgMsgKanji9469Tex "__OTR__textures/kanji/gMsgKanji9469Tex" +static const ALIGN_ASSET(2) char gMsgKanji9469Tex[] = dgMsgKanji9469Tex; + +#define dgMsgKanji946ATex "__OTR__textures/kanji/gMsgKanji946ATex" +static const ALIGN_ASSET(2) char gMsgKanji946ATex[] = dgMsgKanji946ATex; + +#define dgMsgKanji946BTex "__OTR__textures/kanji/gMsgKanji946BTex" +static const ALIGN_ASSET(2) char gMsgKanji946BTex[] = dgMsgKanji946BTex; + +#define dgMsgKanji946CTex "__OTR__textures/kanji/gMsgKanji946CTex" +static const ALIGN_ASSET(2) char gMsgKanji946CTex[] = dgMsgKanji946CTex; + +#define dgMsgKanji946DTex "__OTR__textures/kanji/gMsgKanji946DTex" +static const ALIGN_ASSET(2) char gMsgKanji946DTex[] = dgMsgKanji946DTex; + +#define dgMsgKanji946ETex "__OTR__textures/kanji/gMsgKanji946ETex" +static const ALIGN_ASSET(2) char gMsgKanji946ETex[] = dgMsgKanji946ETex; + +#define dgMsgKanji946FTex "__OTR__textures/kanji/gMsgKanji946FTex" +static const ALIGN_ASSET(2) char gMsgKanji946FTex[] = dgMsgKanji946FTex; + +#define dgMsgKanji9470Tex "__OTR__textures/kanji/gMsgKanji9470Tex" +static const ALIGN_ASSET(2) char gMsgKanji9470Tex[] = dgMsgKanji9470Tex; + +#define dgMsgKanji9471Tex "__OTR__textures/kanji/gMsgKanji9471Tex" +static const ALIGN_ASSET(2) char gMsgKanji9471Tex[] = dgMsgKanji9471Tex; + +#define dgMsgKanji9472Tex "__OTR__textures/kanji/gMsgKanji9472Tex" +static const ALIGN_ASSET(2) char gMsgKanji9472Tex[] = dgMsgKanji9472Tex; + +#define dgMsgKanji9473Tex "__OTR__textures/kanji/gMsgKanji9473Tex" +static const ALIGN_ASSET(2) char gMsgKanji9473Tex[] = dgMsgKanji9473Tex; + +#define dgMsgKanji9474Tex "__OTR__textures/kanji/gMsgKanji9474Tex" +static const ALIGN_ASSET(2) char gMsgKanji9474Tex[] = dgMsgKanji9474Tex; + +#define dgMsgKanji9475Tex "__OTR__textures/kanji/gMsgKanji9475Tex" +static const ALIGN_ASSET(2) char gMsgKanji9475Tex[] = dgMsgKanji9475Tex; + +#define dgMsgKanji9476Tex "__OTR__textures/kanji/gMsgKanji9476Tex" +static const ALIGN_ASSET(2) char gMsgKanji9476Tex[] = dgMsgKanji9476Tex; + +#define dgMsgKanji9477Tex "__OTR__textures/kanji/gMsgKanji9477Tex" +static const ALIGN_ASSET(2) char gMsgKanji9477Tex[] = dgMsgKanji9477Tex; + +#define dgMsgKanji9478Tex "__OTR__textures/kanji/gMsgKanji9478Tex" +static const ALIGN_ASSET(2) char gMsgKanji9478Tex[] = dgMsgKanji9478Tex; + +#define dgMsgKanji9479Tex "__OTR__textures/kanji/gMsgKanji9479Tex" +static const ALIGN_ASSET(2) char gMsgKanji9479Tex[] = dgMsgKanji9479Tex; + +#define dgMsgKanji947ATex "__OTR__textures/kanji/gMsgKanji947ATex" +static const ALIGN_ASSET(2) char gMsgKanji947ATex[] = dgMsgKanji947ATex; + +#define dgMsgKanji947BTex "__OTR__textures/kanji/gMsgKanji947BTex" +static const ALIGN_ASSET(2) char gMsgKanji947BTex[] = dgMsgKanji947BTex; + +#define dgMsgKanji947CTex "__OTR__textures/kanji/gMsgKanji947CTex" +static const ALIGN_ASSET(2) char gMsgKanji947CTex[] = dgMsgKanji947CTex; + +#define dgMsgKanji947DTex "__OTR__textures/kanji/gMsgKanji947DTex" +static const ALIGN_ASSET(2) char gMsgKanji947DTex[] = dgMsgKanji947DTex; + +#define dgMsgKanji947ETex "__OTR__textures/kanji/gMsgKanji947ETex" +static const ALIGN_ASSET(2) char gMsgKanji947ETex[] = dgMsgKanji947ETex; + +#define dgMsgKanji9480Tex "__OTR__textures/kanji/gMsgKanji9480Tex" +static const ALIGN_ASSET(2) char gMsgKanji9480Tex[] = dgMsgKanji9480Tex; + +#define dgMsgKanji9481Tex "__OTR__textures/kanji/gMsgKanji9481Tex" +static const ALIGN_ASSET(2) char gMsgKanji9481Tex[] = dgMsgKanji9481Tex; + +#define dgMsgKanji9482Tex "__OTR__textures/kanji/gMsgKanji9482Tex" +static const ALIGN_ASSET(2) char gMsgKanji9482Tex[] = dgMsgKanji9482Tex; + +#define dgMsgKanji9483Tex "__OTR__textures/kanji/gMsgKanji9483Tex" +static const ALIGN_ASSET(2) char gMsgKanji9483Tex[] = dgMsgKanji9483Tex; + +#define dgMsgKanji9484Tex "__OTR__textures/kanji/gMsgKanji9484Tex" +static const ALIGN_ASSET(2) char gMsgKanji9484Tex[] = dgMsgKanji9484Tex; + +#define dgMsgKanji9485Tex "__OTR__textures/kanji/gMsgKanji9485Tex" +static const ALIGN_ASSET(2) char gMsgKanji9485Tex[] = dgMsgKanji9485Tex; + +#define dgMsgKanji9486Tex "__OTR__textures/kanji/gMsgKanji9486Tex" +static const ALIGN_ASSET(2) char gMsgKanji9486Tex[] = dgMsgKanji9486Tex; + +#define dgMsgKanji9487Tex "__OTR__textures/kanji/gMsgKanji9487Tex" +static const ALIGN_ASSET(2) char gMsgKanji9487Tex[] = dgMsgKanji9487Tex; + +#define dgMsgKanji9488Tex "__OTR__textures/kanji/gMsgKanji9488Tex" +static const ALIGN_ASSET(2) char gMsgKanji9488Tex[] = dgMsgKanji9488Tex; + +#define dgMsgKanji9489Tex "__OTR__textures/kanji/gMsgKanji9489Tex" +static const ALIGN_ASSET(2) char gMsgKanji9489Tex[] = dgMsgKanji9489Tex; + +#define dgMsgKanji948ATex "__OTR__textures/kanji/gMsgKanji948ATex" +static const ALIGN_ASSET(2) char gMsgKanji948ATex[] = dgMsgKanji948ATex; + +#define dgMsgKanji948BTex "__OTR__textures/kanji/gMsgKanji948BTex" +static const ALIGN_ASSET(2) char gMsgKanji948BTex[] = dgMsgKanji948BTex; + +#define dgMsgKanji948CTex "__OTR__textures/kanji/gMsgKanji948CTex" +static const ALIGN_ASSET(2) char gMsgKanji948CTex[] = dgMsgKanji948CTex; + +#define dgMsgKanji948DTex "__OTR__textures/kanji/gMsgKanji948DTex" +static const ALIGN_ASSET(2) char gMsgKanji948DTex[] = dgMsgKanji948DTex; + +#define dgMsgKanji948ETex "__OTR__textures/kanji/gMsgKanji948ETex" +static const ALIGN_ASSET(2) char gMsgKanji948ETex[] = dgMsgKanji948ETex; + +#define dgMsgKanji948FTex "__OTR__textures/kanji/gMsgKanji948FTex" +static const ALIGN_ASSET(2) char gMsgKanji948FTex[] = dgMsgKanji948FTex; + +#define dgMsgKanji9490Tex "__OTR__textures/kanji/gMsgKanji9490Tex" +static const ALIGN_ASSET(2) char gMsgKanji9490Tex[] = dgMsgKanji9490Tex; + +#define dgMsgKanji9491Tex "__OTR__textures/kanji/gMsgKanji9491Tex" +static const ALIGN_ASSET(2) char gMsgKanji9491Tex[] = dgMsgKanji9491Tex; + +#define dgMsgKanji9492Tex "__OTR__textures/kanji/gMsgKanji9492Tex" +static const ALIGN_ASSET(2) char gMsgKanji9492Tex[] = dgMsgKanji9492Tex; + +#define dgMsgKanji9493Tex "__OTR__textures/kanji/gMsgKanji9493Tex" +static const ALIGN_ASSET(2) char gMsgKanji9493Tex[] = dgMsgKanji9493Tex; + +#define dgMsgKanji9494Tex "__OTR__textures/kanji/gMsgKanji9494Tex" +static const ALIGN_ASSET(2) char gMsgKanji9494Tex[] = dgMsgKanji9494Tex; + +#define dgMsgKanji9495Tex "__OTR__textures/kanji/gMsgKanji9495Tex" +static const ALIGN_ASSET(2) char gMsgKanji9495Tex[] = dgMsgKanji9495Tex; + +#define dgMsgKanji9496Tex "__OTR__textures/kanji/gMsgKanji9496Tex" +static const ALIGN_ASSET(2) char gMsgKanji9496Tex[] = dgMsgKanji9496Tex; + +#define dgMsgKanji9497Tex "__OTR__textures/kanji/gMsgKanji9497Tex" +static const ALIGN_ASSET(2) char gMsgKanji9497Tex[] = dgMsgKanji9497Tex; + +#define dgMsgKanji9498Tex "__OTR__textures/kanji/gMsgKanji9498Tex" +static const ALIGN_ASSET(2) char gMsgKanji9498Tex[] = dgMsgKanji9498Tex; + +#define dgMsgKanji9499Tex "__OTR__textures/kanji/gMsgKanji9499Tex" +static const ALIGN_ASSET(2) char gMsgKanji9499Tex[] = dgMsgKanji9499Tex; + +#define dgMsgKanji949ATex "__OTR__textures/kanji/gMsgKanji949ATex" +static const ALIGN_ASSET(2) char gMsgKanji949ATex[] = dgMsgKanji949ATex; + +#define dgMsgKanji949BTex "__OTR__textures/kanji/gMsgKanji949BTex" +static const ALIGN_ASSET(2) char gMsgKanji949BTex[] = dgMsgKanji949BTex; + +#define dgMsgKanji949CTex "__OTR__textures/kanji/gMsgKanji949CTex" +static const ALIGN_ASSET(2) char gMsgKanji949CTex[] = dgMsgKanji949CTex; + +#define dgMsgKanji949DTex "__OTR__textures/kanji/gMsgKanji949DTex" +static const ALIGN_ASSET(2) char gMsgKanji949DTex[] = dgMsgKanji949DTex; + +#define dgMsgKanji949ETex "__OTR__textures/kanji/gMsgKanji949ETex" +static const ALIGN_ASSET(2) char gMsgKanji949ETex[] = dgMsgKanji949ETex; + +#define dgMsgKanji949FTex "__OTR__textures/kanji/gMsgKanji949FTex" +static const ALIGN_ASSET(2) char gMsgKanji949FTex[] = dgMsgKanji949FTex; + +#define dgMsgKanji94A0Tex "__OTR__textures/kanji/gMsgKanji94A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A0Tex[] = dgMsgKanji94A0Tex; + +#define dgMsgKanji94A1Tex "__OTR__textures/kanji/gMsgKanji94A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A1Tex[] = dgMsgKanji94A1Tex; + +#define dgMsgKanji94A2Tex "__OTR__textures/kanji/gMsgKanji94A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A2Tex[] = dgMsgKanji94A2Tex; + +#define dgMsgKanji94A3Tex "__OTR__textures/kanji/gMsgKanji94A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A3Tex[] = dgMsgKanji94A3Tex; + +#define dgMsgKanji94A4Tex "__OTR__textures/kanji/gMsgKanji94A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A4Tex[] = dgMsgKanji94A4Tex; + +#define dgMsgKanji94A5Tex "__OTR__textures/kanji/gMsgKanji94A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A5Tex[] = dgMsgKanji94A5Tex; + +#define dgMsgKanji94A6Tex "__OTR__textures/kanji/gMsgKanji94A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A6Tex[] = dgMsgKanji94A6Tex; + +#define dgMsgKanji94A7Tex "__OTR__textures/kanji/gMsgKanji94A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A7Tex[] = dgMsgKanji94A7Tex; + +#define dgMsgKanji94A8Tex "__OTR__textures/kanji/gMsgKanji94A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A8Tex[] = dgMsgKanji94A8Tex; + +#define dgMsgKanji94A9Tex "__OTR__textures/kanji/gMsgKanji94A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94A9Tex[] = dgMsgKanji94A9Tex; + +#define dgMsgKanji94AATex "__OTR__textures/kanji/gMsgKanji94AATex" +static const ALIGN_ASSET(2) char gMsgKanji94AATex[] = dgMsgKanji94AATex; + +#define dgMsgKanji94ABTex "__OTR__textures/kanji/gMsgKanji94ABTex" +static const ALIGN_ASSET(2) char gMsgKanji94ABTex[] = dgMsgKanji94ABTex; + +#define dgMsgKanji94ACTex "__OTR__textures/kanji/gMsgKanji94ACTex" +static const ALIGN_ASSET(2) char gMsgKanji94ACTex[] = dgMsgKanji94ACTex; + +#define dgMsgKanji94ADTex "__OTR__textures/kanji/gMsgKanji94ADTex" +static const ALIGN_ASSET(2) char gMsgKanji94ADTex[] = dgMsgKanji94ADTex; + +#define dgMsgKanji94AETex "__OTR__textures/kanji/gMsgKanji94AETex" +static const ALIGN_ASSET(2) char gMsgKanji94AETex[] = dgMsgKanji94AETex; + +#define dgMsgKanji94AFTex "__OTR__textures/kanji/gMsgKanji94AFTex" +static const ALIGN_ASSET(2) char gMsgKanji94AFTex[] = dgMsgKanji94AFTex; + +#define dgMsgKanji94B0Tex "__OTR__textures/kanji/gMsgKanji94B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B0Tex[] = dgMsgKanji94B0Tex; + +#define dgMsgKanji94B1Tex "__OTR__textures/kanji/gMsgKanji94B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B1Tex[] = dgMsgKanji94B1Tex; + +#define dgMsgKanji94B2Tex "__OTR__textures/kanji/gMsgKanji94B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B2Tex[] = dgMsgKanji94B2Tex; + +#define dgMsgKanji94B3Tex "__OTR__textures/kanji/gMsgKanji94B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B3Tex[] = dgMsgKanji94B3Tex; + +#define dgMsgKanji94B4Tex "__OTR__textures/kanji/gMsgKanji94B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B4Tex[] = dgMsgKanji94B4Tex; + +#define dgMsgKanji94B5Tex "__OTR__textures/kanji/gMsgKanji94B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B5Tex[] = dgMsgKanji94B5Tex; + +#define dgMsgKanji94B6Tex "__OTR__textures/kanji/gMsgKanji94B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B6Tex[] = dgMsgKanji94B6Tex; + +#define dgMsgKanji94B7Tex "__OTR__textures/kanji/gMsgKanji94B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B7Tex[] = dgMsgKanji94B7Tex; + +#define dgMsgKanji94B8Tex "__OTR__textures/kanji/gMsgKanji94B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B8Tex[] = dgMsgKanji94B8Tex; + +#define dgMsgKanji94B9Tex "__OTR__textures/kanji/gMsgKanji94B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94B9Tex[] = dgMsgKanji94B9Tex; + +#define dgMsgKanji94BATex "__OTR__textures/kanji/gMsgKanji94BATex" +static const ALIGN_ASSET(2) char gMsgKanji94BATex[] = dgMsgKanji94BATex; + +#define dgMsgKanji94BBTex "__OTR__textures/kanji/gMsgKanji94BBTex" +static const ALIGN_ASSET(2) char gMsgKanji94BBTex[] = dgMsgKanji94BBTex; + +#define dgMsgKanji94BCTex "__OTR__textures/kanji/gMsgKanji94BCTex" +static const ALIGN_ASSET(2) char gMsgKanji94BCTex[] = dgMsgKanji94BCTex; + +#define dgMsgKanji94BDTex "__OTR__textures/kanji/gMsgKanji94BDTex" +static const ALIGN_ASSET(2) char gMsgKanji94BDTex[] = dgMsgKanji94BDTex; + +#define dgMsgKanji94BETex "__OTR__textures/kanji/gMsgKanji94BETex" +static const ALIGN_ASSET(2) char gMsgKanji94BETex[] = dgMsgKanji94BETex; + +#define dgMsgKanji94BFTex "__OTR__textures/kanji/gMsgKanji94BFTex" +static const ALIGN_ASSET(2) char gMsgKanji94BFTex[] = dgMsgKanji94BFTex; + +#define dgMsgKanji94C0Tex "__OTR__textures/kanji/gMsgKanji94C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C0Tex[] = dgMsgKanji94C0Tex; + +#define dgMsgKanji94C1Tex "__OTR__textures/kanji/gMsgKanji94C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C1Tex[] = dgMsgKanji94C1Tex; + +#define dgMsgKanji94C2Tex "__OTR__textures/kanji/gMsgKanji94C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C2Tex[] = dgMsgKanji94C2Tex; + +#define dgMsgKanji94C3Tex "__OTR__textures/kanji/gMsgKanji94C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C3Tex[] = dgMsgKanji94C3Tex; + +#define dgMsgKanji94C4Tex "__OTR__textures/kanji/gMsgKanji94C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C4Tex[] = dgMsgKanji94C4Tex; + +#define dgMsgKanji94C5Tex "__OTR__textures/kanji/gMsgKanji94C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C5Tex[] = dgMsgKanji94C5Tex; + +#define dgMsgKanji94C6Tex "__OTR__textures/kanji/gMsgKanji94C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C6Tex[] = dgMsgKanji94C6Tex; + +#define dgMsgKanji94C7Tex "__OTR__textures/kanji/gMsgKanji94C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C7Tex[] = dgMsgKanji94C7Tex; + +#define dgMsgKanji94C8Tex "__OTR__textures/kanji/gMsgKanji94C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C8Tex[] = dgMsgKanji94C8Tex; + +#define dgMsgKanji94C9Tex "__OTR__textures/kanji/gMsgKanji94C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94C9Tex[] = dgMsgKanji94C9Tex; + +#define dgMsgKanji94CATex "__OTR__textures/kanji/gMsgKanji94CATex" +static const ALIGN_ASSET(2) char gMsgKanji94CATex[] = dgMsgKanji94CATex; + +#define dgMsgKanji94CBTex "__OTR__textures/kanji/gMsgKanji94CBTex" +static const ALIGN_ASSET(2) char gMsgKanji94CBTex[] = dgMsgKanji94CBTex; + +#define dgMsgKanji94CCTex "__OTR__textures/kanji/gMsgKanji94CCTex" +static const ALIGN_ASSET(2) char gMsgKanji94CCTex[] = dgMsgKanji94CCTex; + +#define dgMsgKanji94CDTex "__OTR__textures/kanji/gMsgKanji94CDTex" +static const ALIGN_ASSET(2) char gMsgKanji94CDTex[] = dgMsgKanji94CDTex; + +#define dgMsgKanji94CETex "__OTR__textures/kanji/gMsgKanji94CETex" +static const ALIGN_ASSET(2) char gMsgKanji94CETex[] = dgMsgKanji94CETex; + +#define dgMsgKanji94CFTex "__OTR__textures/kanji/gMsgKanji94CFTex" +static const ALIGN_ASSET(2) char gMsgKanji94CFTex[] = dgMsgKanji94CFTex; + +#define dgMsgKanji94D0Tex "__OTR__textures/kanji/gMsgKanji94D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D0Tex[] = dgMsgKanji94D0Tex; + +#define dgMsgKanji94D1Tex "__OTR__textures/kanji/gMsgKanji94D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D1Tex[] = dgMsgKanji94D1Tex; + +#define dgMsgKanji94D2Tex "__OTR__textures/kanji/gMsgKanji94D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D2Tex[] = dgMsgKanji94D2Tex; + +#define dgMsgKanji94D3Tex "__OTR__textures/kanji/gMsgKanji94D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D3Tex[] = dgMsgKanji94D3Tex; + +#define dgMsgKanji94D4Tex "__OTR__textures/kanji/gMsgKanji94D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D4Tex[] = dgMsgKanji94D4Tex; + +#define dgMsgKanji94D5Tex "__OTR__textures/kanji/gMsgKanji94D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D5Tex[] = dgMsgKanji94D5Tex; + +#define dgMsgKanji94D6Tex "__OTR__textures/kanji/gMsgKanji94D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D6Tex[] = dgMsgKanji94D6Tex; + +#define dgMsgKanji94D7Tex "__OTR__textures/kanji/gMsgKanji94D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D7Tex[] = dgMsgKanji94D7Tex; + +#define dgMsgKanji94D8Tex "__OTR__textures/kanji/gMsgKanji94D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D8Tex[] = dgMsgKanji94D8Tex; + +#define dgMsgKanji94D9Tex "__OTR__textures/kanji/gMsgKanji94D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94D9Tex[] = dgMsgKanji94D9Tex; + +#define dgMsgKanji94DATex "__OTR__textures/kanji/gMsgKanji94DATex" +static const ALIGN_ASSET(2) char gMsgKanji94DATex[] = dgMsgKanji94DATex; + +#define dgMsgKanji94DBTex "__OTR__textures/kanji/gMsgKanji94DBTex" +static const ALIGN_ASSET(2) char gMsgKanji94DBTex[] = dgMsgKanji94DBTex; + +#define dgMsgKanji94DCTex "__OTR__textures/kanji/gMsgKanji94DCTex" +static const ALIGN_ASSET(2) char gMsgKanji94DCTex[] = dgMsgKanji94DCTex; + +#define dgMsgKanji94DDTex "__OTR__textures/kanji/gMsgKanji94DDTex" +static const ALIGN_ASSET(2) char gMsgKanji94DDTex[] = dgMsgKanji94DDTex; + +#define dgMsgKanji94DETex "__OTR__textures/kanji/gMsgKanji94DETex" +static const ALIGN_ASSET(2) char gMsgKanji94DETex[] = dgMsgKanji94DETex; + +#define dgMsgKanji94DFTex "__OTR__textures/kanji/gMsgKanji94DFTex" +static const ALIGN_ASSET(2) char gMsgKanji94DFTex[] = dgMsgKanji94DFTex; + +#define dgMsgKanji94E0Tex "__OTR__textures/kanji/gMsgKanji94E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E0Tex[] = dgMsgKanji94E0Tex; + +#define dgMsgKanji94E1Tex "__OTR__textures/kanji/gMsgKanji94E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E1Tex[] = dgMsgKanji94E1Tex; + +#define dgMsgKanji94E2Tex "__OTR__textures/kanji/gMsgKanji94E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E2Tex[] = dgMsgKanji94E2Tex; + +#define dgMsgKanji94E3Tex "__OTR__textures/kanji/gMsgKanji94E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E3Tex[] = dgMsgKanji94E3Tex; + +#define dgMsgKanji94E4Tex "__OTR__textures/kanji/gMsgKanji94E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E4Tex[] = dgMsgKanji94E4Tex; + +#define dgMsgKanji94E5Tex "__OTR__textures/kanji/gMsgKanji94E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E5Tex[] = dgMsgKanji94E5Tex; + +#define dgMsgKanji94E6Tex "__OTR__textures/kanji/gMsgKanji94E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E6Tex[] = dgMsgKanji94E6Tex; + +#define dgMsgKanji94E7Tex "__OTR__textures/kanji/gMsgKanji94E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E7Tex[] = dgMsgKanji94E7Tex; + +#define dgMsgKanji94E8Tex "__OTR__textures/kanji/gMsgKanji94E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E8Tex[] = dgMsgKanji94E8Tex; + +#define dgMsgKanji94E9Tex "__OTR__textures/kanji/gMsgKanji94E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94E9Tex[] = dgMsgKanji94E9Tex; + +#define dgMsgKanji94EATex "__OTR__textures/kanji/gMsgKanji94EATex" +static const ALIGN_ASSET(2) char gMsgKanji94EATex[] = dgMsgKanji94EATex; + +#define dgMsgKanji94EBTex "__OTR__textures/kanji/gMsgKanji94EBTex" +static const ALIGN_ASSET(2) char gMsgKanji94EBTex[] = dgMsgKanji94EBTex; + +#define dgMsgKanji94ECTex "__OTR__textures/kanji/gMsgKanji94ECTex" +static const ALIGN_ASSET(2) char gMsgKanji94ECTex[] = dgMsgKanji94ECTex; + +#define dgMsgKanji94EDTex "__OTR__textures/kanji/gMsgKanji94EDTex" +static const ALIGN_ASSET(2) char gMsgKanji94EDTex[] = dgMsgKanji94EDTex; + +#define dgMsgKanji94EETex "__OTR__textures/kanji/gMsgKanji94EETex" +static const ALIGN_ASSET(2) char gMsgKanji94EETex[] = dgMsgKanji94EETex; + +#define dgMsgKanji94EFTex "__OTR__textures/kanji/gMsgKanji94EFTex" +static const ALIGN_ASSET(2) char gMsgKanji94EFTex[] = dgMsgKanji94EFTex; + +#define dgMsgKanji94F0Tex "__OTR__textures/kanji/gMsgKanji94F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F0Tex[] = dgMsgKanji94F0Tex; + +#define dgMsgKanji94F1Tex "__OTR__textures/kanji/gMsgKanji94F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F1Tex[] = dgMsgKanji94F1Tex; + +#define dgMsgKanji94F2Tex "__OTR__textures/kanji/gMsgKanji94F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F2Tex[] = dgMsgKanji94F2Tex; + +#define dgMsgKanji94F3Tex "__OTR__textures/kanji/gMsgKanji94F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F3Tex[] = dgMsgKanji94F3Tex; + +#define dgMsgKanji94F4Tex "__OTR__textures/kanji/gMsgKanji94F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F4Tex[] = dgMsgKanji94F4Tex; + +#define dgMsgKanji94F5Tex "__OTR__textures/kanji/gMsgKanji94F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F5Tex[] = dgMsgKanji94F5Tex; + +#define dgMsgKanji94F6Tex "__OTR__textures/kanji/gMsgKanji94F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F6Tex[] = dgMsgKanji94F6Tex; + +#define dgMsgKanji94F7Tex "__OTR__textures/kanji/gMsgKanji94F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F7Tex[] = dgMsgKanji94F7Tex; + +#define dgMsgKanji94F8Tex "__OTR__textures/kanji/gMsgKanji94F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F8Tex[] = dgMsgKanji94F8Tex; + +#define dgMsgKanji94F9Tex "__OTR__textures/kanji/gMsgKanji94F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji94F9Tex[] = dgMsgKanji94F9Tex; + +#define dgMsgKanji94FATex "__OTR__textures/kanji/gMsgKanji94FATex" +static const ALIGN_ASSET(2) char gMsgKanji94FATex[] = dgMsgKanji94FATex; + +#define dgMsgKanji94FBTex "__OTR__textures/kanji/gMsgKanji94FBTex" +static const ALIGN_ASSET(2) char gMsgKanji94FBTex[] = dgMsgKanji94FBTex; + +#define dgMsgKanji94FCTex "__OTR__textures/kanji/gMsgKanji94FCTex" +static const ALIGN_ASSET(2) char gMsgKanji94FCTex[] = dgMsgKanji94FCTex; + +#define dgMsgKanji9540Tex "__OTR__textures/kanji/gMsgKanji9540Tex" +static const ALIGN_ASSET(2) char gMsgKanji9540Tex[] = dgMsgKanji9540Tex; + +#define dgMsgKanji9541Tex "__OTR__textures/kanji/gMsgKanji9541Tex" +static const ALIGN_ASSET(2) char gMsgKanji9541Tex[] = dgMsgKanji9541Tex; + +#define dgMsgKanji9542Tex "__OTR__textures/kanji/gMsgKanji9542Tex" +static const ALIGN_ASSET(2) char gMsgKanji9542Tex[] = dgMsgKanji9542Tex; + +#define dgMsgKanji9543Tex "__OTR__textures/kanji/gMsgKanji9543Tex" +static const ALIGN_ASSET(2) char gMsgKanji9543Tex[] = dgMsgKanji9543Tex; + +#define dgMsgKanji9544Tex "__OTR__textures/kanji/gMsgKanji9544Tex" +static const ALIGN_ASSET(2) char gMsgKanji9544Tex[] = dgMsgKanji9544Tex; + +#define dgMsgKanji9545Tex "__OTR__textures/kanji/gMsgKanji9545Tex" +static const ALIGN_ASSET(2) char gMsgKanji9545Tex[] = dgMsgKanji9545Tex; + +#define dgMsgKanji9546Tex "__OTR__textures/kanji/gMsgKanji9546Tex" +static const ALIGN_ASSET(2) char gMsgKanji9546Tex[] = dgMsgKanji9546Tex; + +#define dgMsgKanji9547Tex "__OTR__textures/kanji/gMsgKanji9547Tex" +static const ALIGN_ASSET(2) char gMsgKanji9547Tex[] = dgMsgKanji9547Tex; + +#define dgMsgKanji9548Tex "__OTR__textures/kanji/gMsgKanji9548Tex" +static const ALIGN_ASSET(2) char gMsgKanji9548Tex[] = dgMsgKanji9548Tex; + +#define dgMsgKanji9549Tex "__OTR__textures/kanji/gMsgKanji9549Tex" +static const ALIGN_ASSET(2) char gMsgKanji9549Tex[] = dgMsgKanji9549Tex; + +#define dgMsgKanji954ATex "__OTR__textures/kanji/gMsgKanji954ATex" +static const ALIGN_ASSET(2) char gMsgKanji954ATex[] = dgMsgKanji954ATex; + +#define dgMsgKanji954BTex "__OTR__textures/kanji/gMsgKanji954BTex" +static const ALIGN_ASSET(2) char gMsgKanji954BTex[] = dgMsgKanji954BTex; + +#define dgMsgKanji954CTex "__OTR__textures/kanji/gMsgKanji954CTex" +static const ALIGN_ASSET(2) char gMsgKanji954CTex[] = dgMsgKanji954CTex; + +#define dgMsgKanji954DTex "__OTR__textures/kanji/gMsgKanji954DTex" +static const ALIGN_ASSET(2) char gMsgKanji954DTex[] = dgMsgKanji954DTex; + +#define dgMsgKanji954ETex "__OTR__textures/kanji/gMsgKanji954ETex" +static const ALIGN_ASSET(2) char gMsgKanji954ETex[] = dgMsgKanji954ETex; + +#define dgMsgKanji954FTex "__OTR__textures/kanji/gMsgKanji954FTex" +static const ALIGN_ASSET(2) char gMsgKanji954FTex[] = dgMsgKanji954FTex; + +#define dgMsgKanji9550Tex "__OTR__textures/kanji/gMsgKanji9550Tex" +static const ALIGN_ASSET(2) char gMsgKanji9550Tex[] = dgMsgKanji9550Tex; + +#define dgMsgKanji9551Tex "__OTR__textures/kanji/gMsgKanji9551Tex" +static const ALIGN_ASSET(2) char gMsgKanji9551Tex[] = dgMsgKanji9551Tex; + +#define dgMsgKanji9552Tex "__OTR__textures/kanji/gMsgKanji9552Tex" +static const ALIGN_ASSET(2) char gMsgKanji9552Tex[] = dgMsgKanji9552Tex; + +#define dgMsgKanji9553Tex "__OTR__textures/kanji/gMsgKanji9553Tex" +static const ALIGN_ASSET(2) char gMsgKanji9553Tex[] = dgMsgKanji9553Tex; + +#define dgMsgKanji9554Tex "__OTR__textures/kanji/gMsgKanji9554Tex" +static const ALIGN_ASSET(2) char gMsgKanji9554Tex[] = dgMsgKanji9554Tex; + +#define dgMsgKanji9555Tex "__OTR__textures/kanji/gMsgKanji9555Tex" +static const ALIGN_ASSET(2) char gMsgKanji9555Tex[] = dgMsgKanji9555Tex; + +#define dgMsgKanji9556Tex "__OTR__textures/kanji/gMsgKanji9556Tex" +static const ALIGN_ASSET(2) char gMsgKanji9556Tex[] = dgMsgKanji9556Tex; + +#define dgMsgKanji9557Tex "__OTR__textures/kanji/gMsgKanji9557Tex" +static const ALIGN_ASSET(2) char gMsgKanji9557Tex[] = dgMsgKanji9557Tex; + +#define dgMsgKanji9558Tex "__OTR__textures/kanji/gMsgKanji9558Tex" +static const ALIGN_ASSET(2) char gMsgKanji9558Tex[] = dgMsgKanji9558Tex; + +#define dgMsgKanji9559Tex "__OTR__textures/kanji/gMsgKanji9559Tex" +static const ALIGN_ASSET(2) char gMsgKanji9559Tex[] = dgMsgKanji9559Tex; + +#define dgMsgKanji955ATex "__OTR__textures/kanji/gMsgKanji955ATex" +static const ALIGN_ASSET(2) char gMsgKanji955ATex[] = dgMsgKanji955ATex; + +#define dgMsgKanji955BTex "__OTR__textures/kanji/gMsgKanji955BTex" +static const ALIGN_ASSET(2) char gMsgKanji955BTex[] = dgMsgKanji955BTex; + +#define dgMsgKanji955CTex "__OTR__textures/kanji/gMsgKanji955CTex" +static const ALIGN_ASSET(2) char gMsgKanji955CTex[] = dgMsgKanji955CTex; + +#define dgMsgKanji955DTex "__OTR__textures/kanji/gMsgKanji955DTex" +static const ALIGN_ASSET(2) char gMsgKanji955DTex[] = dgMsgKanji955DTex; + +#define dgMsgKanji955ETex "__OTR__textures/kanji/gMsgKanji955ETex" +static const ALIGN_ASSET(2) char gMsgKanji955ETex[] = dgMsgKanji955ETex; + +#define dgMsgKanji955FTex "__OTR__textures/kanji/gMsgKanji955FTex" +static const ALIGN_ASSET(2) char gMsgKanji955FTex[] = dgMsgKanji955FTex; + +#define dgMsgKanji9560Tex "__OTR__textures/kanji/gMsgKanji9560Tex" +static const ALIGN_ASSET(2) char gMsgKanji9560Tex[] = dgMsgKanji9560Tex; + +#define dgMsgKanji9561Tex "__OTR__textures/kanji/gMsgKanji9561Tex" +static const ALIGN_ASSET(2) char gMsgKanji9561Tex[] = dgMsgKanji9561Tex; + +#define dgMsgKanji9562Tex "__OTR__textures/kanji/gMsgKanji9562Tex" +static const ALIGN_ASSET(2) char gMsgKanji9562Tex[] = dgMsgKanji9562Tex; + +#define dgMsgKanji9563Tex "__OTR__textures/kanji/gMsgKanji9563Tex" +static const ALIGN_ASSET(2) char gMsgKanji9563Tex[] = dgMsgKanji9563Tex; + +#define dgMsgKanji9564Tex "__OTR__textures/kanji/gMsgKanji9564Tex" +static const ALIGN_ASSET(2) char gMsgKanji9564Tex[] = dgMsgKanji9564Tex; + +#define dgMsgKanji9565Tex "__OTR__textures/kanji/gMsgKanji9565Tex" +static const ALIGN_ASSET(2) char gMsgKanji9565Tex[] = dgMsgKanji9565Tex; + +#define dgMsgKanji9566Tex "__OTR__textures/kanji/gMsgKanji9566Tex" +static const ALIGN_ASSET(2) char gMsgKanji9566Tex[] = dgMsgKanji9566Tex; + +#define dgMsgKanji9567Tex "__OTR__textures/kanji/gMsgKanji9567Tex" +static const ALIGN_ASSET(2) char gMsgKanji9567Tex[] = dgMsgKanji9567Tex; + +#define dgMsgKanji9568Tex "__OTR__textures/kanji/gMsgKanji9568Tex" +static const ALIGN_ASSET(2) char gMsgKanji9568Tex[] = dgMsgKanji9568Tex; + +#define dgMsgKanji9569Tex "__OTR__textures/kanji/gMsgKanji9569Tex" +static const ALIGN_ASSET(2) char gMsgKanji9569Tex[] = dgMsgKanji9569Tex; + +#define dgMsgKanji956ATex "__OTR__textures/kanji/gMsgKanji956ATex" +static const ALIGN_ASSET(2) char gMsgKanji956ATex[] = dgMsgKanji956ATex; + +#define dgMsgKanji956BTex "__OTR__textures/kanji/gMsgKanji956BTex" +static const ALIGN_ASSET(2) char gMsgKanji956BTex[] = dgMsgKanji956BTex; + +#define dgMsgKanji956CTex "__OTR__textures/kanji/gMsgKanji956CTex" +static const ALIGN_ASSET(2) char gMsgKanji956CTex[] = dgMsgKanji956CTex; + +#define dgMsgKanji956DTex "__OTR__textures/kanji/gMsgKanji956DTex" +static const ALIGN_ASSET(2) char gMsgKanji956DTex[] = dgMsgKanji956DTex; + +#define dgMsgKanji956ETex "__OTR__textures/kanji/gMsgKanji956ETex" +static const ALIGN_ASSET(2) char gMsgKanji956ETex[] = dgMsgKanji956ETex; + +#define dgMsgKanji956FTex "__OTR__textures/kanji/gMsgKanji956FTex" +static const ALIGN_ASSET(2) char gMsgKanji956FTex[] = dgMsgKanji956FTex; + +#define dgMsgKanji9570Tex "__OTR__textures/kanji/gMsgKanji9570Tex" +static const ALIGN_ASSET(2) char gMsgKanji9570Tex[] = dgMsgKanji9570Tex; + +#define dgMsgKanji9571Tex "__OTR__textures/kanji/gMsgKanji9571Tex" +static const ALIGN_ASSET(2) char gMsgKanji9571Tex[] = dgMsgKanji9571Tex; + +#define dgMsgKanji9572Tex "__OTR__textures/kanji/gMsgKanji9572Tex" +static const ALIGN_ASSET(2) char gMsgKanji9572Tex[] = dgMsgKanji9572Tex; + +#define dgMsgKanji9573Tex "__OTR__textures/kanji/gMsgKanji9573Tex" +static const ALIGN_ASSET(2) char gMsgKanji9573Tex[] = dgMsgKanji9573Tex; + +#define dgMsgKanji9574Tex "__OTR__textures/kanji/gMsgKanji9574Tex" +static const ALIGN_ASSET(2) char gMsgKanji9574Tex[] = dgMsgKanji9574Tex; + +#define dgMsgKanji9575Tex "__OTR__textures/kanji/gMsgKanji9575Tex" +static const ALIGN_ASSET(2) char gMsgKanji9575Tex[] = dgMsgKanji9575Tex; + +#define dgMsgKanji9576Tex "__OTR__textures/kanji/gMsgKanji9576Tex" +static const ALIGN_ASSET(2) char gMsgKanji9576Tex[] = dgMsgKanji9576Tex; + +#define dgMsgKanji9577Tex "__OTR__textures/kanji/gMsgKanji9577Tex" +static const ALIGN_ASSET(2) char gMsgKanji9577Tex[] = dgMsgKanji9577Tex; + +#define dgMsgKanji9578Tex "__OTR__textures/kanji/gMsgKanji9578Tex" +static const ALIGN_ASSET(2) char gMsgKanji9578Tex[] = dgMsgKanji9578Tex; + +#define dgMsgKanji9579Tex "__OTR__textures/kanji/gMsgKanji9579Tex" +static const ALIGN_ASSET(2) char gMsgKanji9579Tex[] = dgMsgKanji9579Tex; + +#define dgMsgKanji957ATex "__OTR__textures/kanji/gMsgKanji957ATex" +static const ALIGN_ASSET(2) char gMsgKanji957ATex[] = dgMsgKanji957ATex; + +#define dgMsgKanji957BTex "__OTR__textures/kanji/gMsgKanji957BTex" +static const ALIGN_ASSET(2) char gMsgKanji957BTex[] = dgMsgKanji957BTex; + +#define dgMsgKanji957CTex "__OTR__textures/kanji/gMsgKanji957CTex" +static const ALIGN_ASSET(2) char gMsgKanji957CTex[] = dgMsgKanji957CTex; + +#define dgMsgKanji957DTex "__OTR__textures/kanji/gMsgKanji957DTex" +static const ALIGN_ASSET(2) char gMsgKanji957DTex[] = dgMsgKanji957DTex; + +#define dgMsgKanji957ETex "__OTR__textures/kanji/gMsgKanji957ETex" +static const ALIGN_ASSET(2) char gMsgKanji957ETex[] = dgMsgKanji957ETex; + +#define dgMsgKanji9580Tex "__OTR__textures/kanji/gMsgKanji9580Tex" +static const ALIGN_ASSET(2) char gMsgKanji9580Tex[] = dgMsgKanji9580Tex; + +#define dgMsgKanji9581Tex "__OTR__textures/kanji/gMsgKanji9581Tex" +static const ALIGN_ASSET(2) char gMsgKanji9581Tex[] = dgMsgKanji9581Tex; + +#define dgMsgKanji9582Tex "__OTR__textures/kanji/gMsgKanji9582Tex" +static const ALIGN_ASSET(2) char gMsgKanji9582Tex[] = dgMsgKanji9582Tex; + +#define dgMsgKanji9583Tex "__OTR__textures/kanji/gMsgKanji9583Tex" +static const ALIGN_ASSET(2) char gMsgKanji9583Tex[] = dgMsgKanji9583Tex; + +#define dgMsgKanji9584Tex "__OTR__textures/kanji/gMsgKanji9584Tex" +static const ALIGN_ASSET(2) char gMsgKanji9584Tex[] = dgMsgKanji9584Tex; + +#define dgMsgKanji9585Tex "__OTR__textures/kanji/gMsgKanji9585Tex" +static const ALIGN_ASSET(2) char gMsgKanji9585Tex[] = dgMsgKanji9585Tex; + +#define dgMsgKanji9586Tex "__OTR__textures/kanji/gMsgKanji9586Tex" +static const ALIGN_ASSET(2) char gMsgKanji9586Tex[] = dgMsgKanji9586Tex; + +#define dgMsgKanji9587Tex "__OTR__textures/kanji/gMsgKanji9587Tex" +static const ALIGN_ASSET(2) char gMsgKanji9587Tex[] = dgMsgKanji9587Tex; + +#define dgMsgKanji9588Tex "__OTR__textures/kanji/gMsgKanji9588Tex" +static const ALIGN_ASSET(2) char gMsgKanji9588Tex[] = dgMsgKanji9588Tex; + +#define dgMsgKanji9589Tex "__OTR__textures/kanji/gMsgKanji9589Tex" +static const ALIGN_ASSET(2) char gMsgKanji9589Tex[] = dgMsgKanji9589Tex; + +#define dgMsgKanji958ATex "__OTR__textures/kanji/gMsgKanji958ATex" +static const ALIGN_ASSET(2) char gMsgKanji958ATex[] = dgMsgKanji958ATex; + +#define dgMsgKanji958BTex "__OTR__textures/kanji/gMsgKanji958BTex" +static const ALIGN_ASSET(2) char gMsgKanji958BTex[] = dgMsgKanji958BTex; + +#define dgMsgKanji958CTex "__OTR__textures/kanji/gMsgKanji958CTex" +static const ALIGN_ASSET(2) char gMsgKanji958CTex[] = dgMsgKanji958CTex; + +#define dgMsgKanji958DTex "__OTR__textures/kanji/gMsgKanji958DTex" +static const ALIGN_ASSET(2) char gMsgKanji958DTex[] = dgMsgKanji958DTex; + +#define dgMsgKanji958ETex "__OTR__textures/kanji/gMsgKanji958ETex" +static const ALIGN_ASSET(2) char gMsgKanji958ETex[] = dgMsgKanji958ETex; + +#define dgMsgKanji958FTex "__OTR__textures/kanji/gMsgKanji958FTex" +static const ALIGN_ASSET(2) char gMsgKanji958FTex[] = dgMsgKanji958FTex; + +#define dgMsgKanji9590Tex "__OTR__textures/kanji/gMsgKanji9590Tex" +static const ALIGN_ASSET(2) char gMsgKanji9590Tex[] = dgMsgKanji9590Tex; + +#define dgMsgKanji9591Tex "__OTR__textures/kanji/gMsgKanji9591Tex" +static const ALIGN_ASSET(2) char gMsgKanji9591Tex[] = dgMsgKanji9591Tex; + +#define dgMsgKanji9592Tex "__OTR__textures/kanji/gMsgKanji9592Tex" +static const ALIGN_ASSET(2) char gMsgKanji9592Tex[] = dgMsgKanji9592Tex; + +#define dgMsgKanji9593Tex "__OTR__textures/kanji/gMsgKanji9593Tex" +static const ALIGN_ASSET(2) char gMsgKanji9593Tex[] = dgMsgKanji9593Tex; + +#define dgMsgKanji9594Tex "__OTR__textures/kanji/gMsgKanji9594Tex" +static const ALIGN_ASSET(2) char gMsgKanji9594Tex[] = dgMsgKanji9594Tex; + +#define dgMsgKanji9595Tex "__OTR__textures/kanji/gMsgKanji9595Tex" +static const ALIGN_ASSET(2) char gMsgKanji9595Tex[] = dgMsgKanji9595Tex; + +#define dgMsgKanji9596Tex "__OTR__textures/kanji/gMsgKanji9596Tex" +static const ALIGN_ASSET(2) char gMsgKanji9596Tex[] = dgMsgKanji9596Tex; + +#define dgMsgKanji9597Tex "__OTR__textures/kanji/gMsgKanji9597Tex" +static const ALIGN_ASSET(2) char gMsgKanji9597Tex[] = dgMsgKanji9597Tex; + +#define dgMsgKanji9598Tex "__OTR__textures/kanji/gMsgKanji9598Tex" +static const ALIGN_ASSET(2) char gMsgKanji9598Tex[] = dgMsgKanji9598Tex; + +#define dgMsgKanji9599Tex "__OTR__textures/kanji/gMsgKanji9599Tex" +static const ALIGN_ASSET(2) char gMsgKanji9599Tex[] = dgMsgKanji9599Tex; + +#define dgMsgKanji959ATex "__OTR__textures/kanji/gMsgKanji959ATex" +static const ALIGN_ASSET(2) char gMsgKanji959ATex[] = dgMsgKanji959ATex; + +#define dgMsgKanji959BTex "__OTR__textures/kanji/gMsgKanji959BTex" +static const ALIGN_ASSET(2) char gMsgKanji959BTex[] = dgMsgKanji959BTex; + +#define dgMsgKanji959CTex "__OTR__textures/kanji/gMsgKanji959CTex" +static const ALIGN_ASSET(2) char gMsgKanji959CTex[] = dgMsgKanji959CTex; + +#define dgMsgKanji959DTex "__OTR__textures/kanji/gMsgKanji959DTex" +static const ALIGN_ASSET(2) char gMsgKanji959DTex[] = dgMsgKanji959DTex; + +#define dgMsgKanji959ETex "__OTR__textures/kanji/gMsgKanji959ETex" +static const ALIGN_ASSET(2) char gMsgKanji959ETex[] = dgMsgKanji959ETex; + +#define dgMsgKanji959FTex "__OTR__textures/kanji/gMsgKanji959FTex" +static const ALIGN_ASSET(2) char gMsgKanji959FTex[] = dgMsgKanji959FTex; + +#define dgMsgKanji95A0Tex "__OTR__textures/kanji/gMsgKanji95A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A0Tex[] = dgMsgKanji95A0Tex; + +#define dgMsgKanji95A1Tex "__OTR__textures/kanji/gMsgKanji95A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A1Tex[] = dgMsgKanji95A1Tex; + +#define dgMsgKanji95A2Tex "__OTR__textures/kanji/gMsgKanji95A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A2Tex[] = dgMsgKanji95A2Tex; + +#define dgMsgKanji95A3Tex "__OTR__textures/kanji/gMsgKanji95A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A3Tex[] = dgMsgKanji95A3Tex; + +#define dgMsgKanji95A4Tex "__OTR__textures/kanji/gMsgKanji95A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A4Tex[] = dgMsgKanji95A4Tex; + +#define dgMsgKanji95A5Tex "__OTR__textures/kanji/gMsgKanji95A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A5Tex[] = dgMsgKanji95A5Tex; + +#define dgMsgKanji95A6Tex "__OTR__textures/kanji/gMsgKanji95A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A6Tex[] = dgMsgKanji95A6Tex; + +#define dgMsgKanji95A7Tex "__OTR__textures/kanji/gMsgKanji95A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A7Tex[] = dgMsgKanji95A7Tex; + +#define dgMsgKanji95A8Tex "__OTR__textures/kanji/gMsgKanji95A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A8Tex[] = dgMsgKanji95A8Tex; + +#define dgMsgKanji95A9Tex "__OTR__textures/kanji/gMsgKanji95A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95A9Tex[] = dgMsgKanji95A9Tex; + +#define dgMsgKanji95AATex "__OTR__textures/kanji/gMsgKanji95AATex" +static const ALIGN_ASSET(2) char gMsgKanji95AATex[] = dgMsgKanji95AATex; + +#define dgMsgKanji95ABTex "__OTR__textures/kanji/gMsgKanji95ABTex" +static const ALIGN_ASSET(2) char gMsgKanji95ABTex[] = dgMsgKanji95ABTex; + +#define dgMsgKanji95ACTex "__OTR__textures/kanji/gMsgKanji95ACTex" +static const ALIGN_ASSET(2) char gMsgKanji95ACTex[] = dgMsgKanji95ACTex; + +#define dgMsgKanji95ADTex "__OTR__textures/kanji/gMsgKanji95ADTex" +static const ALIGN_ASSET(2) char gMsgKanji95ADTex[] = dgMsgKanji95ADTex; + +#define dgMsgKanji95AETex "__OTR__textures/kanji/gMsgKanji95AETex" +static const ALIGN_ASSET(2) char gMsgKanji95AETex[] = dgMsgKanji95AETex; + +#define dgMsgKanji95AFTex "__OTR__textures/kanji/gMsgKanji95AFTex" +static const ALIGN_ASSET(2) char gMsgKanji95AFTex[] = dgMsgKanji95AFTex; + +#define dgMsgKanji95B0Tex "__OTR__textures/kanji/gMsgKanji95B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B0Tex[] = dgMsgKanji95B0Tex; + +#define dgMsgKanji95B1Tex "__OTR__textures/kanji/gMsgKanji95B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B1Tex[] = dgMsgKanji95B1Tex; + +#define dgMsgKanji95B2Tex "__OTR__textures/kanji/gMsgKanji95B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B2Tex[] = dgMsgKanji95B2Tex; + +#define dgMsgKanji95B3Tex "__OTR__textures/kanji/gMsgKanji95B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B3Tex[] = dgMsgKanji95B3Tex; + +#define dgMsgKanji95B4Tex "__OTR__textures/kanji/gMsgKanji95B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B4Tex[] = dgMsgKanji95B4Tex; + +#define dgMsgKanji95B5Tex "__OTR__textures/kanji/gMsgKanji95B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B5Tex[] = dgMsgKanji95B5Tex; + +#define dgMsgKanji95B6Tex "__OTR__textures/kanji/gMsgKanji95B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B6Tex[] = dgMsgKanji95B6Tex; + +#define dgMsgKanji95B7Tex "__OTR__textures/kanji/gMsgKanji95B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B7Tex[] = dgMsgKanji95B7Tex; + +#define dgMsgKanji95B8Tex "__OTR__textures/kanji/gMsgKanji95B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B8Tex[] = dgMsgKanji95B8Tex; + +#define dgMsgKanji95B9Tex "__OTR__textures/kanji/gMsgKanji95B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95B9Tex[] = dgMsgKanji95B9Tex; + +#define dgMsgKanji95BATex "__OTR__textures/kanji/gMsgKanji95BATex" +static const ALIGN_ASSET(2) char gMsgKanji95BATex[] = dgMsgKanji95BATex; + +#define dgMsgKanji95BBTex "__OTR__textures/kanji/gMsgKanji95BBTex" +static const ALIGN_ASSET(2) char gMsgKanji95BBTex[] = dgMsgKanji95BBTex; + +#define dgMsgKanji95BCTex "__OTR__textures/kanji/gMsgKanji95BCTex" +static const ALIGN_ASSET(2) char gMsgKanji95BCTex[] = dgMsgKanji95BCTex; + +#define dgMsgKanji95BDTex "__OTR__textures/kanji/gMsgKanji95BDTex" +static const ALIGN_ASSET(2) char gMsgKanji95BDTex[] = dgMsgKanji95BDTex; + +#define dgMsgKanji95BETex "__OTR__textures/kanji/gMsgKanji95BETex" +static const ALIGN_ASSET(2) char gMsgKanji95BETex[] = dgMsgKanji95BETex; + +#define dgMsgKanji95BFTex "__OTR__textures/kanji/gMsgKanji95BFTex" +static const ALIGN_ASSET(2) char gMsgKanji95BFTex[] = dgMsgKanji95BFTex; + +#define dgMsgKanji95C0Tex "__OTR__textures/kanji/gMsgKanji95C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C0Tex[] = dgMsgKanji95C0Tex; + +#define dgMsgKanji95C1Tex "__OTR__textures/kanji/gMsgKanji95C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C1Tex[] = dgMsgKanji95C1Tex; + +#define dgMsgKanji95C2Tex "__OTR__textures/kanji/gMsgKanji95C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C2Tex[] = dgMsgKanji95C2Tex; + +#define dgMsgKanji95C3Tex "__OTR__textures/kanji/gMsgKanji95C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C3Tex[] = dgMsgKanji95C3Tex; + +#define dgMsgKanji95C4Tex "__OTR__textures/kanji/gMsgKanji95C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C4Tex[] = dgMsgKanji95C4Tex; + +#define dgMsgKanji95C5Tex "__OTR__textures/kanji/gMsgKanji95C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C5Tex[] = dgMsgKanji95C5Tex; + +#define dgMsgKanji95C6Tex "__OTR__textures/kanji/gMsgKanji95C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C6Tex[] = dgMsgKanji95C6Tex; + +#define dgMsgKanji95C7Tex "__OTR__textures/kanji/gMsgKanji95C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C7Tex[] = dgMsgKanji95C7Tex; + +#define dgMsgKanji95C8Tex "__OTR__textures/kanji/gMsgKanji95C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C8Tex[] = dgMsgKanji95C8Tex; + +#define dgMsgKanji95C9Tex "__OTR__textures/kanji/gMsgKanji95C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95C9Tex[] = dgMsgKanji95C9Tex; + +#define dgMsgKanji95CATex "__OTR__textures/kanji/gMsgKanji95CATex" +static const ALIGN_ASSET(2) char gMsgKanji95CATex[] = dgMsgKanji95CATex; + +#define dgMsgKanji95CBTex "__OTR__textures/kanji/gMsgKanji95CBTex" +static const ALIGN_ASSET(2) char gMsgKanji95CBTex[] = dgMsgKanji95CBTex; + +#define dgMsgKanji95CCTex "__OTR__textures/kanji/gMsgKanji95CCTex" +static const ALIGN_ASSET(2) char gMsgKanji95CCTex[] = dgMsgKanji95CCTex; + +#define dgMsgKanji95CDTex "__OTR__textures/kanji/gMsgKanji95CDTex" +static const ALIGN_ASSET(2) char gMsgKanji95CDTex[] = dgMsgKanji95CDTex; + +#define dgMsgKanji95CETex "__OTR__textures/kanji/gMsgKanji95CETex" +static const ALIGN_ASSET(2) char gMsgKanji95CETex[] = dgMsgKanji95CETex; + +#define dgMsgKanji95CFTex "__OTR__textures/kanji/gMsgKanji95CFTex" +static const ALIGN_ASSET(2) char gMsgKanji95CFTex[] = dgMsgKanji95CFTex; + +#define dgMsgKanji95D0Tex "__OTR__textures/kanji/gMsgKanji95D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D0Tex[] = dgMsgKanji95D0Tex; + +#define dgMsgKanji95D1Tex "__OTR__textures/kanji/gMsgKanji95D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D1Tex[] = dgMsgKanji95D1Tex; + +#define dgMsgKanji95D2Tex "__OTR__textures/kanji/gMsgKanji95D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D2Tex[] = dgMsgKanji95D2Tex; + +#define dgMsgKanji95D3Tex "__OTR__textures/kanji/gMsgKanji95D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D3Tex[] = dgMsgKanji95D3Tex; + +#define dgMsgKanji95D4Tex "__OTR__textures/kanji/gMsgKanji95D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D4Tex[] = dgMsgKanji95D4Tex; + +#define dgMsgKanji95D5Tex "__OTR__textures/kanji/gMsgKanji95D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D5Tex[] = dgMsgKanji95D5Tex; + +#define dgMsgKanji95D6Tex "__OTR__textures/kanji/gMsgKanji95D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D6Tex[] = dgMsgKanji95D6Tex; + +#define dgMsgKanji95D7Tex "__OTR__textures/kanji/gMsgKanji95D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D7Tex[] = dgMsgKanji95D7Tex; + +#define dgMsgKanji95D8Tex "__OTR__textures/kanji/gMsgKanji95D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D8Tex[] = dgMsgKanji95D8Tex; + +#define dgMsgKanji95D9Tex "__OTR__textures/kanji/gMsgKanji95D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95D9Tex[] = dgMsgKanji95D9Tex; + +#define dgMsgKanji95DATex "__OTR__textures/kanji/gMsgKanji95DATex" +static const ALIGN_ASSET(2) char gMsgKanji95DATex[] = dgMsgKanji95DATex; + +#define dgMsgKanji95DBTex "__OTR__textures/kanji/gMsgKanji95DBTex" +static const ALIGN_ASSET(2) char gMsgKanji95DBTex[] = dgMsgKanji95DBTex; + +#define dgMsgKanji95DCTex "__OTR__textures/kanji/gMsgKanji95DCTex" +static const ALIGN_ASSET(2) char gMsgKanji95DCTex[] = dgMsgKanji95DCTex; + +#define dgMsgKanji95DDTex "__OTR__textures/kanji/gMsgKanji95DDTex" +static const ALIGN_ASSET(2) char gMsgKanji95DDTex[] = dgMsgKanji95DDTex; + +#define dgMsgKanji95DETex "__OTR__textures/kanji/gMsgKanji95DETex" +static const ALIGN_ASSET(2) char gMsgKanji95DETex[] = dgMsgKanji95DETex; + +#define dgMsgKanji95DFTex "__OTR__textures/kanji/gMsgKanji95DFTex" +static const ALIGN_ASSET(2) char gMsgKanji95DFTex[] = dgMsgKanji95DFTex; + +#define dgMsgKanji95E0Tex "__OTR__textures/kanji/gMsgKanji95E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E0Tex[] = dgMsgKanji95E0Tex; + +#define dgMsgKanji95E1Tex "__OTR__textures/kanji/gMsgKanji95E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E1Tex[] = dgMsgKanji95E1Tex; + +#define dgMsgKanji95E2Tex "__OTR__textures/kanji/gMsgKanji95E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E2Tex[] = dgMsgKanji95E2Tex; + +#define dgMsgKanji95E3Tex "__OTR__textures/kanji/gMsgKanji95E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E3Tex[] = dgMsgKanji95E3Tex; + +#define dgMsgKanji95E4Tex "__OTR__textures/kanji/gMsgKanji95E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E4Tex[] = dgMsgKanji95E4Tex; + +#define dgMsgKanji95E5Tex "__OTR__textures/kanji/gMsgKanji95E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E5Tex[] = dgMsgKanji95E5Tex; + +#define dgMsgKanji95E6Tex "__OTR__textures/kanji/gMsgKanji95E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E6Tex[] = dgMsgKanji95E6Tex; + +#define dgMsgKanji95E7Tex "__OTR__textures/kanji/gMsgKanji95E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E7Tex[] = dgMsgKanji95E7Tex; + +#define dgMsgKanji95E8Tex "__OTR__textures/kanji/gMsgKanji95E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E8Tex[] = dgMsgKanji95E8Tex; + +#define dgMsgKanji95E9Tex "__OTR__textures/kanji/gMsgKanji95E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95E9Tex[] = dgMsgKanji95E9Tex; + +#define dgMsgKanji95EATex "__OTR__textures/kanji/gMsgKanji95EATex" +static const ALIGN_ASSET(2) char gMsgKanji95EATex[] = dgMsgKanji95EATex; + +#define dgMsgKanji95EBTex "__OTR__textures/kanji/gMsgKanji95EBTex" +static const ALIGN_ASSET(2) char gMsgKanji95EBTex[] = dgMsgKanji95EBTex; + +#define dgMsgKanji95ECTex "__OTR__textures/kanji/gMsgKanji95ECTex" +static const ALIGN_ASSET(2) char gMsgKanji95ECTex[] = dgMsgKanji95ECTex; + +#define dgMsgKanji95EDTex "__OTR__textures/kanji/gMsgKanji95EDTex" +static const ALIGN_ASSET(2) char gMsgKanji95EDTex[] = dgMsgKanji95EDTex; + +#define dgMsgKanji95EETex "__OTR__textures/kanji/gMsgKanji95EETex" +static const ALIGN_ASSET(2) char gMsgKanji95EETex[] = dgMsgKanji95EETex; + +#define dgMsgKanji95EFTex "__OTR__textures/kanji/gMsgKanji95EFTex" +static const ALIGN_ASSET(2) char gMsgKanji95EFTex[] = dgMsgKanji95EFTex; + +#define dgMsgKanji95F0Tex "__OTR__textures/kanji/gMsgKanji95F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F0Tex[] = dgMsgKanji95F0Tex; + +#define dgMsgKanji95F1Tex "__OTR__textures/kanji/gMsgKanji95F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F1Tex[] = dgMsgKanji95F1Tex; + +#define dgMsgKanji95F2Tex "__OTR__textures/kanji/gMsgKanji95F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F2Tex[] = dgMsgKanji95F2Tex; + +#define dgMsgKanji95F3Tex "__OTR__textures/kanji/gMsgKanji95F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F3Tex[] = dgMsgKanji95F3Tex; + +#define dgMsgKanji95F4Tex "__OTR__textures/kanji/gMsgKanji95F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F4Tex[] = dgMsgKanji95F4Tex; + +#define dgMsgKanji95F5Tex "__OTR__textures/kanji/gMsgKanji95F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F5Tex[] = dgMsgKanji95F5Tex; + +#define dgMsgKanji95F6Tex "__OTR__textures/kanji/gMsgKanji95F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F6Tex[] = dgMsgKanji95F6Tex; + +#define dgMsgKanji95F7Tex "__OTR__textures/kanji/gMsgKanji95F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F7Tex[] = dgMsgKanji95F7Tex; + +#define dgMsgKanji95F8Tex "__OTR__textures/kanji/gMsgKanji95F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F8Tex[] = dgMsgKanji95F8Tex; + +#define dgMsgKanji95F9Tex "__OTR__textures/kanji/gMsgKanji95F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji95F9Tex[] = dgMsgKanji95F9Tex; + +#define dgMsgKanji95FATex "__OTR__textures/kanji/gMsgKanji95FATex" +static const ALIGN_ASSET(2) char gMsgKanji95FATex[] = dgMsgKanji95FATex; + +#define dgMsgKanji95FBTex "__OTR__textures/kanji/gMsgKanji95FBTex" +static const ALIGN_ASSET(2) char gMsgKanji95FBTex[] = dgMsgKanji95FBTex; + +#define dgMsgKanji95FCTex "__OTR__textures/kanji/gMsgKanji95FCTex" +static const ALIGN_ASSET(2) char gMsgKanji95FCTex[] = dgMsgKanji95FCTex; + +#define dgMsgKanji9640Tex "__OTR__textures/kanji/gMsgKanji9640Tex" +static const ALIGN_ASSET(2) char gMsgKanji9640Tex[] = dgMsgKanji9640Tex; + +#define dgMsgKanji9641Tex "__OTR__textures/kanji/gMsgKanji9641Tex" +static const ALIGN_ASSET(2) char gMsgKanji9641Tex[] = dgMsgKanji9641Tex; + +#define dgMsgKanji9642Tex "__OTR__textures/kanji/gMsgKanji9642Tex" +static const ALIGN_ASSET(2) char gMsgKanji9642Tex[] = dgMsgKanji9642Tex; + +#define dgMsgKanji9643Tex "__OTR__textures/kanji/gMsgKanji9643Tex" +static const ALIGN_ASSET(2) char gMsgKanji9643Tex[] = dgMsgKanji9643Tex; + +#define dgMsgKanji9644Tex "__OTR__textures/kanji/gMsgKanji9644Tex" +static const ALIGN_ASSET(2) char gMsgKanji9644Tex[] = dgMsgKanji9644Tex; + +#define dgMsgKanji9645Tex "__OTR__textures/kanji/gMsgKanji9645Tex" +static const ALIGN_ASSET(2) char gMsgKanji9645Tex[] = dgMsgKanji9645Tex; + +#define dgMsgKanji9646Tex "__OTR__textures/kanji/gMsgKanji9646Tex" +static const ALIGN_ASSET(2) char gMsgKanji9646Tex[] = dgMsgKanji9646Tex; + +#define dgMsgKanji9647Tex "__OTR__textures/kanji/gMsgKanji9647Tex" +static const ALIGN_ASSET(2) char gMsgKanji9647Tex[] = dgMsgKanji9647Tex; + +#define dgMsgKanji9648Tex "__OTR__textures/kanji/gMsgKanji9648Tex" +static const ALIGN_ASSET(2) char gMsgKanji9648Tex[] = dgMsgKanji9648Tex; + +#define dgMsgKanji9649Tex "__OTR__textures/kanji/gMsgKanji9649Tex" +static const ALIGN_ASSET(2) char gMsgKanji9649Tex[] = dgMsgKanji9649Tex; + +#define dgMsgKanji964ATex "__OTR__textures/kanji/gMsgKanji964ATex" +static const ALIGN_ASSET(2) char gMsgKanji964ATex[] = dgMsgKanji964ATex; + +#define dgMsgKanji964BTex "__OTR__textures/kanji/gMsgKanji964BTex" +static const ALIGN_ASSET(2) char gMsgKanji964BTex[] = dgMsgKanji964BTex; + +#define dgMsgKanji964CTex "__OTR__textures/kanji/gMsgKanji964CTex" +static const ALIGN_ASSET(2) char gMsgKanji964CTex[] = dgMsgKanji964CTex; + +#define dgMsgKanji964DTex "__OTR__textures/kanji/gMsgKanji964DTex" +static const ALIGN_ASSET(2) char gMsgKanji964DTex[] = dgMsgKanji964DTex; + +#define dgMsgKanji964ETex "__OTR__textures/kanji/gMsgKanji964ETex" +static const ALIGN_ASSET(2) char gMsgKanji964ETex[] = dgMsgKanji964ETex; + +#define dgMsgKanji964FTex "__OTR__textures/kanji/gMsgKanji964FTex" +static const ALIGN_ASSET(2) char gMsgKanji964FTex[] = dgMsgKanji964FTex; + +#define dgMsgKanji9650Tex "__OTR__textures/kanji/gMsgKanji9650Tex" +static const ALIGN_ASSET(2) char gMsgKanji9650Tex[] = dgMsgKanji9650Tex; + +#define dgMsgKanji9651Tex "__OTR__textures/kanji/gMsgKanji9651Tex" +static const ALIGN_ASSET(2) char gMsgKanji9651Tex[] = dgMsgKanji9651Tex; + +#define dgMsgKanji9652Tex "__OTR__textures/kanji/gMsgKanji9652Tex" +static const ALIGN_ASSET(2) char gMsgKanji9652Tex[] = dgMsgKanji9652Tex; + +#define dgMsgKanji9653Tex "__OTR__textures/kanji/gMsgKanji9653Tex" +static const ALIGN_ASSET(2) char gMsgKanji9653Tex[] = dgMsgKanji9653Tex; + +#define dgMsgKanji9654Tex "__OTR__textures/kanji/gMsgKanji9654Tex" +static const ALIGN_ASSET(2) char gMsgKanji9654Tex[] = dgMsgKanji9654Tex; + +#define dgMsgKanji9655Tex "__OTR__textures/kanji/gMsgKanji9655Tex" +static const ALIGN_ASSET(2) char gMsgKanji9655Tex[] = dgMsgKanji9655Tex; + +#define dgMsgKanji9656Tex "__OTR__textures/kanji/gMsgKanji9656Tex" +static const ALIGN_ASSET(2) char gMsgKanji9656Tex[] = dgMsgKanji9656Tex; + +#define dgMsgKanji9657Tex "__OTR__textures/kanji/gMsgKanji9657Tex" +static const ALIGN_ASSET(2) char gMsgKanji9657Tex[] = dgMsgKanji9657Tex; + +#define dgMsgKanji9658Tex "__OTR__textures/kanji/gMsgKanji9658Tex" +static const ALIGN_ASSET(2) char gMsgKanji9658Tex[] = dgMsgKanji9658Tex; + +#define dgMsgKanji9659Tex "__OTR__textures/kanji/gMsgKanji9659Tex" +static const ALIGN_ASSET(2) char gMsgKanji9659Tex[] = dgMsgKanji9659Tex; + +#define dgMsgKanji965ATex "__OTR__textures/kanji/gMsgKanji965ATex" +static const ALIGN_ASSET(2) char gMsgKanji965ATex[] = dgMsgKanji965ATex; + +#define dgMsgKanji965BTex "__OTR__textures/kanji/gMsgKanji965BTex" +static const ALIGN_ASSET(2) char gMsgKanji965BTex[] = dgMsgKanji965BTex; + +#define dgMsgKanji965CTex "__OTR__textures/kanji/gMsgKanji965CTex" +static const ALIGN_ASSET(2) char gMsgKanji965CTex[] = dgMsgKanji965CTex; + +#define dgMsgKanji965DTex "__OTR__textures/kanji/gMsgKanji965DTex" +static const ALIGN_ASSET(2) char gMsgKanji965DTex[] = dgMsgKanji965DTex; + +#define dgMsgKanji965ETex "__OTR__textures/kanji/gMsgKanji965ETex" +static const ALIGN_ASSET(2) char gMsgKanji965ETex[] = dgMsgKanji965ETex; + +#define dgMsgKanji965FTex "__OTR__textures/kanji/gMsgKanji965FTex" +static const ALIGN_ASSET(2) char gMsgKanji965FTex[] = dgMsgKanji965FTex; + +#define dgMsgKanji9660Tex "__OTR__textures/kanji/gMsgKanji9660Tex" +static const ALIGN_ASSET(2) char gMsgKanji9660Tex[] = dgMsgKanji9660Tex; + +#define dgMsgKanji9661Tex "__OTR__textures/kanji/gMsgKanji9661Tex" +static const ALIGN_ASSET(2) char gMsgKanji9661Tex[] = dgMsgKanji9661Tex; + +#define dgMsgKanji9662Tex "__OTR__textures/kanji/gMsgKanji9662Tex" +static const ALIGN_ASSET(2) char gMsgKanji9662Tex[] = dgMsgKanji9662Tex; + +#define dgMsgKanji9663Tex "__OTR__textures/kanji/gMsgKanji9663Tex" +static const ALIGN_ASSET(2) char gMsgKanji9663Tex[] = dgMsgKanji9663Tex; + +#define dgMsgKanji9664Tex "__OTR__textures/kanji/gMsgKanji9664Tex" +static const ALIGN_ASSET(2) char gMsgKanji9664Tex[] = dgMsgKanji9664Tex; + +#define dgMsgKanji9665Tex "__OTR__textures/kanji/gMsgKanji9665Tex" +static const ALIGN_ASSET(2) char gMsgKanji9665Tex[] = dgMsgKanji9665Tex; + +#define dgMsgKanji9666Tex "__OTR__textures/kanji/gMsgKanji9666Tex" +static const ALIGN_ASSET(2) char gMsgKanji9666Tex[] = dgMsgKanji9666Tex; + +#define dgMsgKanji9667Tex "__OTR__textures/kanji/gMsgKanji9667Tex" +static const ALIGN_ASSET(2) char gMsgKanji9667Tex[] = dgMsgKanji9667Tex; + +#define dgMsgKanji9668Tex "__OTR__textures/kanji/gMsgKanji9668Tex" +static const ALIGN_ASSET(2) char gMsgKanji9668Tex[] = dgMsgKanji9668Tex; + +#define dgMsgKanji9669Tex "__OTR__textures/kanji/gMsgKanji9669Tex" +static const ALIGN_ASSET(2) char gMsgKanji9669Tex[] = dgMsgKanji9669Tex; + +#define dgMsgKanji966ATex "__OTR__textures/kanji/gMsgKanji966ATex" +static const ALIGN_ASSET(2) char gMsgKanji966ATex[] = dgMsgKanji966ATex; + +#define dgMsgKanji966BTex "__OTR__textures/kanji/gMsgKanji966BTex" +static const ALIGN_ASSET(2) char gMsgKanji966BTex[] = dgMsgKanji966BTex; + +#define dgMsgKanji966CTex "__OTR__textures/kanji/gMsgKanji966CTex" +static const ALIGN_ASSET(2) char gMsgKanji966CTex[] = dgMsgKanji966CTex; + +#define dgMsgKanji966DTex "__OTR__textures/kanji/gMsgKanji966DTex" +static const ALIGN_ASSET(2) char gMsgKanji966DTex[] = dgMsgKanji966DTex; + +#define dgMsgKanji966ETex "__OTR__textures/kanji/gMsgKanji966ETex" +static const ALIGN_ASSET(2) char gMsgKanji966ETex[] = dgMsgKanji966ETex; + +#define dgMsgKanji966FTex "__OTR__textures/kanji/gMsgKanji966FTex" +static const ALIGN_ASSET(2) char gMsgKanji966FTex[] = dgMsgKanji966FTex; + +#define dgMsgKanji9670Tex "__OTR__textures/kanji/gMsgKanji9670Tex" +static const ALIGN_ASSET(2) char gMsgKanji9670Tex[] = dgMsgKanji9670Tex; + +#define dgMsgKanji9671Tex "__OTR__textures/kanji/gMsgKanji9671Tex" +static const ALIGN_ASSET(2) char gMsgKanji9671Tex[] = dgMsgKanji9671Tex; + +#define dgMsgKanji9672Tex "__OTR__textures/kanji/gMsgKanji9672Tex" +static const ALIGN_ASSET(2) char gMsgKanji9672Tex[] = dgMsgKanji9672Tex; + +#define dgMsgKanji9673Tex "__OTR__textures/kanji/gMsgKanji9673Tex" +static const ALIGN_ASSET(2) char gMsgKanji9673Tex[] = dgMsgKanji9673Tex; + +#define dgMsgKanji9674Tex "__OTR__textures/kanji/gMsgKanji9674Tex" +static const ALIGN_ASSET(2) char gMsgKanji9674Tex[] = dgMsgKanji9674Tex; + +#define dgMsgKanji9675Tex "__OTR__textures/kanji/gMsgKanji9675Tex" +static const ALIGN_ASSET(2) char gMsgKanji9675Tex[] = dgMsgKanji9675Tex; + +#define dgMsgKanji9676Tex "__OTR__textures/kanji/gMsgKanji9676Tex" +static const ALIGN_ASSET(2) char gMsgKanji9676Tex[] = dgMsgKanji9676Tex; + +#define dgMsgKanji9677Tex "__OTR__textures/kanji/gMsgKanji9677Tex" +static const ALIGN_ASSET(2) char gMsgKanji9677Tex[] = dgMsgKanji9677Tex; + +#define dgMsgKanji9678Tex "__OTR__textures/kanji/gMsgKanji9678Tex" +static const ALIGN_ASSET(2) char gMsgKanji9678Tex[] = dgMsgKanji9678Tex; + +#define dgMsgKanji9679Tex "__OTR__textures/kanji/gMsgKanji9679Tex" +static const ALIGN_ASSET(2) char gMsgKanji9679Tex[] = dgMsgKanji9679Tex; + +#define dgMsgKanji967ATex "__OTR__textures/kanji/gMsgKanji967ATex" +static const ALIGN_ASSET(2) char gMsgKanji967ATex[] = dgMsgKanji967ATex; + +#define dgMsgKanji967BTex "__OTR__textures/kanji/gMsgKanji967BTex" +static const ALIGN_ASSET(2) char gMsgKanji967BTex[] = dgMsgKanji967BTex; + +#define dgMsgKanji967CTex "__OTR__textures/kanji/gMsgKanji967CTex" +static const ALIGN_ASSET(2) char gMsgKanji967CTex[] = dgMsgKanji967CTex; + +#define dgMsgKanji967DTex "__OTR__textures/kanji/gMsgKanji967DTex" +static const ALIGN_ASSET(2) char gMsgKanji967DTex[] = dgMsgKanji967DTex; + +#define dgMsgKanji967ETex "__OTR__textures/kanji/gMsgKanji967ETex" +static const ALIGN_ASSET(2) char gMsgKanji967ETex[] = dgMsgKanji967ETex; + +#define dgMsgKanji9680Tex "__OTR__textures/kanji/gMsgKanji9680Tex" +static const ALIGN_ASSET(2) char gMsgKanji9680Tex[] = dgMsgKanji9680Tex; + +#define dgMsgKanji9681Tex "__OTR__textures/kanji/gMsgKanji9681Tex" +static const ALIGN_ASSET(2) char gMsgKanji9681Tex[] = dgMsgKanji9681Tex; + +#define dgMsgKanji9682Tex "__OTR__textures/kanji/gMsgKanji9682Tex" +static const ALIGN_ASSET(2) char gMsgKanji9682Tex[] = dgMsgKanji9682Tex; + +#define dgMsgKanji9683Tex "__OTR__textures/kanji/gMsgKanji9683Tex" +static const ALIGN_ASSET(2) char gMsgKanji9683Tex[] = dgMsgKanji9683Tex; + +#define dgMsgKanji9684Tex "__OTR__textures/kanji/gMsgKanji9684Tex" +static const ALIGN_ASSET(2) char gMsgKanji9684Tex[] = dgMsgKanji9684Tex; + +#define dgMsgKanji9685Tex "__OTR__textures/kanji/gMsgKanji9685Tex" +static const ALIGN_ASSET(2) char gMsgKanji9685Tex[] = dgMsgKanji9685Tex; + +#define dgMsgKanji9686Tex "__OTR__textures/kanji/gMsgKanji9686Tex" +static const ALIGN_ASSET(2) char gMsgKanji9686Tex[] = dgMsgKanji9686Tex; + +#define dgMsgKanji9687Tex "__OTR__textures/kanji/gMsgKanji9687Tex" +static const ALIGN_ASSET(2) char gMsgKanji9687Tex[] = dgMsgKanji9687Tex; + +#define dgMsgKanji9688Tex "__OTR__textures/kanji/gMsgKanji9688Tex" +static const ALIGN_ASSET(2) char gMsgKanji9688Tex[] = dgMsgKanji9688Tex; + +#define dgMsgKanji9689Tex "__OTR__textures/kanji/gMsgKanji9689Tex" +static const ALIGN_ASSET(2) char gMsgKanji9689Tex[] = dgMsgKanji9689Tex; + +#define dgMsgKanji968ATex "__OTR__textures/kanji/gMsgKanji968ATex" +static const ALIGN_ASSET(2) char gMsgKanji968ATex[] = dgMsgKanji968ATex; + +#define dgMsgKanji968BTex "__OTR__textures/kanji/gMsgKanji968BTex" +static const ALIGN_ASSET(2) char gMsgKanji968BTex[] = dgMsgKanji968BTex; + +#define dgMsgKanji968CTex "__OTR__textures/kanji/gMsgKanji968CTex" +static const ALIGN_ASSET(2) char gMsgKanji968CTex[] = dgMsgKanji968CTex; + +#define dgMsgKanji968DTex "__OTR__textures/kanji/gMsgKanji968DTex" +static const ALIGN_ASSET(2) char gMsgKanji968DTex[] = dgMsgKanji968DTex; + +#define dgMsgKanji968ETex "__OTR__textures/kanji/gMsgKanji968ETex" +static const ALIGN_ASSET(2) char gMsgKanji968ETex[] = dgMsgKanji968ETex; + +#define dgMsgKanji968FTex "__OTR__textures/kanji/gMsgKanji968FTex" +static const ALIGN_ASSET(2) char gMsgKanji968FTex[] = dgMsgKanji968FTex; + +#define dgMsgKanji9690Tex "__OTR__textures/kanji/gMsgKanji9690Tex" +static const ALIGN_ASSET(2) char gMsgKanji9690Tex[] = dgMsgKanji9690Tex; + +#define dgMsgKanji9691Tex "__OTR__textures/kanji/gMsgKanji9691Tex" +static const ALIGN_ASSET(2) char gMsgKanji9691Tex[] = dgMsgKanji9691Tex; + +#define dgMsgKanji9692Tex "__OTR__textures/kanji/gMsgKanji9692Tex" +static const ALIGN_ASSET(2) char gMsgKanji9692Tex[] = dgMsgKanji9692Tex; + +#define dgMsgKanji9693Tex "__OTR__textures/kanji/gMsgKanji9693Tex" +static const ALIGN_ASSET(2) char gMsgKanji9693Tex[] = dgMsgKanji9693Tex; + +#define dgMsgKanji9694Tex "__OTR__textures/kanji/gMsgKanji9694Tex" +static const ALIGN_ASSET(2) char gMsgKanji9694Tex[] = dgMsgKanji9694Tex; + +#define dgMsgKanji9695Tex "__OTR__textures/kanji/gMsgKanji9695Tex" +static const ALIGN_ASSET(2) char gMsgKanji9695Tex[] = dgMsgKanji9695Tex; + +#define dgMsgKanji9696Tex "__OTR__textures/kanji/gMsgKanji9696Tex" +static const ALIGN_ASSET(2) char gMsgKanji9696Tex[] = dgMsgKanji9696Tex; + +#define dgMsgKanji9697Tex "__OTR__textures/kanji/gMsgKanji9697Tex" +static const ALIGN_ASSET(2) char gMsgKanji9697Tex[] = dgMsgKanji9697Tex; + +#define dgMsgKanji9698Tex "__OTR__textures/kanji/gMsgKanji9698Tex" +static const ALIGN_ASSET(2) char gMsgKanji9698Tex[] = dgMsgKanji9698Tex; + +#define dgMsgKanji9699Tex "__OTR__textures/kanji/gMsgKanji9699Tex" +static const ALIGN_ASSET(2) char gMsgKanji9699Tex[] = dgMsgKanji9699Tex; + +#define dgMsgKanji969ATex "__OTR__textures/kanji/gMsgKanji969ATex" +static const ALIGN_ASSET(2) char gMsgKanji969ATex[] = dgMsgKanji969ATex; + +#define dgMsgKanji969BTex "__OTR__textures/kanji/gMsgKanji969BTex" +static const ALIGN_ASSET(2) char gMsgKanji969BTex[] = dgMsgKanji969BTex; + +#define dgMsgKanji969CTex "__OTR__textures/kanji/gMsgKanji969CTex" +static const ALIGN_ASSET(2) char gMsgKanji969CTex[] = dgMsgKanji969CTex; + +#define dgMsgKanji969DTex "__OTR__textures/kanji/gMsgKanji969DTex" +static const ALIGN_ASSET(2) char gMsgKanji969DTex[] = dgMsgKanji969DTex; + +#define dgMsgKanji969ETex "__OTR__textures/kanji/gMsgKanji969ETex" +static const ALIGN_ASSET(2) char gMsgKanji969ETex[] = dgMsgKanji969ETex; + +#define dgMsgKanji969FTex "__OTR__textures/kanji/gMsgKanji969FTex" +static const ALIGN_ASSET(2) char gMsgKanji969FTex[] = dgMsgKanji969FTex; + +#define dgMsgKanji96A0Tex "__OTR__textures/kanji/gMsgKanji96A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A0Tex[] = dgMsgKanji96A0Tex; + +#define dgMsgKanji96A1Tex "__OTR__textures/kanji/gMsgKanji96A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A1Tex[] = dgMsgKanji96A1Tex; + +#define dgMsgKanji96A2Tex "__OTR__textures/kanji/gMsgKanji96A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A2Tex[] = dgMsgKanji96A2Tex; + +#define dgMsgKanji96A3Tex "__OTR__textures/kanji/gMsgKanji96A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A3Tex[] = dgMsgKanji96A3Tex; + +#define dgMsgKanji96A4Tex "__OTR__textures/kanji/gMsgKanji96A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A4Tex[] = dgMsgKanji96A4Tex; + +#define dgMsgKanji96A5Tex "__OTR__textures/kanji/gMsgKanji96A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A5Tex[] = dgMsgKanji96A5Tex; + +#define dgMsgKanji96A6Tex "__OTR__textures/kanji/gMsgKanji96A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A6Tex[] = dgMsgKanji96A6Tex; + +#define dgMsgKanji96A7Tex "__OTR__textures/kanji/gMsgKanji96A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A7Tex[] = dgMsgKanji96A7Tex; + +#define dgMsgKanji96A8Tex "__OTR__textures/kanji/gMsgKanji96A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A8Tex[] = dgMsgKanji96A8Tex; + +#define dgMsgKanji96A9Tex "__OTR__textures/kanji/gMsgKanji96A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96A9Tex[] = dgMsgKanji96A9Tex; + +#define dgMsgKanji96AATex "__OTR__textures/kanji/gMsgKanji96AATex" +static const ALIGN_ASSET(2) char gMsgKanji96AATex[] = dgMsgKanji96AATex; + +#define dgMsgKanji96ABTex "__OTR__textures/kanji/gMsgKanji96ABTex" +static const ALIGN_ASSET(2) char gMsgKanji96ABTex[] = dgMsgKanji96ABTex; + +#define dgMsgKanji96ACTex "__OTR__textures/kanji/gMsgKanji96ACTex" +static const ALIGN_ASSET(2) char gMsgKanji96ACTex[] = dgMsgKanji96ACTex; + +#define dgMsgKanji96ADTex "__OTR__textures/kanji/gMsgKanji96ADTex" +static const ALIGN_ASSET(2) char gMsgKanji96ADTex[] = dgMsgKanji96ADTex; + +#define dgMsgKanji96AETex "__OTR__textures/kanji/gMsgKanji96AETex" +static const ALIGN_ASSET(2) char gMsgKanji96AETex[] = dgMsgKanji96AETex; + +#define dgMsgKanji96AFTex "__OTR__textures/kanji/gMsgKanji96AFTex" +static const ALIGN_ASSET(2) char gMsgKanji96AFTex[] = dgMsgKanji96AFTex; + +#define dgMsgKanji96B0Tex "__OTR__textures/kanji/gMsgKanji96B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B0Tex[] = dgMsgKanji96B0Tex; + +#define dgMsgKanji96B1Tex "__OTR__textures/kanji/gMsgKanji96B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B1Tex[] = dgMsgKanji96B1Tex; + +#define dgMsgKanji96B2Tex "__OTR__textures/kanji/gMsgKanji96B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B2Tex[] = dgMsgKanji96B2Tex; + +#define dgMsgKanji96B3Tex "__OTR__textures/kanji/gMsgKanji96B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B3Tex[] = dgMsgKanji96B3Tex; + +#define dgMsgKanji96B4Tex "__OTR__textures/kanji/gMsgKanji96B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B4Tex[] = dgMsgKanji96B4Tex; + +#define dgMsgKanji96B5Tex "__OTR__textures/kanji/gMsgKanji96B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B5Tex[] = dgMsgKanji96B5Tex; + +#define dgMsgKanji96B6Tex "__OTR__textures/kanji/gMsgKanji96B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B6Tex[] = dgMsgKanji96B6Tex; + +#define dgMsgKanji96B7Tex "__OTR__textures/kanji/gMsgKanji96B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B7Tex[] = dgMsgKanji96B7Tex; + +#define dgMsgKanji96B8Tex "__OTR__textures/kanji/gMsgKanji96B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B8Tex[] = dgMsgKanji96B8Tex; + +#define dgMsgKanji96B9Tex "__OTR__textures/kanji/gMsgKanji96B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96B9Tex[] = dgMsgKanji96B9Tex; + +#define dgMsgKanji96BATex "__OTR__textures/kanji/gMsgKanji96BATex" +static const ALIGN_ASSET(2) char gMsgKanji96BATex[] = dgMsgKanji96BATex; + +#define dgMsgKanji96BBTex "__OTR__textures/kanji/gMsgKanji96BBTex" +static const ALIGN_ASSET(2) char gMsgKanji96BBTex[] = dgMsgKanji96BBTex; + +#define dgMsgKanji96BCTex "__OTR__textures/kanji/gMsgKanji96BCTex" +static const ALIGN_ASSET(2) char gMsgKanji96BCTex[] = dgMsgKanji96BCTex; + +#define dgMsgKanji96BDTex "__OTR__textures/kanji/gMsgKanji96BDTex" +static const ALIGN_ASSET(2) char gMsgKanji96BDTex[] = dgMsgKanji96BDTex; + +#define dgMsgKanji96BETex "__OTR__textures/kanji/gMsgKanji96BETex" +static const ALIGN_ASSET(2) char gMsgKanji96BETex[] = dgMsgKanji96BETex; + +#define dgMsgKanji96BFTex "__OTR__textures/kanji/gMsgKanji96BFTex" +static const ALIGN_ASSET(2) char gMsgKanji96BFTex[] = dgMsgKanji96BFTex; + +#define dgMsgKanji96C0Tex "__OTR__textures/kanji/gMsgKanji96C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C0Tex[] = dgMsgKanji96C0Tex; + +#define dgMsgKanji96C1Tex "__OTR__textures/kanji/gMsgKanji96C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C1Tex[] = dgMsgKanji96C1Tex; + +#define dgMsgKanji96C2Tex "__OTR__textures/kanji/gMsgKanji96C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C2Tex[] = dgMsgKanji96C2Tex; + +#define dgMsgKanji96C3Tex "__OTR__textures/kanji/gMsgKanji96C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C3Tex[] = dgMsgKanji96C3Tex; + +#define dgMsgKanji96C4Tex "__OTR__textures/kanji/gMsgKanji96C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C4Tex[] = dgMsgKanji96C4Tex; + +#define dgMsgKanji96C5Tex "__OTR__textures/kanji/gMsgKanji96C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C5Tex[] = dgMsgKanji96C5Tex; + +#define dgMsgKanji96C6Tex "__OTR__textures/kanji/gMsgKanji96C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C6Tex[] = dgMsgKanji96C6Tex; + +#define dgMsgKanji96C7Tex "__OTR__textures/kanji/gMsgKanji96C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C7Tex[] = dgMsgKanji96C7Tex; + +#define dgMsgKanji96C8Tex "__OTR__textures/kanji/gMsgKanji96C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C8Tex[] = dgMsgKanji96C8Tex; + +#define dgMsgKanji96C9Tex "__OTR__textures/kanji/gMsgKanji96C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96C9Tex[] = dgMsgKanji96C9Tex; + +#define dgMsgKanji96CATex "__OTR__textures/kanji/gMsgKanji96CATex" +static const ALIGN_ASSET(2) char gMsgKanji96CATex[] = dgMsgKanji96CATex; + +#define dgMsgKanji96CBTex "__OTR__textures/kanji/gMsgKanji96CBTex" +static const ALIGN_ASSET(2) char gMsgKanji96CBTex[] = dgMsgKanji96CBTex; + +#define dgMsgKanji96CCTex "__OTR__textures/kanji/gMsgKanji96CCTex" +static const ALIGN_ASSET(2) char gMsgKanji96CCTex[] = dgMsgKanji96CCTex; + +#define dgMsgKanji96CDTex "__OTR__textures/kanji/gMsgKanji96CDTex" +static const ALIGN_ASSET(2) char gMsgKanji96CDTex[] = dgMsgKanji96CDTex; + +#define dgMsgKanji96CETex "__OTR__textures/kanji/gMsgKanji96CETex" +static const ALIGN_ASSET(2) char gMsgKanji96CETex[] = dgMsgKanji96CETex; + +#define dgMsgKanji96CFTex "__OTR__textures/kanji/gMsgKanji96CFTex" +static const ALIGN_ASSET(2) char gMsgKanji96CFTex[] = dgMsgKanji96CFTex; + +#define dgMsgKanji96D0Tex "__OTR__textures/kanji/gMsgKanji96D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D0Tex[] = dgMsgKanji96D0Tex; + +#define dgMsgKanji96D1Tex "__OTR__textures/kanji/gMsgKanji96D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D1Tex[] = dgMsgKanji96D1Tex; + +#define dgMsgKanji96D2Tex "__OTR__textures/kanji/gMsgKanji96D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D2Tex[] = dgMsgKanji96D2Tex; + +#define dgMsgKanji96D3Tex "__OTR__textures/kanji/gMsgKanji96D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D3Tex[] = dgMsgKanji96D3Tex; + +#define dgMsgKanji96D4Tex "__OTR__textures/kanji/gMsgKanji96D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D4Tex[] = dgMsgKanji96D4Tex; + +#define dgMsgKanji96D5Tex "__OTR__textures/kanji/gMsgKanji96D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D5Tex[] = dgMsgKanji96D5Tex; + +#define dgMsgKanji96D6Tex "__OTR__textures/kanji/gMsgKanji96D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D6Tex[] = dgMsgKanji96D6Tex; + +#define dgMsgKanji96D7Tex "__OTR__textures/kanji/gMsgKanji96D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D7Tex[] = dgMsgKanji96D7Tex; + +#define dgMsgKanji96D8Tex "__OTR__textures/kanji/gMsgKanji96D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D8Tex[] = dgMsgKanji96D8Tex; + +#define dgMsgKanji96D9Tex "__OTR__textures/kanji/gMsgKanji96D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96D9Tex[] = dgMsgKanji96D9Tex; + +#define dgMsgKanji96DATex "__OTR__textures/kanji/gMsgKanji96DATex" +static const ALIGN_ASSET(2) char gMsgKanji96DATex[] = dgMsgKanji96DATex; + +#define dgMsgKanji96DBTex "__OTR__textures/kanji/gMsgKanji96DBTex" +static const ALIGN_ASSET(2) char gMsgKanji96DBTex[] = dgMsgKanji96DBTex; + +#define dgMsgKanji96DCTex "__OTR__textures/kanji/gMsgKanji96DCTex" +static const ALIGN_ASSET(2) char gMsgKanji96DCTex[] = dgMsgKanji96DCTex; + +#define dgMsgKanji96DDTex "__OTR__textures/kanji/gMsgKanji96DDTex" +static const ALIGN_ASSET(2) char gMsgKanji96DDTex[] = dgMsgKanji96DDTex; + +#define dgMsgKanji96DETex "__OTR__textures/kanji/gMsgKanji96DETex" +static const ALIGN_ASSET(2) char gMsgKanji96DETex[] = dgMsgKanji96DETex; + +#define dgMsgKanji96DFTex "__OTR__textures/kanji/gMsgKanji96DFTex" +static const ALIGN_ASSET(2) char gMsgKanji96DFTex[] = dgMsgKanji96DFTex; + +#define dgMsgKanji96E0Tex "__OTR__textures/kanji/gMsgKanji96E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E0Tex[] = dgMsgKanji96E0Tex; + +#define dgMsgKanji96E1Tex "__OTR__textures/kanji/gMsgKanji96E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E1Tex[] = dgMsgKanji96E1Tex; + +#define dgMsgKanji96E2Tex "__OTR__textures/kanji/gMsgKanji96E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E2Tex[] = dgMsgKanji96E2Tex; + +#define dgMsgKanji96E3Tex "__OTR__textures/kanji/gMsgKanji96E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E3Tex[] = dgMsgKanji96E3Tex; + +#define dgMsgKanji96E4Tex "__OTR__textures/kanji/gMsgKanji96E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E4Tex[] = dgMsgKanji96E4Tex; + +#define dgMsgKanji96E5Tex "__OTR__textures/kanji/gMsgKanji96E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E5Tex[] = dgMsgKanji96E5Tex; + +#define dgMsgKanji96E6Tex "__OTR__textures/kanji/gMsgKanji96E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E6Tex[] = dgMsgKanji96E6Tex; + +#define dgMsgKanji96E7Tex "__OTR__textures/kanji/gMsgKanji96E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E7Tex[] = dgMsgKanji96E7Tex; + +#define dgMsgKanji96E8Tex "__OTR__textures/kanji/gMsgKanji96E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E8Tex[] = dgMsgKanji96E8Tex; + +#define dgMsgKanji96E9Tex "__OTR__textures/kanji/gMsgKanji96E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96E9Tex[] = dgMsgKanji96E9Tex; + +#define dgMsgKanji96EATex "__OTR__textures/kanji/gMsgKanji96EATex" +static const ALIGN_ASSET(2) char gMsgKanji96EATex[] = dgMsgKanji96EATex; + +#define dgMsgKanji96EBTex "__OTR__textures/kanji/gMsgKanji96EBTex" +static const ALIGN_ASSET(2) char gMsgKanji96EBTex[] = dgMsgKanji96EBTex; + +#define dgMsgKanji96ECTex "__OTR__textures/kanji/gMsgKanji96ECTex" +static const ALIGN_ASSET(2) char gMsgKanji96ECTex[] = dgMsgKanji96ECTex; + +#define dgMsgKanji96EDTex "__OTR__textures/kanji/gMsgKanji96EDTex" +static const ALIGN_ASSET(2) char gMsgKanji96EDTex[] = dgMsgKanji96EDTex; + +#define dgMsgKanji96EETex "__OTR__textures/kanji/gMsgKanji96EETex" +static const ALIGN_ASSET(2) char gMsgKanji96EETex[] = dgMsgKanji96EETex; + +#define dgMsgKanji96EFTex "__OTR__textures/kanji/gMsgKanji96EFTex" +static const ALIGN_ASSET(2) char gMsgKanji96EFTex[] = dgMsgKanji96EFTex; + +#define dgMsgKanji96F0Tex "__OTR__textures/kanji/gMsgKanji96F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F0Tex[] = dgMsgKanji96F0Tex; + +#define dgMsgKanji96F1Tex "__OTR__textures/kanji/gMsgKanji96F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F1Tex[] = dgMsgKanji96F1Tex; + +#define dgMsgKanji96F2Tex "__OTR__textures/kanji/gMsgKanji96F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F2Tex[] = dgMsgKanji96F2Tex; + +#define dgMsgKanji96F3Tex "__OTR__textures/kanji/gMsgKanji96F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F3Tex[] = dgMsgKanji96F3Tex; + +#define dgMsgKanji96F4Tex "__OTR__textures/kanji/gMsgKanji96F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F4Tex[] = dgMsgKanji96F4Tex; + +#define dgMsgKanji96F5Tex "__OTR__textures/kanji/gMsgKanji96F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F5Tex[] = dgMsgKanji96F5Tex; + +#define dgMsgKanji96F6Tex "__OTR__textures/kanji/gMsgKanji96F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F6Tex[] = dgMsgKanji96F6Tex; + +#define dgMsgKanji96F7Tex "__OTR__textures/kanji/gMsgKanji96F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F7Tex[] = dgMsgKanji96F7Tex; + +#define dgMsgKanji96F8Tex "__OTR__textures/kanji/gMsgKanji96F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F8Tex[] = dgMsgKanji96F8Tex; + +#define dgMsgKanji96F9Tex "__OTR__textures/kanji/gMsgKanji96F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji96F9Tex[] = dgMsgKanji96F9Tex; + +#define dgMsgKanji96FATex "__OTR__textures/kanji/gMsgKanji96FATex" +static const ALIGN_ASSET(2) char gMsgKanji96FATex[] = dgMsgKanji96FATex; + +#define dgMsgKanji96FBTex "__OTR__textures/kanji/gMsgKanji96FBTex" +static const ALIGN_ASSET(2) char gMsgKanji96FBTex[] = dgMsgKanji96FBTex; + +#define dgMsgKanji96FCTex "__OTR__textures/kanji/gMsgKanji96FCTex" +static const ALIGN_ASSET(2) char gMsgKanji96FCTex[] = dgMsgKanji96FCTex; + +#define dgMsgKanji9740Tex "__OTR__textures/kanji/gMsgKanji9740Tex" +static const ALIGN_ASSET(2) char gMsgKanji9740Tex[] = dgMsgKanji9740Tex; + +#define dgMsgKanji9741Tex "__OTR__textures/kanji/gMsgKanji9741Tex" +static const ALIGN_ASSET(2) char gMsgKanji9741Tex[] = dgMsgKanji9741Tex; + +#define dgMsgKanji9742Tex "__OTR__textures/kanji/gMsgKanji9742Tex" +static const ALIGN_ASSET(2) char gMsgKanji9742Tex[] = dgMsgKanji9742Tex; + +#define dgMsgKanji9743Tex "__OTR__textures/kanji/gMsgKanji9743Tex" +static const ALIGN_ASSET(2) char gMsgKanji9743Tex[] = dgMsgKanji9743Tex; + +#define dgMsgKanji9744Tex "__OTR__textures/kanji/gMsgKanji9744Tex" +static const ALIGN_ASSET(2) char gMsgKanji9744Tex[] = dgMsgKanji9744Tex; + +#define dgMsgKanji9745Tex "__OTR__textures/kanji/gMsgKanji9745Tex" +static const ALIGN_ASSET(2) char gMsgKanji9745Tex[] = dgMsgKanji9745Tex; + +#define dgMsgKanji9746Tex "__OTR__textures/kanji/gMsgKanji9746Tex" +static const ALIGN_ASSET(2) char gMsgKanji9746Tex[] = dgMsgKanji9746Tex; + +#define dgMsgKanji9747Tex "__OTR__textures/kanji/gMsgKanji9747Tex" +static const ALIGN_ASSET(2) char gMsgKanji9747Tex[] = dgMsgKanji9747Tex; + +#define dgMsgKanji9748Tex "__OTR__textures/kanji/gMsgKanji9748Tex" +static const ALIGN_ASSET(2) char gMsgKanji9748Tex[] = dgMsgKanji9748Tex; + +#define dgMsgKanji9749Tex "__OTR__textures/kanji/gMsgKanji9749Tex" +static const ALIGN_ASSET(2) char gMsgKanji9749Tex[] = dgMsgKanji9749Tex; + +#define dgMsgKanji974ATex "__OTR__textures/kanji/gMsgKanji974ATex" +static const ALIGN_ASSET(2) char gMsgKanji974ATex[] = dgMsgKanji974ATex; + +#define dgMsgKanji974BTex "__OTR__textures/kanji/gMsgKanji974BTex" +static const ALIGN_ASSET(2) char gMsgKanji974BTex[] = dgMsgKanji974BTex; + +#define dgMsgKanji974CTex "__OTR__textures/kanji/gMsgKanji974CTex" +static const ALIGN_ASSET(2) char gMsgKanji974CTex[] = dgMsgKanji974CTex; + +#define dgMsgKanji974DTex "__OTR__textures/kanji/gMsgKanji974DTex" +static const ALIGN_ASSET(2) char gMsgKanji974DTex[] = dgMsgKanji974DTex; + +#define dgMsgKanji974ETex "__OTR__textures/kanji/gMsgKanji974ETex" +static const ALIGN_ASSET(2) char gMsgKanji974ETex[] = dgMsgKanji974ETex; + +#define dgMsgKanji974FTex "__OTR__textures/kanji/gMsgKanji974FTex" +static const ALIGN_ASSET(2) char gMsgKanji974FTex[] = dgMsgKanji974FTex; + +#define dgMsgKanji9750Tex "__OTR__textures/kanji/gMsgKanji9750Tex" +static const ALIGN_ASSET(2) char gMsgKanji9750Tex[] = dgMsgKanji9750Tex; + +#define dgMsgKanji9751Tex "__OTR__textures/kanji/gMsgKanji9751Tex" +static const ALIGN_ASSET(2) char gMsgKanji9751Tex[] = dgMsgKanji9751Tex; + +#define dgMsgKanji9752Tex "__OTR__textures/kanji/gMsgKanji9752Tex" +static const ALIGN_ASSET(2) char gMsgKanji9752Tex[] = dgMsgKanji9752Tex; + +#define dgMsgKanji9753Tex "__OTR__textures/kanji/gMsgKanji9753Tex" +static const ALIGN_ASSET(2) char gMsgKanji9753Tex[] = dgMsgKanji9753Tex; + +#define dgMsgKanji9754Tex "__OTR__textures/kanji/gMsgKanji9754Tex" +static const ALIGN_ASSET(2) char gMsgKanji9754Tex[] = dgMsgKanji9754Tex; + +#define dgMsgKanji9755Tex "__OTR__textures/kanji/gMsgKanji9755Tex" +static const ALIGN_ASSET(2) char gMsgKanji9755Tex[] = dgMsgKanji9755Tex; + +#define dgMsgKanji9756Tex "__OTR__textures/kanji/gMsgKanji9756Tex" +static const ALIGN_ASSET(2) char gMsgKanji9756Tex[] = dgMsgKanji9756Tex; + +#define dgMsgKanji9757Tex "__OTR__textures/kanji/gMsgKanji9757Tex" +static const ALIGN_ASSET(2) char gMsgKanji9757Tex[] = dgMsgKanji9757Tex; + +#define dgMsgKanji9758Tex "__OTR__textures/kanji/gMsgKanji9758Tex" +static const ALIGN_ASSET(2) char gMsgKanji9758Tex[] = dgMsgKanji9758Tex; + +#define dgMsgKanji9759Tex "__OTR__textures/kanji/gMsgKanji9759Tex" +static const ALIGN_ASSET(2) char gMsgKanji9759Tex[] = dgMsgKanji9759Tex; + +#define dgMsgKanji975ATex "__OTR__textures/kanji/gMsgKanji975ATex" +static const ALIGN_ASSET(2) char gMsgKanji975ATex[] = dgMsgKanji975ATex; + +#define dgMsgKanji975BTex "__OTR__textures/kanji/gMsgKanji975BTex" +static const ALIGN_ASSET(2) char gMsgKanji975BTex[] = dgMsgKanji975BTex; + +#define dgMsgKanji975CTex "__OTR__textures/kanji/gMsgKanji975CTex" +static const ALIGN_ASSET(2) char gMsgKanji975CTex[] = dgMsgKanji975CTex; + +#define dgMsgKanji975DTex "__OTR__textures/kanji/gMsgKanji975DTex" +static const ALIGN_ASSET(2) char gMsgKanji975DTex[] = dgMsgKanji975DTex; + +#define dgMsgKanji975ETex "__OTR__textures/kanji/gMsgKanji975ETex" +static const ALIGN_ASSET(2) char gMsgKanji975ETex[] = dgMsgKanji975ETex; + +#define dgMsgKanji975FTex "__OTR__textures/kanji/gMsgKanji975FTex" +static const ALIGN_ASSET(2) char gMsgKanji975FTex[] = dgMsgKanji975FTex; + +#define dgMsgKanji9760Tex "__OTR__textures/kanji/gMsgKanji9760Tex" +static const ALIGN_ASSET(2) char gMsgKanji9760Tex[] = dgMsgKanji9760Tex; + +#define dgMsgKanji9761Tex "__OTR__textures/kanji/gMsgKanji9761Tex" +static const ALIGN_ASSET(2) char gMsgKanji9761Tex[] = dgMsgKanji9761Tex; + +#define dgMsgKanji9762Tex "__OTR__textures/kanji/gMsgKanji9762Tex" +static const ALIGN_ASSET(2) char gMsgKanji9762Tex[] = dgMsgKanji9762Tex; + +#define dgMsgKanji9763Tex "__OTR__textures/kanji/gMsgKanji9763Tex" +static const ALIGN_ASSET(2) char gMsgKanji9763Tex[] = dgMsgKanji9763Tex; + +#define dgMsgKanji9764Tex "__OTR__textures/kanji/gMsgKanji9764Tex" +static const ALIGN_ASSET(2) char gMsgKanji9764Tex[] = dgMsgKanji9764Tex; + +#define dgMsgKanji9765Tex "__OTR__textures/kanji/gMsgKanji9765Tex" +static const ALIGN_ASSET(2) char gMsgKanji9765Tex[] = dgMsgKanji9765Tex; + +#define dgMsgKanji9766Tex "__OTR__textures/kanji/gMsgKanji9766Tex" +static const ALIGN_ASSET(2) char gMsgKanji9766Tex[] = dgMsgKanji9766Tex; + +#define dgMsgKanji9767Tex "__OTR__textures/kanji/gMsgKanji9767Tex" +static const ALIGN_ASSET(2) char gMsgKanji9767Tex[] = dgMsgKanji9767Tex; + +#define dgMsgKanji9768Tex "__OTR__textures/kanji/gMsgKanji9768Tex" +static const ALIGN_ASSET(2) char gMsgKanji9768Tex[] = dgMsgKanji9768Tex; + +#define dgMsgKanji9769Tex "__OTR__textures/kanji/gMsgKanji9769Tex" +static const ALIGN_ASSET(2) char gMsgKanji9769Tex[] = dgMsgKanji9769Tex; + +#define dgMsgKanji976ATex "__OTR__textures/kanji/gMsgKanji976ATex" +static const ALIGN_ASSET(2) char gMsgKanji976ATex[] = dgMsgKanji976ATex; + +#define dgMsgKanji976BTex "__OTR__textures/kanji/gMsgKanji976BTex" +static const ALIGN_ASSET(2) char gMsgKanji976BTex[] = dgMsgKanji976BTex; + +#define dgMsgKanji976CTex "__OTR__textures/kanji/gMsgKanji976CTex" +static const ALIGN_ASSET(2) char gMsgKanji976CTex[] = dgMsgKanji976CTex; + +#define dgMsgKanji976DTex "__OTR__textures/kanji/gMsgKanji976DTex" +static const ALIGN_ASSET(2) char gMsgKanji976DTex[] = dgMsgKanji976DTex; + +#define dgMsgKanji976ETex "__OTR__textures/kanji/gMsgKanji976ETex" +static const ALIGN_ASSET(2) char gMsgKanji976ETex[] = dgMsgKanji976ETex; + +#define dgMsgKanji976FTex "__OTR__textures/kanji/gMsgKanji976FTex" +static const ALIGN_ASSET(2) char gMsgKanji976FTex[] = dgMsgKanji976FTex; + +#define dgMsgKanji9770Tex "__OTR__textures/kanji/gMsgKanji9770Tex" +static const ALIGN_ASSET(2) char gMsgKanji9770Tex[] = dgMsgKanji9770Tex; + +#define dgMsgKanji9771Tex "__OTR__textures/kanji/gMsgKanji9771Tex" +static const ALIGN_ASSET(2) char gMsgKanji9771Tex[] = dgMsgKanji9771Tex; + +#define dgMsgKanji9772Tex "__OTR__textures/kanji/gMsgKanji9772Tex" +static const ALIGN_ASSET(2) char gMsgKanji9772Tex[] = dgMsgKanji9772Tex; + +#define dgMsgKanji9773Tex "__OTR__textures/kanji/gMsgKanji9773Tex" +static const ALIGN_ASSET(2) char gMsgKanji9773Tex[] = dgMsgKanji9773Tex; + +#define dgMsgKanji9774Tex "__OTR__textures/kanji/gMsgKanji9774Tex" +static const ALIGN_ASSET(2) char gMsgKanji9774Tex[] = dgMsgKanji9774Tex; + +#define dgMsgKanji9775Tex "__OTR__textures/kanji/gMsgKanji9775Tex" +static const ALIGN_ASSET(2) char gMsgKanji9775Tex[] = dgMsgKanji9775Tex; + +#define dgMsgKanji9776Tex "__OTR__textures/kanji/gMsgKanji9776Tex" +static const ALIGN_ASSET(2) char gMsgKanji9776Tex[] = dgMsgKanji9776Tex; + +#define dgMsgKanji9777Tex "__OTR__textures/kanji/gMsgKanji9777Tex" +static const ALIGN_ASSET(2) char gMsgKanji9777Tex[] = dgMsgKanji9777Tex; + +#define dgMsgKanji9778Tex "__OTR__textures/kanji/gMsgKanji9778Tex" +static const ALIGN_ASSET(2) char gMsgKanji9778Tex[] = dgMsgKanji9778Tex; + +#define dgMsgKanji9779Tex "__OTR__textures/kanji/gMsgKanji9779Tex" +static const ALIGN_ASSET(2) char gMsgKanji9779Tex[] = dgMsgKanji9779Tex; + +#define dgMsgKanji977ATex "__OTR__textures/kanji/gMsgKanji977ATex" +static const ALIGN_ASSET(2) char gMsgKanji977ATex[] = dgMsgKanji977ATex; + +#define dgMsgKanji977BTex "__OTR__textures/kanji/gMsgKanji977BTex" +static const ALIGN_ASSET(2) char gMsgKanji977BTex[] = dgMsgKanji977BTex; + +#define dgMsgKanji977CTex "__OTR__textures/kanji/gMsgKanji977CTex" +static const ALIGN_ASSET(2) char gMsgKanji977CTex[] = dgMsgKanji977CTex; + +#define dgMsgKanji977DTex "__OTR__textures/kanji/gMsgKanji977DTex" +static const ALIGN_ASSET(2) char gMsgKanji977DTex[] = dgMsgKanji977DTex; + +#define dgMsgKanji977ETex "__OTR__textures/kanji/gMsgKanji977ETex" +static const ALIGN_ASSET(2) char gMsgKanji977ETex[] = dgMsgKanji977ETex; + +#define dgMsgKanji9780Tex "__OTR__textures/kanji/gMsgKanji9780Tex" +static const ALIGN_ASSET(2) char gMsgKanji9780Tex[] = dgMsgKanji9780Tex; + +#define dgMsgKanji9781Tex "__OTR__textures/kanji/gMsgKanji9781Tex" +static const ALIGN_ASSET(2) char gMsgKanji9781Tex[] = dgMsgKanji9781Tex; + +#define dgMsgKanji9782Tex "__OTR__textures/kanji/gMsgKanji9782Tex" +static const ALIGN_ASSET(2) char gMsgKanji9782Tex[] = dgMsgKanji9782Tex; + +#define dgMsgKanji9783Tex "__OTR__textures/kanji/gMsgKanji9783Tex" +static const ALIGN_ASSET(2) char gMsgKanji9783Tex[] = dgMsgKanji9783Tex; + +#define dgMsgKanji9784Tex "__OTR__textures/kanji/gMsgKanji9784Tex" +static const ALIGN_ASSET(2) char gMsgKanji9784Tex[] = dgMsgKanji9784Tex; + +#define dgMsgKanji9785Tex "__OTR__textures/kanji/gMsgKanji9785Tex" +static const ALIGN_ASSET(2) char gMsgKanji9785Tex[] = dgMsgKanji9785Tex; + +#define dgMsgKanji9786Tex "__OTR__textures/kanji/gMsgKanji9786Tex" +static const ALIGN_ASSET(2) char gMsgKanji9786Tex[] = dgMsgKanji9786Tex; + +#define dgMsgKanji9787Tex "__OTR__textures/kanji/gMsgKanji9787Tex" +static const ALIGN_ASSET(2) char gMsgKanji9787Tex[] = dgMsgKanji9787Tex; + +#define dgMsgKanji9788Tex "__OTR__textures/kanji/gMsgKanji9788Tex" +static const ALIGN_ASSET(2) char gMsgKanji9788Tex[] = dgMsgKanji9788Tex; + +#define dgMsgKanji9789Tex "__OTR__textures/kanji/gMsgKanji9789Tex" +static const ALIGN_ASSET(2) char gMsgKanji9789Tex[] = dgMsgKanji9789Tex; + +#define dgMsgKanji978ATex "__OTR__textures/kanji/gMsgKanji978ATex" +static const ALIGN_ASSET(2) char gMsgKanji978ATex[] = dgMsgKanji978ATex; + +#define dgMsgKanji978BTex "__OTR__textures/kanji/gMsgKanji978BTex" +static const ALIGN_ASSET(2) char gMsgKanji978BTex[] = dgMsgKanji978BTex; + +#define dgMsgKanji978CTex "__OTR__textures/kanji/gMsgKanji978CTex" +static const ALIGN_ASSET(2) char gMsgKanji978CTex[] = dgMsgKanji978CTex; + +#define dgMsgKanji978DTex "__OTR__textures/kanji/gMsgKanji978DTex" +static const ALIGN_ASSET(2) char gMsgKanji978DTex[] = dgMsgKanji978DTex; + +#define dgMsgKanji978ETex "__OTR__textures/kanji/gMsgKanji978ETex" +static const ALIGN_ASSET(2) char gMsgKanji978ETex[] = dgMsgKanji978ETex; + +#define dgMsgKanji978FTex "__OTR__textures/kanji/gMsgKanji978FTex" +static const ALIGN_ASSET(2) char gMsgKanji978FTex[] = dgMsgKanji978FTex; + +#define dgMsgKanji9790Tex "__OTR__textures/kanji/gMsgKanji9790Tex" +static const ALIGN_ASSET(2) char gMsgKanji9790Tex[] = dgMsgKanji9790Tex; + +#define dgMsgKanji9791Tex "__OTR__textures/kanji/gMsgKanji9791Tex" +static const ALIGN_ASSET(2) char gMsgKanji9791Tex[] = dgMsgKanji9791Tex; + +#define dgMsgKanji9792Tex "__OTR__textures/kanji/gMsgKanji9792Tex" +static const ALIGN_ASSET(2) char gMsgKanji9792Tex[] = dgMsgKanji9792Tex; + +#define dgMsgKanji9793Tex "__OTR__textures/kanji/gMsgKanji9793Tex" +static const ALIGN_ASSET(2) char gMsgKanji9793Tex[] = dgMsgKanji9793Tex; + +#define dgMsgKanji9794Tex "__OTR__textures/kanji/gMsgKanji9794Tex" +static const ALIGN_ASSET(2) char gMsgKanji9794Tex[] = dgMsgKanji9794Tex; + +#define dgMsgKanji9795Tex "__OTR__textures/kanji/gMsgKanji9795Tex" +static const ALIGN_ASSET(2) char gMsgKanji9795Tex[] = dgMsgKanji9795Tex; + +#define dgMsgKanji9796Tex "__OTR__textures/kanji/gMsgKanji9796Tex" +static const ALIGN_ASSET(2) char gMsgKanji9796Tex[] = dgMsgKanji9796Tex; + +#define dgMsgKanji9797Tex "__OTR__textures/kanji/gMsgKanji9797Tex" +static const ALIGN_ASSET(2) char gMsgKanji9797Tex[] = dgMsgKanji9797Tex; + +#define dgMsgKanji9798Tex "__OTR__textures/kanji/gMsgKanji9798Tex" +static const ALIGN_ASSET(2) char gMsgKanji9798Tex[] = dgMsgKanji9798Tex; + +#define dgMsgKanji9799Tex "__OTR__textures/kanji/gMsgKanji9799Tex" +static const ALIGN_ASSET(2) char gMsgKanji9799Tex[] = dgMsgKanji9799Tex; + +#define dgMsgKanji979ATex "__OTR__textures/kanji/gMsgKanji979ATex" +static const ALIGN_ASSET(2) char gMsgKanji979ATex[] = dgMsgKanji979ATex; + +#define dgMsgKanji979BTex "__OTR__textures/kanji/gMsgKanji979BTex" +static const ALIGN_ASSET(2) char gMsgKanji979BTex[] = dgMsgKanji979BTex; + +#define dgMsgKanji979CTex "__OTR__textures/kanji/gMsgKanji979CTex" +static const ALIGN_ASSET(2) char gMsgKanji979CTex[] = dgMsgKanji979CTex; + +#define dgMsgKanji979DTex "__OTR__textures/kanji/gMsgKanji979DTex" +static const ALIGN_ASSET(2) char gMsgKanji979DTex[] = dgMsgKanji979DTex; + +#define dgMsgKanji979ETex "__OTR__textures/kanji/gMsgKanji979ETex" +static const ALIGN_ASSET(2) char gMsgKanji979ETex[] = dgMsgKanji979ETex; + +#define dgMsgKanji979FTex "__OTR__textures/kanji/gMsgKanji979FTex" +static const ALIGN_ASSET(2) char gMsgKanji979FTex[] = dgMsgKanji979FTex; + +#define dgMsgKanji97A0Tex "__OTR__textures/kanji/gMsgKanji97A0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A0Tex[] = dgMsgKanji97A0Tex; + +#define dgMsgKanji97A1Tex "__OTR__textures/kanji/gMsgKanji97A1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A1Tex[] = dgMsgKanji97A1Tex; + +#define dgMsgKanji97A2Tex "__OTR__textures/kanji/gMsgKanji97A2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A2Tex[] = dgMsgKanji97A2Tex; + +#define dgMsgKanji97A3Tex "__OTR__textures/kanji/gMsgKanji97A3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A3Tex[] = dgMsgKanji97A3Tex; + +#define dgMsgKanji97A4Tex "__OTR__textures/kanji/gMsgKanji97A4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A4Tex[] = dgMsgKanji97A4Tex; + +#define dgMsgKanji97A5Tex "__OTR__textures/kanji/gMsgKanji97A5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A5Tex[] = dgMsgKanji97A5Tex; + +#define dgMsgKanji97A6Tex "__OTR__textures/kanji/gMsgKanji97A6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A6Tex[] = dgMsgKanji97A6Tex; + +#define dgMsgKanji97A7Tex "__OTR__textures/kanji/gMsgKanji97A7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A7Tex[] = dgMsgKanji97A7Tex; + +#define dgMsgKanji97A8Tex "__OTR__textures/kanji/gMsgKanji97A8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A8Tex[] = dgMsgKanji97A8Tex; + +#define dgMsgKanji97A9Tex "__OTR__textures/kanji/gMsgKanji97A9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97A9Tex[] = dgMsgKanji97A9Tex; + +#define dgMsgKanji97AATex "__OTR__textures/kanji/gMsgKanji97AATex" +static const ALIGN_ASSET(2) char gMsgKanji97AATex[] = dgMsgKanji97AATex; + +#define dgMsgKanji97ABTex "__OTR__textures/kanji/gMsgKanji97ABTex" +static const ALIGN_ASSET(2) char gMsgKanji97ABTex[] = dgMsgKanji97ABTex; + +#define dgMsgKanji97ACTex "__OTR__textures/kanji/gMsgKanji97ACTex" +static const ALIGN_ASSET(2) char gMsgKanji97ACTex[] = dgMsgKanji97ACTex; + +#define dgMsgKanji97ADTex "__OTR__textures/kanji/gMsgKanji97ADTex" +static const ALIGN_ASSET(2) char gMsgKanji97ADTex[] = dgMsgKanji97ADTex; + +#define dgMsgKanji97AETex "__OTR__textures/kanji/gMsgKanji97AETex" +static const ALIGN_ASSET(2) char gMsgKanji97AETex[] = dgMsgKanji97AETex; + +#define dgMsgKanji97AFTex "__OTR__textures/kanji/gMsgKanji97AFTex" +static const ALIGN_ASSET(2) char gMsgKanji97AFTex[] = dgMsgKanji97AFTex; + +#define dgMsgKanji97B0Tex "__OTR__textures/kanji/gMsgKanji97B0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B0Tex[] = dgMsgKanji97B0Tex; + +#define dgMsgKanji97B1Tex "__OTR__textures/kanji/gMsgKanji97B1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B1Tex[] = dgMsgKanji97B1Tex; + +#define dgMsgKanji97B2Tex "__OTR__textures/kanji/gMsgKanji97B2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B2Tex[] = dgMsgKanji97B2Tex; + +#define dgMsgKanji97B3Tex "__OTR__textures/kanji/gMsgKanji97B3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B3Tex[] = dgMsgKanji97B3Tex; + +#define dgMsgKanji97B4Tex "__OTR__textures/kanji/gMsgKanji97B4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B4Tex[] = dgMsgKanji97B4Tex; + +#define dgMsgKanji97B5Tex "__OTR__textures/kanji/gMsgKanji97B5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B5Tex[] = dgMsgKanji97B5Tex; + +#define dgMsgKanji97B6Tex "__OTR__textures/kanji/gMsgKanji97B6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B6Tex[] = dgMsgKanji97B6Tex; + +#define dgMsgKanji97B7Tex "__OTR__textures/kanji/gMsgKanji97B7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B7Tex[] = dgMsgKanji97B7Tex; + +#define dgMsgKanji97B8Tex "__OTR__textures/kanji/gMsgKanji97B8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B8Tex[] = dgMsgKanji97B8Tex; + +#define dgMsgKanji97B9Tex "__OTR__textures/kanji/gMsgKanji97B9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97B9Tex[] = dgMsgKanji97B9Tex; + +#define dgMsgKanji97BATex "__OTR__textures/kanji/gMsgKanji97BATex" +static const ALIGN_ASSET(2) char gMsgKanji97BATex[] = dgMsgKanji97BATex; + +#define dgMsgKanji97BBTex "__OTR__textures/kanji/gMsgKanji97BBTex" +static const ALIGN_ASSET(2) char gMsgKanji97BBTex[] = dgMsgKanji97BBTex; + +#define dgMsgKanji97BCTex "__OTR__textures/kanji/gMsgKanji97BCTex" +static const ALIGN_ASSET(2) char gMsgKanji97BCTex[] = dgMsgKanji97BCTex; + +#define dgMsgKanji97BDTex "__OTR__textures/kanji/gMsgKanji97BDTex" +static const ALIGN_ASSET(2) char gMsgKanji97BDTex[] = dgMsgKanji97BDTex; + +#define dgMsgKanji97BETex "__OTR__textures/kanji/gMsgKanji97BETex" +static const ALIGN_ASSET(2) char gMsgKanji97BETex[] = dgMsgKanji97BETex; + +#define dgMsgKanji97BFTex "__OTR__textures/kanji/gMsgKanji97BFTex" +static const ALIGN_ASSET(2) char gMsgKanji97BFTex[] = dgMsgKanji97BFTex; + +#define dgMsgKanji97C0Tex "__OTR__textures/kanji/gMsgKanji97C0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C0Tex[] = dgMsgKanji97C0Tex; + +#define dgMsgKanji97C1Tex "__OTR__textures/kanji/gMsgKanji97C1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C1Tex[] = dgMsgKanji97C1Tex; + +#define dgMsgKanji97C2Tex "__OTR__textures/kanji/gMsgKanji97C2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C2Tex[] = dgMsgKanji97C2Tex; + +#define dgMsgKanji97C3Tex "__OTR__textures/kanji/gMsgKanji97C3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C3Tex[] = dgMsgKanji97C3Tex; + +#define dgMsgKanji97C4Tex "__OTR__textures/kanji/gMsgKanji97C4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C4Tex[] = dgMsgKanji97C4Tex; + +#define dgMsgKanji97C5Tex "__OTR__textures/kanji/gMsgKanji97C5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C5Tex[] = dgMsgKanji97C5Tex; + +#define dgMsgKanji97C6Tex "__OTR__textures/kanji/gMsgKanji97C6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C6Tex[] = dgMsgKanji97C6Tex; + +#define dgMsgKanji97C7Tex "__OTR__textures/kanji/gMsgKanji97C7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C7Tex[] = dgMsgKanji97C7Tex; + +#define dgMsgKanji97C8Tex "__OTR__textures/kanji/gMsgKanji97C8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C8Tex[] = dgMsgKanji97C8Tex; + +#define dgMsgKanji97C9Tex "__OTR__textures/kanji/gMsgKanji97C9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97C9Tex[] = dgMsgKanji97C9Tex; + +#define dgMsgKanji97CATex "__OTR__textures/kanji/gMsgKanji97CATex" +static const ALIGN_ASSET(2) char gMsgKanji97CATex[] = dgMsgKanji97CATex; + +#define dgMsgKanji97CBTex "__OTR__textures/kanji/gMsgKanji97CBTex" +static const ALIGN_ASSET(2) char gMsgKanji97CBTex[] = dgMsgKanji97CBTex; + +#define dgMsgKanji97CCTex "__OTR__textures/kanji/gMsgKanji97CCTex" +static const ALIGN_ASSET(2) char gMsgKanji97CCTex[] = dgMsgKanji97CCTex; + +#define dgMsgKanji97CDTex "__OTR__textures/kanji/gMsgKanji97CDTex" +static const ALIGN_ASSET(2) char gMsgKanji97CDTex[] = dgMsgKanji97CDTex; + +#define dgMsgKanji97CETex "__OTR__textures/kanji/gMsgKanji97CETex" +static const ALIGN_ASSET(2) char gMsgKanji97CETex[] = dgMsgKanji97CETex; + +#define dgMsgKanji97CFTex "__OTR__textures/kanji/gMsgKanji97CFTex" +static const ALIGN_ASSET(2) char gMsgKanji97CFTex[] = dgMsgKanji97CFTex; + +#define dgMsgKanji97D0Tex "__OTR__textures/kanji/gMsgKanji97D0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D0Tex[] = dgMsgKanji97D0Tex; + +#define dgMsgKanji97D1Tex "__OTR__textures/kanji/gMsgKanji97D1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D1Tex[] = dgMsgKanji97D1Tex; + +#define dgMsgKanji97D2Tex "__OTR__textures/kanji/gMsgKanji97D2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D2Tex[] = dgMsgKanji97D2Tex; + +#define dgMsgKanji97D3Tex "__OTR__textures/kanji/gMsgKanji97D3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D3Tex[] = dgMsgKanji97D3Tex; + +#define dgMsgKanji97D4Tex "__OTR__textures/kanji/gMsgKanji97D4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D4Tex[] = dgMsgKanji97D4Tex; + +#define dgMsgKanji97D5Tex "__OTR__textures/kanji/gMsgKanji97D5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D5Tex[] = dgMsgKanji97D5Tex; + +#define dgMsgKanji97D6Tex "__OTR__textures/kanji/gMsgKanji97D6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D6Tex[] = dgMsgKanji97D6Tex; + +#define dgMsgKanji97D7Tex "__OTR__textures/kanji/gMsgKanji97D7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D7Tex[] = dgMsgKanji97D7Tex; + +#define dgMsgKanji97D8Tex "__OTR__textures/kanji/gMsgKanji97D8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D8Tex[] = dgMsgKanji97D8Tex; + +#define dgMsgKanji97D9Tex "__OTR__textures/kanji/gMsgKanji97D9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97D9Tex[] = dgMsgKanji97D9Tex; + +#define dgMsgKanji97DATex "__OTR__textures/kanji/gMsgKanji97DATex" +static const ALIGN_ASSET(2) char gMsgKanji97DATex[] = dgMsgKanji97DATex; + +#define dgMsgKanji97DBTex "__OTR__textures/kanji/gMsgKanji97DBTex" +static const ALIGN_ASSET(2) char gMsgKanji97DBTex[] = dgMsgKanji97DBTex; + +#define dgMsgKanji97DCTex "__OTR__textures/kanji/gMsgKanji97DCTex" +static const ALIGN_ASSET(2) char gMsgKanji97DCTex[] = dgMsgKanji97DCTex; + +#define dgMsgKanji97DDTex "__OTR__textures/kanji/gMsgKanji97DDTex" +static const ALIGN_ASSET(2) char gMsgKanji97DDTex[] = dgMsgKanji97DDTex; + +#define dgMsgKanji97DETex "__OTR__textures/kanji/gMsgKanji97DETex" +static const ALIGN_ASSET(2) char gMsgKanji97DETex[] = dgMsgKanji97DETex; + +#define dgMsgKanji97DFTex "__OTR__textures/kanji/gMsgKanji97DFTex" +static const ALIGN_ASSET(2) char gMsgKanji97DFTex[] = dgMsgKanji97DFTex; + +#define dgMsgKanji97E0Tex "__OTR__textures/kanji/gMsgKanji97E0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E0Tex[] = dgMsgKanji97E0Tex; + +#define dgMsgKanji97E1Tex "__OTR__textures/kanji/gMsgKanji97E1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E1Tex[] = dgMsgKanji97E1Tex; + +#define dgMsgKanji97E2Tex "__OTR__textures/kanji/gMsgKanji97E2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E2Tex[] = dgMsgKanji97E2Tex; + +#define dgMsgKanji97E3Tex "__OTR__textures/kanji/gMsgKanji97E3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E3Tex[] = dgMsgKanji97E3Tex; + +#define dgMsgKanji97E4Tex "__OTR__textures/kanji/gMsgKanji97E4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E4Tex[] = dgMsgKanji97E4Tex; + +#define dgMsgKanji97E5Tex "__OTR__textures/kanji/gMsgKanji97E5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E5Tex[] = dgMsgKanji97E5Tex; + +#define dgMsgKanji97E6Tex "__OTR__textures/kanji/gMsgKanji97E6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E6Tex[] = dgMsgKanji97E6Tex; + +#define dgMsgKanji97E7Tex "__OTR__textures/kanji/gMsgKanji97E7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E7Tex[] = dgMsgKanji97E7Tex; + +#define dgMsgKanji97E8Tex "__OTR__textures/kanji/gMsgKanji97E8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E8Tex[] = dgMsgKanji97E8Tex; + +#define dgMsgKanji97E9Tex "__OTR__textures/kanji/gMsgKanji97E9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97E9Tex[] = dgMsgKanji97E9Tex; + +#define dgMsgKanji97EATex "__OTR__textures/kanji/gMsgKanji97EATex" +static const ALIGN_ASSET(2) char gMsgKanji97EATex[] = dgMsgKanji97EATex; + +#define dgMsgKanji97EBTex "__OTR__textures/kanji/gMsgKanji97EBTex" +static const ALIGN_ASSET(2) char gMsgKanji97EBTex[] = dgMsgKanji97EBTex; + +#define dgMsgKanji97ECTex "__OTR__textures/kanji/gMsgKanji97ECTex" +static const ALIGN_ASSET(2) char gMsgKanji97ECTex[] = dgMsgKanji97ECTex; + +#define dgMsgKanji97EDTex "__OTR__textures/kanji/gMsgKanji97EDTex" +static const ALIGN_ASSET(2) char gMsgKanji97EDTex[] = dgMsgKanji97EDTex; + +#define dgMsgKanji97EETex "__OTR__textures/kanji/gMsgKanji97EETex" +static const ALIGN_ASSET(2) char gMsgKanji97EETex[] = dgMsgKanji97EETex; + +#define dgMsgKanji97EFTex "__OTR__textures/kanji/gMsgKanji97EFTex" +static const ALIGN_ASSET(2) char gMsgKanji97EFTex[] = dgMsgKanji97EFTex; + +#define dgMsgKanji97F0Tex "__OTR__textures/kanji/gMsgKanji97F0Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F0Tex[] = dgMsgKanji97F0Tex; + +#define dgMsgKanji97F1Tex "__OTR__textures/kanji/gMsgKanji97F1Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F1Tex[] = dgMsgKanji97F1Tex; + +#define dgMsgKanji97F2Tex "__OTR__textures/kanji/gMsgKanji97F2Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F2Tex[] = dgMsgKanji97F2Tex; + +#define dgMsgKanji97F3Tex "__OTR__textures/kanji/gMsgKanji97F3Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F3Tex[] = dgMsgKanji97F3Tex; + +#define dgMsgKanji97F4Tex "__OTR__textures/kanji/gMsgKanji97F4Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F4Tex[] = dgMsgKanji97F4Tex; + +#define dgMsgKanji97F5Tex "__OTR__textures/kanji/gMsgKanji97F5Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F5Tex[] = dgMsgKanji97F5Tex; + +#define dgMsgKanji97F6Tex "__OTR__textures/kanji/gMsgKanji97F6Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F6Tex[] = dgMsgKanji97F6Tex; + +#define dgMsgKanji97F7Tex "__OTR__textures/kanji/gMsgKanji97F7Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F7Tex[] = dgMsgKanji97F7Tex; + +#define dgMsgKanji97F8Tex "__OTR__textures/kanji/gMsgKanji97F8Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F8Tex[] = dgMsgKanji97F8Tex; + +#define dgMsgKanji97F9Tex "__OTR__textures/kanji/gMsgKanji97F9Tex" +static const ALIGN_ASSET(2) char gMsgKanji97F9Tex[] = dgMsgKanji97F9Tex; + +#define dgMsgKanji97FATex "__OTR__textures/kanji/gMsgKanji97FATex" +static const ALIGN_ASSET(2) char gMsgKanji97FATex[] = dgMsgKanji97FATex; + +#define dgMsgKanji97FBTex "__OTR__textures/kanji/gMsgKanji97FBTex" +static const ALIGN_ASSET(2) char gMsgKanji97FBTex[] = dgMsgKanji97FBTex; + +#define dgMsgKanji97FCTex "__OTR__textures/kanji/gMsgKanji97FCTex" +static const ALIGN_ASSET(2) char gMsgKanji97FCTex[] = dgMsgKanji97FCTex; + +#define dgMsgKanji9840Tex "__OTR__textures/kanji/gMsgKanji9840Tex" +static const ALIGN_ASSET(2) char gMsgKanji9840Tex[] = dgMsgKanji9840Tex; + +#define dgMsgKanji9841Tex "__OTR__textures/kanji/gMsgKanji9841Tex" +static const ALIGN_ASSET(2) char gMsgKanji9841Tex[] = dgMsgKanji9841Tex; + +#define dgMsgKanji9842Tex "__OTR__textures/kanji/gMsgKanji9842Tex" +static const ALIGN_ASSET(2) char gMsgKanji9842Tex[] = dgMsgKanji9842Tex; + +#define dgMsgKanji9843Tex "__OTR__textures/kanji/gMsgKanji9843Tex" +static const ALIGN_ASSET(2) char gMsgKanji9843Tex[] = dgMsgKanji9843Tex; + +#define dgMsgKanji9844Tex "__OTR__textures/kanji/gMsgKanji9844Tex" +static const ALIGN_ASSET(2) char gMsgKanji9844Tex[] = dgMsgKanji9844Tex; + +#define dgMsgKanji9845Tex "__OTR__textures/kanji/gMsgKanji9845Tex" +static const ALIGN_ASSET(2) char gMsgKanji9845Tex[] = dgMsgKanji9845Tex; + +#define dgMsgKanji9846Tex "__OTR__textures/kanji/gMsgKanji9846Tex" +static const ALIGN_ASSET(2) char gMsgKanji9846Tex[] = dgMsgKanji9846Tex; + +#define dgMsgKanji9847Tex "__OTR__textures/kanji/gMsgKanji9847Tex" +static const ALIGN_ASSET(2) char gMsgKanji9847Tex[] = dgMsgKanji9847Tex; + +#define dgMsgKanji9848Tex "__OTR__textures/kanji/gMsgKanji9848Tex" +static const ALIGN_ASSET(2) char gMsgKanji9848Tex[] = dgMsgKanji9848Tex; + +#define dgMsgKanji9849Tex "__OTR__textures/kanji/gMsgKanji9849Tex" +static const ALIGN_ASSET(2) char gMsgKanji9849Tex[] = dgMsgKanji9849Tex; + +#define dgMsgKanji984ATex "__OTR__textures/kanji/gMsgKanji984ATex" +static const ALIGN_ASSET(2) char gMsgKanji984ATex[] = dgMsgKanji984ATex; + +#define dgMsgKanji984BTex "__OTR__textures/kanji/gMsgKanji984BTex" +static const ALIGN_ASSET(2) char gMsgKanji984BTex[] = dgMsgKanji984BTex; + +#define dgMsgKanji984CTex "__OTR__textures/kanji/gMsgKanji984CTex" +static const ALIGN_ASSET(2) char gMsgKanji984CTex[] = dgMsgKanji984CTex; + +#define dgMsgKanji984DTex "__OTR__textures/kanji/gMsgKanji984DTex" +static const ALIGN_ASSET(2) char gMsgKanji984DTex[] = dgMsgKanji984DTex; + +#define dgMsgKanji984ETex "__OTR__textures/kanji/gMsgKanji984ETex" +static const ALIGN_ASSET(2) char gMsgKanji984ETex[] = dgMsgKanji984ETex; + +#define dgMsgKanji984FTex "__OTR__textures/kanji/gMsgKanji984FTex" +static const ALIGN_ASSET(2) char gMsgKanji984FTex[] = dgMsgKanji984FTex; + +#define dgMsgKanji9850Tex "__OTR__textures/kanji/gMsgKanji9850Tex" +static const ALIGN_ASSET(2) char gMsgKanji9850Tex[] = dgMsgKanji9850Tex; + +#define dgMsgKanji9851Tex "__OTR__textures/kanji/gMsgKanji9851Tex" +static const ALIGN_ASSET(2) char gMsgKanji9851Tex[] = dgMsgKanji9851Tex; + +#define dgMsgKanji9852Tex "__OTR__textures/kanji/gMsgKanji9852Tex" +static const ALIGN_ASSET(2) char gMsgKanji9852Tex[] = dgMsgKanji9852Tex; + +#define dgMsgKanji9853Tex "__OTR__textures/kanji/gMsgKanji9853Tex" +static const ALIGN_ASSET(2) char gMsgKanji9853Tex[] = dgMsgKanji9853Tex; + +#define dgMsgKanji9854Tex "__OTR__textures/kanji/gMsgKanji9854Tex" +static const ALIGN_ASSET(2) char gMsgKanji9854Tex[] = dgMsgKanji9854Tex; + +#define dgMsgKanji9855Tex "__OTR__textures/kanji/gMsgKanji9855Tex" +static const ALIGN_ASSET(2) char gMsgKanji9855Tex[] = dgMsgKanji9855Tex; + +#define dgMsgKanji9856Tex "__OTR__textures/kanji/gMsgKanji9856Tex" +static const ALIGN_ASSET(2) char gMsgKanji9856Tex[] = dgMsgKanji9856Tex; + +#define dgMsgKanji9857Tex "__OTR__textures/kanji/gMsgKanji9857Tex" +static const ALIGN_ASSET(2) char gMsgKanji9857Tex[] = dgMsgKanji9857Tex; + +#define dgMsgKanji9858Tex "__OTR__textures/kanji/gMsgKanji9858Tex" +static const ALIGN_ASSET(2) char gMsgKanji9858Tex[] = dgMsgKanji9858Tex; + +#define dgMsgKanji9859Tex "__OTR__textures/kanji/gMsgKanji9859Tex" +static const ALIGN_ASSET(2) char gMsgKanji9859Tex[] = dgMsgKanji9859Tex; + +#define dgMsgKanji985ATex "__OTR__textures/kanji/gMsgKanji985ATex" +static const ALIGN_ASSET(2) char gMsgKanji985ATex[] = dgMsgKanji985ATex; + +#define dgMsgKanji985BTex "__OTR__textures/kanji/gMsgKanji985BTex" +static const ALIGN_ASSET(2) char gMsgKanji985BTex[] = dgMsgKanji985BTex; + +#define dgMsgKanji985CTex "__OTR__textures/kanji/gMsgKanji985CTex" +static const ALIGN_ASSET(2) char gMsgKanji985CTex[] = dgMsgKanji985CTex; + +#define dgMsgKanji985DTex "__OTR__textures/kanji/gMsgKanji985DTex" +static const ALIGN_ASSET(2) char gMsgKanji985DTex[] = dgMsgKanji985DTex; + +#define dgMsgKanji985ETex "__OTR__textures/kanji/gMsgKanji985ETex" +static const ALIGN_ASSET(2) char gMsgKanji985ETex[] = dgMsgKanji985ETex; + +#define dgMsgKanji985FTex "__OTR__textures/kanji/gMsgKanji985FTex" +static const ALIGN_ASSET(2) char gMsgKanji985FTex[] = dgMsgKanji985FTex; + +#define dgMsgKanji9860Tex "__OTR__textures/kanji/gMsgKanji9860Tex" +static const ALIGN_ASSET(2) char gMsgKanji9860Tex[] = dgMsgKanji9860Tex; + +#define dgMsgKanji9861Tex "__OTR__textures/kanji/gMsgKanji9861Tex" +static const ALIGN_ASSET(2) char gMsgKanji9861Tex[] = dgMsgKanji9861Tex; + +#define dgMsgKanji9862Tex "__OTR__textures/kanji/gMsgKanji9862Tex" +static const ALIGN_ASSET(2) char gMsgKanji9862Tex[] = dgMsgKanji9862Tex; + +#define dgMsgKanji9863Tex "__OTR__textures/kanji/gMsgKanji9863Tex" +static const ALIGN_ASSET(2) char gMsgKanji9863Tex[] = dgMsgKanji9863Tex; + +#define dgMsgKanji9864Tex "__OTR__textures/kanji/gMsgKanji9864Tex" +static const ALIGN_ASSET(2) char gMsgKanji9864Tex[] = dgMsgKanji9864Tex; + +#define dgMsgKanji9865Tex "__OTR__textures/kanji/gMsgKanji9865Tex" +static const ALIGN_ASSET(2) char gMsgKanji9865Tex[] = dgMsgKanji9865Tex; + +#define dgMsgKanji9866Tex "__OTR__textures/kanji/gMsgKanji9866Tex" +static const ALIGN_ASSET(2) char gMsgKanji9866Tex[] = dgMsgKanji9866Tex; + +#define dgMsgKanji9867Tex "__OTR__textures/kanji/gMsgKanji9867Tex" +static const ALIGN_ASSET(2) char gMsgKanji9867Tex[] = dgMsgKanji9867Tex; + +#define dgMsgKanji9868Tex "__OTR__textures/kanji/gMsgKanji9868Tex" +static const ALIGN_ASSET(2) char gMsgKanji9868Tex[] = dgMsgKanji9868Tex; + +#define dgMsgKanji9869Tex "__OTR__textures/kanji/gMsgKanji9869Tex" +static const ALIGN_ASSET(2) char gMsgKanji9869Tex[] = dgMsgKanji9869Tex; + +#define dgMsgKanji986ATex "__OTR__textures/kanji/gMsgKanji986ATex" +static const ALIGN_ASSET(2) char gMsgKanji986ATex[] = dgMsgKanji986ATex; + +#define dgMsgKanji986BTex "__OTR__textures/kanji/gMsgKanji986BTex" +static const ALIGN_ASSET(2) char gMsgKanji986BTex[] = dgMsgKanji986BTex; + +#define dgMsgKanji986CTex "__OTR__textures/kanji/gMsgKanji986CTex" +static const ALIGN_ASSET(2) char gMsgKanji986CTex[] = dgMsgKanji986CTex; + +#define dgMsgKanji986DTex "__OTR__textures/kanji/gMsgKanji986DTex" +static const ALIGN_ASSET(2) char gMsgKanji986DTex[] = dgMsgKanji986DTex; + +#define dgMsgKanji986ETex "__OTR__textures/kanji/gMsgKanji986ETex" +static const ALIGN_ASSET(2) char gMsgKanji986ETex[] = dgMsgKanji986ETex; + +#define dgMsgKanji986FTex "__OTR__textures/kanji/gMsgKanji986FTex" +static const ALIGN_ASSET(2) char gMsgKanji986FTex[] = dgMsgKanji986FTex; + +#define dgMsgKanji9870Tex "__OTR__textures/kanji/gMsgKanji9870Tex" +static const ALIGN_ASSET(2) char gMsgKanji9870Tex[] = dgMsgKanji9870Tex; + +#define dgMsgKanji9871Tex "__OTR__textures/kanji/gMsgKanji9871Tex" +static const ALIGN_ASSET(2) char gMsgKanji9871Tex[] = dgMsgKanji9871Tex; + +#define dgMsgKanji9872Tex "__OTR__textures/kanji/gMsgKanji9872Tex" +static const ALIGN_ASSET(2) char gMsgKanji9872Tex[] = dgMsgKanji9872Tex; + +#define dgMsgKanji9873EmptyTex "__OTR__textures/kanji/gMsgKanji9873EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9873EmptyTex[] = dgMsgKanji9873EmptyTex; + +#define dgMsgKanji9874EmptyTex "__OTR__textures/kanji/gMsgKanji9874EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9874EmptyTex[] = dgMsgKanji9874EmptyTex; + +#define dgMsgKanji9875EmptyTex "__OTR__textures/kanji/gMsgKanji9875EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9875EmptyTex[] = dgMsgKanji9875EmptyTex; + +#define dgMsgKanji9876EmptyTex "__OTR__textures/kanji/gMsgKanji9876EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9876EmptyTex[] = dgMsgKanji9876EmptyTex; + +#define dgMsgKanji9877EmptyTex "__OTR__textures/kanji/gMsgKanji9877EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9877EmptyTex[] = dgMsgKanji9877EmptyTex; + +#define dgMsgKanji9878EmptyTex "__OTR__textures/kanji/gMsgKanji9878EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9878EmptyTex[] = dgMsgKanji9878EmptyTex; + +#define dgMsgKanji9879EmptyTex "__OTR__textures/kanji/gMsgKanji9879EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9879EmptyTex[] = dgMsgKanji9879EmptyTex; + +#define dgMsgKanji987AEmptyTex "__OTR__textures/kanji/gMsgKanji987AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987AEmptyTex[] = dgMsgKanji987AEmptyTex; + +#define dgMsgKanji987BEmptyTex "__OTR__textures/kanji/gMsgKanji987BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987BEmptyTex[] = dgMsgKanji987BEmptyTex; + +#define dgMsgKanji987CEmptyTex "__OTR__textures/kanji/gMsgKanji987CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987CEmptyTex[] = dgMsgKanji987CEmptyTex; + +#define dgMsgKanji987DEmptyTex "__OTR__textures/kanji/gMsgKanji987DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987DEmptyTex[] = dgMsgKanji987DEmptyTex; + +#define dgMsgKanji987EEmptyTex "__OTR__textures/kanji/gMsgKanji987EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji987EEmptyTex[] = dgMsgKanji987EEmptyTex; + +#define dgMsgKanji9880EmptyTex "__OTR__textures/kanji/gMsgKanji9880EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9880EmptyTex[] = dgMsgKanji9880EmptyTex; + +#define dgMsgKanji9881EmptyTex "__OTR__textures/kanji/gMsgKanji9881EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9881EmptyTex[] = dgMsgKanji9881EmptyTex; + +#define dgMsgKanji9882EmptyTex "__OTR__textures/kanji/gMsgKanji9882EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9882EmptyTex[] = dgMsgKanji9882EmptyTex; + +#define dgMsgKanji9883EmptyTex "__OTR__textures/kanji/gMsgKanji9883EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9883EmptyTex[] = dgMsgKanji9883EmptyTex; + +#define dgMsgKanji9884EmptyTex "__OTR__textures/kanji/gMsgKanji9884EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9884EmptyTex[] = dgMsgKanji9884EmptyTex; + +#define dgMsgKanji9885EmptyTex "__OTR__textures/kanji/gMsgKanji9885EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9885EmptyTex[] = dgMsgKanji9885EmptyTex; + +#define dgMsgKanji9886EmptyTex "__OTR__textures/kanji/gMsgKanji9886EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9886EmptyTex[] = dgMsgKanji9886EmptyTex; + +#define dgMsgKanji9887EmptyTex "__OTR__textures/kanji/gMsgKanji9887EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9887EmptyTex[] = dgMsgKanji9887EmptyTex; + +#define dgMsgKanji9888EmptyTex "__OTR__textures/kanji/gMsgKanji9888EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9888EmptyTex[] = dgMsgKanji9888EmptyTex; + +#define dgMsgKanji9889EmptyTex "__OTR__textures/kanji/gMsgKanji9889EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9889EmptyTex[] = dgMsgKanji9889EmptyTex; + +#define dgMsgKanji988AEmptyTex "__OTR__textures/kanji/gMsgKanji988AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988AEmptyTex[] = dgMsgKanji988AEmptyTex; + +#define dgMsgKanji988BEmptyTex "__OTR__textures/kanji/gMsgKanji988BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988BEmptyTex[] = dgMsgKanji988BEmptyTex; + +#define dgMsgKanji988CEmptyTex "__OTR__textures/kanji/gMsgKanji988CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988CEmptyTex[] = dgMsgKanji988CEmptyTex; + +#define dgMsgKanji988DEmptyTex "__OTR__textures/kanji/gMsgKanji988DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988DEmptyTex[] = dgMsgKanji988DEmptyTex; + +#define dgMsgKanji988EEmptyTex "__OTR__textures/kanji/gMsgKanji988EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988EEmptyTex[] = dgMsgKanji988EEmptyTex; + +#define dgMsgKanji988FEmptyTex "__OTR__textures/kanji/gMsgKanji988FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji988FEmptyTex[] = dgMsgKanji988FEmptyTex; + +#define dgMsgKanji9890EmptyTex "__OTR__textures/kanji/gMsgKanji9890EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9890EmptyTex[] = dgMsgKanji9890EmptyTex; + +#define dgMsgKanji9891EmptyTex "__OTR__textures/kanji/gMsgKanji9891EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9891EmptyTex[] = dgMsgKanji9891EmptyTex; + +#define dgMsgKanji9892EmptyTex "__OTR__textures/kanji/gMsgKanji9892EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9892EmptyTex[] = dgMsgKanji9892EmptyTex; + +#define dgMsgKanji9893EmptyTex "__OTR__textures/kanji/gMsgKanji9893EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9893EmptyTex[] = dgMsgKanji9893EmptyTex; + +#define dgMsgKanji9894EmptyTex "__OTR__textures/kanji/gMsgKanji9894EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9894EmptyTex[] = dgMsgKanji9894EmptyTex; + +#define dgMsgKanji9895EmptyTex "__OTR__textures/kanji/gMsgKanji9895EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9895EmptyTex[] = dgMsgKanji9895EmptyTex; + +#define dgMsgKanji9896EmptyTex "__OTR__textures/kanji/gMsgKanji9896EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9896EmptyTex[] = dgMsgKanji9896EmptyTex; + +#define dgMsgKanji9897EmptyTex "__OTR__textures/kanji/gMsgKanji9897EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9897EmptyTex[] = dgMsgKanji9897EmptyTex; + +#define dgMsgKanji9898EmptyTex "__OTR__textures/kanji/gMsgKanji9898EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9898EmptyTex[] = dgMsgKanji9898EmptyTex; + +#define dgMsgKanji9899EmptyTex "__OTR__textures/kanji/gMsgKanji9899EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji9899EmptyTex[] = dgMsgKanji9899EmptyTex; + +#define dgMsgKanji989AEmptyTex "__OTR__textures/kanji/gMsgKanji989AEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989AEmptyTex[] = dgMsgKanji989AEmptyTex; + +#define dgMsgKanji989BEmptyTex "__OTR__textures/kanji/gMsgKanji989BEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989BEmptyTex[] = dgMsgKanji989BEmptyTex; + +#define dgMsgKanji989CEmptyTex "__OTR__textures/kanji/gMsgKanji989CEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989CEmptyTex[] = dgMsgKanji989CEmptyTex; + +#define dgMsgKanji989DEmptyTex "__OTR__textures/kanji/gMsgKanji989DEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989DEmptyTex[] = dgMsgKanji989DEmptyTex; + +#define dgMsgKanji989EEmptyTex "__OTR__textures/kanji/gMsgKanji989EEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989EEmptyTex[] = dgMsgKanji989EEmptyTex; + +#define dgMsgKanji989FEmptyTex "__OTR__textures/kanji/gMsgKanji989FEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji989FEmptyTex[] = dgMsgKanji989FEmptyTex; + +#define dgMsgKanji98A0EmptyTex "__OTR__textures/kanji/gMsgKanji98A0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A0EmptyTex[] = dgMsgKanji98A0EmptyTex; + +#define dgMsgKanji98A1EmptyTex "__OTR__textures/kanji/gMsgKanji98A1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A1EmptyTex[] = dgMsgKanji98A1EmptyTex; + +#define dgMsgKanji98A2EmptyTex "__OTR__textures/kanji/gMsgKanji98A2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A2EmptyTex[] = dgMsgKanji98A2EmptyTex; + +#define dgMsgKanji98A3EmptyTex "__OTR__textures/kanji/gMsgKanji98A3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A3EmptyTex[] = dgMsgKanji98A3EmptyTex; + +#define dgMsgKanji98A4EmptyTex "__OTR__textures/kanji/gMsgKanji98A4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A4EmptyTex[] = dgMsgKanji98A4EmptyTex; + +#define dgMsgKanji98A5EmptyTex "__OTR__textures/kanji/gMsgKanji98A5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A5EmptyTex[] = dgMsgKanji98A5EmptyTex; + +#define dgMsgKanji98A6EmptyTex "__OTR__textures/kanji/gMsgKanji98A6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A6EmptyTex[] = dgMsgKanji98A6EmptyTex; + +#define dgMsgKanji98A7EmptyTex "__OTR__textures/kanji/gMsgKanji98A7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A7EmptyTex[] = dgMsgKanji98A7EmptyTex; + +#define dgMsgKanji98A8EmptyTex "__OTR__textures/kanji/gMsgKanji98A8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A8EmptyTex[] = dgMsgKanji98A8EmptyTex; + +#define dgMsgKanji98A9EmptyTex "__OTR__textures/kanji/gMsgKanji98A9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98A9EmptyTex[] = dgMsgKanji98A9EmptyTex; + +#define dgMsgKanji98AAEmptyTex "__OTR__textures/kanji/gMsgKanji98AAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98AAEmptyTex[] = dgMsgKanji98AAEmptyTex; + +#define dgMsgKanji98ABEmptyTex "__OTR__textures/kanji/gMsgKanji98ABEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ABEmptyTex[] = dgMsgKanji98ABEmptyTex; + +#define dgMsgKanji98ACEmptyTex "__OTR__textures/kanji/gMsgKanji98ACEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ACEmptyTex[] = dgMsgKanji98ACEmptyTex; + +#define dgMsgKanji98ADEmptyTex "__OTR__textures/kanji/gMsgKanji98ADEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ADEmptyTex[] = dgMsgKanji98ADEmptyTex; + +#define dgMsgKanji98AEEmptyTex "__OTR__textures/kanji/gMsgKanji98AEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98AEEmptyTex[] = dgMsgKanji98AEEmptyTex; + +#define dgMsgKanji98AFEmptyTex "__OTR__textures/kanji/gMsgKanji98AFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98AFEmptyTex[] = dgMsgKanji98AFEmptyTex; + +#define dgMsgKanji98B0EmptyTex "__OTR__textures/kanji/gMsgKanji98B0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B0EmptyTex[] = dgMsgKanji98B0EmptyTex; + +#define dgMsgKanji98B1EmptyTex "__OTR__textures/kanji/gMsgKanji98B1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B1EmptyTex[] = dgMsgKanji98B1EmptyTex; + +#define dgMsgKanji98B2EmptyTex "__OTR__textures/kanji/gMsgKanji98B2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B2EmptyTex[] = dgMsgKanji98B2EmptyTex; + +#define dgMsgKanji98B3EmptyTex "__OTR__textures/kanji/gMsgKanji98B3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B3EmptyTex[] = dgMsgKanji98B3EmptyTex; + +#define dgMsgKanji98B4EmptyTex "__OTR__textures/kanji/gMsgKanji98B4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B4EmptyTex[] = dgMsgKanji98B4EmptyTex; + +#define dgMsgKanji98B5EmptyTex "__OTR__textures/kanji/gMsgKanji98B5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B5EmptyTex[] = dgMsgKanji98B5EmptyTex; + +#define dgMsgKanji98B6EmptyTex "__OTR__textures/kanji/gMsgKanji98B6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B6EmptyTex[] = dgMsgKanji98B6EmptyTex; + +#define dgMsgKanji98B7EmptyTex "__OTR__textures/kanji/gMsgKanji98B7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B7EmptyTex[] = dgMsgKanji98B7EmptyTex; + +#define dgMsgKanji98B8EmptyTex "__OTR__textures/kanji/gMsgKanji98B8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B8EmptyTex[] = dgMsgKanji98B8EmptyTex; + +#define dgMsgKanji98B9EmptyTex "__OTR__textures/kanji/gMsgKanji98B9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98B9EmptyTex[] = dgMsgKanji98B9EmptyTex; + +#define dgMsgKanji98BAEmptyTex "__OTR__textures/kanji/gMsgKanji98BAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BAEmptyTex[] = dgMsgKanji98BAEmptyTex; + +#define dgMsgKanji98BBEmptyTex "__OTR__textures/kanji/gMsgKanji98BBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BBEmptyTex[] = dgMsgKanji98BBEmptyTex; + +#define dgMsgKanji98BCEmptyTex "__OTR__textures/kanji/gMsgKanji98BCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BCEmptyTex[] = dgMsgKanji98BCEmptyTex; + +#define dgMsgKanji98BDEmptyTex "__OTR__textures/kanji/gMsgKanji98BDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BDEmptyTex[] = dgMsgKanji98BDEmptyTex; + +#define dgMsgKanji98BEEmptyTex "__OTR__textures/kanji/gMsgKanji98BEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BEEmptyTex[] = dgMsgKanji98BEEmptyTex; + +#define dgMsgKanji98BFEmptyTex "__OTR__textures/kanji/gMsgKanji98BFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98BFEmptyTex[] = dgMsgKanji98BFEmptyTex; + +#define dgMsgKanji98C0EmptyTex "__OTR__textures/kanji/gMsgKanji98C0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C0EmptyTex[] = dgMsgKanji98C0EmptyTex; + +#define dgMsgKanji98C1EmptyTex "__OTR__textures/kanji/gMsgKanji98C1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C1EmptyTex[] = dgMsgKanji98C1EmptyTex; + +#define dgMsgKanji98C2EmptyTex "__OTR__textures/kanji/gMsgKanji98C2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C2EmptyTex[] = dgMsgKanji98C2EmptyTex; + +#define dgMsgKanji98C3EmptyTex "__OTR__textures/kanji/gMsgKanji98C3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C3EmptyTex[] = dgMsgKanji98C3EmptyTex; + +#define dgMsgKanji98C4EmptyTex "__OTR__textures/kanji/gMsgKanji98C4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C4EmptyTex[] = dgMsgKanji98C4EmptyTex; + +#define dgMsgKanji98C5EmptyTex "__OTR__textures/kanji/gMsgKanji98C5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C5EmptyTex[] = dgMsgKanji98C5EmptyTex; + +#define dgMsgKanji98C6EmptyTex "__OTR__textures/kanji/gMsgKanji98C6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C6EmptyTex[] = dgMsgKanji98C6EmptyTex; + +#define dgMsgKanji98C7EmptyTex "__OTR__textures/kanji/gMsgKanji98C7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C7EmptyTex[] = dgMsgKanji98C7EmptyTex; + +#define dgMsgKanji98C8EmptyTex "__OTR__textures/kanji/gMsgKanji98C8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C8EmptyTex[] = dgMsgKanji98C8EmptyTex; + +#define dgMsgKanji98C9EmptyTex "__OTR__textures/kanji/gMsgKanji98C9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98C9EmptyTex[] = dgMsgKanji98C9EmptyTex; + +#define dgMsgKanji98CAEmptyTex "__OTR__textures/kanji/gMsgKanji98CAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CAEmptyTex[] = dgMsgKanji98CAEmptyTex; + +#define dgMsgKanji98CBEmptyTex "__OTR__textures/kanji/gMsgKanji98CBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CBEmptyTex[] = dgMsgKanji98CBEmptyTex; + +#define dgMsgKanji98CCEmptyTex "__OTR__textures/kanji/gMsgKanji98CCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CCEmptyTex[] = dgMsgKanji98CCEmptyTex; + +#define dgMsgKanji98CDEmptyTex "__OTR__textures/kanji/gMsgKanji98CDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CDEmptyTex[] = dgMsgKanji98CDEmptyTex; + +#define dgMsgKanji98CEEmptyTex "__OTR__textures/kanji/gMsgKanji98CEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CEEmptyTex[] = dgMsgKanji98CEEmptyTex; + +#define dgMsgKanji98CFEmptyTex "__OTR__textures/kanji/gMsgKanji98CFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98CFEmptyTex[] = dgMsgKanji98CFEmptyTex; + +#define dgMsgKanji98D0EmptyTex "__OTR__textures/kanji/gMsgKanji98D0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D0EmptyTex[] = dgMsgKanji98D0EmptyTex; + +#define dgMsgKanji98D1EmptyTex "__OTR__textures/kanji/gMsgKanji98D1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D1EmptyTex[] = dgMsgKanji98D1EmptyTex; + +#define dgMsgKanji98D2EmptyTex "__OTR__textures/kanji/gMsgKanji98D2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D2EmptyTex[] = dgMsgKanji98D2EmptyTex; + +#define dgMsgKanji98D3EmptyTex "__OTR__textures/kanji/gMsgKanji98D3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D3EmptyTex[] = dgMsgKanji98D3EmptyTex; + +#define dgMsgKanji98D4EmptyTex "__OTR__textures/kanji/gMsgKanji98D4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D4EmptyTex[] = dgMsgKanji98D4EmptyTex; + +#define dgMsgKanji98D5EmptyTex "__OTR__textures/kanji/gMsgKanji98D5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D5EmptyTex[] = dgMsgKanji98D5EmptyTex; + +#define dgMsgKanji98D6EmptyTex "__OTR__textures/kanji/gMsgKanji98D6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D6EmptyTex[] = dgMsgKanji98D6EmptyTex; + +#define dgMsgKanji98D7EmptyTex "__OTR__textures/kanji/gMsgKanji98D7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D7EmptyTex[] = dgMsgKanji98D7EmptyTex; + +#define dgMsgKanji98D8EmptyTex "__OTR__textures/kanji/gMsgKanji98D8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D8EmptyTex[] = dgMsgKanji98D8EmptyTex; + +#define dgMsgKanji98D9EmptyTex "__OTR__textures/kanji/gMsgKanji98D9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98D9EmptyTex[] = dgMsgKanji98D9EmptyTex; + +#define dgMsgKanji98DAEmptyTex "__OTR__textures/kanji/gMsgKanji98DAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DAEmptyTex[] = dgMsgKanji98DAEmptyTex; + +#define dgMsgKanji98DBEmptyTex "__OTR__textures/kanji/gMsgKanji98DBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DBEmptyTex[] = dgMsgKanji98DBEmptyTex; + +#define dgMsgKanji98DCEmptyTex "__OTR__textures/kanji/gMsgKanji98DCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DCEmptyTex[] = dgMsgKanji98DCEmptyTex; + +#define dgMsgKanji98DDEmptyTex "__OTR__textures/kanji/gMsgKanji98DDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DDEmptyTex[] = dgMsgKanji98DDEmptyTex; + +#define dgMsgKanji98DEEmptyTex "__OTR__textures/kanji/gMsgKanji98DEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DEEmptyTex[] = dgMsgKanji98DEEmptyTex; + +#define dgMsgKanji98DFEmptyTex "__OTR__textures/kanji/gMsgKanji98DFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98DFEmptyTex[] = dgMsgKanji98DFEmptyTex; + +#define dgMsgKanji98E0EmptyTex "__OTR__textures/kanji/gMsgKanji98E0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E0EmptyTex[] = dgMsgKanji98E0EmptyTex; + +#define dgMsgKanji98E1EmptyTex "__OTR__textures/kanji/gMsgKanji98E1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E1EmptyTex[] = dgMsgKanji98E1EmptyTex; + +#define dgMsgKanji98E2EmptyTex "__OTR__textures/kanji/gMsgKanji98E2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E2EmptyTex[] = dgMsgKanji98E2EmptyTex; + +#define dgMsgKanji98E3EmptyTex "__OTR__textures/kanji/gMsgKanji98E3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E3EmptyTex[] = dgMsgKanji98E3EmptyTex; + +#define dgMsgKanji98E4EmptyTex "__OTR__textures/kanji/gMsgKanji98E4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E4EmptyTex[] = dgMsgKanji98E4EmptyTex; + +#define dgMsgKanji98E5EmptyTex "__OTR__textures/kanji/gMsgKanji98E5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E5EmptyTex[] = dgMsgKanji98E5EmptyTex; + +#define dgMsgKanji98E6EmptyTex "__OTR__textures/kanji/gMsgKanji98E6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E6EmptyTex[] = dgMsgKanji98E6EmptyTex; + +#define dgMsgKanji98E7EmptyTex "__OTR__textures/kanji/gMsgKanji98E7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E7EmptyTex[] = dgMsgKanji98E7EmptyTex; + +#define dgMsgKanji98E8EmptyTex "__OTR__textures/kanji/gMsgKanji98E8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E8EmptyTex[] = dgMsgKanji98E8EmptyTex; + +#define dgMsgKanji98E9EmptyTex "__OTR__textures/kanji/gMsgKanji98E9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98E9EmptyTex[] = dgMsgKanji98E9EmptyTex; + +#define dgMsgKanji98EAEmptyTex "__OTR__textures/kanji/gMsgKanji98EAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EAEmptyTex[] = dgMsgKanji98EAEmptyTex; + +#define dgMsgKanji98EBEmptyTex "__OTR__textures/kanji/gMsgKanji98EBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EBEmptyTex[] = dgMsgKanji98EBEmptyTex; + +#define dgMsgKanji98ECEmptyTex "__OTR__textures/kanji/gMsgKanji98ECEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98ECEmptyTex[] = dgMsgKanji98ECEmptyTex; + +#define dgMsgKanji98EDEmptyTex "__OTR__textures/kanji/gMsgKanji98EDEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EDEmptyTex[] = dgMsgKanji98EDEmptyTex; + +#define dgMsgKanji98EEEmptyTex "__OTR__textures/kanji/gMsgKanji98EEEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EEEmptyTex[] = dgMsgKanji98EEEmptyTex; + +#define dgMsgKanji98EFEmptyTex "__OTR__textures/kanji/gMsgKanji98EFEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98EFEmptyTex[] = dgMsgKanji98EFEmptyTex; + +#define dgMsgKanji98F0EmptyTex "__OTR__textures/kanji/gMsgKanji98F0EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F0EmptyTex[] = dgMsgKanji98F0EmptyTex; + +#define dgMsgKanji98F1EmptyTex "__OTR__textures/kanji/gMsgKanji98F1EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F1EmptyTex[] = dgMsgKanji98F1EmptyTex; + +#define dgMsgKanji98F2EmptyTex "__OTR__textures/kanji/gMsgKanji98F2EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F2EmptyTex[] = dgMsgKanji98F2EmptyTex; + +#define dgMsgKanji98F3EmptyTex "__OTR__textures/kanji/gMsgKanji98F3EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F3EmptyTex[] = dgMsgKanji98F3EmptyTex; + +#define dgMsgKanji98F4EmptyTex "__OTR__textures/kanji/gMsgKanji98F4EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F4EmptyTex[] = dgMsgKanji98F4EmptyTex; + +#define dgMsgKanji98F5EmptyTex "__OTR__textures/kanji/gMsgKanji98F5EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F5EmptyTex[] = dgMsgKanji98F5EmptyTex; + +#define dgMsgKanji98F6EmptyTex "__OTR__textures/kanji/gMsgKanji98F6EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F6EmptyTex[] = dgMsgKanji98F6EmptyTex; + +#define dgMsgKanji98F7EmptyTex "__OTR__textures/kanji/gMsgKanji98F7EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F7EmptyTex[] = dgMsgKanji98F7EmptyTex; + +#define dgMsgKanji98F8EmptyTex "__OTR__textures/kanji/gMsgKanji98F8EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F8EmptyTex[] = dgMsgKanji98F8EmptyTex; + +#define dgMsgKanji98F9EmptyTex "__OTR__textures/kanji/gMsgKanji98F9EmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98F9EmptyTex[] = dgMsgKanji98F9EmptyTex; + +#define dgMsgKanji98FAEmptyTex "__OTR__textures/kanji/gMsgKanji98FAEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98FAEmptyTex[] = dgMsgKanji98FAEmptyTex; + +#define dgMsgKanji98FBEmptyTex "__OTR__textures/kanji/gMsgKanji98FBEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98FBEmptyTex[] = dgMsgKanji98FBEmptyTex; + +#define dgMsgKanji98FCEmptyTex "__OTR__textures/kanji/gMsgKanji98FCEmptyTex" +static const ALIGN_ASSET(2) char gMsgKanji98FCEmptyTex[] = dgMsgKanji98FCEmptyTex; +#endif // INTERFACE_KANJI_H \ No newline at end of file diff --git a/soh/assets/textures/map_name_static/map_name_static.h b/soh/assets/textures/map_name_static/map_name_static.h index dcec5afcb..b165356db 100644 --- a/soh/assets/textures/map_name_static/map_name_static.h +++ b/soh/assets/textures/map_name_static/map_name_static.h @@ -309,4 +309,107 @@ static const ALIGN_ASSET(2) char gQuestionMarkPositionNameFRATex[] = dgQuestionM #define dgGanonsCastlePositionNameFRATex "__OTR__textures/map_name_static/gGanonsCastlePositionNameFRATex" static const ALIGN_ASSET(2) char gGanonsCastlePositionNameFRATex[] = dgGanonsCastlePositionNameFRATex; +#define dgHauntedWastelandPointNameJPNTex "__OTR__textures/map_name_static/gHauntedWastelandPointNameJPNTex" +static const ALIGN_ASSET(2) char gHauntedWastelandPointNameJPNTex[] = dgHauntedWastelandPointNameJPNTex; + +#define dgGerudosFortressPointNameJPNTex "__OTR__textures/map_name_static/gGerudosFortressPointNameJPNTex" +static const ALIGN_ASSET(2) char gGerudosFortressPointNameJPNTex[] = dgGerudosFortressPointNameJPNTex; + +#define dgGerudoValleyPointNameJPNTex "__OTR__textures/map_name_static/gGerudoValleyPointNameJPNTex" +static const ALIGN_ASSET(2) char gGerudoValleyPointNameJPNTex[] = dgGerudoValleyPointNameJPNTex; + +#define dgHyliaLakesidePointNameJPNTex "__OTR__textures/map_name_static/gHyliaLakesidePointNameJPNTex" +static const ALIGN_ASSET(2) char gHyliaLakesidePointNameJPNTex[] = dgHyliaLakesidePointNameJPNTex; + +#define dgLonLonRanchPointNameJPNTex "__OTR__textures/map_name_static/gLonLonRanchPointNameJPNTex" +static const ALIGN_ASSET(2) char gLonLonRanchPointNameJPNTex[] = dgLonLonRanchPointNameJPNTex; + +#define dgMarketPointNameJPNTex "__OTR__textures/map_name_static/gMarketPointNameJPNTex" +static const ALIGN_ASSET(2) char gMarketPointNameJPNTex[] = dgMarketPointNameJPNTex; + +#define dgHyruleFieldPointNameJPNTex "__OTR__textures/map_name_static/gHyruleFieldPointNameJPNTex" +static const ALIGN_ASSET(2) char gHyruleFieldPointNameJPNTex[] = dgHyruleFieldPointNameJPNTex; + +#define dgDeathMountainPointNameJPNTex "__OTR__textures/map_name_static/gDeathMountainPointNameJPNTex" +static const ALIGN_ASSET(2) char gDeathMountainPointNameJPNTex[] = dgDeathMountainPointNameJPNTex; + +#define dgKakarikoVillagePointNameJPNTex "__OTR__textures/map_name_static/gKakarikoVillagePointNameJPNTex" +static const ALIGN_ASSET(2) char gKakarikoVillagePointNameJPNTex[] = dgKakarikoVillagePointNameJPNTex; + +#define dgLostWoodsPointNameJPNTex "__OTR__textures/map_name_static/gLostWoodsPointNameJPNTex" +static const ALIGN_ASSET(2) char gLostWoodsPointNameJPNTex[] = dgLostWoodsPointNameJPNTex; + +#define dgKokiriForestPointNameJPNTex "__OTR__textures/map_name_static/gKokiriForestPointNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriForestPointNameJPNTex[] = dgKokiriForestPointNameJPNTex; + +#define dgZorasDomainPointNameJPNTex "__OTR__textures/map_name_static/gZorasDomainPointNameJPNTex" +static const ALIGN_ASSET(2) char gZorasDomainPointNameJPNTex[] = dgZorasDomainPointNameJPNTex; + +#define dgHyruleFieldPositionNameJPNTex "__OTR__textures/map_name_static/gHyruleFieldPositionNameJPNTex" +static const ALIGN_ASSET(2) char gHyruleFieldPositionNameJPNTex[] = dgHyruleFieldPositionNameJPNTex; + +#define dgKakarikoVillagePositionNameJPNTex "__OTR__textures/map_name_static/gKakarikoVillagePositionNameJPNTex" +static const ALIGN_ASSET(2) char gKakarikoVillagePositionNameJPNTex[] = dgKakarikoVillagePositionNameJPNTex; + +#define dgGraveyardPositionNameJPNTex "__OTR__textures/map_name_static/gGraveyardPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGraveyardPositionNameJPNTex[] = dgGraveyardPositionNameJPNTex; + +#define dgZorasRiverPositionNameJPNTex "__OTR__textures/map_name_static/gZorasRiverPositionNameJPNTex" +static const ALIGN_ASSET(2) char gZorasRiverPositionNameJPNTex[] = dgZorasRiverPositionNameJPNTex; + +#define dgKokiriForestPositionNameJPNTex "__OTR__textures/map_name_static/gKokiriForestPositionNameJPNTex" +static const ALIGN_ASSET(2) char gKokiriForestPositionNameJPNTex[] = dgKokiriForestPositionNameJPNTex; + +#define dgSacredForestMeadowPositionNameJPNTex "__OTR__textures/map_name_static/gSacredForestMeadowPositionNameJPNTex" +static const ALIGN_ASSET(2) char gSacredForestMeadowPositionNameJPNTex[] = dgSacredForestMeadowPositionNameJPNTex; + +#define dgLakeHyliaPositionNameJPNTex "__OTR__textures/map_name_static/gLakeHyliaPositionNameJPNTex" +static const ALIGN_ASSET(2) char gLakeHyliaPositionNameJPNTex[] = dgLakeHyliaPositionNameJPNTex; + +#define dgZorasDomainPositionNameJPNTex "__OTR__textures/map_name_static/gZorasDomainPositionNameJPNTex" +static const ALIGN_ASSET(2) char gZorasDomainPositionNameJPNTex[] = dgZorasDomainPositionNameJPNTex; + +#define dgZorasFountainPositionNameJPNTex "__OTR__textures/map_name_static/gZorasFountainPositionNameJPNTex" +static const ALIGN_ASSET(2) char gZorasFountainPositionNameJPNTex[] = dgZorasFountainPositionNameJPNTex; + +#define dgGerudoValleyPositionNameJPNTex "__OTR__textures/map_name_static/gGerudoValleyPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGerudoValleyPositionNameJPNTex[] = dgGerudoValleyPositionNameJPNTex; + +#define dgLostWoodsPositionNameJPNTex "__OTR__textures/map_name_static/gLostWoodsPositionNameJPNTex" +static const ALIGN_ASSET(2) char gLostWoodsPositionNameJPNTex[] = dgLostWoodsPositionNameJPNTex; + +#define dgDesertColossusPositionNameJPNTex "__OTR__textures/map_name_static/gDesertColossusPositionNameJPNTex" +static const ALIGN_ASSET(2) char gDesertColossusPositionNameJPNTex[] = dgDesertColossusPositionNameJPNTex; + +#define dgGerudosFortressPositionNameJPNTex "__OTR__textures/map_name_static/gGerudosFortressPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGerudosFortressPositionNameJPNTex[] = dgGerudosFortressPositionNameJPNTex; + +#define dgHauntedWastelandPositionNameJPNTex "__OTR__textures/map_name_static/gHauntedWastelandPositionNameJPNTex" +static const ALIGN_ASSET(2) char gHauntedWastelandPositionNameJPNTex[] = dgHauntedWastelandPositionNameJPNTex; + +#define dgMarketPositionNameJPNTex "__OTR__textures/map_name_static/gMarketPositionNameJPNTex" +static const ALIGN_ASSET(2) char gMarketPositionNameJPNTex[] = dgMarketPositionNameJPNTex; + +#define dgHyruleCastlePositionNameJPNTex "__OTR__textures/map_name_static/gHyruleCastlePositionNameJPNTex" +static const ALIGN_ASSET(2) char gHyruleCastlePositionNameJPNTex[] = dgHyruleCastlePositionNameJPNTex; + +#define dgDeathMountainTrailPositionNameJPNTex "__OTR__textures/map_name_static/gDeathMountainTrailPositionNameJPNTex" +static const ALIGN_ASSET(2) char gDeathMountainTrailPositionNameJPNTex[] = dgDeathMountainTrailPositionNameJPNTex; + +#define dgDeathMountainCraterPositionNameJPNTex "__OTR__textures/map_name_static/gDeathMountainCraterPositionNameJPNTex" +static const ALIGN_ASSET(2) char gDeathMountainCraterPositionNameJPNTex[] = dgDeathMountainCraterPositionNameJPNTex; + +#define dgGoronCityPositionNameJPNTex "__OTR__textures/map_name_static/gGoronCityPositionNameJPNTex" +static const ALIGN_ASSET(2) char gGoronCityPositionNameJPNTex[] = dgGoronCityPositionNameJPNTex; + +#define dgLonLonRanchPositionNameJPNTex "__OTR__textures/map_name_static/gLonLonRanchPositionNameJPNTex" +static const ALIGN_ASSET(2) char gLonLonRanchPositionNameJPNTex[] = dgLonLonRanchPositionNameJPNTex; + +#define dgQuestionMarkPositionNameJPNTex "__OTR__textures/map_name_static/gQuestionMarkPositionNameJPNTex" +static const ALIGN_ASSET(2) char gQuestionMarkPositionNameJPNTex[] = dgQuestionMarkPositionNameJPNTex; + +#define dgGanonsCastlePositionNameJPNTex "__OTR__textures/map_name_static/gGanonsCastlePositionNameJPNTex" +static const ALIGN_ASSET(2) char gGanonsCastlePositionNameJPNTex[] = dgGanonsCastlePositionNameJPNTex; + + #endif // TEXTURES_MAP_NAME_STATIC_H diff --git a/soh/assets/textures/title_static/title_static.h b/soh/assets/textures/title_static/title_static.h index 88ea9a555..b3baf985f 100644 --- a/soh/assets/textures/title_static/title_static.h +++ b/soh/assets/textures/title_static/title_static.h @@ -423,6 +423,9 @@ static const ALIGN_ASSET(2) char gFileSelHoldFRATex[] = dgFileSelHoldFRATex; #define dgFileSelCheckBrightnessENGTex "__OTR__textures/title_static/gFileSelCheckBrightnessENGTex" static const ALIGN_ASSET(2) char gFileSelCheckBrightnessENGTex[] = dgFileSelCheckBrightnessENGTex; +#define dgFileSelCheckBrightnessENGNTSCTex "__OTR__textures/title_static/gFileSelCheckBrightnessENGNTSCTex" +static const ALIGN_ASSET(2) char gFileSelCheckBrightnessENGNTSCTex[] = dgFileSelCheckBrightnessENGNTSCTex; + #define dgFileSelCheckBrightnessGERTex "__OTR__textures/title_static/gFileSelCheckBrightnessGERTex" static const ALIGN_ASSET(2) char gFileSelCheckBrightnessGERTex[] = dgFileSelCheckBrightnessGERTex; @@ -447,4 +450,110 @@ static const ALIGN_ASSET(2) char gFileSelWindow2DL[] = dgFileSelWindow2DL; #define dgFileSelWindow3DL "__OTR__textures/title_static/gFileSelWindow3DL" static const ALIGN_ASSET(2) char gFileSelWindow3DL[] = dgFileSelWindow3DL; +#define dgFileSelNoFileToCopyJPNTex "__OTR__textures/title_static/gFileSelNoFileToCopyJPNTex" +static const ALIGN_ASSET(2) char gFileSelNoFileToCopyJPNTex[] = dgFileSelNoFileToCopyJPNTex; + +#define dgFileSelNoFileToEraseJPNTex "__OTR__textures/title_static/gFileSelNoFileToEraseJPNTex" +static const ALIGN_ASSET(2) char gFileSelNoFileToEraseJPNTex[] = dgFileSelNoFileToEraseJPNTex; + +#define dgFileSelNoEmptyFileJPNTex "__OTR__textures/title_static/gFileSelNoEmptyFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelNoEmptyFileJPNTex[] = dgFileSelNoEmptyFileJPNTex; + +#define dgFileSelFileEmptyJPNTex "__OTR__textures/title_static/gFileSelFileEmptyJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileEmptyJPNTex[] = dgFileSelFileEmptyJPNTex; + +#define dgFileSelFileInUseJPNTex "__OTR__textures/title_static/gFileSelFileInUseJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileInUseJPNTex[] = dgFileSelFileInUseJPNTex; + +#define dgFileSelWhichFile1JPNTex "__OTR__textures/title_static/gFileSelWhichFile1JPNTex" +static const ALIGN_ASSET(2) char gFileSelWhichFile1JPNTex[] = dgFileSelWhichFile1JPNTex; + +#define dgFileSelCopyToWhichFileJPNTex "__OTR__textures/title_static/gFileSelCopyToWhichFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelCopyToWhichFileJPNTex[] = dgFileSelCopyToWhichFileJPNTex; + +#define dgFileSelAreYouSureJPNTex "__OTR__textures/title_static/gFileSelAreYouSureJPNTex" +static const ALIGN_ASSET(2) char gFileSelAreYouSureJPNTex[] = dgFileSelAreYouSureJPNTex; + +#define dgFileSelFileCopiedJPNTex "__OTR__textures/title_static/gFileSelFileCopiedJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileCopiedJPNTex[] = dgFileSelFileCopiedJPNTex; + +#define dgFileSelPleaseSelectAFileJPNTex "__OTR__textures/title_static/gFileSelPleaseSelectAFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelPleaseSelectAFileJPNTex[] = dgFileSelPleaseSelectAFileJPNTex; + +#define dgFileSelOpenThisFileJPNTex "__OTR__textures/title_static/gFileSelOpenThisFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelOpenThisFileJPNTex[] = dgFileSelOpenThisFileJPNTex; + +#define dgFileSelEraseWhichFileJPNTex "__OTR__textures/title_static/gFileSelEraseWhichFileJPNTex" +static const ALIGN_ASSET(2) char gFileSelEraseWhichFileJPNTex[] = dgFileSelEraseWhichFileJPNTex; + +#define dgFileSelAreYouSure2JPNTex "__OTR__textures/title_static/gFileSelAreYouSure2JPNTex" +static const ALIGN_ASSET(2) char gFileSelAreYouSure2JPNTex[] = dgFileSelAreYouSure2JPNTex; + +#define dgFileSelFileErasedJPNTex "__OTR__textures/title_static/gFileSelFileErasedJPNTex" +static const ALIGN_ASSET(2) char gFileSelFileErasedJPNTex[] = dgFileSelFileErasedJPNTex; + +#define dgFileSelOptionsJPNTex "__OTR__textures/title_static/gFileSelOptionsJPNTex" +static const ALIGN_ASSET(2) char gFileSelOptionsJPNTex[] = dgFileSelOptionsJPNTex; + +#define dgFileSelNameJPNTex "__OTR__textures/title_static/gFileSelNameJPNTex" +static const ALIGN_ASSET(2) char gFileSelNameJPNTex[] = dgFileSelNameJPNTex; + +#define dgFileSelSurroundJPNTex "__OTR__textures/title_static/gFileSelSurroundJPNTex" +static const ALIGN_ASSET(2) char gFileSelSurroundJPNTex[] = dgFileSelSurroundJPNTex; + +#define dgFileSelHeadsetJPNTex "__OTR__textures/title_static/gFileSelHeadsetJPNTex" +static const ALIGN_ASSET(2) char gFileSelHeadsetJPNTex[] = dgFileSelHeadsetJPNTex; + +#define dgFileSelMonoJPNTex "__OTR__textures/title_static/gFileSelMonoJPNTex" +static const ALIGN_ASSET(2) char gFileSelMonoJPNTex[] = dgFileSelMonoJPNTex; + +#define dgFileSelStereoJPNTex "__OTR__textures/title_static/gFileSelStereoJPNTex" +static const ALIGN_ASSET(2) char gFileSelStereoJPNTex[] = dgFileSelStereoJPNTex; + +#define dgFileSelLTargetingJPNTex "__OTR__textures/title_static/gFileSelLTargetingJPNTex" +static const ALIGN_ASSET(2) char gFileSelLTargetingJPNTex[] = dgFileSelLTargetingJPNTex; + +#define dgFileSelSwitchJPNTex "__OTR__textures/title_static/gFileSelSwitchJPNTex" +static const ALIGN_ASSET(2) char gFileSelSwitchJPNTex[] = dgFileSelSwitchJPNTex; + +#define dgFileSelHoldJPNTex "__OTR__textures/title_static/gFileSelHoldJPNTex" +static const ALIGN_ASSET(2) char gFileSelHoldJPNTex[] = dgFileSelHoldJPNTex; + +#define dgFileSelControlsJPNTex "__OTR__textures/title_static/gFileSelControlsJPNTex" +static const ALIGN_ASSET(2) char gFileSelControlsJPNTex[] = dgFileSelControlsJPNTex; + +#define dgFileSelCheckBrightnessJPNTex "__OTR__textures/title_static/gFileSelCheckBrightnessJPNTex" +static const ALIGN_ASSET(2) char gFileSelCheckBrightnessJPNTex[] = dgFileSelCheckBrightnessJPNTex; + +#define dgFileSelCopyButtonJPNTex "__OTR__textures/title_static/gFileSelCopyButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelCopyButtonJPNTex[] = dgFileSelCopyButtonJPNTex; + +#define dgFileSelFile1ButtonJPNTex "__OTR__textures/title_static/gFileSelFile1ButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelFile1ButtonJPNTex[] = dgFileSelFile1ButtonJPNTex; + +#define dgFileSelFile2ButtonJPNTex "__OTR__textures/title_static/gFileSelFile2ButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelFile2ButtonJPNTex[] = dgFileSelFile2ButtonJPNTex; + +#define dgFileSelFile3ButtonJPNTex "__OTR__textures/title_static/gFileSelFile3ButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelFile3ButtonJPNTex[] = dgFileSelFile3ButtonJPNTex; + +#define dgFileSelYesButtonJPNTex "__OTR__textures/title_static/gFileSelYesButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelYesButtonJPNTex[] = dgFileSelYesButtonJPNTex; + +#define dgFileSelEraseButtonJPNTex "__OTR__textures/title_static/gFileSelEraseButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelEraseButtonJPNTex[] = dgFileSelEraseButtonJPNTex; + +#define dgFileSelOptionsButtonJPNTex "__OTR__textures/title_static/gFileSelOptionsButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelOptionsButtonJPNTex[] = dgFileSelOptionsButtonJPNTex; + +#define dgFileSelQuitButtonJPNTex "__OTR__textures/title_static/gFileSelQuitButtonJPNTex" +static const ALIGN_ASSET(2) char gFileSelQuitButtonJPNTex[] = dgFileSelQuitButtonJPNTex; + +#define dgFileSelSaveXJPNTex "__OTR__textures/title_static/gFileSelSaveXJPNTex" +static const ALIGN_ASSET(2) char gFileSelSaveXJPNTex[] = dgFileSelSaveXJPNTex; + +#define dgFileSelSaveXENGTex "__OTR__textures/title_static/gFileSelSaveXENGTex" +static const ALIGN_ASSET(2) char gFileSelSaveXENGTex[] = dgFileSelSaveXENGTex; + + #endif // TEXTURES_TITLE_STATIC_H diff --git a/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml index 28a2adc4c..389503056 100644 --- a/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml +++ b/soh/assets/xml/GC_MQ_D/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml index 52e78bcb1..580fead4a 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml index 3811322d3..99b5dbafd 100644 --- a/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml +++ b/soh/assets/xml/GC_NMQ_D/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml index 486cb244d..045ad0c76 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/N64_NTSC_10/audio/Audio.xml b/soh/assets/xml/N64_NTSC_10/audio/Audio.xml new file mode 100644 index 000000000..a546214d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/audio/Audio.xml @@ -0,0 +1,1570 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml b/soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml new file mode 100644 index 000000000..9217b2f27 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml b/soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml new file mode 100644 index 000000000..ac3221234 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml b/soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..aeb78987d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml b/soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml new file mode 100644 index 000000000..66bd15b59 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml b/soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml b/soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml b/soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_am.xml b/soh/assets/xml/N64_NTSC_10/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ane.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ani.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml b/soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_aob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml b/soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bba.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bird.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bji.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_boj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_box.xml b/soh/assets/xml/N64_NTSC_10/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_brob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cne.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cob.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_crow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_cs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml b/soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml b/soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml b/soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml b/soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml b/soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml b/soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml b/soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dh.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dns.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dog.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml b/soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ds.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_du.xml b/soh/assets/xml/N64_NTSC_10/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ec.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ei.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fire.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml b/soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fish.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fu.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_fz.xml b/soh/assets/xml/N64_NTSC_10/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_geff.xml b/soh/assets/xml/N64_NTSC_10/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gla.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gm.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml b/soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gol.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_gt.xml b/soh/assets/xml/N64_NTSC_10/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_haka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml b/soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hata.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml b/soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hni.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml b/soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_hs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_human.xml b/soh/assets/xml/N64_NTSC_10/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ik.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_im.xml b/soh/assets/xml/N64_NTSC_10/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_in.xml b/soh/assets/xml/N64_NTSC_10/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_js.xml b/soh/assets/xml/N64_NTSC_10/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_km1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_kz.xml b/soh/assets/xml/N64_NTSC_10/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml b/soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml b/soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml b/soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml b/soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml b/soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mag.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mag.xml new file mode 100644 index 000000000..257f72363 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml b/soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_md.xml b/soh/assets/xml/N64_NTSC_10/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_medal.xml b/soh/assets/xml/N64_NTSC_10/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mm.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ms.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_mu.xml b/soh/assets/xml/N64_NTSC_10/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_nb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_niw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml b/soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ny.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml b/soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml b/soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml b/soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_os.xml b/soh/assets/xml/N64_NTSC_10/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml b/soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_owl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml b/soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml b/soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml b/soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml b/soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_poh.xml b/soh/assets/xml/N64_NTSC_10/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ps.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml b/soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml b/soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rl.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_rs.xml b/soh/assets/xml/N64_NTSC_10/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sa.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sd.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml b/soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml b/soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_skb.xml b/soh/assets/xml/N64_NTSC_10/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_skj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml b/soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_st.xml b/soh/assets/xml/N64_NTSC_10/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_stream.xml b/soh/assets/xml/N64_NTSC_10/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml b/soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ta.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml b/soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tite.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tk.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tp.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tr.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_trap.xml b/soh/assets/xml/N64_NTSC_10/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml b/soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ts.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml b/soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_vali.xml b/soh/assets/xml/N64_NTSC_10/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_vase.xml b/soh/assets/xml/N64_NTSC_10/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_vm.xml b/soh/assets/xml/N64_NTSC_10/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml b/soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_wf.xml b/soh/assets/xml/N64_NTSC_10/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml b/soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_xc.xml b/soh/assets/xml/N64_NTSC_10/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml b/soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml b/soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml b/soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zf.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zg.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/objects/object_zo.xml b/soh/assets/xml/N64_NTSC_10/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..a92c788b1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..1b6bdb3ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..eb21fa199 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..2bb0ffa27 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..c853b0050 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..8c9033240 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..4e799c180 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..86a2ec496 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..c966abf2a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..ed1893f48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..841bacb54 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..422eab05e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..e3e231614 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..dbb80db7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..d2e1411f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..47435e670 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..3b327d96f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..755bbb834 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..0c0c21667 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml new file mode 100644 index 000000000..07e49caf0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..4d22847a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..6bead07a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..dba3fe1bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_File_Choose.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..f62ff8f76 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..3cd0cf127 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..612714ddb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..74ee6fb57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..96b2a24df --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..f2ba83827 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..d5ef928e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..5ff3cebac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..f6c728a49 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..ad4311426 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..e557c80a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..97401aff6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..fa4d784f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..00c5aa82d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..a9e520f4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..1446a9c98 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..6b22223cd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..3ec568cfb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..84ef36950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..a5ff210ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..060d4941b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..827277614 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..b27962889 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..bc14a46ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml new file mode 100644 index 000000000..d9e5960e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..aed7d2660 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml b/soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml new file mode 100644 index 000000000..dcee38761 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml new file mode 100644 index 000000000..54a8ea321 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml new file mode 100644 index 000000000..ccff0d05b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml new file mode 100644 index 000000000..58f1f7502 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml new file mode 100644 index 000000000..6c059858b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml new file mode 100644 index 000000000..c50cacdb3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml b/soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml b/soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml b/soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/text/message_data_static.xml b/soh/assets/xml/N64_NTSC_10/text/message_data_static.xml new file mode 100644 index 000000000..dc08d4e02 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml b/soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml b/soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml b/soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml b/soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/kanji.xml b/soh/assets/xml/N64_NTSC_10/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml b/soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/message_static.xml b/soh/assets/xml/N64_NTSC_10/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml b/soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml b/soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml new file mode 100644 index 000000000..f1b80ee04 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml b/soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..aa5c7c9ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml b/soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml b/soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml b/soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/textures/title_static.xml b/soh/assets/xml/N64_NTSC_10/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_10/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/audio/Audio.xml b/soh/assets/xml/N64_NTSC_11/audio/Audio.xml new file mode 100644 index 000000000..e0fa4543b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/audio/Audio.xml @@ -0,0 +1,1570 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml b/soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml new file mode 100644 index 000000000..0d4f5766f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml b/soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml new file mode 100644 index 000000000..f7d695946 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml b/soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..61a6da385 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml b/soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml new file mode 100644 index 000000000..3760c930c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml b/soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml b/soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml b/soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_am.xml b/soh/assets/xml/N64_NTSC_11/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ane.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ani.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml b/soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_aob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml b/soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bba.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bird.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bji.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_boj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_box.xml b/soh/assets/xml/N64_NTSC_11/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_brob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cne.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cob.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_crow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_cs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml b/soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml b/soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml b/soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml b/soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml b/soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml b/soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml b/soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dh.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dns.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dog.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml b/soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ds.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_du.xml b/soh/assets/xml/N64_NTSC_11/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ec.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ei.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fire.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml b/soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fish.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fu.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_fz.xml b/soh/assets/xml/N64_NTSC_11/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_geff.xml b/soh/assets/xml/N64_NTSC_11/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gla.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gm.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml b/soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gol.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_gt.xml b/soh/assets/xml/N64_NTSC_11/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_haka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml b/soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hata.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml b/soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hni.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml b/soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_hs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_human.xml b/soh/assets/xml/N64_NTSC_11/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ik.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_im.xml b/soh/assets/xml/N64_NTSC_11/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_in.xml b/soh/assets/xml/N64_NTSC_11/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_js.xml b/soh/assets/xml/N64_NTSC_11/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_km1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_kz.xml b/soh/assets/xml/N64_NTSC_11/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml b/soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml b/soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml b/soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml b/soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml b/soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mag.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mag.xml new file mode 100644 index 000000000..257f72363 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml b/soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_md.xml b/soh/assets/xml/N64_NTSC_11/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_medal.xml b/soh/assets/xml/N64_NTSC_11/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mm.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ms.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_mu.xml b/soh/assets/xml/N64_NTSC_11/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_nb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_niw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml b/soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ny.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml b/soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml b/soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml b/soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_os.xml b/soh/assets/xml/N64_NTSC_11/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml b/soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_owl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml b/soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml b/soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml b/soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml b/soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_poh.xml b/soh/assets/xml/N64_NTSC_11/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ps.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml b/soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml b/soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rl.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_rs.xml b/soh/assets/xml/N64_NTSC_11/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sa.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sd.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml b/soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml b/soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_skb.xml b/soh/assets/xml/N64_NTSC_11/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_skj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml b/soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_st.xml b/soh/assets/xml/N64_NTSC_11/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_stream.xml b/soh/assets/xml/N64_NTSC_11/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml b/soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ta.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml b/soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tite.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tk.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tp.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tr.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_trap.xml b/soh/assets/xml/N64_NTSC_11/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml b/soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ts.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml b/soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_vali.xml b/soh/assets/xml/N64_NTSC_11/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_vase.xml b/soh/assets/xml/N64_NTSC_11/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_vm.xml b/soh/assets/xml/N64_NTSC_11/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml b/soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_wf.xml b/soh/assets/xml/N64_NTSC_11/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml b/soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_xc.xml b/soh/assets/xml/N64_NTSC_11/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml b/soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml b/soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml b/soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zf.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zg.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/objects/object_zo.xml b/soh/assets/xml/N64_NTSC_11/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..73ca01696 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..fb7e2e078 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..93ffad996 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..2d32a8772 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..8182ca3da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..605d6a73e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..e6fcdab9e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..2c5dd60e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..a18a449dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..6df7aff6d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..bd4f305f7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..79feadafc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..8c8bcc329 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..96ae1b093 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..9f2042ae5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..f6fb08be6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..ce21430e1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..d3aeb1958 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..9dc8c7814 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml new file mode 100644 index 000000000..5f76146cc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..ad65bc77d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..4fd2822e9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..dba3fe1bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_File_Choose.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..f3b41cbff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..06dc7a048 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..e7cd35c2c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..8755d12b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..8aeb6aef9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..56e3a9ea4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..2b68cc893 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..5515d4585 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..24902b2a8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..ad4311426 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..e557c80a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..97401aff6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..fa4d784f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..00c5aa82d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..a9e520f4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..1446a9c98 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..6b22223cd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..3ec568cfb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..84ef36950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..a5ff210ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..060d4941b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..827277614 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..b27962889 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..bc14a46ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml new file mode 100644 index 000000000..d9e5960e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..aed7d2660 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml b/soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml new file mode 100644 index 000000000..dcee38761 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml new file mode 100644 index 000000000..ccff0d05b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml new file mode 100644 index 000000000..58f1f7502 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml new file mode 100644 index 000000000..6c059858b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml new file mode 100644 index 000000000..c50cacdb3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml b/soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml b/soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml b/soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/text/message_data_static.xml b/soh/assets/xml/N64_NTSC_11/text/message_data_static.xml new file mode 100644 index 000000000..ca67ce4a0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml b/soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml b/soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml b/soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml b/soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/kanji.xml b/soh/assets/xml/N64_NTSC_11/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml b/soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/message_static.xml b/soh/assets/xml/N64_NTSC_11/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml b/soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml b/soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml new file mode 100644 index 000000000..f1b80ee04 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml b/soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml b/soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml b/soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml b/soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/textures/title_static.xml b/soh/assets/xml/N64_NTSC_11/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_11/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/audio/Audio.xml b/soh/assets/xml/N64_NTSC_12/audio/Audio.xml new file mode 100644 index 000000000..fa2ef282b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/audio/Audio.xml @@ -0,0 +1,1558 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml b/soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml new file mode 100644 index 000000000..b7e54845a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml b/soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml new file mode 100644 index 000000000..a0886ab52 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml b/soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..7c5aad68e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml b/soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml new file mode 100644 index 000000000..25d8331f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml b/soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml b/soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml b/soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_am.xml b/soh/assets/xml/N64_NTSC_12/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ane.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ani.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml b/soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_aob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml b/soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bba.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bird.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bji.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_boj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_box.xml b/soh/assets/xml/N64_NTSC_12/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_brob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cne.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cob.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_crow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_cs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml b/soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml b/soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml b/soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml b/soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml b/soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml b/soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml b/soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dh.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dns.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dog.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml b/soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ds.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_du.xml b/soh/assets/xml/N64_NTSC_12/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ec.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ei.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fire.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml b/soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fish.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fu.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_fz.xml b/soh/assets/xml/N64_NTSC_12/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_geff.xml b/soh/assets/xml/N64_NTSC_12/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gla.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gm.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml b/soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gol.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml b/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_gt.xml b/soh/assets/xml/N64_NTSC_12/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_haka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml b/soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hata.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml b/soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hni.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml b/soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_hs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_human.xml b/soh/assets/xml/N64_NTSC_12/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ik.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_im.xml b/soh/assets/xml/N64_NTSC_12/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_in.xml b/soh/assets/xml/N64_NTSC_12/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_js.xml b/soh/assets/xml/N64_NTSC_12/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_km1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_kz.xml b/soh/assets/xml/N64_NTSC_12/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml b/soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml b/soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml b/soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml b/soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml b/soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mag.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mag.xml new file mode 100644 index 000000000..257f72363 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml b/soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_md.xml b/soh/assets/xml/N64_NTSC_12/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_medal.xml b/soh/assets/xml/N64_NTSC_12/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mm.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ms.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_mu.xml b/soh/assets/xml/N64_NTSC_12/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_nb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_niw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml b/soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ny.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml b/soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml b/soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml b/soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_os.xml b/soh/assets/xml/N64_NTSC_12/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml b/soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_owl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml b/soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml b/soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml b/soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml b/soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_poh.xml b/soh/assets/xml/N64_NTSC_12/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ps.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml b/soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml b/soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rl.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_rs.xml b/soh/assets/xml/N64_NTSC_12/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sa.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sd.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml b/soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml b/soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_skb.xml b/soh/assets/xml/N64_NTSC_12/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_skj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml b/soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml b/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_st.xml b/soh/assets/xml/N64_NTSC_12/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_stream.xml b/soh/assets/xml/N64_NTSC_12/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml b/soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ta.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml b/soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tite.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tk.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tp.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tr.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_trap.xml b/soh/assets/xml/N64_NTSC_12/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml b/soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ts.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml b/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml b/soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_vali.xml b/soh/assets/xml/N64_NTSC_12/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_vase.xml b/soh/assets/xml/N64_NTSC_12/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_vm.xml b/soh/assets/xml/N64_NTSC_12/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml b/soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_wf.xml b/soh/assets/xml/N64_NTSC_12/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml b/soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_xc.xml b/soh/assets/xml/N64_NTSC_12/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml b/soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml b/soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml b/soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zf.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zg.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/objects/object_zo.xml b/soh/assets/xml/N64_NTSC_12/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..841be4f89 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..811002bc8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..56243b5fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..5e2d16753 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..c23bf356c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..741842575 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..70cf49d2d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..ad3e1bcc7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..937e71fcc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..b0444edb6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..109b5d512 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..eadc2c0d7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..65e866901 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..3bc27ac6f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..1cb407a30 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..fc48deac3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..dd00b7664 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..b65159588 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..5105ef63e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml new file mode 100644 index 000000000..335027747 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..81bbc8de4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..b2c9cf3f6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..dba3fe1bb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_File_Choose.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..2522b97ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..8cb56a158 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..e09b58a50 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..b5b809a6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..d2ff95ab3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..97e85cbb3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..9a94efde0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..c675cba2f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..bdd1b567d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..ad4311426 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..e557c80a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..97401aff6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..fa4d784f1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..00c5aa82d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..a9e520f4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..1446a9c98 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..05633e53e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..3ec568cfb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..84ef36950 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..a5ff210ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..060d4941b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..827277614 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..0f1bc3b28 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..bc14a46ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml new file mode 100644 index 000000000..d9e5960e8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..aed7d2660 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml b/soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml new file mode 100644 index 000000000..eb725afa6 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml new file mode 100644 index 000000000..f33860420 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml new file mode 100644 index 000000000..5bb9e059c --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml new file mode 100644 index 000000000..f41b226f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml new file mode 100644 index 000000000..feb267251 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml b/soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml b/soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml b/soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/text/message_data_static.xml b/soh/assets/xml/N64_NTSC_12/text/message_data_static.xml new file mode 100644 index 000000000..7315e03a4 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml b/soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml b/soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml b/soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml b/soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml b/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/kanji.xml b/soh/assets/xml/N64_NTSC_12/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml b/soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/message_static.xml b/soh/assets/xml/N64_NTSC_12/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml b/soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml b/soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml new file mode 100644 index 000000000..f1b80ee04 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml b/soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml b/soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml b/soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml b/soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/textures/title_static.xml b/soh/assets/xml/N64_NTSC_12/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/N64_NTSC_12/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml b/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml index 7877d0bdf..61886ffbe 100644 --- a/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml +++ b/soh/assets/xml/N64_PAL_10/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml b/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml index cee1835e9..3c50f9012 100644 --- a/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml +++ b/soh/assets/xml/N64_PAL_11/code/sys_matrix.xml @@ -1,5 +1,5 @@ - + diff --git a/soh/include/functions.h b/soh/include/functions.h index 147500c66..d7ba1a193 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -2447,6 +2447,11 @@ void Message_OpenText(PlayState* play, u16 textId); void Message_Decode(PlayState* play); void Message_DrawText(PlayState* play, Gfx** gfxP); +// #region SOH [NTSC Support] +s32 Kanji_OffsetFromShiftJIS(u32 arg0); +void Font_LoadOrderedFontNTSC(Font* font); +// #endregion + // #region SOH [General] void Interface_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH); diff --git a/soh/include/message_data_fmt.h b/soh/include/message_data_fmt.h index fffac116c..5506268e9 100644 --- a/soh/include/message_data_fmt.h +++ b/soh/include/message_data_fmt.h @@ -173,6 +173,40 @@ #define MESSAGE_FISH_INFO HEX(CTRL_FISH_INFO) #define MESSAGE_HIGHSCORE HEX(CTRL_HIGHSCORE) #define MESSAGE_TIME HEX(CTRL_TIME) + +#define MESSAGE_NEWLINE_JPN 0x000A +#define MESSAGE_END_JPN 0x8170 +#define MESSAGE_BOX_BREAK_JPN 0x81A5 +#define MESSAGE_COLOR_JPN 0x000B +#define MESSAGE_SHIFT_JPN 0x86C7 +#define MESSAGE_TEXTID_JPN 0x81CB +#define MESSAGE_QUICKTEXT_ENABLE_JPN 0x8189 +#define MESSAGE_QUICKTEXT_DISABLE_JPN 0x818A +#define MESSAGE_PERSISTENT_JPN 0x86C8 +#define MESSAGE_EVENT_JPN 0x819F +#define MESSAGE_BOX_BREAK_DELAYED_JPN 0x81A3 +#define MESSAGE_AWAIT_BUTTON_PRESS_JPN 0x81A4 +#define MESSAGE_FADE_JPN 0x819E +#define MESSAGE_NAME_JPN 0x874F +#define MESSAGE_OCARINA_JPN 0x81F0 +#define MESSAGE_FADE2_JPN 0x81F4 +#define MESSAGE_SFX_JPN 0x81F3 +#define MESSAGE_ITEM_ICON_JPN 0x819A +#define MESSAGE_TEXT_SPEED_JPN 0x86C9 +#define MESSAGE_BACKGROUND_JPN 0x86B3 +#define MESSAGE_MARATHON_TIME_JPN 0x8791 +#define MESSAGE_RACE_TIME_JPN 0x8792 +#define MESSAGE_POINTS_JPN 0x879B +#define MESSAGE_TOKENS_JPN 0x86A3 +#define MESSAGE_UNSKIPPABLE_JPN 0x8199 +#define MESSAGE_TWO_CHOICE_JPN 0x81BC +#define MESSAGE_THREE_CHOICE_JPN 0x81B8 +#define MESSAGE_FISH_INFO_JPN 0x86A4 +#define MESSAGE_HIGHSCORE_JPN 0x869F +#define MESSAGE_TIME_JPN 0x81A1 + +#define MESSAGE_SPACE_JPN 0x8140 + #endif #endif diff --git a/soh/include/z64.h b/soh/include/z64.h index 882d3dd9a..99835304f 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -540,6 +540,7 @@ typedef enum { LANGUAGE_ENG, LANGUAGE_GER, LANGUAGE_FRA, + LANGUAGE_JPN, LANGUAGE_MAX } Language; @@ -662,7 +663,10 @@ typedef struct { /* 0xE300 */ s32 msgLength; // original name : "msg_data" /* 0xE304 */ u8 msgMode; // original name: "msg_mode" /* 0xE305 */ char unk_E305[0x1]; - /* 0xE306 */ u8 msgBufDecoded[200]; // decoded message buffer, may be smaller than this + /* 0xE306 */ union { + u8 msgBufDecoded[200]; + u16 msgBufDecodedWide[100]; + }; // decoded message buffer, may be smaller than this /* 0xE3CE */ u16 msgBufPos; // original name : "rdp" /* 0xE3D0 */ u16 unk_E3D0; // unused, only ever set to 0 /* 0xE3D2 */ u16 textDrawPos; // draw all decoded characters up to this buffer position @@ -1327,12 +1331,15 @@ typedef struct { } SceneSelectLoadingMessages; typedef struct { + /* */ char* japaneseAge; /* */ char* englishAge; /* */ char* germanAge; /* */ char* frenchAge; } BetterSceneSelectAgeLabels; +// NTSC TODO: japanese bettersceneselect typedef struct { +// /* */ char* japaneseName; /* */ char* englishName; /* */ char* germanName; /* */ char* frenchName; @@ -1341,6 +1348,7 @@ typedef struct { } BetterSceneSelectEntrancePair; typedef struct { + // /* */ char* japaneseName; /* */ char* englishName; /* */ char* germanName; /* */ char* frenchName; diff --git a/soh/include/z64save.h b/soh/include/z64save.h index f7873031f..751ad0b0f 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -186,6 +186,7 @@ typedef struct ShipSaveContextData { FaroresWindData backupFW; ShipQuestSaveContextData quest; u8 maskMemory; + u8 filenameLanguage; //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; @@ -202,7 +203,7 @@ typedef struct { /* 0x0018 */ s32 bgsDayCount; // increments with totalDays, can be cleared with `Environment_ClearBgsDayCount` /* 0x001C */ char newf[6]; // string "ZELDAZ". start of `info` substruct, originally called "information" /* 0x0022 */ u16 deaths; - /* 0x0024 */ char playerName[8]; + /* 0x0024 */ u8 playerName[8]; /* 0x002C */ s16 n64ddFlag; /* 0x002E */ s16 healthCapacity; // "max_life" /* 0x0030 */ s16 health; // "now_life" @@ -260,17 +261,17 @@ typedef struct { /* 0x13C8 */ s16 nayrusLoveTimer; /* 0x13CA */ char unk_13CA[0x0002]; /* 0x13CC */ s16 rupeeAccumulator; - /* 0x13CE */ s16 timer1State; - /* 0x13D0 */ s16 timer1Value; - /* 0x13D2 */ s16 timer2State; - /* 0x13D4 */ s16 timer2Value; + /* 0x13CE */ s16 timerState; + /* 0x13D0 */ s16 timerSeconds; + /* 0x13D2 */ s16 subTimerState; + /* 0x13D4 */ s16 subTimerSeconds; /* 0x13D6 */ s16 timerX[2]; /* 0x13DA */ s16 timerY[2]; /* 0x13DE */ char unk_13DE[0x0002]; /* 0x13E0 */ u8 seqId; /* 0x13E1 */ u8 natureAmbienceId; /* 0x13E2 */ u8 buttonStatus[9]; // SOH [Enhancements] Changed from 5 to 9 to support Dpad equips - /* 0x13E7 */ u8 unk_13E7; // alpha related + /* 0x13E7 */ u8 forceRisingButtonAlphas; // alpha related /* 0x13E8 */ u16 unk_13E8; // alpha type? /* 0x13EA */ u16 unk_13EA; // also alpha type? /* 0x13EC */ u16 unk_13EC; // alpha type counter? diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index 05e03dae1..80d048d68 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -81,7 +81,7 @@ static void TimeDisplayGetTimer(uint32_t timeID) { textColor = COLOR_WHITE; Player* player = GET_PLAYER(gPlayState); - uint32_t timer1 = gSaveContext.timer1Value; + uint32_t timer1 = gSaveContext.timerSeconds; switch (timeID) { case DISPLAY_IN_GAME_TIMER: @@ -99,20 +99,20 @@ static void TimeDisplayGetTimer(uint32_t timeID) { timeDisplayTime = convertDayTime(gSaveContext.dayTime).c_str(); break; case DISPLAY_CONDITIONAL_TIMER: - if (gSaveContext.timer1State > 0) { - timeDisplayTime = formatHotWaterDisplay(gSaveContext.timer1Value).c_str(); + if (gSaveContext.timerState > 0) { + timeDisplayTime = formatHotWaterDisplay(gSaveContext.timerSeconds).c_str(); textColor = - gSaveContext.timer1State <= 4 + gSaveContext.timerState <= 4 ? (gPlayState->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3 ? COLOR_LIGHT_RED : COLOR_LIGHT_BLUE) : COLOR_WHITE; - if (gSaveContext.timer1State <= 4) { + if (gSaveContext.timerState <= 4) { textureDisplay = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( gPlayState->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3 ? itemMapping[ITEM_TUNIC_GORON].name : itemMapping[ITEM_TUNIC_ZORA].name); } - if (gSaveContext.timer1State >= 6) { + if (gSaveContext.timerState >= 6) { textureDisplay = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( itemMapping[ITEM_SWORD_MASTER].name); } diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index a199c8a00..9d4aec45b 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -165,7 +165,7 @@ const std::string CustomMessage::GetFrench(MessageFormat format) const { } const std::string CustomMessage::GetForCurrentLanguage(MessageFormat format) const { - return GetForLanguage(gSaveContext.language, format); + return GetForLanguage((gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language, format); } const std::string CustomMessage::GetForLanguage(uint8_t language, MessageFormat format) const { @@ -281,7 +281,7 @@ void CustomMessage::Replace(std::string&& oldStr, std::string&& newStr) { } void CustomMessage::Replace(std::string&& oldStr, CustomMessage newMessage) { - for (uint8_t language = 0; language < LANGUAGE_MAX; language++) { + for (uint8_t language = 0; language < LANGUAGE_MAX - 1; language++) { size_t position = messages[language].find(oldStr); while (position != std::string::npos) { messages[language].replace(position, oldStr.length(), newMessage.messages[language]); diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index ebdb22971..c7d83e6ea 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -121,6 +121,7 @@ void MessageViewer::DisplayCustomMessage() const { extern "C" MessageTableEntry* sNesMessageEntryTablePtr; extern "C" MessageTableEntry* sGerMessageEntryTablePtr; extern "C" MessageTableEntry* sFraMessageEntryTablePtr; +extern "C" MessageTableEntry* sJpnMessageEntryTablePtr; extern "C" MessageTableEntry* sStaffMessageEntryTablePtr; void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) { @@ -128,18 +129,13 @@ void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) const char* nextSeg; MessageTableEntry* messageTableEntry = sNesMessageEntryTablePtr; Font* font; - u16 bufferId = textId; - // Use the better owl message if better owl is enabled - if (CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) != 0 && (bufferId == 0x2066 || bufferId == 0x607B || - bufferId == 0x10C2 || bufferId == 0x10C6 || bufferId == 0x206A)) - { - bufferId = 0x71B3; - } if (language == LANGUAGE_GER) messageTableEntry = sGerMessageEntryTablePtr; else if (language == LANGUAGE_FRA) messageTableEntry = sFraMessageEntryTablePtr; + else if (language == LANGUAGE_JPN) + messageTableEntry = sJpnMessageEntryTablePtr; // If PAL languages are not present in the OTR file, default to English if (messageTableEntry == nullptr) @@ -150,7 +146,7 @@ void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) while (messageTableEntry->textId != 0xFFFF) { font = &play->msgCtx.font; - if (messageTableEntry->textId == bufferId) { + if (messageTableEntry->textId == textId) { foundSeg = messageTableEntry->segment; font->charTexBuf[0] = messageTableEntry->typePos; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 96163f656..1d5d08bee 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -267,22 +267,22 @@ void DrawInfoTab() { PopStyleInput(); PushStyleInput(THEME_COLOR); - ImGui::InputScalar("Timer 1 State", ImGuiDataType_S16, &gSaveContext.timer1State); + ImGui::InputScalar("Timer State", ImGuiDataType_S16, &gSaveContext.timerState); Tooltip("Heat timer, race timer, etc. Has white font"); PopStyleInput(); PushStyleInput(THEME_COLOR); - ImGui::InputScalar("Timer 1 Value", ImGuiDataType_S16, &gSaveContext.timer1Value, &one, NULL); + ImGui::InputScalar("Timer Seconds", ImGuiDataType_S16, &gSaveContext.timerSeconds, &one, NULL); Tooltip("Time, in seconds"); PopStyleInput(); PushStyleInput(THEME_COLOR); - ImGui::InputScalar("Timer 2 State", ImGuiDataType_S16, &gSaveContext.timer2State); + ImGui::InputScalar("Sub-Timer State", ImGuiDataType_S16, &gSaveContext.subTimerState); Tooltip("Trade timer, Ganon collapse timer, etc. Has yellow font"); PopStyleInput(); PushStyleInput(THEME_COLOR); - ImGui::InputScalar("Timer 2 Value", ImGuiDataType_S16, &gSaveContext.timer2Value, &one, NULL); + ImGui::InputScalar("Sub-Timer Seconds", ImGuiDataType_S16, &gSaveContext.subTimerSeconds, &one, NULL); Tooltip("Time, in seconds"); PopStyleInput(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 0023204ef..ad09fe652 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -1670,7 +1670,7 @@ void DrawLocation(RandomizerCheck rc) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { - if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || gSaveContext.language == LANGUAGE_JPN) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; @@ -1698,7 +1698,7 @@ void DrawLocation(RandomizerCheck rc) { } } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { - if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || gSaveContext.language == LANGUAGE_JPN) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; diff --git a/soh/soh/Enhancements/tts/tts.cpp b/soh/soh/Enhancements/tts/tts.cpp index 9d58e2d62..6b02e6c2c 100644 --- a/soh/soh/Enhancements/tts/tts.cpp +++ b/soh/soh/Enhancements/tts/tts.cpp @@ -140,10 +140,10 @@ void RegisterOnInterfaceUpdateHook() { static char ttsAnnounceBuf[32]; uint32_t timer = 0; - if (gSaveContext.timer1State != 0) { - timer = gSaveContext.timer1Value; - } else if (gSaveContext.timer2State != 0) { - timer = gSaveContext.timer2Value; + if (gSaveContext.timerState != 0) { + timer = gSaveContext.timerSeconds; + } else if (gSaveContext.subTimerState != 0) { + timer = gSaveContext.subTimerSeconds; } if (timer > 0) { @@ -813,9 +813,10 @@ void RegisterOnUpdateMainMenuSelection() { GameInteractor::Instance->RegisterGameHook([](uint8_t optionIndex, uint8_t optionValue) { if (!CVarGetInteger(CVAR_SETTING("A11yTTS"), 0)) return; + uint8_t language = (gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language; - auto optionName = BossRush_GetSettingName(optionIndex, gSaveContext.language); - auto optionValueName = BossRush_GetSettingChoiceName(optionIndex, optionValue, gSaveContext.language); + auto optionName = BossRush_GetSettingName(optionIndex, language); + auto optionValueName = BossRush_GetSettingChoiceName(optionIndex, optionValue, language); auto translation = optionName + std::string(" - ") + optionValueName; SpeechSynthesizer::Instance->Speak(translation.c_str(), GetLanguageCode()); }); diff --git a/soh/soh/Extractor/Extract.cpp b/soh/soh/Extractor/Extract.cpp index 673afc8a6..4b4e31aa8 100644 --- a/soh/soh/Extractor/Extract.cpp +++ b/soh/soh/Extractor/Extract.cpp @@ -58,6 +58,9 @@ static constexpr uint32_t OOT_PAL_GC_DBG2 = 0x87121EFE; // 03-13-2002 build static constexpr uint32_t OOT_PAL_GC_MQ_DBG = 0x917D18F6; static constexpr uint32_t OOT_PAL_10 = 0xB044B569; static constexpr uint32_t OOT_PAL_11 = 0xB2055FBD; +static constexpr uint32_t OOT_NTSC_10 = 0xEC7011B7; +static constexpr uint32_t OOT_NTSC_11 = 0xD43DA81F; +static constexpr uint32_t OOT_NTSC_12 = 0x693BA2AE; static const std::unordered_map verMap = { { OOT_PAL_GC, "PAL Gamecube" }, @@ -67,10 +70,13 @@ static const std::unordered_map verMap = { { OOT_PAL_GC_MQ_DBG, "PAL MQ Debug" }, { OOT_PAL_10, "PAL N64 1.0" }, { OOT_PAL_11, "PAL N64 1.1" }, + { OOT_NTSC_10, "NTSC N64 1.0" }, + { OOT_NTSC_11, "NTSC N64 1.1" }, + { OOT_NTSC_12, "NTSC N64 1.2" }, }; // TODO only check the first 54MB of the rom. -static constexpr std::array goodCrcs = { +static constexpr std::array goodCrcs = { 0xfa8c0555, // MQ DBG 64MB (Original overdump) 0x8652ac4c, // MQ DBG 64MB 0x5B8A1EB7, // MQ DBG 64MB (Empty overdump) @@ -81,6 +87,12 @@ static constexpr std::array goodCrcs = { 0x7A2FAE68, // GC MQ PAL 0xFD9913B1, // N64 PAL 1.0 0xE033FBBA, // N64 PAL 1.1 + 0x460C938C, // N64 NTSC US 1.0 + 0xD0C76FA9, // N64 NTSC JP 1.0 + 0x3496EE47, // N64 NTSC US 1.1 + 0xA25D1262, // N64 NTSC JP 1.1 + 0x15736A58, // N64 NTSC US 1.2 + 0x83B8967D, // N64 NTSC JP 1.2 }; enum class ButtonId : int { @@ -508,6 +520,9 @@ bool Extractor::IsMasterQuest() const { case OOT_PAL_MQ: case OOT_PAL_GC_MQ_DBG: return true; + case OOT_NTSC_10: + case OOT_NTSC_11: + case OOT_NTSC_12: case OOT_PAL_10: case OOT_PAL_11: case OOT_PAL_GC: @@ -532,6 +547,12 @@ const char* Extractor::GetZapdVerStr() const { return "N64_PAL_10"; case OOT_PAL_11: return "N64_PAL_11"; + case OOT_NTSC_10: + return "N64_NTSC_10"; + case OOT_NTSC_11: + return "N64_NTSC_11"; + case OOT_NTSC_12: + return "N64_NTSC_12"; default: // We should never be in a state where this path happens. UNREACHABLE; diff --git a/soh/soh/ResourceManagerHelpers.cpp b/soh/soh/ResourceManagerHelpers.cpp index 2ab345861..39a04e022 100644 --- a/soh/soh/ResourceManagerHelpers.cpp +++ b/soh/soh/ResourceManagerHelpers.cpp @@ -70,6 +70,11 @@ extern "C" uint32_t ResourceMgr_GetGameRegion(int index) { } } +extern "C" char* _message_0xFFFC_nes; +extern "C" bool ResourceMgr_IsPalLoaded() { + return _message_0xFFFC_nes != NULL; +} + u32 IsSceneMasterQuest(s16 sceneNum) { u8 mqMode = CVarGetInteger(CVAR_GENERAL("BetterDebugWarpScreenMQMode"), WARP_MODE_OVERRIDE_OFF); if (mqMode == WARP_MODE_OVERRIDE_MQ_AS_VANILLA) { diff --git a/soh/soh/ResourceManagerHelpers.h b/soh/soh/ResourceManagerHelpers.h index 3b14188b7..955a0e134 100644 --- a/soh/soh/ResourceManagerHelpers.h +++ b/soh/soh/ResourceManagerHelpers.h @@ -27,6 +27,7 @@ extern "C" { uint32_t ResourceMgr_GetGameVersion(int index); uint32_t ResourceMgr_GetGamePlatform(int index); uint32_t ResourceMgr_GetGameRegion(int index); + bool ResourceMgr_IsPalLoaded(); void ResourceMgr_LoadDirectory(const char* resName); void ResourceMgr_UnloadResource(const char* resName); char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize); diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 55c7d204e..6bde466ea 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -8,6 +8,7 @@ #include "soh/util.h" #include "Enhancements/randomizer/hint.h" #include "Enhancements/randomizer/item.h" +#include "ResourceManagerHelpers.h" #include "z64.h" #include "cvar_prefixes.h" @@ -675,6 +676,7 @@ void SaveManager::InitMeta(int fileNum) { fileMetaInfo[fileNum].gsTokens = gSaveContext.inventory.gsTokens; fileMetaInfo[fileNum].isDoubleDefenseAcquired = gSaveContext.isDoubleDefenseAcquired; fileMetaInfo[fileNum].gregFound = Flags_GetRandomizerInf(RAND_INF_GREG_FOUND); + fileMetaInfo[fileNum].filenameLanguage = gSaveContext.ship.filenameLanguage; fileMetaInfo[fileNum].hasWallet = Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) || !IS_RANDO; fileMetaInfo[fileNum].defense = gSaveContext.inventory.defenseHearts; fileMetaInfo[fileNum].health = gSaveContext.health; @@ -717,8 +719,16 @@ void SaveManager::InitFileNormal() { gSaveContext.bgsDayCount = 0; gSaveContext.deaths = 0; - for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { - gSaveContext.playerName[i] = 0x3E; + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { + gSaveContext.playerName[i] = 0x3E; + } + gSaveContext.ship.filenameLanguage = NAME_LANGUAGE_PAL; + } else { // GAME_REGION_NTSC + for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { + gSaveContext.playerName[i] = 0xDF; + } + gSaveContext.ship.filenameLanguage = (gSaveContext.language == LANGUAGE_JPN) ? NAME_LANGUAGE_NTSC_JPN : NAME_LANGUAGE_NTSC_ENG; } gSaveContext.n64ddFlag = 0; gSaveContext.healthCapacity = 0x30; @@ -876,9 +886,18 @@ void SaveManager::InitFileDebug() { gSaveContext.bgsDayCount = 0; gSaveContext.deaths = 0; - static std::array sPlayerName = { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }; - for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { - gSaveContext.playerName[i] = sPlayerName[i]; + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + const static std::array sPlayerName = { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }; + for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { + gSaveContext.playerName[i] = sPlayerName[i]; + } + gSaveContext.ship.filenameLanguage = NAME_LANGUAGE_PAL; + } else { // GAME_REGION_NTSC + const static std::array sPlayerName = { 0xB6, 0xB3, 0xB8, 0xB5, 0xDF, 0xDF, 0xDF, 0xDF }; + for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { + gSaveContext.playerName[i] = sPlayerName[i]; + } + gSaveContext.ship.filenameLanguage = (gSaveContext.language == LANGUAGE_JPN) ? NAME_LANGUAGE_NTSC_JPN : NAME_LANGUAGE_NTSC_ENG; } gSaveContext.n64ddFlag = 0; gSaveContext.healthCapacity = 0xE0; @@ -979,9 +998,18 @@ void SaveManager::InitFileMaxed() { gSaveContext.bgsDayCount = 0; gSaveContext.deaths = 0; - static std::array sPlayerName = { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }; - for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { - gSaveContext.playerName[i] = sPlayerName[i]; + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + const static std::array sPlayerName = { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }; + for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { + gSaveContext.playerName[i] = sPlayerName[i]; + } + gSaveContext.ship.filenameLanguage = NAME_LANGUAGE_PAL; + } else { // GAME_REGION_NTSC + const static std::array sPlayerName = { 0xB6, 0xB3, 0xB8, 0xB5, 0xDF, 0xDF, 0xDF, 0xDF }; + for (int i = 0; i < ARRAY_COUNT(gSaveContext.playerName); i++) { + gSaveContext.playerName[i] = sPlayerName[i]; + } + gSaveContext.ship.filenameLanguage = (gSaveContext.language == LANGUAGE_JPN) ? NAME_LANGUAGE_NTSC_JPN : NAME_LANGUAGE_NTSC_ENG; } gSaveContext.n64ddFlag = 0; gSaveContext.healthCapacity = 0x140; @@ -2172,6 +2200,7 @@ void SaveManager::LoadBaseVersion4() { SaveManager::Instance->LoadData("tempCollectFlags", gSaveContext.ship.backupFW.tempCollectFlags); }); SaveManager::Instance->LoadData("dogParams", gSaveContext.dogParams); + SaveManager::Instance->LoadData("filenameLanguage", gSaveContext.ship.filenameLanguage); SaveManager::Instance->LoadData("maskMemory", gSaveContext.ship.maskMemory); } @@ -2342,6 +2371,7 @@ void SaveManager::SaveBase(SaveContext* saveContext, int sectionID, bool fullSav SaveManager::Instance->SaveData("tempCollectFlags", saveContext->ship.backupFW.tempCollectFlags); }); SaveManager::Instance->SaveData("dogParams", saveContext->dogParams); + SaveManager::Instance->SaveData("filenameLanguage", saveContext->ship.filenameLanguage); SaveManager::Instance->SaveData("maskMemory", saveContext->ship.maskMemory); } @@ -2449,6 +2479,7 @@ void SaveManager::CopyZeldaFile(int from, int to) { fileMetaInfo[to].buildVersionMajor = fileMetaInfo[from].buildVersionMajor; fileMetaInfo[to].buildVersionMinor = fileMetaInfo[from].buildVersionMinor; fileMetaInfo[to].buildVersionPatch = fileMetaInfo[from].buildVersionPatch; + fileMetaInfo[to].filenameLanguage = fileMetaInfo[from].filenameLanguage; SohUtils::CopyStringToCharArray(fileMetaInfo[to].buildVersion, fileMetaInfo[from].buildVersion, ARRAY_COUNT(fileMetaInfo[to].buildVersion)); } @@ -2609,17 +2640,17 @@ typedef struct { /* 0x13C8 */ s16 nayrusLoveTimer; /* 0x13CA */ char unk_13CA[0x0002]; /* 0x13CC */ s16 rupeeAccumulator; - /* 0x13CE */ s16 timer1State; - /* 0x13D0 */ s16 timer1Value; - /* 0x13D2 */ s16 timer2State; - /* 0x13D4 */ s16 timer2Value; + /* 0x13CE */ s16 timerState; + /* 0x13D0 */ s16 timerSeconds; + /* 0x13D2 */ s16 subTimerState; + /* 0x13D4 */ s16 subTimerSeconds; /* 0x13D6 */ s16 timerX[2]; /* 0x13DA */ s16 timerY[2]; /* 0x13DE */ char unk_13DE[0x0002]; /* 0x13E0 */ u8 seqId; /* 0x13E1 */ u8 natureAmbienceId; /* 0x13E2 */ u8 buttonStatus[5]; - /* 0x13E7 */ u8 unk_13E7; // alpha related + /* 0x13E7 */ u8 forceRisingButtonAlphas; // alpha related /* 0x13E8 */ u16 unk_13E8; // alpha type? /* 0x13EA */ u16 unk_13EA; // also alpha type? /* 0x13EC */ u16 unk_13EC; // alpha type counter? diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 1eb6ee87a..3c4a31243 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -7,7 +7,7 @@ typedef struct { u8 valid; u16 deaths; - char playerName[8]; + u8 playerName[8]; u16 healthCapacity; u32 questItems; s8 defense; @@ -29,10 +29,17 @@ typedef struct { s16 rupees; s16 gsTokens; u8 isDoubleDefenseAcquired; + s32 filenameLanguage; s32 gregFound; s32 hasWallet; } SaveFileMetaInfo; +typedef enum { + /* 0 */ NAME_LANGUAGE_PAL, + /* 1 */ NAME_LANGUAGE_NTSC_JPN, + /* 2 */ NAME_LANGUAGE_NTSC_ENG, +} FilenameLanguage; + #ifdef __cplusplus #include diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h index bb4fc7b0f..b8d6bf85f 100644 --- a/soh/soh/SohGui/SohMenu.h +++ b/soh/soh/SohGui/SohMenu.h @@ -212,6 +212,7 @@ class SohMenu : public Ship::Menu { void AddMenuDevTools(); void AddMenuRandomizer(); void AddMenuNetwork(); + static void UpdateLanguageMap(std::unordered_map& languageMap); private: char mGitCommitHashTruncated[8]; diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index fbb2a8378..50242e349 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -959,10 +959,10 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed")) .Options(CheckboxOptions().Tooltip( "Fixes Darunia's dancing speed so he dances to the beat of Saria's Song, like in the Original Game.")); - AddWidget(path, "Fix Credits Timing", WIDGET_CVAR_CHECKBOX) + AddWidget(path, "Fix Credits Timing (PAL)", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("CreditsFix")) .Options(CheckboxOptions().Tooltip( - "Extend certain credits scenes so the music lines up properly with the visuals.")); + "Extend certain credits scenes so the music lines up properly with the visuals. (PAL only)")); path.column = SECTION_COLUMN_3; AddWidget(path, "Graphical Restorations", WIDGET_SEPARATOR_TEXT); diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 12db748d1..e8d841a29 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -14,18 +14,18 @@ namespace SohGui { extern std::shared_ptr mSohMenu; using namespace UIWidgets; -static std::unordered_map languages = {{ LANGUAGE_ENG, "English" }, { LANGUAGE_GER, "German" }, { LANGUAGE_FRA, "French" }}; +static const std::unordered_map languages = {{ LANGUAGE_ENG, "English" }, { LANGUAGE_GER, "German" }, { LANGUAGE_FRA, "French" }, { LANGUAGE_JPN, "Japanese"}}; static std::unordered_map imguiScaleOptions = {{ 0, "Small" }, { 1, "Normal" }, { 2, "Large" }, { 3, "X-Large" }}; const char* GetGameVersionString(uint32_t index) { uint32_t gameVersion = ResourceMgr_GetGameVersion(index); switch (gameVersion) { case OOT_NTSC_US_10: - return "NTSC-U 1.0"; + return "NTSC 1.0"; case OOT_NTSC_US_11: - return "NTSC-U 1.1"; + return "NTSC 1.1"; case OOT_NTSC_US_12: - return "NTSC-U 1.2"; + return "NTSC 1.2"; case OOT_PAL_10: return "PAL 1.0"; case OOT_PAL_11: @@ -48,6 +48,28 @@ const char* GetGameVersionString(uint32_t index) { } } +#include "message_data_static.h" +extern "C" MessageTableEntry* sNesMessageEntryTablePtr; +extern "C" MessageTableEntry* sGerMessageEntryTablePtr; +extern "C" MessageTableEntry* sFraMessageEntryTablePtr; +extern "C" MessageTableEntry* sJpnMessageEntryTablePtr; + +static const std::array messageTables = { + &sNesMessageEntryTablePtr, &sGerMessageEntryTablePtr, &sFraMessageEntryTablePtr, &sJpnMessageEntryTablePtr +}; + +void SohMenu::UpdateLanguageMap(std::unordered_map& languageMap) { + for (int32_t i = LANGUAGE_ENG; i < LANGUAGE_MAX; i++) { + if (*messageTables.at(i) != NULL) { + if (!languageMap.contains(i)) { + languageMap.insert(std::make_pair(i, languages.at(i))); + } + } else { + languageMap.erase(i); + } + } +} + void SohMenu::AddMenuSettings() { // Add Settings Menu AddMenuEntry("Settings", CVAR_SETTING("Menu.SettingsSidebarSection")); @@ -127,8 +149,12 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Languages", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Translate Title Screen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SETTING("TitleScreenTranslation")); - AddWidget(path, "Menu Language", WIDGET_CVAR_COMBOBOX) + AddWidget(path, "Language", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("Languages")) + .PreFunc([](WidgetInfo& info) { + auto options = std::static_pointer_cast(info.options); + SohMenu::UpdateLanguageMap(options->comboMap); + }) .Options(ComboboxOptions().LabelPosition(LabelPositions::Far).ComponentAlignment(ComponentAlignments::Right).ComboMap(languages).DefaultIndex(LANGUAGE_ENG)); AddWidget(path, "Accessibility", WIDGET_SEPARATOR_TEXT); #if defined(_WIN32) || defined(__APPLE__) diff --git a/soh/soh/z_message_OTR.cpp b/soh/soh/z_message_OTR.cpp index 215975662..378561e60 100644 --- a/soh/soh/z_message_OTR.cpp +++ b/soh/soh/z_message_OTR.cpp @@ -12,6 +12,7 @@ extern "C" MessageTableEntry* sNesMessageEntryTablePtr; extern "C" MessageTableEntry* sGerMessageEntryTablePtr; extern "C" MessageTableEntry* sFraMessageEntryTablePtr; +extern "C" MessageTableEntry* sJpnMessageEntryTablePtr; extern "C" MessageTableEntry* sStaffMessageEntryTablePtr; //extern "C" MessageTableEntry* _message_0xFFFC_nes; @@ -51,45 +52,9 @@ MessageTableEntry* OTRMessage_LoadTable(const std::string& filePath, bool isNES) // Allocate room for an additional message // OTRTODO: Should not be malloc'ing here. It's fine for now since we check elsewhere that the message table is // already null. - MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * (file->messages.size() + 1)); + MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file->messages.size()); for (size_t i = 0; i < file->messages.size(); i++) { - // Look for Owl Text - if (file->messages[i].id == 0x2066) { - // Create a new message based on the Owl Text - uint32_t kaeporaMsgSize = file->messages[i].msg.size(); - // OTRTODO: Should not be malloc'ing here. It's fine for now since we check elsewhere that the message table - // is already null. - char* kaeporaOg = (char*)malloc(sizeof(char) * kaeporaMsgSize); - char* kaeporaPatch = (char*)malloc(sizeof(char) * kaeporaMsgSize); - file->messages[i].msg.copy(kaeporaOg, kaeporaMsgSize, 0); - file->messages[i].msg.copy(kaeporaPatch, kaeporaMsgSize, 0); - - size_t colorPos = file->messages[i].msg.find(QM_GREEN); - size_t newLinePos = colorPos + file->messages[i].msg.substr(colorPos + 1).find(CTRL_NEWLINE) + 1; - size_t endColorPos = newLinePos + file->messages[i].msg.substr(newLinePos).find(CTRL_COLOR); - size_t NoLength = newLinePos - (colorPos + 1); - size_t YesLength = endColorPos - (newLinePos + 1); - // Swap the order of yes and no in this new message - size_t yes = 0; - while (yes < YesLength) { - kaeporaPatch[colorPos + yes + 1] = kaeporaOg[newLinePos + yes + 1]; - yes++; - } - kaeporaPatch[colorPos + yes + 1] = CTRL_NEWLINE; - size_t no = 0; - while (no < NoLength) { - kaeporaPatch[colorPos + yes + 2 + no] = kaeporaOg[colorPos + 1 + no]; - no++; - } - - // load data into message - table[file->messages.size()].textId = 0x71B3; - table[file->messages.size()].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos; - table[file->messages.size()].segment = kaeporaPatch; - table[file->messages.size()].msgSize = kaeporaMsgSize; - } - SetMessageEntry(table[i], file->messages[i]); if (isNES && file->messages[i].id == 0xFFFC) @@ -117,6 +82,13 @@ extern "C" void OTRMessage_Init() if (sFraMessageEntryTablePtr == NULL) { sFraMessageEntryTablePtr = OTRMessage_LoadTable("text/fra_message_data_static/fra_message_data_static", false); } + if (sJpnMessageEntryTablePtr == NULL) { + sJpnMessageEntryTablePtr = OTRMessage_LoadTable("text/jpn_message_data_static/jpn_message_data_static", false); + } + // Note: Make sure this loads after PAL nes_message_data_static, so that message 0xFFFC is definitely loaded if it exists + if (sNesMessageEntryTablePtr == NULL) { + sNesMessageEntryTablePtr = OTRMessage_LoadTable("text/nes_message_data_static/ntsc_nes_message_data_static", false); + } if (sStaffMessageEntryTablePtr == NULL) { auto file2 = diff --git a/soh/src/code/game.c b/soh/src/code/game.c index 7e1db9c17..382d9595a 100644 --- a/soh/src/code/game.c +++ b/soh/src/code/game.c @@ -6,6 +6,12 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ResourceManagerHelpers.h" +#include "message_data_static.h" +extern MessageTableEntry* sNesMessageEntryTablePtr; +extern MessageTableEntry* sGerMessageEntryTablePtr; +extern MessageTableEntry* sFraMessageEntryTablePtr; +extern MessageTableEntry* sJpnMessageEntryTablePtr; + SpeedMeter D_801664D0; VisCvg sVisCvg; VisZBuf sVisZBuf; @@ -339,6 +345,14 @@ void GameState_Update(GameState* gameState) { gSaveContext.language = CVarGetInteger(CVAR_SETTING("Languages"), LANGUAGE_ENG); + if (gSaveContext.language == LANGUAGE_JPN && sJpnMessageEntryTablePtr == NULL) { + gSaveContext.language = LANGUAGE_ENG; + } else if (gSaveContext.language == LANGUAGE_GER && sGerMessageEntryTablePtr == NULL) { + gSaveContext.language = LANGUAGE_ENG; + } else if (gSaveContext.language == LANGUAGE_FRA && sFraMessageEntryTablePtr == NULL) { + gSaveContext.language = LANGUAGE_ENG; + } + GameInteractor_ExecuteOnGameFrameUpdate(); gameState->frames++; } diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 6d5f9b3b6..5fb60c4e0 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -847,6 +847,10 @@ void TitleCard_InitBossName(PlayState* play, TitleCardContext* titleCtx, void* t newName[length - 6] = 'G'; newName[length - 5] = 'E'; newName[length - 4] = 'R'; + } else if (gSaveContext.language == LANGUAGE_JPN) { + newName[length - 6] = 'J'; + newName[length - 5] = 'P'; + newName[length - 4] = 'N'; } texture = newName; } @@ -1067,6 +1071,11 @@ void TitleCard_InitPlaceName(PlayState* play, TitleCardContext* titleCtx, void* newName[length - 6] = 'G'; newName[length - 5] = 'E'; newName[length - 4] = 'R'; + } + else if (gSaveContext.language == LANGUAGE_JPN) { + newName[length - 6] = 'J'; + newName[length - 5] = 'P'; + newName[length - 4] = 'N'; } texture = newName; } diff --git a/soh/src/code/z_construct.c b/soh/src/code/z_construct.c index 065c6f413..7fb2ff657 100644 --- a/soh/src/code/z_construct.c +++ b/soh/src/code/z_construct.c @@ -1,6 +1,7 @@ #include "global.h" #include #include +#include "soh/ResourceManagerHelpers.h" void func_80110990(PlayState* play) { Map_Destroy(play); @@ -80,21 +81,21 @@ void func_801109B0(PlayState* play) { } } - osSyncPrintf("EVENT=%d\n", ((void)0, gSaveContext.timer1State)); + osSyncPrintf("EVENT=%d\n", ((void)0, gSaveContext.timerState)); - if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8) || (gSaveContext.timer2State == 4) || - (gSaveContext.timer2State == 10)) { + if ((gSaveContext.timerState == 4) || (gSaveContext.timerState == 8) || (gSaveContext.subTimerState == 4) || + (gSaveContext.subTimerState == 10)) { osSyncPrintf("restart_flag=%d\n", ((void)0, gSaveContext.respawnFlag)); if ((gSaveContext.respawnFlag == -1) || (gSaveContext.respawnFlag == 1)) { - if (gSaveContext.timer1State == 4) { - gSaveContext.timer1State = 1; + if (gSaveContext.timerState == 4) { + gSaveContext.timerState = 1; gSaveContext.timerX[0] = 140; gSaveContext.timerY[0] = 80; } } - if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8)) { + if ((gSaveContext.timerState == 4) || (gSaveContext.timerState == 8)) { temp = 0; } else { temp = 1; @@ -109,10 +110,10 @@ void func_801109B0(PlayState* play) { } } - if ((gSaveContext.timer1State >= 11) && (gSaveContext.timer1State < 16)) { - gSaveContext.timer1State = 0; + if ((gSaveContext.timerState >= 11) && (gSaveContext.timerState < 16)) { + gSaveContext.timerState = 0; // "Timer Stop!!!!!!!!!!!!!!!!!!!!!!" - osSyncPrintf("タイマー停止!!!!!!!!!!!!!!!!!!!!! = %d\n", gSaveContext.timer1State); + osSyncPrintf("タイマー停止!!!!!!!!!!!!!!!!!!!!! = %d\n", gSaveContext.timerState); } osSyncPrintf("PARAMETER領域=%x\n", parameterSize + 0x5300); // "Parameter Area = %x" @@ -157,7 +158,11 @@ void Message_Init(PlayState* play) { osSyncPrintf("吹き出しgame_alloc=%x\n", 0x2200); // "Textbox game_alloc=%x" assert(msgCtx->textboxSegment != NULL); - Font_LoadOrderedFont(&play->msgCtx.font); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + Font_LoadOrderedFont(&play->msgCtx.font); + } else { // GAME_REGION_NTSC + Font_LoadOrderedFontNTSC(&play->msgCtx.font); + } YREG(31) = 0; } diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c index c079d0064..d5b6e3a27 100644 --- a/soh/src/code/z_demo.c +++ b/soh/src/code/z_demo.c @@ -521,7 +521,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB } bool playCutscene = false; - if (!CVarGetInteger(CVAR_ENHANCEMENT("CreditsFix"), 1) && (cmd->startFrame == csCtx->frames)) { + if ((!CVarGetInteger(CVAR_ENHANCEMENT("CreditsFix"), 1) || ResourceMgr_GetGameRegion(0) == GAME_REGION_NTSC) && (cmd->startFrame == csCtx->frames)) { playCutscene = true; } else if (CVarGetInteger(CVAR_ENHANCEMENT("CreditsFix"), 1)) { u16 delay = 0; @@ -576,7 +576,7 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB osSyncPrintf("\n分岐先指定!!=[%d]番", cmd->base); // "Future fork designation=No. [%d]" if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (csCtx->frames != cmd->startFrame)) { - gSaveContext.unk_13E7 = 1; + gSaveContext.forceRisingButtonAlphas = 1; } gSaveContext.cutsceneIndex = 0; diff --git a/soh/src/code/z_game_over.c b/soh/src/code/z_game_over.c index 1850133aa..80974a9b9 100644 --- a/soh/src/code/z_game_over.c +++ b/soh/src/code/z_game_over.c @@ -31,8 +31,8 @@ void GameOver_Update(PlayState* play) { case GAMEOVER_DEATH_START: Message_CloseTextbox(play); - gSaveContext.timer1State = 0; - gSaveContext.timer2State = 0; + gSaveContext.timerState = 0; + gSaveContext.subTimerState = 0; gSaveContext.eventInf[1] &= ~1; // search inventory for spoiling items and revert if necessary @@ -77,7 +77,7 @@ void GameOver_Update(PlayState* play) { for (int buttonIndex = 0; buttonIndex < ARRAY_COUNT(gSaveContext.buttonStatus); buttonIndex++) { gSaveContext.buttonStatus[buttonIndex] = BTN_ENABLED; } - gSaveContext.unk_13E7 = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0; + gSaveContext.forceRisingButtonAlphas = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0; Environment_InitGameOverLights(play); gGameOverTimer = 20; diff --git a/soh/src/code/z_kanfont.c b/soh/src/code/z_kanfont.c index 217ef3c0a..b0b754b89 100644 --- a/soh/src/code/z_kanfont.c +++ b/soh/src/code/z_kanfont.c @@ -4,6 +4,7 @@ #include "message_data_static.h" #include "textures/nes_font_static/nes_font_static.h" +#include "textures/kanji/kanji.h" #include "textures/message_static/message_static.h" static const char* fntTbl[] = @@ -150,6 +151,3983 @@ static const char* fntTbl[] = gMsgCharABControlPadTex, }; +static const char* kanjiFontTbl[] = { + gMsgKanji8140SpaceTex, + gMsgKanji8141ToutenTex, + gMsgKanji8142KutenTex, + gMsgKanji8143CommaTex, + gMsgKanji8144PeriodTex, + gMsgKanji8145NakatenTex, + gMsgKanji8146ColonTex, + gMsgKanji8147SemicolonTex, + gMsgKanji8148QuestionMarkTex, + gMsgKanji8149ExclamationMarkTex, + gMsgKanji814ADakutenTex, + gMsgKanji814BHandakutenTex, + gMsgKanji814CAcuteAccentTex, + gMsgKanji814DGraveAccentTex, + gMsgKanji814EDiaeresisTex, + gMsgKanji814FCircumflexAccentTex, + gMsgKanji8150EmptyTex, + gMsgKanji8151EmptyTex, + gMsgKanji8152IchinojitenKatakanaTex, + gMsgKanji8153IchinojitenKatakanaDakutenTex, + gMsgKanji8154IchinojitenHiraganaTex, + gMsgKanji8155IchinojitenHiraganaDakutenTex, + gMsgKanji8156NonojitenTex, + gMsgKanji8157Tex, + gMsgKanji8158DounojitenTex, + gMsgKanji8159ShimeTex, + gMsgKanji815AZeroTex, + gMsgKanji815BChouonpuTex, + gMsgKanji815CDashTex, + gMsgKanji815DHyphenTex, + gMsgKanji815ESlashTex, + gMsgKanji815FBackSlashTex, + gMsgKanji8160WaveDashTex, + gMsgKanji8161DoubleVerticalLineTex, + gMsgKanji8162VerticalLineTex, + gMsgKanji8163SantenLeaderTex, + gMsgKanji8164NitenLeaderTex, + gMsgKanji8165SingleQuotationMarkLeftTex, + gMsgKanji8166SingleQuotationMarkRightTex, + gMsgKanji8167DoubleQuotationMarkLeftTex, + gMsgKanji8168DoubleQuotationMarkRightTex, + gMsgKanji8169ParenthesesLeftTex, + gMsgKanji816AParenthesesRightTex, + gMsgKanji816BKikkoukakkoLeftTex, + gMsgKanji816CKikkoukakkoRightTex, + gMsgKanji816DSquareBracketLeftTex, + gMsgKanji816ESquareBracketRightTex, + gMsgKanji816FCurlyBracketLeftTex, + gMsgKanji8170CurlyBracketRightTex, + gMsgKanji8171YamakakkoLeftTex, + gMsgKanji8172YamakakkoRightTex, + gMsgKanji8173NijyuuyamakakkoLeftTex, + gMsgKanji8174NijyuuyamakakkoRightTex, + gMsgKanji8175KagikakkoLeftTex, + gMsgKanji8176KagikakkoRightTex, + gMsgKanji8177NijyuukagikakkoLeftTex, + gMsgKanji8178NijyuukagikakkoRightTex, + gMsgKanji8179SumitsukikakkoLeftTex, + gMsgKanji817ASumitsukikakkoRightTex, + gMsgKanji817BPlusSignTex, + gMsgKanji817CMinusSignTex, + gMsgKanji817DPlusMinusSignTex, + gMsgKanji817EMultiplicationSignTex, + gMsgKanji8180DivisionSignTex, + gMsgKanji8181EqualsSignTex, + gMsgKanji8182NotEqualSignTex, + gMsgKanji8183LessThanSignTex, + gMsgKanji8184GreaterThanSignTex, + gMsgKanji8185LessThanOrEqualToTex, + gMsgKanji8186GreaterThanOrEqualToTex, + gMsgKanji8187InfinityTex, + gMsgKanji8188ThereforeTex, + gMsgKanji8189MaleTex, + gMsgKanji818AFemaleTex, + gMsgKanji818BDegreeSignTex, + gMsgKanji818CPrimeTex, + gMsgKanji818DDoublePrimeTex, + gMsgKanji818ECelciusTex, + gMsgKanji818FYenSignTex, + gMsgKanji8190DollarSignTex, + gMsgKanji8191CentSignTex, + gMsgKanji8192PoundSignTex, + gMsgKanji8193PercentSignTex, + gMsgKanji8194NumberSignTex, + gMsgKanji8195AmpersandTex, + gMsgKanji8196AsteriskTex, + gMsgKanji8197AtSignTex, + gMsgKanji8198SectionSignTex, + gMsgKanji8199WhiteStarTex, + gMsgKanji819ABlackStarTex, + gMsgKanji819BWhiteCircleTex, + gMsgKanji819CBlackCircleTex, + gMsgKanji819DDoubleCircleTex, + gMsgKanji819EWhiteDiamondTex, + gMsgKanji819FBlackDiamondTex, + gMsgKanji81A0WhiteSquareTex, + gMsgKanji81A1BlackSquareTex, + gMsgKanji81A2WhiteTriangleTex, + gMsgKanji81A3BlackTriangleTex, + gMsgKanji81A4WhiteInvertedTriangleTex, + gMsgKanji81A5BlackInvertedTriangleTex, + gMsgKanji81A6KomejirushiTex, + gMsgKanji81A7PostalMarkTex, + gMsgKanji81A8ArrowRightTex, + gMsgKanji81A9ArrowLeftTex, + gMsgKanji81AAArrowUpTex, + gMsgKanji81ABArrowDownTex, + gMsgKanji81ACGetaTex, + gMsgKanji81B8EmptyTex, + gMsgKanji81B9EmptyTex, + gMsgKanji81BAEmptyTex, + gMsgKanji81BBEmptyTex, + gMsgKanji81BCEmptyTex, + gMsgKanji81BDEmptyTex, + gMsgKanji81BEEmptyTex, + gMsgKanji81BFIntersectionTex, + gMsgKanji81C8EmptyTex, + gMsgKanji81C9EmptyTex, + gMsgKanji81CAEmptyTex, + gMsgKanji81CBEmptyTex, + gMsgKanji81CCEmptyTex, + gMsgKanji81CDEmptyTex, + gMsgKanji81CEEmptyTex, + gMsgKanji81DBEmptyTex, + gMsgKanji81DCEmptyTex, + gMsgKanji81DDEmptyTex, + gMsgKanji81DEEmptyTex, + gMsgKanji81DFEmptyTex, + gMsgKanji81E0ApproximatelyEqualToTex, + gMsgKanji81E1MuchLessThanTex, + gMsgKanji81E2MuchGreaterThanTex, + gMsgKanji81E3SquareRootTex, + gMsgKanji81E4SimilarTex, + gMsgKanji81E5ProportionalTex, + gMsgKanji81E6BecauseTex, + gMsgKanji81E7IntegralTex, + gMsgKanji81E8DoubleIntegralTex, + gMsgKanji81F0EmptyTex, + gMsgKanji81F1EmptyTex, + gMsgKanji81F2EmptyTex, + gMsgKanji81F3EmptyTex, + gMsgKanji81F4EmptyTex, + gMsgKanji81F5EmptyTex, + gMsgKanji81F6EmptyTex, + gMsgKanji81F7EmptyTex, + gMsgKanji81FCEmptyTex, + gMsgKanji824FZeroTex, + gMsgKanji8250OneTex, + gMsgKanji8251TwoTex, + gMsgKanji8252ThreeTex, + gMsgKanji8253FourTex, + gMsgKanji8254FiveTex, + gMsgKanji8255SixTex, + gMsgKanji8256SevenTex, + gMsgKanji8257EightTex, + gMsgKanji8258NineTex, + gMsgKanji8260CapitalATex, + gMsgKanji8261CapitalBTex, + gMsgKanji8262CapitalCTex, + gMsgKanji8263CapitalDTex, + gMsgKanji8264CapitalETex, + gMsgKanji8265CapitalFTex, + gMsgKanji8266CapitalGTex, + gMsgKanji8267CapitalHTex, + gMsgKanji8268CapitalITex, + gMsgKanji8269CapitalJTex, + gMsgKanji826ACapitalKTex, + gMsgKanji826BCapitalLTex, + gMsgKanji826CCapitalMTex, + gMsgKanji826DCapitalNTex, + gMsgKanji826ECapitalOTex, + gMsgKanji826FCapitalPTex, + gMsgKanji8270CapitalQTex, + gMsgKanji8271CapitalRTex, + gMsgKanji8272CapitalSTex, + gMsgKanji8273CapitalTTex, + gMsgKanji8274CapitalUTex, + gMsgKanji8275CapitalVTex, + gMsgKanji8276CapitalWTex, + gMsgKanji8277CapitalXTex, + gMsgKanji8278CapitalYTex, + gMsgKanji8279CapitalZTex, + gMsgKanji8281LowercaseATex, + gMsgKanji8282LowercaseBTex, + gMsgKanji8283LowercaseCTex, + gMsgKanji8284LowercaseDTex, + gMsgKanji8285LowercaseETex, + gMsgKanji8286LowercaseFTex, + gMsgKanji8287LowercaseGTex, + gMsgKanji8288LowercaseHTex, + gMsgKanji8289LowercaseITex, + gMsgKanji828ALowercaseJTex, + gMsgKanji828BLowercaseKTex, + gMsgKanji828CLowercaseLTex, + gMsgKanji828DLowercaseMTex, + gMsgKanji828ELowercaseNTex, + gMsgKanji828FLowercaseOTex, + gMsgKanji8290LowercasePTex, + gMsgKanji8291LowercaseQTex, + gMsgKanji8292LowercaseRTex, + gMsgKanji8293LowercaseSTex, + gMsgKanji8294LowercaseTTex, + gMsgKanji8295LowercaseUTex, + gMsgKanji8296LowercaseVTex, + gMsgKanji8297LowercaseWTex, + gMsgKanji8298LowercaseXTex, + gMsgKanji8299LowercaseYTex, + gMsgKanji829ALowercaseZTex, + gMsgKanji829FHiraganaSmallATex, + gMsgKanji82A0HiraganaATex, + gMsgKanji82A1HiraganaSmallITex, + gMsgKanji82A2HiraganaITex, + gMsgKanji82A3HiraganaSmallUTex, + gMsgKanji82A4HiraganaUTex, + gMsgKanji82A5HiraganaSmallETex, + gMsgKanji82A6HiraganaETex, + gMsgKanji82A7HiraganaSmallOTex, + gMsgKanji82A8HiraganaOTex, + gMsgKanji82A9HiraganaKaTex, + gMsgKanji82AAHiraganaGaTex, + gMsgKanji82ABHiraganaKiTex, + gMsgKanji82ACHiraganaGiTex, + gMsgKanji82ADHiraganaKuTex, + gMsgKanji82AEHiraganaGuTex, + gMsgKanji82AFHiraganaKeTex, + gMsgKanji82B0HiraganaGeTex, + gMsgKanji82B1HiraganaKoTex, + gMsgKanji82B2HiraganaGoTex, + gMsgKanji82B3HiraganaSaTex, + gMsgKanji82B4HiraganaZaTex, + gMsgKanji82B5HiraganaShiTex, + gMsgKanji82B6HiraganaJiTex, + gMsgKanji82B7HiraganaSuTex, + gMsgKanji82B8HiraganaZuTex, + gMsgKanji82B9HiraganaSeTex, + gMsgKanji82BAHiraganaZeTex, + gMsgKanji82BBHiraganaSoTex, + gMsgKanji82BCHiraganaZoTex, + gMsgKanji82BDHiraganaTaTex, + gMsgKanji82BEHiraganaDaTex, + gMsgKanji82BFHiraganaChiTex, + gMsgKanji82C0HiraganaDiTex, + gMsgKanji82C1HiraganaSmallTsuTex, + gMsgKanji82C2HiraganaTsuTex, + gMsgKanji82C3HiraganaDuTex, + gMsgKanji82C4HiraganaTeTex, + gMsgKanji82C5HiraganaDeTex, + gMsgKanji82C6HiraganaToTex, + gMsgKanji82C7HiraganaDoTex, + gMsgKanji82C8HiraganaNaTex, + gMsgKanji82C9HiraganaNiTex, + gMsgKanji82CAHiraganaNuTex, + gMsgKanji82CBHiraganaNeTex, + gMsgKanji82CCHiraganaNoTex, + gMsgKanji82CDHiraganaHaTex, + gMsgKanji82CEHiraganaBaTex, + gMsgKanji82CFHiraganaPaTex, + gMsgKanji82D0HiraganaHiTex, + gMsgKanji82D1HiraganaBiTex, + gMsgKanji82D2HiraganaPiTex, + gMsgKanji82D3HiraganaFuTex, + gMsgKanji82D4HiraganaBuTex, + gMsgKanji82D5HiraganaPuTex, + gMsgKanji82D6HiraganaHeTex, + gMsgKanji82D7HiraganaBeTex, + gMsgKanji82D8HiraganaPeTex, + gMsgKanji82D9HiraganaHoTex, + gMsgKanji82DAHiraganaBoTex, + gMsgKanji82DBHiraganaPoTex, + gMsgKanji82DCHiraganaMaTex, + gMsgKanji82DDHiraganaMiTex, + gMsgKanji82DEHiraganaMuTex, + gMsgKanji82DFHiraganaMeTex, + gMsgKanji82E0HiraganaMoTex, + gMsgKanji82E1HiraganaSmallYaTex, + gMsgKanji82E2HiraganaYaTex, + gMsgKanji82E3HiraganaSmallYuTex, + gMsgKanji82E4HiraganaYuTex, + gMsgKanji82E5HiraganaSmallYoTex, + gMsgKanji82E6HiraganaYoTex, + gMsgKanji82E7HiraganaRaTex, + gMsgKanji82E8HiraganaRiTex, + gMsgKanji82E9HiraganaRuTex, + gMsgKanji82EAHiraganaReTex, + gMsgKanji82EBHiraganaRoTex, + gMsgKanji82ECHiraganaSmallWaTex, + gMsgKanji82EDHiraganaWaTex, + gMsgKanji82EEHiraganaWiTex, + gMsgKanji82EFHiraganaWeTex, + gMsgKanji82F0HiraganaWoTex, + gMsgKanji82F1HiraganaNTex, + gMsgKanji82F2EmptyTex, + gMsgKanji8340KatakanaSmallATex, + gMsgKanji8341KatakanaATex, + gMsgKanji8342KatakanaSmallITex, + gMsgKanji8343KatakanaITex, + gMsgKanji8344KatakanaSmallUTex, + gMsgKanji8345KatakanaUTex, + gMsgKanji8346KatakanaSmallETex, + gMsgKanji8347KatakanaETex, + gMsgKanji8348KatakanaSmallOTex, + gMsgKanji8349KatakanaOTex, + gMsgKanji834AKatakanaKaTex, + gMsgKanji834BKatakanaGaTex, + gMsgKanji834CKatakanaKiTex, + gMsgKanji834DKatakanaGiTex, + gMsgKanji834EKatakanaKuTex, + gMsgKanji834FKatakanaGuTex, + gMsgKanji8350KatakanaKeTex, + gMsgKanji8351KatakanaGeTex, + gMsgKanji8352KatakanaKoTex, + gMsgKanji8353KatakanaGoTex, + gMsgKanji8354KatakanaSaTex, + gMsgKanji8355KatakanaZaTex, + gMsgKanji8356KatakanaShiTex, + gMsgKanji8357KatakanaJiTex, + gMsgKanji8358KatakanaSuTex, + gMsgKanji8359KatakanaZuTex, + gMsgKanji835AKatakanaSeTex, + gMsgKanji835BKatakanaZeTex, + gMsgKanji835CKatakanaSoTex, + gMsgKanji835DKatakanaZoTex, + gMsgKanji835EKatakanaTaTex, + gMsgKanji835FKatakanaDaTex, + gMsgKanji8360KatakanaChiTex, + gMsgKanji8361KatakanaDiTex, + gMsgKanji8362KatakanaSmallTsuTex, + gMsgKanji8363KatakanaTsuTex, + gMsgKanji8364KatakanaDuTex, + gMsgKanji8365KatakanaTeTex, + gMsgKanji8366KatakanaDeTex, + gMsgKanji8367KatakanaToTex, + gMsgKanji8368KatakanaDoTex, + gMsgKanji8369KatakanaNaTex, + gMsgKanji836AKatakanaNiTex, + gMsgKanji836BKatakanaNuTex, + gMsgKanji836CKatakanaNeTex, + gMsgKanji836DKatakanaNoTex, + gMsgKanji836EKatakanaHaTex, + gMsgKanji836FKatakanaBaTex, + gMsgKanji8370KatakanaPaTex, + gMsgKanji8371KatakanaHiTex, + gMsgKanji8372KatakanaBiTex, + gMsgKanji8373KatakanaPiTex, + gMsgKanji8374KatakanaFuTex, + gMsgKanji8375KatakanaBuTex, + gMsgKanji8376KatakanaPuTex, + gMsgKanji8377KatakanaHeTex, + gMsgKanji8378KatakanaBeTex, + gMsgKanji8379KatakanaPeTex, + gMsgKanji837AKatakanaHoTex, + gMsgKanji837BKatakanaBoTex, + gMsgKanji837CKatakanaPoTex, + gMsgKanji837DKatakanaMaTex, + gMsgKanji837EKatakanaMiTex, + gMsgKanji8380KatakanaMuTex, + gMsgKanji8381KatakanaMeTex, + gMsgKanji8382KatakanaMoTex, + gMsgKanji8383KatakanaSmallYaTex, + gMsgKanji8384KatakanaYaTex, + gMsgKanji8385KatakanaSmallYuTex, + gMsgKanji8386KatakanaYuTex, + gMsgKanji8387KatakanaSmallYoTex, + gMsgKanji8388KatakanaYoTex, + gMsgKanji8389KatakanaRaTex, + gMsgKanji838AKatakanaRiTex, + gMsgKanji838BKatakanaRuTex, + gMsgKanji838CKatakanaReTex, + gMsgKanji838DKatakanaRoTex, + gMsgKanji838EKatakanaSmallWaTex, + gMsgKanji838FKatakanaWaTex, + gMsgKanji8390KatakanaWiTex, + gMsgKanji8391KatakanaWeTex, + gMsgKanji8392KatakanaWoTex, + gMsgKanji8393KatakanaNTex, + gMsgKanji8394KatakanaVuTex, + gMsgKanji8395KatakanaSmallKaTex, + gMsgKanji8396KatakanaSmallKeTex, + gMsgKanji839FButtonATex, + gMsgKanji83A0ButtonBTex, + gMsgKanji83A1ButtonCTex, + gMsgKanji83A2ButtonLTex, + gMsgKanji83A3ButtonRTex, + gMsgKanji83A4ButtonZTex, + gMsgKanji83A5ButtonCUpTex, + gMsgKanji83A6ButtonCDownTex, + gMsgKanji83A7ButtonCLeftTex, + gMsgKanji83A8ButtonCRightTex, + gMsgKanji83A9ZTargetSignTex, + gMsgKanji83AAControlStickTex, + gMsgKanji83ABGreekCapitalNuTex, + gMsgKanji83ACGreekCapitalXiTex, + gMsgKanji83ADGreekCapitalOmicronTex, + gMsgKanji83AEGreekCapitalPiTex, + gMsgKanji83AFGreekCapitalRhoTex, + gMsgKanji83B0GreekCapitalSigmaTex, + gMsgKanji83B1GreekCapitalTauTex, + gMsgKanji83B2GreekCapitalUpsilonTex, + gMsgKanji83B3GreekCapitalPhiTex, + gMsgKanji83B4GreekCapitalChiTex, + gMsgKanji83B5GreekCapitalPsiTex, + gMsgKanji83B6GreekCapitalOmegaTex, + gMsgKanji83BFGreekLowercaseAlphaTex, + gMsgKanji83C0GreekLowercaseBetaTex, + gMsgKanji83C1GreekLowercaseGammaTex, + gMsgKanji83C2GreekLowercaseDeltaTex, + gMsgKanji83C3GreekLowercaseEpsilonTex, + gMsgKanji83C4GreekLowercaseZetaTex, + gMsgKanji83C5GreekLowercaseEtaTex, + gMsgKanji83C6GreekLowercaseThetaTex, + gMsgKanji83C7GreekLowercaseIotaTex, + gMsgKanji83C8GreekLowercaseKappaTex, + gMsgKanji83C9GreekLowercaseLamdaTex, + gMsgKanji83CAGreekLowercaseMuTex, + gMsgKanji83CBGreekLowercaseNuTex, + gMsgKanji83CCGreekLowercaseXiTex, + gMsgKanji83CDGreekLowercaseOmicronTex, + gMsgKanji83CEGreekLowercasePiTex, + gMsgKanji83CFGreekLowercaseRhoTex, + gMsgKanji83D0GreekLowercaseSigmaTex, + gMsgKanji83D1GreekLowercaseTauTex, + gMsgKanji83D2GreekLowercaseUpsilonTex, + gMsgKanji83D3GreekLowercasePhiTex, + gMsgKanji83D4GreekLowercaseChiTex, + gMsgKanji83D5GreekLowercasePsiTex, + gMsgKanji83D6GreekLowercaseOmegaTex, + gMsgKanji83D7EmptyTex, + gMsgKanji8440HylianATex, + gMsgKanji8441HylianITex, + gMsgKanji8442HylianUTex, + gMsgKanji8443HylianETex, + gMsgKanji8444HylianOTex, + gMsgKanji8445HylianKaTex, + gMsgKanji8446HylianKiTex, + gMsgKanji8447HylianKuTex, + gMsgKanji8448HylianKeTex, + gMsgKanji8449HylianKoTex, + gMsgKanji844AHylianSaTex, + gMsgKanji844BHylianShiTex, + gMsgKanji844CHylianSuTex, + gMsgKanji844DHylianSeTex, + gMsgKanji844EHylianSoTex, + gMsgKanji844FHylianTaTex, + gMsgKanji8450HylianChiTex, + gMsgKanji8451HylianTsuTex, + gMsgKanji8452HylianTeTex, + gMsgKanji8453HylianToTex, + gMsgKanji8454HylianNaTex, + gMsgKanji8455HylianNiTex, + gMsgKanji8456HylianNuTex, + gMsgKanji8457HylianNeTex, + gMsgKanji8458HylianNoTex, + gMsgKanji8459HylianHaTex, + gMsgKanji845AHylianHiTex, + gMsgKanji845BHylianFuTex, + gMsgKanji845CHylianHeTex, + gMsgKanji845DHylianHoTex, + gMsgKanji845EHylianMaTex, + gMsgKanji845FHylianMiTex, + gMsgKanji8460HylianMuTex, + gMsgKanji8470HylianMeTex, + gMsgKanji8471HylianMoTex, + gMsgKanji8472HylianYaTex, + gMsgKanji8473HylianYuTex, + gMsgKanji8474HylianYoTex, + gMsgKanji8475HylianRaTex, + gMsgKanji8476HylianRiTex, + gMsgKanji8477HylianRuTex, + gMsgKanji8478HylianReTex, + gMsgKanji8479HylianRoTex, + gMsgKanji847AHylianWaTex, + gMsgKanji847BHylianWoTex, + gMsgKanji847CHylianNTex, + gMsgKanji847DHylianToutenTex, + gMsgKanji847EHylianKutenTex, + gMsgKanji8480CyrillicLowercaseOTex, + gMsgKanji8481CyrillicLowercasePeTex, + gMsgKanji8482CyrillicLowercaseErTex, + gMsgKanji8483CyrillicLowercaseEsTex, + gMsgKanji8484CyrillicLowercaseTeTex, + gMsgKanji8485CyrillicLowercaseUTex, + gMsgKanji8486CyrillicLowercaseEfTex, + gMsgKanji8487CyrillicLowercaseHaTex, + gMsgKanji8488CyrillicLowercaseTseTex, + gMsgKanji8489CyrillicLowercaseCheTex, + gMsgKanji848ACyrillicLowercaseShaTex, + gMsgKanji848BCyrillicLowercaseShchaTex, + gMsgKanji848CCyrillicLowercaseHardSignTex, + gMsgKanji848DCyrillicLowercaseYeruTex, + gMsgKanji848ECyrillicLowercaseSoftSignTex, + gMsgKanji848FCyrillicLowercaseETex, + gMsgKanji8490CyrillicLowercaseYuTex, + gMsgKanji8491CyrillicLowercaseYaTex, + gMsgKanji849FBoxThinHorizontalTex, + gMsgKanji84A0BoxThinVerticalTex, + gMsgKanji84A1BoxThinTopLeftTex, + gMsgKanji84A2BoxThinTopRightTex, + gMsgKanji84A3BoxThinBottomRightTex, + gMsgKanji84A4BoxThinBottomLeftTex, + gMsgKanji84A5BoxThinLeftTex, + gMsgKanji84A6BoxThinTopTex, + gMsgKanji84A7BoxThinRightTex, + gMsgKanji84A8BoxThinBottomTex, + gMsgKanji84A9BoxThinCenterTex, + gMsgKanji84AABoxThickHorizontalTex, + gMsgKanji84ABBoxThickVerticalTex, + gMsgKanji84ACBoxThickTopLeftTex, + gMsgKanji84ADBoxThickTopRightTex, + gMsgKanji84AEBoxThickBottomRightTex, + gMsgKanji84AFBoxThickBottomLeftTex, + gMsgKanji84B0BoxThickLeftTex, + gMsgKanji84B1BoxThickTopTex, + gMsgKanji84B2BoxThickRightTex, + gMsgKanji84B3BoxThickBottomTex, + gMsgKanji84B4BoxThickCenterTex, + gMsgKanji84B5BoxVertThickHorizThinLeftTex, + gMsgKanji84B6BoxVertThinHorizThickTopTex, + gMsgKanji84B7BoxVertThickHorizThinRightTex, + gMsgKanji84B8BoxVertThinHorizThickBottomTex, + gMsgKanji84B9BoxVertThinHorizThickCenterTex, + gMsgKanji84BABoxVertThinHorizThickLeftTex, + gMsgKanji84BBBoxVertThickHorizThinTopTex, + gMsgKanji84BCBoxVertThinHorizThickRightTex, + gMsgKanji84BDBoxVertThickHorizThinBottomTex, + gMsgKanji84BEBoxVertThickHorizThinCenterTex, + gMsgKanji84BFEmptyTex, + gMsgKanji8540HalfwidthExclamationMarkTex, + gMsgKanji8541HalfwidthQuotationMarkTex, + gMsgKanji8542HalfwidthNumberSignTex, + gMsgKanji8543HalfwidthDollarSignTex, + gMsgKanji8544HalfwidthPercentSignTex, + gMsgKanji8545HalfwidthAmpersandTex, + gMsgKanji8546HalfwidthApostropheTex, + gMsgKanji8547HalfwidthParenthesesLeftTex, + gMsgKanji8548HalfwidthParenthesesRightTex, + gMsgKanji8549HalfwidthAsteriskTex, + gMsgKanji854AHalfwidthPlusSignTex, + gMsgKanji854BHalfwidthCommaTex, + gMsgKanji854CHalfwidthHyphenMinusTex, + gMsgKanji854DHalfwidthPeriodTex, + gMsgKanji854EHalfwidthSlashTex, + gMsgKanji854FHalfwidth0Tex, + gMsgKanji8550Halfwidth1Tex, + gMsgKanji8551Halfwidth2Tex, + gMsgKanji8552Halfwidth3Tex, + gMsgKanji8553Halfwidth4Tex, + gMsgKanji855EHalfwidthQuestionMarkTex, + gMsgKanji855FHalfwidthAtSignTex, + gMsgKanji8560HalfwidthCapitalATex, + gMsgKanji8561HalfwidthCapitalBTex, + gMsgKanji8562HalfwidthCapitalCTex, + gMsgKanji8563HalfwidthCapitalDTex, + gMsgKanji8564HalfwidthCapitalETex, + gMsgKanji8565HalfwidthCapitalFTex, + gMsgKanji8566HalfwidthCapitalGTex, + gMsgKanji8567HalfwidthCapitalHTex, + gMsgKanji8568HalfwidthCapitalITex, + gMsgKanji8569HalfwidthCapitalJTex, + gMsgKanji856AHalfwidthCapitalKTex, + gMsgKanji856BHalfwidthCapitalLTex, + gMsgKanji856CHalfwidthCapitalMTex, + gMsgKanji856DHalfwidthCapitalNTex, + gMsgKanji856EHalfwidthCapitalOTex, + gMsgKanji856FHalfwidthCapitalPTex, + gMsgKanji8570HalfwidthCapitalQTex, + gMsgKanji8571HalfwidthCapitalRTex, + gMsgKanji857CHalfwidthSquareBracketRightTex, + gMsgKanji857DHalfwidthCircumflexAccentTex, + gMsgKanji857EEmptyTex, + gMsgKanji8580HalfwidthGraveAccentTex, + gMsgKanji8581HalfwidthLowercaseATex, + gMsgKanji8582HalfwidthLowercaseBTex, + gMsgKanji8583HalfwidthLowercaseCTex, + gMsgKanji8584HalfwidthLowercaseDTex, + gMsgKanji8585HalfwidthLowercaseETex, + gMsgKanji8591HalfwidthLowercaseQTex, + gMsgKanji8592HalfwidthLowercaseRTex, + gMsgKanji8593HalfwidthLowercaseSTex, + gMsgKanji8594HalfwidthLowercaseTTex, + gMsgKanji8595HalfwidthLowercaseUTex, + gMsgKanji8596HalfwidthLowercaseVTex, + gMsgKanji8597HalfwidthLowercaseWTex, + gMsgKanji8598HalfwidthLowercaseXTex, + gMsgKanji8599HalfwidthLowercaseYTex, + gMsgKanji859AHalfwidthLowercaseZTex, + gMsgKanji859FHalfwidthKutenTex, + gMsgKanji85A0HalfwidthKagikakkoLeftTex, + gMsgKanji85A1HalfwidthKagikakkoRightTex, + gMsgKanji85A2HalfwidthToutenTex, + gMsgKanji85A3HalfwidthNakatenTex, + gMsgKanji85A4HalfwidthKatakanaWoTex, + gMsgKanji85A5HalfwidthKatakanaSmallATex, + gMsgKanji85A6HalfwidthKatakanaSmallITex, + gMsgKanji85A7HalfwidthKatakanaSmallUTex, + gMsgKanji85A8HalfwidthKatakanaSmallETex, + gMsgKanji85A9HalfwidthKatakanaSmallOTex, + gMsgKanji85AAHalfwidthKatakanaSmallYaTex, + gMsgKanji85ABHalfwidthKatakanaSmallYuTex, + gMsgKanji85ACHalfwidthKatakanaSmallYoTex, + gMsgKanji85ADHalfwidthKatakanaSmallTsuTex, + gMsgKanji85B3HalfwidthKatakanaOTex, + gMsgKanji85B4HalfwidthKatakanaKaTex, + gMsgKanji85B5HalfwidthKatakanaKiTex, + gMsgKanji85B6HalfwidthKatakanaKuTex, + gMsgKanji85B7HalfwidthKatakanaKeTex, + gMsgKanji85B8HalfwidthKatakanaKoTex, + gMsgKanji85B9HalfwidthKatakanaSaTex, + gMsgKanji85BAHalfwidthKatakanaShiTex, + gMsgKanji85BBHalfwidthKatakanaSuTex, + gMsgKanji85BCHalfwidthKatakanaSeTex, + gMsgKanji85BDHalfwidthKatakanaSoTex, + gMsgKanji85BEHalfwidthKatakanaTaTex, + gMsgKanji85BFHalfwidthKatakanaChiTex, + gMsgKanji85C0HalfwidthKatakanaTsuTex, + gMsgKanji85C1HalfwidthKatakanaTeTex, + gMsgKanji85DBHalfwidthKatakanaNTex, + gMsgKanji85DCHalfwidthDakutenTex, + gMsgKanji85DDHalfwidthHandakutenTex, + gMsgKanji85DEHalfwidthKatakanaWiTex, + gMsgKanji85DFHalfwidthKatakanaWeTex, + gMsgKanji85E0HalfwidthKatakanaSmallWaTex, + gMsgKanji85E1HalfwidthKatakanaSmallKaTex, + gMsgKanji85E2HalfwidthKatakanaSmallKeTex, + gMsgKanji85E3HalfwidthKatakanaVuTex, + gMsgKanji85E4HalfwidthKatakanaGaTex, + gMsgKanji85E5HalfwidthKatakanaGiTex, + gMsgKanji85E6HalfwidthKatakanaGuTex, + gMsgKanji85E7HalfwidthKatakanaGeTex, + gMsgKanji85E8HalfwidthKatakanaGoTex, + gMsgKanji85E9HalfwidthKatakanaZaTex, + gMsgKanji85EAHalfwidthKatakanaJiTex, + gMsgKanji85EBHalfwidthKatakanaZuTex, + gMsgKanji85ECHalfwidthKatakanaZeTex, + gMsgKanji85EDHalfwidthKatakanaZoTex, + gMsgKanji85EEHalfwidthKatakanaDaTex, + gMsgKanji85EFHalfwidthKatakanaDiTex, + gMsgKanji85F0HalfwidthKatakanaDuTex, + gMsgKanji85F1HalfwidthKatakanaDeTex, + gMsgKanji85F2HalfwidthKatakanaDoTex, + gMsgKanji85F3HalfwidthKatakanaBaTex, + gMsgKanji85F4HalfwidthKatakanaPaTex, + gMsgKanji85F5HalfwidthKatakanaBiTex, + gMsgKanji8640EmptyTex, + gMsgKanji8641TategakiToutenTex, + gMsgKanji8642TategakiKutenTex, + gMsgKanji8643HalfwidthHorizontalThinTex, + gMsgKanji8644HalfwidthHorizontalThickTex, + gMsgKanji8645HalfwidthVerticalThinTex, + gMsgKanji8646HalfwidthVerticalThickTex, + gMsgKanji8647HalfwidthHorizontalThinDottedTex, + gMsgKanji8648HalfwidthHorizontalThickDottedTex, + gMsgKanji8649HalfwidthVerticalThinDottedTex, + gMsgKanji864AHalfwidthVerticalThickDottedTex, + gMsgKanji864BHalfwidthHorizontalThinDotted2Tex, + gMsgKanji864CHalfwidthHorizontalThickDotted2Tex, + gMsgKanji864DHalfwidthVerticalThinDotted2Tex, + gMsgKanji864EHalfwidthVerticalThickDotted2Tex, + gMsgKanji864FHalfwidthBoxThinTopLeftTex, + gMsgKanji8650VerticalFarRightTex, + gMsgKanji8651VerticalFarLeftTex, + gMsgKanji8652HalfwidthBoxThickTopLeftTex, + gMsgKanji8653HalfwidthBoxThinTopRightTex, + gMsgKanji8654HalfwidthBoxVertThinHorizThickTopRightTex, + gMsgKanji8655HalfwidthBoxVertThickHorizThinTopRightTex, + gMsgKanji8656HalfwidthBoxThickTopRightTex, + gMsgKanji8657HalfwidthBoxThinBottomLeftTex, + gMsgKanji8658HalfwidthBoxVertThinHorizThickBottomLeftTex, + gMsgKanji8659HalfwidthBoxVertThickHorizThinBottomLeftTex, + gMsgKanji865AHalfwidthBoxThickBottomLeftTex, + gMsgKanji865BTategakiChouonpuTex, + gMsgKanji865CTategakiDashTex, + gMsgKanji865DTategakiHyphenTex, + gMsgKanji869BHalfwidthNijyuukagikakkoRightTex, + gMsgKanji869CHalfwidthSumitsukikakkoLeftTex, + gMsgKanji869DHalfwidthSumitsukikakkoRightTex, + gMsgKanji869EHalfwidthHyphenTex, + gMsgKanji869FEmptyTex, + gMsgKanji86A0EmptyTex, + gMsgKanji86A1EmptyTex, + gMsgKanji86A2EmptyTex, + gMsgKanji86A3EmptyTex, + gMsgKanji86A4EmptyTex, + gMsgKanji86A5EmptyTex, + gMsgKanji86A6EmptyTex, + gMsgKanji86B3BoxVertThinHorizThickTopRightTex, + gMsgKanji86B4BoxVertThickHorizThinTopRightTex, + gMsgKanji86B5BoxThickTopRightTex, + gMsgKanji86C7BoxVertThinHorizThickRightTex, + gMsgKanji86C8BoxTopThickBottomThinHorizThinRightTex, + gMsgKanji86C9BoxTopThinBottomThickHorizThinRightTex, + gMsgKanji86CABoxVertThickHorizThinRightTex, + gMsgKanji86CBBoxTopThickBottomThinHorizThickRightTex, + gMsgKanji86CCBoxTopThinBottomThickHorizThickRightTex, + gMsgKanji86CDBoxThickRightTex, + gMsgKanji86CEBoxThinTopTex, + gMsgKanji86CFBoxVertThinLeftThickRightThinTopTex, + gMsgKanji86D0BoxVertThinLeftThinRightThickTopTex, + gMsgKanji86D1BoxVertThinHorizThickTopTex, + gMsgKanji86D2BoxVertThickHorizThinTopTex, + gMsgKanji86D3BoxVertThickLeftThickRightThinTopTex, + gMsgKanji86D4BoxVertThickLeftThinRightThickTopTex, + gMsgKanji86D5BoxThickTopTex, + gMsgKanji86D6BoxThinBottomTex, + gMsgKanji86D7BoxVertThinLeftThickRightThinBottomTex, + gMsgKanji8740Circled1Tex, + gMsgKanji8741Circled2Tex, + gMsgKanji8742Circled3Tex, + gMsgKanji8743Circled4Tex, + gMsgKanji8744Circled5Tex, + gMsgKanji8745Circled6Tex, + gMsgKanji8746Circled7Tex, + gMsgKanji8747Circled8Tex, + gMsgKanji8748Circled9Tex, + gMsgKanji8749Circled10Tex, + gMsgKanji874ACircled11Tex, + gMsgKanji874BCircled12Tex, + gMsgKanji874CCircled13Tex, + gMsgKanji874DCircled14Tex, + gMsgKanji874ECircled15Tex, + gMsgKanji874FCircled16Tex, + gMsgKanji8750Circled17Tex, + gMsgKanji8751Circled18Tex, + gMsgKanji8752Circled19Tex, + gMsgKanji8753Circled20Tex, + gMsgKanji8754RomanNumeral1Tex, + gMsgKanji8755RomanNumeral2Tex, + gMsgKanji8756RomanNumeral3Tex, + gMsgKanji8757RomanNumeral4Tex, + gMsgKanji8758RomanNumeral5Tex, + gMsgKanji8791IdenticalToTex, + gMsgKanji8792IntegralTex, + gMsgKanji8793CountourIntegralTex, + gMsgKanji8794SummationTex, + gMsgKanji8795SquareRootTex, + gMsgKanji8796PerpendicularSymbolTex, + gMsgKanji8797AngleTex, + gMsgKanji8798RightAngleTex, + gMsgKanji8799RightTriangleTex, + gMsgKanji879ABecauseTex, + gMsgKanji879BIntersectionTex, + gMsgKanji879CUnionTex, + gMsgKanji879DEmptyTex, + gMsgKanji879EEmptyTex, + gMsgKanji879FHiraganaSmallATex, + gMsgKanji87A0EmptyTex, + gMsgKanji87A1EmptyTex, + gMsgKanji87A2EmptyTex, + gMsgKanji87A3EmptyTex, + gMsgKanji87A4EmptyTex, + gMsgKanji87A5EmptyTex, + gMsgKanji87A6EmptyTex, + gMsgKanji87A7EmptyTex, + gMsgKanji87A8EmptyTex, + gMsgKanji87A9EmptyTex, + gMsgKanji87AAEmptyTex, + gMsgKanji87ABEmptyTex, + gMsgKanji87ACEmptyTex, + gMsgKanji87ADEmptyTex, + gMsgKanji87AEEmptyTex, + gMsgKanji87AFEmptyTex, + gMsgKanji87B0EmptyTex, + gMsgKanji87B1EmptyTex, + gMsgKanji87B2EmptyTex, + gMsgKanji87B3EmptyTex, + gMsgKanji87B4EmptyTex, + gMsgKanji87B5EmptyTex, + gMsgKanji87BDEmptyTex, + gMsgKanji87BEEmptyTex, + gMsgKanji87BFEmptyTex, + gMsgKanji87C0EmptyTex, + gMsgKanji87C1EmptyTex, + gMsgKanji87E5EmptyTex, + gMsgKanji87E6EmptyTex, + gMsgKanji87E7EmptyTex, + gMsgKanji87E8EmptyTex, + gMsgKanji87FAEmptyTex, + gMsgKanji87FBEmptyTex, + gMsgKanji87FCEmptyTex, + gMsgKanji8840KatakanaSmallATex, + gMsgKanji8841EmptyTex, + gMsgKanji8842EmptyTex, + gMsgKanji8843EmptyTex, + gMsgKanji8844EmptyTex, + gMsgKanji8845EmptyTex, + gMsgKanji8846EmptyTex, + gMsgKanji8847EmptyTex, + gMsgKanji8848EmptyTex, + gMsgKanji8849EmptyTex, + gMsgKanji884AEmptyTex, + gMsgKanji884BEmptyTex, + gMsgKanji884CEmptyTex, + gMsgKanji884DEmptyTex, + gMsgKanji884EEmptyTex, + gMsgKanji884FEmptyTex, + gMsgKanji8850EmptyTex, + gMsgKanji8851EmptyTex, + gMsgKanji8852EmptyTex, + gMsgKanji8853EmptyTex, + gMsgKanji8854EmptyTex, + gMsgKanji8855EmptyTex, + gMsgKanji8856EmptyTex, + gMsgKanji8857EmptyTex, + gMsgKanji8858EmptyTex, + gMsgKanji8859EmptyTex, + gMsgKanji885AEmptyTex, + gMsgKanji885BEmptyTex, + gMsgKanji885CEmptyTex, + gMsgKanji885DEmptyTex, + gMsgKanji885EEmptyTex, + gMsgKanji885FEmptyTex, + gMsgKanji8860EmptyTex, + gMsgKanji8861EmptyTex, + gMsgKanji8862EmptyTex, + gMsgKanji8863EmptyTex, + gMsgKanji8864EmptyTex, + gMsgKanji8865EmptyTex, + gMsgKanji8866EmptyTex, + gMsgKanji8867EmptyTex, + gMsgKanji8868EmptyTex, + gMsgKanji8869EmptyTex, + gMsgKanji886AEmptyTex, + gMsgKanji886BEmptyTex, + gMsgKanji886CEmptyTex, + gMsgKanji886DEmptyTex, + gMsgKanji886EEmptyTex, + gMsgKanji886FEmptyTex, + gMsgKanji8870EmptyTex, + gMsgKanji8871EmptyTex, + gMsgKanji8872EmptyTex, + gMsgKanji8873EmptyTex, + gMsgKanji8874EmptyTex, + gMsgKanji8875EmptyTex, + gMsgKanji8876EmptyTex, + gMsgKanji8877EmptyTex, + gMsgKanji8878EmptyTex, + gMsgKanji8879EmptyTex, + gMsgKanji887AEmptyTex, + gMsgKanji887BEmptyTex, + gMsgKanji887CEmptyTex, + gMsgKanji887DEmptyTex, + gMsgKanji887EEmptyTex, + gMsgKanji8880EmptyTex, + gMsgKanji8881EmptyTex, + gMsgKanji8882EmptyTex, + gMsgKanji8883EmptyTex, + gMsgKanji8884EmptyTex, + gMsgKanji8885EmptyTex, + gMsgKanji8886EmptyTex, + gMsgKanji8887EmptyTex, + gMsgKanji8888EmptyTex, + gMsgKanji8889EmptyTex, + gMsgKanji888AEmptyTex, + gMsgKanji888BEmptyTex, + gMsgKanji888CEmptyTex, + gMsgKanji888DEmptyTex, + gMsgKanji888EEmptyTex, + gMsgKanji888FEmptyTex, + gMsgKanji8890EmptyTex, + gMsgKanji8891EmptyTex, + gMsgKanji8892EmptyTex, + gMsgKanji8893EmptyTex, + gMsgKanji8894EmptyTex, + gMsgKanji8895EmptyTex, + gMsgKanji8896EmptyTex, + gMsgKanji8897EmptyTex, + gMsgKanji8898EmptyTex, + gMsgKanji8899EmptyTex, + gMsgKanji889AEmptyTex, + gMsgKanji889BEmptyTex, + gMsgKanji889CEmptyTex, + gMsgKanji889DEmptyTex, + gMsgKanji889EEmptyTex, + gMsgKanji889FTex, + gMsgKanji88A0Tex, + gMsgKanji88A1Tex, + gMsgKanji88A2Tex, + gMsgKanji88A3Tex, + gMsgKanji88A4Tex, + gMsgKanji88A5Tex, + gMsgKanji88A6Tex, + gMsgKanji88A7Tex, + gMsgKanji88A8Tex, + gMsgKanji88A9Tex, + gMsgKanji88AATex, + gMsgKanji88ABTex, + gMsgKanji88ACTex, + gMsgKanji88ADTex, + gMsgKanji88AETex, + gMsgKanji88AFTex, + gMsgKanji88B0Tex, + gMsgKanji88B1Tex, + gMsgKanji88B2Tex, + gMsgKanji88B3Tex, + gMsgKanji88B4Tex, + gMsgKanji88B5Tex, + gMsgKanji88B6Tex, + gMsgKanji88B7Tex, + gMsgKanji88B8Tex, + gMsgKanji88B9Tex, + gMsgKanji88BATex, + gMsgKanji88BBTex, + gMsgKanji88BCTex, + gMsgKanji88BDTex, + gMsgKanji88BETex, + gMsgKanji88BFTex, + gMsgKanji88C0Tex, + gMsgKanji88C1Tex, + gMsgKanji88C2Tex, + gMsgKanji88C3Tex, + gMsgKanji88C4Tex, + gMsgKanji88C5Tex, + gMsgKanji88C6Tex, + gMsgKanji88C7Tex, + gMsgKanji88C8Tex, + gMsgKanji88C9Tex, + gMsgKanji88CATex, + gMsgKanji88CBTex, + gMsgKanji88CCTex, + gMsgKanji88CDTex, + gMsgKanji88CETex, + gMsgKanji88CFTex, + gMsgKanji88D0Tex, + gMsgKanji88D1Tex, + gMsgKanji88D2Tex, + gMsgKanji88D3Tex, + gMsgKanji88D4Tex, + gMsgKanji88D5Tex, + gMsgKanji88D6Tex, + gMsgKanji88D7Tex, + gMsgKanji88D8Tex, + gMsgKanji88D9Tex, + gMsgKanji88DATex, + gMsgKanji88DBTex, + gMsgKanji88DCTex, + gMsgKanji88DDTex, + gMsgKanji88DETex, + gMsgKanji88DFTex, + gMsgKanji88E0Tex, + gMsgKanji88E1Tex, + gMsgKanji88E2Tex, + gMsgKanji88E3Tex, + gMsgKanji88E4Tex, + gMsgKanji88E5Tex, + gMsgKanji88E6Tex, + gMsgKanji88E7Tex, + gMsgKanji88E8Tex, + gMsgKanji88E9Tex, + gMsgKanji88EATex, + gMsgKanji88EBTex, + gMsgKanji88ECTex, + gMsgKanji88EDTex, + gMsgKanji88EETex, + gMsgKanji88EFTex, + gMsgKanji88F0Tex, + gMsgKanji88F1Tex, + gMsgKanji88F2Tex, + gMsgKanji88F3Tex, + gMsgKanji88F4Tex, + gMsgKanji88F5Tex, + gMsgKanji88F6Tex, + gMsgKanji88F7Tex, + gMsgKanji88F8Tex, + gMsgKanji88F9Tex, + gMsgKanji88FATex, + gMsgKanji88FBTex, + gMsgKanji88FCTex, + gMsgKanji8940Tex, + gMsgKanji8941Tex, + gMsgKanji8942Tex, + gMsgKanji8943Tex, + gMsgKanji8944Tex, + gMsgKanji8945Tex, + gMsgKanji8946Tex, + gMsgKanji8947Tex, + gMsgKanji8948Tex, + gMsgKanji8949Tex, + gMsgKanji894ATex, + gMsgKanji894BTex, + gMsgKanji894CTex, + gMsgKanji894DTex, + gMsgKanji894ETex, + gMsgKanji894FTex, + gMsgKanji8950Tex, + gMsgKanji8951Tex, + gMsgKanji8952Tex, + gMsgKanji8953Tex, + gMsgKanji8954Tex, + gMsgKanji8955Tex, + gMsgKanji8956Tex, + gMsgKanji8957Tex, + gMsgKanji8958Tex, + gMsgKanji8959Tex, + gMsgKanji895ATex, + gMsgKanji895BTex, + gMsgKanji895CTex, + gMsgKanji895DTex, + gMsgKanji895ETex, + gMsgKanji895FTex, + gMsgKanji8960Tex, + gMsgKanji8961Tex, + gMsgKanji8962Tex, + gMsgKanji8963Tex, + gMsgKanji8964Tex, + gMsgKanji8965Tex, + gMsgKanji8966Tex, + gMsgKanji8967Tex, + gMsgKanji8968Tex, + gMsgKanji8969Tex, + gMsgKanji896ATex, + gMsgKanji896BTex, + gMsgKanji896CTex, + gMsgKanji896DTex, + gMsgKanji896ETex, + gMsgKanji896FTex, + gMsgKanji8970Tex, + gMsgKanji8971Tex, + gMsgKanji8972Tex, + gMsgKanji8973Tex, + gMsgKanji8974Tex, + gMsgKanji8975Tex, + gMsgKanji8976Tex, + gMsgKanji8977Tex, + gMsgKanji8978Tex, + gMsgKanji8979Tex, + gMsgKanji897ATex, + gMsgKanji897BTex, + gMsgKanji897CTex, + gMsgKanji897DTex, + gMsgKanji897ETex, + gMsgKanji8980Tex, + gMsgKanji8981Tex, + gMsgKanji8982Tex, + gMsgKanji8983Tex, + gMsgKanji8984Tex, + gMsgKanji8985Tex, + gMsgKanji8986Tex, + gMsgKanji8987Tex, + gMsgKanji8988Tex, + gMsgKanji8989Tex, + gMsgKanji898ATex, + gMsgKanji898BTex, + gMsgKanji898CTex, + gMsgKanji898DTex, + gMsgKanji898ETex, + gMsgKanji898FTex, + gMsgKanji8990Tex, + gMsgKanji8991Tex, + gMsgKanji8992Tex, + gMsgKanji8993Tex, + gMsgKanji8994Tex, + gMsgKanji8995Tex, + gMsgKanji8996Tex, + gMsgKanji8997Tex, + gMsgKanji8998Tex, + gMsgKanji8999Tex, + gMsgKanji899ATex, + gMsgKanji899BTex, + gMsgKanji899CTex, + gMsgKanji899DTex, + gMsgKanji899ETex, + gMsgKanji899FTex, + gMsgKanji89A0Tex, + gMsgKanji89A1Tex, + gMsgKanji89A2Tex, + gMsgKanji89A3Tex, + gMsgKanji89A4Tex, + gMsgKanji89A5Tex, + gMsgKanji89A6Tex, + gMsgKanji89A7Tex, + gMsgKanji89A8Tex, + gMsgKanji89A9Tex, + gMsgKanji89AATex, + gMsgKanji89ABTex, + gMsgKanji89ACTex, + gMsgKanji89ADTex, + gMsgKanji89AETex, + gMsgKanji89AFTex, + gMsgKanji89B0Tex, + gMsgKanji89B1Tex, + gMsgKanji89B2Tex, + gMsgKanji89B3Tex, + gMsgKanji89B4Tex, + gMsgKanji89B5Tex, + gMsgKanji89B6Tex, + gMsgKanji89B7Tex, + gMsgKanji89B8Tex, + gMsgKanji89B9Tex, + gMsgKanji89BATex, + gMsgKanji89BBTex, + gMsgKanji89BCTex, + gMsgKanji89BDTex, + gMsgKanji89BETex, + gMsgKanji89BFTex, + gMsgKanji89C0Tex, + gMsgKanji89C1Tex, + gMsgKanji89C2Tex, + gMsgKanji89C3Tex, + gMsgKanji89C4Tex, + gMsgKanji89C5Tex, + gMsgKanji89C6Tex, + gMsgKanji89C7Tex, + gMsgKanji89C8Tex, + gMsgKanji89C9Tex, + gMsgKanji89CATex, + gMsgKanji89CBTex, + gMsgKanji89CCTex, + gMsgKanji89CDTex, + gMsgKanji89CETex, + gMsgKanji89CFTex, + gMsgKanji89D0Tex, + gMsgKanji89D1Tex, + gMsgKanji89D2Tex, + gMsgKanji89D3Tex, + gMsgKanji89D4Tex, + gMsgKanji89D5Tex, + gMsgKanji89D6Tex, + gMsgKanji89D7Tex, + gMsgKanji89D8Tex, + gMsgKanji89D9Tex, + gMsgKanji89DATex, + gMsgKanji89DBTex, + gMsgKanji89DCTex, + gMsgKanji89DDTex, + gMsgKanji89DETex, + gMsgKanji89DFTex, + gMsgKanji89E0Tex, + gMsgKanji89E1Tex, + gMsgKanji89E2Tex, + gMsgKanji89E3Tex, + gMsgKanji89E4Tex, + gMsgKanji89E5Tex, + gMsgKanji89E6Tex, + gMsgKanji89E7Tex, + gMsgKanji89E8Tex, + gMsgKanji89E9Tex, + gMsgKanji89EATex, + gMsgKanji89EBTex, + gMsgKanji89ECTex, + gMsgKanji89EDTex, + gMsgKanji89EETex, + gMsgKanji89EFTex, + gMsgKanji89F0Tex, + gMsgKanji89F1Tex, + gMsgKanji89F2Tex, + gMsgKanji89F3Tex, + gMsgKanji89F4Tex, + gMsgKanji89F5Tex, + gMsgKanji89F6Tex, + gMsgKanji89F7Tex, + gMsgKanji89F8Tex, + gMsgKanji89F9Tex, + gMsgKanji89FATex, + gMsgKanji89FBTex, + gMsgKanji89FCTex, + gMsgKanji8A40Tex, + gMsgKanji8A41Tex, + gMsgKanji8A42Tex, + gMsgKanji8A43Tex, + gMsgKanji8A44Tex, + gMsgKanji8A45Tex, + gMsgKanji8A46Tex, + gMsgKanji8A47Tex, + gMsgKanji8A48Tex, + gMsgKanji8A49Tex, + gMsgKanji8A4ATex, + gMsgKanji8A4BTex, + gMsgKanji8A4CTex, + gMsgKanji8A4DTex, + gMsgKanji8A4ETex, + gMsgKanji8A4FTex, + gMsgKanji8A50Tex, + gMsgKanji8A51Tex, + gMsgKanji8A52Tex, + gMsgKanji8A53Tex, + gMsgKanji8A54Tex, + gMsgKanji8A55Tex, + gMsgKanji8A56Tex, + gMsgKanji8A57Tex, + gMsgKanji8A58Tex, + gMsgKanji8A59Tex, + gMsgKanji8A5ATex, + gMsgKanji8A5BTex, + gMsgKanji8A5CTex, + gMsgKanji8A5DTex, + gMsgKanji8A5ETex, + gMsgKanji8A5FTex, + gMsgKanji8A60Tex, + gMsgKanji8A61Tex, + gMsgKanji8A62Tex, + gMsgKanji8A63Tex, + gMsgKanji8A64Tex, + gMsgKanji8A65Tex, + gMsgKanji8A66Tex, + gMsgKanji8A67Tex, + gMsgKanji8A68Tex, + gMsgKanji8A69Tex, + gMsgKanji8A6ATex, + gMsgKanji8A6BTex, + gMsgKanji8A6CTex, + gMsgKanji8A6DTex, + gMsgKanji8A6ETex, + gMsgKanji8A6FTex, + gMsgKanji8A70Tex, + gMsgKanji8A71Tex, + gMsgKanji8A72Tex, + gMsgKanji8A73Tex, + gMsgKanji8A74Tex, + gMsgKanji8A75Tex, + gMsgKanji8A76Tex, + gMsgKanji8A77Tex, + gMsgKanji8A78Tex, + gMsgKanji8A79Tex, + gMsgKanji8A7ATex, + gMsgKanji8A7BTex, + gMsgKanji8A7CTex, + gMsgKanji8A7DTex, + gMsgKanji8A7ETex, + gMsgKanji8A80Tex, + gMsgKanji8A81Tex, + gMsgKanji8A82Tex, + gMsgKanji8A83Tex, + gMsgKanji8A84Tex, + gMsgKanji8A85Tex, + gMsgKanji8A86Tex, + gMsgKanji8A87Tex, + gMsgKanji8A88Tex, + gMsgKanji8A89Tex, + gMsgKanji8A8ATex, + gMsgKanji8A8BTex, + gMsgKanji8A8CTex, + gMsgKanji8A8DTex, + gMsgKanji8A8ETex, + gMsgKanji8A8FTex, + gMsgKanji8A90Tex, + gMsgKanji8A91Tex, + gMsgKanji8A92Tex, + gMsgKanji8A93Tex, + gMsgKanji8A94Tex, + gMsgKanji8A95Tex, + gMsgKanji8A96Tex, + gMsgKanji8A97Tex, + gMsgKanji8A98Tex, + gMsgKanji8A99Tex, + gMsgKanji8A9ATex, + gMsgKanji8A9BTex, + gMsgKanji8A9CTex, + gMsgKanji8A9DTex, + gMsgKanji8A9ETex, + gMsgKanji8A9FTex, + gMsgKanji8AA0Tex, + gMsgKanji8AA1Tex, + gMsgKanji8AA2Tex, + gMsgKanji8AA3Tex, + gMsgKanji8AA4Tex, + gMsgKanji8AA5Tex, + gMsgKanji8AA6Tex, + gMsgKanji8AA7Tex, + gMsgKanji8AA8Tex, + gMsgKanji8AA9Tex, + gMsgKanji8AAATex, + gMsgKanji8AABTex, + gMsgKanji8AACTex, + gMsgKanji8AADTex, + gMsgKanji8AAETex, + gMsgKanji8AAFTex, + gMsgKanji8AB0Tex, + gMsgKanji8AB1Tex, + gMsgKanji8AB2Tex, + gMsgKanji8AB3Tex, + gMsgKanji8AB4Tex, + gMsgKanji8AB5Tex, + gMsgKanji8AB6Tex, + gMsgKanji8AB7Tex, + gMsgKanji8AB8Tex, + gMsgKanji8AB9Tex, + gMsgKanji8ABATex, + gMsgKanji8ABBTex, + gMsgKanji8ABCTex, + gMsgKanji8ABDTex, + gMsgKanji8ABETex, + gMsgKanji8ABFTex, + gMsgKanji8AC0Tex, + gMsgKanji8AC1Tex, + gMsgKanji8AC2Tex, + gMsgKanji8AC3Tex, + gMsgKanji8AC4Tex, + gMsgKanji8AC5Tex, + gMsgKanji8AC6Tex, + gMsgKanji8AC7Tex, + gMsgKanji8AC8Tex, + gMsgKanji8AC9Tex, + gMsgKanji8ACATex, + gMsgKanji8ACBTex, + gMsgKanji8ACCTex, + gMsgKanji8ACDTex, + gMsgKanji8ACETex, + gMsgKanji8ACFTex, + gMsgKanji8AD0Tex, + gMsgKanji8AD1Tex, + gMsgKanji8AD2Tex, + gMsgKanji8AD3Tex, + gMsgKanji8AD4Tex, + gMsgKanji8AD5Tex, + gMsgKanji8AD6Tex, + gMsgKanji8AD7Tex, + gMsgKanji8AD8Tex, + gMsgKanji8AD9Tex, + gMsgKanji8ADATex, + gMsgKanji8ADBTex, + gMsgKanji8ADCTex, + gMsgKanji8ADDTex, + gMsgKanji8ADETex, + gMsgKanji8ADFTex, + gMsgKanji8AE0Tex, + gMsgKanji8AE1Tex, + gMsgKanji8AE2Tex, + gMsgKanji8AE3Tex, + gMsgKanji8AE4Tex, + gMsgKanji8AE5Tex, + gMsgKanji8AE6Tex, + gMsgKanji8AE7Tex, + gMsgKanji8AE8Tex, + gMsgKanji8AE9Tex, + gMsgKanji8AEATex, + gMsgKanji8AEBTex, + gMsgKanji8AECTex, + gMsgKanji8AEDTex, + gMsgKanji8AEETex, + gMsgKanji8AEFTex, + gMsgKanji8AF0Tex, + gMsgKanji8AF1Tex, + gMsgKanji8AF2Tex, + gMsgKanji8AF3Tex, + gMsgKanji8AF4Tex, + gMsgKanji8AF5Tex, + gMsgKanji8AF6Tex, + gMsgKanji8AF7Tex, + gMsgKanji8AF8Tex, + gMsgKanji8AF9Tex, + gMsgKanji8AFATex, + gMsgKanji8AFBTex, + gMsgKanji8AFCTex, + gMsgKanji8B40Tex, + gMsgKanji8B41Tex, + gMsgKanji8B42Tex, + gMsgKanji8B43Tex, + gMsgKanji8B44Tex, + gMsgKanji8B45Tex, + gMsgKanji8B46Tex, + gMsgKanji8B47Tex, + gMsgKanji8B48Tex, + gMsgKanji8B49Tex, + gMsgKanji8B4ATex, + gMsgKanji8B4BTex, + gMsgKanji8B4CTex, + gMsgKanji8B4DTex, + gMsgKanji8B4ETex, + gMsgKanji8B4FTex, + gMsgKanji8B50Tex, + gMsgKanji8B51Tex, + gMsgKanji8B52Tex, + gMsgKanji8B53Tex, + gMsgKanji8B54Tex, + gMsgKanji8B55Tex, + gMsgKanji8B56Tex, + gMsgKanji8B57Tex, + gMsgKanji8B58Tex, + gMsgKanji8B59Tex, + gMsgKanji8B5ATex, + gMsgKanji8B5BTex, + gMsgKanji8B5CTex, + gMsgKanji8B5DTex, + gMsgKanji8B5ETex, + gMsgKanji8B5FTex, + gMsgKanji8B60Tex, + gMsgKanji8B61Tex, + gMsgKanji8B62Tex, + gMsgKanji8B63Tex, + gMsgKanji8B64Tex, + gMsgKanji8B65Tex, + gMsgKanji8B66Tex, + gMsgKanji8B67Tex, + gMsgKanji8B68Tex, + gMsgKanji8B69Tex, + gMsgKanji8B6ATex, + gMsgKanji8B6BTex, + gMsgKanji8B6CTex, + gMsgKanji8B6DTex, + gMsgKanji8B6ETex, + gMsgKanji8B6FTex, + gMsgKanji8B70Tex, + gMsgKanji8B71Tex, + gMsgKanji8B72Tex, + gMsgKanji8B73Tex, + gMsgKanji8B74Tex, + gMsgKanji8B75Tex, + gMsgKanji8B76Tex, + gMsgKanji8B77Tex, + gMsgKanji8B78Tex, + gMsgKanji8B79Tex, + gMsgKanji8B7ATex, + gMsgKanji8B7BTex, + gMsgKanji8B7CTex, + gMsgKanji8B7DTex, + gMsgKanji8B7ETex, + gMsgKanji8B80Tex, + gMsgKanji8B81Tex, + gMsgKanji8B82Tex, + gMsgKanji8B83Tex, + gMsgKanji8B84Tex, + gMsgKanji8B85Tex, + gMsgKanji8B86Tex, + gMsgKanji8B87Tex, + gMsgKanji8B88Tex, + gMsgKanji8B89Tex, + gMsgKanji8B8ATex, + gMsgKanji8B8BTex, + gMsgKanji8B8CTex, + gMsgKanji8B8DTex, + gMsgKanji8B8ETex, + gMsgKanji8B8FTex, + gMsgKanji8B90Tex, + gMsgKanji8B91Tex, + gMsgKanji8B92Tex, + gMsgKanji8B93Tex, + gMsgKanji8B94Tex, + gMsgKanji8B95Tex, + gMsgKanji8B96Tex, + gMsgKanji8B97Tex, + gMsgKanji8B98Tex, + gMsgKanji8B99Tex, + gMsgKanji8B9ATex, + gMsgKanji8B9BTex, + gMsgKanji8B9CTex, + gMsgKanji8B9DTex, + gMsgKanji8B9ETex, + gMsgKanji8B9FTex, + gMsgKanji8BA0Tex, + gMsgKanji8BA1Tex, + gMsgKanji8BA2Tex, + gMsgKanji8BA3Tex, + gMsgKanji8BA4Tex, + gMsgKanji8BA5Tex, + gMsgKanji8BA6Tex, + gMsgKanji8BA7Tex, + gMsgKanji8BA8Tex, + gMsgKanji8BA9Tex, + gMsgKanji8BAATex, + gMsgKanji8BABTex, + gMsgKanji8BACTex, + gMsgKanji8BADTex, + gMsgKanji8BAETex, + gMsgKanji8BAFTex, + gMsgKanji8BB0Tex, + gMsgKanji8BB1Tex, + gMsgKanji8BB2Tex, + gMsgKanji8BB3Tex, + gMsgKanji8BB4Tex, + gMsgKanji8BB5Tex, + gMsgKanji8BB6Tex, + gMsgKanji8BB7Tex, + gMsgKanji8BB8Tex, + gMsgKanji8BB9Tex, + gMsgKanji8BBATex, + gMsgKanji8BBBTex, + gMsgKanji8BBCTex, + gMsgKanji8BBDTex, + gMsgKanji8BBETex, + gMsgKanji8BBFTex, + gMsgKanji8BC0Tex, + gMsgKanji8BC1Tex, + gMsgKanji8BC2Tex, + gMsgKanji8BC3Tex, + gMsgKanji8BC4Tex, + gMsgKanji8BC5Tex, + gMsgKanji8BC6Tex, + gMsgKanji8BC7Tex, + gMsgKanji8BC8Tex, + gMsgKanji8BC9Tex, + gMsgKanji8BCATex, + gMsgKanji8BCBTex, + gMsgKanji8BCCTex, + gMsgKanji8BCDTex, + gMsgKanji8BCETex, + gMsgKanji8BCFTex, + gMsgKanji8BD0Tex, + gMsgKanji8BD1Tex, + gMsgKanji8BD2Tex, + gMsgKanji8BD3Tex, + gMsgKanji8BD4Tex, + gMsgKanji8BD5Tex, + gMsgKanji8BD6Tex, + gMsgKanji8BD7Tex, + gMsgKanji8BD8Tex, + gMsgKanji8BD9Tex, + gMsgKanji8BDATex, + gMsgKanji8BDBTex, + gMsgKanji8BDCTex, + gMsgKanji8BDDTex, + gMsgKanji8BDETex, + gMsgKanji8BDFTex, + gMsgKanji8BE0Tex, + gMsgKanji8BE1Tex, + gMsgKanji8BE2Tex, + gMsgKanji8BE3Tex, + gMsgKanji8BE4Tex, + gMsgKanji8BE5Tex, + gMsgKanji8BE6Tex, + gMsgKanji8BE7Tex, + gMsgKanji8BE8Tex, + gMsgKanji8BE9Tex, + gMsgKanji8BEATex, + gMsgKanji8BEBTex, + gMsgKanji8BECTex, + gMsgKanji8BEDTex, + gMsgKanji8BEETex, + gMsgKanji8BEFTex, + gMsgKanji8BF0Tex, + gMsgKanji8BF1Tex, + gMsgKanji8BF2Tex, + gMsgKanji8BF3Tex, + gMsgKanji8BF4Tex, + gMsgKanji8BF5Tex, + gMsgKanji8BF6Tex, + gMsgKanji8BF7Tex, + gMsgKanji8BF8Tex, + gMsgKanji8BF9Tex, + gMsgKanji8BFATex, + gMsgKanji8BFBTex, + gMsgKanji8BFCTex, + gMsgKanji8C40Tex, + gMsgKanji8C41Tex, + gMsgKanji8C42Tex, + gMsgKanji8C43Tex, + gMsgKanji8C44Tex, + gMsgKanji8C45Tex, + gMsgKanji8C46Tex, + gMsgKanji8C47Tex, + gMsgKanji8C48Tex, + gMsgKanji8C49Tex, + gMsgKanji8C4ATex, + gMsgKanji8C4BTex, + gMsgKanji8C4CTex, + gMsgKanji8C4DTex, + gMsgKanji8C4ETex, + gMsgKanji8C4FTex, + gMsgKanji8C50Tex, + gMsgKanji8C51Tex, + gMsgKanji8C52Tex, + gMsgKanji8C53Tex, + gMsgKanji8C54Tex, + gMsgKanji8C55Tex, + gMsgKanji8C56Tex, + gMsgKanji8C57Tex, + gMsgKanji8C58Tex, + gMsgKanji8C59Tex, + gMsgKanji8C5ATex, + gMsgKanji8C5BTex, + gMsgKanji8C5CTex, + gMsgKanji8C5DTex, + gMsgKanji8C5ETex, + gMsgKanji8C5FTex, + gMsgKanji8C60Tex, + gMsgKanji8C61Tex, + gMsgKanji8C62Tex, + gMsgKanji8C63Tex, + gMsgKanji8C64Tex, + gMsgKanji8C65Tex, + gMsgKanji8C66Tex, + gMsgKanji8C67Tex, + gMsgKanji8C68Tex, + gMsgKanji8C69Tex, + gMsgKanji8C6ATex, + gMsgKanji8C6BTex, + gMsgKanji8C6CTex, + gMsgKanji8C6DTex, + gMsgKanji8C6ETex, + gMsgKanji8C6FTex, + gMsgKanji8C70Tex, + gMsgKanji8C71Tex, + gMsgKanji8C72Tex, + gMsgKanji8C73Tex, + gMsgKanji8C74Tex, + gMsgKanji8C75Tex, + gMsgKanji8C76Tex, + gMsgKanji8C77Tex, + gMsgKanji8C78Tex, + gMsgKanji8C79Tex, + gMsgKanji8C7ATex, + gMsgKanji8C7BTex, + gMsgKanji8C7CTex, + gMsgKanji8C7DTex, + gMsgKanji8C7ETex, + gMsgKanji8C80Tex, + gMsgKanji8C81Tex, + gMsgKanji8C82Tex, + gMsgKanji8C83Tex, + gMsgKanji8C84Tex, + gMsgKanji8C85Tex, + gMsgKanji8C86Tex, + gMsgKanji8C87Tex, + gMsgKanji8C88Tex, + gMsgKanji8C89Tex, + gMsgKanji8C8ATex, + gMsgKanji8C8BTex, + gMsgKanji8C8CTex, + gMsgKanji8C8DTex, + gMsgKanji8C8ETex, + gMsgKanji8C8FTex, + gMsgKanji8C90Tex, + gMsgKanji8C91Tex, + gMsgKanji8C92Tex, + gMsgKanji8C93Tex, + gMsgKanji8C94Tex, + gMsgKanji8C95Tex, + gMsgKanji8C96Tex, + gMsgKanji8C97Tex, + gMsgKanji8C98Tex, + gMsgKanji8C99Tex, + gMsgKanji8C9ATex, + gMsgKanji8C9BTex, + gMsgKanji8C9CTex, + gMsgKanji8C9DTex, + gMsgKanji8C9ETex, + gMsgKanji8C9FTex, + gMsgKanji8CA0Tex, + gMsgKanji8CA1Tex, + gMsgKanji8CA2Tex, + gMsgKanji8CA3Tex, + gMsgKanji8CA4Tex, + gMsgKanji8CA5Tex, + gMsgKanji8CA6Tex, + gMsgKanji8CA7Tex, + gMsgKanji8CA8Tex, + gMsgKanji8CA9Tex, + gMsgKanji8CAATex, + gMsgKanji8CABTex, + gMsgKanji8CACTex, + gMsgKanji8CADTex, + gMsgKanji8CAETex, + gMsgKanji8CAFTex, + gMsgKanji8CB0Tex, + gMsgKanji8CB1Tex, + gMsgKanji8CB2Tex, + gMsgKanji8CB3Tex, + gMsgKanji8CB4Tex, + gMsgKanji8CB5Tex, + gMsgKanji8CB6Tex, + gMsgKanji8CB7Tex, + gMsgKanji8CB8Tex, + gMsgKanji8CB9Tex, + gMsgKanji8CBATex, + gMsgKanji8CBBTex, + gMsgKanji8CBCTex, + gMsgKanji8CBDTex, + gMsgKanji8CBETex, + gMsgKanji8CBFTex, + gMsgKanji8CC0Tex, + gMsgKanji8CC1Tex, + gMsgKanji8CC2Tex, + gMsgKanji8CC3Tex, + gMsgKanji8CC4Tex, + gMsgKanji8CC5Tex, + gMsgKanji8CC6Tex, + gMsgKanji8CC7Tex, + gMsgKanji8CC8Tex, + gMsgKanji8CC9Tex, + gMsgKanji8CCATex, + gMsgKanji8CCBTex, + gMsgKanji8CCCTex, + gMsgKanji8CCDTex, + gMsgKanji8CCETex, + gMsgKanji8CCFTex, + gMsgKanji8CD0Tex, + gMsgKanji8CD1Tex, + gMsgKanji8CD2Tex, + gMsgKanji8CD3Tex, + gMsgKanji8CD4Tex, + gMsgKanji8CD5Tex, + gMsgKanji8CD6Tex, + gMsgKanji8CD7Tex, + gMsgKanji8CD8Tex, + gMsgKanji8CD9Tex, + gMsgKanji8CDATex, + gMsgKanji8CDBTex, + gMsgKanji8CDCTex, + gMsgKanji8CDDTex, + gMsgKanji8CDETex, + gMsgKanji8CDFTex, + gMsgKanji8CE0Tex, + gMsgKanji8CE1Tex, + gMsgKanji8CE2Tex, + gMsgKanji8CE3Tex, + gMsgKanji8CE4Tex, + gMsgKanji8CE5Tex, + gMsgKanji8CE6Tex, + gMsgKanji8CE7Tex, + gMsgKanji8CE8Tex, + gMsgKanji8CE9Tex, + gMsgKanji8CEATex, + gMsgKanji8CEBTex, + gMsgKanji8CECTex, + gMsgKanji8CEDTex, + gMsgKanji8CEETex, + gMsgKanji8CEFTex, + gMsgKanji8CF0Tex, + gMsgKanji8CF1Tex, + gMsgKanji8CF2Tex, + gMsgKanji8CF3Tex, + gMsgKanji8CF4Tex, + gMsgKanji8CF5Tex, + gMsgKanji8CF6Tex, + gMsgKanji8CF7Tex, + gMsgKanji8CF8Tex, + gMsgKanji8CF9Tex, + gMsgKanji8CFATex, + gMsgKanji8CFBTex, + gMsgKanji8CFCTex, + gMsgKanji8D40Tex, + gMsgKanji8D41Tex, + gMsgKanji8D42Tex, + gMsgKanji8D43Tex, + gMsgKanji8D44Tex, + gMsgKanji8D45Tex, + gMsgKanji8D46Tex, + gMsgKanji8D47Tex, + gMsgKanji8D48Tex, + gMsgKanji8D49Tex, + gMsgKanji8D4ATex, + gMsgKanji8D4BTex, + gMsgKanji8D4CTex, + gMsgKanji8D4DTex, + gMsgKanji8D4ETex, + gMsgKanji8D4FTex, + gMsgKanji8D50Tex, + gMsgKanji8D51Tex, + gMsgKanji8D52Tex, + gMsgKanji8D53Tex, + gMsgKanji8D54Tex, + gMsgKanji8D55Tex, + gMsgKanji8D56Tex, + gMsgKanji8D57Tex, + gMsgKanji8D58Tex, + gMsgKanji8D59Tex, + gMsgKanji8D5ATex, + gMsgKanji8D5BTex, + gMsgKanji8D5CTex, + gMsgKanji8D5DTex, + gMsgKanji8D5ETex, + gMsgKanji8D5FTex, + gMsgKanji8D60Tex, + gMsgKanji8D61Tex, + gMsgKanji8D62Tex, + gMsgKanji8D63Tex, + gMsgKanji8D64Tex, + gMsgKanji8D65Tex, + gMsgKanji8D66Tex, + gMsgKanji8D67Tex, + gMsgKanji8D68Tex, + gMsgKanji8D69Tex, + gMsgKanji8D6ATex, + gMsgKanji8D6BTex, + gMsgKanji8D6CTex, + gMsgKanji8D6DTex, + gMsgKanji8D6ETex, + gMsgKanji8D6FTex, + gMsgKanji8D70Tex, + gMsgKanji8D71Tex, + gMsgKanji8D72Tex, + gMsgKanji8D73Tex, + gMsgKanji8D74Tex, + gMsgKanji8D75Tex, + gMsgKanji8D76Tex, + gMsgKanji8D77Tex, + gMsgKanji8D78Tex, + gMsgKanji8D79Tex, + gMsgKanji8D7ATex, + gMsgKanji8D7BTex, + gMsgKanji8D7CTex, + gMsgKanji8D7DTex, + gMsgKanji8D7ETex, + gMsgKanji8D80Tex, + gMsgKanji8D81Tex, + gMsgKanji8D82Tex, + gMsgKanji8D83Tex, + gMsgKanji8D84Tex, + gMsgKanji8D85Tex, + gMsgKanji8D86Tex, + gMsgKanji8D87Tex, + gMsgKanji8D88Tex, + gMsgKanji8D89Tex, + gMsgKanji8D8ATex, + gMsgKanji8D8BTex, + gMsgKanji8D8CTex, + gMsgKanji8D8DTex, + gMsgKanji8D8ETex, + gMsgKanji8D8FTex, + gMsgKanji8D90Tex, + gMsgKanji8D91Tex, + gMsgKanji8D92Tex, + gMsgKanji8D93Tex, + gMsgKanji8D94Tex, + gMsgKanji8D95Tex, + gMsgKanji8D96Tex, + gMsgKanji8D97Tex, + gMsgKanji8D98Tex, + gMsgKanji8D99Tex, + gMsgKanji8D9ATex, + gMsgKanji8D9BTex, + gMsgKanji8D9CTex, + gMsgKanji8D9DTex, + gMsgKanji8D9ETex, + gMsgKanji8D9FTex, + gMsgKanji8DA0Tex, + gMsgKanji8DA1Tex, + gMsgKanji8DA2Tex, + gMsgKanji8DA3Tex, + gMsgKanji8DA4Tex, + gMsgKanji8DA5Tex, + gMsgKanji8DA6Tex, + gMsgKanji8DA7Tex, + gMsgKanji8DA8Tex, + gMsgKanji8DA9Tex, + gMsgKanji8DAATex, + gMsgKanji8DABTex, + gMsgKanji8DACTex, + gMsgKanji8DADTex, + gMsgKanji8DAETex, + gMsgKanji8DAFTex, + gMsgKanji8DB0Tex, + gMsgKanji8DB1Tex, + gMsgKanji8DB2Tex, + gMsgKanji8DB3Tex, + gMsgKanji8DB4Tex, + gMsgKanji8DB5Tex, + gMsgKanji8DB6Tex, + gMsgKanji8DB7Tex, + gMsgKanji8DB8Tex, + gMsgKanji8DB9Tex, + gMsgKanji8DBATex, + gMsgKanji8DBBTex, + gMsgKanji8DBCTex, + gMsgKanji8DBDTex, + gMsgKanji8DBETex, + gMsgKanji8DBFTex, + gMsgKanji8DC0Tex, + gMsgKanji8DC1Tex, + gMsgKanji8DC2Tex, + gMsgKanji8DC3Tex, + gMsgKanji8DC4Tex, + gMsgKanji8DC5Tex, + gMsgKanji8DC6Tex, + gMsgKanji8DC7Tex, + gMsgKanji8DC8Tex, + gMsgKanji8DC9Tex, + gMsgKanji8DCATex, + gMsgKanji8DCBTex, + gMsgKanji8DCCTex, + gMsgKanji8DCDTex, + gMsgKanji8DCETex, + gMsgKanji8DCFTex, + gMsgKanji8DD0Tex, + gMsgKanji8DD1Tex, + gMsgKanji8DD2Tex, + gMsgKanji8DD3Tex, + gMsgKanji8DD4Tex, + gMsgKanji8DD5Tex, + gMsgKanji8DD6Tex, + gMsgKanji8DD7Tex, + gMsgKanji8DD8Tex, + gMsgKanji8DD9Tex, + gMsgKanji8DDATex, + gMsgKanji8DDBTex, + gMsgKanji8DDCTex, + gMsgKanji8DDDTex, + gMsgKanji8DDETex, + gMsgKanji8DDFTex, + gMsgKanji8DE0Tex, + gMsgKanji8DE1Tex, + gMsgKanji8DE2Tex, + gMsgKanji8DE3Tex, + gMsgKanji8DE4Tex, + gMsgKanji8DE5Tex, + gMsgKanji8DE6Tex, + gMsgKanji8DE7Tex, + gMsgKanji8DE8Tex, + gMsgKanji8DE9Tex, + gMsgKanji8DEATex, + gMsgKanji8DEBTex, + gMsgKanji8DECTex, + gMsgKanji8DEDTex, + gMsgKanji8DEETex, + gMsgKanji8DEFTex, + gMsgKanji8DF0Tex, + gMsgKanji8DF1Tex, + gMsgKanji8DF2Tex, + gMsgKanji8DF3Tex, + gMsgKanji8DF4Tex, + gMsgKanji8DF5Tex, + gMsgKanji8DF6Tex, + gMsgKanji8DF7Tex, + gMsgKanji8DF8Tex, + gMsgKanji8DF9Tex, + gMsgKanji8DFATex, + gMsgKanji8DFBTex, + gMsgKanji8DFCTex, + gMsgKanji8E40Tex, + gMsgKanji8E41Tex, + gMsgKanji8E42Tex, + gMsgKanji8E43Tex, + gMsgKanji8E44Tex, + gMsgKanji8E45Tex, + gMsgKanji8E46Tex, + gMsgKanji8E47Tex, + gMsgKanji8E48Tex, + gMsgKanji8E49Tex, + gMsgKanji8E4ATex, + gMsgKanji8E4BTex, + gMsgKanji8E4CTex, + gMsgKanji8E4DTex, + gMsgKanji8E4ETex, + gMsgKanji8E4FTex, + gMsgKanji8E50Tex, + gMsgKanji8E51Tex, + gMsgKanji8E52Tex, + gMsgKanji8E53Tex, + gMsgKanji8E54Tex, + gMsgKanji8E55Tex, + gMsgKanji8E56Tex, + gMsgKanji8E57Tex, + gMsgKanji8E58Tex, + gMsgKanji8E59Tex, + gMsgKanji8E5ATex, + gMsgKanji8E5BTex, + gMsgKanji8E5CTex, + gMsgKanji8E5DTex, + gMsgKanji8E5ETex, + gMsgKanji8E5FTex, + gMsgKanji8E60Tex, + gMsgKanji8E61Tex, + gMsgKanji8E62Tex, + gMsgKanji8E63Tex, + gMsgKanji8E64Tex, + gMsgKanji8E65Tex, + gMsgKanji8E66Tex, + gMsgKanji8E67Tex, + gMsgKanji8E68Tex, + gMsgKanji8E69Tex, + gMsgKanji8E6ATex, + gMsgKanji8E6BTex, + gMsgKanji8E6CTex, + gMsgKanji8E6DTex, + gMsgKanji8E6ETex, + gMsgKanji8E6FTex, + gMsgKanji8E70Tex, + gMsgKanji8E71Tex, + gMsgKanji8E72Tex, + gMsgKanji8E73Tex, + gMsgKanji8E74Tex, + gMsgKanji8E75Tex, + gMsgKanji8E76Tex, + gMsgKanji8E77Tex, + gMsgKanji8E78Tex, + gMsgKanji8E79Tex, + gMsgKanji8E7ATex, + gMsgKanji8E7BTex, + gMsgKanji8E7CTex, + gMsgKanji8E7DTex, + gMsgKanji8E7ETex, + gMsgKanji8E80Tex, + gMsgKanji8E81Tex, + gMsgKanji8E82Tex, + gMsgKanji8E83Tex, + gMsgKanji8E84Tex, + gMsgKanji8E85Tex, + gMsgKanji8E86Tex, + gMsgKanji8E87Tex, + gMsgKanji8E88Tex, + gMsgKanji8E89Tex, + gMsgKanji8E8ATex, + gMsgKanji8E8BTex, + gMsgKanji8E8CTex, + gMsgKanji8E8DTex, + gMsgKanji8E8ETex, + gMsgKanji8E8FTex, + gMsgKanji8E90Tex, + gMsgKanji8E91Tex, + gMsgKanji8E92Tex, + gMsgKanji8E93Tex, + gMsgKanji8E94Tex, + gMsgKanji8E95Tex, + gMsgKanji8E96Tex, + gMsgKanji8E97Tex, + gMsgKanji8E98Tex, + gMsgKanji8E99Tex, + gMsgKanji8E9ATex, + gMsgKanji8E9BTex, + gMsgKanji8E9CTex, + gMsgKanji8E9DTex, + gMsgKanji8E9ETex, + gMsgKanji8E9FTex, + gMsgKanji8EA0Tex, + gMsgKanji8EA1Tex, + gMsgKanji8EA2Tex, + gMsgKanji8EA3Tex, + gMsgKanji8EA4Tex, + gMsgKanji8EA5Tex, + gMsgKanji8EA6Tex, + gMsgKanji8EA7Tex, + gMsgKanji8EA8Tex, + gMsgKanji8EA9Tex, + gMsgKanji8EAATex, + gMsgKanji8EABTex, + gMsgKanji8EACTex, + gMsgKanji8EADTex, + gMsgKanji8EAETex, + gMsgKanji8EAFTex, + gMsgKanji8EB0Tex, + gMsgKanji8EB1Tex, + gMsgKanji8EB2Tex, + gMsgKanji8EB3Tex, + gMsgKanji8EB4Tex, + gMsgKanji8EB5Tex, + gMsgKanji8EB6Tex, + gMsgKanji8EB7Tex, + gMsgKanji8EB8Tex, + gMsgKanji8EB9Tex, + gMsgKanji8EBATex, + gMsgKanji8EBBTex, + gMsgKanji8EBCTex, + gMsgKanji8EBDTex, + gMsgKanji8EBETex, + gMsgKanji8EBFTex, + gMsgKanji8EC0Tex, + gMsgKanji8EC1Tex, + gMsgKanji8EC2Tex, + gMsgKanji8EC3Tex, + gMsgKanji8EC4Tex, + gMsgKanji8EC5Tex, + gMsgKanji8EC6Tex, + gMsgKanji8EC7Tex, + gMsgKanji8EC8Tex, + gMsgKanji8EC9Tex, + gMsgKanji8ECATex, + gMsgKanji8ECBTex, + gMsgKanji8ECCTex, + gMsgKanji8ECDTex, + gMsgKanji8ECETex, + gMsgKanji8ECFTex, + gMsgKanji8ED0Tex, + gMsgKanji8ED1Tex, + gMsgKanji8ED2Tex, + gMsgKanji8ED3Tex, + gMsgKanji8ED4Tex, + gMsgKanji8ED5Tex, + gMsgKanji8ED6Tex, + gMsgKanji8ED7Tex, + gMsgKanji8ED8Tex, + gMsgKanji8ED9Tex, + gMsgKanji8EDATex, + gMsgKanji8EDBTex, + gMsgKanji8EDCTex, + gMsgKanji8EDDTex, + gMsgKanji8EDETex, + gMsgKanji8EDFTex, + gMsgKanji8EE0Tex, + gMsgKanji8EE1Tex, + gMsgKanji8EE2Tex, + gMsgKanji8EE3Tex, + gMsgKanji8EE4Tex, + gMsgKanji8EE5Tex, + gMsgKanji8EE6Tex, + gMsgKanji8EE7Tex, + gMsgKanji8EE8Tex, + gMsgKanji8EE9Tex, + gMsgKanji8EEATex, + gMsgKanji8EEBTex, + gMsgKanji8EECTex, + gMsgKanji8EEDTex, + gMsgKanji8EEETex, + gMsgKanji8EEFTex, + gMsgKanji8EF0Tex, + gMsgKanji8EF1Tex, + gMsgKanji8EF2Tex, + gMsgKanji8EF3Tex, + gMsgKanji8EF4Tex, + gMsgKanji8EF5Tex, + gMsgKanji8EF6Tex, + gMsgKanji8EF7Tex, + gMsgKanji8EF8Tex, + gMsgKanji8EF9Tex, + gMsgKanji8EFATex, + gMsgKanji8EFBTex, + gMsgKanji8EFCTex, + gMsgKanji8F40Tex, + gMsgKanji8F41Tex, + gMsgKanji8F42Tex, + gMsgKanji8F43Tex, + gMsgKanji8F44Tex, + gMsgKanji8F45Tex, + gMsgKanji8F46Tex, + gMsgKanji8F47Tex, + gMsgKanji8F48Tex, + gMsgKanji8F49Tex, + gMsgKanji8F4ATex, + gMsgKanji8F4BTex, + gMsgKanji8F4CTex, + gMsgKanji8F4DTex, + gMsgKanji8F4ETex, + gMsgKanji8F4FTex, + gMsgKanji8F50Tex, + gMsgKanji8F51Tex, + gMsgKanji8F52Tex, + gMsgKanji8F53Tex, + gMsgKanji8F54Tex, + gMsgKanji8F55Tex, + gMsgKanji8F56Tex, + gMsgKanji8F57Tex, + gMsgKanji8F58Tex, + gMsgKanji8F59Tex, + gMsgKanji8F5ATex, + gMsgKanji8F5BTex, + gMsgKanji8F5CTex, + gMsgKanji8F5DTex, + gMsgKanji8F5ETex, + gMsgKanji8F5FTex, + gMsgKanji8F60Tex, + gMsgKanji8F61Tex, + gMsgKanji8F62Tex, + gMsgKanji8F63Tex, + gMsgKanji8F64Tex, + gMsgKanji8F65Tex, + gMsgKanji8F66Tex, + gMsgKanji8F67Tex, + gMsgKanji8F68Tex, + gMsgKanji8F69Tex, + gMsgKanji8F6ATex, + gMsgKanji8F6BTex, + gMsgKanji8F6CTex, + gMsgKanji8F6DTex, + gMsgKanji8F6ETex, + gMsgKanji8F6FTex, + gMsgKanji8F70Tex, + gMsgKanji8F71Tex, + gMsgKanji8F72Tex, + gMsgKanji8F73Tex, + gMsgKanji8F74Tex, + gMsgKanji8F75Tex, + gMsgKanji8F76Tex, + gMsgKanji8F77Tex, + gMsgKanji8F78Tex, + gMsgKanji8F79Tex, + gMsgKanji8F7ATex, + gMsgKanji8F7BTex, + gMsgKanji8F7CTex, + gMsgKanji8F7DTex, + gMsgKanji8F7ETex, + gMsgKanji8F80Tex, + gMsgKanji8F81Tex, + gMsgKanji8F82Tex, + gMsgKanji8F83Tex, + gMsgKanji8F84Tex, + gMsgKanji8F85Tex, + gMsgKanji8F86Tex, + gMsgKanji8F87Tex, + gMsgKanji8F88Tex, + gMsgKanji8F89Tex, + gMsgKanji8F8ATex, + gMsgKanji8F8BTex, + gMsgKanji8F8CTex, + gMsgKanji8F8DTex, + gMsgKanji8F8ETex, + gMsgKanji8F8FTex, + gMsgKanji8F90Tex, + gMsgKanji8F91Tex, + gMsgKanji8F92Tex, + gMsgKanji8F93Tex, + gMsgKanji8F94Tex, + gMsgKanji8F95Tex, + gMsgKanji8F96Tex, + gMsgKanji8F97Tex, + gMsgKanji8F98Tex, + gMsgKanji8F99Tex, + gMsgKanji8F9ATex, + gMsgKanji8F9BTex, + gMsgKanji8F9CTex, + gMsgKanji8F9DTex, + gMsgKanji8F9ETex, + gMsgKanji8F9FTex, + gMsgKanji8FA0Tex, + gMsgKanji8FA1Tex, + gMsgKanji8FA2Tex, + gMsgKanji8FA3Tex, + gMsgKanji8FA4Tex, + gMsgKanji8FA5Tex, + gMsgKanji8FA6Tex, + gMsgKanji8FA7Tex, + gMsgKanji8FA8Tex, + gMsgKanji8FA9Tex, + gMsgKanji8FAATex, + gMsgKanji8FABTex, + gMsgKanji8FACTex, + gMsgKanji8FADTex, + gMsgKanji8FAETex, + gMsgKanji8FAFTex, + gMsgKanji8FB0Tex, + gMsgKanji8FB1Tex, + gMsgKanji8FB2Tex, + gMsgKanji8FB3Tex, + gMsgKanji8FB4Tex, + gMsgKanji8FB5Tex, + gMsgKanji8FB6Tex, + gMsgKanji8FB7Tex, + gMsgKanji8FB8Tex, + gMsgKanji8FB9Tex, + gMsgKanji8FBATex, + gMsgKanji8FBBTex, + gMsgKanji8FBCTex, + gMsgKanji8FBDTex, + gMsgKanji8FBETex, + gMsgKanji8FBFTex, + gMsgKanji8FC0Tex, + gMsgKanji8FC1Tex, + gMsgKanji8FC2Tex, + gMsgKanji8FC3Tex, + gMsgKanji8FC4Tex, + gMsgKanji8FC5Tex, + gMsgKanji8FC6Tex, + gMsgKanji8FC7Tex, + gMsgKanji8FC8Tex, + gMsgKanji8FC9Tex, + gMsgKanji8FCATex, + gMsgKanji8FCBTex, + gMsgKanji8FCCTex, + gMsgKanji8FCDTex, + gMsgKanji8FCETex, + gMsgKanji8FCFTex, + gMsgKanji8FD0Tex, + gMsgKanji8FD1Tex, + gMsgKanji8FD2Tex, + gMsgKanji8FD3Tex, + gMsgKanji8FD4Tex, + gMsgKanji8FD5Tex, + gMsgKanji8FD6Tex, + gMsgKanji8FD7Tex, + gMsgKanji8FD8Tex, + gMsgKanji8FD9Tex, + gMsgKanji8FDATex, + gMsgKanji8FDBTex, + gMsgKanji8FDCTex, + gMsgKanji8FDDTex, + gMsgKanji8FDETex, + gMsgKanji8FDFTex, + gMsgKanji8FE0Tex, + gMsgKanji8FE1Tex, + gMsgKanji8FE2Tex, + gMsgKanji8FE3Tex, + gMsgKanji8FE4Tex, + gMsgKanji8FE5Tex, + gMsgKanji8FE6Tex, + gMsgKanji8FE7Tex, + gMsgKanji8FE8Tex, + gMsgKanji8FE9Tex, + gMsgKanji8FEATex, + gMsgKanji8FEBTex, + gMsgKanji8FECTex, + gMsgKanji8FEDTex, + gMsgKanji8FEETex, + gMsgKanji8FEFTex, + gMsgKanji8FF0Tex, + gMsgKanji8FF1Tex, + gMsgKanji8FF2Tex, + gMsgKanji8FF3Tex, + gMsgKanji8FF4Tex, + gMsgKanji8FF5Tex, + gMsgKanji8FF6Tex, + gMsgKanji8FF7Tex, + gMsgKanji8FF8Tex, + gMsgKanji8FF9Tex, + gMsgKanji8FFATex, + gMsgKanji8FFBTex, + gMsgKanji8FFCTex, + gMsgKanji9040Tex, + gMsgKanji9041Tex, + gMsgKanji9042Tex, + gMsgKanji9043Tex, + gMsgKanji9044Tex, + gMsgKanji9045Tex, + gMsgKanji9046Tex, + gMsgKanji9047Tex, + gMsgKanji9048Tex, + gMsgKanji9049Tex, + gMsgKanji904ATex, + gMsgKanji904BTex, + gMsgKanji904CTex, + gMsgKanji904DTex, + gMsgKanji904ETex, + gMsgKanji904FTex, + gMsgKanji9050Tex, + gMsgKanji9051Tex, + gMsgKanji9052Tex, + gMsgKanji9053Tex, + gMsgKanji9054Tex, + gMsgKanji9055Tex, + gMsgKanji9056Tex, + gMsgKanji9057Tex, + gMsgKanji9058Tex, + gMsgKanji9059Tex, + gMsgKanji905ATex, + gMsgKanji905BTex, + gMsgKanji905CTex, + gMsgKanji905DTex, + gMsgKanji905ETex, + gMsgKanji905FTex, + gMsgKanji9060Tex, + gMsgKanji9061Tex, + gMsgKanji9062Tex, + gMsgKanji9063Tex, + gMsgKanji9064Tex, + gMsgKanji9065Tex, + gMsgKanji9066Tex, + gMsgKanji9067Tex, + gMsgKanji9068Tex, + gMsgKanji9069Tex, + gMsgKanji906ATex, + gMsgKanji906BTex, + gMsgKanji906CTex, + gMsgKanji906DTex, + gMsgKanji906ETex, + gMsgKanji906FTex, + gMsgKanji9070Tex, + gMsgKanji9071Tex, + gMsgKanji9072Tex, + gMsgKanji9073Tex, + gMsgKanji9074Tex, + gMsgKanji9075Tex, + gMsgKanji9076Tex, + gMsgKanji9077Tex, + gMsgKanji9078Tex, + gMsgKanji9079Tex, + gMsgKanji907ATex, + gMsgKanji907BTex, + gMsgKanji907CTex, + gMsgKanji907DTex, + gMsgKanji907ETex, + gMsgKanji9080Tex, + gMsgKanji9081Tex, + gMsgKanji9082Tex, + gMsgKanji9083Tex, + gMsgKanji9084Tex, + gMsgKanji9085Tex, + gMsgKanji9086Tex, + gMsgKanji9087Tex, + gMsgKanji9088Tex, + gMsgKanji9089Tex, + gMsgKanji908ATex, + gMsgKanji908BTex, + gMsgKanji908CTex, + gMsgKanji908DTex, + gMsgKanji908ETex, + gMsgKanji908FTex, + gMsgKanji9090Tex, + gMsgKanji9091Tex, + gMsgKanji9092Tex, + gMsgKanji9093Tex, + gMsgKanji9094Tex, + gMsgKanji9095Tex, + gMsgKanji9096Tex, + gMsgKanji9097Tex, + gMsgKanji9098Tex, + gMsgKanji9099Tex, + gMsgKanji909ATex, + gMsgKanji909BTex, + gMsgKanji909CTex, + gMsgKanji909DTex, + gMsgKanji909ETex, + gMsgKanji909FTex, + gMsgKanji90A0Tex, + gMsgKanji90A1Tex, + gMsgKanji90A2Tex, + gMsgKanji90A3Tex, + gMsgKanji90A4Tex, + gMsgKanji90A5Tex, + gMsgKanji90A6Tex, + gMsgKanji90A7Tex, + gMsgKanji90A8Tex, + gMsgKanji90A9Tex, + gMsgKanji90AATex, + gMsgKanji90ABTex, + gMsgKanji90ACTex, + gMsgKanji90ADTex, + gMsgKanji90AETex, + gMsgKanji90AFTex, + gMsgKanji90B0Tex, + gMsgKanji90B1Tex, + gMsgKanji90B2Tex, + gMsgKanji90B3Tex, + gMsgKanji90B4Tex, + gMsgKanji90B5Tex, + gMsgKanji90B6Tex, + gMsgKanji90B7Tex, + gMsgKanji90B8Tex, + gMsgKanji90B9Tex, + gMsgKanji90BATex, + gMsgKanji90BBTex, + gMsgKanji90BCTex, + gMsgKanji90BDTex, + gMsgKanji90BETex, + gMsgKanji90BFTex, + gMsgKanji90C0Tex, + gMsgKanji90C1Tex, + gMsgKanji90C2Tex, + gMsgKanji90C3Tex, + gMsgKanji90C4Tex, + gMsgKanji90C5Tex, + gMsgKanji90C6Tex, + gMsgKanji90C7Tex, + gMsgKanji90C8Tex, + gMsgKanji90C9Tex, + gMsgKanji90CATex, + gMsgKanji90CBTex, + gMsgKanji90CCTex, + gMsgKanji90CDTex, + gMsgKanji90CETex, + gMsgKanji90CFTex, + gMsgKanji90D0Tex, + gMsgKanji90D1Tex, + gMsgKanji90D2Tex, + gMsgKanji90D3Tex, + gMsgKanji90D4Tex, + gMsgKanji90D5Tex, + gMsgKanji90D6Tex, + gMsgKanji90D7Tex, + gMsgKanji90D8Tex, + gMsgKanji90D9Tex, + gMsgKanji90DATex, + gMsgKanji90DBTex, + gMsgKanji90DCTex, + gMsgKanji90DDTex, + gMsgKanji90DETex, + gMsgKanji90DFTex, + gMsgKanji90E0Tex, + gMsgKanji90E1Tex, + gMsgKanji90E2Tex, + gMsgKanji90E3Tex, + gMsgKanji90E4Tex, + gMsgKanji90E5Tex, + gMsgKanji90E6Tex, + gMsgKanji90E7Tex, + gMsgKanji90E8Tex, + gMsgKanji90E9Tex, + gMsgKanji90EATex, + gMsgKanji90EBTex, + gMsgKanji90ECTex, + gMsgKanji90EDTex, + gMsgKanji90EETex, + gMsgKanji90EFTex, + gMsgKanji90F0Tex, + gMsgKanji90F1Tex, + gMsgKanji90F2Tex, + gMsgKanji90F3Tex, + gMsgKanji90F4Tex, + gMsgKanji90F5Tex, + gMsgKanji90F6Tex, + gMsgKanji90F7Tex, + gMsgKanji90F8Tex, + gMsgKanji90F9Tex, + gMsgKanji90FATex, + gMsgKanji90FBTex, + gMsgKanji90FCTex, + gMsgKanji9140Tex, + gMsgKanji9141Tex, + gMsgKanji9142Tex, + gMsgKanji9143Tex, + gMsgKanji9144Tex, + gMsgKanji9145Tex, + gMsgKanji9146Tex, + gMsgKanji9147Tex, + gMsgKanji9148Tex, + gMsgKanji9149Tex, + gMsgKanji914ATex, + gMsgKanji914BTex, + gMsgKanji914CTex, + gMsgKanji914DTex, + gMsgKanji914ETex, + gMsgKanji914FTex, + gMsgKanji9150Tex, + gMsgKanji9151Tex, + gMsgKanji9152Tex, + gMsgKanji9153Tex, + gMsgKanji9154Tex, + gMsgKanji9155Tex, + gMsgKanji9156Tex, + gMsgKanji9157Tex, + gMsgKanji9158Tex, + gMsgKanji9159Tex, + gMsgKanji915ATex, + gMsgKanji915BTex, + gMsgKanji915CTex, + gMsgKanji915DTex, + gMsgKanji915ETex, + gMsgKanji915FTex, + gMsgKanji9160Tex, + gMsgKanji9161Tex, + gMsgKanji9162Tex, + gMsgKanji9163Tex, + gMsgKanji9164Tex, + gMsgKanji9165Tex, + gMsgKanji9166Tex, + gMsgKanji9167Tex, + gMsgKanji9168Tex, + gMsgKanji9169Tex, + gMsgKanji916ATex, + gMsgKanji916BTex, + gMsgKanji916CTex, + gMsgKanji916DTex, + gMsgKanji916ETex, + gMsgKanji916FTex, + gMsgKanji9170Tex, + gMsgKanji9171Tex, + gMsgKanji9172Tex, + gMsgKanji9173Tex, + gMsgKanji9174Tex, + gMsgKanji9175Tex, + gMsgKanji9176Tex, + gMsgKanji9177Tex, + gMsgKanji9178Tex, + gMsgKanji9179Tex, + gMsgKanji917ATex, + gMsgKanji917BTex, + gMsgKanji917CTex, + gMsgKanji917DTex, + gMsgKanji917ETex, + gMsgKanji9180Tex, + gMsgKanji9181Tex, + gMsgKanji9182Tex, + gMsgKanji9183Tex, + gMsgKanji9184Tex, + gMsgKanji9185Tex, + gMsgKanji9186Tex, + gMsgKanji9187Tex, + gMsgKanji9188Tex, + gMsgKanji9189Tex, + gMsgKanji918ATex, + gMsgKanji918BTex, + gMsgKanji918CTex, + gMsgKanji918DTex, + gMsgKanji918ETex, + gMsgKanji918FTex, + gMsgKanji9190Tex, + gMsgKanji9191Tex, + gMsgKanji9192Tex, + gMsgKanji9193Tex, + gMsgKanji9194Tex, + gMsgKanji9195Tex, + gMsgKanji9196Tex, + gMsgKanji9197Tex, + gMsgKanji9198Tex, + gMsgKanji9199Tex, + gMsgKanji919ATex, + gMsgKanji919BTex, + gMsgKanji919CTex, + gMsgKanji919DTex, + gMsgKanji919ETex, + gMsgKanji919FTex, + gMsgKanji91A0Tex, + gMsgKanji91A1Tex, + gMsgKanji91A2Tex, + gMsgKanji91A3Tex, + gMsgKanji91A4Tex, + gMsgKanji91A5Tex, + gMsgKanji91A6Tex, + gMsgKanji91A7Tex, + gMsgKanji91A8Tex, + gMsgKanji91A9Tex, + gMsgKanji91AATex, + gMsgKanji91ABTex, + gMsgKanji91ACTex, + gMsgKanji91ADTex, + gMsgKanji91AETex, + gMsgKanji91AFTex, + gMsgKanji91B0Tex, + gMsgKanji91B1Tex, + gMsgKanji91B2Tex, + gMsgKanji91B3Tex, + gMsgKanji91B4Tex, + gMsgKanji91B5Tex, + gMsgKanji91B6Tex, + gMsgKanji91B7Tex, + gMsgKanji91B8Tex, + gMsgKanji91B9Tex, + gMsgKanji91BATex, + gMsgKanji91BBTex, + gMsgKanji91BCTex, + gMsgKanji91BDTex, + gMsgKanji91BETex, + gMsgKanji91BFTex, + gMsgKanji91C0Tex, + gMsgKanji91C1Tex, + gMsgKanji91C2Tex, + gMsgKanji91C3Tex, + gMsgKanji91C4Tex, + gMsgKanji91C5Tex, + gMsgKanji91C6Tex, + gMsgKanji91C7Tex, + gMsgKanji91C8Tex, + gMsgKanji91C9Tex, + gMsgKanji91CATex, + gMsgKanji91CBTex, + gMsgKanji91CCTex, + gMsgKanji91CDTex, + gMsgKanji91CETex, + gMsgKanji91CFTex, + gMsgKanji91D0Tex, + gMsgKanji91D1Tex, + gMsgKanji91D2Tex, + gMsgKanji91D3Tex, + gMsgKanji91D4Tex, + gMsgKanji91D5Tex, + gMsgKanji91D6Tex, + gMsgKanji91D7Tex, + gMsgKanji91D8Tex, + gMsgKanji91D9Tex, + gMsgKanji91DATex, + gMsgKanji91DBTex, + gMsgKanji91DCTex, + gMsgKanji91DDTex, + gMsgKanji91DETex, + gMsgKanji91DFTex, + gMsgKanji91E0Tex, + gMsgKanji91E1Tex, + gMsgKanji91E2Tex, + gMsgKanji91E3Tex, + gMsgKanji91E4Tex, + gMsgKanji91E5Tex, + gMsgKanji91E6Tex, + gMsgKanji91E7Tex, + gMsgKanji91E8Tex, + gMsgKanji91E9Tex, + gMsgKanji91EATex, + gMsgKanji91EBTex, + gMsgKanji91ECTex, + gMsgKanji91EDTex, + gMsgKanji91EETex, + gMsgKanji91EFTex, + gMsgKanji91F0Tex, + gMsgKanji91F1Tex, + gMsgKanji91F2Tex, + gMsgKanji91F3Tex, + gMsgKanji91F4Tex, + gMsgKanji91F5Tex, + gMsgKanji91F6Tex, + gMsgKanji91F7Tex, + gMsgKanji91F8Tex, + gMsgKanji91F9Tex, + gMsgKanji91FATex, + gMsgKanji91FBTex, + gMsgKanji91FCTex, + gMsgKanji9240Tex, + gMsgKanji9241Tex, + gMsgKanji9242Tex, + gMsgKanji9243Tex, + gMsgKanji9244Tex, + gMsgKanji9245Tex, + gMsgKanji9246Tex, + gMsgKanji9247Tex, + gMsgKanji9248Tex, + gMsgKanji9249Tex, + gMsgKanji924ATex, + gMsgKanji924BTex, + gMsgKanji924CTex, + gMsgKanji924DTex, + gMsgKanji924ETex, + gMsgKanji924FTex, + gMsgKanji9250Tex, + gMsgKanji9251Tex, + gMsgKanji9252Tex, + gMsgKanji9253Tex, + gMsgKanji9254Tex, + gMsgKanji9255Tex, + gMsgKanji9256Tex, + gMsgKanji9257Tex, + gMsgKanji9258Tex, + gMsgKanji9259Tex, + gMsgKanji925ATex, + gMsgKanji925BTex, + gMsgKanji925CTex, + gMsgKanji925DTex, + gMsgKanji925ETex, + gMsgKanji925FTex, + gMsgKanji9260Tex, + gMsgKanji9261Tex, + gMsgKanji9262Tex, + gMsgKanji9263Tex, + gMsgKanji9264Tex, + gMsgKanji9265Tex, + gMsgKanji9266Tex, + gMsgKanji9267Tex, + gMsgKanji9268Tex, + gMsgKanji9269Tex, + gMsgKanji926ATex, + gMsgKanji926BTex, + gMsgKanji926CTex, + gMsgKanji926DTex, + gMsgKanji926ETex, + gMsgKanji926FTex, + gMsgKanji9270Tex, + gMsgKanji9271Tex, + gMsgKanji9272Tex, + gMsgKanji9273Tex, + gMsgKanji9274Tex, + gMsgKanji9275Tex, + gMsgKanji9276Tex, + gMsgKanji9277Tex, + gMsgKanji9278Tex, + gMsgKanji9279Tex, + gMsgKanji927ATex, + gMsgKanji927BTex, + gMsgKanji927CTex, + gMsgKanji927DTex, + gMsgKanji927ETex, + gMsgKanji9280Tex, + gMsgKanji9281Tex, + gMsgKanji9282Tex, + gMsgKanji9283Tex, + gMsgKanji9284Tex, + gMsgKanji9285Tex, + gMsgKanji9286Tex, + gMsgKanji9287Tex, + gMsgKanji9288Tex, + gMsgKanji9289Tex, + gMsgKanji928ATex, + gMsgKanji928BTex, + gMsgKanji928CTex, + gMsgKanji928DTex, + gMsgKanji928ETex, + gMsgKanji928FTex, + gMsgKanji9290Tex, + gMsgKanji9291Tex, + gMsgKanji9292Tex, + gMsgKanji9293Tex, + gMsgKanji9294Tex, + gMsgKanji9295Tex, + gMsgKanji9296Tex, + gMsgKanji9297Tex, + gMsgKanji9298Tex, + gMsgKanji9299Tex, + gMsgKanji929ATex, + gMsgKanji929BTex, + gMsgKanji929CTex, + gMsgKanji929DTex, + gMsgKanji929ETex, + gMsgKanji929FTex, + gMsgKanji92A0Tex, + gMsgKanji92A1Tex, + gMsgKanji92A2Tex, + gMsgKanji92A3Tex, + gMsgKanji92A4Tex, + gMsgKanji92A5Tex, + gMsgKanji92A6Tex, + gMsgKanji92A7Tex, + gMsgKanji92A8Tex, + gMsgKanji92A9Tex, + gMsgKanji92AATex, + gMsgKanji92ABTex, + gMsgKanji92ACTex, + gMsgKanji92ADTex, + gMsgKanji92AETex, + gMsgKanji92AFTex, + gMsgKanji92B0Tex, + gMsgKanji92B1Tex, + gMsgKanji92B2Tex, + gMsgKanji92B3Tex, + gMsgKanji92B4Tex, + gMsgKanji92B5Tex, + gMsgKanji92B6Tex, + gMsgKanji92B7Tex, + gMsgKanji92B8Tex, + gMsgKanji92B9Tex, + gMsgKanji92BATex, + gMsgKanji92BBTex, + gMsgKanji92BCTex, + gMsgKanji92BDTex, + gMsgKanji92BETex, + gMsgKanji92BFTex, + gMsgKanji92C0Tex, + gMsgKanji92C1Tex, + gMsgKanji92C2Tex, + gMsgKanji92C3Tex, + gMsgKanji92C4Tex, + gMsgKanji92C5Tex, + gMsgKanji92C6Tex, + gMsgKanji92C7Tex, + gMsgKanji92C8Tex, + gMsgKanji92C9Tex, + gMsgKanji92CATex, + gMsgKanji92CBTex, + gMsgKanji92CCTex, + gMsgKanji92CDTex, + gMsgKanji92CETex, + gMsgKanji92CFTex, + gMsgKanji92D0Tex, + gMsgKanji92D1Tex, + gMsgKanji92D2Tex, + gMsgKanji92D3Tex, + gMsgKanji92D4Tex, + gMsgKanji92D5Tex, + gMsgKanji92D6Tex, + gMsgKanji92D7Tex, + gMsgKanji92D8Tex, + gMsgKanji92D9Tex, + gMsgKanji92DATex, + gMsgKanji92DBTex, + gMsgKanji92DCTex, + gMsgKanji92DDTex, + gMsgKanji92DETex, + gMsgKanji92DFTex, + gMsgKanji92E0Tex, + gMsgKanji92E1Tex, + gMsgKanji92E2Tex, + gMsgKanji92E3Tex, + gMsgKanji92E4Tex, + gMsgKanji92E5Tex, + gMsgKanji92E6Tex, + gMsgKanji92E7Tex, + gMsgKanji92E8Tex, + gMsgKanji92E9Tex, + gMsgKanji92EATex, + gMsgKanji92EBTex, + gMsgKanji92ECTex, + gMsgKanji92EDTex, + gMsgKanji92EETex, + gMsgKanji92EFTex, + gMsgKanji92F0Tex, + gMsgKanji92F1Tex, + gMsgKanji92F2Tex, + gMsgKanji92F3Tex, + gMsgKanji92F4Tex, + gMsgKanji92F5Tex, + gMsgKanji92F6Tex, + gMsgKanji92F7Tex, + gMsgKanji92F8Tex, + gMsgKanji92F9Tex, + gMsgKanji92FATex, + gMsgKanji92FBTex, + gMsgKanji92FCTex, + gMsgKanji9340Tex, + gMsgKanji9341Tex, + gMsgKanji9342Tex, + gMsgKanji9343Tex, + gMsgKanji9344Tex, + gMsgKanji9345Tex, + gMsgKanji9346Tex, + gMsgKanji9347Tex, + gMsgKanji9348Tex, + gMsgKanji9349Tex, + gMsgKanji934ATex, + gMsgKanji934BTex, + gMsgKanji934CTex, + gMsgKanji934DTex, + gMsgKanji934ETex, + gMsgKanji934FTex, + gMsgKanji9350Tex, + gMsgKanji9351Tex, + gMsgKanji9352Tex, + gMsgKanji9353Tex, + gMsgKanji9354Tex, + gMsgKanji9355Tex, + gMsgKanji9356Tex, + gMsgKanji9357Tex, + gMsgKanji9358Tex, + gMsgKanji9359Tex, + gMsgKanji935ATex, + gMsgKanji935BTex, + gMsgKanji935CTex, + gMsgKanji935DTex, + gMsgKanji935ETex, + gMsgKanji935FTex, + gMsgKanji9360Tex, + gMsgKanji9361Tex, + gMsgKanji9362Tex, + gMsgKanji9363Tex, + gMsgKanji9364Tex, + gMsgKanji9365Tex, + gMsgKanji9366Tex, + gMsgKanji9367Tex, + gMsgKanji9368Tex, + gMsgKanji9369Tex, + gMsgKanji936ATex, + gMsgKanji936BTex, + gMsgKanji936CTex, + gMsgKanji936DTex, + gMsgKanji936ETex, + gMsgKanji936FTex, + gMsgKanji9370Tex, + gMsgKanji9371Tex, + gMsgKanji9372Tex, + gMsgKanji9373Tex, + gMsgKanji9374Tex, + gMsgKanji9375Tex, + gMsgKanji9376Tex, + gMsgKanji9377Tex, + gMsgKanji9378Tex, + gMsgKanji9379Tex, + gMsgKanji937ATex, + gMsgKanji937BTex, + gMsgKanji937CTex, + gMsgKanji937DTex, + gMsgKanji937ETex, + gMsgKanji9380Tex, + gMsgKanji9381Tex, + gMsgKanji9382Tex, + gMsgKanji9383Tex, + gMsgKanji9384Tex, + gMsgKanji9385Tex, + gMsgKanji9386Tex, + gMsgKanji9387Tex, + gMsgKanji9388Tex, + gMsgKanji9389Tex, + gMsgKanji938ATex, + gMsgKanji938BTex, + gMsgKanji938CTex, + gMsgKanji938DTex, + gMsgKanji938ETex, + gMsgKanji938FTex, + gMsgKanji9390Tex, + gMsgKanji9391Tex, + gMsgKanji9392Tex, + gMsgKanji9393Tex, + gMsgKanji9394Tex, + gMsgKanji9395Tex, + gMsgKanji9396Tex, + gMsgKanji9397Tex, + gMsgKanji9398Tex, + gMsgKanji9399Tex, + gMsgKanji939ATex, + gMsgKanji939BTex, + gMsgKanji939CTex, + gMsgKanji939DTex, + gMsgKanji939ETex, + gMsgKanji939FTex, + gMsgKanji93A0Tex, + gMsgKanji93A1Tex, + gMsgKanji93A2Tex, + gMsgKanji93A3Tex, + gMsgKanji93A4Tex, + gMsgKanji93A5Tex, + gMsgKanji93A6Tex, + gMsgKanji93A7Tex, + gMsgKanji93A8Tex, + gMsgKanji93A9Tex, + gMsgKanji93AATex, + gMsgKanji93ABTex, + gMsgKanji93ACTex, + gMsgKanji93ADTex, + gMsgKanji93AETex, + gMsgKanji93AFTex, + gMsgKanji93B0Tex, + gMsgKanji93B1Tex, + gMsgKanji93B2Tex, + gMsgKanji93B3Tex, + gMsgKanji93B4Tex, + gMsgKanji93B5Tex, + gMsgKanji93B6Tex, + gMsgKanji93B7Tex, + gMsgKanji93B8Tex, + gMsgKanji93B9Tex, + gMsgKanji93BATex, + gMsgKanji93BBTex, + gMsgKanji93BCTex, + gMsgKanji93BDTex, + gMsgKanji93BETex, + gMsgKanji93BFTex, + gMsgKanji93C0Tex, + gMsgKanji93C1Tex, + gMsgKanji93C2Tex, + gMsgKanji93C3Tex, + gMsgKanji93C4Tex, + gMsgKanji93C5Tex, + gMsgKanji93C6Tex, + gMsgKanji93C7Tex, + gMsgKanji93C8Tex, + gMsgKanji93C9Tex, + gMsgKanji93CATex, + gMsgKanji93CBTex, + gMsgKanji93CCTex, + gMsgKanji93CDTex, + gMsgKanji93CETex, + gMsgKanji93CFTex, + gMsgKanji93D0Tex, + gMsgKanji93D1Tex, + gMsgKanji93D2Tex, + gMsgKanji93D3Tex, + gMsgKanji93D4Tex, + gMsgKanji93D5Tex, + gMsgKanji93D6Tex, + gMsgKanji93D7Tex, + gMsgKanji93D8Tex, + gMsgKanji93D9Tex, + gMsgKanji93DATex, + gMsgKanji93DBTex, + gMsgKanji93DCTex, + gMsgKanji93DDTex, + gMsgKanji93DETex, + gMsgKanji93DFTex, + gMsgKanji93E0Tex, + gMsgKanji93E1Tex, + gMsgKanji93E2Tex, + gMsgKanji93E3Tex, + gMsgKanji93E4Tex, + gMsgKanji93E5Tex, + gMsgKanji93E6Tex, + gMsgKanji93E7Tex, + gMsgKanji93E8Tex, + gMsgKanji93E9Tex, + gMsgKanji93EATex, + gMsgKanji93EBTex, + gMsgKanji93ECTex, + gMsgKanji93EDTex, + gMsgKanji93EETex, + gMsgKanji93EFTex, + gMsgKanji93F0Tex, + gMsgKanji93F1Tex, + gMsgKanji93F2Tex, + gMsgKanji93F3Tex, + gMsgKanji93F4Tex, + gMsgKanji93F5Tex, + gMsgKanji93F6Tex, + gMsgKanji93F7Tex, + gMsgKanji93F8Tex, + gMsgKanji93F9Tex, + gMsgKanji93FATex, + gMsgKanji93FBTex, + gMsgKanji93FCTex, + gMsgKanji9440Tex, + gMsgKanji9441Tex, + gMsgKanji9442Tex, + gMsgKanji9443Tex, + gMsgKanji9444Tex, + gMsgKanji9445Tex, + gMsgKanji9446Tex, + gMsgKanji9447Tex, + gMsgKanji9448Tex, + gMsgKanji9449Tex, + gMsgKanji944ATex, + gMsgKanji944BTex, + gMsgKanji944CTex, + gMsgKanji944DTex, + gMsgKanji944ETex, + gMsgKanji944FTex, + gMsgKanji9450Tex, + gMsgKanji9451Tex, + gMsgKanji9452Tex, + gMsgKanji9453Tex, + gMsgKanji9454Tex, + gMsgKanji9455Tex, + gMsgKanji9456Tex, + gMsgKanji9457Tex, + gMsgKanji9458Tex, + gMsgKanji9459Tex, + gMsgKanji945ATex, + gMsgKanji945BTex, + gMsgKanji945CTex, + gMsgKanji945DTex, + gMsgKanji945ETex, + gMsgKanji945FTex, + gMsgKanji9460Tex, + gMsgKanji9461Tex, + gMsgKanji9462Tex, + gMsgKanji9463Tex, + gMsgKanji9464Tex, + gMsgKanji9465Tex, + gMsgKanji9466Tex, + gMsgKanji9467Tex, + gMsgKanji9468Tex, + gMsgKanji9469Tex, + gMsgKanji946ATex, + gMsgKanji946BTex, + gMsgKanji946CTex, + gMsgKanji946DTex, + gMsgKanji946ETex, + gMsgKanji946FTex, + gMsgKanji9470Tex, + gMsgKanji9471Tex, + gMsgKanji9472Tex, + gMsgKanji9473Tex, + gMsgKanji9474Tex, + gMsgKanji9475Tex, + gMsgKanji9476Tex, + gMsgKanji9477Tex, + gMsgKanji9478Tex, + gMsgKanji9479Tex, + gMsgKanji947ATex, + gMsgKanji947BTex, + gMsgKanji947CTex, + gMsgKanji947DTex, + gMsgKanji947ETex, + gMsgKanji9480Tex, + gMsgKanji9481Tex, + gMsgKanji9482Tex, + gMsgKanji9483Tex, + gMsgKanji9484Tex, + gMsgKanji9485Tex, + gMsgKanji9486Tex, + gMsgKanji9487Tex, + gMsgKanji9488Tex, + gMsgKanji9489Tex, + gMsgKanji948ATex, + gMsgKanji948BTex, + gMsgKanji948CTex, + gMsgKanji948DTex, + gMsgKanji948ETex, + gMsgKanji948FTex, + gMsgKanji9490Tex, + gMsgKanji9491Tex, + gMsgKanji9492Tex, + gMsgKanji9493Tex, + gMsgKanji9494Tex, + gMsgKanji9495Tex, + gMsgKanji9496Tex, + gMsgKanji9497Tex, + gMsgKanji9498Tex, + gMsgKanji9499Tex, + gMsgKanji949ATex, + gMsgKanji949BTex, + gMsgKanji949CTex, + gMsgKanji949DTex, + gMsgKanji949ETex, + gMsgKanji949FTex, + gMsgKanji94A0Tex, + gMsgKanji94A1Tex, + gMsgKanji94A2Tex, + gMsgKanji94A3Tex, + gMsgKanji94A4Tex, + gMsgKanji94A5Tex, + gMsgKanji94A6Tex, + gMsgKanji94A7Tex, + gMsgKanji94A8Tex, + gMsgKanji94A9Tex, + gMsgKanji94AATex, + gMsgKanji94ABTex, + gMsgKanji94ACTex, + gMsgKanji94ADTex, + gMsgKanji94AETex, + gMsgKanji94AFTex, + gMsgKanji94B0Tex, + gMsgKanji94B1Tex, + gMsgKanji94B2Tex, + gMsgKanji94B3Tex, + gMsgKanji94B4Tex, + gMsgKanji94B5Tex, + gMsgKanji94B6Tex, + gMsgKanji94B7Tex, + gMsgKanji94B8Tex, + gMsgKanji94B9Tex, + gMsgKanji94BATex, + gMsgKanji94BBTex, + gMsgKanji94BCTex, + gMsgKanji94BDTex, + gMsgKanji94BETex, + gMsgKanji94BFTex, + gMsgKanji94C0Tex, + gMsgKanji94C1Tex, + gMsgKanji94C2Tex, + gMsgKanji94C3Tex, + gMsgKanji94C4Tex, + gMsgKanji94C5Tex, + gMsgKanji94C6Tex, + gMsgKanji94C7Tex, + gMsgKanji94C8Tex, + gMsgKanji94C9Tex, + gMsgKanji94CATex, + gMsgKanji94CBTex, + gMsgKanji94CCTex, + gMsgKanji94CDTex, + gMsgKanji94CETex, + gMsgKanji94CFTex, + gMsgKanji94D0Tex, + gMsgKanji94D1Tex, + gMsgKanji94D2Tex, + gMsgKanji94D3Tex, + gMsgKanji94D4Tex, + gMsgKanji94D5Tex, + gMsgKanji94D6Tex, + gMsgKanji94D7Tex, + gMsgKanji94D8Tex, + gMsgKanji94D9Tex, + gMsgKanji94DATex, + gMsgKanji94DBTex, + gMsgKanji94DCTex, + gMsgKanji94DDTex, + gMsgKanji94DETex, + gMsgKanji94DFTex, + gMsgKanji94E0Tex, + gMsgKanji94E1Tex, + gMsgKanji94E2Tex, + gMsgKanji94E3Tex, + gMsgKanji94E4Tex, + gMsgKanji94E5Tex, + gMsgKanji94E6Tex, + gMsgKanji94E7Tex, + gMsgKanji94E8Tex, + gMsgKanji94E9Tex, + gMsgKanji94EATex, + gMsgKanji94EBTex, + gMsgKanji94ECTex, + gMsgKanji94EDTex, + gMsgKanji94EETex, + gMsgKanji94EFTex, + gMsgKanji94F0Tex, + gMsgKanji94F1Tex, + gMsgKanji94F2Tex, + gMsgKanji94F3Tex, + gMsgKanji94F4Tex, + gMsgKanji94F5Tex, + gMsgKanji94F6Tex, + gMsgKanji94F7Tex, + gMsgKanji94F8Tex, + gMsgKanji94F9Tex, + gMsgKanji94FATex, + gMsgKanji94FBTex, + gMsgKanji94FCTex, + gMsgKanji9540Tex, + gMsgKanji9541Tex, + gMsgKanji9542Tex, + gMsgKanji9543Tex, + gMsgKanji9544Tex, + gMsgKanji9545Tex, + gMsgKanji9546Tex, + gMsgKanji9547Tex, + gMsgKanji9548Tex, + gMsgKanji9549Tex, + gMsgKanji954ATex, + gMsgKanji954BTex, + gMsgKanji954CTex, + gMsgKanji954DTex, + gMsgKanji954ETex, + gMsgKanji954FTex, + gMsgKanji9550Tex, + gMsgKanji9551Tex, + gMsgKanji9552Tex, + gMsgKanji9553Tex, + gMsgKanji9554Tex, + gMsgKanji9555Tex, + gMsgKanji9556Tex, + gMsgKanji9557Tex, + gMsgKanji9558Tex, + gMsgKanji9559Tex, + gMsgKanji955ATex, + gMsgKanji955BTex, + gMsgKanji955CTex, + gMsgKanji955DTex, + gMsgKanji955ETex, + gMsgKanji955FTex, + gMsgKanji9560Tex, + gMsgKanji9561Tex, + gMsgKanji9562Tex, + gMsgKanji9563Tex, + gMsgKanji9564Tex, + gMsgKanji9565Tex, + gMsgKanji9566Tex, + gMsgKanji9567Tex, + gMsgKanji9568Tex, + gMsgKanji9569Tex, + gMsgKanji956ATex, + gMsgKanji956BTex, + gMsgKanji956CTex, + gMsgKanji956DTex, + gMsgKanji956ETex, + gMsgKanji956FTex, + gMsgKanji9570Tex, + gMsgKanji9571Tex, + gMsgKanji9572Tex, + gMsgKanji9573Tex, + gMsgKanji9574Tex, + gMsgKanji9575Tex, + gMsgKanji9576Tex, + gMsgKanji9577Tex, + gMsgKanji9578Tex, + gMsgKanji9579Tex, + gMsgKanji957ATex, + gMsgKanji957BTex, + gMsgKanji957CTex, + gMsgKanji957DTex, + gMsgKanji957ETex, + gMsgKanji9580Tex, + gMsgKanji9581Tex, + gMsgKanji9582Tex, + gMsgKanji9583Tex, + gMsgKanji9584Tex, + gMsgKanji9585Tex, + gMsgKanji9586Tex, + gMsgKanji9587Tex, + gMsgKanji9588Tex, + gMsgKanji9589Tex, + gMsgKanji958ATex, + gMsgKanji958BTex, + gMsgKanji958CTex, + gMsgKanji958DTex, + gMsgKanji958ETex, + gMsgKanji958FTex, + gMsgKanji9590Tex, + gMsgKanji9591Tex, + gMsgKanji9592Tex, + gMsgKanji9593Tex, + gMsgKanji9594Tex, + gMsgKanji9595Tex, + gMsgKanji9596Tex, + gMsgKanji9597Tex, + gMsgKanji9598Tex, + gMsgKanji9599Tex, + gMsgKanji959ATex, + gMsgKanji959BTex, + gMsgKanji959CTex, + gMsgKanji959DTex, + gMsgKanji959ETex, + gMsgKanji959FTex, + gMsgKanji95A0Tex, + gMsgKanji95A1Tex, + gMsgKanji95A2Tex, + gMsgKanji95A3Tex, + gMsgKanji95A4Tex, + gMsgKanji95A5Tex, + gMsgKanji95A6Tex, + gMsgKanji95A7Tex, + gMsgKanji95A8Tex, + gMsgKanji95A9Tex, + gMsgKanji95AATex, + gMsgKanji95ABTex, + gMsgKanji95ACTex, + gMsgKanji95ADTex, + gMsgKanji95AETex, + gMsgKanji95AFTex, + gMsgKanji95B0Tex, + gMsgKanji95B1Tex, + gMsgKanji95B2Tex, + gMsgKanji95B3Tex, + gMsgKanji95B4Tex, + gMsgKanji95B5Tex, + gMsgKanji95B6Tex, + gMsgKanji95B7Tex, + gMsgKanji95B8Tex, + gMsgKanji95B9Tex, + gMsgKanji95BATex, + gMsgKanji95BBTex, + gMsgKanji95BCTex, + gMsgKanji95BDTex, + gMsgKanji95BETex, + gMsgKanji95BFTex, + gMsgKanji95C0Tex, + gMsgKanji95C1Tex, + gMsgKanji95C2Tex, + gMsgKanji95C3Tex, + gMsgKanji95C4Tex, + gMsgKanji95C5Tex, + gMsgKanji95C6Tex, + gMsgKanji95C7Tex, + gMsgKanji95C8Tex, + gMsgKanji95C9Tex, + gMsgKanji95CATex, + gMsgKanji95CBTex, + gMsgKanji95CCTex, + gMsgKanji95CDTex, + gMsgKanji95CETex, + gMsgKanji95CFTex, + gMsgKanji95D0Tex, + gMsgKanji95D1Tex, + gMsgKanji95D2Tex, + gMsgKanji95D3Tex, + gMsgKanji95D4Tex, + gMsgKanji95D5Tex, + gMsgKanji95D6Tex, + gMsgKanji95D7Tex, + gMsgKanji95D8Tex, + gMsgKanji95D9Tex, + gMsgKanji95DATex, + gMsgKanji95DBTex, + gMsgKanji95DCTex, + gMsgKanji95DDTex, + gMsgKanji95DETex, + gMsgKanji95DFTex, + gMsgKanji95E0Tex, + gMsgKanji95E1Tex, + gMsgKanji95E2Tex, + gMsgKanji95E3Tex, + gMsgKanji95E4Tex, + gMsgKanji95E5Tex, + gMsgKanji95E6Tex, + gMsgKanji95E7Tex, + gMsgKanji95E8Tex, + gMsgKanji95E9Tex, + gMsgKanji95EATex, + gMsgKanji95EBTex, + gMsgKanji95ECTex, + gMsgKanji95EDTex, + gMsgKanji95EETex, + gMsgKanji95EFTex, + gMsgKanji95F0Tex, + gMsgKanji95F1Tex, + gMsgKanji95F2Tex, + gMsgKanji95F3Tex, + gMsgKanji95F4Tex, + gMsgKanji95F5Tex, + gMsgKanji95F6Tex, + gMsgKanji95F7Tex, + gMsgKanji95F8Tex, + gMsgKanji95F9Tex, + gMsgKanji95FATex, + gMsgKanji95FBTex, + gMsgKanji95FCTex, + gMsgKanji9640Tex, + gMsgKanji9641Tex, + gMsgKanji9642Tex, + gMsgKanji9643Tex, + gMsgKanji9644Tex, + gMsgKanji9645Tex, + gMsgKanji9646Tex, + gMsgKanji9647Tex, + gMsgKanji9648Tex, + gMsgKanji9649Tex, + gMsgKanji964ATex, + gMsgKanji964BTex, + gMsgKanji964CTex, + gMsgKanji964DTex, + gMsgKanji964ETex, + gMsgKanji964FTex, + gMsgKanji9650Tex, + gMsgKanji9651Tex, + gMsgKanji9652Tex, + gMsgKanji9653Tex, + gMsgKanji9654Tex, + gMsgKanji9655Tex, + gMsgKanji9656Tex, + gMsgKanji9657Tex, + gMsgKanji9658Tex, + gMsgKanji9659Tex, + gMsgKanji965ATex, + gMsgKanji965BTex, + gMsgKanji965CTex, + gMsgKanji965DTex, + gMsgKanji965ETex, + gMsgKanji965FTex, + gMsgKanji9660Tex, + gMsgKanji9661Tex, + gMsgKanji9662Tex, + gMsgKanji9663Tex, + gMsgKanji9664Tex, + gMsgKanji9665Tex, + gMsgKanji9666Tex, + gMsgKanji9667Tex, + gMsgKanji9668Tex, + gMsgKanji9669Tex, + gMsgKanji966ATex, + gMsgKanji966BTex, + gMsgKanji966CTex, + gMsgKanji966DTex, + gMsgKanji966ETex, + gMsgKanji966FTex, + gMsgKanji9670Tex, + gMsgKanji9671Tex, + gMsgKanji9672Tex, + gMsgKanji9673Tex, + gMsgKanji9674Tex, + gMsgKanji9675Tex, + gMsgKanji9676Tex, + gMsgKanji9677Tex, + gMsgKanji9678Tex, + gMsgKanji9679Tex, + gMsgKanji967ATex, + gMsgKanji967BTex, + gMsgKanji967CTex, + gMsgKanji967DTex, + gMsgKanji967ETex, + gMsgKanji9680Tex, + gMsgKanji9681Tex, + gMsgKanji9682Tex, + gMsgKanji9683Tex, + gMsgKanji9684Tex, + gMsgKanji9685Tex, + gMsgKanji9686Tex, + gMsgKanji9687Tex, + gMsgKanji9688Tex, + gMsgKanji9689Tex, + gMsgKanji968ATex, + gMsgKanji968BTex, + gMsgKanji968CTex, + gMsgKanji968DTex, + gMsgKanji968ETex, + gMsgKanji968FTex, + gMsgKanji9690Tex, + gMsgKanji9691Tex, + gMsgKanji9692Tex, + gMsgKanji9693Tex, + gMsgKanji9694Tex, + gMsgKanji9695Tex, + gMsgKanji9696Tex, + gMsgKanji9697Tex, + gMsgKanji9698Tex, + gMsgKanji9699Tex, + gMsgKanji969ATex, + gMsgKanji969BTex, + gMsgKanji969CTex, + gMsgKanji969DTex, + gMsgKanji969ETex, + gMsgKanji969FTex, + gMsgKanji96A0Tex, + gMsgKanji96A1Tex, + gMsgKanji96A2Tex, + gMsgKanji96A3Tex, + gMsgKanji96A4Tex, + gMsgKanji96A5Tex, + gMsgKanji96A6Tex, + gMsgKanji96A7Tex, + gMsgKanji96A8Tex, + gMsgKanji96A9Tex, + gMsgKanji96AATex, + gMsgKanji96ABTex, + gMsgKanji96ACTex, + gMsgKanji96ADTex, + gMsgKanji96AETex, + gMsgKanji96AFTex, + gMsgKanji96B0Tex, + gMsgKanji96B1Tex, + gMsgKanji96B2Tex, + gMsgKanji96B3Tex, + gMsgKanji96B4Tex, + gMsgKanji96B5Tex, + gMsgKanji96B6Tex, + gMsgKanji96B7Tex, + gMsgKanji96B8Tex, + gMsgKanji96B9Tex, + gMsgKanji96BATex, + gMsgKanji96BBTex, + gMsgKanji96BCTex, + gMsgKanji96BDTex, + gMsgKanji96BETex, + gMsgKanji96BFTex, + gMsgKanji96C0Tex, + gMsgKanji96C1Tex, + gMsgKanji96C2Tex, + gMsgKanji96C3Tex, + gMsgKanji96C4Tex, + gMsgKanji96C5Tex, + gMsgKanji96C6Tex, + gMsgKanji96C7Tex, + gMsgKanji96C8Tex, + gMsgKanji96C9Tex, + gMsgKanji96CATex, + gMsgKanji96CBTex, + gMsgKanji96CCTex, + gMsgKanji96CDTex, + gMsgKanji96CETex, + gMsgKanji96CFTex, + gMsgKanji96D0Tex, + gMsgKanji96D1Tex, + gMsgKanji96D2Tex, + gMsgKanji96D3Tex, + gMsgKanji96D4Tex, + gMsgKanji96D5Tex, + gMsgKanji96D6Tex, + gMsgKanji96D7Tex, + gMsgKanji96D8Tex, + gMsgKanji96D9Tex, + gMsgKanji96DATex, + gMsgKanji96DBTex, + gMsgKanji96DCTex, + gMsgKanji96DDTex, + gMsgKanji96DETex, + gMsgKanji96DFTex, + gMsgKanji96E0Tex, + gMsgKanji96E1Tex, + gMsgKanji96E2Tex, + gMsgKanji96E3Tex, + gMsgKanji96E4Tex, + gMsgKanji96E5Tex, + gMsgKanji96E6Tex, + gMsgKanji96E7Tex, + gMsgKanji96E8Tex, + gMsgKanji96E9Tex, + gMsgKanji96EATex, + gMsgKanji96EBTex, + gMsgKanji96ECTex, + gMsgKanji96EDTex, + gMsgKanji96EETex, + gMsgKanji96EFTex, + gMsgKanji96F0Tex, + gMsgKanji96F1Tex, + gMsgKanji96F2Tex, + gMsgKanji96F3Tex, + gMsgKanji96F4Tex, + gMsgKanji96F5Tex, + gMsgKanji96F6Tex, + gMsgKanji96F7Tex, + gMsgKanji96F8Tex, + gMsgKanji96F9Tex, + gMsgKanji96FATex, + gMsgKanji96FBTex, + gMsgKanji96FCTex, + gMsgKanji9740Tex, + gMsgKanji9741Tex, + gMsgKanji9742Tex, + gMsgKanji9743Tex, + gMsgKanji9744Tex, + gMsgKanji9745Tex, + gMsgKanji9746Tex, + gMsgKanji9747Tex, + gMsgKanji9748Tex, + gMsgKanji9749Tex, + gMsgKanji974ATex, + gMsgKanji974BTex, + gMsgKanji974CTex, + gMsgKanji974DTex, + gMsgKanji974ETex, + gMsgKanji974FTex, + gMsgKanji9750Tex, + gMsgKanji9751Tex, + gMsgKanji9752Tex, + gMsgKanji9753Tex, + gMsgKanji9754Tex, + gMsgKanji9755Tex, + gMsgKanji9756Tex, + gMsgKanji9757Tex, + gMsgKanji9758Tex, + gMsgKanji9759Tex, + gMsgKanji975ATex, + gMsgKanji975BTex, + gMsgKanji975CTex, + gMsgKanji975DTex, + gMsgKanji975ETex, + gMsgKanji975FTex, + gMsgKanji9760Tex, + gMsgKanji9761Tex, + gMsgKanji9762Tex, + gMsgKanji9763Tex, + gMsgKanji9764Tex, + gMsgKanji9765Tex, + gMsgKanji9766Tex, + gMsgKanji9767Tex, + gMsgKanji9768Tex, + gMsgKanji9769Tex, + gMsgKanji976ATex, + gMsgKanji976BTex, + gMsgKanji976CTex, + gMsgKanji976DTex, + gMsgKanji976ETex, + gMsgKanji976FTex, + gMsgKanji9770Tex, + gMsgKanji9771Tex, + gMsgKanji9772Tex, + gMsgKanji9773Tex, + gMsgKanji9774Tex, + gMsgKanji9775Tex, + gMsgKanji9776Tex, + gMsgKanji9777Tex, + gMsgKanji9778Tex, + gMsgKanji9779Tex, + gMsgKanji977ATex, + gMsgKanji977BTex, + gMsgKanji977CTex, + gMsgKanji977DTex, + gMsgKanji977ETex, + gMsgKanji9780Tex, + gMsgKanji9781Tex, + gMsgKanji9782Tex, + gMsgKanji9783Tex, + gMsgKanji9784Tex, + gMsgKanji9785Tex, + gMsgKanji9786Tex, + gMsgKanji9787Tex, + gMsgKanji9788Tex, + gMsgKanji9789Tex, + gMsgKanji978ATex, + gMsgKanji978BTex, + gMsgKanji978CTex, + gMsgKanji978DTex, + gMsgKanji978ETex, + gMsgKanji978FTex, + gMsgKanji9790Tex, + gMsgKanji9791Tex, + gMsgKanji9792Tex, + gMsgKanji9793Tex, + gMsgKanji9794Tex, + gMsgKanji9795Tex, + gMsgKanji9796Tex, + gMsgKanji9797Tex, + gMsgKanji9798Tex, + gMsgKanji9799Tex, + gMsgKanji979ATex, + gMsgKanji979BTex, + gMsgKanji979CTex, + gMsgKanji979DTex, + gMsgKanji979ETex, + gMsgKanji979FTex, + gMsgKanji97A0Tex, + gMsgKanji97A1Tex, + gMsgKanji97A2Tex, + gMsgKanji97A3Tex, + gMsgKanji97A4Tex, + gMsgKanji97A5Tex, + gMsgKanji97A6Tex, + gMsgKanji97A7Tex, + gMsgKanji97A8Tex, + gMsgKanji97A9Tex, + gMsgKanji97AATex, + gMsgKanji97ABTex, + gMsgKanji97ACTex, + gMsgKanji97ADTex, + gMsgKanji97AETex, + gMsgKanji97AFTex, + gMsgKanji97B0Tex, + gMsgKanji97B1Tex, + gMsgKanji97B2Tex, + gMsgKanji97B3Tex, + gMsgKanji97B4Tex, + gMsgKanji97B5Tex, + gMsgKanji97B6Tex, + gMsgKanji97B7Tex, + gMsgKanji97B8Tex, + gMsgKanji97B9Tex, + gMsgKanji97BATex, + gMsgKanji97BBTex, + gMsgKanji97BCTex, + gMsgKanji97BDTex, + gMsgKanji97BETex, + gMsgKanji97BFTex, + gMsgKanji97C0Tex, + gMsgKanji97C1Tex, + gMsgKanji97C2Tex, + gMsgKanji97C3Tex, + gMsgKanji97C4Tex, + gMsgKanji97C5Tex, + gMsgKanji97C6Tex, + gMsgKanji97C7Tex, + gMsgKanji97C8Tex, + gMsgKanji97C9Tex, + gMsgKanji97CATex, + gMsgKanji97CBTex, + gMsgKanji97CCTex, + gMsgKanji97CDTex, + gMsgKanji97CETex, + gMsgKanji97CFTex, + gMsgKanji97D0Tex, + gMsgKanji97D1Tex, + gMsgKanji97D2Tex, + gMsgKanji97D3Tex, + gMsgKanji97D4Tex, + gMsgKanji97D5Tex, + gMsgKanji97D6Tex, + gMsgKanji97D7Tex, + gMsgKanji97D8Tex, + gMsgKanji97D9Tex, + gMsgKanji97DATex, + gMsgKanji97DBTex, + gMsgKanji97DCTex, + gMsgKanji97DDTex, + gMsgKanji97DETex, + gMsgKanji97DFTex, + gMsgKanji97E0Tex, + gMsgKanji97E1Tex, + gMsgKanji97E2Tex, + gMsgKanji97E3Tex, + gMsgKanji97E4Tex, + gMsgKanji97E5Tex, + gMsgKanji97E6Tex, + gMsgKanji97E7Tex, + gMsgKanji97E8Tex, + gMsgKanji97E9Tex, + gMsgKanji97EATex, + gMsgKanji97EBTex, + gMsgKanji97ECTex, + gMsgKanji97EDTex, + gMsgKanji97EETex, + gMsgKanji97EFTex, + gMsgKanji97F0Tex, + gMsgKanji97F1Tex, + gMsgKanji97F2Tex, + gMsgKanji97F3Tex, + gMsgKanji97F4Tex, + gMsgKanji97F5Tex, + gMsgKanji97F6Tex, + gMsgKanji97F7Tex, + gMsgKanji97F8Tex, + gMsgKanji97F9Tex, + gMsgKanji97FATex, + gMsgKanji97FBTex, + gMsgKanji97FCTex, + gMsgKanji9840Tex, + gMsgKanji9841Tex, + gMsgKanji9842Tex, + gMsgKanji9843Tex, + gMsgKanji9844Tex, + gMsgKanji9845Tex, + gMsgKanji9846Tex, + gMsgKanji9847Tex, + gMsgKanji9848Tex, + gMsgKanji9849Tex, + gMsgKanji984ATex, + gMsgKanji984BTex, + gMsgKanji984CTex, + gMsgKanji984DTex, + gMsgKanji984ETex, + gMsgKanji984FTex, + gMsgKanji9850Tex, + gMsgKanji9851Tex, + gMsgKanji9852Tex, + gMsgKanji9853Tex, + gMsgKanji9854Tex, + gMsgKanji9855Tex, + gMsgKanji9856Tex, + gMsgKanji9857Tex, + gMsgKanji9858Tex, + gMsgKanji9859Tex, + gMsgKanji985ATex, + gMsgKanji985BTex, + gMsgKanji985CTex, + gMsgKanji985DTex, + gMsgKanji985ETex, + gMsgKanji985FTex, + gMsgKanji9860Tex, + gMsgKanji9861Tex, + gMsgKanji9862Tex, + gMsgKanji9863Tex, + gMsgKanji9864Tex, + gMsgKanji9865Tex, + gMsgKanji9866Tex, + gMsgKanji9867Tex, + gMsgKanji9868Tex, + gMsgKanji9869Tex, + gMsgKanji986ATex, + gMsgKanji986BTex, + gMsgKanji986CTex, + gMsgKanji986DTex, + gMsgKanji986ETex, + gMsgKanji986FTex, + gMsgKanji9870Tex, + gMsgKanji9871Tex, + gMsgKanji9872Tex, + gMsgKanji9873EmptyTex, + gMsgKanji9874EmptyTex, + gMsgKanji9875EmptyTex, + gMsgKanji9876EmptyTex, + gMsgKanji9877EmptyTex, + gMsgKanji9878EmptyTex, + gMsgKanji9879EmptyTex, + gMsgKanji987AEmptyTex, + gMsgKanji987BEmptyTex, + gMsgKanji987CEmptyTex, + gMsgKanji987DEmptyTex, + gMsgKanji987EEmptyTex, + gMsgKanji9880EmptyTex, + gMsgKanji9881EmptyTex, + gMsgKanji9882EmptyTex, + gMsgKanji9883EmptyTex, + gMsgKanji9884EmptyTex, + gMsgKanji9885EmptyTex, + gMsgKanji9886EmptyTex, + gMsgKanji9887EmptyTex, + gMsgKanji9888EmptyTex, + gMsgKanji9889EmptyTex, + gMsgKanji988AEmptyTex, + gMsgKanji988BEmptyTex, + gMsgKanji988CEmptyTex, + gMsgKanji988DEmptyTex, + gMsgKanji988EEmptyTex, + gMsgKanji988FEmptyTex, + gMsgKanji9890EmptyTex, + gMsgKanji9891EmptyTex, + gMsgKanji9892EmptyTex, + gMsgKanji9893EmptyTex, + gMsgKanji9894EmptyTex, + gMsgKanji9895EmptyTex, + gMsgKanji9896EmptyTex, + gMsgKanji9897EmptyTex, + gMsgKanji9898EmptyTex, + gMsgKanji9899EmptyTex, + gMsgKanji989AEmptyTex, + gMsgKanji989BEmptyTex, + gMsgKanji989CEmptyTex, + gMsgKanji989DEmptyTex, + gMsgKanji989EEmptyTex, + gMsgKanji989FEmptyTex, + gMsgKanji98A0EmptyTex, + gMsgKanji98A1EmptyTex, + gMsgKanji98A2EmptyTex, + gMsgKanji98A3EmptyTex, + gMsgKanji98A4EmptyTex, + gMsgKanji98A5EmptyTex, + gMsgKanji98A6EmptyTex, + gMsgKanji98A7EmptyTex, + gMsgKanji98A8EmptyTex, + gMsgKanji98A9EmptyTex, + gMsgKanji98AAEmptyTex, + gMsgKanji98ABEmptyTex, + gMsgKanji98ACEmptyTex, + gMsgKanji98ADEmptyTex, + gMsgKanji98AEEmptyTex, + gMsgKanji98AFEmptyTex, + gMsgKanji98B0EmptyTex, + gMsgKanji98B1EmptyTex, + gMsgKanji98B2EmptyTex, + gMsgKanji98B3EmptyTex, + gMsgKanji98B4EmptyTex, + gMsgKanji98B5EmptyTex, + gMsgKanji98B6EmptyTex, + gMsgKanji98B7EmptyTex, + gMsgKanji98B8EmptyTex, + gMsgKanji98B9EmptyTex, + gMsgKanji98BAEmptyTex, + gMsgKanji98BBEmptyTex, + gMsgKanji98BCEmptyTex, + gMsgKanji98BDEmptyTex, + gMsgKanji98BEEmptyTex, + gMsgKanji98BFEmptyTex, + gMsgKanji98C0EmptyTex, + gMsgKanji98C1EmptyTex, + gMsgKanji98C2EmptyTex, + gMsgKanji98C3EmptyTex, + gMsgKanji98C4EmptyTex, + gMsgKanji98C5EmptyTex, + gMsgKanji98C6EmptyTex, + gMsgKanji98C7EmptyTex, + gMsgKanji98C8EmptyTex, + gMsgKanji98C9EmptyTex, + gMsgKanji98CAEmptyTex, + gMsgKanji98CBEmptyTex, + gMsgKanji98CCEmptyTex, + gMsgKanji98CDEmptyTex, + gMsgKanji98CEEmptyTex, + gMsgKanji98CFEmptyTex, + gMsgKanji98D0EmptyTex, + gMsgKanji98D1EmptyTex, + gMsgKanji98D2EmptyTex, + gMsgKanji98D3EmptyTex, + gMsgKanji98D4EmptyTex, + gMsgKanji98D5EmptyTex, + gMsgKanji98D6EmptyTex, + gMsgKanji98D7EmptyTex, + gMsgKanji98D8EmptyTex, + gMsgKanji98D9EmptyTex, + gMsgKanji98DAEmptyTex, + gMsgKanji98DBEmptyTex, + gMsgKanji98DCEmptyTex, + gMsgKanji98DDEmptyTex, + gMsgKanji98DEEmptyTex, + gMsgKanji98DFEmptyTex, + gMsgKanji98E0EmptyTex, + gMsgKanji98E1EmptyTex, + gMsgKanji98E2EmptyTex, + gMsgKanji98E3EmptyTex, + gMsgKanji98E4EmptyTex, + gMsgKanji98E5EmptyTex, + gMsgKanji98E6EmptyTex, + gMsgKanji98E7EmptyTex, + gMsgKanji98E8EmptyTex, + gMsgKanji98E9EmptyTex, + gMsgKanji98EAEmptyTex, + gMsgKanji98EBEmptyTex, + gMsgKanji98ECEmptyTex, + gMsgKanji98EDEmptyTex, + gMsgKanji98EEEmptyTex, + gMsgKanji98EFEmptyTex, + gMsgKanji98F0EmptyTex, + gMsgKanji98F1EmptyTex, + gMsgKanji98F2EmptyTex, + gMsgKanji98F3EmptyTex, + gMsgKanji98F4EmptyTex, + gMsgKanji98F5EmptyTex, + gMsgKanji98F6EmptyTex, + gMsgKanji98F7EmptyTex, + gMsgKanji98F8EmptyTex, + gMsgKanji98F9EmptyTex, + gMsgKanji98FAEmptyTex, + gMsgKanji98FBEmptyTex, + gMsgKanji98FCEmptyTex, +}; + const char* msgStaticTbl[] = { gDefaultMessageBackgroundTex, @@ -161,7 +4139,14 @@ const char* msgStaticTbl[] = gMessageArrowTex }; -void func_8006EE50(Font* font, u16 arg1, u16 arg2) { +void func_8006EE50(Font* font, u16 character, u16 codePointIndex) { + // #region SOH [NTSC] + // DmaMgr_RequestSync(&font->charTexBuf[codePointIndex], _kanjiSegmentStart + Kanji_OffsetFromShiftJIS(character), 0x80); + s32 charIndex = Kanji_OffsetFromShiftJIS(character); + charIndex /= FONT_CHAR_TEX_SIZE; + if (charIndex < ARRAY_COUNT(kanjiFontTbl)) + memcpy(&font->charTexBuf[codePointIndex], kanjiFontTbl[charIndex], strlen(kanjiFontTbl[charIndex]) + 1); + // #endregion } /** @@ -228,3 +4213,46 @@ void Font_LoadOrderedFont(Font* font) { } } } + +// #region SOH [NTSC] +extern MessageTableEntry* sJpnMessageEntryTablePtr; + +void Font_LoadOrderedFontNTSC(Font* font) { + s32 len; + s32 size; + s32 codePointIndex; + s32 fontBufIndex; + s32 offset; + + // font->msgOffset = _message_0xFFFC_jpn - (const char*)_jpn_message_data_staticSegmentStart; + // size = font->msgLength = _message_0xFFFD_jpn - _message_0xFFFC_jpn; + // len = (u32)size / 2; + // DmaMgr_RequestSync(font->msgBufWide, (uintptr_t)_jpn_message_data_staticSegmentRomStart + font->msgOffset, size); + MessageTableEntry* msgEntry = sJpnMessageEntryTablePtr; + + while (msgEntry->textId != 0xFFFC) { + msgEntry++; + } + + size = msgEntry->msgSize; + len = (u32)size / 2; + memcpy(font->msgBuf, msgEntry->segment, size); + + + fontBufIndex = 0; + for (codePointIndex = 0; font->msgBufWide[codePointIndex] != 0x8170; codePointIndex++) { + if (len < codePointIndex) { + osSyncPrintf("ERROR!! エラー!!! error───!!!!\n"); + break; + } + + if (font->msgBufWide[codePointIndex] != 0xA) { + offset = Kanji_OffsetFromShiftJIS(font->msgBufWide[codePointIndex]); + offset /= FONT_CHAR_TEX_SIZE; + memcpy(&font->fontBuf[fontBufIndex * 8], kanjiFontTbl[offset], strlen(kanjiFontTbl[offset]) + 1); + // DmaMgr_RequestSync(&font->fontBuf[fontBufIndex * 8], (uintptr_t)_kanjiSegmentStart + offset, FONT_CHAR_TEX_SIZE); + fontBufIndex += FONT_CHAR_TEX_SIZE / 8; + } + } +} +// #endregion diff --git a/soh/src/code/z_kanji.c b/soh/src/code/z_kanji.c new file mode 100644 index 000000000..cd818a9a1 --- /dev/null +++ b/soh/src/code/z_kanji.c @@ -0,0 +1,127 @@ +#include "global.h" +#include "macros.h" + +u16 T_800AF828_ne0[] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, + 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, + 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, + 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, + 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, + 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, + 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, + 0x0073, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0091, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, + 0x0099, 0x009A, 0x009B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, + 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, + 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, + 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, + 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, + 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, + 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, + 0x0122, 0x0123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0124, 0x0125, + 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, 0x0130, 0x0131, 0x0132, 0x0133, + 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, + 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, + 0x015E, 0x015F, 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, + 0x016C, 0x016D, 0x016E, 0x016F, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, + 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, + 0x018E, 0x018F, 0x0190, 0x0191, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0193, + 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, 0x01A0, 0x01A1, + 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9, 0x01AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x01AB, 0x01AC, 0x01AD, 0x01AE, 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, + 0x01B5, 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, + 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01CC, 0x01CD, 0x01CE, 0x01CF, + 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, + 0x01DE, 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8, 0x01E9, 0x01EA, 0x01EB, + 0x01EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x01ED, 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x01FA, + 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, + 0x0209, 0x020A, 0x020B, 0x020C, 0x020D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x020E, 0x020F, 0x0210, 0x0211, + 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217, 0x0218, 0x0219, 0x021A, 0x021B, 0x021C, 0x021D, 0x021E, 0x021F, + 0x0220, 0x0221, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0222, 0x0223, + 0x0224, 0x0225, 0x0226, 0x0227, 0x0228, 0x0229, 0x022A, 0x022B, 0x022C, 0x022D, 0x022E, 0x022F, 0x0230, 0x0231, + 0x0232, 0x0233, 0x0234, 0x0235, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0236, 0x0237, 0x0238, 0x0239, 0x023A, 0x023B, 0x023C, 0x023D, 0x023E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x023F, 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, + 0x0247, 0x0248, 0x0000, 0x0000, 0x0000, 0x0000, 0x0249, 0x024A, 0x024B, 0x024C, 0x024D, 0x024E, 0x024F, 0x0250, + 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0258, 0x0259, + 0x025A, 0x025B, 0x025C, 0x025D, 0x025E, 0x025F, 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0267, 0x0268, 0x0269, 0x026A, + 0x026B, 0x026C, 0x026D, 0x026E, 0x026F, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, 0x0278, + 0x0279, 0x027A, 0x027B, 0x027C, 0x027D, 0x027E, 0x027F, 0x0280, 0x0281, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x028A, 0x028B, 0x028C, 0x028D, + 0x028E, 0x028F, 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, 0x0299, 0x029A, 0x029B, + 0x029C, 0x029D, 0x029E, 0x029F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, 0x02A5, + 0x02A6, 0x02A7, 0x02A8, 0x02A9, 0x02AA, 0x02AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x02AC, 0x02AD, 0x02AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02AF, 0x02B0, 0x02B1, 0x02B2, + 0x02B3, 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8, 0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, 0x02BE, 0x02BF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02C0, 0x02C1, 0x02C2, 0x02C3, 0x02C4, 0x02C5, + 0x02C6, 0x02C7, 0x02C8, 0x02C9, 0x02CA, 0x02CB, 0x02CC, 0x02CD, 0x02CE, 0x02CF, 0x02D0, 0x02D1, 0x02D2, 0x02D3, + 0x02D4, 0x02D5, 0x02D6, 0x02D7, 0x02D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x02D9, 0x02DA, 0x02DB, 0x02DC, 0x02DD, 0x02DE, 0x02DF, 0x02E0, 0x02E1, 0x02E2, + 0x02E3, 0x02E4, 0x02E5, 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02EA, 0x02EB, 0x02EC, 0x02ED, 0x02EE, 0x02EF, 0x02F0, + 0x02F1, 0x02F2, 0x02F3, 0x02F4, 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9, 0x02FA, 0x02FB, 0x02FC, 0x02FD, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02FE, 0x02FF, 0x0300, 0x0301, 0x0302, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0303, 0x0304, 0x0305, 0x0306, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0307, 0x0308, 0x0309, +}; + +// Handwritten Function +s32 Kanji_OffsetFromShiftJIS(u32 arg0) { + s32 var_a3; + + if (arg0 >= 0x8800) { + var_a3 = (arg0 & 0xFF) - 0x40; + if (var_a3 >= 0x40) { + var_a3--; + } + return (var_a3 + 0x30A + (0xBC * ((arg0 >> 8) - 0x88))) << 7; + } + var_a3 = (arg0 & 0xFF) - 0x40; + if (var_a3 >= 0x40) { + var_a3--; + } + + // #Region SOH + int index = var_a3 + (0xBC * ((arg0 >> 8) - 0x81)); + if (index < 0 || index >= ARRAY_COUNT(T_800AF828_ne0)) { + // Invalid font char found + // @bug: Some characters e.g. 0x0222 can reach here incorrectly + return 0; + } + // #End region + + return T_800AF828_ne0[var_a3 + (0xBC * ((arg0 >> 8) - 0x81))] << 7; +} \ No newline at end of file diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index e6b944a73..4ab76a93b 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -12,6 +12,14 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/OTRGlobals.h" +#include "soh/SaveManager.h" +#include "soh/ResourceManagerHelpers.h" + +// #region SOH [NTSC] - Allows custom messages to work on japanese +static bool sDisplayNextMessageAsEnglish = false; +static u8 sLastLanguage = LANGUAGE_ENG; +static u16 sTextBoxNum = 0; +// #endregion s16 sTextFade = false; // original name: key_off_flag ? @@ -40,6 +48,7 @@ u16 sOcarinaSongBitFlags = 0; // ocarina bit flags MessageTableEntry* sNesMessageEntryTablePtr = NULL; MessageTableEntry* sGerMessageEntryTablePtr = NULL; MessageTableEntry* sFraMessageEntryTablePtr = NULL; +MessageTableEntry* sJpnMessageEntryTablePtr = NULL; MessageTableEntry* sStaffMessageEntryTablePtr = NULL; char* _message_0xFFFC_nes; @@ -283,6 +292,45 @@ void Message_GrowTextbox(MessageContext* msgCtx) { R_TEXTBOX_X = (R_TEXTBOX_X_TARGET + R_TEXTBOX_WIDTH_TARGET) - (R_TEXTBOX_WIDTH / 2); } +// Taken from decomped N64 1.0 z_message https://decomp.me/scratch/462bn +void Message_FindMessageJPN(PlayState* play, u16 textId) { + const char* foundSeg; + const char* nextSeg; + const char* seg; + Font* font = &play->msgCtx.font; + MessageTableEntry* messageTableEntry = sJpnMessageEntryTablePtr; + + seg = messageTableEntry->segment; + + while (messageTableEntry->textId != 0xFFFF) { + if (messageTableEntry->textId == textId) { + foundSeg = messageTableEntry->segment; + font->charTexBuf[0] = messageTableEntry->typePos; + nextSeg = messageTableEntry->segment; + font->msgOffset = messageTableEntry->segment; + font->msgLength = messageTableEntry->msgSize; + // "Message found!!!" + osSyncPrintf(" メッセージが,見つかった!!! = %x " + "(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n", + textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg); + return; + } + messageTableEntry++; + } + + // "Message not found!!!" + osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", textId); + messageTableEntry = sJpnMessageEntryTablePtr; + + foundSeg = messageTableEntry->segment; + font->charTexBuf[0] = messageTableEntry->typePos; + messageTableEntry++; + nextSeg = messageTableEntry->segment; + + font->msgOffset = foundSeg - seg; + font->msgLength = nextSeg - foundSeg; +} + void Message_FindMessage(PlayState* play, u16 textId) { const char* foundSeg; const char* nextSeg; @@ -290,13 +338,6 @@ void Message_FindMessage(PlayState* play, u16 textId) { const char** languageSegmentTable; Font* font; const char* seg; - u16 bufferId = textId; - // Use the better owl message if better owl is enabled - if (CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) != 0 && (bufferId == 0x2066 || bufferId == 0x607B || - bufferId == 0x10C2 || bufferId == 0x10C6 || bufferId == 0x206A)) - { - bufferId = 0x71B3; - } if (gSaveContext.language == LANGUAGE_GER) messageTableEntry = sGerMessageEntryTablePtr; @@ -312,7 +353,7 @@ void Message_FindMessage(PlayState* play, u16 textId) { while (messageTableEntry->textId != 0xFFFF) { font = &play->msgCtx.font; - if (messageTableEntry->textId == bufferId) { + if (messageTableEntry->textId == textId) { foundSeg = messageTableEntry->segment; font->charTexBuf[0] = messageTableEntry->typePos; @@ -323,14 +364,14 @@ void Message_FindMessage(PlayState* play, u16 textId) { // "Message found!!!" osSyncPrintf(" メッセージが,見つかった!!! = %x " "(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n", - bufferId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg); + textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg); return; } messageTableEntry++; } // "Message not found!!!" - osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", bufferId); + osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", textId); font = &play->msgCtx.font; messageTableEntry = sNesMessageEntryTablePtr; @@ -899,6 +940,345 @@ void Message_HandleOcarina(PlayState* play) { } } +// Taken from decomped N64 1.0 z_message https://decomp.me/scratch/462bn +void Message_DrawTextJPN(PlayState* play, Gfx** gfxP) { + MessageContext* msgCtx = &play->msgCtx; + Font* font = &play->msgCtx.font; + u16 character; + u16 j; + u16 i; + u16 charTexIdx; + Gfx* gfx = *gfxP; + int gTextSpeed, gSlowTextSpeed; + + play->msgCtx.textPosX = R_TEXT_INIT_XPOS; + play->msgCtx.textPosY = R_TEXT_INIT_YPOS; + + if (msgCtx->textBoxType == TEXTBOX_TYPE_NONE_NO_SHADOW) { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 0; + } else { + msgCtx->textColorR = msgCtx->textColorG = msgCtx->textColorB = 255; + } + + msgCtx->unk_E3D0 = 0; + charTexIdx = 0; + + gTextSpeed = CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 1); + gSlowTextSpeed = CVarGetInteger(CVAR_ENHANCEMENT("SlowTextSpeed"), gTextSpeed); + + for (i = 0; i < msgCtx->textDrawPos; i++) { + character = msgCtx->msgBufDecodedWide[i]; + + switch (character) { + case MESSAGE_NEWLINE_JPN: + msgCtx->textPosY += R_TEXT_LINE_SPACING; + msgCtx->textPosX = R_TEXT_INIT_XPOS; + if (msgCtx->choiceNum == 1) { + msgCtx->textPosX += 32; + } + if (msgCtx->choiceNum == 2) { + msgCtx->textPosX += 32; + } + break; + case MESSAGE_COLOR_JPN: + Message_SetTextColor(msgCtx, msgCtx->msgBufDecodedWide[++i]); + break; + case MESSAGE_SPACE_JPN: + msgCtx->textPosX += CVarGetInteger(CVAR_ENHANCEMENT("TextSpacing"), 6); + break; + case MESSAGE_BOX_BREAK_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + if (!sTextboxSkipped) { + Audio_PlaySoundGeneral(0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + msgCtx->msgMode = MSGMODE_TEXT_AWAIT_NEXT; + Font_LoadMessageBoxIcon(&play->msgCtx.font, TEXTBOX_ICON_TRIANGLE); + } else { + msgCtx->msgMode = MSGMODE_TEXT_NEXT_MSG; + msgCtx->textUnskippable = false; + msgCtx->msgBufPos++; + } + } + *gfxP = gfx; + return; + case MESSAGE_SHIFT_JPN: + msgCtx->textPosX += msgCtx->msgBufDecodedWide[++i]; + break; + case MESSAGE_TEXTID_JPN: + // #region SOH [General] Fixes softlock for higher text speeds + if (gTextSpeed > 1) { + msgCtx->textDrawPos = i + 1; + } + // #endregion + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_HAS_NEXT; + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySoundGeneral(0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + msgCtx->msgMode = MSGMODE_TEXT_DONE; + Font_LoadMessageBoxIcon(&play->msgCtx.font, TEXTBOX_ICON_TRIANGLE); + } + *gfxP = gfx; + return; + case MESSAGE_QUICKTEXT_ENABLE_JPN: + if ((i + 1 == msgCtx->textDrawPos || (gTextSpeed > 1 && i + gTextSpeed >= msgCtx->textDrawPos)) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING || + (msgCtx->msgMode >= MSGMODE_OCARINA_STARTING && + msgCtx->msgMode < MSGMODE_SCARECROW_LONG_RECORDING_START))) { + j = i; + while (true) { + character = msgCtx->msgBufDecodedWide[j]; + if ((character != MESSAGE_QUICKTEXT_DISABLE_JPN) && (character != MESSAGE_PERSISTENT_JPN) && + (character != MESSAGE_EVENT_JPN) && (character != MESSAGE_BOX_BREAK_DELAYED_JPN) && + (character != MESSAGE_AWAIT_BUTTON_PRESS_JPN) && (character != MESSAGE_BOX_BREAK_JPN) && + (character != MESSAGE_END_JPN)) { + j++; + } else { + break; + } + } + if (j > msgCtx->textDrawPos) { + i = j - 1; + msgCtx->textDrawPos = j; + } + } + /* fallthrough */ + case MESSAGE_QUICKTEXT_DISABLE_JPN: + break; + case MESSAGE_AWAIT_BUTTON_PRESS_JPN: + if (i + 1 == msgCtx->textDrawPos) { + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_AWAIT_INPUT; + Font_LoadMessageBoxIcon(&play->msgCtx.font, TEXTBOX_ICON_TRIANGLE); + } + *gfxP = gfx; + return; + } + break; + case MESSAGE_BOX_BREAK_DELAYED_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->stateTimer = msgCtx->msgBufDecodedWide[++i]; + msgCtx->msgMode = MSGMODE_TEXT_DELAYED_BREAK; + } + *gfxP = gfx; + return; + case MESSAGE_FADE2_JPN: + break; + case MESSAGE_SFX_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING && !sMessageHasSetSfx) { + sMessageHasSetSfx = true; + Audio_PlaySoundGeneral(msgCtx->msgBufDecodedWide[i + 1], &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + i++; + break; + case MESSAGE_ITEM_ICON_JPN: + i = Message_DrawItemIcon(play, msgCtx->msgBufDecodedWide[i + 1], &gfx, i); + break; + case MESSAGE_BACKGROUND_JPN: + // clang-format off + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { \ + Audio_PlaySoundGeneral(0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + // clang-format on + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfx++, 0, 0, sTextboxBackgroundBackPrimColors[msgCtx->textboxBackgroundBackColorIdx][0], + sTextboxBackgroundBackPrimColors[msgCtx->textboxBackgroundBackColorIdx][1], + sTextboxBackgroundBackPrimColors[msgCtx->textboxBackgroundBackColorIdx][2], + msgCtx->textColorAlpha); + + gDPLoadTextureBlock_4b(gfx++, (uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, G_IM_FMT_I, 96, 48, 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); + gSPTextureRectangle( + gfx++, (msgCtx->textPosX + 1) << 2, + (R_TEXTBOX_BG_YPOS + sTextboxBackgroundYOffsets[msgCtx->textboxBackgroundYOffsetIdx]) << 2, + (msgCtx->textPosX + 96 + 1) << 2, + (R_TEXTBOX_BG_YPOS + sTextboxBackgroundYOffsets[msgCtx->textboxBackgroundYOffsetIdx] + 48) << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + gDPLoadTextureBlock_4b(gfx++, (uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900, G_IM_FMT_I, 96, + 48, 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); + gSPTextureRectangle( + gfx++, (msgCtx->textPosX + 96 + 1) << 2, + (R_TEXTBOX_BG_YPOS + sTextboxBackgroundYOffsets[msgCtx->textboxBackgroundYOffsetIdx]) << 2, + (msgCtx->textPosX + 96 + 1 + 96 + 1) << 2, + (R_TEXTBOX_BG_YPOS + sTextboxBackgroundYOffsets[msgCtx->textboxBackgroundYOffsetIdx] + 48) << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, sTextboxBackgroundForePrimColors[msgCtx->textboxBackgroundForeColorIdx][0], + sTextboxBackgroundForePrimColors[msgCtx->textboxBackgroundForeColorIdx][1], + sTextboxBackgroundForePrimColors[msgCtx->textboxBackgroundForeColorIdx][2], + msgCtx->textColorAlpha); + + gDPLoadTextureBlock_4b(gfx++, ((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE), G_IM_FMT_I, 96, 48, 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); + gSPTextureRectangle(gfx++, msgCtx->textPosX << 2, R_TEXTBOX_BG_YPOS << 2, (msgCtx->textPosX + 96) << 2, + (R_TEXTBOX_BG_YPOS + 48) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + + gDPLoadTextureBlock_4b(gfx++, ((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900), G_IM_FMT_I, + 96, 48, 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); + gSPTextureRectangle(gfx++, (msgCtx->textPosX + 96) << 2, R_TEXTBOX_BG_YPOS << 2, + (msgCtx->textPosX + 192) << 2, (R_TEXTBOX_BG_YPOS + 48) << 2, G_TX_RENDERTILE, 0, 0, + 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + msgCtx->textPosX += 32; + break; + case MESSAGE_TEXT_SPEED_JPN: + msgCtx->textDelay = msgCtx->msgBufDecodedWide[++i]; + break; + case MESSAGE_UNSKIPPABLE_JPN: + msgCtx->textUnskippable = CVarGetInteger(CVAR_ENHANCEMENT("SkipText"), 0) != 1; + break; + case MESSAGE_TWO_CHOICE_JPN: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_2_CHOICE; + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->choiceTextId = msgCtx->textId; + msgCtx->stateTimer = 4; + msgCtx->choiceIndex = 0; + if (CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0)) { + if ((msgCtx->textId == 0x2066 || msgCtx->textId == 0x607B || msgCtx->textId == 0x10C2 || + msgCtx->textId == 0x10C6 || msgCtx->textId == 0x206A)) { + msgCtx->choiceIndex = 1; + } + } + Font_LoadMessageBoxIcon(font, TEXTBOX_ICON_ARROW); + } + break; + case MESSAGE_THREE_CHOICE_JPN: + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_3_CHOICE; + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->choiceTextId = msgCtx->textId; + msgCtx->stateTimer = 4; + msgCtx->choiceIndex = 0; + Font_LoadMessageBoxIcon(font, TEXTBOX_ICON_ARROW); + } + break; + case MESSAGE_END_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_DEFAULT) { + Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_END, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Font_LoadMessageBoxIcon(font, TEXTBOX_ICON_SQUARE); + if (play->csCtx.state == 0) { + Interface_SetDoAction(play, DO_ACTION_RETURN); + } + } + } + *gfxP = gfx; + return; + case MESSAGE_OCARINA_JPN: + // #region SOH [General] Fixes softlock for higher text speeds + if (gTextSpeed > 1) { + msgCtx->textDrawPos = i + 1; + } + // #endregion + if (i + 1 == msgCtx->textDrawPos) { + Message_HandleOcarina(play); + *gfxP = gfx; + return; + } + break; + case MESSAGE_FADE_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_FADING; + msgCtx->stateTimer = msgCtx->msgBufDecodedWide[++i]; + Font_LoadMessageBoxIcon(font, TEXTBOX_ICON_SQUARE); + if (play->csCtx.state == 0) { + Interface_SetDoAction(play, DO_ACTION_RETURN); + } + } + *gfxP = gfx; + return; + case MESSAGE_PERSISTENT_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + Audio_PlaySoundGeneral(0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_PERSISTENT; + } + *gfxP = gfx; + return; + case MESSAGE_EVENT_JPN: + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { + msgCtx->msgMode = MSGMODE_TEXT_DONE; + msgCtx->textboxEndType = TEXTBOX_ENDTYPE_EVENT; + Font_LoadMessageBoxIcon(&play->msgCtx.font, TEXTBOX_ICON_TRIANGLE); + Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_END, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + *gfxP = gfx; + return; + default: + switch (character) { + case 0x8169: + case 0x8175: + msgCtx->textPosX -= 6; + break; + case 0x8145: + msgCtx->textPosX -= 3; + break; + case 0x8148: + case 0x8149: + case 0x814F: + case 0x8250: + msgCtx->textPosX -= 2; + break; + } + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING && i + 1 == msgCtx->textDrawPos && + msgCtx->textDelayTimer == msgCtx->textDelay) { + Audio_PlaySoundGeneral(0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + Message_DrawTextChar(play, &font->charTexBuf[charTexIdx], &gfx); + charTexIdx += FONT_CHAR_TEX_SIZE; + + switch (character) { + case 0x8144: + msgCtx->textPosX += 3; + break; + case 0x816A: + case 0x8176: + msgCtx->textPosX += 5; + break; + case 0x8141: + case 0x8142: + case 0x8168: + msgCtx->textPosX += 7; + break; + case 0x814F: + case 0x8194: + case 0x8196: + msgCtx->textPosX += 9; + break; + case 0x8145: + msgCtx->textPosX += 10; + break; + default: + msgCtx->textPosX += (s32)(16.0f * (R_TEXT_CHAR_SCALE / 100.0f)); + break; + } + break; + } + } + + if (msgCtx->textDelay == 0) { + msgCtx->textDrawPos = i + gTextSpeed; + if (msgCtx->textDrawPos > msgCtx->decodedTextLen) { + msgCtx->textDrawPos = msgCtx->decodedTextLen + 1; + } + } else if (msgCtx->textDelayTimer == 0) { + msgCtx->textDrawPos = i + 1; + msgCtx->textDelayTimer = msgCtx->textDelay; + } else if (msgCtx->textDelayTimer <= gSlowTextSpeed) { + msgCtx->textDelayTimer = 0; + } else { + msgCtx->textDelayTimer -= gSlowTextSpeed; + } + *gfxP = gfx; +} + /** * Draws the text contents of a textbox, up to the current point that has * been scrolled to so far. @@ -984,7 +1364,7 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { *gfxP = gfx; return; case MESSAGE_QUICKTEXT_ENABLE: - if (i < msgCtx->textDrawPos && i + gTextSpeed >= msgCtx->textDrawPos && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING || + if ((i + 1 == msgCtx->textDrawPos || (gTextSpeed > 1 && i + gTextSpeed >= msgCtx->textDrawPos)) && (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING || (msgCtx->msgMode >= MSGMODE_OCARINA_STARTING && msgCtx->msgMode < MSGMODE_SCARECROW_LONG_RECORDING_START))) { j = i; @@ -1124,6 +1504,12 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { msgCtx->choiceTextId = msgCtx->textId; msgCtx->stateTimer = 4; msgCtx->choiceIndex = 0; + if (CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0)) { + if ((msgCtx->textId == 0x2066 || msgCtx->textId == 0x607B || msgCtx->textId == 0x10C2 || + msgCtx->textId == 0x10C6 || msgCtx->textId == 0x206A)) { + msgCtx->choiceIndex = 1; + } + } Font_LoadMessageBoxIcon(font, TEXTBOX_ICON_ARROW); } break; @@ -1151,7 +1537,11 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { *gfxP = gfx; return; case MESSAGE_OCARINA: - msgCtx->textDrawPos = i + 1; + // #region SOH [General] Fixes softlock for higher text speeds + if (gTextSpeed > 1) { + msgCtx->textDrawPos = i + 1; + } + // #endregion if (i + 1 == msgCtx->textDrawPos) { Message_HandleOcarina(play); *gfxP = gfx; @@ -1187,6 +1577,21 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { } *gfxP = gfx; return; + // #region SOH [NTSC] - support multiple file name languages + case MESSAGE_NAME: + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_NTSC && gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_NTSC_JPN) { + if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING && i + 1 == msgCtx->textDrawPos && + msgCtx->textDelayTimer == msgCtx->textDelay) { + Audio_PlaySoundGeneral(0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + Message_DrawTextChar(play, &font->charTexBuf[charTexIdx], &gfx); + charTexIdx += FONT_CHAR_TEX_SIZE; + + msgCtx->textPosX += (s32)(16.0f * (R_TEXT_CHAR_SCALE / 100.0f)); + break; + } + /* fallthrough */ + // #endregion default: if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING && i + 1 == msgCtx->textDrawPos && msgCtx->textDelayTimer == msgCtx->textDelay) { @@ -1213,17 +1618,18 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { } void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) { - static s16 sIconItem32XOffsets[] = { 74, 74, 74 }; - static s16 sIconItem24XOffsets[] = { 72, 72, 72 }; + static s16 sIconItem32XOffsets[] = { 74, 74, 74, 54 }; + static s16 sIconItem24XOffsets[] = { 72, 72, 72, 50 }; MessageContext* msgCtx = &play->msgCtx; InterfaceContext* interfaceCtx = &play->interfaceCtx; + u8 language = sDisplayNextMessageAsEnglish ? LANGUAGE_ENG : gSaveContext.language; if (itemId == ITEM_DUNGEON_MAP) { interfaceCtx->mapPalette[30] = 0xFF; interfaceCtx->mapPalette[31] = 0xFF; } if (itemId < ITEM_MEDALLION_FOREST) { - R_TEXTBOX_ICON_XPOS = R_TEXT_INIT_XPOS - sIconItem32XOffsets[gSaveContext.language]; + R_TEXTBOX_ICON_XPOS = R_TEXT_INIT_XPOS - sIconItem32XOffsets[language]; R_TEXTBOX_ICON_YPOS = y + 6; R_TEXTBOX_ICON_SIZE = 32; memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, @@ -1231,7 +1637,7 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) { // "Item 32-0" osSyncPrintf("アイテム32-0\n"); } else { - R_TEXTBOX_ICON_XPOS = R_TEXT_INIT_XPOS - sIconItem24XOffsets[gSaveContext.language]; + R_TEXTBOX_ICON_XPOS = R_TEXT_INIT_XPOS - sIconItem24XOffsets[language]; R_TEXTBOX_ICON_YPOS = y + 10; R_TEXTBOX_ICON_SIZE = 24; memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, @@ -1243,6 +1649,601 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) { msgCtx->choiceNum = 1; } +// #region SOH [NTSC] - Add support for filenames on different versions +bool Message_DecodeName(PlayState* play, s16* decodedBufPosPtr, s32* charTexIdxPtr) { + s32 i; + s32 j; + s32 playerNameLen; + u8 curChar2; + MessageContext* msgCtx = &play->msgCtx; + Font* font = &play->msgCtx.font; + u8 emptyChar = (gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_PAL) ? 0x3E : 0xDF; + + for (playerNameLen = ARRAY_COUNT(gSaveContext.playerName); playerNameLen > 0; playerNameLen--) { + if (gSaveContext.playerName[playerNameLen - 1] != emptyChar) { + break; + } + } + + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + if (gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_PAL) { + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + if (curChar2 == 0x3E) { + curChar2 = ' '; + } else if (curChar2 == 0x40) { + curChar2 = '.'; + } else if (curChar2 == 0x3F) { + curChar2 = '-'; + } else if (curChar2 < 0xA) { + curChar2 += 0; + curChar2 += '0'; + } else if (curChar2 < 0x24) { + curChar2 += 0; + curChar2 += '7'; + } else if (curChar2 < 0x3E) { + curChar2 += 0; + curChar2 += '='; + } + if (curChar2 != ' ') { + Font_LoadChar(font, curChar2 - ' ', *charTexIdxPtr); + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + + msgCtx->msgBufDecoded[*decodedBufPosPtr] = curChar2; + (*decodedBufPosPtr)++; + } + } else if (gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_NTSC_ENG) { + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + if (curChar2 == 0xDF) { + curChar2 = ' '; + } else if (curChar2 == 0xEA) { + curChar2 = '.'; + } else if (curChar2 == 0xE4) { + curChar2 = '-'; + } else if (curChar2 < 0xA) { + curChar2 += 0; + curChar2 += '0'; + } else if (curChar2 < 0xC5) { + curChar2 += 0; + curChar2 -= 0x6A; + } else if (curChar2 < 0xDF) { + curChar2 += 0; + curChar2 -= 0x64; + } + if (curChar2 != ' ') { + Font_LoadChar(font, curChar2 - ' ', *charTexIdxPtr); + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + + msgCtx->msgBufDecoded[(*decodedBufPosPtr)] = curChar2; + (*decodedBufPosPtr)++; + } + } else { + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + + // Remove JPN Characters from the pool (set them to ' ') + if (curChar2 >= 0x0A && curChar2 < 0xAB) { + curChar2 = 0xDF; + } else if (curChar2 == 0xE7 || curChar2 == 0xE8) { + curChar2 = 0xDF; + } + + if (curChar2 == 0xDF) { + curChar2 = ' '; + } else if (curChar2 == 0xEA) { + curChar2 = '.'; + } else if (curChar2 == 0xE4) { + curChar2 = '-'; + } else if (curChar2 < 0xA) { + curChar2 += 0; + curChar2 += '0'; + } else if (curChar2 < 0xC5) { + curChar2 += 0; + curChar2 -= 0x6A; + } else if (curChar2 < 0xDF) { + curChar2 += 0; + curChar2 -= 0x64; + } + + if (curChar2 != ' ') { + Font_LoadChar(font, curChar2 - ' ', *charTexIdxPtr); + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + + msgCtx->msgBufDecoded[(*decodedBufPosPtr)] = curChar2; + (*decodedBufPosPtr)++; + } + } + } else { // GAME_REGION_NTSC + + if (gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_NTSC_JPN) { + if (gSaveContext.language == LANGUAGE_JPN) { + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + u8* fontBuf = &font->fontBuf[(curChar2 * 32) << 2]; + msgCtx->msgBufDecodedWide[(*decodedBufPosPtr)++] = MESSAGE_NAME_JPN; + for (j = 0; j < FONT_CHAR_TEX_SIZE; j += 4) { + font->charTexBuf[*charTexIdxPtr + j + 0] = fontBuf[j + 0]; + font->charTexBuf[*charTexIdxPtr + j + 1] = fontBuf[j + 1]; + font->charTexBuf[*charTexIdxPtr + j + 2] = fontBuf[j + 2]; + font->charTexBuf[*charTexIdxPtr + j + 3] = fontBuf[j + 3]; + } + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + } else { // LANGUAGE_ENG + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + u8* fontBuf = &font->fontBuf[(curChar2 * 32) << 2]; + msgCtx->msgBufDecoded[(*decodedBufPosPtr)++] = MESSAGE_NAME; + for (j = 0; j < FONT_CHAR_TEX_SIZE; j += 4) { + font->charTexBuf[*charTexIdxPtr + j + 0] = fontBuf[j + 0]; + font->charTexBuf[*charTexIdxPtr + j + 1] = fontBuf[j + 1]; + font->charTexBuf[*charTexIdxPtr + j + 2] = fontBuf[j + 2]; + font->charTexBuf[*charTexIdxPtr + j + 3] = fontBuf[j + 3]; + } + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + } + } else if (gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_NTSC_ENG) { + if (gSaveContext.language == LANGUAGE_JPN) { + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + u8* fontBuf = &font->fontBuf[(curChar2 * 32) << 2]; + msgCtx->msgBufDecodedWide[(*decodedBufPosPtr)++] = MESSAGE_NAME_JPN; + for (j = 0; j < FONT_CHAR_TEX_SIZE; j += 4) { + font->charTexBuf[*charTexIdxPtr + j + 0] = fontBuf[j + 0]; + font->charTexBuf[*charTexIdxPtr + j + 1] = fontBuf[j + 1]; + font->charTexBuf[*charTexIdxPtr + j + 2] = fontBuf[j + 2]; + font->charTexBuf[*charTexIdxPtr + j + 3] = fontBuf[j + 3]; + } + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + } else { // LANGUAGE_ENG + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + if (curChar2 == 0xDF) { + curChar2 = ' '; + } else if (curChar2 == 0xEA) { + curChar2 = '.'; + } else if (curChar2 == 0xE4) { + curChar2 = '-'; + } else if (curChar2 < 0xA) { + curChar2 += 0; + curChar2 += '0'; + } else if (curChar2 < 0xC5) { + curChar2 += 0; + curChar2 -= 0x6A; + } else if (curChar2 < 0xDF) { + curChar2 += 0; + curChar2 -= 0x64; + } + if (curChar2 != ' ') { + Font_LoadChar(font, curChar2 - ' ', *charTexIdxPtr); + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + + msgCtx->msgBufDecoded[(*decodedBufPosPtr)] = curChar2; + (*decodedBufPosPtr)++; + } + } + } else if (gSaveContext.ship.filenameLanguage == NAME_LANGUAGE_PAL) { + if (gSaveContext.language == LANGUAGE_JPN) { + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + + // Convert PAL char to NTSC + if (curChar2 >= 0xA && curChar2 <= 0x3E) { + curChar2 += 0xA1; + } else if (curChar2 == 0x3F) { + curChar2 += 0xA5; + } else if (curChar2 == 0x40) { + curChar2 += 0xAA; + } + + u8* fontBuf = &font->fontBuf[(curChar2 * 32) << 2]; + msgCtx->msgBufDecoded[(*decodedBufPosPtr)++] = MESSAGE_NAME; + for (j = 0; j < FONT_CHAR_TEX_SIZE; j += 4) { + font->charTexBuf[*charTexIdxPtr + j + 0] = fontBuf[j + 0]; + font->charTexBuf[*charTexIdxPtr + j + 1] = fontBuf[j + 1]; + font->charTexBuf[*charTexIdxPtr + j + 2] = fontBuf[j + 2]; + font->charTexBuf[*charTexIdxPtr + j + 3] = fontBuf[j + 3]; + } + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + } else { // LANGUAGE_ENG + for (i = 0; i < playerNameLen; i++) { + curChar2 = gSaveContext.playerName[i]; + if (curChar2 == 0x3E) { + curChar2 = ' '; + } else if (curChar2 == 0x40) { + curChar2 = '.'; + } else if (curChar2 == 0x3F) { + curChar2 = '-'; + } else if (curChar2 < 0xA) { + curChar2 += 0; + curChar2 += '0'; + } else if (curChar2 < 0x24) { + curChar2 += 0; + curChar2 += '7'; + } else if (curChar2 < 0x3E) { + curChar2 += 0; + curChar2 += '='; + } + if (curChar2 != ' ') { + Font_LoadChar(font, curChar2 - ' ', *charTexIdxPtr); + *charTexIdxPtr += FONT_CHAR_TEX_SIZE; + } + + msgCtx->msgBufDecoded[*decodedBufPosPtr] = curChar2; + (*decodedBufPosPtr)++; + } + } + } + } + (*decodedBufPosPtr)--; + + return true; +} +// #endregion + +// Taken from decomped N64 1.0 z_message https://decomp.me/scratch/462bn +void Message_DecodeJPN(PlayState* play) { + u16 curChar; + u8 curChar2; + u8 *fontBuf; + s32 loadChar; + s32 charTexIdx = 0; + s16 playerNameLen; + s16 numLines = 0; + s16 digits[4]; + u16 value; + s16 decodedBufPos = 0; + s16 i; + s16 j; + f32 timeInSeconds; + MessageContext *msgCtx = &play->msgCtx; + Font *font = &play->msgCtx.font; + + while (true) { + curChar = msgCtx->msgBufDecodedWide[decodedBufPos] = font->msgBufWide[msgCtx->msgBufPos]; + + // #region SOH - Don't require input for credits textboxes in randomizer + if (CVarGetInteger(CVAR_ENHANCEMENT("NoInputForCredits"), 0) && ( + msgCtx->textId == 0x706F || + msgCtx->textId == 0x7091 || + msgCtx->textId == 0x7092 || + msgCtx->textId == 0x7093 || + msgCtx->textId == 0x7094 || + msgCtx->textId == 0x7095 + )) { + if (curChar == MESSAGE_BOX_BREAK_JPN) { + curChar = msgCtx->msgBufDecodedWide[decodedBufPos] = font->msgBufWide[msgCtx->msgBufPos] = MESSAGE_BOX_BREAK_DELAYED_JPN; + } else if (curChar == MESSAGE_END_JPN) { + // use fade instead of fade2, as fade2 is unimplemented in JP + curChar = msgCtx->msgBufDecodedWide[decodedBufPos] = font->msgBufWide[msgCtx->msgBufPos] = MESSAGE_FADE_JPN; + curChar = msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[++msgCtx->msgBufPos] = MESSAGE_END_JPN; + } + } + // #endregion + + if (curChar == MESSAGE_BOX_BREAK_JPN || curChar == MESSAGE_TEXTID_JPN || curChar == MESSAGE_BOX_BREAK_DELAYED_JPN || + curChar == MESSAGE_EVENT_JPN || curChar == MESSAGE_END_JPN) { + msgCtx->msgMode = MSGMODE_TEXT_DISPLAYING; + msgCtx->textDrawPos = 1; + R_TEXT_INIT_YPOS = R_TEXTBOX_Y + 6; + if (msgCtx->textBoxType != TEXTBOX_TYPE_NONE_BOTTOM) { + if (numLines == 0) { + R_TEXT_INIT_YPOS = (u16)(R_TEXTBOX_Y + 22); + } else if (numLines == 1) { + R_TEXT_INIT_YPOS = (u16)(R_TEXTBOX_Y + 14); + } + } + if (curChar == MESSAGE_TEXTID_JPN) { + sNextTextId = msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[msgCtx->msgBufPos + 1]; + } + if (curChar == MESSAGE_BOX_BREAK_DELAYED_JPN) { + msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[msgCtx->msgBufPos + 1]; + msgCtx->msgBufPos += 2; + } + msgCtx->decodedTextLen = decodedBufPos; + if (sTextboxSkipped) { + msgCtx->textDrawPos = msgCtx->decodedTextLen; + } + break; + } + if (curChar == MESSAGE_NAME_JPN) { + // #region SOH [NTSC] - Support multiple names + if (!Message_DecodeName(play, &decodedBufPos, &charTexIdx)) { + for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) { + if (gSaveContext.playerName[playerNameLen - 1] != 0xDF) { + break; + } + } + for (i = 0; i < playerNameLen; i++) { + curChar = gSaveContext.playerName[i]; + // FAKE? Figure out what best way to match is + fontBuf = &font->fontBuf[(curChar * 32) << 2]; + msgCtx->msgBufDecodedWide[decodedBufPos + i] = MESSAGE_NAME_JPN; + + for (j = 0; j < FONT_CHAR_TEX_SIZE; j += 4) { + font->charTexBuf[charTexIdx + j + 0] = fontBuf[j + 0]; + font->charTexBuf[charTexIdx + j + 1] = fontBuf[j + 1]; + font->charTexBuf[charTexIdx + j + 2] = fontBuf[j + 2]; + font->charTexBuf[charTexIdx + j + 3] = fontBuf[j + 3]; + } + charTexIdx += FONT_CHAR_TEX_SIZE; + } + decodedBufPos += playerNameLen - 1; + } + } else if (curChar == MESSAGE_MARATHON_TIME_JPN || curChar == MESSAGE_RACE_TIME_JPN) { + digits[0] = digits[1] = digits[2] = 0; + if (curChar == MESSAGE_RACE_TIME_JPN) { + digits[3] = gSaveContext.timerSeconds; + } else { + digits[3] = gSaveContext.subTimerSeconds; + } + while (digits[3] >= 60) { + digits[1]++; + if (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + digits[3] -= 60; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + if (i == 1) { + func_8006EE50(font, 0x95AA, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = 0x95AA; + decodedBufPos++; + } else if (i == 3) { + func_8006EE50(font, 0x9562, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = 0x9562; + } + } + } else if (curChar == MESSAGE_POINTS_JPN) { + digits[0] = digits[1] = digits[2] = 0; + digits[3] = gSaveContext.minigameScore; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + loadChar = false; + for (i = 0; i < 4; i++) { + if (i == 3 || digits[i] != 0) { + loadChar = true; + } + if (loadChar) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == MESSAGE_TOKENS_JPN) { + digits[0] = digits[1] = 0; + digits[2] = gSaveContext.inventory.gsTokens; + + while (digits[2] >= 100) { + digits[0]++; + digits[2] -= 100; + } + while (digits[2] >= 10) { + digits[1]++; + digits[2] -= 10; + } + + loadChar = false; + for (i = 0; i < 3; i++) { + if (i == 2 || digits[i] != 0) { + loadChar = true; + } + if (loadChar) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == MESSAGE_FISH_INFO_JPN) { + digits[0] = 0; + digits[1] = gSaveContext.minigameScore; + + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + + for (i = 0; i < 2; i++) { + if (i == 1 || digits[i] != 0) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + } + } + decodedBufPos--; + } else if (curChar == MESSAGE_HIGHSCORE_JPN) { + value = HIGH_SCORE(font->msgBufWide[++msgCtx->msgBufPos] & 0xFF); + if ((font->msgBufWide[msgCtx->msgBufPos] & 0xFF) == 2) { + if (LINK_AGE_IN_YEARS == YEARS_CHILD) { + value &= 0x7F; + } else { + value = ((HIGH_SCORE(font->msgBufWide[msgCtx->msgBufPos]) & 0xFF000000) >> 0x18) & 0x7F; + } + } + switch (font->msgBufWide[msgCtx->msgBufPos] & 0xFF) { + case HS_HBA: + case HS_POE_POINTS: + case HS_FISHING: + digits[0] = digits[1] = digits[2] = 0; + digits[3] = value; + + while (digits[3] >= 1000) { + digits[0]++; + digits[3] -= 1000; + } + while (digits[3] >= 100) { + digits[1]++; + digits[3] -= 100; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + loadChar = false; + for (i = 0; i < 4; i++) { + if (i == 3 || digits[i] != 0) { + loadChar = true; + } + if (loadChar) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + } + } + decodedBufPos--; + break; + case HS_UNK_05: + break; + case HS_HORSE_RACE: + case HS_MARATHON: + case HS_DAMPE_RACE: + digits[0] = digits[1] = digits[2] = 0; + digits[3] = value; + + while (digits[3] >= 60) { + digits[1]++; + if (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + digits[3] -= 60; + } + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + if (i == 1) { + func_8006EE50(font, 0x95AA, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = 0x95AA; + decodedBufPos++; + } else if (i == 3) { + func_8006EE50(font, 0x9562, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = 0x9562; + } + } + break; + } + } else if (curChar == MESSAGE_TIME_JPN) { + digits[0] = 0; + timeInSeconds = gSaveContext.dayTime * (24.0f * 60.0f / 0x10000); + + digits[1] = timeInSeconds / 60.0f; + while (digits[1] >= 10) { + digits[0]++; + digits[1] -= 10; + } + digits[2] = 0; + digits[3] = (s16)timeInSeconds % 60; + while (digits[3] >= 10) { + digits[2]++; + digits[3] -= 10; + } + + for (i = 0; i < 4; i++) { + func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; + decodedBufPos++; + if (i == 1) { + func_8006EE50(font, 0x8E9E, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = 0x8E9E; + decodedBufPos++; + } else if (i == 3) { + func_8006EE50(font, 0x95AA, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + msgCtx->msgBufDecodedWide[decodedBufPos] = 0x95AA; + } + } + } else if (curChar == MESSAGE_ITEM_ICON_JPN) { + msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[msgCtx->msgBufPos + 1]; + Message_LoadItemIcon(play, font->msgBufWide[msgCtx->msgBufPos + 1], R_TEXTBOX_Y + 10); + } else if (curChar == MESSAGE_BACKGROUND_JPN) { + msgCtx->textboxBackgroundIdx = font->msgBufWide[msgCtx->msgBufPos + 1] * 2; + msgCtx->textboxBackgroundForeColorIdx = (font->msgBufWide[msgCtx->msgBufPos + 2] & 0xF000) >> 12; + msgCtx->textboxBackgroundBackColorIdx = (font->msgBufWide[msgCtx->msgBufPos + 2] & 0xF00) >> 8; + msgCtx->textboxBackgroundYOffsetIdx = (font->msgBufWide[msgCtx->msgBufPos + 2] & 0xF0) >> 4; + msgCtx->textboxBackgroundUnkArg = font->msgBufWide[msgCtx->msgBufPos + 2] & 0xF; + memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, gRedMessageXLeftTex, strlen(gRedMessageXLeftTex) + 1); + memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900, gRedMessageXRightTex, strlen(gRedMessageXRightTex) + 1); + numLines = 2; + msgCtx->msgBufPos += 2; + R_TEXTBOX_BG_YPOS = R_TEXTBOX_Y + 8; + } else if (curChar == MESSAGE_COLOR_JPN) { + msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[++msgCtx->msgBufPos] & 0xF; + } else if (curChar == MESSAGE_NEWLINE_JPN) { + numLines++; + } else if (curChar != MESSAGE_QUICKTEXT_ENABLE_JPN && curChar != MESSAGE_QUICKTEXT_DISABLE_JPN && + curChar != MESSAGE_AWAIT_BUTTON_PRESS_JPN && curChar != MESSAGE_OCARINA_JPN && + curChar != MESSAGE_PERSISTENT_JPN && curChar != MESSAGE_UNSKIPPABLE_JPN) { + if (curChar == MESSAGE_FADE_JPN) { + sTextFade = true; + msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[++msgCtx->msgBufPos] & 0xFF; + } else if (curChar == MESSAGE_SHIFT_JPN || curChar == MESSAGE_TEXT_SPEED_JPN) { + msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[++msgCtx->msgBufPos] & 0xFF; + } else if (curChar == MESSAGE_SFX_JPN) { + msgCtx->msgBufDecodedWide[++decodedBufPos] = font->msgBufWide[++msgCtx->msgBufPos]; + } else if (curChar == MESSAGE_TWO_CHOICE_JPN) { + msgCtx->choiceNum = 2; + } else if (curChar == MESSAGE_THREE_CHOICE_JPN) { + msgCtx->choiceNum = 3; + R_TEXT_INIT_XPOS += 32; + } else if (curChar != MESSAGE_SPACE_JPN) { + func_8006EE50(font, curChar, charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + } + } + decodedBufPos++; + msgCtx->msgBufPos++; + } +} + void Message_Decode(PlayState* play) { u8 temp_s2; u8 phi_s1; @@ -1258,6 +2259,10 @@ void Message_Decode(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; Font* font = &play->msgCtx.font; + // #region SOH [NTSC] - allow switching languages mid text + sTextBoxNum++; + // #endregion + if ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING && msgCtx->msgMode <= MSGMODE_OCARINA_AWAIT_INPUT) || msgCtx->textBoxType == TEXTBOX_TYPE_OCARINA) { // TODO: Figure out what specific textures to invalidate to prevent the ocarina textboxes from flashing gSPInvalidateTexCache(play->state.gfxCtx->polyOpa.p++, NULL); @@ -1273,6 +2278,13 @@ void Message_Decode(PlayState* play) { play->msgCtx.textUnskippable = play->msgCtx.textDelay = play->msgCtx.textDelayTimer = 0; sTextFade = false; + // #region SOH [NTSC] - Originally this is all in one function, but for ease of reading, the JP decoding will be separated out + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DecodeJPN(play); + return; + } + // #endregion + while (true) { phi_s1 = temp_s2 = msgCtx->msgBufDecoded[decodedBufPos] = font->msgBuf[msgCtx->msgBufPos]; @@ -1328,40 +2340,46 @@ void Message_Decode(PlayState* play) { break; } else if (temp_s2 == MESSAGE_NAME) { // Substitute the player name control character for the file's player name. - for (playerNameLen = ARRAY_COUNT(gSaveContext.playerName); playerNameLen > 0; playerNameLen--) { - if (gSaveContext.playerName[playerNameLen - 1] != 0x3E) { - break; + // #region SOH [NTSC] - Support PAL and NTSC with either language + // Function always returns true, so block is not entered + if (!Message_DecodeName(play, &decodedBufPos, &charTexIdx)) { + for (playerNameLen = ARRAY_COUNT(gSaveContext.playerName); playerNameLen > 0; playerNameLen--) { + if (gSaveContext.playerName[playerNameLen - 1] != 0x3E) { + break; + } } + // "Name" + osSyncPrintf("\n名前 = "); + + for (i = 0; i < playerNameLen; i++) { + phi_s1 = gSaveContext.playerName[i]; + if (phi_s1 == 0x3E) { + phi_s1 = ' '; + } else if (phi_s1 == 0x40) { + phi_s1 = '.'; + } else if (phi_s1 == 0x3F) { + phi_s1 = '-'; + } else if (phi_s1 < 0xA) { + phi_s1 += 0; + phi_s1 += '0'; + } else if (phi_s1 < 0x24) { + phi_s1 += 0; + phi_s1 += '7'; + } else if (phi_s1 < 0x3E) { + phi_s1 += 0; + phi_s1 += '='; + } + if (phi_s1 != ' ') { + Font_LoadChar(font, phi_s1 - ' ', charTexIdx); + charTexIdx += FONT_CHAR_TEX_SIZE; + } + osSyncPrintf("%x ", phi_s1); + msgCtx->msgBufDecoded[decodedBufPos] = phi_s1; + decodedBufPos++; + } + decodedBufPos--; } - // "Name" - osSyncPrintf("\n名前 = "); - for (i = 0; i < playerNameLen; i++) { - phi_s1 = gSaveContext.playerName[i]; - if (phi_s1 == 0x3E) { - phi_s1 = ' '; - } else if (phi_s1 == 0x40) { - phi_s1 = '.'; - } else if (phi_s1 == 0x3F) { - phi_s1 = '-'; - } else if (phi_s1 < 0xA) { - phi_s1 += 0; - phi_s1 += '0'; - } else if (phi_s1 < 0x24) { - phi_s1 += 0; - phi_s1 += '7'; - } else if (phi_s1 < 0x3E) { - phi_s1 += 0; - phi_s1 += '='; - } - if (phi_s1 != ' ') { - Font_LoadChar(font, phi_s1 - ' ', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; - } - osSyncPrintf("%x ", phi_s1); - msgCtx->msgBufDecoded[decodedBufPos] = phi_s1; - decodedBufPos++; - } - decodedBufPos--; + // #endregion } else if (temp_s2 == MESSAGE_MARATHON_TIME || temp_s2 == MESSAGE_RACE_TIME) { // Convert the values of the appropriate timer to digits and add the // digits to the decoded buffer in place of the control character. @@ -1369,9 +2387,9 @@ void Message_Decode(PlayState* play) { osSyncPrintf("\nEVENTタイマー = "); digits[0] = digits[1] = digits[2] = 0; if (temp_s2 == MESSAGE_RACE_TIME) { - digits[3] = gSaveContext.timer1Value; + digits[3] = gSaveContext.timerSeconds; } else { - digits[3] = gSaveContext.timer2Value; + digits[3] = gSaveContext.subTimerSeconds; } while (digits[3] >= 60) { @@ -1672,6 +2690,8 @@ void Message_OpenText(PlayState* play, u16 textId) { Font* font = &msgCtx->font; s16 textBoxType; + sDisplayNextMessageAsEnglish = false; + if (msgCtx->msgMode == MSGMODE_NONE) { gSaveContext.unk_13EE = gSaveContext.unk_13EA; } @@ -1698,6 +2718,10 @@ void Message_OpenText(PlayState* play, u16 textId) { R_TEXT_LINE_SPACING = 6; R_TEXT_INIT_XPOS = 20; YREG(1) = 48; + } else if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + R_TEXT_CHAR_SCALE = 88; + R_TEXT_LINE_SPACING = 18; + R_TEXT_INIT_XPOS = 50; } else { R_TEXT_CHAR_SCALE = 75; R_TEXT_LINE_SPACING = 12; @@ -1722,6 +2746,11 @@ void Message_OpenText(PlayState* play, u16 textId) { } msgCtx->textId = textId; + // #region SOH [NTSC] - allow for switching languages mid textbox + sLastLanguage = gSaveContext.language; + sTextBoxNum = 0; + // #endregion + if (textId == 0x2030) { // Talking to Ingo as adult in Lon Lon Ranch for the first time before freeing Epona osSyncPrintf(VT_FGCOL(YELLOW)); osSyncPrintf("???????????????? z_message.c ??????????????????\n"); @@ -1732,6 +2761,14 @@ void Message_OpenText(PlayState* play, u16 textId) { // RANDOTODO: Use this for ice trap messages if (CustomMessage_RetrieveIfExists(play)) { osSyncPrintf("Found custom message"); + if (gSaveContext.language == LANGUAGE_JPN) { + sDisplayNextMessageAsEnglish = true; + if (!sTextIsCredits) { + R_TEXT_CHAR_SCALE = 75; + R_TEXT_LINE_SPACING = 12; + R_TEXT_INIT_XPOS = 65; + } + } } else if (sTextIsCredits) { Message_FindCreditsMessage(play, textId); msgCtx->msgLength = font->msgLength; @@ -1752,10 +2789,23 @@ void Message_OpenText(PlayState* play, u16 textId) { (textId == 0x4C || textId == 0xA4)) || // 4D == Hylian Shield textId == 0x4D)) { + // NTSC TODO: Translate EquipNow Message Message_FindMessage(play, textId); + if (gSaveContext.language == LANGUAGE_JPN) { + sDisplayNextMessageAsEnglish = true; + if (!sTextIsCredits) { + R_TEXT_CHAR_SCALE = 75; + R_TEXT_LINE_SPACING = 12; + R_TEXT_INIT_XPOS = 65; + } + } msgCtx->msgLength = font->msgLength = GetEquipNowMessage(font->msgBuf, font->msgOffset, sizeof(font->msgBuf)); } else { - Message_FindMessage(play, textId); + if (gSaveContext.language == LANGUAGE_JPN) { + Message_FindMessageJPN(play, textId); + } else { + Message_FindMessage(play, textId); + } msgCtx->msgLength = font->msgLength; char* src = (uintptr_t)font->msgOffset; memcpy(font->msgBuf, src, font->msgLength); @@ -2229,6 +3279,32 @@ void Message_DrawMain(PlayState* play, Gfx** p) { gSPSegment(gfx++, 0x07, msgCtx->textboxSegment); if (msgCtx->msgLength != 0) { + // #region SOH [NTSC] - allow switching languages mid text + if (gSaveContext.language != sLastLanguage) { + u16 drawPos = msgCtx->textDrawPos; + u16 choiceNum = msgCtx->choiceNum; + u16 textUnskippable = msgCtx->textUnskippable; + u16 textboxEndType = msgCtx->textboxEndType; + u8 msgMode = msgCtx->msgMode; + s16 textboxColorAlphaCurrent = msgCtx->textboxColorAlphaCurrent; + s32 textBoxNum; + s32 textBoxMax = sTextBoxNum - 1; + Message_OpenText(play, msgCtx->textId); + Message_Decode(play); + // Move to correct textbox + for (textBoxNum = 0; textBoxNum < textBoxMax; textBoxNum++) { + msgCtx->msgBufPos++; + Message_Decode(play); + } + msgCtx->textDrawPos = (drawPos > msgCtx->decodedTextLen) ? msgCtx->decodedTextLen : drawPos; + msgCtx->choiceNum = choiceNum; + msgCtx->textUnskippable = textUnskippable; + msgCtx->textboxEndType = textboxEndType; + msgCtx->msgMode = msgMode; + msgCtx->textboxColorAlphaCurrent = textboxColorAlphaCurrent; + } + // #endregion + if (msgCtx->ocarinaAction != OCARINA_ACTION_FROGS && msgCtx->msgMode != MSGMODE_SONG_PLAYED_ACT && msgCtx->msgMode >= MSGMODE_TEXT_BOX_GROWING && msgCtx->msgMode < MSGMODE_TEXT_CLOSING && msgCtx->textBoxType < TEXTBOX_TYPE_NONE_BOTTOM) { @@ -2257,16 +3333,28 @@ void Message_DrawMain(PlayState* play, Gfx** p) { for (j = 0, i = 0; i < 48; i++, j += 0x80) { func_8006EE50(&play->msgCtx.font, 0x8140, j); } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } } break; case MSGMODE_TEXT_DISPLAYING: case MSGMODE_TEXT_DELAYED_BREAK: - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_TEXT_AWAIT_INPUT: case MSGMODE_TEXT_AWAIT_NEXT: - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } Message_DrawTextboxIcon(play, &gfx, R_TEXTBOX_END_XPOS, R_TEXTBOX_END_YPOS); break; case MSGMODE_OCARINA_STARTING: @@ -2309,7 +3397,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { } if (msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY && msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOWARP) { - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } } break; case MSGMODE_OCARINA_PLAYING: @@ -2402,7 +3494,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { } if (msgCtx->ocarinaAction != OCARINA_ACTION_FREE_PLAY && msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOWARP) { - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } } break; case MSGMODE_OCARINA_CORRECT_PLAYBACK: @@ -2460,11 +3556,19 @@ void Message_DrawMain(PlayState* play, Gfx** p) { play->msgCtx.ocarinaMode = OCARINA_MODE_03; } } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_OCARINA_FAIL: case MSGMODE_SONG_PLAYBACK_FAIL: - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } case MSGMODE_OCARINA_FAIL_NO_TEXT: msgCtx->stateTimer--; if (msgCtx->stateTimer == 0) { @@ -2528,7 +3632,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { play->msgCtx.lastPlayedSong == OCARINA_SONG_TIME || play->msgCtx.lastPlayedSong == OCARINA_SONG_STORMS || play->msgCtx.lastPlayedSong == OCARINA_SONG_SUNS) { - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } Audio_OcaSetInstrument(1); Audio_OcaSetInstrument(1); Audio_OcaSetSongPlayback(msgCtx->lastPlayedSong + 1, 1); @@ -2572,7 +3680,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { sOcarinaNoteBufPos = 0; msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION; } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN: Message_ContinueTextbox(play, msgCtx->lastPlayedSong + 0x893); // You played [song name] @@ -2587,21 +3699,33 @@ void Message_DrawMain(PlayState* play, Gfx** p) { msgCtx->stateTimer = 1; } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_DISPLAY_SONG_PLAYED_TEXT: msgCtx->stateTimer--; if (msgCtx->stateTimer == 0) { msgCtx->msgMode = MSGMODE_SONG_PLAYED_ACT_BEGIN; } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SONG_PLAYED_ACT_BEGIN: Audio_OcaSetInstrument(0); Message_ResetOcarinaNoteState(); msgCtx->msgMode = MSGMODE_SONG_PLAYED_ACT; msgCtx->stateTimer = 2; - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SONG_PLAYED_ACT: msgCtx->stateTimer--; @@ -2680,7 +3804,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { } } case MSGMODE_SONG_DEMONSTRATION_DONE: - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SONG_PLAYBACK: msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); @@ -2727,10 +3855,18 @@ void Message_DrawMain(PlayState* play, Gfx** p) { msgCtx->stateTimer = 10; msgCtx->msgMode = MSGMODE_SONG_PLAYBACK_FAIL; } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_OCARINA_AWAIT_INPUT: - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } if (Message_ShouldAdvance(play)) { func_8010BD58(play, msgCtx->ocarinaAction); } @@ -2745,7 +3881,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { sOcarinaNoteBufLen = 0; Message_ResetOcarinaNoteState(); msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_ONGOING; - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SCARECROW_LONG_RECORDING_ONGOING: msgCtx->ocarinaStaff = Audio_OcaGetRecordingStaff(); @@ -2793,7 +3933,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { osSyncPrintf(VT_RST); osSyncPrintf("\n====================================================================\n"); } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SCARECROW_LONG_PLAYBACK: case MSGMODE_SCARECROW_PLAYBACK: @@ -2829,7 +3973,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { Audio_OcaSetRecordingState(2); Audio_OcaSetInstrument(1); msgCtx->msgMode = MSGMODE_SCARECROW_RECORDING_ONGOING; - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SCARECROW_RECORDING_ONGOING: msgCtx->ocarinaStaff = Audio_OcaGetRecordingStaff(); @@ -2864,7 +4012,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { Message_CloseTextbox(play); msgCtx->msgMode = MSGMODE_SCARECROW_RECORDING_FAILED; } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_SCARECROW_RECORDING_FAILED: osSyncPrintf("cccccccccccc\n"); @@ -2941,7 +4093,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { msgCtx->msgMode = MSGMODE_MEMORY_GAME_ROUND_SUCCESS; msgCtx->stateTimer = 30; } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_MEMORY_GAME_ROUND_SUCCESS: msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); @@ -2963,7 +4119,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { play->msgCtx.ocarinaMode = OCARINA_MODE_0F; } } - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } break; case MSGMODE_MEMORY_GAME_START_NEXT_ROUND: if (!Audio_IsSfxPlaying(NA_SE_SY_METRONOME)) { @@ -2993,7 +4153,11 @@ void Message_DrawMain(PlayState* play, Gfx** p) { case MSGMODE_FROGS_WAITING: break; case MSGMODE_TEXT_DONE: - Message_DrawText(play, &gfx); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_DrawTextJPN(play, &gfx); + } else { + Message_DrawText(play, &gfx); + } switch (msgCtx->textboxEndType) { case TEXTBOX_ENDTYPE_2_CHOICE: @@ -3021,6 +4185,10 @@ void Message_DrawMain(PlayState* play, Gfx** p) { } break; case MSGMODE_TEXT_CLOSING: + if (sDisplayNextMessageAsEnglish) { + sDisplayNextMessageAsEnglish = false; + } + /* fallthrough */ case MSGMODE_PAUSED: break; case MSGMODE_UNK_20: @@ -3322,9 +4490,15 @@ void Message_Update(PlayState* play) { R_TEXTBOX_X_TARGET = sTextboxXPositions[var]; R_TEXTBOX_END_YPOS = sTextboxEndIconYOffset[var] + R_TEXTBOX_Y_TARGET; - R_TEXT_CHOICE_YPOS(0) = R_TEXTBOX_Y_TARGET + 20; - R_TEXT_CHOICE_YPOS(1) = R_TEXTBOX_Y_TARGET + 32; - R_TEXT_CHOICE_YPOS(2) = R_TEXTBOX_Y_TARGET + 44; + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + R_TEXT_CHOICE_YPOS(0) = R_TEXTBOX_Y_TARGET + 7; + R_TEXT_CHOICE_YPOS(1) = R_TEXTBOX_Y_TARGET + 25; + R_TEXT_CHOICE_YPOS(2) = R_TEXTBOX_Y_TARGET + 43; + } else { + R_TEXT_CHOICE_YPOS(0) = R_TEXTBOX_Y_TARGET + 20; + R_TEXT_CHOICE_YPOS(1) = R_TEXTBOX_Y_TARGET + 32; + R_TEXT_CHOICE_YPOS(2) = R_TEXTBOX_Y_TARGET + 44; + } osSyncPrintf("message->msg_disp_type=%x\n", msgCtx->textBoxProperties & 0xF0); if (msgCtx->textBoxType == TEXTBOX_TYPE_NONE_BOTTOM || msgCtx->textBoxType == TEXTBOX_TYPE_NONE_NO_SHADOW) { @@ -3417,7 +4591,11 @@ void Message_Update(PlayState* play) { if (msgCtx->textboxEndType == TEXTBOX_ENDTYPE_HAS_NEXT) { Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_PASS, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - Message_ContinueTextbox(play, sNextTextId); + if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { + Message_ContinueTextbox(play, msgCtx->msgBufDecodedWide[msgCtx->textDrawPos]); + } else { + Message_ContinueTextbox(play, sNextTextId); + } } else { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); Message_CloseTextbox(play); diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index bf0ba6a1c..6df6665ed 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -24,6 +24,12 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/gameplaystats.h" +#include "message_data_static.h" +extern MessageTableEntry* sNesMessageEntryTablePtr; +extern MessageTableEntry* sGerMessageEntryTablePtr; +extern MessageTableEntry* sFraMessageEntryTablePtr; +extern MessageTableEntry* sJpnMessageEntryTablePtr; + #define DO_ACTION_TEX_WIDTH() 48 #define DO_ACTION_TEX_HEIGHT() 16 #define DO_ACTION_TEX_SIZE() ((DO_ACTION_TEX_WIDTH() * DO_ACTION_TEX_HEIGHT()) / 2) @@ -318,7 +324,7 @@ void func_80082644(PlayState* play, s16 alpha) { void func_8008277C(PlayState* play, s16 maxAlpha, s16 alpha) { InterfaceContext* interfaceCtx = &play->interfaceCtx; - if (gSaveContext.unk_13E7 != 0) { + if (gSaveContext.forceRisingButtonAlphas != 0) { func_80082644(play, alpha); return; } @@ -843,12 +849,12 @@ void func_80083108(PlayState* play) { if ((gSaveContext.cutsceneIndex < 0xFFF0) || ((play->sceneNum == SCENE_LON_LON_RANCH) && (gSaveContext.cutsceneIndex == 0xFFF0))) { - gSaveContext.unk_13E7 = 0; + gSaveContext.forceRisingButtonAlphas = 0; if ((player->stateFlags1 & PLAYER_STATE1_ON_HORSE) || (play->shootingGalleryStatus > 1) || ((play->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) && Flags_GetSwitch(play, 0x38))) { if (gSaveContext.equips.buttonItems[0] != ITEM_NONE || randoCanTrackSwordless) { - gSaveContext.unk_13E7 = 1; + gSaveContext.forceRisingButtonAlphas = 1; if (gSaveContext.buttonStatus[0] == BTN_DISABLED) { gSaveContext.buttonStatus[0] = gSaveContext.buttonStatus[1] = gSaveContext.buttonStatus[2] = @@ -915,7 +921,7 @@ void func_80083108(PlayState* play) { } else if (play->sceneNum == SCENE_CHAMBER_OF_THE_SAGES && !IS_BOSS_RUSH) { Interface_ChangeAlpha(1); } else if (play->sceneNum == SCENE_FISHING_POND) { - gSaveContext.unk_13E7 = 2; + gSaveContext.forceRisingButtonAlphas = 2; if (play->interfaceCtx.unk_260 != 0) { if (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE) { gSaveContext.buttonStatus[0] = gSaveContext.equips.buttonItems[0]; @@ -2796,6 +2802,10 @@ void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 l newName[loadOffset][length - 6] = 'G'; newName[loadOffset][length - 5] = 'E'; newName[loadOffset][length - 4] = 'R'; + } else if (gSaveContext.language == LANGUAGE_JPN) { + newName[loadOffset][length - 6] = 'J'; + newName[loadOffset][length - 5] = 'P'; + newName[loadOffset][length - 4] = 'N'; } doAction = newName[loadOffset]; } @@ -2861,6 +2871,10 @@ void Interface_LoadActionLabelB(PlayState* play, u16 action) { newName[length - 6] = 'G'; newName[length - 5] = 'E'; newName[length - 4] = 'R'; + } else if (gSaveContext.language == LANGUAGE_JPN) { + newName[length - 6] = 'J'; + newName[length - 5] = 'P'; + newName[length - 4] = 'N'; } doAction = newName; } @@ -3750,21 +3764,21 @@ void func_80088AA0(s16 arg0) { gSaveContext.timerX[1] = 140; gSaveContext.timerY[1] = 80; D_80125A5C = 0; - gSaveContext.timer2Value = arg0; + gSaveContext.subTimerSeconds = arg0; if (arg0 != 0) { - gSaveContext.timer2State = 1; + gSaveContext.subTimerState = 1; } else { - gSaveContext.timer2State = 7; + gSaveContext.subTimerState = 7; } } void func_80088AF0(PlayState* play) { - if (gSaveContext.timer2State != 0) { + if (gSaveContext.subTimerState != 0) { if (gSaveContext.eventInf[1] & 1) { - gSaveContext.timer2Value = 239; + gSaveContext.subTimerSeconds = 239; } else { - gSaveContext.timer2Value = 1; + gSaveContext.subTimerSeconds = 1; } } } @@ -3773,12 +3787,12 @@ void func_80088B34(s16 arg0) { gSaveContext.timerX[0] = 140; gSaveContext.timerY[0] = 80; D_80125A5C = 0; - gSaveContext.timer1Value = arg0; + gSaveContext.timerSeconds = arg0; if (arg0 != 0) { - gSaveContext.timer1State = 5; + gSaveContext.timerState = 5; } else { - gSaveContext.timer1State = 11; + gSaveContext.timerState = 11; } } @@ -3795,8 +3809,8 @@ void Interface_DrawActionLabel(GraphicsContext* gfxCtx, void* texture) { } void Interface_DrawItemButtons(PlayState* play) { - static void* cUpLabelTextures[] = { gNaviCUpENGTex, gNaviCUpENGTex, gNaviCUpENGTex }; - static s16 startButtonLeftPos[] = { 132, 130, 130 }; + static void* cUpLabelTextures[] = { gNaviCUpENGTex, gNaviCUpENGTex, gNaviCUpENGTex, gNaviCUpJPTex }; + static s16 startButtonLeftPos[] = { 132, 130, 130, 132 }; InterfaceContext* interfaceCtx = &play->interfaceCtx; Player* player = GET_PLAYER(play); PauseContext* pauseCtx = &play->pauseCtx; @@ -4970,6 +4984,13 @@ void Interface_Draw(PlayState* play) { s16 svar5; s16 svar6; bool fullUi = !CVarGetInteger(CVAR_ENHANCEMENT("MinimalUI"), 0) || !R_MINIMAP_DISABLED || play->pauseCtx.state != 0; + // #region SOH [NTSC] + s32 languageOffset = gSaveContext.language; + + if (languageOffset == LANGUAGE_JPN) { + languageOffset = LANGUAGE_ENG; + } + // #endregion if (GameInteractor_NoUIActive()) { return; @@ -5256,10 +5277,10 @@ void Interface_Draw(PlayState* play) { // B Button Do Action Label s16 PosX_adjust; s16 PosY_adjust; - if (gSaveContext.language == 2) { + if (gSaveContext.language == LANGUAGE_FRA) { PosX_adjust = -12; PosY_adjust = 5; - } else if (gSaveContext.language == 1) { //ger + } else if (gSaveContext.language == LANGUAGE_GER) { PosY_adjust = 6; PosX_adjust = -9; } else { @@ -5292,8 +5313,8 @@ void Interface_Draw(PlayState* play) { BbtnPosX = -9999; } } else { - BbtnPosX = OTRGetRectDimensionFromRightEdge(R_B_LABEL_X(gSaveContext.language)+X_Margins_BtnB_label); - BbtnPosY = R_B_LABEL_Y(gSaveContext.language)+Y_Margins_BtnB_label; + BbtnPosX = OTRGetRectDimensionFromRightEdge(R_B_LABEL_X(languageOffset)+X_Margins_BtnB_label); + BbtnPosY = R_B_LABEL_Y(languageOffset)+Y_Margins_BtnB_label; } gDPPipeSync(OVERLAY_DISP++); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, @@ -5304,7 +5325,7 @@ void Interface_Draw(PlayState* play) { DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_HEIGHT(), 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); - R_B_LABEL_DD = (1 << 10) / (WREG(37 + gSaveContext.language) / 100.0f); + R_B_LABEL_DD = (1 << 10) / (WREG(37 + languageOffset) / 100.0f); gSPWideTextureRectangle(OVERLAY_DISP++, BbtnPosX << 2, BbtnPosY << 2, (BbtnPosX + DO_ACTION_TEX_WIDTH()) << 2, (BbtnPosY + DO_ACTION_TEX_HEIGHT()) << 2, G_TX_RENDERTILE, 0, 0, @@ -5498,7 +5519,7 @@ void Interface_Draw(PlayState* play) { PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->aAlpha); gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); - Matrix_Translate(-138.0f + rAIconX, rAIconY, WREG(46 + gSaveContext.language) / 10.0f, MTXMODE_NEW); + Matrix_Translate(-138.0f + rAIconX, rAIconY, WREG(46 + languageOffset) / 10.0f, MTXMODE_NEW); Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); Matrix_RotateX(interfaceCtx->unk_1F4 / 10000.0f, MTXMODE_APPLY); gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), @@ -5664,13 +5685,13 @@ void Interface_Draw(PlayState* play) { } } - if ((gSaveContext.timer2State == 5) && (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT)) { + if ((gSaveContext.subTimerState == 5) && (Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT)) { // Trade quest timer reached 0 D_8015FFE6 = 40; gSaveContext.cutsceneIndex = 0; play->transitionTrigger = TRANS_TRIGGER_START; play->transitionType = TRANS_TYPE_FADE_WHITE; - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; if ((gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI) && (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER) && @@ -5711,28 +5732,28 @@ void Interface_Draw(PlayState* play) { (play->shootingGalleryStatus <= 1) && !((play->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) && Flags_GetSwitch(play, 0x38))) { svar6 = 0; - switch (gSaveContext.timer1State) { + switch (gSaveContext.timerState) { case 1: D_8015FFE2 = 20; D_8015FFE0 = 20; - gSaveContext.timer1Value = gSaveContext.health >> 1; - gSaveContext.timer1State = 2; + gSaveContext.timerSeconds = gSaveContext.health >> 1; + gSaveContext.timerState = 2; break; case 2: D_8015FFE2--; if (D_8015FFE2 == 0) { D_8015FFE2 = 20; - gSaveContext.timer1State = 3; + gSaveContext.timerState = 3; } break; case 5: case 11: D_8015FFE2 = 20; D_8015FFE0 = 20; - if (gSaveContext.timer1State == 5) { - gSaveContext.timer1State = 6; + if (gSaveContext.timerState == 5) { + gSaveContext.timerState = 6; } else { - gSaveContext.timer1State = 12; + gSaveContext.timerState = 12; } break; case 6: @@ -5740,10 +5761,10 @@ void Interface_Draw(PlayState* play) { D_8015FFE2--; if (D_8015FFE2 == 0) { D_8015FFE2 = 20; - if (gSaveContext.timer1State == 6) { - gSaveContext.timer1State = 7; + if (gSaveContext.timerState == 6) { + gSaveContext.timerState = 7; } else { - gSaveContext.timer1State = 13; + gSaveContext.timerState = 13; } } break; @@ -5770,15 +5791,15 @@ void Interface_Draw(PlayState* play) { gSaveContext.timerY[0] = 46; } - if (gSaveContext.timer1State == 3) { - gSaveContext.timer1State = 4; + if (gSaveContext.timerState == 3) { + gSaveContext.timerState = 4; } else { - gSaveContext.timer1State = 8; + gSaveContext.timerState = 8; } } case 4: case 8: - if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8)) { + if ((gSaveContext.timerState == 4) || (gSaveContext.timerState == 8)) { if (gSaveContext.healthCapacity > 0xA0) { gSaveContext.timerY[0] = 54; } else { @@ -5786,28 +5807,28 @@ void Interface_Draw(PlayState* play) { } } - if ((gSaveContext.timer1State >= 3) && (msgCtx->msgLength == 0)) { + if ((gSaveContext.timerState >= 3) && (msgCtx->msgLength == 0)) { D_8015FFE0--; if (D_8015FFE0 == 0) { - if (gSaveContext.timer1Value != 0) { - gSaveContext.timer1Value--; + if (gSaveContext.timerSeconds != 0) { + gSaveContext.timerSeconds--; } D_8015FFE0 = 20; - if (gSaveContext.timer1Value == 0) { - gSaveContext.timer1State = 10; + if (gSaveContext.timerSeconds == 0) { + gSaveContext.timerState = 10; if (D_80125A5C != 0) { gSaveContext.health = 0; play->damagePlayer(play, -(gSaveContext.health + 2)); } D_80125A5C = 0; - } else if (gSaveContext.timer1Value > 60) { + } else if (gSaveContext.timerSeconds > 60) { if (timerDigits[4] == 1) { Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_WOMAN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } - } else if (gSaveContext.timer1Value >= 11) { + } else if (gSaveContext.timerSeconds >= 11) { if (timerDigits[4] & 1) { Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -5840,10 +5861,10 @@ void Interface_Draw(PlayState* play) { gSaveContext.timerY[0] = 46; } - gSaveContext.timer1State = 14; + gSaveContext.timerState = 14; } case 14: - if (gSaveContext.timer1State == 14) { + if (gSaveContext.timerState == 14) { if (gSaveContext.healthCapacity > 0xA0) { gSaveContext.timerY[0] = 54; } else { @@ -5851,15 +5872,15 @@ void Interface_Draw(PlayState* play) { } } - if (gSaveContext.timer1State >= 3) { + if (gSaveContext.timerState >= 3) { D_8015FFE0--; if (D_8015FFE0 == 0) { - gSaveContext.timer1Value++; + gSaveContext.timerSeconds++; D_8015FFE0 = 20; - if (gSaveContext.timer1Value == 3599) { + if (gSaveContext.timerSeconds == 3599) { D_8015FFE2 = 40; - gSaveContext.timer1State = 15; + gSaveContext.timerState = 15; } else { Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -5868,37 +5889,37 @@ void Interface_Draw(PlayState* play) { } break; case 10: - if (gSaveContext.timer2State != 0) { + if (gSaveContext.subTimerState != 0) { D_8015FFE6 = 20; D_8015FFE4 = 20; gSaveContext.timerX[1] = 140; gSaveContext.timerY[1] = 80; - if (gSaveContext.timer2State < 7) { - gSaveContext.timer2State = 2; + if (gSaveContext.subTimerState < 7) { + gSaveContext.subTimerState = 2; } else { - gSaveContext.timer2State = 8; + gSaveContext.subTimerState = 8; } - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } else { - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } case 15: break; default: svar6 = 1; - switch (gSaveContext.timer2State) { + switch (gSaveContext.subTimerState) { case 1: case 7: D_8015FFE6 = 20; D_8015FFE4 = 20; gSaveContext.timerX[1] = 140; gSaveContext.timerY[1] = 80; - if (gSaveContext.timer2State == 1) { - gSaveContext.timer2State = 2; + if (gSaveContext.subTimerState == 1) { + gSaveContext.subTimerState = 2; } else { - gSaveContext.timer2State = 8; + gSaveContext.subTimerState = 8; } break; case 2: @@ -5906,10 +5927,10 @@ void Interface_Draw(PlayState* play) { D_8015FFE6--; if (D_8015FFE6 == 0) { D_8015FFE6 = 20; - if (gSaveContext.timer2State == 2) { - gSaveContext.timer2State = 3; + if (gSaveContext.subTimerState == 2) { + gSaveContext.subTimerState = 3; } else { - gSaveContext.timer2State = 9; + gSaveContext.subTimerState = 9; } } break; @@ -5917,7 +5938,7 @@ void Interface_Draw(PlayState* play) { case 9: osSyncPrintf("event_xp[1]=%d, event_yp[1]=%d TOTAL_EVENT_TM=%d\n", svar5 = gSaveContext.timerX[1], svar2 = gSaveContext.timerY[1], - gSaveContext.timer2Value); + gSaveContext.subTimerSeconds); svar1 = (gSaveContext.timerX[1] - 26) / D_8015FFE6; gSaveContext.timerX[1] -= svar1; if (gSaveContext.healthCapacity > 0xA0) { @@ -5938,15 +5959,15 @@ void Interface_Draw(PlayState* play) { gSaveContext.timerY[1] = 46; } - if (gSaveContext.timer2State == 3) { - gSaveContext.timer2State = 4; + if (gSaveContext.subTimerState == 3) { + gSaveContext.subTimerState = 4; } else { - gSaveContext.timer2State = 10; + gSaveContext.subTimerState = 10; } } case 4: case 10: - if ((gSaveContext.timer2State == 4) || (gSaveContext.timer2State == 10)) { + if ((gSaveContext.subTimerState == 4) || (gSaveContext.subTimerState == 10)) { if (gSaveContext.healthCapacity > 0xA0) { gSaveContext.timerY[1] = 54; } else { @@ -5954,35 +5975,35 @@ void Interface_Draw(PlayState* play) { } } - if (gSaveContext.timer2State >= 3) { + if (gSaveContext.subTimerState >= 3) { D_8015FFE4--; if (D_8015FFE4 == 0) { D_8015FFE4 = 20; - if (gSaveContext.timer2State == 4) { - gSaveContext.timer2Value--; - osSyncPrintf("TOTAL_EVENT_TM=%d\n", gSaveContext.timer2Value); + if (gSaveContext.subTimerState == 4) { + gSaveContext.subTimerSeconds--; + osSyncPrintf("TOTAL_EVENT_TM=%d\n", gSaveContext.subTimerSeconds); - if (gSaveContext.timer2Value <= 0) { + if (gSaveContext.subTimerSeconds <= 0) { if (!Flags_GetSwitch(play, 0x37) || ((play->sceneNum != SCENE_GANON_BOSS) && (play->sceneNum != SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) && (play->sceneNum != SCENE_GANONS_TOWER_COLLAPSE_INTERIOR) && (play->sceneNum != SCENE_INSIDE_GANONS_CASTLE_COLLAPSE))) { D_8015FFE6 = 40; - gSaveContext.timer2State = 5; + gSaveContext.subTimerState = 5; gSaveContext.cutsceneIndex = 0; Message_StartTextbox(play, 0x71B0, NULL); Player_SetCsActionWithHaltedActors(play, NULL, 8); } else { D_8015FFE6 = 40; - gSaveContext.timer2State = 6; + gSaveContext.subTimerState = 6; } - } else if (gSaveContext.timer2Value > 60) { + } else if (gSaveContext.subTimerSeconds > 60) { if (timerDigits[4] == 1) { Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_WOMAN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } - } else if (gSaveContext.timer2Value > 10) { + } else if (gSaveContext.subTimerSeconds > 10) { if ((timerDigits[4] & 1)) { Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -5992,17 +6013,17 @@ void Interface_Draw(PlayState* play) { &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } } else { - gSaveContext.timer2Value++; + gSaveContext.subTimerSeconds++; if (gSaveContext.eventInf[1] & 1) { - if (gSaveContext.timer2Value == 240) { + if (gSaveContext.subTimerSeconds == 240) { Message_StartTextbox(play, 0x6083, NULL); gSaveContext.eventInf[1] &= ~1; - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; } } } - if ((gSaveContext.timer2Value % 60) == 0) { + if ((gSaveContext.subTimerSeconds % 60) == 0) { Audio_PlaySoundGeneral(NA_SE_SY_WARNING_COUNT_N, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } @@ -6012,22 +6033,22 @@ void Interface_Draw(PlayState* play) { case 6: D_8015FFE6--; if (D_8015FFE6 == 0) { - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; } break; } break; } - if (((gSaveContext.timer1State != 0) && (gSaveContext.timer1State != 10)) || - (gSaveContext.timer2State != 0)) { + if (((gSaveContext.timerState != 0) && (gSaveContext.timerState != 10)) || + (gSaveContext.subTimerState != 0)) { timerDigits[0] = timerDigits[1] = svar2 = timerDigits[3] = 0; timerDigits[2] = 10; // digit 10 is used as ':' (colon) - if (gSaveContext.timer1State != 0) { - timerDigits[4] = gSaveContext.timer1Value; + if (gSaveContext.timerState != 0) { + timerDigits[4] = gSaveContext.timerSeconds; } else { - timerDigits[4] = gSaveContext.timer2Value; + timerDigits[4] = gSaveContext.subTimerSeconds; } while (timerDigits[4] >= 60) { @@ -6079,14 +6100,14 @@ void Interface_Draw(PlayState* play) { gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); - if (gSaveContext.timer1State != 0) { - if ((gSaveContext.timer1Value < 10) && (gSaveContext.timer1State < 11)) { + if (gSaveContext.timerState != 0) { + if ((gSaveContext.timerSeconds < 10) && (gSaveContext.timerState < 11)) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 50, 0, 255); } else { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255); } } else { - if ((gSaveContext.timer2Value < 10) && (gSaveContext.timer2State < 6)) { + if ((gSaveContext.subTimerSeconds < 10) && (gSaveContext.subTimerState < 6)) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 50, 0, 255); } else { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 0, 255); @@ -6243,14 +6264,24 @@ void Interface_Update(PlayState* play) { GameInteractor_ExecuteOnInterfaceUpdate(); + bool isPal = ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL; + if (CHECK_BTN_ALL(debugInput->press.button, BTN_DLEFT)) { gSaveContext.language = LANGUAGE_ENG; + CVarSetInteger(CVAR_SETTING("Languages"), LANGUAGE_ENG); osSyncPrintf("J_N=%x J_N=%x\n", gSaveContext.language, &gSaveContext.language); - } else if (CHECK_BTN_ALL(debugInput->press.button, BTN_DUP)) { + } else if (CHECK_BTN_ALL(debugInput->press.button, BTN_DUP) && sGerMessageEntryTablePtr != NULL) { gSaveContext.language = LANGUAGE_GER; + CVarSetInteger(CVAR_SETTING("Languages"), LANGUAGE_GER); osSyncPrintf("J_N=%x J_N=%x\n", gSaveContext.language, &gSaveContext.language); - } else if (CHECK_BTN_ALL(debugInput->press.button, BTN_DRIGHT)) { + } else if (CHECK_BTN_ALL(debugInput->press.button, BTN_DRIGHT) && sFraMessageEntryTablePtr != NULL) { gSaveContext.language = LANGUAGE_FRA; + CVarSetInteger(CVAR_SETTING("Languages"), LANGUAGE_FRA); + osSyncPrintf("J_N=%x J_N=%x\n", gSaveContext.language, &gSaveContext.language); + } else if (CHECK_BTN_ALL(debugInput->press.button, BTN_DDOWN) && sJpnMessageEntryTablePtr != NULL) { + // Add this in to have an equivalent ntsc language debugging feature + gSaveContext.language = LANGUAGE_JPN; + CVarSetInteger(CVAR_SETTING("Languages"), LANGUAGE_JPN); osSyncPrintf("J_N=%x J_N=%x\n", gSaveContext.language, &gSaveContext.language); } @@ -6397,7 +6428,7 @@ void Interface_Update(PlayState* play) { HealthMeter_Update(play); - if ((gSaveContext.timer1State >= 3) && (play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && + if ((gSaveContext.timerState >= 3) && (play->pauseCtx.state == 0) && (play->pauseCtx.debugState == 0) && (msgCtx->msgMode == MSGMODE_NONE) && !(player->stateFlags2 & PLAYER_STATE2_ATTEMPT_PLAY_FOR_ACTOR) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF) && !Play_InCsMode(play)) {} @@ -6516,16 +6547,16 @@ void Interface_Update(PlayState* play) { Interface_UpdateMagicBar(play); } - if (gSaveContext.timer1State == 0) { + if (gSaveContext.timerState == 0) { if (((D_80125A58 == 1) || (D_80125A58 == 2) || (D_80125A58 == 4)) && ((gSaveContext.health >> 1) != 0)) { - gSaveContext.timer1State = 1; + gSaveContext.timerState = 1; gSaveContext.timerX[0] = 140; gSaveContext.timerY[0] = 80; D_80125A5C = 1; } } else { - if (((D_80125A58 == 0) || (D_80125A58 == 3)) && (gSaveContext.timer1State < 5)) { - gSaveContext.timer1State = 0; + if (((D_80125A58 == 0) || (D_80125A58 == 3)) && (gSaveContext.timerState < 5)) { + gSaveContext.timerState = 0; } } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index d6141d78b..4de491fa2 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -7,6 +7,7 @@ #include "soh/Enhancements/randomizer/savefile.h" #include "soh/OTRGlobals.h" #include "soh/SaveManager.h" +#include "soh/ResourceManagerHelpers.h" #define NUM_DUNGEONS 8 #define NUM_COWS 10 @@ -238,6 +239,11 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { gSaveContext.linkAge = 1; gSaveContext.dayTime = 0x6AAB; gSaveContext.cutsceneIndex = 0xFFF1; + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + gSaveContext.ship.filenameLanguage = NAME_LANGUAGE_PAL; + } else { // GAME_REGION_NTSC + gSaveContext.ship.filenameLanguage = (gSaveContext.language == LANGUAGE_JPN) ? NAME_LANGUAGE_NTSC_JPN : NAME_LANGUAGE_NTSC_ENG; + } if ((fileChooseCtx->buttonIndex == 0 && CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0))) { gSaveContext.cutsceneIndex = 0; 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 06f3c8aad..d673ece11 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 @@ -227,8 +227,8 @@ void BgPoEvent_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyTris(play, &this->collider); } else { DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId); - if ((this->type == 1) && (gSaveContext.timer1Value > 0)) { - gSaveContext.timer1State = 0xA; + if ((this->type == 1) && (gSaveContext.timerSeconds > 0)) { + gSaveContext.timerState = 0xA; } } } @@ -344,10 +344,10 @@ void BgPoEvent_BlockIdle(BgPoEvent* this, PlayState* play) { OnePointCutscene_Init(play, 3170, 30, amy, MAIN_CAM); } Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); - gSaveContext.timer1State = 0xA; + gSaveContext.timerState = 0xA; } } else { - if ((gSaveContext.timer1Value == 0) && (sBgPoEventBlocksAtRest == 5)) { + if ((gSaveContext.timerSeconds == 0) && (sBgPoEventBlocksAtRest == 5)) { player->stateFlags2 &= ~PLAYER_STATE2_MOVING_DYNAPOLY; sBgPoEventPuzzleState = 0x10; sBgPoEventBlocksAtRest = 0; 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 2b0802e00..f7b663cf9 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 @@ -158,7 +158,7 @@ void func_808A9234(BgRelayObjects* this, PlayState* play) { Flags_UnsetSwitch(play, this->switchFlag); this->dyna.actor.flags &= ~ACTOR_FLAG_UPDATE_CULLING_DISABLED; if (play->roomCtx.curRoom.num == 4) { - gSaveContext.timer1State = 0xF; + gSaveContext.timerState = 0xF; } this->actionFunc = BgRelayObjects_DoNothing; } 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 ab109d607..bc16257c6 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 @@ -108,7 +108,7 @@ void EnDivingGame_Destroy(Actor* thisx, PlayState* play) { if (this->unk_31F == 0) { sHasSpawned = false; - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } Collider_DestroyCylinder(play, &this->collider); @@ -132,9 +132,9 @@ void EnDivingGame_SpawnRuppy(EnDivingGame* this, PlayState* play) { } s32 EnDivingGame_HasMinigameFinished(EnDivingGame* this, PlayState* play) { - if (gSaveContext.timer1State == 10 && !Play_InCsMode(play)) { + if (gSaveContext.timerState == 10 && !Play_InCsMode(play)) { // Failed. - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; func_800F5B58(); Sfx_PlaySfxCentered(NA_SE_SY_FOUND); this->actor.textId = 0x71AD; @@ -152,7 +152,7 @@ s32 EnDivingGame_HasMinigameFinished(EnDivingGame* this, PlayState* play) { } if (this->grabbedRupeesCounter >= rupeesNeeded) { // Won. - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; this->allRupeesThrown = this->state = this->phase = this->unk_2A2 = this->grabbedRupeesCounter = 0; if (!Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_SILVER_SCALE)) { this->actor.textId = 0x4055; @@ -508,7 +508,7 @@ void EnDivingGame_Update(Actor* thisx, PlayState* play2) { this->spawnRuppyTimer--; } - if (gSaveContext.timer1Value == 10) { + if (gSaveContext.timerSeconds == 10) { func_800F5918(); } if (this->eyeTimer == 0) { 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 3a85be38b..19fe78676 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 @@ -95,7 +95,7 @@ void EnDs_GiveOddPotion(EnDs* this, PlayState* play) { if (Actor_HasParent(&this->actor, play) || !GameInteractor_Should(VB_TRADE_ODD_MUSHROOM, true, this)) { this->actor.parent = NULL; this->actionFunc = EnDs_DisplayOddPotionText; - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; } else { Actor_OfferGetItem(&this->actor, play, GI_ODD_POTION, 10000.0f, 50.0f); } 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 2aa4a3a20..1e4292383 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 @@ -50,7 +50,7 @@ void EnEg_Init(Actor* thisx, PlayState* play) { } void func_809FFDC8(EnEg* this, PlayState* play) { - if (!voided && (gSaveContext.timer2Value < 1) && Flags_GetSwitch(play, 0x36) && (kREG(0) == 0)) { + if (!voided && (gSaveContext.subTimerSeconds < 1) && Flags_GetSwitch(play, 0x36) && (kREG(0) == 0)) { // Void the player out Play_TriggerRespawn(play); gSaveContext.respawnFlag = -2; 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 bb43d4709..3414d3d07 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 @@ -869,7 +869,7 @@ void EnGo_BiggoronActionFunc(EnGo* this, PlayState* play) { this->interactInfo.talkState = NPC_TALK_STATE_IDLE; EnGo_SetupAction(this, EnGo_Eyedrops); play->msgCtx.msgMode = MSGMODE_PAUSED; - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; OnePointCutscene_Init(play, 4190, -99, &this->actor, MAIN_CAM); } else { this->interactInfo.talkState = NPC_TALK_STATE_IDLE; 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 264daa595..b41a949ee 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 @@ -1061,7 +1061,7 @@ void EnGo2_BiggoronSetTextId(EnGo2* this, PlayState* play, Player* player) { this->actor.textId = 0x3058; } if (this->actor.textId == 0x3059) { - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; } player->actor.textId = this->actor.textId; 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 e0c1ba7fc..ab09b77a9 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 @@ -130,7 +130,7 @@ void EnHorseGameCheck_FinishIngoRace(EnHorseGameCheckIngoRace* this, PlayState* } DREG(25) = 0; play->transitionTrigger = TRANS_TRIGGER_START; - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } s32 EnHorseGameCheck_UpdateIngoRace(EnHorseGameCheckBase* base, PlayState* play) { @@ -210,7 +210,7 @@ s32 EnHorseGameCheck_UpdateIngoRace(EnHorseGameCheckBase* base, PlayState* play) this->result = INGORACE_INGO_WIN; this->finishTimer = 20; } - if ((gSaveContext.timer1Value >= 180) && (this->startFlags & 2)) { + if ((gSaveContext.timerSeconds >= 180) && (this->startFlags & 2)) { Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_HORSE_GOAL); this->result = INGORACE_TIME_UP; this->finishTimer = 20; @@ -297,8 +297,8 @@ void EnHorseGameCheck_FinishMalonRace(EnHorseGameCheckMalonRace* this, PlayState play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; } else if (this->result == MALONRACE_FAILURE) { - gSaveContext.timer1Value = 240; - gSaveContext.timer1State = 0xF; + gSaveContext.timerSeconds = 240; + gSaveContext.timerState = 0xF; gSaveContext.cutsceneIndex = 0; play->nextEntranceIndex = ENTR_LON_LON_RANCH_7; play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_WHITE, TCS_FAST); @@ -380,7 +380,7 @@ s32 EnHorseGameCheck_UpdateMalonRace(EnHorseGameCheckBase* base, PlayState* play Audio_PlaySoundGeneral(NA_SE_SY_START_SHOT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->result = MALONRACE_SUCCESS; this->finishTimer = 70; - gSaveContext.timer1State = 0xF; + gSaveContext.timerState = 0xF; } else if ((this->fenceCheck[7] == 1) && !(this->raceFlags & MALONRACE_SECOND_LAP)) { this->lapCount = 1; this->raceFlags |= MALONRACE_SECOND_LAP; @@ -397,11 +397,11 @@ s32 EnHorseGameCheck_UpdateMalonRace(EnHorseGameCheckBase* base, PlayState* play this->finishTimer = 30; } } - if ((gSaveContext.timer1Value >= 180) && (this->raceFlags & MALONRACE_SET_TIMER)) { - gSaveContext.timer1Value = 240; + if ((gSaveContext.timerSeconds >= 180) && (this->raceFlags & MALONRACE_SET_TIMER)) { + gSaveContext.timerSeconds = 240; this->result = MALONRACE_TIME_UP; this->finishTimer = 30; - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } } else { if (this->finishTimer > 0) { 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 852f29250..e060457ea 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 @@ -440,7 +440,7 @@ void func_80A79BAC(EnIn* this, PlayState* play, s32 index, u32 transitionType) { if (index == 0) { AREG(6) = 0; } - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } void func_80A79C78(EnIn* this, PlayState* play) { @@ -661,11 +661,11 @@ void func_80A7A568(EnIn* this, PlayState* play) { if (!Flags_GetEventChkInf(EVENTCHKINF_RENTED_HORSE_FROM_INGO) && (player->stateFlags1 & PLAYER_STATE1_ON_HORSE)) { Flags_SetInfTable(INFTABLE_AB); } - if (gSaveContext.timer1State == 10) { + if (gSaveContext.timerState == 10) { Audio_PlaySoundGeneral(NA_SE_SY_FOUND, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); func_80A79C78(this, play); this->actionFunc = func_80A7B024; - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } else if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) { if (play->msgCtx.choiceIndex == 0) { if (gSaveContext.rupees < 50) { @@ -928,7 +928,7 @@ void EnIn_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); if (this->actionFunc != func_80A7A304) { func_80A79AB4(this, play); - if (gSaveContext.timer2Value < 6 && gSaveContext.timer2State != 0 && this->interactInfo.talkState == NPC_TALK_STATE_IDLE) { + if (gSaveContext.subTimerSeconds < 6 && gSaveContext.subTimerState != 0 && this->interactInfo.talkState == NPC_TALK_STATE_IDLE) { if (Actor_ProcessTalkRequest(&this->actor, play)) {} } else { Npc_UpdateTalking(play, &this->actor, &this->interactInfo.talkState, 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 d95d2afcd..5f2823dd4 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 @@ -74,25 +74,25 @@ static AnimationFrameCountInfo sAnimationInfo[] = { u16 func_80AA2AA0(PlayState* play, Actor* thisx) { Player* player = GET_PLAYER(play); - s16* timer1ValuePtr; // weirdness with this necessary to match + s16* timerSecondsPtr; // weirdness with this necessary to match if (!Flags_GetInfTable(INFTABLE_B8)) { return 0x2000; } - timer1ValuePtr = &gSaveContext.timer1Value; + timerSecondsPtr = &gSaveContext.timerSeconds; if (gSaveContext.eventInf[0] & 0x400) { - gSaveContext.timer1Value = gSaveContext.timer1Value; + gSaveContext.timerSeconds = gSaveContext.timerSeconds; thisx->flags |= ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; - if (gSaveContext.timer1Value >= 0xD3) { + if (gSaveContext.timerSeconds >= 0xD3) { return 0x208E; } if ((HIGH_SCORE(HS_HORSE_RACE) == 0) || (HIGH_SCORE(HS_HORSE_RACE) >= 0xB4)) { HIGH_SCORE(HS_HORSE_RACE) = 0xB4; - gSaveContext.timer1Value = *timer1ValuePtr; + gSaveContext.timerSeconds = *timerSecondsPtr; } - if (!Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) && (gSaveContext.timer1Value < 0x32)) { + if (!Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) && (gSaveContext.timerSeconds < 0x32)) { return 0x208F; - } else if (gSaveContext.timer1Value < HIGH_SCORE(HS_HORSE_RACE)) { + } else if (gSaveContext.timerSeconds < HIGH_SCORE(HS_HORSE_RACE)) { return 0x2012; } else { return 0x2004; @@ -120,7 +120,7 @@ s16 func_80AA2BD4(PlayState* play, Actor* thisx) { play->transitionType = TRANS_TYPE_CIRCLE(TCA_STARBURST, TCC_BLACK, TCS_FAST); play->transitionTrigger = TRANS_TRIGGER_START; gSaveContext.eventInf[0] |= 0x400; - gSaveContext.timer1State = 0xF; + gSaveContext.timerState = 0xF; } break; case TEXT_STATE_CHOICE: @@ -147,14 +147,14 @@ s16 func_80AA2BD4(PlayState* play, Actor* thisx) { Flags_SetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE); case 0x2004: case 0x2012: - if (HIGH_SCORE(HS_HORSE_RACE) > gSaveContext.timer1Value) { - HIGH_SCORE(HS_HORSE_RACE) = gSaveContext.timer1Value; + if (HIGH_SCORE(HS_HORSE_RACE) > gSaveContext.timerSeconds) { + HIGH_SCORE(HS_HORSE_RACE) = gSaveContext.timerSeconds; } case 0x208E: gSaveContext.eventInf[0] &= ~0x400; thisx->flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; ret = NPC_TALK_STATE_IDLE; - gSaveContext.timer1State = 0xA; + gSaveContext.timerState = 0xA; break; case 0x2002: Flags_SetInfTable(INFTABLE_B9); 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 0ea4a2e25..9af8a6ca5 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 @@ -8,20 +8,15 @@ #include "objects/object_mag/object_mag.h" #include #include "soh/ResourceManagerHelpers.h" +#include #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); -void EnMag_InitVanilla(Actor* thisx, PlayState* play); - void EnMag_Destroy(Actor* thisx, PlayState* play); -void EnMag_UpdateMq(Actor* thisx, PlayState* play); -void EnMag_UpdateVanilla(Actor* thisx, PlayState* play); - +void EnMag_Update(Actor* thisx, PlayState* play); void EnMag_Draw(Actor* thisx, PlayState* play); -void EnMag_DrawInnerVanilla(Actor* thisx, PlayState* play, Gfx** gfxp); -void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp); +void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxp); typedef void (*EnMagDrawInnerFunc)(struct Actor*, PlayState*, Gfx**); @@ -35,11 +30,17 @@ const ActorInit En_Mag_InitVars = { sizeof(EnMag), (ActorFunc)EnMag_Init, (ActorFunc)EnMag_Destroy, - (ActorFunc)NULL, + (ActorFunc)EnMag_Update, (ActorFunc)EnMag_Draw, NULL, }; +// #region SOH +typedef enum { + FONT_TYPE_PAL, + FONT_TYPE_NTSC, +} FontType; + const char* noControllerMsg[] = { "NO CONTROLLER", "CONTROLLER FEHLT", @@ -52,21 +53,15 @@ const char* pressStartMsg[] = { "APPUYEZ SUR START", }; -void EnMag_Init(Actor* thisx, PlayState* play) { - if (ResourceMgr_IsGameMasterQuest()) { - EnMag_InitMq(thisx, play); - drawInnerFunc = EnMag_DrawInnerMq; - thisx->update = EnMag_UpdateMq; - } else { - EnMag_InitVanilla(thisx, play); - thisx->update = EnMag_UpdateVanilla; - drawInnerFunc = EnMag_DrawInnerVanilla; - } -} +FontType sFontType; + +// #endregion static s16 sDelayTimer = 0; -void EnMag_InitMq(Actor* thisx, PlayState* play) { + +void EnMag_Init(Actor* thisx, PlayState* play) { EnMag* this = (EnMag*)thisx; + bool isMQ = ResourceMgr_IsGameMasterQuest(); YREG(1) = 63; YREG(3) = 80; @@ -105,7 +100,7 @@ void EnMag_InitMq(Actor* thisx, PlayState* play) { this->effectFadeInState = this->effectPrimLodFrac = this->globalState = this->effectAlpha = this->mainAlpha = this->subAlpha = this->copyrightAlpha = 0.0f; - if (gSaveContext.unk_13E7 != 0) { + if (gSaveContext.forceRisingButtonAlphas) { this->mainAlpha = 210; this->subAlpha = 255; this->copyrightAlpha = 255; @@ -113,92 +108,37 @@ void EnMag_InitMq(Actor* thisx, PlayState* play) { this->effectPrimLodFrac = 128.0f; this->effectAlpha = 255.0f; - this->effectPrimColor[0] = 170; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 255.0f; - this->effectEnvColor[0] = 200.0f; - this->effectEnvColor[1] = 255.0f; - this->effectEnvColor[2] = 0; + if (isMQ) { + this->effectPrimColor[0] = 255.0f; + this->effectPrimColor[1] = 255.0f; + this->effectPrimColor[2] = 170; + this->effectEnvColor[0] = 255.0f; + this->effectEnvColor[1] = 100; + } else { + this->effectPrimColor[0] = 170; + this->effectPrimColor[1] = 255.0f; + this->effectPrimColor[2] = 255.0f; + this->effectEnvColor[0] = 200.0f; + this->effectEnvColor[1] = 255.0f; + this->effectEnvColor[2] = 0; + } - gSaveContext.unk_13E7 = 0; + gSaveContext.forceRisingButtonAlphas = false; this->globalState = MAG_STATE_DISPLAY; sDelayTimer = 20; gSaveContext.transFadeDuration = 1; gSaveContext.transWipeSpeed = 255; } - Font_LoadOrderedFont(&this->font); - - this->unk_E316 = 0; - this->unk_E318 = 0; - this->unk_E31C = 0; - this->unk_E320 = 0; -} - -void EnMag_InitVanilla(Actor* thisx, PlayState* play) { - EnMag* this = (EnMag*)thisx; - - YREG(1) = 63; - YREG(3) = 80; - YREG(4) = 255; - YREG(5) = 30; - YREG(6) = 30; - YREG(7) = 119; - YREG(8) = 7; - YREG(9) = 5; - YREG(10) = 3; - - VREG(4) = 1; - VREG(5) = 6; - VREG(6) = 2; - - this->copyrightAlphaStep = 6; - this->fadeOutAlphaStep = 10; - - VREG(19) = 99; - VREG(21) = 9; - VREG(23) = 10; - VREG(24) = 8; - - this->effectScroll = 0; - this->unk_E30C = 0; - - this->effectPrimColor[0] = 0.0f; - this->effectPrimColor[1] = 100.0f; - this->effectPrimColor[2] = 170.0f; - this->effectEnvColor[0] = 0.0f; - this->effectEnvColor[1] = 100.0f; - this->effectEnvColor[2] = 0.0f; - - this->effectFadeInTimer = 40; - - this->effectFadeInState = this->effectPrimLodFrac = this->globalState = this->effectAlpha = this->mainAlpha = - this->subAlpha = this->copyrightAlpha = 0.0f; - - if (gSaveContext.unk_13E7 != 0) { - this->mainAlpha = 210; - this->subAlpha = 255; - this->copyrightAlpha = 255; - - this->effectPrimLodFrac = 128.0f; - this->effectAlpha = 255.0f; - - this->effectPrimColor[0] = 255.0f; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 170.0f; - this->effectEnvColor[0] = 255.0f; - this->effectEnvColor[1] = 100.0f; - this->effectEnvColor[2] = 0.0f; - - gSaveContext.unk_13E7 = 0; - this->globalState = MAG_STATE_DISPLAY; - sDelayTimer = 20; - gSaveContext.transFadeDuration = 1; - gSaveContext.transWipeSpeed = 255; + // Default to PAL if it exists + if (ResourceMgr_IsPalLoaded()) { + Font_LoadOrderedFont(&this->font); + sFontType = FONT_TYPE_PAL; + } else { + Font_LoadOrderedFontNTSC(&this->font); + sFontType = FONT_TYPE_NTSC; } - Font_LoadOrderedFont(&this->font); - this->unk_E316 = 0; this->unk_E318 = 0; this->unk_E31C = 0; @@ -208,9 +148,10 @@ void EnMag_InitVanilla(Actor* thisx, PlayState* play) { void EnMag_Destroy(Actor* thisx, PlayState* play) { } -void EnMag_UpdateMq(Actor* thisx, PlayState* play) { +void EnMag_Update(Actor* thisx, PlayState* play) { s32 pad[2]; EnMag* this = (EnMag*)thisx; + bool isMQ = ResourceMgr_IsGameMasterQuest(); if (gSaveContext.fileNum != 0xFEDC) { if (this->globalState < MAG_STATE_DISPLAY) { @@ -227,12 +168,20 @@ void EnMag_UpdateMq(Actor* thisx, PlayState* play) { this->effectPrimLodFrac = 128.0f; this->effectAlpha = 255.0f; - this->effectPrimColor[0] = 170; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 255.0f; - this->effectEnvColor[0] = 200.0f; - this->effectEnvColor[1] = 255.0f; - this->effectEnvColor[2] = 0; + if (!isMQ) { + this->effectPrimColor[0] = 255.0f; + this->effectPrimColor[1] = 255.0f; + this->effectPrimColor[2] = 170; + this->effectEnvColor[0] = 255.0f; + this->effectEnvColor[1] = 100; + } else { + this->effectPrimColor[0] = 170; + this->effectPrimColor[1] = 255.0f; + this->effectPrimColor[2] = 255.0f; + this->effectEnvColor[0] = 200.0f; + this->effectEnvColor[1] = 255.0f; + this->effectEnvColor[2] = 0; + } this->globalState = MAG_STATE_DISPLAY; sDelayTimer = 20; @@ -293,8 +242,13 @@ void EnMag_UpdateMq(Actor* thisx, PlayState* play) { this->effectFadeInState = 1; } } else if (this->effectFadeInState == 1) { - this->effectPrimColor[0] += -2.125f; - this->effectEnvColor[0] += -1.375f; + if (isMQ) { + this->effectPrimColor[2] += -2.125f; + this->effectEnvColor[1] += -3.875f; + } else { + this->effectPrimColor[0] += -2.125f; + this->effectEnvColor[0] += -1.375f; + } this->effectPrimLodFrac += 2.4f; @@ -303,8 +257,13 @@ void EnMag_UpdateMq(Actor* thisx, PlayState* play) { if (this->effectFadeInTimer == 0) { this->effectPrimLodFrac = 128.0f; - this->effectPrimColor[0] = 170.0f; - this->effectEnvColor[0] = 200.0f; + if (isMQ) { + this->effectPrimColor[2] = 170.0f; + this->effectEnvColor[1] = 100.0f; + } else { + this->effectPrimColor[0] = 170.0f; + this->effectEnvColor[0] = 200.0f; + } this->effectFadeInTimer = 32; this->effectFadeInState = 2; @@ -368,169 +327,9 @@ void EnMag_UpdateMq(Actor* thisx, PlayState* play) { } } -void EnMag_UpdateVanilla(Actor* thisx, PlayState* play) { - s32 pad[2]; - EnMag* this = (EnMag*)thisx; - - if (gSaveContext.fileNum != 0xFEDC) { - if (this->globalState < MAG_STATE_DISPLAY) { - if (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) || - CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) || - CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B)) { - - Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - - this->mainAlpha = 210; - this->subAlpha = 255; - this->copyrightAlpha = 255; - - this->effectPrimLodFrac = 128.0f; - this->effectAlpha = 255.0f; - - this->effectPrimColor[0] = 255.0f; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 170.0f; - this->effectEnvColor[0] = 255.0f; - this->effectEnvColor[1] = 100.0f; - this->effectEnvColor[2] = 0.0f; - - this->globalState = MAG_STATE_DISPLAY; - sDelayTimer = 20; - gSaveContext.transFadeDuration = 1; - gSaveContext.transWipeSpeed = 255; - } - } else if (this->globalState >= MAG_STATE_DISPLAY) { - if (sDelayTimer == 0) { - if (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) || - CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) || - CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B)) { - - if (play->transitionTrigger != TRANS_TRIGGER_START) { - Audio_SetCutsceneFlag(0); - - Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, - &gSfxDefaultReverb); - - gSaveContext.gameMode = GAMEMODE_FILE_SELECT; - play->transitionTrigger = TRANS_TRIGGER_START; - play->transitionType = TRANS_TYPE_FADE_BLACK; - } - - this->copyrightAlphaStep = 15; - this->fadeOutAlphaStep = 25; - this->globalState = MAG_STATE_FADE_OUT; - } - } else { - sDelayTimer--; - } - } - } - - if (this->globalState == MAG_STATE_FADE_IN) { - if (this->effectFadeInState == 0) { - this->effectAlpha += 6.375f; - this->effectPrimLodFrac += 0.8f; - - this->effectPrimColor[0] += 6.375f; - this->effectPrimColor[1] += 3.875f; - this->effectPrimColor[2] += 2.125f; - this->effectEnvColor[0] += 6.375f; - this->effectEnvColor[1] += 3.875f; - - this->effectFadeInTimer--; - - if (this->effectFadeInTimer == 0) { - this->effectPrimLodFrac = 32.0f; - this->effectAlpha = 255.0f; - - this->effectPrimColor[0] = 255.0f; - this->effectPrimColor[1] = 255.0f; - this->effectPrimColor[2] = 255.0f; - this->effectEnvColor[0] = 255.0f; - this->effectEnvColor[1] = 255.0f; - - this->effectFadeInTimer = 40; - this->effectFadeInState = 1; - } - } else if (this->effectFadeInState == 1) { - this->effectPrimColor[2] += -2.125f; - this->effectEnvColor[1] += -3.875f; - - this->effectPrimLodFrac += 2.4f; - - this->effectFadeInTimer--; - - if (this->effectFadeInTimer == 0) { - this->effectPrimLodFrac = 128.0f; - - this->effectPrimColor[2] = 170.0f; - this->effectEnvColor[1] = 100.0f; - - this->effectFadeInTimer = 32; - this->effectFadeInState = 2; - } - } - - if (this->effectAlpha > 160) { - this->mainAlpha += VREG(5); - if (this->mainAlpha >= 210.0f) { - this->mainAlpha = 210.0f; - } - - if (this->mainAlpha >= 210) { - this->subAlpha += VREG(6); - if (this->subAlpha >= 255.0f) { - this->subAlpha = 255.0f; - } - - if (this->subAlpha >= 200) { - this->copyrightAlpha += this->copyrightAlphaStep; - if (this->copyrightAlpha >= 255.0f) { - this->copyrightAlpha = 255.0f; - this->globalState = MAG_STATE_DISPLAY; - sDelayTimer = 20; - } - } - } - } - } else if (this->globalState == MAG_STATE_FADE_OUT) { - this->effectAlpha -= this->fadeOutAlphaStep; - if (this->effectAlpha < 0.0f) { - this->effectAlpha = 0.0f; - } - - this->mainAlpha -= this->fadeOutAlphaStep; - if (this->mainAlpha < 0.0f) { - this->mainAlpha = 0.0f; - } - - this->subAlpha -= this->fadeOutAlphaStep; - if (this->subAlpha < 0.0f) { - this->subAlpha = 0.0f; - } - - this->copyrightAlpha -= this->copyrightAlphaStep; - if (this->copyrightAlpha < 0.0f) { - this->copyrightAlpha = 0.0f; - this->globalState = MAG_STATE_POST_DISPLAY; - } - } - - if (this->globalState == MAG_STATE_INITIAL) { - if (Flags_GetEnv(play, 3)) { - this->effectFadeInTimer = 40; - this->globalState = MAG_STATE_FADE_IN; - } - } else if (this->globalState == MAG_STATE_DISPLAY) { - if (Flags_GetEnv(play, 4)) { - this->globalState = MAG_STATE_FADE_OUT; - } - } -} - -void EnMag_DrawTextureI8(Gfx** gfxp, const void* texture, s16 texWidth, s16 texHeight, s16 rectLeft, s16 rectTop, +void EnMag_DrawTextureI8(Gfx** gfxP, void* texture, s16 texWidth, s16 texHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy) { - Gfx* gfx = *gfxp; + Gfx* gfx = *gfxP; gDPLoadTextureBlock(gfx++, texture, G_IM_FMT_I, G_IM_SIZ_8b, texWidth, texHeight, 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); @@ -538,28 +337,29 @@ void EnMag_DrawTextureI8(Gfx** gfxp, const void* texture, s16 texWidth, s16 texH gSPTextureRectangle(gfx++, rectLeft << 2, rectTop << 2, (rectLeft + rectWidth) << 2, (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); - *gfxp = gfx; + *gfxP = gfx; } -void EnMag_DrawEffectTextures(Gfx** gfxp, const void* maskTex, void* effectTex, s16 maskWidth, s16 maskHeight, +void EnMag_DrawEffectTextures(Gfx** gfxP, void* maskTex, void* effectTex, s16 maskWidth, s16 maskHeight, s16 effectWidth, s16 effectHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy, u16 shifts, u16 shiftt, u16 flag, EnMag* this) { - Gfx* gfx = *gfxp; + Gfx* gfx = *gfxP; - gDPLoadMultiBlock_4b(gfx++, maskTex, 0x0000, 0, G_IM_FMT_I, maskWidth, maskHeight, 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); + gDPLoadMultiBlock_4b(gfx++, maskTex, 0x0000, G_TX_RENDERTILE, G_IM_FMT_I, maskWidth, maskHeight, 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); if (!flag) { gDPLoadMultiBlock(gfx++, effectTex, 0x0100, 1, G_IM_FMT_I, G_IM_SIZ_8b, effectWidth, effectHeight, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, 5, shifts, shiftt); - gDPSetTileSize(gfx++, 1, 0, this->effectScroll & 0x7F, 0x7C, (this->effectScroll & 0x7F) + 0x7C); + gDPSetTileSize(gfx++, 1, 0, this->effectScroll & 0x7F, 31 << 2, (31 << 2) + (this->effectScroll & 0x7F)); } gSPTextureRectangle(gfx++, rectLeft << 2, rectTop << 2, (rectLeft + rectWidth) << 2, (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); - *gfxp = gfx; + *gfxP = gfx; } void EnMag_DrawImageRGBA32(Gfx** gfxp, s16 centerX, s16 centerY, const char* source, u32 width, u32 height) { @@ -593,8 +393,8 @@ void EnMag_DrawImageRGBA32(Gfx** gfxp, s16 centerX, s16 centerY, const char* sou *gfxp = gfx; } -void EnMag_DrawCharTexture(Gfx** gfxp, u8* texture, s32 rectLeft, s32 rectTop) { - Gfx* gfx = *gfxp; +void EnMag_DrawCharTexture(Gfx** gfxP, u8* texture, s32 rectLeft, s32 rectTop) { + Gfx* gfx = *gfxP; YREG(0) = 1024.0f / (YREG(1) / 100.0f); YREG(2) = 16.0f * (YREG(1) / 100.0f); @@ -605,43 +405,103 @@ void EnMag_DrawCharTexture(Gfx** gfxp, u8* texture, s32 rectLeft, s32 rectTop) { gSPTextureRectangle(gfx++, rectLeft << 2, rectTop << 2, (rectLeft + YREG(2)) << 2, (rectTop + YREG(2)) << 2, G_TX_RENDERTILE, 0, 0, YREG(0), YREG(0)); - *gfxp = gfx; + *gfxP = gfx; } -s16 GetCharArraySize(const char* str) { - s16 length = 0; - char c = str[length]; +// #region SOH - Translate Title Screen +bool EnMag_ShouldDrawNoController(Font* font, Gfx** gfxP, bool isActualText) { + if (!CVarGetInteger(CVAR_SETTING("TitleScreenTranslation"), 0) || !ResourceMgr_IsPalLoaded()) { + return true; + } + Gfx* gfx = *gfxP; + u8 language = (gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language; + s32 length = strlen(noControllerMsg[language]); + u16 rectLeft = VREG(19) + ((length - 13) * -3); + u16 rectTop = YREG(10) + 171; + s32 i; - while (c != 0) { - length++; - c = str[length]; + if (!isActualText) { + rectLeft++; + rectTop++; } - return length; -} - -static void EnMag_SetCopyValues(const char** copy_tex, u16* copy_width, u16* copy_xl, u16* copy_xh) { - u32 platform = ResourceMgr_GetGamePlatform(0); - switch (platform) { - case GAME_PLATFORM_N64: - *copy_tex = gTitleCopyright1998Tex; - *copy_width = 128; - *copy_xl = 376; - *copy_xh = 888; - break; - default: - *copy_tex = gTitleCopyright19982003Tex; - *copy_width = 160; - *copy_xl = 312; - *copy_xh = 952; - break; + if (sFontType != FONT_TYPE_PAL) { + Font_LoadOrderedFont(font); + sFontType = FONT_TYPE_PAL; } + + for (i = 0; i < length; i++) { + EnMag_DrawCharTexture(&gfx, font->fontBuf + (noControllerMsg[language][i] - '\x37') * FONT_CHAR_TEX_SIZE, + rectLeft, rectTop); + if (noControllerMsg[language][i] == ' ') { + rectLeft += VREG(23); + } else { + rectLeft += VREG(21); + } + } + + + *gfxP = gfx; + return false; } -void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { +bool EnMag_ShouldDrawPressStart(Font* font, Gfx** gfxP, bool isActualText) { + if (!CVarGetInteger(CVAR_SETTING("TitleScreenTranslation"), 0) || !ResourceMgr_IsPalLoaded()) { + return true; + } + Gfx* gfx = *gfxP; + u8 language = (gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language; + s32 length = strlen(pressStartMsg[language]); + u16 rectLeft = YREG(7) + ((length - 11) * -3); + u16 rectTop = YREG(10) + 171; + s32 i; + + if (!isActualText) { + rectLeft++; + rectTop++; + } + + if (sFontType != FONT_TYPE_PAL) { + Font_LoadOrderedFont(font); + sFontType = FONT_TYPE_PAL; + } + + for (i = 0; i < length; i++) { + EnMag_DrawCharTexture(&gfx, font->fontBuf + (pressStartMsg[language][i] - '\x37') * FONT_CHAR_TEX_SIZE, + rectLeft, rectTop); + if (pressStartMsg[language][i] == ' ') { + rectLeft += YREG(9); + } else { + rectLeft += YREG(8); + } + } + + + *gfxP = gfx; + return false; +} +// #endregion + +// Title logo is shifted to the left in Master Quest +#define LOGO_X_SHIFT (isMQ ? 0 : -8) +#define LOGO_TEX (isMQ ? gTitleZeldaShieldLogoMQTex : gTitleZeldaShieldLogoTex) +// Copyright texture is larger on GC +#define COPYRIGHT_TEX (isGC ? gTitleCopyright19982003Tex : gTitleCopyright1998Tex) +#define COPYRIGHT_TEX_WIDTH (isGC ? 160 : 128) +#define COPYRIGHT_TEX_LEFT (isGC ? 78 : 94) + +void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxP) { static s16 textAlpha = 0; static s16 textFadeDirection = 0; static s16 textFadeTimer = 0; + static u8 noControllerFontIndices[2][12] = { + { 0x17, 0x18, 0x0C, 0x18, 0x17, 0x1D, 0x1B, 0x18, 0x15, 0x15, 0x0E, 0x1B }, + { 0xB8, 0xB9, 0xAD, 0xB9, 0xB8, 0xBE, 0xBC, 0xB9, 0xB6, 0xB6, 0xAF, 0xBC }, + }; + static u8 pressStartFontIndices[2][10] = { + { 0x19, 0x1B, 0x0E, 0x1C, 0x1C, 0x1C, 0x1D, 0x0A, 0x1B, 0x1D }, + { 0xBA, 0xBC, 0xAF, 0xBD, 0xBD, 0xBD, 0xBE, 0xAB, 0xBC, 0xBE }, + }; static void* effectMaskTextures[] = { gTitleEffectMask00Tex, gTitleEffectMask01Tex, gTitleEffectMask02Tex, gTitleEffectMask10Tex, gTitleEffectMask11Tex, gTitleEffectMask12Tex, @@ -650,21 +510,12 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { EnMag* this = (EnMag*)thisx; Font* font = &this->font; s32 pad; - Gfx* gfx = *gfxp; + Gfx* gfx = *gfxP; u16 i, j, k; u16 rectLeft; u16 rectTop; - u16 length; - int lang = LANGUAGE_ENG; - if (CVarGetInteger(CVAR_SETTING("TitleScreenTranslation"), 0)) { - lang = gSaveContext.language; - } - - const char* copy_tex = NULL; - u16 copy_width; - u16 copy_xl; - u16 copy_xh; - EnMag_SetCopyValues(©_tex, ©_width, ©_xl, ©_xh); + bool isMQ = ResourceMgr_IsGameMasterQuest(); + bool isGC = ResourceMgr_GetGamePlatform(0) == GAME_PLATFORM_GC; gSPSegment(gfx++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment); @@ -685,7 +536,7 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { if ((s16)this->effectPrimLodFrac != 0) { for (k = 0, i = 0, rectTop = 0; i < 3; i++, rectTop += 64) { - for (j = 0, rectLeft = 56; j < 3; j++, k++, rectLeft += 64) { + for (j = 0, rectLeft = 64 + LOGO_X_SHIFT; j < 3; j++, k++, rectLeft += 64) { EnMag_DrawEffectTextures(&gfx, effectMaskTextures[k], gTitleFlameEffectTex, 64, 64, 32, 32, rectLeft, rectTop, 64, 64, 1024, 1024, 1, 1, k, this); } @@ -695,7 +546,7 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, (s16)this->mainAlpha); if ((s16)this->mainAlpha != 0) { - EnMag_DrawImageRGBA32(&gfx, 152, 100, (u8*)gTitleZeldaShieldLogoMQTex, 160, 160); + EnMag_DrawImageRGBA32(&gfx, 160 + LOGO_X_SHIFT, 100, (u8*)LOGO_TEX, 160, 160); } Gfx_SetupDL_39Ptr(&gfx); @@ -712,22 +563,58 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { } gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, (s16)this->mainAlpha); - gDPSetEnvColor(gfx++, 0, 0, 100, 255); + + if (isMQ) { + gDPSetEnvColor(gfx++, 100, 0, 100, 255); + } else { + gDPSetEnvColor(gfx++, 0, 0, 100, 255); + } if ((s16)this->mainAlpha != 0) { - EnMag_DrawTextureI8(&gfx, gTitleTheLegendOfTextTex, 72, 8, 146, 73, 72, 8, 1024, 1024); - EnMag_DrawTextureI8(&gfx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 144, 127, 96, 8, 1024, 1024); + EnMag_DrawTextureI8(&gfx, gTitleTheLegendOfTextTex, 72, 8, 154 + LOGO_X_SHIFT, 73, 72, 8, 1024, 1024); + EnMag_DrawTextureI8(&gfx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 152 + LOGO_X_SHIFT, 127, 96, 8, 1024, 1024); gDPPipeSync(gfx++); - gDPSetPrimColor(gfx++, 0, 0, 100, 150, 255, (s16)this->mainAlpha); - gDPSetEnvColor(gfx++, 20, 80, 160, 255); - EnMag_DrawTextureI8(&gfx, gTitleTheLegendOfTextTex, 72, 8, 145, 72, 72, 8, 1024, 1024); - EnMag_DrawTextureI8(&gfx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 143, 126, 96, 8, 1024, 1024); + if (!isMQ) { + gDPSetPrimColor(gfx++, 0, 0, 200, 200, 150, (s16)this->mainAlpha); + gDPSetEnvColor(gfx++, 100, 100, 50, 255); + } else { + gDPSetPrimColor(gfx++, 0, 0, 100, 150, 255, (s16)this->mainAlpha); + gDPSetEnvColor(gfx++, 20, 80, 160, 255); + } + EnMag_DrawTextureI8(&gfx, gTitleTheLegendOfTextTex, 72, 8, 153 + LOGO_X_SHIFT, 72, 72, 8, 1024, 1024); + EnMag_DrawTextureI8(&gfx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 151 + LOGO_X_SHIFT, 126, 96, 8, 1024, 1024); + + if (isMQ) { + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, (s16)this->subAlpha); + + EnMag_DrawImageRGBA32(&gfx, 174, 145, (u8*)gTitleMasterQuestSubtitleTex, 128, 32); + } + } + + if (gSaveContext.language == LANGUAGE_JPN) { + this->unk_E30C++; gDPPipeSync(gfx++); - gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, (s16)this->subAlpha); - EnMag_DrawImageRGBA32(&gfx, 174, 145, gTitleMasterQuestSubtitleTex, 128, 32); + gDPSetCycleType(gfx++, G_CYC_2CYCLE); + if ((s16)this->subAlpha < 100) { + gDPSetRenderMode(gfx++, G_RM_PASS, G_RM_CLD_SURF2); + } else { + gDPSetRenderMode(gfx++, G_RM_PASS, G_RM_XLU_SURF2); + } + gDPSetCombineLERP(gfx++, TEXEL1, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); + gDPSetPrimColor(gfx++, 0, 0x80, 255, 255, 170, (s16)this->subAlpha); + gDPSetEnvColor(gfx++, 255, 150, 0, 255); + if ((s16)this->subAlpha != 0) { + gDPLoadTextureBlock(gfx++, gTitleTitleJPNTex, G_IM_FMT_I, G_IM_SIZ_8b, 128, 16, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); + gDPLoadMultiBlock(gfx++, gTitleFlameEffectTex, 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, 1); + gDPSetTileSize(gfx++, 1, this->unk_E30C & 0x7F, this->effectScroll & 0x7F, (this->unk_E30C & 0x7F) + ((32 - 1) << 2), (this->effectScroll & 0x7F) + ((32 - 1) << 2)); + gSPTextureRectangle(gfx++, 106 << 2, 144 << 2, (106 + 128) << 2, (144 + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } } Gfx_SetupDL_39Ptr(&gfx); @@ -739,10 +626,11 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { (s16)this->copyrightAlpha); if ((s16)this->copyrightAlpha != 0) { - gDPLoadTextureBlock(gfx++, copy_tex, G_IM_FMT_IA, G_IM_SIZ_8b, copy_width, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gDPLoadTextureBlock(gfx++, COPYRIGHT_TEX, G_IM_FMT_IA, G_IM_SIZ_8b, COPYRIGHT_TEX_WIDTH, 16, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(gfx++, copy_xl, 792, copy_xh, 856, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gSPTextureRectangle(gfx++, COPYRIGHT_TEX_LEFT << 2, 198 << 2, (COPYRIGHT_TEX_LEFT + COPYRIGHT_TEX_WIDTH) << 2, (198 + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } if (gSaveContext.fileNum == 0xFEDC) { @@ -758,15 +646,15 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { 0); gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, textAlpha); - length = GetCharArraySize(noControllerMsg[lang]); - rectLeft = VREG(19) + 1 + ((length - 13) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (noControllerMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 172); - if (noControllerMsg[lang][i] == ' ') { - rectLeft += VREG(23); - } else { + if (EnMag_ShouldDrawNoController(font, &gfx, false)) { + rectLeft = VREG(19) + 1; + for (i = 0; i < ARRAY_COUNT(noControllerFontIndices[sFontType]); i++) { + EnMag_DrawCharTexture(&gfx, font->fontBuf + noControllerFontIndices[sFontType][i] * FONT_CHAR_TEX_SIZE, rectLeft, + YREG(10) + 172); rectLeft += VREG(21); + if (i == 1) { + rectLeft += VREG(23); + } } } @@ -774,14 +662,15 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { gDPPipeSync(gfx++); gDPSetPrimColor(gfx++, 0, 0, 100, 255, 255, textAlpha); - rectLeft = VREG(19) + ((length - 13) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (noControllerMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 171); - if (noControllerMsg[lang][i] == ' ') { - rectLeft += VREG(23); - } else { + if (EnMag_ShouldDrawNoController(font, &gfx, true)) { + rectLeft = VREG(19); + for (i = 0; i < ARRAY_COUNT(noControllerFontIndices[sFontType]); i++) { + EnMag_DrawCharTexture(&gfx, font->fontBuf + noControllerFontIndices[sFontType][i] * FONT_CHAR_TEX_SIZE, rectLeft, + YREG(10) + 171); rectLeft += VREG(21); + if (i == 1) { + rectLeft += VREG(23); + } } } } else if (this->copyrightAlpha >= 200.0f) { @@ -797,15 +686,15 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { 0); gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, textAlpha); - length = GetCharArraySize(pressStartMsg[lang]); - rectLeft = YREG(7) + 1 + ((length - 11) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (pressStartMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 172); - if (pressStartMsg[lang][i] == ' ') { - rectLeft += YREG(9); - } else { + if (EnMag_ShouldDrawPressStart(font, &gfx, false)) { + rectLeft = YREG(7) + 1; + for (i = 0; i < ARRAY_COUNT(pressStartFontIndices[sFontType]); i++) { + EnMag_DrawCharTexture(&gfx, font->fontBuf + pressStartFontIndices[sFontType][i] * FONT_CHAR_TEX_SIZE, rectLeft, + YREG(10) + 172); rectLeft += YREG(8); + if (i == 4) { + rectLeft += YREG(9); + } } } @@ -813,14 +702,15 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { gDPPipeSync(gfx++); gDPSetPrimColor(gfx++, 0, 0, YREG(4), YREG(5), YREG(6), textAlpha); - rectLeft = YREG(7) + ((length - 11) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (pressStartMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 171); - if (pressStartMsg[lang][i] == ' ') { - rectLeft += YREG(9); - } else { + if (EnMag_ShouldDrawPressStart(font, &gfx, true)) { + rectLeft = YREG(7); + for (i = 0; i < ARRAY_COUNT(pressStartFontIndices[sFontType]); i++) { + EnMag_DrawCharTexture(&gfx, font->fontBuf + pressStartFontIndices[sFontType][i] * FONT_CHAR_TEX_SIZE, rectLeft, + YREG(10) + 171); rectLeft += YREG(8); + if (i == 4) { + rectLeft += YREG(9); + } } } } @@ -835,216 +725,7 @@ void EnMag_DrawInnerMq(Actor* thisx, PlayState* play, Gfx** gfxp) { } } - *gfxp = gfx; -} - -void EnMag_DrawInnerVanilla(Actor* thisx, PlayState* play, Gfx** gfxp) { - static s16 textAlpha = 0; - static s16 textFadeDirection = 0; - static s16 textFadeTimer = 0; - static const void* effectMaskTextures[] = { - gTitleEffectMask00Tex, gTitleEffectMask01Tex, gTitleEffectMask02Tex, - gTitleEffectMask10Tex, gTitleEffectMask11Tex, gTitleEffectMask12Tex, - gTitleEffectMask20Tex, gTitleEffectMask21Tex, gTitleEffectMask22Tex, - }; - EnMag* this = (EnMag*)thisx; - Font* font = &this->font; - s32 pad; - Gfx* gfx = *gfxp; - u16 i, j, k; - u16 rectLeft; - u16 rectTop; - u16 length; - int lang = LANGUAGE_ENG; - if (CVarGetInteger(CVAR_SETTING("TitleScreenTranslation"), 0)) { - lang = gSaveContext.language; - } - - const char* copy_tex = NULL; - u16 copy_width; - u16 copy_xl; - u16 copy_xh; - EnMag_SetCopyValues(©_tex, ©_width, ©_xl, ©_xh); - - gSPSegment(gfx++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment); - - Gfx_SetupDL_39Ptr(&gfx); - - this->effectScroll -= 2; - - gDPSetCycleType(gfx++, G_CYC_2CYCLE); - gDPSetAlphaCompare(gfx++, G_AC_THRESHOLD); - gDPSetRenderMode(gfx++, G_RM_PASS, G_RM_CLD_SURF2); - gDPSetCombineLERP(gfx++, TEXEL1, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, TEXEL1, 1, PRIM_LOD_FRAC, TEXEL0, PRIMITIVE, - ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); - - gDPSetPrimColor(gfx++, 0, (s16)this->effectPrimLodFrac, (s16)this->effectPrimColor[0], - (s16)this->effectPrimColor[1], (s16)this->effectPrimColor[2], (s16)this->effectAlpha); - gDPSetEnvColor(gfx++, (s16)this->effectEnvColor[0], (s16)this->effectEnvColor[1], (s16)this->effectEnvColor[2], - 255); - - if ((s16)this->effectPrimLodFrac != 0) { - for (k = 0, i = 0, rectTop = 0; i < 3; i++, rectTop += 64) { - for (j = 0, rectLeft = 64; j < 3; j++, k++, rectLeft += 64) { - EnMag_DrawEffectTextures(&gfx, effectMaskTextures[k], gTitleFlameEffectTex, 64, 64, 32, 32, rectLeft, - rectTop, 64, 64, 1024, 1024, 1, 1, k, this); - } - } - } - - gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, (s16)this->mainAlpha); - - if ((s16)this->mainAlpha != 0) { - EnMag_DrawImageRGBA32(&gfx, 160, 100, (u8*)gTitleZeldaShieldLogoTex, 160, 160); - } - - Gfx_SetupDL_39Ptr(&gfx); - - gDPPipeSync(gfx++); - gDPSetAlphaCompare(gfx++, G_AC_NONE); - gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, - ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - - if ((s16)this->mainAlpha < 100) { - gDPSetRenderMode(gfx++, G_RM_CLD_SURF, G_RM_CLD_SURF2); - } else { - gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); - } - - gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, (s16)this->mainAlpha); - gDPSetEnvColor(gfx++, 100, 0, 100, 255); - - if ((s16)this->mainAlpha != 0) { - EnMag_DrawTextureI8(&gfx, gTitleTheLegendOfTextTex, 72, 8, 154, 73, 72, 8, 1024, 1024); - EnMag_DrawTextureI8(&gfx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 152, 127, 96, 8, 1024, 1024); - - gDPPipeSync(gfx++); - gDPSetPrimColor(gfx++, 0, 0, 200, 200, 150, (s16)this->mainAlpha); - gDPSetEnvColor(gfx++, 100, 100, 50, 255); - - EnMag_DrawTextureI8(&gfx, gTitleTheLegendOfTextTex, 72, 8, 153, 72, 72, 8, 1024, 1024); - EnMag_DrawTextureI8(&gfx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 151, 126, 96, 8, 1024, 1024); - } - - Gfx_SetupDL_39Ptr(&gfx); - - gDPSetAlphaCompare(gfx++, G_AC_NONE); - gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); - - if (CVarGetInteger(CVAR_COSMETIC("Title.Copyright.Changed"), 0)) { - Color_RGBA8 copyrightColor = CVarGetColor(CVAR_COSMETIC("Title.Copyright.Value"), (Color_RGBA8){ 255, 255, 255, 255 }); - gDPSetPrimColor( - gfx++, - 0, - 0, - (s16)(((f32)copyrightColor.r / 255.0f) * this->copyrightAlpha), - (s16)(((f32)copyrightColor.g / 255.0f) * this->copyrightAlpha), - (s16)(((f32)copyrightColor.b / 255.0f) * this->copyrightAlpha), - (s16)(((f32)copyrightColor.a / 255.0f) * this->copyrightAlpha) - ); - } else { - gDPSetPrimColor(gfx++, 0, 0, (s16)this->copyrightAlpha, (s16)this->copyrightAlpha, (s16)this->copyrightAlpha, - (s16)this->copyrightAlpha); - } - - if ((s16)this->copyrightAlpha != 0) { - gDPLoadTextureBlock(gfx++, copy_tex, G_IM_FMT_IA, G_IM_SIZ_8b, copy_width, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - - gSPTextureRectangle(gfx++, copy_xl, 792, copy_xh, 856, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - } - - if (gSaveContext.fileNum == 0xFEDC) { - // Draw "NO CONTROLLER" Text - textAlpha = textFadeTimer * 10; - if (textAlpha >= 255) { - textAlpha = 255; - } - - // Text Shadow - gDPPipeSync(gfx++); - gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, - 0); - gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, textAlpha); - - length = GetCharArraySize(noControllerMsg[lang]); - rectLeft = VREG(19) + 1 + ((length - 13) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (noControllerMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 172); - if (noControllerMsg[lang][i] == ' ') { - rectLeft += VREG(23); - } else { - rectLeft += VREG(21); - } - } - - // Actual Text - gDPPipeSync(gfx++); - gDPSetPrimColor(gfx++, 0, 0, 100, 255, 255, textAlpha); - - rectLeft = VREG(19) + ((length - 13) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (noControllerMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 171); - if (noControllerMsg[lang][i] == ' ') { - rectLeft += VREG(23); - } else { - rectLeft += VREG(21); - } - } - } else if (this->copyrightAlpha >= 200.0f) { - // Draw "PRESS START" Text - textAlpha = textFadeTimer * 10; - if (textAlpha >= 255) { - textAlpha = 255; - } - - // Text Shadow - gDPPipeSync(gfx++); - gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, - 0); - gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, textAlpha); - - length = GetCharArraySize(pressStartMsg[lang]); - rectLeft = YREG(7) + 1 + ((length - 11) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (pressStartMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 172); - if (pressStartMsg[lang][i] == ' ') { - rectLeft += YREG(9); - } else { - rectLeft += YREG(8); - } - } - - // Actual Text - gDPPipeSync(gfx++); - gDPSetPrimColor(gfx++, 0, 0, YREG(4), YREG(5), YREG(6), textAlpha); - - rectLeft = YREG(7) + ((length - 11) * -3); - for (i = 0; i < length; i++) { - EnMag_DrawCharTexture(&gfx, font->fontBuf + (pressStartMsg[lang][i] - '\x37') * FONT_CHAR_TEX_SIZE, - rectLeft, YREG(10) + 171); - if (pressStartMsg[lang][i] == ' ') { - rectLeft += YREG(9); - } else { - rectLeft += YREG(8); - } - } - } - - if (textFadeDirection != 0) { - if (--textFadeTimer == 0) { - textFadeDirection = 0; - } - } else { - if (++textFadeTimer >= 26) { - textFadeDirection = 1; - } - } - - *gfxp = gfx; + *gfxP = gfx; } void EnMag_Draw(Actor* thisx, PlayState* play) { @@ -1058,7 +739,7 @@ void EnMag_Draw(Actor* thisx, PlayState* play) { gfx = Graph_GfxPlusOne(gfxRef); gSPDisplayList(OVERLAY_DISP++, gfx); - drawInnerFunc(thisx, play, &gfx); + EnMag_DrawInner(thisx, play, &gfx); gSPEndDisplayList(gfx++); Graph_BranchDlist(gfxRef, gfx); diff --git a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.h b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.h index c3799502e..c2abb256d 100644 --- a/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.h +++ b/soh/src/overlays/actors/ovl_En_Mag/z_en_mag.h @@ -41,7 +41,4 @@ typedef enum { /* 0x04 */ MAG_STATE_POST_DISPLAY } EnMagGlobalState; -#define dgTitleCopyright1998Tex "__OTR__objects/object_mag/gTitleCopyright1998Tex" -static const ALIGN_ASSET(2) char gTitleCopyright1998Tex[] = dgTitleCopyright1998Tex; - #endif \ No newline at end of file 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 56f0e70b2..71e779a0a 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 @@ -267,7 +267,7 @@ void EnMk_Wait(EnMk* this, PlayState* play) { Animation_Change(&this->skelAnime, &object_mk_Anim_000368, 1.0f, 0.0f, Animation_GetLastFrame(&object_mk_Anim_000368), ANIMMODE_ONCE, -4.0f); this->flags &= ~2; - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; Sfx_PlaySfxCentered(NA_SE_SY_TRE_BOX_APPEAR); break; default: 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 32cc9e3e0..72b193ea3 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 @@ -107,14 +107,14 @@ void func_80AAEF70(EnMm2* this, PlayState* play) { } else if (Flags_GetInfTable(INFTABLE_17F)) { if (gSaveContext.eventInf[1] & 1) { this->actor.textId = 0x6082; - } else if (gSaveContext.timer2State != 0) { + } else if (gSaveContext.subTimerState != 0) { this->actor.textId = 0x6076; } else if (HIGH_SCORE(HS_MARATHON) == 158) { this->actor.textId = 0x607E; } else { this->actor.textId = 0x6081; } - } else if (gSaveContext.timer2State) { + } else if (gSaveContext.subTimerState) { this->actor.textId = 0x6076; } else { this->actor.textId = 0x607D; @@ -197,7 +197,7 @@ void func_80AAF330(EnMm2* this, PlayState* play) { if (!(this->unk_1F4 & 2)) { Message_CloseTextbox(play); } - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; gSaveContext.eventInf[1] &= ~1; } } @@ -269,15 +269,15 @@ void func_80AAF668(EnMm2* this, PlayState* play) { this->actor.world.rot.y = -0x3E80; this->actor.shape.rot.y = this->actor.world.rot.y; SkelAnime_Update(&this->skelAnime); - if (((void)0, gSaveContext.timer2Value) < HIGH_SCORE(HS_MARATHON)) { + if (((void)0, gSaveContext.subTimerSeconds) < HIGH_SCORE(HS_MARATHON)) { this->actor.textId = 0x6085; } else { this->actor.textId = 0x6084; } if (func_80AAF224(this, play, func_80AAF5EC)) { this->unk_1F6 = 0; - if (((void)0, gSaveContext.timer2Value) < HIGH_SCORE(HS_MARATHON)) { - HIGH_SCORE(HS_MARATHON) = gSaveContext.timer2Value; + if (((void)0, gSaveContext.subTimerSeconds) < HIGH_SCORE(HS_MARATHON)) { + HIGH_SCORE(HS_MARATHON) = gSaveContext.subTimerSeconds; } } else { LOG_HEX("((z_common_data.event_inf[1]) & (0x0001))", gSaveContext.eventInf[1] & 1); 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 7701f9a2c..fdecdc55e 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 @@ -374,9 +374,7 @@ void func_80ACA7E0(EnOwl* this, PlayState* play) { void EnOwl_ConfirmKokiriMessage(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x2065); break; @@ -404,8 +402,7 @@ void EnOwl_WaitOutsideKokiri(EnOwl* this, PlayState* play) { void func_80ACA998(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x2069); this->actionFunc = func_80ACAA54; @@ -449,9 +446,7 @@ void EnOwl_WaitHyruleCastle(EnOwl* this, PlayState* play) { void func_80ACAB88(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: // obtained zelda's letter if (Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER)) { @@ -492,9 +487,7 @@ void EnOwl_WaitKakariko(EnOwl* this, PlayState* play) { void func_80ACAD34(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x206F); this->actionFunc = func_80ACADF0; @@ -530,9 +523,7 @@ void EnOwl_WaitGerudo(EnOwl* this, PlayState* play) { void func_80ACAEB8(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x2071); this->actionFunc = func_80ACAF74; @@ -652,9 +643,7 @@ void EnOwl_WaitDeathMountainShortcut(EnOwl* this, PlayState* play) { void func_80ACB344(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x607A); break; @@ -677,9 +666,7 @@ void func_80ACB3E0(EnOwl* this, PlayState* play) { void func_80ACB440(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x10C1); this->actionFunc = func_80ACB4FC; @@ -714,9 +701,7 @@ void EnOwl_WaitLWPreSaria(EnOwl* this, PlayState* play) { void func_80ACB5C4(EnOwl* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { - // swap the order of the responses if better owl is enabled - uint8_t index = CVarGetInteger(CVAR_ENHANCEMENT("BetterOwl"), 0) == 0 ? play->msgCtx.choiceIndex : (1 - play->msgCtx.choiceIndex); - switch (index) { + switch (play->msgCtx.choiceIndex) { case OWL_REPEAT: Message_ContinueTextbox(play, 0x10C5); this->actionFunc = func_80ACB680; 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 067960019..409376695 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 @@ -266,7 +266,7 @@ void EnPoRelay_EndRace(EnPoRelay* this, PlayState* play) { this->actionFunc = EnPoRelay_Talk2; } else if (play->roomCtx.curRoom.num == 5) { Actor_Kill(&this->actor); - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } else if (Actor_IsFacingAndNearPlayer(&this->actor, 150.0f, 0x3000)) { this->actor.textId = this->textId; func_8002F2CC(&this->actor, play, 250.0f); @@ -287,7 +287,7 @@ void EnPoRelay_Talk2(EnPoRelay* this, PlayState* play) { Message_ContinueTextbox(play, this->actor.textId); } } else if (Actor_TextboxIsClosing(&this->actor, play)) { - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; this->actionTimer = 0; this->actionFunc = EnPoRelay_DisappearAndReward; } @@ -337,17 +337,17 @@ void EnPoRelay_DisappearAndReward(EnPoRelay* this, PlayState* play) { sp60.x = this->actor.world.pos.x; sp60.y = this->actor.floorHeight; sp60.z = this->actor.world.pos.z; - if (gSaveContext.timer1Value < HIGH_SCORE(HS_DAMPE_RACE)) { - HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timer1Value; + if (gSaveContext.timerSeconds < HIGH_SCORE(HS_DAMPE_RACE)) { + HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timerSeconds; } - if (Flags_GetCollectible(play, this->actor.params) == 0 && gSaveContext.timer1Value <= 60) { + if (Flags_GetCollectible(play, this->actor.params) == 0 && gSaveContext.timerSeconds <= 60) { Item_DropCollectible2(play, &sp60, (this->actor.params << 8) + (0x4000 | ITEM00_HEART_PIECE)); } else { Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ITEM00, sp60.x, sp60.y, sp60.z, 0, 0, 0, 2, true); } } else { Flags_SetTempClear(play, 4); - HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timer1Value; + HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timerSeconds; } } else { sp60.x = this->actor.world.pos.x; @@ -357,13 +357,13 @@ void EnPoRelay_DisappearAndReward(EnPoRelay* this, PlayState* play) { if (this->hookshotSlotFull == 0) { Flags_SetTempClear(play, 4); Flags_SetTreasure(gPlayState, 0x1E); - HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timer1Value; + HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timerSeconds; } - if (gSaveContext.timer1Value < HIGH_SCORE(HS_DAMPE_RACE)) { - HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timer1Value; + if (gSaveContext.timerSeconds < HIGH_SCORE(HS_DAMPE_RACE)) { + HIGH_SCORE(HS_DAMPE_RACE) = gSaveContext.timerSeconds; } - if (Flags_GetCollectible(play, this->actor.params) == 0 && gSaveContext.timer1Value <= 60) { + if (Flags_GetCollectible(play, this->actor.params) == 0 && gSaveContext.timerSeconds <= 60) { Item_DropCollectible2(play, &sp60, (this->actor.params << 8) + (0x4000 | ITEM00_HEART_PIECE)); } else if (Flags_GetCollectible(play, this->actor.params) != 0) { Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ITEM00, sp60.x, sp60.y, sp60.z, 0, 0, 0, 2, true); 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 29fda2421..fa43e68c7 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 @@ -496,7 +496,7 @@ void func_80B12460(EnSyatekiNiw* this, PlayState* play) { void func_80B128D8(EnSyatekiNiw* this, PlayState* play) { if (this->unk_25E == 1) { - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } } 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 049812303..1d6e1b3a8 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 @@ -240,7 +240,7 @@ void EnTa_Destroy(Actor* thisx, PlayState* play) { Collider_DestroyCylinder(play, &this->collider); if (this->actor.params != 1 && this->actor.params != 2 && play->sceneNum == SCENE_LON_LON_BUILDINGS) { - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; } if (this->unk_2E0 & 0x200) { @@ -708,7 +708,7 @@ void EnTa_RunCuccoGame(EnTa* this, PlayState* play) { switch (EnTa_GetSuperCuccosCount(this, play)) { case 1: - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; Player_SetCsActionWithHaltedActors(play, &this->actor, 1); Message_StartTextbox(play, 0x2084, &this->actor); @@ -742,15 +742,15 @@ void EnTa_RunCuccoGame(EnTa* this, PlayState* play) { } } - if (gSaveContext.timer1Value == 10) { + if (gSaveContext.timerSeconds == 10) { func_800F5918(); } - if (gSaveContext.timer1Value == 0 && !Play_InCsMode(play)) { + if (gSaveContext.timerSeconds == 0 && !Play_InCsMode(play)) { Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_STOP); this->unk_2E0 &= ~0x200; Sfx_PlaySfxCentered(NA_SE_SY_FOUND); - gSaveContext.timer1State = 0; + gSaveContext.timerState = 0; Player_SetCsActionWithHaltedActors(play, &this->actor, 1); Message_StartTextbox(play, 0x2081, &this->actor); this->actionFunc = func_80B15424; 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 6f2a816f6..6d0fec9cd 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 @@ -1613,7 +1613,7 @@ void EnZl2_Init(Actor* thisx, PlayState* play) { Audio_SetSoundBanksMute(0x6F); break; case 4: - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; break; } } 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 d01fc77d4..7ec8c93c5 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 @@ -2492,7 +2492,7 @@ s32 func_80B59698(EnZl3* this, PlayState* play) { u8 curSpawn = play->curSpawn; if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && - ((gSaveContext.timer2Value <= 0) || (gSaveContext.timer2State == 0))) { + ((gSaveContext.subTimerSeconds <= 0) || (gSaveContext.subTimerState == 0))) { return 1; } } @@ -2507,7 +2507,7 @@ s32 func_80B59768(EnZl3* this, PlayState* play) { if (cond) { u8 curSpawn = play->curSpawn; - if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && (gSaveContext.timer2Value <= 0)) { + if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && (gSaveContext.subTimerSeconds <= 0)) { return 1; } } @@ -2666,7 +2666,7 @@ void EnZl3_Init(Actor* thisx, PlayState* play) { switch (func_80B54DD4(this)) { case 1: - gSaveContext.timer2State = 0; + gSaveContext.subTimerState = 0; break; case 3: func_80B59A80(this, 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 41ababe85..c4a2974f3 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 @@ -50,8 +50,8 @@ void ObjRoomtimer_Init(Actor* thisx, PlayState* play) { void ObjRoomtimer_Destroy(Actor* thisx, PlayState* play) { ObjRoomtimer* this = (ObjRoomtimer*)thisx; - if ((this->actor.params != 0x3FF) && (gSaveContext.timer1Value > 0)) { - gSaveContext.timer1State = 10; + if ((this->actor.params != 0x3FF) && (gSaveContext.timerSeconds > 0)) { + gSaveContext.timerState = 10; } } @@ -67,14 +67,14 @@ void func_80B9D054(ObjRoomtimer* this, PlayState* play) { void func_80B9D0B0(ObjRoomtimer* this, PlayState* play) { if (Flags_GetTempClear(play, this->actor.room)) { if (this->actor.params != 0x3FF) { - gSaveContext.timer1State = 10; + gSaveContext.timerState = 10; } Flags_SetClear(play, this->actor.room); Flags_SetSwitch(play, this->switchFlag); Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); Actor_Kill(&this->actor); } else { - if ((this->actor.params != 0x3FF) && (gSaveContext.timer1Value == 0)) { + if ((this->actor.params != 0x3FF) && (gSaveContext.timerSeconds == 0)) { Audio_PlaySoundGeneral(NA_SE_OC_ABYSS, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); Play_TriggerVoidOut(play); Actor_Kill(&this->actor); 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 312a74215..4c387d5f3 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2634,7 +2634,7 @@ void Player_UpdateItems(Player* this, PlayState* play) { ((this->heldItemAction == this->itemAction) || (this->stateFlags1 & PLAYER_STATE1_SHIELDING)) && (gSaveContext.health != 0) && (play->csCtx.state == CS_STATE_IDLE) && (this->csAction == 0) && (play->shootingGalleryStatus == 0) && (play->activeCamera == MAIN_CAM) && - (play->transitionTrigger != TRANS_TRIGGER_START) && (gSaveContext.timer1State != 10)) { + (play->transitionTrigger != TRANS_TRIGGER_START) && (gSaveContext.timerState != 10)) { Player_ProcessItemButtons(this, play); } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/file_choose.h b/soh/src/overlays/gamestates/ovl_file_choose/file_choose.h index 3e3106ef4..5f6e3f202 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/file_choose.h +++ b/soh/src/overlays/gamestates/ovl_file_choose/file_choose.h @@ -178,6 +178,11 @@ typedef enum { /* 99 */ FS_KBD_BTN_NONE = 99 } KeyboardButton; +typedef enum { + /* 0 */ FS_TITLE_CUR, + /* 1 */ FS_TITLE_NEXT +} TitleIndex; + void FileChoose_SetupCopySource(GameState* thisx); void FileChoose_SelectCopySource(GameState* thisx); void FileChoose_SetupCopyDest1(GameState* thisx); @@ -230,4 +235,32 @@ Vec2f HandleMouseCursorSplit(FileChooseContext* thisx, Input* input, int minx, i extern s16 D_808123F0[]; +// #region SOH [NTSC] + +void FileChoose_UpdateKeyboardCursorNES(GameState* thisx); +void FileChoose_StartNameEntryNES(GameState* thisx); +void FileChoose_UpdateOptionsMenuNES(GameState* thisx); +void FileChoose_StartOptionsNES(GameState* thisx); + +void FileChoose_DrawOptionsNES(GameState* thisx); + +void FileChoose_DrawNameEntryNES(GameState* thisx); +void FileChoose_DrawCharacterNES(GraphicsContext* gfxCtx, void* texture, s16 vtx); + +extern s16 gKeyboardCharactersHiragana[]; +extern s16 gKeyboardCharactersKatakana[]; +extern s16 gKeyboardCharactersAlphanumeric[]; + +extern s16 D_808127DC_ne0[]; + +extern s16 D_808125EC[]; +extern s16 D_80812604[]; + +// Port Data: +extern s16 sLastCharIndex; +extern s16 sLastKbdX; +extern s8 sLastOptionButtonIndex; + +// #endregion + #endif 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 664a9dcfc..0b7b2798d 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 @@ -1059,7 +1059,9 @@ static s16 sLastFileChooseButtonIndex; */ void FileChoose_UpdateMainMenu(GameState* thisx) { static u8 emptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }; + static u8 emptyNameNES[] = { 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF }; static u8 linkName[] = { 0x15, 0x2C, 0x31, 0x2E, 0x3E, 0x3E, 0x3E, 0x3E }; + static u8 linkNameNES[] = { 0xB6, 0xB3, 0xB8, 0xB5, 0xDF, 0xDF, 0xDF, 0xDF }; FileChooseContext* this = (FileChooseContext*)thisx; Input* input = &this->state.input[0]; bool dpad = CVarGetInteger(CVAR_SETTING("DpadInText"), 0); @@ -1260,12 +1262,15 @@ void FileChoose_StartRandomizerMenu(GameState* thisx) { void FileChoose_UpdateQuestMenu(GameState* thisx) { static u8 emptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }; + static u8 emptyNameNES[] = { 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF }; static u8 linkName[] = { 0x15, 0x2C, 0x31, 0x2E, 0x3E, 0x3E, 0x3E, 0x3E }; + static u8 linkNameNES[] = { 0xB6, 0xB3, 0xB8, 0xB5, 0xDF, 0xDF, 0xDF, 0xDF }; FileChoose_UpdateStickDirectionPromptAnim(thisx); FileChooseContext* this = (FileChooseContext*)thisx; Input* input = &this->state.input[0]; s8 i = 0; bool dpad = CVarGetInteger(CVAR_SETTING("DpadInText"), 0); + void* defaultName; FileChoose_UpdateRandomizer(); @@ -1323,7 +1328,12 @@ void FileChoose_UpdateQuestMenu(GameState* thisx) { this->newFileNameCharCount = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? 4 : 0; this->nameEntryBoxPosX = 120; this->nameEntryBoxAlpha = 0; - memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkName : &emptyName, 8); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkName : &emptyName; + } else { // GAME_REGION_NTSC + defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkNameNES : &emptyNameNES; + } + memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, defaultName, 8); return; } } @@ -1482,7 +1492,11 @@ void FileChoose_UpdateRandomizerMenu(GameState* thisx) { if (Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) { Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); static u8 emptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }; + static u8 emptyNameNES[] = { 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF }; static u8 linkName[] = { 0x15, 0x2C, 0x31, 0x2E, 0x3E, 0x3E, 0x3E, 0x3E }; + static u8 linkNameNES[] = { 0xB6, 0xB3, 0xB8, 0xB5, 0xDF, 0xDF, 0xDF, 0xDF }; + u8* defaultName; + this->prevConfigMode = this->configMode; this->configMode = CM_ROTATE_TO_NAME_ENTRY; this->logoAlpha = 0; @@ -1496,8 +1510,12 @@ void FileChoose_UpdateRandomizerMenu(GameState* thisx) { this->newFileNameCharCount = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? 4 : 0; this->nameEntryBoxPosX = 120; this->nameEntryBoxAlpha = 0; - memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, - CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkName : &emptyName, 8); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkName : &emptyName; + } else { // GAME_REGION_NTSC + defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkNameNES : &emptyNameNES; + } + memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, defaultName, 8); } else { Sfx_PlaySfxCentered(NA_SE_SY_OCARINA_ERROR); } @@ -1678,6 +1696,37 @@ static void (*gConfigModeUpdateFuncs[])(GameState*) = { FileChoose_RotateToRandomizer }; +static void (*gConfigModeUpdateFuncsNES[])(GameState*) = { + FileChoose_StartFadeIn, FileChoose_FinishFadeIn, + FileChoose_UpdateMainMenu, FileChoose_SetupCopySource, + FileChoose_SelectCopySource, FileChoose_SetupCopyDest1, + FileChoose_SetupCopyDest2, FileChoose_SelectCopyDest, + FileChoose_ExitToCopySource1, FileChoose_ExitToCopySource2, + FileChoose_SetupCopyConfirm1, FileChoose_SetupCopyConfirm2, + FileChoose_CopyConfirm, FileChoose_ReturnToCopyDest, + FileChoose_CopyAnim1, FileChoose_CopyAnim2, + FileChoose_CopyAnim3, FileChoose_CopyAnim4, + FileChoose_CopyAnim5, FileChoose_ExitCopyToMain, + FileChoose_SetupEraseSelect, FileChoose_EraseSelect, + FileChoose_SetupEraseConfirm1, FileChoose_SetupEraseConfirm2, + FileChoose_EraseConfirm, FileChoose_ExitToEraseSelect1, + FileChoose_ExitToEraseSelect2, FileChoose_EraseAnim1, + FileChoose_EraseAnim2, FileChoose_EraseAnim3, + FileChoose_ExitEraseToMain, FileChoose_UnusedCM31, + FileChoose_RotateToNameEntry, FileChoose_UpdateKeyboardCursorNES, + FileChoose_StartNameEntryNES, FileChoose_RotateToMain, + FileChoose_RotateToOptions, FileChoose_UpdateOptionsMenuNES, + FileChoose_StartOptionsNES, FileChoose_RotateToMain, + FileChoose_UnusedCMDelay, FileChoose_RotateToQuest, + FileChoose_UpdateQuestMenu, FileChoose_StartQuestMenu, + FileChoose_RotateToMain, FileChoose_RotateToQuest, + FileChoose_RotateToBossRush, FileChoose_UpdateBossRushMenu, + FileChoose_StartBossRushMenu, FileChoose_RotateToQuest, + FileChoose_RotateToRandomizer, FileChoose_UpdateRandomizerMenu, + FileChoose_StartRandomizerMenu,FileChoose_RotateToQuest, + FileChoose_RotateToRandomizer +}; + /** * Updates the alpha of the cursor to make it pulsate. * On the debug rom, this function also handles switching languages with controller 3. @@ -1707,7 +1756,11 @@ void FileChoose_PulsateCursor(GameState* thisx) { void FileChoose_ConfigModeUpdate(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; - gConfigModeUpdateFuncs[this->configMode](&this->state); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + gConfigModeUpdateFuncs[this->configMode](&this->state); + } else { // GAME_REGION_NTSC + gConfigModeUpdateFuncsNES[this->configMode](&this->state); + } } void FileChoose_SetWindowVtx(GameState* thisx) { @@ -2098,9 +2151,43 @@ void FileChoose_DrawFileInfo(GameState* thisx, s16 fileIndex, s16 isActive) { gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, sNamePrimColors[isActive][0], sNamePrimColors[isActive][1], sNamePrimColors[isActive][2], this->nameAlpha[fileIndex]); + // #region SOH [NTSC] - Convert playerName to display appropriately + u8 filenameLanguage = Save_GetSaveMetaInfo(fileIndex)->filenameLanguage; for (i = 0, vtxOffset = 0; vtxOffset < 0x20; i++, vtxOffset += 4) { + u8 curChar = Save_GetSaveMetaInfo(fileIndex)->playerName[i]; + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + if (filenameLanguage != NAME_LANGUAGE_PAL) { + // Remove JPN Characters from the pool (set them to ' ') + if (curChar >= 0x0A && curChar < 0xAB) { + curChar = 0xDF; + } else if (curChar == 0xE7 || curChar == 0xE8) { + curChar = 0xDF; + } + + // Convert NTSC char to PAL + if (curChar >= 0xAB && curChar <= 0xDF) { + curChar -= 0xA1; + } else if (curChar == 0xE4) { + curChar -= 0xA5; + } else if (curChar == 0xEA) { + curChar -= 0xAA; + } + } + } else { // GAME_REGION_NTSC + if (filenameLanguage == NAME_LANGUAGE_PAL) { + // Convert PAL char to NTSC + if (curChar >= 0xA && curChar <= 0x3E) { + curChar += 0xA1; + } else if (curChar == 0x3F) { + curChar += 0xA5; + } else if (curChar == 0x40) { + curChar += 0xAA; + } + } + } + // #endregion FileChoose_DrawCharacter( - this->state.gfxCtx, sp54->fontBuf + Save_GetSaveMetaInfo(fileIndex)->playerName[i] * FONT_CHAR_TEX_SIZE, + this->state.gfxCtx, sp54->fontBuf + curChar * FONT_CHAR_TEX_SIZE, vtxOffset); } } @@ -2191,7 +2278,7 @@ static void* sFileInfoBoxTextures[] = { gFileSelFileInfoBox4Tex, gFileSelFileInfoBox5Tex, }; -static void* sTitleLabels[3][9] = { +static void* sTitleLabels[4][9] = { { gFileSelPleaseSelectAFileENGTex, gFileSelOpenThisFileENGTex, gFileSelCopyWhichFileENGTex, gFileSelCopyToWhichFileENGTex, gFileSelAreYouSureENGTex, gFileSelFileCopiedENGTex, gFileSelEraseWhichFileENGTex, gFileSelAreYouSure2ENGTex, gFileSelFileErasedENGTex }, @@ -2200,34 +2287,42 @@ static void* sTitleLabels[3][9] = { gFileSelAreYouSure2GERTex, gFileSelFileErasedGERTex }, { gFileSelPleaseSelectAFileFRATex, gFileSelOpenThisFileFRATex, gFileSelCopyWhichFileFRATex, gFileSelCopyToWhichFileFRATex, gFileSelAreYouSureFRATex, gFileSelFileCopiedFRATex, gFileSelEraseWhichFileFRATex, - gFileSelAreYouSure2FRATex, gFileSelFileErasedFRATex } + gFileSelAreYouSure2FRATex, gFileSelFileErasedFRATex }, + { gFileSelPleaseSelectAFileJPNTex, gFileSelOpenThisFileJPNTex, gFileSelWhichFile1JPNTex, + gFileSelCopyToWhichFileJPNTex, gFileSelAreYouSureJPNTex, gFileSelFileCopiedJPNTex, gFileSelEraseWhichFileJPNTex, + gFileSelAreYouSure2JPNTex, gFileSelFileErasedJPNTex }, }; -static void* sWarningLabels[3][5] = { +static void* sWarningLabels[4][5] = { { gFileSelNoFileToCopyENGTex, gFileSelNoFileToEraseENGTex, gFileSelNoEmptyFileENGTex, gFileSelFileEmptyENGTex, gFileSelFileInUseENGTex }, { gFileSelNoFileToCopyGERTex, gFileSelNoFileToEraseGERTex, gFileSelNoEmptyFileGERTex, gFileSelFileEmptyGERTex, gFileSelFileInUseGERTex }, { gFileSelNoFileToCopyFRATex, gFileSelNoFileToEraseFRATex, gFileSelNoEmptyFileFRATex, gFileSelFileEmptyFRATex, gFileSelFileInUseFRATex }, + { gFileSelNoFileToCopyJPNTex, gFileSelNoFileToEraseJPNTex, gFileSelNoEmptyFileJPNTex, gFileSelFileEmptyJPNTex, + gFileSelFileInUseJPNTex }, }; -static void* sFileButtonTextures[3][3] = { +static void* sFileButtonTextures[4][3] = { { gFileSelFile1ButtonENGTex, gFileSelFile2ButtonENGTex, gFileSelFile3ButtonENGTex }, { gFileSelFile1ButtonGERTex, gFileSelFile2ButtonGERTex, gFileSelFile3ButtonGERTex }, { gFileSelFile1ButtonFRATex, gFileSelFile2ButtonFRATex, gFileSelFile3ButtonFRATex }, + { gFileSelFile1ButtonJPNTex, gFileSelFile2ButtonJPNTex, gFileSelFile3ButtonJPNTex }, }; -static void* sActionButtonTextures[3][4] = { +static void* sActionButtonTextures[4][4] = { { gFileSelCopyButtonENGTex, gFileSelEraseButtonENGTex, gFileSelYesButtonENGTex, gFileSelQuitButtonENGTex }, { gFileSelCopyButtonGERTex, gFileSelEraseButtonGERTex, gFileSelYesButtonGERTex, gFileSelQuitButtonGERTex }, { gFileSelCopyButtonFRATex, gFileSelEraseButtonFRATex, gFileSelYesButtonFRATex, gFileSelQuitButtonFRATex }, + { gFileSelCopyButtonJPNTex, gFileSelEraseButtonJPNTex, gFileSelYesButtonJPNTex, gFileSelQuitButtonJPNTex }, }; static void* sOptionsButtonTextures[] = { gFileSelOptionsButtonENGTex, gFileSelOptionsButtonGERTex, gFileSelOptionsButtonENGTex, + gFileSelOptionsButtonJPNTex, }; const char* FileChoose_GetQuestChooseTitleTexName(Language lang) { @@ -2239,6 +2334,8 @@ const char* FileChoose_GetQuestChooseTitleTexName(Language lang) { return gFileSelPleaseChooseAQuestFRATex; case LANGUAGE_GER: return gFileSelPleaseChooseAQuestGERTex; + case LANGUAGE_JPN: + return gFileSelPleaseChooseAQuestJPNTex; } } @@ -2251,6 +2348,8 @@ const char* FileChoose_GetSohOptionsTitleTexName(Language lang) { return gFileSelBossRushSettingsFRAText; case LANGUAGE_GER: return gFileSelBossRushSettingsGERText; + case LANGUAGE_JPN: + return gFileSelBossRushSettingsJPNText; } } @@ -2369,7 +2468,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { break; } } else if (this->configMode == CM_BOSS_RUSH_MENU) { - + uint8_t language = (gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language; uint8_t listOffset = this->bossRushOffset; uint8_t textAlpha = this->bossRushUIAlpha; @@ -2403,11 +2502,11 @@ void FileChoose_DrawWindowContents(GameState* thisx) { uint16_t textYOffset = (i - listOffset) * 16; // Option name. - Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingName(i, gSaveContext.language), + Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingName(i, language), 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.ship.quest.data.bossRush.options[i], gSaveContext.language), + uint16_t finalKerning = Interface_DrawTextLine(this->state.gfxCtx, BossRush_GetSettingChoiceName(i, gSaveContext.ship.quest.data.bossRush.options[i], language), 165, (87 + textYOffset), 255, 255, 255, textAlpha, 0.8f, true); // Draw arrows around selected option. @@ -2428,6 +2527,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) { } } } else if (this->configMode == CM_RANDOMIZER_SETTINGS_MENU) { + uint8_t language = (gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language; uint8_t textAlpha = this->randomizerUIAlpha; for (uint8_t index = 0; index <= RSM_OPEN_RANDOMIZER_SETTINGS; index++) { @@ -2445,21 +2545,21 @@ void FileChoose_DrawWindowContents(GameState* thisx) { textColorR = textColorG = textColorB = 100; } - Interface_DrawTextLine(this->state.gfxCtx, SohFileSelect_GetSettingText(index, gSaveContext.language), 70, + Interface_DrawTextLine(this->state.gfxCtx, SohFileSelect_GetSettingText(index, language), 70, (80 + (index * 16)), textColorR, textColorG, textColorB, textAlpha, 0.8f, true); } // Show text to indicate randomizer is being generated. if (generating) { Interface_DrawTextLine(this->state.gfxCtx, - SohFileSelect_GetSettingText(RSM_GENERATING, gSaveContext.language), 70, + SohFileSelect_GetSettingText(RSM_GENERATING, language), 70, (80 + 64), 255, 255, 255, textAlpha, 0.8f, true); } // If no randomizer is generated and "start randomizer" is selected, show text to explain why user can't start the randomizer. if (!Randomizer_IsSeedGenerated() && !Randomizer_IsSpoilerLoaded() && this->randomizerIndex == RSM_START_RANDOMIZER) { Interface_DrawTextLine(this->state.gfxCtx, - SohFileSelect_GetSettingText(RSM_NO_RANDOMIZER_GENERATED, gSaveContext.language), 70, + SohFileSelect_GetSettingText(RSM_NO_RANDOMIZER_GENERATED, language), 70, (80 + 64), 240, 80, 80, textAlpha, 0.8f, true); } @@ -2792,7 +2892,11 @@ void FileChoose_ConfigModeDraw(GameState* thisx) { gDPPipeSync(POLY_OPA_DISP++); - FileChoose_DrawNameEntry(&this->state); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + FileChoose_DrawNameEntry(&this->state); + } else { // GAME_REGION_NTSC + FileChoose_DrawNameEntryNES(&this->state); + } } // draw options menu @@ -2821,7 +2925,11 @@ void FileChoose_ConfigModeDraw(GameState* thisx) { gDPPipeSync(POLY_OPA_DISP++); - FileChoose_DrawOptions(&this->state); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + FileChoose_DrawOptions(&this->state); + } else { // GAME_REGION_NTSC + FileChoose_DrawOptionsNES(&this->state); + } } // draw quest menu @@ -3143,8 +3251,8 @@ void FileChoose_LoadGame(GameState* thisx) { if (!CVarGetInteger(CVAR_ENHANCEMENT("DogFollowsEverywhere"), 0)) { gSaveContext.dogParams = 0; } - gSaveContext.timer1State = 0; - gSaveContext.timer2State = 0; + gSaveContext.timerState = 0; + gSaveContext.subTimerState = 0; gSaveContext.eventInf[0] = 0; gSaveContext.eventInf[1] = 0; gSaveContext.eventInf[2] = 0; @@ -3167,7 +3275,7 @@ void FileChoose_LoadGame(GameState* thisx) { gSaveContext.buttonStatus[buttonIndex] = BTN_ENABLED; } - gSaveContext.unk_13E7 = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = + gSaveContext.forceRisingButtonAlphas = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = gSaveContext.magicCapacity = 0; gSaveContext.magicFillTarget = gSaveContext.magic; @@ -3264,7 +3372,9 @@ static const char* randoVersionWarningText[] = { // German "Dieser Spielstand wurde auf einer anderen Version\nvon SoH erstellt.\nEs könnten Fehler auftreten.", // French - "Cette sauvegarde a été créée sur une version\ndifférente de SoH.\nCertaines fonctionnalités peuvent être corrompues." + "Cette sauvegarde a été créée sur une version\ndifférente de SoH.\nCertaines fonctionnalités peuvent être corrompues.", + // Japanese NTSC TODO: + "This save was created on a different version of SoH.\nThings may be broken. Play at your own risk.", }; void FileChoose_DrawRandoSaveVersionWarning(GameState* thisx) { @@ -3286,7 +3396,7 @@ void FileChoose_DrawRandoSaveVersionWarning(GameState* thisx) { } // Compute the height for a "squished" textbox texture - s16 height = gSaveContext.language == LANGUAGE_ENG ? 32 : 40; // English is only 2 lines + s16 height = ((gSaveContext.language == LANGUAGE_ENG) || (gSaveContext.language == LANGUAGE_JPN)) ? 32 : 40; // English is only 2 lines // float math to get a S5.10 number that will squish the texture f32 texCoordinateHeightF = 512 / ((f32)height / 64); s16 texCoordinateHeightScale = texCoordinateHeightF + 0.5f; @@ -3317,6 +3427,7 @@ void FileChoose_Main(GameState* thisx) { gFileSelControlsENGTex, gFileSelControlsGERTex, gFileSelControlsFRATex, + gFileSelControlsJPNTex, }; FileChooseContext* this = (FileChooseContext*)thisx; Input* input = &this->state.input[0]; @@ -3734,7 +3845,11 @@ void FileChoose_Init(GameState* thisx) { this->state.main = FileChoose_Main; this->state.destroy = FileChoose_Destroy; FileChoose_InitContext(&this->state); - Font_LoadOrderedFont(&this->font); + if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) { + Font_LoadOrderedFont(&this->font); + } else { // GAME_REGION_NTSC + Font_LoadOrderedFontNTSC(&this->font); + } Audio_QueueSeqCmd(0xF << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0xA); func_800F5E18(SEQ_PLAYER_BGM_MAIN, NA_BGM_FILE_SELECT, 0, 7, 1); } diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c new file mode 100644 index 000000000..3a8ffb453 --- /dev/null +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c @@ -0,0 +1,1246 @@ +#include "file_choose.h" +#include "textures/title_static/title_static.h" +#include "assets/overlays/ovl_File_Choose/ovl_file_choose.h" +#include "assets/soh_assets.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/SaveManager.h" +#include "soh/ResourceManagerHelpers.h" + +// File based on matching decomp for z_file_nameset_NES on N64 1.0 https://decomp.me/scratch/1tru6 +// Edited to follow port's stage of documentation and implemented enhancements found in z_file_nameset_PAL.c + +// Language Enums were changed between NTSC and PAL, so using (gSaveContext.language == LANGUAGE_ENG) +// as a substitute for indexing arrays with just gSaveContext.language + +#define NTSC_LANGUAGE_INDEX (gSaveContext.language == LANGUAGE_ENG) + +// DATA + +static void* sNameLabelTexturesNES[] = { + gFileSelNameJPNTex, + gFileSelNameENGTex, +}; + +static void* sBackspaceEndTexturesNES[] = { + gFileSelHiraganaButtonTex, + gFileSelKatakanaButtonTex, + gFileSelKanjiButtonTex, + gFileSelBackspaceButtonTex, + gFileSelENDButtonENGTex, +}; + +static s16 sBackspaceEndWidthsNES[] = { + 44, 44, 28, 28, 44 +}; + +typedef struct { + void* texture[2]; + u16 width; + u16 height; +} OptionsMenuTextureInfoNES; // size = 0x8 + +static OptionsMenuTextureInfoNES sOptionsMenuHeaders[] = { + { + { gFileSelOptionsJPNTex, gFileSelOptionsENGTex }, + 128, 16, + }, + { + { gFileSelSOUNDENGTex, gFileSelSOUNDENGTex }, + 64, 16, + }, + { + { gFileSelLTargetingJPNTex, gFileSelLTargetingENGTex }, + 64, 16, + }, + { + { gFileSelCheckBrightnessJPNTex, gFileSelCheckBrightnessENGNTSCTex }, + 96, 16, + } +}; + +static OptionsMenuTextureInfoNES sOptionsMenuSettings[] = { + { + { gFileSelStereoJPNTex, gFileSelStereoENGTex }, + 48, 16, + }, + { + { gFileSelMonoJPNTex, gFileSelMonoENGTex }, + 48, 16, + }, + { + { gFileSelHeadsetJPNTex, gFileSelHeadsetENGTex }, + 48, 16, + }, + { + { gFileSelSurroundJPNTex, gFileSelSurroundENGTex }, + 48, 16, + }, + { + { gFileSelSwitchJPNTex, gFileSelSwitchENGTex }, + 48, 16, + }, + { + { gFileSelHoldJPNTex, gFileSelHoldENGTex }, + 48, 16, + } +}; + +// CODE + +void FileChoose_DrawCharacterNES(GraphicsContext* gfxCtx, void* texture, s16 vtx) { + OPEN_DISPS(gfxCtx); + + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, texture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + + CLOSE_DISPS(gfxCtx); +} + +void FileChoose_DrawMultiTexQuadI4NES(GraphicsContext* gfxCtx, void* texture1, void* texture2, s16 vtx) { + OPEN_DISPS(gfxCtx); + + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, texture1, G_IM_FMT_I, 16, 16, 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); + gDPLoadMultiBlock_4b(POLY_OPA_DISP++, texture2, 0x0080, 1, G_IM_FMT_I, 16, 16, 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); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + + CLOSE_DISPS(gfxCtx); +} + +void FileChoose_SetKeyboardVtxNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + s16 val; + s16 phi_t2; + s16 phi_t0; + s16 phi_t3; + s16 phi_s1; + s16 phi_t1; + s16 phi_s2; + + this->keyboardVtx = Graph_Alloc(this->state.gfxCtx, sizeof(Vtx) * 4 * 5 * 13); + phi_s1 = 0x26; + + for (phi_s2 = 0, phi_t3 = 0; phi_s2 < 5; phi_s2++) { + for (phi_t0 = -0x60, phi_t1 = 0; phi_t1 < 13; phi_t1++, phi_t3 += 4) { + this->keyboardVtx[phi_t3 + 2].v.ob[0] = phi_t0; + + this->keyboardVtx[phi_t3].v.ob[0] = this->keyboardVtx[phi_t3 + 2].v.ob[0]; + + this->keyboardVtx[phi_t3 + 1].v.ob[0] = this->keyboardVtx[phi_t3 + 3].v.ob[0] = phi_t0 + 0xC; + + this->keyboardVtx[phi_t3 + 1].v.ob[1] = phi_s1; + + this->keyboardVtx[phi_t3].v.ob[1] = this->keyboardVtx[phi_t3 + 1].v.ob[1]; + + this->keyboardVtx[phi_t3 + 2].v.ob[1] = this->keyboardVtx[phi_t3 + 3].v.ob[1] = phi_s1 - 0xC; + + this->keyboardVtx[phi_t3].v.ob[2] = this->keyboardVtx[phi_t3 + 1].v.ob[2] = this->keyboardVtx[phi_t3 + 2].v.ob[2] = this->keyboardVtx[phi_t3 + 3].v.ob[2] = 0; + + this->keyboardVtx[phi_t3].v.flag = this->keyboardVtx[phi_t3 + 1].v.flag = this->keyboardVtx[phi_t3 + 2].v.flag = this->keyboardVtx[phi_t3 + 3].v.flag = 0; + + this->keyboardVtx[phi_t3].v.tc[0] = this->keyboardVtx[phi_t3].v.tc[1] = this->keyboardVtx[phi_t3 + 1].v.tc[1] = this->keyboardVtx[phi_t3 + 2].v.tc[0] = 0; + + this->keyboardVtx[phi_t3 + 1].v.tc[0] = this->keyboardVtx[phi_t3 + 2].v.tc[1] = this->keyboardVtx[phi_t3 + 3].v.tc[0] = this->keyboardVtx[phi_t3 + 3].v.tc[1] = 16 << 5; + + this->keyboardVtx[phi_t3].v.cn[0] = this->keyboardVtx[phi_t3 + 1].v.cn[0] = this->keyboardVtx[phi_t3 + 2].v.cn[0] = this->keyboardVtx[phi_t3 + 3].v.cn[0] = this->keyboardVtx[phi_t3].v.cn[1] = this->keyboardVtx[phi_t3 + 1].v.cn[1] = this->keyboardVtx[phi_t3 + 2].v.cn[1] = this->keyboardVtx[phi_t3 + 3].v.cn[1] = this->keyboardVtx[phi_t3].v.cn[2] = this->keyboardVtx[phi_t3 + 1].v.cn[2] = this->keyboardVtx[phi_t3 + 2].v.cn[2] = this->keyboardVtx[phi_t3 + 3].v.cn[2] = this->keyboardVtx[phi_t3].v.cn[3] = this->keyboardVtx[phi_t3 + 1].v.cn[3] = this->keyboardVtx[phi_t3 + 2].v.cn[3] = this->keyboardVtx[phi_t3 + 3].v.cn[3] = 255; + phi_t0 += 0x10; + } + phi_s1 -= 0x10; + } +} + +void FileChoose_SetNameEntryVtxNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + Font* font = &this->font; + s16 var_s0; + s16 var_t2; + s16 var_v0; + u8* filename = Save_GetSaveMetaInfo(this->buttonIndex)->playerName; + + OPEN_DISPS(this->state.gfxCtx); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]); + + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); + + gSPVertex(POLY_OPA_DISP++, D_80811BB0_NTSC, 24, 0); + + gDPLoadTextureBlock(POLY_OPA_DISP++, sNameLabelTexturesNES[NTSC_LANGUAGE_INDEX], G_IM_FMT_IA, G_IM_SIZ_8b, 56, 16, 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); + + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + gDPPipeSync(POLY_OPA_DISP++); + + for (var_t2 = 0, var_s0 = 4; var_t2 < 5; var_t2++, var_s0 += 4) { + if (gSaveContext.language == LANGUAGE_JPN) { + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], 255); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); + + gDPLoadTextureBlock(POLY_OPA_DISP++, sBackspaceEndTexturesNES[var_t2], G_IM_FMT_IA, G_IM_SIZ_16b, + sBackspaceEndWidthsNES[var_t2], 16, 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); + + gSP1Quadrangle(POLY_OPA_DISP++, var_s0, var_s0 + 2, var_s0 + 3, var_s0 + 1, 0); + } else if (var_t2 >= 3) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], 255); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); + + gDPLoadTextureBlock(POLY_OPA_DISP++, sBackspaceEndTexturesNES[var_t2], G_IM_FMT_IA, G_IM_SIZ_16b, + sBackspaceEndWidthsNES[var_t2], 16, 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); + + gSP1Quadrangle(POLY_OPA_DISP++, var_s0, var_s0 + 2, var_s0 + 3, var_s0 + 1, 0); + } + } + + this->nameEntryVtx = Graph_Alloc(this->state.gfxCtx, 44 * sizeof(Vtx)); + + for (var_s0 = 0, var_t2 = 0; var_t2 < 44; var_t2 += 4, var_s0++) { + this->nameEntryVtx[var_t2].v.ob[0] = this->nameEntryVtx[var_t2 + 2].v.ob[0] = D_808125EC[var_s0] + this->nameEntryBoxPosX; + + this->nameEntryVtx[var_t2 + 1].v.ob[0] = this->nameEntryVtx[var_t2 + 3].v.ob[0] = this->nameEntryVtx[var_t2].v.ob[0] + 0xA; + + this->nameEntryVtx[var_t2].v.ob[1] = this->nameEntryVtx[var_t2 + 1].v.ob[1] = D_80812604[var_s0]; + + this->nameEntryVtx[var_t2 + 2].v.ob[1] = this->nameEntryVtx[var_t2 + 3].v.ob[1] = this->nameEntryVtx[var_t2].v.ob[1] - 0xA; + + this->nameEntryVtx[var_t2].v.ob[2] = this->nameEntryVtx[var_t2 + 1].v.ob[2] = this->nameEntryVtx[var_t2 + 2].v.ob[2] = this->nameEntryVtx[var_t2 + 3].v.ob[2] = 0; + + this->nameEntryVtx[var_t2].v.flag = this->nameEntryVtx[var_t2 + 1].v.flag = this->nameEntryVtx[var_t2 + 2].v.flag = this->nameEntryVtx[var_t2 + 3].v.flag = 0; + + this->nameEntryVtx[var_t2].v.tc[0] = this->nameEntryVtx[var_t2].v.tc[1] = this->nameEntryVtx[var_t2 + 1].v.tc[1] = this->nameEntryVtx[var_t2 + 2].v.tc[0] = 0; + + this->nameEntryVtx[var_t2 + 1].v.tc[0] = this->nameEntryVtx[var_t2 + 2].v.tc[1] = this->nameEntryVtx[var_t2 + 3].v.tc[0] = this->nameEntryVtx[var_t2 + 3].v.tc[1] = 0x200; + + this->nameEntryVtx[var_t2].v.cn[0] = this->nameEntryVtx[var_t2 + 1].v.cn[0] = this->nameEntryVtx[var_t2 + 2].v.cn[0] = this->nameEntryVtx[var_t2 + 3].v.cn[0] = this->nameEntryVtx[var_t2].v.cn[1] = this->nameEntryVtx[var_t2 + 1].v.cn[1] = this->nameEntryVtx[var_t2 + 2].v.cn[1] = this->nameEntryVtx[var_t2 + 3].v.cn[1] = this->nameEntryVtx[var_t2].v.cn[2] = this->nameEntryVtx[var_t2 + 1].v.cn[2] = this->nameEntryVtx[var_t2 + 2].v.cn[2] = this->nameEntryVtx[var_t2 + 3].v.cn[2] = this->nameEntryVtx[var_t2].v.cn[3] = this->nameEntryVtx[var_t2 + 1].v.cn[3] = this->nameEntryVtx[var_t2 + 2].v.cn[3] = this->nameEntryVtx[var_t2 + 3].v.cn[3] = 0xFF; + } + + this->nameEntryVtx[1].v.ob[0] = this->nameEntryVtx[3].v.ob[0] = this->nameEntryVtx[0].v.ob[0] + 0x6C; + this->nameEntryVtx[2].v.ob[1] = this->nameEntryVtx[3].v.ob[1] = this->nameEntryVtx[0].v.ob[1] - 0x10; + this->nameEntryVtx[1].v.tc[0] = this->nameEntryVtx[3].v.tc[0] = 108 << 5; + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], + this->nameEntryBoxAlpha); + gSPVertex(POLY_OPA_DISP++, this->nameEntryVtx, 4, 0); + gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelNameBoxTex, G_IM_FMT_IA, G_IM_SIZ_16b, 108, 16, 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); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + gSPVertex(POLY_OPA_DISP++, this->nameEntryVtx + 4, 32, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->nameEntryBoxAlpha); + + for (var_s0 = 0, var_v0 = 0; var_s0 < 0x20; var_s0 += 4, var_v0++) { + FileChoose_DrawCharacterNES( + this->state.gfxCtx, font->fontBuf + filename[var_v0] * FONT_CHAR_TEX_SIZE, var_s0); + } + + this->nameEntryVtx[37].v.tc[0] = this->nameEntryVtx[38].v.tc[1] = this->nameEntryVtx[39].v.tc[0] = + this->nameEntryVtx[39].v.tc[1] = this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[42].v.tc[1] = + this->nameEntryVtx[43].v.tc[0] = this->nameEntryVtx[43].v.tc[1] = 24 << 5; + + + if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) || + (this->kbdButton == FS_KBD_BTN_END)) { + this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[43].v.tc[0] = 56 << 5; + } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) { + this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[43].v.tc[0] = 40 << 5; + } + + CLOSE_DISPS(this->state.gfxCtx); +} + +void FileChoose_DrawKeyboardNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + Font* font = &this->font; + s16 i; + s16 vtx; + s16 var_s1; + + vtx = 0; + i = 0; + + OPEN_DISPS(this->state.gfxCtx); + + Gfx_SetupDL_42Opa(this->state.gfxCtx); + + gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2); + gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED); + gDPSetPrimColor(POLY_OPA_DISP++, 0, this->charBgAlpha, 255, 255, 255, 255); + + if ((this->charPage == 0) || (this->charPage == 3) || (this->charPage == 5)) { + if (this->charPage != 5) { + for (; vtx < 0x100; vtx += 0x20) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0); + + for (var_s1 = 0; var_s1 < 0x20; i++, var_s1 += 4) { + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, var_s1); + } + } + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0); + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, 0); + } else { + for (; vtx < 0x100; vtx += 0x20) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0); + + for (var_s1 = 0; var_s1 < 0x20; i++, var_s1 += 4) { + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, var_s1); + } + } + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0); + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, 0); + } + } else if ((this->charPage == 1) || (this->charPage == 4) || (this->charPage == 7)) { + if (this->charPage != 7) { + for (; vtx < 0x100; vtx += 0x20) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0); + + for (var_s1 = 0; var_s1 < 0x20; i++, var_s1 += 4) { + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, var_s1); + } + } + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0); + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, 0); + } else { + for (; vtx < 0x100; vtx += 0x20) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0); + + for (var_s1 = 0; var_s1 < 0x20; i++, var_s1 += 4) { + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, var_s1); + } + } + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0); + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, 0); + } + } else if (this->charPage != 8) { + for (; vtx < 0x100; vtx += 0x20) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0); + + for (var_s1 = 0; var_s1 < 0x20; i++, var_s1 += 4) { + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, var_s1); + } + } + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0); + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersHiragana[i] * FONT_CHAR_TEX_SIZE, 0); + } else { + for (; vtx < 0x100; vtx += 0x20) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0); + + for (var_s1 = 0; var_s1 < 0x20; i++, var_s1 += 4) { + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, var_s1); + } + } + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0); + FileChoose_DrawMultiTexQuadI4NES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersAlphanumeric[i] * FONT_CHAR_TEX_SIZE, font->fontBuf + gKeyboardCharactersKatakana[i] * FONT_CHAR_TEX_SIZE, 0); + } + + CLOSE_DISPS(this->state.gfxCtx); +} + +s16 D_80812C48_ne0[] = { + 15, 35, 65, 80, 85, 95, 115, 145, 160, 165, 92, 170 +}; + +s16 D_80812C60_ne0[] = { + 30 - 1, 40 - 1, 80 - 1, 85 - 1, 90 - 1, 110 - 1, 120 - 1, 160 - 1, 165 - 1, 170 - 1, 92, 170 +}; + +s16 D_80812C78_ne0[] = { + 50, 45, -50, 5, -50, 50, 45, -50, 5, -50, 78, -78 +}; + +s16 D_80812C90_ne0[] = { + 15, 35, 85, 95, 115, 165, 92, 170 +}; + +s16 D_80812CA0_ne0[] = { + 30 - 1, 40 - 1, 90 - 1, 110 - 1, 120 - 1, 170 - 1, 92, 170 +}; + +s16 D_80812CB0_ne0[] = { + 50, 45, -5, 50, 45, -5, 78, -78 +}; + +s16 D_80812CC0_ne0[] = { + 35, 80, 115, 160 +}; + +s16 D_80812CC8_ne0[] = { + 40 - 1, 85 - 1, 120 - 1, 165 - 1 +}; + +s16 D_80812CD0_ne0[] = { + 50, 5, 50, 5 +}; + +s32 func_80808480_ne0(GameState* thisx, s16 arg1, s16 arg2) { + FileChooseContext* this = (FileChooseContext*) thisx; + s16 var_v1; + s32 temp_a1; + u8* filename = Save_GetSaveMetaInfo(this->buttonIndex)->playerName; + + if (arg1 == 0xDF) { + for (var_v1 = 0; var_v1 < 12U; var_v1++) { + if (filename[arg2] >= D_80812C48_ne0[var_v1] && D_80812C60_ne0[var_v1] >= filename[arg2]) { + filename[arg2] = D_80812C78_ne0[var_v1] + filename[arg2]; + return true; + } + } + } else if (arg1 == 0xE7) { + for (var_v1 = 0; var_v1 < 8U; var_v1++) { + if (filename[arg2] >= D_80812C90_ne0[var_v1] && D_80812CA0_ne0[var_v1] >= filename[arg2]) { + filename[arg2] = D_80812CB0_ne0[var_v1] + filename[arg2]; + return true; + } + } + } else if (arg1 == 0xE8) { + for (var_v1 = 0; var_v1 < 4U; var_v1++) { + if ((filename[arg2] >= D_80812CC0_ne0[var_v1]) && (D_80812CC8_ne0[var_v1] >= filename[arg2])) { + filename[arg2] = D_80812CD0_ne0[var_v1] + filename[arg2]; + return true; + } + } + } + return false; +} + +s32 func_80808688_ne0(GameState* thisx, s16 arg1) { + FileChooseContext* this = (FileChooseContext*) thisx; + s32 pad; + + if (!func_80808480_ne0(&this->state, arg1, this->newFileNameCharCount)) { + if (this->newFileNameCharCount != 0) { + if (!func_80808480_ne0(&this->state, arg1, this->newFileNameCharCount - 1)) { + return false; + } + } else { + return false; + } + } + return true; +} + +void FileChoose_DrawNameEntryNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + Font* font = &this->font; + Input* input = &this->state.input[0]; + s16 i; + s16 tmp; + u16 dayTime; + s16 validName; + u8* filename = Save_GetSaveMetaInfo(this->buttonIndex)->playerName; + OPEN_DISPS(this->state.gfxCtx); + + FileChoose_SetKeyboardVtxNES(&this->state); + FileChoose_SetNameEntryVtxNES(&this->state); + FileChoose_PulsateCursor(&this->state); + + Vtx* vertices = ResourceMgr_LoadVtxByName(D_80811BB0_NTSC); + + tmp = (this->newFileNameCharCount * 4) + 4; + + this->nameEntryVtx[0x24].v.ob[0] = this->nameEntryVtx[0x26].v.ob[0] = this->nameEntryVtx[tmp].v.ob[0] - 6; + + this->nameEntryVtx[0x25].v.ob[0] = this->nameEntryVtx[0x27].v.ob[0] = this->nameEntryVtx[0x24].v.ob[0] + 24; + + this->nameEntryVtx[0x24].v.ob[1] = this->nameEntryVtx[0x25].v.ob[1] = this->nameEntryVtx[tmp].v.ob[1] + 7; + + this->nameEntryVtx[0x26].v.ob[1] = this->nameEntryVtx[0x27].v.ob[1] = this->nameEntryVtx[0x24].v.ob[1] - 24; + + if ((this->kbdButton == 0) || (this->kbdButton == 1) || (this->kbdButton == 4)) { + if (this->kbdX != this->kbdButton) { + osSyncPrintf("014 xpos=%d contents=%d\n", this->kbdX, this->kbdButton); + } + this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] = vertices[(this->kbdX + 1) * 4].v.ob[0] - 4; + + this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 52; + + this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] = vertices[(this->kbdX + 1) * 4].v.ob[1] + 4; + } else if ((this->kbdButton == 2) || (this->kbdButton == 3)) { + if (this->kbdX != this->kbdButton) { + osSyncPrintf("23 xpos=%d contents=%d\n", this->kbdX, this->kbdButton); + } + this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] = vertices[(this->kbdX + 1) * 4].v.ob[0] - 4; + + this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 40; + + this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] = vertices[(this->kbdX + 1) * 4].v.ob[1] + 4; + } else { + if (this->charIndex >= 65) { + osSyncPrintf("mjp=%d xpos=%d ypos=%d name_contents=%d\n", this->charIndex, this->kbdX, this->kbdY, + this->kbdButton); + } + this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] = this->keyboardVtx[this->charIndex * 4].v.ob[0] - 6; + + this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 0x18; + + this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] = this->keyboardVtx[this->charIndex * 4].v.ob[1] + 6; + } + + this->nameEntryVtx[42].v.ob[1] = this->nameEntryVtx[43].v.ob[1] = this->nameEntryVtx[40].v.ob[1] - 24; + + gSPVertex(POLY_OPA_DISP++, &this->nameEntryVtx[36], 8, 0); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->highlightColor[0], this->highlightColor[1], this->highlightColor[2], + this->highlightColor[3]); + gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelCharHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 24, 24, 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); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + + if ((this->kbdButton == 0) || (this->kbdButton == 1) || (this->kbdButton == 4)) { + gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelMediumButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 56, 24, 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); + } else if ((this->kbdButton == 2) || (this->kbdButton == 3)) { + gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelSmallButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 40, 24, 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); + } + + gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0); + + FileChoose_DrawKeyboardNES(&this->state); + + gDPPipeSync(POLY_OPA_DISP++); + + Gfx_SetupDL_42Opa(this->state.gfxCtx); + + gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, + PRIMITIVE, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255); + + if (this->configMode == CM_NAME_ENTRY) { + if (CHECK_BTN_ALL(input->press.button, BTN_START)) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdY = 5; + this->kbdX = 4; + } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) { + if ((this->newFileNameCharCount == 7) && (filename[7] != 0xDF)) { + for (i = this->newFileNameCharCount; i < 7; i++) { + filename[i] = filename[i + 1]; + } + filename[i] = 0xDF; + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else { + this->newFileNameCharCount--; + if (this->newFileNameCharCount < 0) { + this->newFileNameCharCount = 0; + if (this->prevConfigMode == CM_QUEST_MENU) { + this->configMode = CM_NAME_ENTRY_TO_QUEST_MENU; + } else if (this->prevConfigMode == CM_RANDOMIZER_SETTINGS_MENU) { + this->configMode = CM_NAME_ENTRY_TO_RANDOMIZER_SETTINGS_MENU; + } else { + this->configMode = CM_NAME_ENTRY_TO_MAIN; + } + this->prevConfigMode = CM_NAME_ENTRY; + sLastCharIndex = -1; + CVarSetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); + } else { + for (i = this->newFileNameCharCount; i < 7; i++) { + filename[i] = filename[i + 1]; + } + filename[i] = 0xDF; + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } + } else { + if (this->charPage < 3) { + if (this->kbdY != 5) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 0, 255); + + if (this->charPage == 0) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[(this->charIndex * 4)], 4, 0); + FileChoose_DrawCharacterNES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersHiragana[this->charIndex] * FONT_CHAR_TEX_SIZE, 0); + if (CHECK_BTN_ALL(input->press.button, BTN_A)) { + if ((gKeyboardCharactersHiragana[this->charIndex] == 0xE7) || (gKeyboardCharactersHiragana[this->charIndex] == 0xE8)) { + if (func_80808688_ne0(&this->state, gKeyboardCharactersHiragana[this->charIndex]) == 0) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } else { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + filename[this->newFileNameCharCount] = gKeyboardCharactersHiragana[this->charIndex]; + this->newFileNameCharCount++; + if (this->newFileNameCharCount >= 8) { + this->newFileNameCharCount = 7; + } + } + } + } else if (this->charPage == 1) { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[(this->charIndex * 4)], 4, 0); + FileChoose_DrawCharacterNES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersKatakana[this->charIndex] * FONT_CHAR_TEX_SIZE, 0); + if (CHECK_BTN_ALL(input->press.button, BTN_A)) { + if ((gKeyboardCharactersHiragana[this->charIndex] == 0xE7) || (gKeyboardCharactersHiragana[this->charIndex] == 0xE8)) { + if (func_80808688_ne0(&this->state, gKeyboardCharactersHiragana[this->charIndex]) == 0) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } else { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + filename[this->newFileNameCharCount] = gKeyboardCharactersKatakana[this->charIndex]; + this->newFileNameCharCount++; + if (this->newFileNameCharCount >= 8) { + this->newFileNameCharCount = 7; + } + } + } + } else { + gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[(this->charIndex * 4)], 4, 0); + FileChoose_DrawCharacterNES(this->state.gfxCtx, font->fontBuf + gKeyboardCharactersAlphanumeric[this->charIndex] * FONT_CHAR_TEX_SIZE, 0); + if (CHECK_BTN_ALL(input->press.button, BTN_A)) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + filename[this->newFileNameCharCount] = gKeyboardCharactersAlphanumeric[this->charIndex]; + this->newFileNameCharCount++; + if (this->newFileNameCharCount >= 8) { + this->newFileNameCharCount = 7; + } + } + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) { + if (this->charPage != this->kbdButton) { + if (this->kbdButton == 0) { + if (this->charPage == 1) { + this->charPage = 4; + } else { + this->charPage = 6; + } + Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if (this->kbdButton == 1) { + if (this->charPage == 0) { + this->charPage = 3; + } else { + this->charPage = 8; + } + Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if (this->kbdButton == 2) { + if (this->charPage == 0) { + this->charPage = 5; + } else { + this->charPage = 7; + } + Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if (this->kbdButton == 3) { + if (this->newFileNameCharCount == 7 && filename[7] != 0xDF) { + for (i = this->newFileNameCharCount; i < 7; i++) { + filename[i] = filename[i + 1]; + } + filename[i] = 0xDF; + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else { + this->newFileNameCharCount--; + if (this->newFileNameCharCount < 0) { + this->newFileNameCharCount = 0; + } + for (i = this->newFileNameCharCount; i < 7; i++) { + filename[i] = filename[i + 1]; + } + filename[i] = 0xDF; + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } else if (this->kbdButton == 4) { + validName = false; + for (i = 0; i < 8; i++) { + if (filename[i] != 0xDF) { + validName = true; + break; + } + } + + if (validName) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + gSaveContext.fileNum = this->buttonIndex; + dayTime = ((void)0, gSaveContext.dayTime); + Sram_InitSave(this); + gSaveContext.dayTime = dayTime; + this->prevConfigMode = CM_MAIN_MENU; + this->configMode = CM_NAME_ENTRY_TO_MAIN; + CVarSetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); + this->nameBoxAlpha[this->buttonIndex] = this->nameAlpha[this->buttonIndex] = 200; + this->connectorAlpha[this->buttonIndex] = 255; + func_800AA000(300.0f, 180, 20, 100); + } else { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } + } + } + if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->newFileNameCharCount++; + if (this->newFileNameCharCount >= 8) { + this->newFileNameCharCount = 7; + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->newFileNameCharCount--; + if (this->newFileNameCharCount < 0) { + this->newFileNameCharCount = 0; + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_Z)) { + if (func_80808688_ne0(&this->state, 0xDF) != 0) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } + } + } + } + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); + + CLOSE_DISPS(this->state.gfxCtx); +} + +void FileChoose_StartNameEntryNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + + this->nameEntryBoxAlpha += 25; + + if (this->nameEntryBoxAlpha >= 255) { + this->nameEntryBoxAlpha = 255; + } + + this->nameEntryBoxPosX -= 30; + + if (this->nameEntryBoxPosX <= 0) { + this->nameEntryBoxPosX = 0; + this->nameEntryBoxAlpha = 255; + this->kbdX = 0; + this->kbdY = 0; + this->kbdButton = 99; + this->configMode = CM_NAME_ENTRY; + } +} + +void FileChoose_UpdateKeyboardCursorNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + Input* input = &this->state.input[0]; + s16 prevKbdX; + s32 pad; + bool dpad = CVarGetInteger(CVAR_SETTING("DpadInText"), 0); + + if (this->charPage < 3) { + if (CHECK_BTN_ALL(input->press.button, BTN_R)) { + if (gSaveContext.language == LANGUAGE_JPN) { + if (this->charPage == 0) { + this->charPage = 3; + Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if (this->charPage == 1) { + this->charPage = 7; + Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if (this->charPage == 2) { + this->charPage = 6; + Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } + } else { + this->kbdButton = 99; + if (this->kbdY != 5) { + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->charIndex--; + this->kbdX--; + if (this->kbdX < 0) { + this->kbdX = 12; + this->charIndex = this->kbdY * 13 + this->kbdX; + } + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->charIndex++; + this->kbdX++; + if (this->kbdX >= 13) { + this->kbdX = 0; + this->charIndex = this->kbdY * 13 + this->kbdX; + } + } + } else if (gSaveContext.language == LANGUAGE_JPN) { + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdX--; + if (this->kbdX < 0) { + this->kbdX = 4; + } + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdX++; + if (this->kbdX >= 5) { + this->kbdX = 0; + } + } + } else { + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdX--; + if (this->kbdX < 3) { + this->kbdX = 4; + } + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdX++; + if (this->kbdX >= 5) { + this->kbdX = 3; + } + } + } + + if ((this->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdY--; + if (this->kbdY < 0) { + if (gSaveContext.language == LANGUAGE_JPN) { + this->kbdY = 5; + this->charIndex += 52; + prevKbdX = this->kbdX; + if (this->kbdX < 3) { + this->kbdX = 0; + } else if (this->kbdX < 6) { + this->kbdX = 1; + } else if (this->kbdX < 8) { + this->kbdX = 2; + } else if (this->kbdX < 10) { + this->kbdX = 3; + } else if (this->kbdX < 13) { + this->kbdX = 4; + } + + this->unk_1CAD6[this->kbdX] = prevKbdX; + } else if (this->kbdX < 8) { + this->kbdY = 4; + this->charIndex = this->kbdX + 52; + } else { + this->kbdY = 5; + this->charIndex += 52; + prevKbdX = this->kbdX; + if (this->kbdX < 10) { + this->kbdX = 3; + } else if (this->kbdX < 13) { + this->kbdX = 4; + } + + this->unk_1CAD6[this->kbdX] = prevKbdX; + } + } else { + this->charIndex -= 13; + if (this->kbdY == 4) { + this->charIndex = 52; + this->kbdX = this->unk_1CAD6[this->kbdX]; + this->charIndex += this->kbdX; + } + } + } else if ((this->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->kbdY++; + if (this->kbdY >= 6) { + this->kbdY = 0; + this->kbdX = this->unk_1CAD6[this->kbdX]; + this->charIndex = this->kbdX; + } else { + this->charIndex += 13; + if (this->kbdY == 5) { + if (gSaveContext.language != LANGUAGE_JPN) { + if (this->kbdX < 8) { + this->kbdY = 0; + this->charIndex = this->kbdX; + } else { + prevKbdX = this->kbdX; + if (this->kbdX < 3) { + this->kbdX = 0; + } else if (this->kbdX < 6) { + this->kbdX = 1; + } else if (this->kbdX < 8) { + this->kbdX = 2; + } else if (this->kbdX < 10) { + this->kbdX = 3; + } else if (this->kbdX < 13) { + this->kbdX = 4; + } + + this->unk_1CAD6[this->kbdX] = prevKbdX; + } + } else { + prevKbdX = this->kbdX; + if (this->kbdX < 3) { + this->kbdX = 0; + } else if (this->kbdX < 6) { + this->kbdX = 1; + } else if (this->kbdX < 8) { + this->kbdX = 2; + } else if (this->kbdX < 10) { + this->kbdX = 3; + } else if (this->kbdX < 13) { + this->kbdX = 4; + } + this->unk_1CAD6[this->kbdX] = prevKbdX; + } + } + } + } + if (this->kbdY == 5) { + this->kbdButton = this->kbdX; + + if (sLastKbdX != this->kbdX) { + // NTSC TODO: Figure out japanese TTS + // GameInteractor_ExecuteOnUpdateFileNameSelection(0xF0 + this->kbdX); + sLastKbdX = this->kbdX; + sLastCharIndex = -1; + } + } else if (sLastCharIndex != this->charIndex && this->charIndex < 65) { + // NTSC TODO: Figure out japanese TTS + // GameInteractor_ExecuteOnUpdateFileNameSelection(D_808123F0[this->charIndex]); + sLastCharIndex = this->charIndex; + sLastKbdX = -1; + } + } + } else { + this->charBgAlpha += ZREG(9); + if (this->charBgAlpha >= 255) { + this->charBgAlpha = 0; + this->charPage = D_808127DC_ne0[this->charPage]; + } + } +} + +void FileChoose_StartOptionsNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + + this->nameEntryBoxAlpha += 25; + + if (this->nameEntryBoxAlpha >= 255) { + this->nameEntryBoxAlpha = 255; + } + + this->nameEntryBoxPosX -= 30; + + if (this->nameEntryBoxPosX <= 0) { + this->nameEntryBoxPosX = 0; + this->nameEntryBoxAlpha = 255; + this->configMode = CM_OPTIONS_MENU; + } +} + +static u8 sSelectedSetting; + +void FileChoose_UpdateOptionsMenuNES(GameState* thisx) { + FileChooseContext* this = (FileChooseContext*)thisx; + // SramContext* sramCtx = &this->sramCtx; + Input* input = &this->state.input[0]; + bool dpad = CVarGetInteger(CVAR_SETTING("DpadInText"), 0); + + if (CHECK_BTN_ALL(input->press.button, BTN_B)) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + this->prevConfigMode = this->configMode; + this->configMode = CM_OPTIONS_TO_MAIN; + sLastOptionButtonIndex = -1; + // sramCtx->readBuff[0] = gSaveContext.audioSetting; + // sramCtx->readBuff[1] = gSaveContext.zTargetSetting; + // osSyncPrintf("SAVE"); + // Sram_WriteSramHeader(sramCtx); + Save_SaveGlobal(); + CVarSave(); + // osSyncPrintf(VT_FGCOL(YELLOW)); + // osSyncPrintf("sram->read_buff[2] = J_N = %x\n", sramCtx->readBuff[2]); + // osSyncPrintf("sram->read_buff[2] = J_N = %x\n", &sramCtx->readBuff[2]); + // osSyncPrintf("Na_SetSoundOutputMode = %d\n", gSaveContext.audioSetting); + // osSyncPrintf("Na_SetSoundOutputMode = %d\n", gSaveContext.audioSetting); + // osSyncPrintf("Na_SetSoundOutputMode = %d\n", gSaveContext.audioSetting); + // osSyncPrintf(VT_RST); + func_800F6700(gSaveContext.audioSetting); + // osSyncPrintf("終了\n"); + return; + } + + if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + + if (sSelectedSetting == FS_SETTING_AUDIO) { + gSaveContext.audioSetting--; + + // because audio setting is unsigned, can't check for < 0 + if (gSaveContext.audioSetting > 0xF0) { + gSaveContext.audioSetting = FS_AUDIO_SURROUND; + } + } else { + gSaveContext.zTargetSetting ^= 1; + } + } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + + if (sSelectedSetting == FS_SETTING_AUDIO) { + gSaveContext.audioSetting++; + + if (gSaveContext.audioSetting > FS_AUDIO_SURROUND) { + gSaveContext.audioSetting = FS_AUDIO_STEREO; + } + } else { + gSaveContext.zTargetSetting ^= 1; + } + } + + if ((this->stickRelY < -30) || (this->stickRelY > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + sSelectedSetting ^= 1; + } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) { + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + sSelectedSetting ^= 1; + } + + if (sSelectedSetting == FS_SETTING_AUDIO) { + if (sLastOptionButtonIndex != gSaveContext.audioSetting) { + GameInteractor_ExecuteOnUpdateFileAudioSelection(gSaveContext.audioSetting); + sLastOptionButtonIndex = gSaveContext.audioSetting; + } + } else if (sSelectedSetting == FS_SETTING_TARGET) { + // offset to detect switching between modes + u8 optionOffset = gSaveContext.zTargetSetting + FS_AUDIO_SURROUND + FS_SETTING_TARGET; + if (sLastOptionButtonIndex != optionOffset) { + GameInteractor_ExecuteOnUpdateFileTargetSelection(gSaveContext.zTargetSetting); + sLastOptionButtonIndex = optionOffset; + } + } +} + +void FileChoose_DrawOptionsImplNES(GameState* thisx) { + static s16 cursorPrimRed = 255; + static s16 cursorPrimGreen = 255; + static s16 cursorPrimBlue = 255; + static s16 cursorEnvRed = 0; + static s16 cursorEnvGreen = 0; + static s16 cursorEnvBlue = 0; + static s16 cursorPulseDir = 1; + static s16 cursorFlashTimer = 20; + static s16 cursorPrimColors[][3] = { + { 255, 255, 255 }, + { 0, 255, 255 }, + }; + static s16 cursorEnvColors[][3] = { + { 0, 0, 0 }, + { 0, 150, 150 }, + }; + if (CVarGetInteger(CVAR_COSMETIC("Title.FileChoose.Changed"), 0)) { + Color_RGB8 backgroundColor = CVarGetColor24(CVAR_COSMETIC("Title.FileChoose.Value"), (Color_RGB8){ 100, 150, 255 }); + cursorPrimColors[1][0] = MIN(backgroundColor.r + 100, 255); + cursorPrimColors[1][1] = MIN(backgroundColor.g + 100, 255); + cursorPrimColors[1][2] = MIN(backgroundColor.b + 100, 255); + cursorEnvColors[1][0] = MIN(backgroundColor.r + 50, 255); + cursorEnvColors[1][1] = MIN(backgroundColor.g + 50, 255); + cursorEnvColors[1][2] = MIN(backgroundColor.b + 50, 255); + } + + FileChooseContext* this = (FileChooseContext*)thisx; + s16 cursorRed; + s16 cursorGreen; + s16 cursorBlue; + s16 i; + s16 j; + s16 vtx; + + + OPEN_DISPS(this->state.gfxCtx); + + cursorRed = ABS(cursorPrimRed - cursorPrimColors[cursorPulseDir][0]) / cursorFlashTimer; + cursorGreen = ABS(cursorPrimGreen - cursorPrimColors[cursorPulseDir][1]) / cursorFlashTimer; + cursorBlue = ABS(cursorPrimBlue - cursorPrimColors[cursorPulseDir][2]) / cursorFlashTimer; + + if (cursorPrimRed >= cursorPrimColors[cursorPulseDir][0]) { + cursorPrimRed -= cursorRed; + } else { + cursorPrimRed += cursorRed; + } + + if (cursorPrimGreen >= cursorPrimColors[cursorPulseDir][1]) { + cursorPrimGreen -= cursorGreen; + } else { + cursorPrimGreen += cursorGreen; + } + + if (cursorPrimBlue >= cursorPrimColors[cursorPulseDir][2]) { + cursorPrimBlue -= cursorBlue; + } else { + cursorPrimBlue += cursorBlue; + } + + cursorRed = ABS(cursorEnvRed - cursorEnvColors[cursorPulseDir][0]) / cursorFlashTimer; + cursorGreen = ABS(cursorEnvGreen - cursorEnvColors[cursorPulseDir][1]) / cursorFlashTimer; + cursorBlue = ABS(cursorEnvBlue - cursorEnvColors[cursorPulseDir][2]) / cursorFlashTimer; + + if (cursorEnvRed >= cursorEnvColors[cursorPulseDir][0]) { + cursorEnvRed -= cursorRed; + } else { + cursorEnvRed += cursorRed; + } + + if (cursorEnvGreen >= cursorEnvColors[cursorPulseDir][1]) { + cursorEnvGreen -= cursorGreen; + } else { + cursorEnvGreen += cursorGreen; + } + + if (cursorEnvBlue >= cursorEnvColors[cursorPulseDir][2]) { + cursorEnvBlue -= cursorBlue; + } else { + cursorEnvBlue += cursorBlue; + } + + if (--cursorFlashTimer == 0) { + cursorPrimRed = cursorPrimColors[cursorPulseDir][0]; + cursorPrimGreen = cursorPrimColors[cursorPulseDir][1]; + cursorPrimBlue = cursorPrimColors[cursorPulseDir][2]; + + cursorEnvRed = cursorEnvColors[cursorPulseDir][0]; + cursorEnvGreen = cursorEnvColors[cursorPulseDir][1]; + cursorEnvBlue = cursorEnvColors[cursorPulseDir][2]; + + cursorFlashTimer = 20; + + if (++cursorPulseDir > 1) { + cursorPulseDir = 0; + } + } + + gSPVertex(POLY_OPA_DISP++, D_80811D30_NTSC, 32, 0); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + + for (i = 0, vtx = 0; i < 4; i++, vtx += 4) { + gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuHeaders[i].texture[NTSC_LANGUAGE_INDEX], G_IM_FMT_IA, + G_IM_SIZ_8b, sOptionsMenuHeaders[i].width, + sOptionsMenuHeaders[i].height, 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); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + } + + gSPVertex(POLY_OPA_DISP++, D_80811F30_NTSC, 32, 0); + + for (i = 0, vtx = 0; i < 4; i++, vtx += 4) { + gDPPipeSync(POLY_OPA_DISP++); + if (i == gSaveContext.audioSetting) { + if (sSelectedSetting == FS_SETTING_AUDIO) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cursorPrimRed, cursorPrimGreen, cursorPrimBlue, + this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, cursorEnvRed, cursorEnvGreen, cursorEnvBlue, 255); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + + //! @bug Mistakenly using sOptionsMenuHeaders instead of sOptionsMenuSettings for the height. + //! This works out anyway because all heights are 16. + gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuSettings[i].texture[NTSC_LANGUAGE_INDEX], G_IM_FMT_IA, + G_IM_SIZ_8b, sOptionsMenuSettings[i].width, + sOptionsMenuHeaders[i].height, 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); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + } + + for (; i < 6; i++, vtx += 4) { + gDPPipeSync(POLY_OPA_DISP++); + + if (i == (gSaveContext.zTargetSetting + 4)) { + if (sSelectedSetting != FS_SETTING_AUDIO) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, cursorPrimRed, cursorPrimGreen, cursorPrimBlue, + this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, cursorEnvRed, cursorEnvGreen, cursorEnvBlue, 0xFF); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + } + + //! @bug Mistakenly using sOptionsMenuHeaders instead of sOptionsMenuSettings for the height. + //! This is also an OOB read that happens to access the height of the first two elements in + //! sOptionsMenuSettings, and since all heights are 16, it works out anyway. + gDPLoadTextureBlock(POLY_OPA_DISP++, sOptionsMenuSettings[i].texture[NTSC_LANGUAGE_INDEX], G_IM_FMT_IA, + G_IM_SIZ_8b, sOptionsMenuSettings[i].width, + sOptionsMenuHeaders[i].height, 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); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + } + + gDPPipeSync(POLY_OPA_DISP++); + + // check brightness bars + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelBrightnessCheckTex, G_IM_FMT_IA, 96, 16, 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); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 55, 55, 55, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 40, 40, 40, 255); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + + vtx += 4; + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 30, 30, 30, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0); + + vtx += 4; + + // blue divider lines + gDPPipeSync(POLY_OPA_DISP++); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 255, 255, this->titleAlpha[0]); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0); + + gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelOptionsDividerTex, G_IM_FMT_IA, 256, 2, 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); + + Matrix_Push(); + Matrix_Translate(0.0f, 0.1f, 0.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(this->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPVertex(POLY_OPA_DISP++, gOptionsDividerTopVtx, 4, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + Matrix_Pop(); + + Matrix_Push(); + Matrix_Translate(0.0f, 0.2f, 0.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(this->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPVertex(POLY_OPA_DISP++, gOptionsDividerMiddleVtx, 4, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + Matrix_Pop(); + + Matrix_Push(); + Matrix_Translate(0.0f, 0.4f, 0.0f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(this->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPVertex(POLY_OPA_DISP++, gOptionsDividerBottomVtx, 4, 0); + gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); + Matrix_Pop(); + + CLOSE_DISPS(this->state.gfxCtx); +} + +void FileChoose_DrawOptionsNES(GameState* thisx) { + FileChoose_DrawOptionsImplNES(thisx); +} diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c index 8f10e9837..45603ae73 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c @@ -100,16 +100,16 @@ static void* sBackspaceEndTextures[][2] = { static u16 sBackspaceEndWidths[] = { 28, 44 }; -static s16 D_808125EC[] = { +s16 D_808125EC[] = { 0xFFE2, 0xFFF0, 0xFFFA, 0x0004, 0x000E, 0x0018, 0x0022, 0x002C, 0x0036, 0xFFF0, 0xFFF0, }; -static s16 D_80812604[] = { +s16 D_80812604[] = { 0x0048, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, }; -static s16 sLastCharIndex = -1; -static s16 sLastKbdX = -1; +s16 sLastCharIndex = -1; +s16 sLastKbdX = -1; /** * Set vertices used by all elements of the name entry screen that are NOT the keyboard. @@ -677,7 +677,7 @@ void FileChoose_StartOptions(GameState* thisx) { } static u8 sSelectedSetting; -static s8 sLastOptionButtonIndex = -1; +s8 sLastOptionButtonIndex = -1; /** * Update the cursor and appropriate settings for the options menu. diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c index cb4c95d7f..9b2eadd18 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c @@ -9,3 +9,51 @@ s16 D_808123F0[] = { 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0040, 0x003F, 0x003E, }; + +// #region SOH [NTSC] +// clang-format off +s16 gKeyboardCharactersHiragana[] = { + // 'あ' 'か' 'さ' 'た' 'な' 'は' 'ま' 'や' 'ら' 'わ' 'ぁ' 'ゃ' 'っ' + /* Row 0 */ 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x23, 0x28, 0x2D, 0x30, 0x35, 0x38, 0x3E, 0x3D, + // 'い' 'き' 'し' 'ち' 'に' 'ひ' 'み' ' ' 'り' ' ' 'ぃ' ' ' ' ' + /* Row 1 */ 0x0B, 0x10, 0x15, 0x1A, 0x1F, 0x24, 0x29, 0xDF, 0x31, 0xDF, 0x39, 0xDF, 0xDF, + // 'う' 'く' 'す' 'つ' 'ぬ' 'ふ' 'む' 'ゆ' 'る' 'を' 'ぅ' 'ゅ' 'ー' + /* Row 2 */ 0x0C, 0x11, 0x16, 0x1B, 0x20, 0x25, 0x2A, 0x2E, 0x32, 0x36, 0x3A, 0x3F, 0xE4, + // 'え' 'け' 'せ' 'て' 'ね' 'へ' 'め' ' ' 'れ' ' ' 'ぇ' ' ' '゛' + /* Row 3 */ 0x0D, 0x12, 0x17, 0x1C, 0x21, 0x26, 0x2B, 0xDF, 0x33, 0xDF, 0x3B, 0xDF, 0xE7, + // 'お' 'こ' 'そ' 'と' 'の' 'ほ' 'も' 'よ' 'ろ' 'ん' 'ぉ' 'ょ' '゜' + /* Row 4 */ 0x0E, 0x13, 0x18, 0x1D, 0x22, 0x27, 0x2C, 0x2F, 0x34, 0x37, 0x3C, 0x40, 0xE8, +}; + +s16 gKeyboardCharactersKatakana[] = { + // 'ア' 'カ' 'サ' 'タ' 'ナ' 'ハ' 'マ' 'ヤ' 'ラ' 'ワ' 'ァ' 'ャ' 'ッ' + /* Row 0 */ 0x5A, 0x5F, 0x64, 0x69, 0x6E, 0x73, 0x78, 0x7D, 0x80, 0x85, 0x88, 0x8E, 0x8D, + // 'イ' 'キ' 'シ' 'チ' 'ニ' 'ヒ' 'ミ' ' ' 'リ' ' ' 'ィ' ' ' ' ' + /* Row 1 */ 0x5B, 0x60, 0x65, 0x6A, 0x6F, 0x74, 0x79, 0xDF, 0x81, 0xDF, 0x89, 0xDF, 0xDF, + // 'ウ' 'ク' 'ス' 'ツ' 'ヌ' 'フ' 'ム' 'ユ' 'ル' 'ヲ' 'ゥ' 'ュ' 'ー' + /* Row 2 */ 0x5C, 0x61, 0x66, 0x6B, 0x70, 0x75, 0x7A, 0x7E, 0x82, 0x86, 0x8A, 0x8F, 0xE4, + // 'エ' 'ケ' 'セ' 'テ' 'ネ' 'ヘ' 'メ' ' ' 'レ' ' ' 'ェ' ' ' '゛' + /* Row 3 */ 0x5D, 0x62, 0x67, 0x6C, 0x71, 0x76, 0x7B, 0xDF, 0x83, 0xDF, 0x8B, 0xDF, 0xE7, + // 'オ' 'コ' 'ソ' 'ト' 'ノ' 'ホ' 'モ' 'ヨ' 'ロ' 'ン' 'ォ' 'ョ' '゜' + /* Row 4 */ 0x5E, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7C, 0x7F, 0x84, 0x87, 0x8C, 0x90, 0xE8, +}; + +s16 gKeyboardCharactersAlphanumeric[] = { + // 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' + /* Row 0 */ 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, + // 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' + /* Row 1 */ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, + // 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' + /* Row 2 */ 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, + // 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' + /* Row 3 */ 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, + // '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' '.' '-' ' ' + /* Row 4 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0xEA, 0xE4, 0xDF, +}; +// clang-format on + +s16 D_808127DC_ne0[] = { + 0, 1, 2, 1, 0, 2, 0, 2, 1, 0 +}; + +// #endregion diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index 532829cbd..7e6d8cee0 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -36,7 +36,7 @@ void Select_LoadGame(SelectContext* this, s32 entranceIndex) { for (int buttonIndex = 0; buttonIndex < ARRAY_COUNT(gSaveContext.buttonStatus); buttonIndex++) { gSaveContext.buttonStatus[buttonIndex] = BTN_ENABLED; } - gSaveContext.unk_13E7 = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0; + gSaveContext.forceRisingButtonAlphas = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0; Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_STOP); gSaveContext.entranceIndex = entranceIndex; @@ -93,7 +93,7 @@ void Select_Grotto_LoadGame(SelectContext* this, s32 grottoIndex) { for (int buttonIndex = 0; buttonIndex < ARRAY_COUNT(gSaveContext.buttonStatus); buttonIndex++) { gSaveContext.buttonStatus[buttonIndex] = BTN_ENABLED; } - gSaveContext.unk_13E7 = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0; + gSaveContext.forceRisingButtonAlphas = gSaveContext.unk_13E8 = gSaveContext.unk_13EA = gSaveContext.unk_13EC = 0; Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_STOP); // Entrance index and grotto content data to load the correct grotto and actors gSaveContext.entranceIndex = this->betterGrottos[grottoIndex].entranceIndex; @@ -1092,6 +1092,9 @@ void Select_PrintMenu(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: name = this->scenes[scene].frenchName; break; + case LANGUAGE_JPN: + name = this->scenes[scene].japaneseName; + break; } } else { name = this->scenes[scene].japaneseName; @@ -1148,6 +1151,10 @@ void Better_Select_PrintMenu(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: name = this->betterScenes[scene].frenchName; break; + // NTSC TODO: Support JPN Better Select + case LANGUAGE_JPN: + name = this->betterScenes[scene].englishName; + break; } } else { name = this->betterScenes[scene].englishName; @@ -1174,6 +1181,10 @@ void Better_Select_PrintMenu(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: GfxPrint_Printf(printer, "%s", this->betterScenes[this->currentScene].entrancePairs[this->pageDownIndex].frenchName); break; + // NTSC TODO: Support JPN Better Select + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "%s", this->betterScenes[this->currentScene].entrancePairs[this->pageDownIndex].englishName); + break; } } else { GfxPrint_Printf(printer, "%s", this->betterScenes[this->currentScene].entrancePairs[this->pageDownIndex].englishName); @@ -1214,6 +1225,9 @@ void Select_PrintLoadingMessage(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: GfxPrint_Printf(printer, "%s", sLoadingMessages[randomMsg].frenchMessage); break; + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "%s", sLoadingMessages[randomMsg].japaneseMessage); + break; } } else { GfxPrint_Printf(printer, "%s", sLoadingMessages[randomMsg].japaneseMessage); @@ -1226,8 +1240,8 @@ static SceneSelectAgeLabels sAgeLabels[] = { }; static BetterSceneSelectAgeLabels sBetterAgeLabels[] = { - { "Adult", "Erwachsener", "Adulte" }, - { "Child", "Kind", "Enfant" }, + { "ワカモノ", "Adult", "Erwachsener", "Adulte" }, + { "ワカスギ", "Child", "Kind", "Enfant" }, }; void Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 age) { @@ -1245,6 +1259,9 @@ void Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 age) { case LANGUAGE_FRA: GfxPrint_Printf(printer, "Age:%s", sAgeLabels[age].frenchAge); break; + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "Age:%s", sAgeLabels[age].japaneseAge); + break; } } else { GfxPrint_Printf(printer, "Age:%s", sAgeLabels[age].japaneseAge); @@ -1258,6 +1275,7 @@ void Better_Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 a switch (gSaveContext.language) { case LANGUAGE_ENG: case LANGUAGE_FRA: + case LANGUAGE_JPN: default: GfxPrint_Printf(printer, "(B)Age:"); break; @@ -1282,6 +1300,9 @@ void Better_Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 a case LANGUAGE_FRA: GfxPrint_Printf(printer, "%s", sBetterAgeLabels[age].frenchAge); break; + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "%s", sBetterAgeLabels[age].japaneseAge); + break; } } else { GfxPrint_Printf(printer, "%s", sBetterAgeLabels[age].englishAge); @@ -1306,7 +1327,7 @@ void Select_PrintCutsceneSetting(SelectContext* this, GfxPrint* printer, u16 csI }; char* label; - int lang = CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1) ? gSaveContext.language + 1 : 0; + int lang = CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1) ? (gSaveContext.language + 1) % 4 : 0; GfxPrint_SetPos(printer, 4, 25); GfxPrint_SetColor(printer, 255, 255, 55, 255); @@ -1372,6 +1393,7 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: + case LANGUAGE_JPN: default: label = "Night"; break; @@ -1389,6 +1411,7 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: + case LANGUAGE_JPN: default: label = "Day"; break; @@ -1406,6 +1429,7 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: + case LANGUAGE_JPN: default: GfxPrint_Printf(printer, "(Z/R)Time:"); break; @@ -1441,6 +1465,7 @@ void Better_Select_PrintMQSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: + case LANGUAGE_JPN: default: label = this->opt ? "ON" : "OFF"; break; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c index 3c37b565f..f5b33b7e6 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c @@ -3,6 +3,7 @@ #include "textures/icon_item_nes_static/icon_item_nes_static.h" #include "textures/icon_item_ger_static/icon_item_ger_static.h" #include "textures/icon_item_fra_static/icon_item_fra_static.h" +#include "textures/icon_item_jpn_static/icon_item_jpn_static.h" #include "textures/icon_item_field_static/icon_item_field_static.h" #include "textures/icon_item_dungeon_static/icon_item_dungeon_static.h" #include "textures/icon_item_nes_static/icon_item_nes_static.h" @@ -27,6 +28,10 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) { gPauseDekuTitleFRATex, gPauseDodongoTitleFRATex, gPauseJabuTitleFRATex, gPauseForestTitleFRATex, gPauseFireTitleFRATex, gPauseWaterTitleFRATex, gPauseSpiritTitleFRATex, gPauseShadowTitleFRATex, gPauseBotWTitleFRATex, gPauseIceCavernTitleFRATex, + + gPauseDekuTitleJPNTex, gPauseDodongoTitleJPNTex, gPauseJabuTitleJPNTex, gPauseForestTitleJPNTex, + gPauseFireTitleJPNTex, gPauseWaterTitleJPNTex, gPauseSpiritTitleJPNTex, gPauseShadowTitleJPNTex, + gPauseBotWTitleJPNTex, gPauseIceCavernTitleJPNTex, }; static void* floorIconTexs[] = { gDungeonMapBlankFloorButtonTex, gDungeonMap8FButtonTex, gDungeonMap7FButtonTex, gDungeonMap6FButtonTex, @@ -431,6 +436,7 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) { gPauseCurrentPositionENGTex, gPauseCurrentPositionGERTex, gPauseCurrentPositionFRATex, + gPauseCurrentPositionJPNTex, }; static u16 D_8082A6D4 = 0; PauseContext* pauseCtx = &play->pauseCtx; 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 f6dab7003..ddbdc46e9 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 @@ -8,7 +8,7 @@ #include "textures/icon_item_nes_static/icon_item_nes_static.h" #include "textures/icon_item_ger_static/icon_item_ger_static.h" #include "textures/icon_item_fra_static/icon_item_fra_static.h" -#include "textures/icon_item_gameover_static/icon_item_gameover_static.h" +#include "textures/icon_item_jpn_static/icon_item_jpn_static.h" #include "textures/icon_item_gameover_static/icon_item_gameover_static.h" #include "textures/map_name_static/map_name_static.h" #include "textures/map_48x85_static/map_48x85_static.h" @@ -108,6 +108,34 @@ static void* sSaveENGTexs[] = { gPauseSave20Tex, gPauseSave21Tex, gPauseSave22Tex, gPauseSave23Tex, gPauseSave24Tex, }; +static void* sEquipmentJPNTexs[] = { + gPauseEquipment00Tex, gPauseEquipment01Tex, gPauseEquipment02Tex, gPauseEquipment03Tex, gPauseEquipment04Tex, + gPauseEquipment10JPNTex, gPauseEquipment11Tex, gPauseEquipment12Tex, gPauseEquipment13Tex, gPauseEquipment14Tex, + gPauseEquipment20Tex, gPauseEquipment21Tex, gPauseEquipment22Tex, gPauseEquipment23Tex, gPauseEquipment24Tex, +}; +static void* sSelectItemJPNTexs[] = { + gPauseSelectItem00JPNTex, gPauseSelectItem01Tex, gPauseSelectItem02Tex, gPauseSelectItem03Tex, + gPauseSelectItem04Tex, gPauseSelectItem10JPNTex, gPauseSelectItem11Tex, gPauseSelectItem12Tex, + gPauseSelectItem13Tex, gPauseSelectItem14Tex, gPauseSelectItem20JPNTex, gPauseSelectItem21Tex, + gPauseSelectItem22Tex, gPauseSelectItem23Tex, gPauseSelectItem24Tex, +}; +static void* sMapJPNTexs[] = { + gPauseMap00Tex, gPauseMap01Tex, gPauseMap02Tex, gPauseMap03Tex, gPauseMap04Tex, + gPauseMap10JPNTex, gPauseMap11Tex, gPauseMap12Tex, gPauseMap13Tex, gPauseMap14Tex, + gPauseMap20Tex, gPauseMap21Tex, gPauseMap22Tex, gPauseMap23Tex, gPauseMap24Tex, +}; +static void* sQuestStatusJPNTexs[] = { + gPauseQuestStatus00JPNTex, gPauseQuestStatus01Tex, gPauseQuestStatus02Tex, gPauseQuestStatus03Tex, + gPauseQuestStatus04Tex, gPauseQuestStatus10JPNTex, gPauseQuestStatus11Tex, gPauseQuestStatus12Tex, + gPauseQuestStatus13Tex, gPauseQuestStatus14Tex, gPauseQuestStatus20JPNTex, gPauseQuestStatus21Tex, + gPauseQuestStatus22Tex, gPauseQuestStatus23Tex, gPauseQuestStatus24Tex, +}; +static void* sSaveJPNTexs[] = { + gPauseSave00Tex, gPauseSave01Tex, gPauseSave02Tex, gPauseSave03Tex, gPauseSave04Tex, + gPauseSave10JPNTex, gPauseSave11Tex, gPauseSave12Tex, gPauseSave13Tex, gPauseSave14Tex, + gPauseSave20Tex, gPauseSave21Tex, gPauseSave22Tex, gPauseSave23Tex, gPauseSave24Tex, +}; + static void* sGameOverTexs[] = { gPauseSave00Tex, gPauseSave01Tex, gPauseSave02Tex, gPauseSave03Tex, gPauseSave04Tex, gPauseGameOver10Tex, gPauseSave11Tex, gPauseSave12Tex, gPauseSave13Tex, gPauseSave14Tex, @@ -189,34 +217,40 @@ static void* sEquipmentTexs[] = { sEquipmentENGTexs, sEquipmentGERTexs, sEquipmentFRATexs, + sEquipmentJPNTexs, }; static void* sSelectItemTexs[] = { sSelectItemENGTexs, sSelectItemGERTexs, sSelectItemFRATexs, + sSelectItemJPNTexs, }; static void* sMapTexs[] = { sMapENGTexs, sMapGERTexs, sMapFRATexs, + sMapJPNTexs, }; static void* sQuestStatusTexs[] = { sQuestStatusENGTexs, sQuestStatusGERTexs, sQuestStatusFRATexs, + sQuestStatusJPNTexs, }; static void* sSaveTexs[] = { sSaveENGTexs, sSaveGERTexs, sSaveFRATexs, + sSaveJPNTexs, }; static void* iconNameTextures[] = { + // LANGUAGE_ENG gDekuStickItemNameENGTex, gDekuNutItemNameENGTex, gBombItemNameENGTex, @@ -340,6 +374,7 @@ static void* iconNameTextures[] = gUnusedBossKeyItemName6JPNTex, gUnusedBossKeyItemName7JPNTex, gBiggoronsSwordItemNameENGTex, + // LANGUAGE_GER gDekuStickItemNameGERTex, gDekuNutItemNameGERTex, gBombItemNameItemNameGERTex, @@ -463,6 +498,7 @@ static void* iconNameTextures[] = gUnusedBossKeyItemName13JPNTex, gUnusedBossKeyItemName14JPNTex, gBiggoronsSwordItemNameGERTex, + // LANGUAGE_FRA gDekuStickItemNameFRATex, gDekuNutItemNameFRATex, gBombItemNameFRATex, @@ -586,113 +622,279 @@ static void* iconNameTextures[] = gUnusedBossKeyItemName20JPNTex, gUnusedBossKeyItemName21JPNTex, gBiggoronsSwordItemNameFRATex, - gBiggoronsSwordItemNameFRATex, + // LANGUAGE_JPN + gDekuStickItemNameJPNTex, + gDekuNutItemNameJPNTex, + gBombItemNameJPNTex, + gFairyBowItemNameJPNTex, + gFireArrowItemNameJPNTex, + gDinsFireItemNameJPNTex, + gFairySlingshotItemNameJPNTex, + gFairyOcarinaItemNameJPNTex, + gOcarinaOfTimeItemNameJPNTex, + gBombchuItemNameJPNTex, + gHookshotItemNameJPNTex, + gLongshotItemNameJPNTex, + gIceArrowItemNameJPNTex, + gFaroresWindItemNameJPNTex, + gBoomerangItemNameJPNTex, + gLensItemNameJPNTex, + gMagicBeansItemNameJPNTex, + gMegatonHammerItemNameJPNTex, + gLightArrowItemNameJPNTex, + gNayrusLoveItemNameJPNTex, + gEmptyBottleItemNameJPNTex, + gRedPotionItemNameJPNTex, + gGreenPotionItemNameJPNTex, + gBluePotionItemNameJPNTex, + gBottledFairyItemNameJPNTex, + gFishItemNameJPNTex, + gFullMilkItemNameJPNTex, + gRutosLetterItemNameJPNTex, + gBlueFireItemNameJPNTex, + gBugItemNameJPNTex, + gBigPoeItemNameJPNTex, + gHalfMilkItemNameJPNTex, + gPoeItemNameJPNTex, + gWeirdEggItemNameJPNTex, + gCuccoItemNameJPNTex, + gZeldasLetterItemNameJPNTex, + gKeatonMaskItemNameJPNTex, + gSkullMaskItemNameJPNTex, + gSpookyMaskItemNameJPNTex, + gBunnyHoodItemNameJPNTex, + gGoronMaskItemNameJPNTex, + gZoraMaskItemNameJPNTex, + gGerudoMaskItemNameJPNTex, + gMaskofTruthItemNameJPNTex, + gSOLDOUTItemNameJPNTex, + gPocketEggItemNameJPNTex, + gPocketCuccoItemNameJPNTex, + gCojiroItemNameJPNTex, + gOddMushroomItemNameJPNTex, + gOddPotionItemNameJPNTex, + gPoachersSawItemNameJPNTex, + gBrokenGoronsSwordItemNameJPNTex, + gPrescriptionItemNameJPNTex, + gEyeBallFrogItemNameJPNTex, + gEyeDropsItemNameJPNTex, + gClaimCheckItemNameJPNTex, + gUnusedWindMedallionItemName1JPNTex, + gUnusedFireMedallionItemName1JPNTex, + gUnusedIceMedallionItemName1JPNTex, + gKokiriSwordItemNameJPNTex, + gMasterSwordItemNameJPNTex, + gGiantsKnifeItemNameJPNTex, + gDekuShieldItemNameJPNTex, + gHylianShieldItemNameJPNTex, + gMirrorShieldItemNameJPNTex, + gKokiriTunicItemNameJPNTex, + gGoronTunicItemNameJPNTex, + gZoraTunicItemNameJPNTex, + gKokiriBootsItemNameJPNTex, + gIronBootsItemNameJPNTex, + gHoverBootsItemNameJPNTex, + gBulletBag30ItemNameJPNTex, + gBulletBag40ItemNameJPNTex, + gBulletBag50ItemNameJPNTex, + gQuiver30ItemNameJPNTex, + gQuiver40ItemNameJPNTex, + gQuiver50ItemNameJPNTex, + gBombBag20ItemNameJPNTex, + gBombBag30ItemNameJPNTex, + gBombBag40ItemNameJPNTex, + gGoronsBraceletItemNameJPNTex, + gSilverGauntletsItemNameJPNTex, + gGoldenGauntletsItemNameJPNTex, + gSilverScaleItemNameJPNTex, + gGoldenScaleItemNameJPNTex, + gBrokenGiantsKnifeItemNameJPNTex, + gUnusedBossKeyItemName1JPNTex, + gUnusedBossKeyItemName2JPNTex, + gUnusedBossKeyItemName3JPNTex, + gUnusedBossKeyItemName4JPNTex, + gMinuetOfForestItemNameJPNTex, + gBoleroOfFireItemNameJPNTex, + gSerenadeOfWaterItemNameJPNTex, + gRequiemOfSpiritItemNameJPNTex, + gNocturneOfShadowItemNameJPNTex, + gPreludeOfLightItemNameJPNTex, + gZeldasLullabyItemNameJPNTex, + gEponasSongItemNameJPNTex, + gSariasSongItemNameJPNTex, + gSunsSongItemNameJPNTex, + gSongOfTimeItemNameJPNTex, + gSongOfStormsItemNameJPNTex, + gForestMedallionItemNameJPNTex, + gFireMedallionItemNameJPNTex, + gWaterMedallionItemNameJPNTex, + gSpiritMedallionItemNameJPNTex, + gShadowMedallionItemNameJPNTex, + gLightMedallionItemNameJPNTex, + gKokiriEmeraldItemNameJPNTex, + gGoronsRubyItemNameJPNTex, + gZorasSapphireItemNameJPNTex, + gStoneofAgonyItemNameJPNTex, + gGerudosCardItemNameJPNTex, + gGoldSkulltulaItemNameJPNTex, + gPieceOfHeartItemNameJPNTex, + gUnusedPieceOfHeartItemName1JPNTex, + gUnusedBigKeyItemNameJPNTex, + gCompassItemNameJPNTex, + gDungeonMapItemNameJPNTex, + gUnusedBossKeyItemName5JPNTex, + gUnusedBossKeyItemName6JPNTex, + gUnusedBossKeyItemName7JPNTex, + gBiggoronsSwordItemNameJPNTex, }; +// SOH [NTSC] - Fit in JPN textures, resulting in changes to offsets when indexed static void* mapNameTextures[] = { - gHauntedWastelandPointNameENGTex, - gGerudosFortressPointNameENGTex, - gGerudoValleyPointNameENGTex, - gHyliaLakesidePointNameENGTex, - gLonLonRanchPointNameENGTex, - gMarketPointNameENGTex, - gHyruleFieldPointNameENGTex, - gDeathMountainPointNameENGTex, - gKakarikoVillagePointNameENGTex, - gLostWoodsPointNameENGTex, - gKokiriForestPointNameENGTex, - gZorasDomainPointNameENGTex, - gHauntedWastelandPointNameGERTex, - gGerudosFortressPointNameGERTex, - gGerudoValleyPointNameGERTex, - gHyliaLakesidePointNameGERTex, - gLonLonRanchPointNameGERTex, - gMarketPointNameGERTex, - gHyruleFieldPointNameGERTex, - gDeathMountainPointNameGERTex, - gKakarikoVillagePointNameGERTex, - gLostWoodsPointNameGERTex, - gKokiriForestPointNameGERTex, - gZorasDomainPointNameGERTex, - gHauntedWastelandPointNameFRATex, - gGerudosFortressPointNameFRATex, - gGerudoValleyPointNameFRATex, - gHyliaLakesidePointNameFRATex, - gLonLonRanchPointNameFRATex, - gMarketPointNameFRATex, - gHyruleFieldPointNameFRATex, - gDeathMountainPointNameFRATex, - gKakarikoVillagePointNameFRATex, - gLostWoodsPointNameFRATex, - gKokiriForestPointNameFRATex, - gZorasDomainPointNameFRATex, - gHyruleFieldPositionNameENGTex, - gKakarikoVillagePositionNameENGTex, - gGraveyardPositionNameENGTex, - gZorasRiverPositionNameENGTex, - gKokiriForestPositionNameENGTex, - gSacredForestMeadowPositionNameENGTex, - gLakeHyliaPositionNameENGTex, - gZorasDomainPositionNameENGTex, - gZorasFountainPositionNameENGTex, - gGerudoValleyPositionNameENGTex, - gLostWoodsPositionNameENGTex, - gDesertColossusPositionNameENGTex, - gGerudosFortressPositionNameENGTex, - gHauntedWastelandPositionNameENGTex, - gMarketPositionNameENGTex, - gHyruleCastlePositionNameENGTex, - gDeathMountainTrailPositionNameENGTex, - gDeathMountainCraterPositionNameENGTex, - gGoronCityPositionNameENGTex, - gLonLonRanchPositionNameENGTex, - gQuestionMarkPositionNameENGTex, - gGanonsCastlePositionNameENGTex, - gHyruleFieldPositionNameGERTex, - gKakarikoVillagePositionNameGERTex, - gGraveyardPositionNameGERTex, - gZorasRiverPositionNameGERTex, - gKokiriForestPositionNameGERTex, - gSacredForestMeadowPositionNameGERTex, - gLakeHyliaPositionNameGERTex, - gZorasDomainPositionNameGERTex, - gZorasFountainPositionNameGERTex, - gGerudoValleyPositionNameGERTex, - gLostWoodsPositionNameGERTex, - gDesertColossusPositionNameGERTex, - gGerudosFortressPositionNameGERTex, - gHauntedWastelandPositionNameGERTex, - gMarketPositionNameGERTex, - gHyruleCastlePositionNameGERTex, - gDeathMountainTrailPositionNameGERTex, - gDeathMountainCraterPositionNameGERTex, - gGoronCityPositionNameGERTex, - gLonLonRanchPositionNameGERTex, - gQuestionMarkPositionNameGERTex, - gGanonsCastlePositionNameGERTex, - gHyruleFieldPositionNameFRATex, - gKakarikoVillagePositionNameFRATex, - gGraveyardPositionNameFRATex, - gZorasRiverPositionNameFRATex, - gKokiriForestPositionNameFRATex, - gSacredForestMeadowPositionNameFRATex, - gLakeHyliaPositionNameFRATex, - gZorasDomainPositionNameFRATex, - gZorasFountainPositionNameFRATex, - gGerudoValleyPositionNameFRATex, - gLostWoodsPositionNameFRATex, - gDesertColossusPositionNameFRATex, - gGerudosFortressPositionNameFRATex, - gHauntedWastelandPositionNameFRATex, - gMarketPositionNameFRATex, - gHyruleCastlePositionNameFRATex, - gDeathMountainTrailPositionNameFRATex, - gDeathMountainCraterPositionNameFRATex, - gGoronCityPositionNameFRATex, - gLonLonRanchPositionNameFRATex, - gQuestionMarkPositionNameFRATex, - gGanonsCastlePositionNameFRATex, + // LANGUAGE_ENG + /* 0 */ gHauntedWastelandPointNameENGTex, + /* 1 */ gGerudosFortressPointNameENGTex, + /* 2 */ gGerudoValleyPointNameENGTex, + /* 3 */ gHyliaLakesidePointNameENGTex, + /* 4 */ gLonLonRanchPointNameENGTex, + /* 5 */ gMarketPointNameENGTex, + /* 6 */ gHyruleFieldPointNameENGTex, + /* 7 */ gDeathMountainPointNameENGTex, + /* 8 */ gKakarikoVillagePointNameENGTex, + /* 9 */ gLostWoodsPointNameENGTex, + /* 10 */ gKokiriForestPointNameENGTex, + /* 11 */ gZorasDomainPointNameENGTex, + // LANGUAGE_GER + /* 0 */ gHauntedWastelandPointNameGERTex, + /* 1 */ gGerudosFortressPointNameGERTex, + /* 2 */ gGerudoValleyPointNameGERTex, + /* 3 */ gHyliaLakesidePointNameGERTex, + /* 4 */ gLonLonRanchPointNameGERTex, + /* 5 */ gMarketPointNameGERTex, + /* 6 */ gHyruleFieldPointNameGERTex, + /* 7 */ gDeathMountainPointNameGERTex, + /* 8 */ gKakarikoVillagePointNameGERTex, + /* 9 */ gLostWoodsPointNameGERTex, + /* 10 */ gKokiriForestPointNameGERTex, + /* 11 */ gZorasDomainPointNameGERTex, + // LANGUAGE_FRA + /* 0 */ gHauntedWastelandPointNameFRATex, + /* 1 */ gGerudosFortressPointNameFRATex, + /* 2 */ gGerudoValleyPointNameFRATex, + /* 3 */ gHyliaLakesidePointNameFRATex, + /* 4 */ gLonLonRanchPointNameFRATex, + /* 5 */ gMarketPointNameFRATex, + /* 6 */ gHyruleFieldPointNameFRATex, + /* 7 */ gDeathMountainPointNameFRATex, + /* 8 */ gKakarikoVillagePointNameFRATex, + /* 9 */ gLostWoodsPointNameFRATex, + /* 10 */ gKokiriForestPointNameFRATex, + /* 11 */ gZorasDomainPointNameFRATex, + // LANGUAGE_JPN + /* 0 */ gHauntedWastelandPointNameJPNTex, + /* 1 */ gGerudosFortressPointNameJPNTex, + /* 2 */ gGerudoValleyPointNameJPNTex, + /* 3 */ gHyliaLakesidePointNameJPNTex, + /* 4 */ gLonLonRanchPointNameJPNTex, + /* 5 */ gMarketPointNameJPNTex, + /* 6 */ gHyruleFieldPointNameJPNTex, + /* 7 */ gDeathMountainPointNameJPNTex, + /* 8 */ gKakarikoVillagePointNameJPNTex, + /* 9 */ gLostWoodsPointNameJPNTex, + /* 10 */ gKokiriForestPointNameJPNTex, + /* 11 */ gZorasDomainPointNameJPNTex, + // LANGUAGE_ENG + /* 0 */ gHyruleFieldPositionNameENGTex, + /* 1 */ gKakarikoVillagePositionNameENGTex, + /* 2 */ gGraveyardPositionNameENGTex, + /* 3 */ gZorasRiverPositionNameENGTex, + /* 4 */ gKokiriForestPositionNameENGTex, + /* 5 */ gSacredForestMeadowPositionNameENGTex, + /* 6 */ gLakeHyliaPositionNameENGTex, + /* 7 */ gZorasDomainPositionNameENGTex, + /* 8 */ gZorasFountainPositionNameENGTex, + /* 9 */ gGerudoValleyPositionNameENGTex, + /* 10 */ gLostWoodsPositionNameENGTex, + /* 11 */ gDesertColossusPositionNameENGTex, + /* 12 */ gGerudosFortressPositionNameENGTex, + /* 13 */ gHauntedWastelandPositionNameENGTex, + /* 14 */ gMarketPositionNameENGTex, + /* 15 */ gHyruleCastlePositionNameENGTex, + /* 16 */ gDeathMountainTrailPositionNameENGTex, + /* 17 */ gDeathMountainCraterPositionNameENGTex, + /* 18 */ gGoronCityPositionNameENGTex, + /* 19 */ gLonLonRanchPositionNameENGTex, + /* 20 */ gQuestionMarkPositionNameENGTex, + /* 21 */ gGanonsCastlePositionNameENGTex, + // LANGUAGE_GER + /* 0 */ gHyruleFieldPositionNameGERTex, + /* 1 */ gKakarikoVillagePositionNameGERTex, + /* 2 */ gGraveyardPositionNameGERTex, + /* 3 */ gZorasRiverPositionNameGERTex, + /* 4 */ gKokiriForestPositionNameGERTex, + /* 5 */ gSacredForestMeadowPositionNameGERTex, + /* 6 */ gLakeHyliaPositionNameGERTex, + /* 7 */ gZorasDomainPositionNameGERTex, + /* 8 */ gZorasFountainPositionNameGERTex, + /* 9 */ gGerudoValleyPositionNameGERTex, + /* 10 */ gLostWoodsPositionNameGERTex, + /* 11 */ gDesertColossusPositionNameGERTex, + /* 12 */ gGerudosFortressPositionNameGERTex, + /* 13 */ gHauntedWastelandPositionNameGERTex, + /* 14 */ gMarketPositionNameGERTex, + /* 15 */ gHyruleCastlePositionNameGERTex, + /* 16 */ gDeathMountainTrailPositionNameGERTex, + /* 17 */ gDeathMountainCraterPositionNameGERTex, + /* 18 */ gGoronCityPositionNameGERTex, + /* 19 */ gLonLonRanchPositionNameGERTex, + /* 20 */ gQuestionMarkPositionNameGERTex, + /* 21 */ gGanonsCastlePositionNameGERTex, + // LANGUAGE_FRA + /* 0 */ gHyruleFieldPositionNameFRATex, + /* 1 */ gKakarikoVillagePositionNameFRATex, + /* 2 */ gGraveyardPositionNameFRATex, + /* 3 */ gZorasRiverPositionNameFRATex, + /* 4 */ gKokiriForestPositionNameFRATex, + /* 5 */ gSacredForestMeadowPositionNameFRATex, + /* 6 */ gLakeHyliaPositionNameFRATex, + /* 7 */ gZorasDomainPositionNameFRATex, + /* 8 */ gZorasFountainPositionNameFRATex, + /* 9 */ gGerudoValleyPositionNameFRATex, + /* 10 */ gLostWoodsPositionNameFRATex, + /* 11 */ gDesertColossusPositionNameFRATex, + /* 12 */ gGerudosFortressPositionNameFRATex, + /* 13 */ gHauntedWastelandPositionNameFRATex, + /* 14 */ gMarketPositionNameFRATex, + /* 15 */ gHyruleCastlePositionNameFRATex, + /* 16 */ gDeathMountainTrailPositionNameFRATex, + /* 17 */ gDeathMountainCraterPositionNameFRATex, + /* 18 */ gGoronCityPositionNameFRATex, + /* 19 */ gLonLonRanchPositionNameFRATex, + /* 20 */ gQuestionMarkPositionNameFRATex, + /* 21 */ gGanonsCastlePositionNameFRATex, + // LANGUAGE_JPN + /* 0 */ gHyruleFieldPositionNameJPNTex, + /* 1 */ gKakarikoVillagePositionNameJPNTex, + /* 2 */ gGraveyardPositionNameJPNTex, + /* 3 */ gZorasRiverPositionNameJPNTex, + /* 4 */ gKokiriForestPositionNameJPNTex, + /* 5 */ gSacredForestMeadowPositionNameJPNTex, + /* 6 */ gLakeHyliaPositionNameJPNTex, + /* 7 */ gZorasDomainPositionNameJPNTex, + /* 8 */ gZorasFountainPositionNameJPNTex, + /* 9 */ gGerudoValleyPositionNameJPNTex, + /* 10 */ gLostWoodsPositionNameJPNTex, + /* 11 */ gDesertColossusPositionNameJPNTex, + /* 12 */ gGerudosFortressPositionNameJPNTex, + /* 13 */ gHauntedWastelandPositionNameJPNTex, + /* 14 */ gMarketPositionNameJPNTex, + /* 15 */ gHyruleCastlePositionNameJPNTex, + /* 16 */ gDeathMountainTrailPositionNameJPNTex, + /* 17 */ gDeathMountainCraterPositionNameJPNTex, + /* 18 */ gGoronCityPositionNameJPNTex, + /* 19 */ gLonLonRanchPositionNameJPNTex, + /* 20 */ gQuestionMarkPositionNameJPNTex, + /* 21 */ gGanonsCastlePositionNameJPNTex, }; s16 D_8082AAEC[] = { @@ -908,24 +1110,28 @@ static void* sSavePromptTexs[] = { gPauseSavePromptENGTex, gPauseSavePromptGERTex, gPauseSavePromptFRATex, + gPauseSavePromptJPNTex, }; static void* sSaveConfirmationTexs[] = { gPauseSaveConfirmationENGTex, gPauseSaveConfirmationGERTex, gPauseSaveConfirmationFRATex, + gPauseSaveConfirmationJPNTex, }; static void* sContinuePromptTexs[] = { gContinuePlayingENGTex, gContinuePlayingGERTex, gContinuePlayingFRATex, + gContinuePlayingJPNTex, }; static void* sPromptChoiceTexs[][2] = { { gPauseYesENGTex, gPauseNoENGTex }, { gPauseYesGERTex, gPauseNoGERTex }, { gPauseYesFRATex, gPauseNoFRATex }, + { gPauseYesJPNTex, gPauseNoJPNTex }, }; static u8 sButtonStatusSave[ARRAY_COUNT(gSaveContext.buttonStatus)]; @@ -1704,36 +1910,39 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor); } - static const void* sToEquipTextures[3] = { + static const void* sToEquipTextures[4] = { gPauseToEquipENGTex, gPauseToEquipGERTex, gPauseToEquipFRATex, + gPauseToEquipJPNTex, }; - static const void* sToDecideTextures[3] = { + static const void* sToDecideTextures[4] = { gPauseToDecideENGTex, gPauseToDecideGERTex, gPauseToDecideFRATex, + gPauseToDecideJPNTex, }; - static const void* sPlayMelodyTextures[3] = { + static const void* sPlayMelodyTextures[4] = { gPauseToPlayMelodyENGTex, gPauseToPlayMelodyGERTex, gPauseToPlayMelodyFRATex, + gPauseToPlayMelodyJPNTex, }; - static const void* D_8082AD78[][3] = { - { gPauseToEquipmentENGTex, gPauseToEquipmentGERTex, gPauseToEquipmentFRATex }, - { gPauseToSelectItemENGTex, gPauseToSelectItemGERTex, gPauseToSelectItemFRATex }, - { gPauseToMapENGTex, gPauseToMapGERTex, gPauseToMapFRATex }, - { gPauseToQuestStatusENGTex, gPauseToQuestStatusGERTex, gPauseToQuestStatusFRATex }, + static const void* D_8082AD78[][4] = { + { gPauseToEquipmentENGTex, gPauseToEquipmentGERTex, gPauseToEquipmentFRATex, gPauseToEquipmentJPNTex }, + { gPauseToSelectItemENGTex, gPauseToSelectItemGERTex, gPauseToSelectItemFRATex, gPauseToSelectItemJPNTex }, + { gPauseToMapENGTex, gPauseToMapGERTex, gPauseToMapFRATex, gPauseToMapJPNTex }, + { gPauseToQuestStatusENGTex, gPauseToQuestStatusGERTex, gPauseToQuestStatusFRATex, gPauseToQuestStatusJPNTex }, }; - static void* D_8082ADA8[][3] = { - { gPauseToMapENGTex, gPauseToMapGERTex, gPauseToMapFRATex }, - { gPauseToQuestStatusENGTex, gPauseToQuestStatusGERTex, gPauseToQuestStatusFRATex }, - { gPauseToEquipmentENGTex, gPauseToEquipmentGERTex, gPauseToEquipmentFRATex }, - { gPauseToSelectItemENGTex, gPauseToSelectItemGERTex, gPauseToSelectItemFRATex }, + static void* D_8082ADA8[][4] = { + { gPauseToMapENGTex, gPauseToMapGERTex, gPauseToMapFRATex, gPauseToMapJPNTex }, + { gPauseToQuestStatusENGTex, gPauseToQuestStatusGERTex, gPauseToQuestStatusFRATex, gPauseToQuestStatusJPNTex }, + { gPauseToEquipmentENGTex, gPauseToEquipmentGERTex, gPauseToEquipmentFRATex, gPauseToEquipmentJPNTex }, + { gPauseToSelectItemENGTex, gPauseToSelectItemGERTex, gPauseToSelectItemFRATex, gPauseToSelectItemJPNTex }, }; - static u16 D_8082ADD8[3] = { 56, 88, 80 }; - static u16 D_8082ADE0[3] = { 64, 88, 72 }; - static u16 D_8082ADE8[3] = { 80, 104, 112 }; + static u16 D_8082ADD8[4] = { 56, 88, 80, 56 }; + static u16 D_8082ADE0[4] = { 64, 88, 72, 48 }; + static u16 D_8082ADE8[4] = { 80, 104, 112, 80 }; static s16 D_8082ADF0[][4] = { { 180, 210, 255, 220 }, { 100, 100, 150, 220 }, @@ -1759,6 +1968,13 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { s16 i; s16 j; + // #region SOH [NTSC] - register access assumes 3 languages, make jpn use same as eng + s32 languageOffset = gSaveContext.language; + if (languageOffset == LANGUAGE_JPN) { + languageOffset = LANGUAGE_ENG; + } + // #endregion + OPEN_DISPS(play->state.gfxCtx); stepR = ABS(D_808321A0 - D_8082ADF0[D_8082AE04][0]) / D_8082AE00; @@ -2021,13 +2237,13 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0); if (pauseCtx->state == 7) { - pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = WREG(61 + gSaveContext.language); + pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = WREG(61 + languageOffset); pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 24; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = - pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(52 + gSaveContext.language); + pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(52 + languageOffset); pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADE0[gSaveContext.language]; @@ -2072,13 +2288,13 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { (CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_ALWAYS_ON); if (!pauseCtx->pageIndex && (!pauseAnyCursor || (gSaveContext.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]] != ITEM_NONE))) { // pageIndex == PAUSE_ITEM pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = - WREG(49 + gSaveContext.language); + WREG(49 + languageOffset); pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 48; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = - pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(58 + gSaveContext.language); + pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(58 + languageOffset); pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADD8[gSaveContext.language]; @@ -2089,7 +2305,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { D_8082ADD8[gSaveContext.language] << 5; s16 PosX; // General Pos of C button icon - if (gSaveContext.language == LANGUAGE_ENG) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_JPN) { PosX = 112; } else if (gSaveContext.language == LANGUAGE_GER) { PosX = 175; @@ -2132,13 +2348,13 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { (pauseCtx->cursorSlot[PAUSE_QUEST] <= 0x11)) { if (pauseCtx->namedItem != PAUSE_ITEM_NONE) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = - WREG(55 + gSaveContext.language); + WREG(55 + languageOffset); pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 24; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = - pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(52 + gSaveContext.language); + pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(52 + languageOffset); if (gSaveContext.language == LANGUAGE_GER) { pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = @@ -2166,13 +2382,13 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { } } else if (pauseCtx->pageIndex == PAUSE_EQUIP) { pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = - WREG(64 + gSaveContext.language); + WREG(64 + languageOffset); pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] = pauseCtx->infoPanelVtx[16].v.ob[0] + 24; pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] = - pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(52 + gSaveContext.language); + pauseCtx->infoPanelVtx[16].v.ob[0] + WREG(52 + languageOffset); pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] = pauseCtx->infoPanelVtx[20].v.ob[0] + D_8082ADD8[gSaveContext.language]; @@ -2225,22 +2441,34 @@ void KaleidoScope_UpdateNamePanel(PlayState* play) { if (pauseCtx->namedItem != PAUSE_ITEM_NONE) { if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) { - if (gSaveContext.language) { + // #region SOH [NTSC] - There's a lot of OOB/Incorrect accesses that can occur so make sure sp2A selects something valid + sp2A %= 12; + // #endregion + if (gSaveContext.language >= LANGUAGE_GER) { sp2A += 12; } - if (gSaveContext.language == LANGUAGE_FRA) { + if (gSaveContext.language >= LANGUAGE_FRA) { + sp2A += 12; + } + if (gSaveContext.language >= LANGUAGE_JPN) { sp2A += 12; } const char* textureName = mapNameTextures[sp2A]; memcpy(pauseCtx->nameSegment, textureName, strlen(textureName) + 1); } else { + // #region SOH [NTSC] - There's a lot of OOB/Incorrect accesses that can occur so make sure sp2A selects something valid + sp2A %= 123; + // #endregion osSyncPrintf("zoom_name=%d\n", pauseCtx->namedItem); - if (gSaveContext.language) { + if (gSaveContext.language >= LANGUAGE_GER) { sp2A += 123; } - if (gSaveContext.language == LANGUAGE_FRA) { + if (gSaveContext.language >= LANGUAGE_FRA) { + sp2A += 123; + } + if (gSaveContext.language >= LANGUAGE_JPN) { sp2A += 123; } @@ -3714,7 +3942,8 @@ void KaleidoScope_Update(PlayState* play) osSyncPrintf("サイズ=%x\n", size2 + size1 + size0 + size + 0x800); if (((void)0, gSaveContext.worldMapArea) < 22) { - const uint8_t offsets[] = { 36, 58, 80 }; + // SOH [NTSC] - change offsets to fit jpn textures + const uint8_t offsets[] = { 48, 70, 92, 114 }; const char* textureName = mapNameTextures[offsets[gSaveContext.language] + gSaveContext.worldMapArea]; memcpy(pauseCtx->nameSegment + 0x400, textureName, strlen(textureName) + 1); } From ae029a3f06d6add4dea6292d3e581ba69a698234 Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 30 Mar 2025 13:54:40 -0400 Subject: [PATCH 166/267] Replace old methods with ShipUtils (#5151) * Replace old methods with ShipUtils * remove PAL naming --- soh/include/functions.h | 3 -- soh/soh/Enhancements/kaleido.cpp | 50 ++++++++++------------------ soh/soh/Enhancements/nametag.cpp | 31 ++++++----------- soh/soh/ShipUtils.cpp | 57 +++++++++++--------------------- soh/soh/ShipUtils.h | 4 +-- soh/src/code/z_kanfont.c | 12 +++---- soh/src/code/z_message_PAL.c | 4 --- soh/src/code/z_parameter.c | 46 +++++++------------------- 8 files changed, 68 insertions(+), 139 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index d7ba1a193..5631b417a 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -903,7 +903,6 @@ void KaleidoSetup_Init(PlayState* play); void KaleidoSetup_Destroy(PlayState* play); void func_8006EE50(Font* font, u16 arg1, u16 arg2); void Font_LoadChar(Font* font, u8 character, u16 codePointIndex); -void* Font_FetchCharTexture(u8 character); void Font_LoadMessageBoxIcon(Font* font, u16 icon); void Font_LoadOrderedFont(Font* font); s32 func_8006F0A0(s32 arg0); @@ -2418,7 +2417,6 @@ u8 Message_GetState(MessageContext* msgCtx); void Message_Draw(PlayState* play); void Message_Update(PlayState* play); void Message_SetTables(void); -f32 Message_GetCharacterWidth(unsigned char characterIndex); void GameOver_Init(PlayState* play); void GameOver_FadeInLights(PlayState* play); void GameOver_Update(PlayState* play); @@ -2454,7 +2452,6 @@ void Font_LoadOrderedFontNTSC(Font* font); // #region SOH [General] -void Interface_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH); void Interface_RandoRestoreSwordless(void); s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw, bool* shouldUpdate); diff --git a/soh/soh/Enhancements/kaleido.cpp b/soh/soh/Enhancements/kaleido.cpp index 4cddeef43..449d1612d 100644 --- a/soh/soh/Enhancements/kaleido.cpp +++ b/soh/soh/Enhancements/kaleido.cpp @@ -1,6 +1,7 @@ #include "kaleido.h" #include "soh/frame_interpolation.h" +#include "soh/ShipUtils.h" extern "C" { #include "z64.h" @@ -86,8 +87,6 @@ namespace Rando { // text mEntryDl->push_back(gsDPSetPrimColor(0, 0, textColor.r, textColor.g, textColor.b, textColor.a)); for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - uint16_t texIndex = mText[i] - 32; - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters // handle loading groups of 16 chars at a time until there are no more left to load. // By this point 4 vertices have already been loaded for the preceding icon. @@ -97,18 +96,14 @@ namespace Rando { vtxGroup++; } - if (texIndex != 0) { - auto texture = reinterpret_cast(Font_FetchCharTexture(texIndex)); - auto vertexStart = static_cast(4 * (i % 16)); + auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); + auto vertexStart = static_cast(4 * (i % 16)); - Gfx charTexture[] = {gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, - FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD)}; - mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); - mEntryDl->push_back( - gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } + Gfx charTexture[] = { gsDPLoadTextureBlock_4b( + texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); + mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); } mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); } @@ -303,15 +298,11 @@ namespace Rando { // 4 vertices per character, plus one for the preceding icon. Vtx* vertices = (Vtx*)calloc(sizeof(Vtx[4]), mText.length() + 1); // Vertex for the preceding icon. - Interface_CreateQuadVertexGroup(vertices, offsetX, offsetY, mIconWidth, mIconHeight, 0); + Ship_CreateQuadVertexGroup(vertices, offsetX, offsetY, mIconWidth, mIconHeight, 0); offsetX += 18; for (size_t i = 0; i < mText.length(); i++) { - auto charIndex = static_cast(mText[i] - 32); - int charWidth = 0; - if (charIndex >= 0) { - charWidth = static_cast(Message_GetCharacterWidth(charIndex) * (100.0f / R_TEXT_CHAR_SCALE)); - } - Interface_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0); + int charWidth = static_cast(Ship_GetCharFontWidth(mText[i])); + Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0); offsetX += charWidth; } offsetY += FONT_CHAR_TEX_HEIGHT; @@ -436,7 +427,6 @@ namespace Rando { // text for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { mEntryDl->push_back(gsDPSetPrimColor(0, 0, mButtonColors[i].r, mButtonColors[i].g, mButtonColors[i].b, mButtonColors[i].a)); - uint16_t texIndex = mText[i] - 32; // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters // handle loading groups of 16 chars at a time until there are no more left to load. @@ -447,18 +437,14 @@ namespace Rando { vtxGroup++; } - if (texIndex != 0) { - auto texture = reinterpret_cast(Font_FetchCharTexture(texIndex)); - auto vertexStart = static_cast(4 * (i % 16)); + auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); + auto vertexStart = static_cast(4 * (i % 16)); - Gfx charTexture[] = {gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, - FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD)}; - mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); - mEntryDl->push_back( - gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } + Gfx charTexture[] = { gsDPLoadTextureBlock_4b( + texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); + mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); } mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); } diff --git a/soh/soh/Enhancements/nametag.cpp b/soh/soh/Enhancements/nametag.cpp index 49b0891fa..131f9b724 100644 --- a/soh/soh/Enhancements/nametag.cpp +++ b/soh/soh/Enhancements/nametag.cpp @@ -118,8 +118,6 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { } for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - uint16_t texIndex = nameTag->processedText[i] - 32; - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters // handle loading groups of 16 chars at a time until there are no more left to load if (i % 16 == 0) { @@ -128,18 +126,16 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { vtxGroup++; } - if (texIndex != 0 && nameTag->processedText[i] != '\n') { - uintptr_t texture = (uintptr_t)Font_FetchCharTexture(texIndex); - int16_t vertexStart = 4 * (i % 16); + uintptr_t texture = (uintptr_t)Ship_GetCharFontTexture(nameTag->processedText[i]); + int16_t vertexStart = 4 * (i % 16); - // Multi-instruction macro, need to insert all to the dl buffer - Gfx charTexture[] = { gsDPLoadTextureBlock_4b( - texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; - nameTagDl.insert(nameTagDl.end(), std::begin(charTexture), std::end(charTexture)); + // Multi-instruction macro, need to insert all to the dl buffer + Gfx charTexture[] = { gsDPLoadTextureBlock_4b( + texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + nameTagDl.insert(nameTagDl.end(), std::begin(charTexture), std::end(charTexture)); - nameTagDl.push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } + nameTagDl.push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); } nameTagDl.push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); @@ -220,14 +216,9 @@ extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* te numLines++; } - int16_t charIndex = processedText[i] - 32; - int16_t charWidth = 0; - // Don't add width for newline chars - if (charIndex >= 0) { - charWidth = (int16_t)(Message_GetCharacterWidth(charIndex) * (100.0f / R_TEXT_CHAR_SCALE)); - } + int16_t charWidth = (int16_t)(Ship_GetCharFontWidth(processedText[i])); - Interface_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, (numLines - 1) * 16, charWidth, 16, 0); + Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, (numLines - 1) * 16, charWidth, 16, 0); offsetX += charWidth; if (offsetX > maxOffsetX) { @@ -238,7 +229,7 @@ extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* te // Vtx for textbox, add +/- 4 in all directions int16_t height = (numLines * 16) + 8; int16_t width = maxOffsetX + 8; - Interface_CreateQuadVertexGroup(vertices, -4, -4, width, height, 0); + Ship_CreateQuadVertexGroup(vertices, -4, -4, width, height, 0); // Update the texture coordinates to consume the full textbox texture size (including mirror region) vertices[1].v.tc[0] = 256 << 5; diff --git a/soh/soh/ShipUtils.cpp b/soh/soh/ShipUtils.cpp index 4760dbcd0..db1cb4acd 100644 --- a/soh/soh/ShipUtils.cpp +++ b/soh/soh/ShipUtils.cpp @@ -1,5 +1,6 @@ #include "ShipUtils.h" #include +#include "soh_assets.h" extern "C" { #include "z64.h" @@ -8,11 +9,8 @@ extern "C" { extern float OTRGetAspectRatio(); -//extern f32 sNESFontWidths[160]; -extern const char* fontTbl[156]; -//extern TexturePtr gItemIcons[131]; -//extern TexturePtr gQuestIcons[14]; -//extern TexturePtr gBombersNotebookPhotos[24]; +extern f32 sFontWidths[144]; +extern const char* fontTbl[140]; } constexpr f32 fourByThree = 4.0f / 3.0f; @@ -79,37 +77,22 @@ extern "C" void Ship_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, vtxList[3].v.tc[1] = height << 5; } -//extern "C" f32 Ship_GetCharFontWidthNES(u8 character) { -// u8 adjustedChar = character - ' '; -// -// if (adjustedChar >= ARRAY_COUNTU(sNESFontWidths)) { -// return 0.0f; -// } -// -// return sNESFontWidths[adjustedChar]; -//} +extern "C" f32 Ship_GetCharFontWidth(u8 character) { + u8 adjustedChar = character - ' '; -//extern "C" TexturePtr Ship_GetCharFontTextureNES(u8 character) { -// u8 adjustedChar = character - ' '; -// -// if (adjustedChar >= ARRAY_COUNTU(sNESFontWidths)) { -// return (TexturePtr)gEmptyTexture; -// } -// -// return (TexturePtr)fontTbl[adjustedChar]; -//} + if (adjustedChar >= ARRAY_COUNTU(sFontWidths)) { + return 0.0f; + } -//void LoadGuiTextures() { -// for (TexturePtr entry : gItemIcons) { -// const char* path = static_cast(entry); -// Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(path, path, ImVec4(1, 1, 1, 1)); -// } -// for (TexturePtr entry : gQuestIcons) { -// const char* path = static_cast(entry); -// Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(path, path, ImVec4(1, 1, 1, 1)); -// } -// for (TexturePtr entry : gBombersNotebookPhotos) { -// const char* path = static_cast(entry); -// Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(path, path, ImVec4(1, 1, 1, 1)); -// } -//} + return sFontWidths[adjustedChar]; +} + +extern "C" void* Ship_GetCharFontTexture(u8 character) { + u8 adjustedChar = character - ' '; + + if (adjustedChar >= ARRAY_COUNTU(fontTbl)) { + return (void*)gEmptyTexture; + } + + return (void*)fontTbl[adjustedChar]; +} diff --git a/soh/soh/ShipUtils.h b/soh/soh/ShipUtils.h index a1ac3081b..85fc89cc5 100644 --- a/soh/soh/ShipUtils.h +++ b/soh/soh/ShipUtils.h @@ -21,8 +21,8 @@ void Ship_ExtendedCullingActorRestoreProjectedPos(PlayState* play, Actor* actor) bool Ship_IsCStringEmpty(const char* str); void Ship_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH); -f32 Ship_GetCharFontWidthNES(u8 character); -//TexturePtr Ship_GetCharFontTextureNES(u8 character); +f32 Ship_GetCharFontWidth(u8 character); +void* Ship_GetCharFontTexture(u8 character); #ifdef __cplusplus } diff --git a/soh/src/code/z_kanfont.c b/soh/src/code/z_kanfont.c index b0b754b89..97ed4294c 100644 --- a/soh/src/code/z_kanfont.c +++ b/soh/src/code/z_kanfont.c @@ -7,7 +7,8 @@ #include "textures/kanji/kanji.h" #include "textures/message_static/message_static.h" -static const char* fntTbl[] = +// #region SOH [Port] Asset tables we can pull from instead of from ROM +const char* fontTbl[140] = { gMsgChar20SpaceTex, gMsgChar21ExclamationMarkTex, @@ -4138,6 +4139,7 @@ const char* msgStaticTbl[] = gMessageEndSquareTex, gMessageArrowTex }; +// #endregion void func_8006EE50(Font* font, u16 character, u16 codePointIndex) { // #region SOH [NTSC] @@ -4159,11 +4161,7 @@ void Font_LoadChar(Font* font, u8 character, u16 codePointIndex) { //__FILE__, __LINE__); if (character < 0x8B) - memcpy(&font->charTexBuf[codePointIndex], fntTbl[character], strlen(fntTbl[character]) + 1); -} - -void* Font_FetchCharTexture(u8 character) { - return fntTbl[character]; + memcpy(&font->charTexBuf[codePointIndex], fontTbl[character], strlen(fontTbl[character]) + 1); } /** @@ -4207,7 +4205,7 @@ void Font_LoadOrderedFont(Font* font) { osSyncPrintf("nes_mes_buf[%d]=%d\n", codePointIndex, font->msgBuf[codePointIndex]); offset = (font->msgBuf[codePointIndex] - '\x20') * FONT_CHAR_TEX_SIZE; - memcpy(fontBuf, fntTbl[offset / FONT_CHAR_TEX_SIZE], strlen(fntTbl[offset / FONT_CHAR_TEX_SIZE]) + 1); + memcpy(fontBuf, fontTbl[offset / FONT_CHAR_TEX_SIZE], strlen(fontTbl[offset / FONT_CHAR_TEX_SIZE]) + 1); //DmaMgr_SendRequest1(fontBuf, fontStatic + offset, FONT_CHAR_TEX_SIZE, __FILE__, __LINE__); fontBufIndex += FONT_CHAR_TEX_SIZE / 8; } diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 4ab76a93b..317f317ca 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -831,10 +831,6 @@ f32 sFontWidths[144] = { 14.0f, // ? }; -f32 Message_GetCharacterWidth(unsigned char characterIndex) { - return sFontWidths[characterIndex] * (R_TEXT_CHAR_SCALE / 100.0f); -} - u16 Message_DrawItemIcon(PlayState* play, u16 itemId, Gfx** p, u16 i) { s32 pad; Gfx* gfx = *p; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 6df6665ed..a221e570f 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -12,6 +12,7 @@ #include "soh/Enhancements/custom-message/CustomMessageInterfaceAddon.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" #include "soh/Enhancements/enhancementTypes.h" +#include "soh/ShipUtils.h" #include #include @@ -3591,31 +3592,6 @@ void Interface_DrawMagicBar(PlayState* play) { static Vtx sEnemyHealthVtx[16]; static Mtx sEnemyHealthMtx[2]; -// Build vertex coordinates for a quad command -// In order of top left, top right, bottom left, then bottom right -// Supports flipping the texture horizontally -void Interface_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH) { - vtxList[0].v.ob[0] = xStart; - vtxList[0].v.ob[1] = yStart; - vtxList[0].v.tc[0] = (flippedH ? width : 0) << 5; - vtxList[0].v.tc[1] = 0 << 5; - - vtxList[1].v.ob[0] = xStart + width; - vtxList[1].v.ob[1] = yStart; - vtxList[1].v.tc[0] = (flippedH ? width * 2 : width) << 5; - vtxList[1].v.tc[1] = 0 << 5; - - vtxList[2].v.ob[0] = xStart; - vtxList[2].v.ob[1] = yStart + height; - vtxList[2].v.tc[0] = (flippedH ? width : 0) << 5; - vtxList[2].v.tc[1] = height << 5; - - vtxList[3].v.ob[0] = xStart + width; - vtxList[3].v.ob[1] = yStart + height; - vtxList[3].v.tc[0] = (flippedH ? width * 2 : width) << 5; - vtxList[3].v.tc[1] = height << 5; -} - // Draws an enemy health bar using the magic bar textures and positions it in a similar way to Z-Targeting void Interface_DrawEnemyHealthBar(TargetContext* targetCtx, PlayState* play) { InterfaceContext* interfaceCtx = &play->interfaceCtx; @@ -3675,16 +3651,17 @@ void Interface_DrawEnemyHealthBar(TargetContext* targetCtx, PlayState* play) { } // Health bar border end left - Interface_CreateQuadVertexGroup(&sEnemyHealthVtx[0], -floorf(halfBarWidth), -texHeight / 2, endTexWidth, texHeight, 0); + Ship_CreateQuadVertexGroup(&sEnemyHealthVtx[0], -floorf(halfBarWidth), -texHeight / 2, endTexWidth, texHeight, + 0); // Health bar border middle - Interface_CreateQuadVertexGroup(&sEnemyHealthVtx[4], -floorf(halfBarWidth) + endTexWidth, -texHeight / 2, - healthbar_fillWidth, texHeight, 0); + Ship_CreateQuadVertexGroup(&sEnemyHealthVtx[4], -floorf(halfBarWidth) + endTexWidth, -texHeight / 2, + healthbar_fillWidth, texHeight, 0); // Health bar border end right - Interface_CreateQuadVertexGroup(&sEnemyHealthVtx[8], ceilf(halfBarWidth) - endTexWidth, -texHeight / 2, endTexWidth, - texHeight, 1); + Ship_CreateQuadVertexGroup(&sEnemyHealthVtx[8], ceilf(halfBarWidth) - endTexWidth, -texHeight / 2, endTexWidth, + texHeight, 1); // Health bar fill - Interface_CreateQuadVertexGroup(&sEnemyHealthVtx[12], -floorf(halfBarWidth) + endTexWidth, (-texHeight / 2) + 3, - healthBarFill, 7, 0); + Ship_CreateQuadVertexGroup(&sEnemyHealthVtx[12], -floorf(halfBarWidth) + endTexWidth, (-texHeight / 2) + 3, + healthBarFill, 7, 0); if (((!(player->stateFlags1 & PLAYER_STATE1_TALKING)) || (actor != player->focusActor)) && targetCtx->unk_44 < 500.0f) { f32 slideInOffsetY = 0; @@ -6713,11 +6690,12 @@ uint16_t Interface_DrawTextLine(GraphicsContext* gfx, char text[], int16_t x, in textureIndex = processedText[i] - 32; if (textureIndex != 0) { - texture = Font_FetchCharTexture(textureIndex); + texture = Ship_GetCharFontTexture(processedText[i]); Interface_DrawTextCharacter(gfx, x + kerningOffset, y + lineOffset, texture, colorR, colorG, colorB, colorA, textScale, textShadow); } - kerningOffset += (uint16_t)(Message_GetCharacterWidth(textureIndex) * textScale); + kerningOffset += + (uint16_t)(Ship_GetCharFontWidth(processedText[i]) * (R_TEXT_CHAR_SCALE / 100.0f) * textScale); } } From e21d322a220756a5d2d89a11b7de7269b293dac0 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 30 Mar 2025 11:18:19 -0700 Subject: [PATCH 167/267] Convert grass shuffle locations to use automatic spoiler name creation. (#5243) --- .../Enhancements/randomizer/ShuffleGrass.cpp | 690 +++++++++--------- soh/soh/Enhancements/randomizer/location.cpp | 5 +- soh/soh/Enhancements/randomizer/location.h | 2 +- 3 files changed, 348 insertions(+), 349 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index ff81778a5..92eb1cb9c 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -162,355 +162,355 @@ void Rando::StaticData::RegisterGrassLocations() { registered = true; // clang-format off // Overworld Grass - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); - locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "Child Grass 2", "Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2)); - locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "Child Grass 3", "Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3)); - locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "Child Grass 4", "Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4)); - locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "Child Grass 5", "Child Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5)); - locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "Child Grass 6", "Child Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6)); - locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "Child Grass 7", "Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7)); - locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "Child Grass 8", "Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8)); - locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "Child Grass 9", "Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9)); - locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "Child Grass 10", "Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10)); - locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "Child Grass 11", "Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11)); - locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "Child Grass 12", "Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12)); - locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "Child Grass Maze 1", "Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1)); - locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "Child Grass Maze 2", "Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2)); - locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "Child Grass Maze 3", "Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3)); - locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "Adult Grass 1", "Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1)); - locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "Adult Grass 2", "Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2)); - locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "Adult Grass 3", "Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3)); - locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "Adult Grass 4", "Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4)); - locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "Adult Grass 5", "Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5)); - locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "Adult Grass 6", "Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6)); - locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "Adult Grass 7", "Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7)); - locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "Adult Grass 8", "Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8)); - locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "Adult Grass 9", "Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9)); - locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "Adult Grass 10", "Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10)); - locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "Adult Grass 11", "Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11)); - locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "Adult Grass 12", "Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12)); - locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "Adult Grass 13", "Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13)); - locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "Adult Grass 14", "Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14)); - locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "Adult Grass 15", "Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15)); - locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "Adult Grass 16", "Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16)); - locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "Adult Grass 17", "Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17)); - locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "Adult Grass 18", "Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18)); - locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 0xFF), "Adult Grass 19", "Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19)); - locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 0xFF), "Adult Grass 20", "Adult Grass 20", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20)); - locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "Near Shortcuts Grass 1", "Near Shortcuts Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1)); - locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "Near Shortcuts Grass 2", "Near Shortcuts Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2)); - locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "Near Shortcuts Grass 3", "Near Shortcuts Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3)); - locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "After Mido Grass 1", "After Mido Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4)); - locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "After Mido Grass 2", "After Mido Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5)); - locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "After Mido Grass 3", "After Mido Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6)); - locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "Near SFM Grass 1", "Near SFM Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7)); - locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "Near SFM Grass 2", "Near SFM Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8)); - locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "Near SFM Grass 3", "Near SFM Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9)); - locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1)); - locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2)); - locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3)); - locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4)); - locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5)); - locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6)); - locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7)); - locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8)); - locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Near Storms Grotto Grass 1", "Near Storms Grotto Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1)); - locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Near Storms Grotto Grass 2", "Near Storms Grotto Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2)); - locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Near Graveyard Grass 1", "Near Graveyard Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1)); - locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Near Graveyard Grass 2", "Near Graveyard Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2)); - locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Near Graveyard Grass 3", "Near Graveyard Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3)); - locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Tree Grass 1", "Tree Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4)); - locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Tree Grass 2", "Tree Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5)); - locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Tree Grass 3", "Tree Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6)); - locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Tree Grass 4", "Tree Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7)); - locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Tree Grass 5", "Tree Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8)); - locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1)); - locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2)); - locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3)); - locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4)); - locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5)); - locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6)); - locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7)); - locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8)); - locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9)); - locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10)); - locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11)); - locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12)); - locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1)); - locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2)); - locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3)); - locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4)); - locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5)); - locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6)); - locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7)); - locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8)); - locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9)); - locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10)); - locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11)); - locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12)); - locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13)); - locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14)); - locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15)); - locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16)); - locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17)); - locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18)); - locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19)); - locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20)); - locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21)); - locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22)); - locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23)); - locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24)); - locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25)); - locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26)); - locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27)); - locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28)); - locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29)); - locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30)); - locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31)); - locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32)); - locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33)); - locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34)); - locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35)); - locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36)); - locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1)); - locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2)); - locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3)); - locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4)); - locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1)); - locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2)); - locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "Near KF Grass 1", "Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1)); - locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "Near KF Grass 2", "Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2)); - locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "Near KF Grass 3", "Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3)); - locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "Near KF Grass 4", "Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4)); - locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "Near KF Grass 5", "Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5)); - locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "Near KF Grass 6", "Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6)); - locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "Near KF Grass 7", "Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7)); - locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "Near KF Grass 8", "Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8)); - locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "Near KF Grass 9", "Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9)); - locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "Near KF Grass 10", "Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10)); - locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "Near KF Grass 11", "Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11)); - locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "Near KF Grass 12", "Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12)); - locationTable[RC_HF_NEAR_MARKET_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "Near Market Grass 1", "Near Market Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_1)); - locationTable[RC_HF_NEAR_MARKET_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "Near Market Grass 2", "Near Market Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_2)); - locationTable[RC_HF_NEAR_MARKET_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "Near Market Grass 3", "Near Market Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_3)); - locationTable[RC_HF_NEAR_MARKET_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "Near Market Grass 4", "Near Market Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_4)); - locationTable[RC_HF_NEAR_MARKET_GRASS_5] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "Near Market Grass 5", "Near Market Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_5)); - locationTable[RC_HF_NEAR_MARKET_GRASS_6] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "Near Market Grass 6", "Near Market Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_6)); - locationTable[RC_HF_NEAR_MARKET_GRASS_7] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "Near Market Grass 7", "Near Market Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_7)); - locationTable[RC_HF_NEAR_MARKET_GRASS_8] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "Near Market Grass 8", "Near Market Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_8)); - locationTable[RC_HF_NEAR_MARKET_GRASS_9] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "Near Market Grass 9", "Near Market Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_9)); - locationTable[RC_HF_NEAR_MARKET_GRASS_10] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "Near Market Grass 10", "Near Market Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_10)); - locationTable[RC_HF_NEAR_MARKET_GRASS_11] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "Near Market Grass 11", "Near Market Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_11)); - locationTable[RC_HF_NEAR_MARKET_GRASS_12] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "Near Market Grass 12", "Near Market Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_12)); - locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "South Grass 1", "South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1)); - locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "South Grass 2", "South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2)); - locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "South Grass 3", "South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3)); - locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "South Grass 4", "South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4)); - locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "South Grass 5", "South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5)); - locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "South Grass 6", "South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6)); - locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "South Grass 7", "South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7)); - locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "South Grass 8", "South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8)); - locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "South Grass 9", "South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9)); - locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "South Grass 10", "South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10)); - locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "South Grass 11", "South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11)); - locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "South Grass 12", "South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12)); - locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "Central Grass 1", "Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1)); - locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "Central Grass 2", "Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2)); - locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "Central Grass 3", "Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3)); - locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "Central Grass 4", "Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4)); - locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "Central Grass 5", "Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5)); - locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "Central Grass 6", "Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6)); - locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "Central Grass 7", "Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7)); - locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "Central Grass 8", "Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8)); - locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "Central Grass 9", "Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9)); - locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "Central Grass 10", "Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10)); - locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "Central Grass 11", "Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11)); - locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "Central Grass 12", "Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12)); - locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "Near Tree Grass 1", "Near Tree Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1)); - locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "Near Tree Grass 2", "Near Tree Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2)); - locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "Near Tree Grass 3", "Near Tree Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3)); - locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "Near Tree Grass 4", "Near Tree Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4)); - locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "Near Tree Grass 5", "Near Tree Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5)); - locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "Near Tree Grass 6", "Near Tree Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6)); - locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "Near Tree Grass 7", "Near Tree Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7)); - locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "Near Tree Grass 8", "Near Tree Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8)); - locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "Near Tree Grass 9", "Near Tree Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9)); - locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "Near Tree Grass 10", "Near Tree Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10)); - locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "Near Tree Grass 11", "Near Tree Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11)); - locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "Near Tree Grass 12", "Near Tree Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12)); - locationTable[RC_ZR_NEAR_FREESTANDING_POH_GRASS] = Location::Grass(RC_ZR_NEAR_FREESTANDING_POH_GRASS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "Near Freestanding PoH Grass", "Near Freestanding PoH Grass", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1)); + locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2)); + locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3)); + locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4)); + locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "Child Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5)); + locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "Child Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6)); + locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7)); + locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8)); + locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9)); + locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10)); + locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11)); + locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12)); + locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1)); + locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2)); + locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3)); + locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1)); + locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2)); + locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3)); + locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4)); + locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5)); + locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6)); + locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7)); + locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8)); + locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9)); + locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10)); + locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11)); + locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12)); + locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13)); + locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14)); + locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15)); + locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16)); + locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17)); + locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18)); + locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 0xFF), "Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19)); + locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 0xFF), "Adult Grass 20", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20)); + locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "Near Shortcuts Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1)); + locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "Near Shortcuts Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2)); + locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "Near Shortcuts Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3)); + locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "After Mido Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4)); + locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "After Mido Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5)); + locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "After Mido Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6)); + locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "Near SFM Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7)); + locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "Near SFM Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8)); + locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "Near SFM Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9)); + locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1)); + locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2)); + locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3)); + locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4)); + locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5)); + locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6)); + locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7)); + locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8)); + locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Near Storms Grotto Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1)); + locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Near Storms Grotto Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2)); + locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Near Graveyard Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1)); + locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Near Graveyard Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2)); + locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Near Graveyard Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3)); + locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Tree Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4)); + locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Tree Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5)); + locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Tree Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6)); + locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Tree Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7)); + locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Tree Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8)); + locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1)); + locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2)); + locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3)); + locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4)); + locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5)); + locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6)); + locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7)); + locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8)); + locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9)); + locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10)); + locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11)); + locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12)); + locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1)); + locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2)); + locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3)); + locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4)); + locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5)); + locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6)); + locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7)); + locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8)); + locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9)); + locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10)); + locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11)); + locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12)); + locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13)); + locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14)); + locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15)); + locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16)); + locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17)); + locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18)); + locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19)); + locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20)); + locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21)); + locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22)); + locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23)); + locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24)); + locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25)); + locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26)); + locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27)); + locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28)); + locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29)); + locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30)); + locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31)); + locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32)); + locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33)); + locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34)); + locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35)); + locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36)); + locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1)); + locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2)); + locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3)); + locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4)); + locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1)); + locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1)); + locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2)); + locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3)); + locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4)); + locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5)); + locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6)); + locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7)); + locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8)); + locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9)); + locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10)); + locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11)); + locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12)); + locationTable[RC_HF_NEAR_MARKET_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "Near Market Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "Near Market Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "Near Market Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "Near Market Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GRASS_5] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "Near Market Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_5)); + locationTable[RC_HF_NEAR_MARKET_GRASS_6] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "Near Market Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_6)); + locationTable[RC_HF_NEAR_MARKET_GRASS_7] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "Near Market Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_7)); + locationTable[RC_HF_NEAR_MARKET_GRASS_8] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "Near Market Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_8)); + locationTable[RC_HF_NEAR_MARKET_GRASS_9] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "Near Market Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_9)); + locationTable[RC_HF_NEAR_MARKET_GRASS_10] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "Near Market Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_10)); + locationTable[RC_HF_NEAR_MARKET_GRASS_11] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "Near Market Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_11)); + locationTable[RC_HF_NEAR_MARKET_GRASS_12] = Location::Grass(RC_HF_NEAR_MARKET_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "Near Market Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GRASS_12)); + locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1)); + locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2)); + locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3)); + locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4)); + locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5)); + locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6)); + locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7)); + locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8)); + locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9)); + locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10)); + locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11)); + locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12)); + locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1)); + locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2)); + locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3)); + locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4)); + locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5)); + locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6)); + locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7)); + locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8)); + locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9)); + locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10)); + locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11)); + locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12)); + locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "Near Tree Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1)); + locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "Near Tree Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2)); + locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "Near Tree Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3)); + locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "Near Tree Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4)); + locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "Near Tree Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5)); + locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "Near Tree Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6)); + locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "Near Tree Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7)); + locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "Near Tree Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8)); + locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "Near Tree Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9)); + locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "Near Tree Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10)); + locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "Near Tree Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11)); + locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "Near Tree Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12)); + locationTable[RC_ZR_NEAR_FREESTANDING_POH_GRASS] = Location::Grass(RC_ZR_NEAR_FREESTANDING_POH_GRASS, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "Near Freestanding PoH Grass", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS)); // Grotto Grass - locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x2C), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1)); - locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x2C), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2)); - locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x2C), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3)); - locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Base(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KOKIRI_FOREST, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x2C), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x14), "Near Shortcuts Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x14), "Near Shortcuts Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x14), "Near Shortcuts Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3)); - locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4] = Location::Base(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_LOST_WOODS, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x14), "Near Shortcuts Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_1] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x00), "Near Market Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_2] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x00), "Near Market Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_3] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x00), "Near Market Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3)); - locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_4] = Location::Base(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x00), "Near Market Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4)); - locationTable[RC_HF_OPEN_GROTTO_GRASS_1] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x03), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_1)); - locationTable[RC_HF_OPEN_GROTTO_GRASS_2] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x03), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_2)); - locationTable[RC_HF_OPEN_GROTTO_GRASS_3] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x03), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_3)); - locationTable[RC_HF_OPEN_GROTTO_GRASS_4] = Location::Base(RC_HF_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x03), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_4)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_1] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x22), "Southeast Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_2] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x22), "Southeast Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_3] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x22), "Southeast Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3)); - locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_4] = Location::Base(RC_HF_SOUTHEAST_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x22), "Southeast Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4)); - locationTable[RC_HF_COW_GROTTO_GRASS_1] = Location::Base(RC_HF_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3419, 0xE4), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_1)); - locationTable[RC_HF_COW_GROTTO_GRASS_2] = Location::Base(RC_HF_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_HYRULE_FIELD, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3518, 0xE4), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_2)); - locationTable[RC_KAK_OPEN_GROTTO_GRASS_1] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x28), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_1)); - locationTable[RC_KAK_OPEN_GROTTO_GRASS_2] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x28), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_2)); - locationTable[RC_KAK_OPEN_GROTTO_GRASS_3] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x28), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_3)); - locationTable[RC_KAK_OPEN_GROTTO_GRASS_4] = Location::Base(RC_KAK_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_KAKARIKO_VILLAGE, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x28), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_4)); - locationTable[RC_DMT_STORMS_GROTTO_GRASS_1] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x57), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_1)); - locationTable[RC_DMT_STORMS_GROTTO_GRASS_2] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x57), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_2)); - locationTable[RC_DMT_STORMS_GROTTO_GRASS_3] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x57), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_3)); - locationTable[RC_DMT_STORMS_GROTTO_GRASS_4] = Location::Base(RC_DMT_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x57), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_4)); - locationTable[RC_DMT_COW_GROTTO_GRASS_1] = Location::Base(RC_DMT_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2443, 0xF8), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_1)); - locationTable[RC_DMT_COW_GROTTO_GRASS_2] = Location::Base(RC_DMT_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2494, 0xF8), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_2)); - locationTable[RC_DMC_UPPER_GROTTO_GRASS_1] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x7A), "Upper Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_1)); - locationTable[RC_DMC_UPPER_GROTTO_GRASS_2] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x7A), "Upper Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_2)); - locationTable[RC_DMC_UPPER_GROTTO_GRASS_3] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x7A), "Upper Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_3)); - locationTable[RC_DMC_UPPER_GROTTO_GRASS_4] = Location::Base(RC_DMC_UPPER_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x7A), "Upper Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_4)); - locationTable[RC_ZR_OPEN_GROTTO_GRASS_1] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x29), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_1)); - locationTable[RC_ZR_OPEN_GROTTO_GRASS_2] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x29), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_2)); - locationTable[RC_ZR_OPEN_GROTTO_GRASS_3] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x29), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_3)); - locationTable[RC_ZR_OPEN_GROTTO_GRASS_4] = Location::Base(RC_ZR_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCTYPE_GRASS, RCAREA_ZORAS_RIVER, ACTOR_EN_KUSA, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x29), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_4)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x2C), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x2C), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x2C), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3)); + locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x2C), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x14), "Near Shortcuts Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x14), "Near Shortcuts Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x14), "Near Shortcuts Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3)); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4] = Location::Grass(RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x14), "Near Shortcuts Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_1] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x00), "Near Market Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_2] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x00), "Near Market Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_3] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x00), "Near Market Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3)); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GRASS_4] = Location::Grass(RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x00), "Near Market Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_1] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x03), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_1)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_2] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x03), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_2)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_3] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x03), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_3)); + locationTable[RC_HF_OPEN_GROTTO_GRASS_4] = Location::Grass(RC_HF_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x03), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_OPEN_GROTTO_GRASS_4)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_1] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x22), "Southeast Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_2] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x22), "Southeast Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_3] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x22), "Southeast Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3)); + locationTable[RC_HF_SOUTHEAST_GROTTO_GRASS_4] = Location::Grass(RC_HF_SOUTHEAST_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x22), "Southeast Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4)); + locationTable[RC_HF_COW_GROTTO_GRASS_1] = Location::Grass(RC_HF_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3419, 0xE4), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_1)); + locationTable[RC_HF_COW_GROTTO_GRASS_2] = Location::Grass(RC_HF_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3518, 0xE4), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_1] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x28), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_1)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_2] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x28), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_2)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_3] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x28), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_3)); + locationTable[RC_KAK_OPEN_GROTTO_GRASS_4] = Location::Grass(RC_KAK_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x28), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_OPEN_GROTTO_GRASS_4)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_1] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x57), "Storms Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_1)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_2] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x57), "Storms Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_2)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_3] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x57), "Storms Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_3)); + locationTable[RC_DMT_STORMS_GROTTO_GRASS_4] = Location::Grass(RC_DMT_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x57), "Storms Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_STORMS_GROTTO_GRASS_4)); + locationTable[RC_DMT_COW_GROTTO_GRASS_1] = Location::Grass(RC_DMT_COW_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2443, 0xF8), "Cow Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_1)); + locationTable[RC_DMT_COW_GROTTO_GRASS_2] = Location::Grass(RC_DMT_COW_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2494, 0xF8), "Cow Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_1] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x7A), "Upper Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_1)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_2] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x7A), "Upper Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_2)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_3] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x7A), "Upper Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_3)); + locationTable[RC_DMC_UPPER_GROTTO_GRASS_4] = Location::Grass(RC_DMC_UPPER_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x7A), "Upper Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_UPPER_GROTTO_GRASS_4)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_1] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, 0x29), "Open Grotto Grass 1", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_1)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_2] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, 0x29), "Open Grotto Grass 2", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_2)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_3] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, 0x29), "Open Grotto Grass 3", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_3)); + locationTable[RC_ZR_OPEN_GROTTO_GRASS_4] = Location::Grass(RC_ZR_OPEN_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, 0x29), "Open Grotto Grass 4", RHT_GROTTO_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_OPEN_GROTTO_GRASS_4)); // Dungeon Grass - locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Deku Tree Lobby Grass 1", "Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1)); - locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Deku Tree Lobby Grass 2", "Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2)); - locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Deku Tree Lobby Grass 3", "Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3)); - locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Deku Tree Lobby Grass 4", "Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4)); - locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Deku Tree Lobby Grass 5", "Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5)); - locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1018, 1263), "Deku Tree Slingshot Grass 1", "Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1)); - locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1005, 1216), "Deku Tree Slingshot Grass 2", "Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2)); - locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1280, 1026), "Deku Tree Slingshot Grass 3", "Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3)); - locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1229, 1006), "Deku Tree Slingshot Grass 4", "Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4)); - locationTable[RC_DEKU_TREE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1444, 169), "Deku Tree Compass Grass 1", "Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_1)); - locationTable[RC_DEKU_TREE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1516, 142), "Deku Tree Compass Grass 2", "Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_2)); - locationTable[RC_DEKU_TREE_BASEMENT_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 130), "Deku Tree Basement Grass 1", "Deku Tree Basement Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1)); - locationTable[RC_DEKU_TREE_BASEMENT_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 187), "Deku Tree Basement Grass 2", "Deku Tree Basement Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2)); - locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-228, 792), "Deku Tree Eye Switch Grass 1", "Deku Tree Eye Switch Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1)); - locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-202, 751), "Deku Tree Eye Switch Grass 2", "Deku Tree Eye Switch Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2)); - locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(79, 794), "Deku Tree Eye Switch Grass 3", "Deku Tree Eye Switch Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3)); - locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(49, 752), "Deku Tree Eye Switch Grass 4", "Deku Tree Eye Switch Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4)); - locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1310, 840), "Deku Tree Spike Roller Grass 1", "Deku Tree Spike Roller Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1)); - locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1361, 840), "Deku Tree Spike Roller Grass 2", "Deku Tree Spike Roller Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2)); - locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1796, 821), "Deku Tree Torches Grass 1", "Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1)); - locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1919, 820), "Deku Tree Torches Grass 2", "Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2)); - locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1955, -296), "Deku Tree Larvae Grass 1", "Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1)); - locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2025, -301), "Deku Tree Larvae Grass 2", "Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2)); - locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -515), "Deku Tree Before Boss Grass 1", "Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1)); - locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -577), "Deku Tree Before Boss Grass 2", "Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2)); - locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-269, -643), "Deku Tree Before Boss Grass 3", "Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3)); - locationTable[RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-760, -465), "Dodongo's Cavern First Bridge Grass", "Dodongo's Cavern First Bridge Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS)); - locationTable[RC_DODONGOS_CAVERN_BLADE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BLADE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1713, -1246), "Dodongo's Cavern Blade Room Grass", "Dodongo's Cavern Blade Room Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3189, -485), "Dodongo's Cavern Single Eye Grass", "Dodongo's Cavern Single Eye Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS)); - locationTable[RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-249, -2519), "Dodongo's Cavern Before Boss Grass", "Dodongo's Cavern Before Boss Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-858, -1330), "Bottom of the Well Basement Behind Rocks Grass 1", "Bottom of the Well Basement Behind Rocks Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-870, -1021), "Bottom of the Well Basement Behind Rocks Grass 2", "Bottom of the Well Basement Behind Rocks Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-872, -1383), "Bottom of the Well Basement Behind Rocks Grass 3", "Bottom of the Well Basement Behind Rocks Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-874, -1447), "Bottom of the Well Basement Behind Rocks Grass 4", "Bottom of the Well Basement Behind Rocks Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-886, -1263), "Bottom of the Well Basement Behind Rocks Grass 5", "Bottom of the Well Basement Behind Rocks Grass 5", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-918, -1131), "Bottom of the Well Basement Behind Rocks Grass 6", "Bottom of the Well Basement Behind Rocks Grass 6", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-943, -1316), "Bottom of the Well Basement Behind Rocks Grass 7", "Bottom of the Well Basement Behind Rocks Grass 7", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1377), "Bottom of the Well Basement Behind Rocks Grass 8", "Bottom of the Well Basement Behind Rocks Grass 8", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1463), "Bottom of the Well Basement Behind Rocks Grass 9", "Bottom of the Well Basement Behind Rocks Grass 9", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-619, -627), "Bottom of the Well Basement Grass 1", "Bottom of the Well Basement Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-565, -654), "Bottom of the Well Basement Grass 2", "Bottom of the Well Basement Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-552, -711), "Bottom of the Well Basement Grass 3", "Bottom of the Well Basement Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1018, 1263), "Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1005, 1216), "Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1280, 1026), "Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_SLINGSHOT_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1229, 1006), "Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1444, 169), "Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_COMPASS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1516, 142), "Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 130), "Basement Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(48, 187), "Basement Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-228, 792), "Eye Switch Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-202, 751), "Eye Switch Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(79, 794), "Eye Switch Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3)); + locationTable[RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4] = Location::Grass(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(49, 752), "Eye Switch Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1310, 840), "Spike Roller Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1361, 840), "Spike Roller Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1796, 821), "Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1919, 820), "Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1955, -296), "Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2025, -301), "Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -515), "Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-273, -577), "Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RCQUEST_VANILLA, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-269, -643), "Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-760, -465), "First Bridge Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BLADE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BLADE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1713, -1246), "Blade Room Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3189, -485), "Single Eye Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-249, -2519), "Before Boss Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-858, -1330), "Basement Behind Rocks Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-870, -1021), "Basement Behind Rocks Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-872, -1383), "Basement Behind Rocks Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-874, -1447), "Basement Behind Rocks Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-886, -1263), "Basement Behind Rocks Grass 5", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-918, -1131), "Basement Behind Rocks Grass 6", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-943, -1316), "Basement Behind Rocks Grass 7", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1377), "Basement Behind Rocks Grass 8", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-956, -1463), "Basement Behind Rocks Grass 9", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-619, -627), "Basement Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-565, -654), "Basement Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-552, -711), "Basement Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3)); // MQ Dungeon Grass - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(392, -158), "MQ Deku Tree Lobby Grass 1", "MQ Deku Tree Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(356, -235), "MQ Deku Tree Lobby Grass 2", "MQ Deku Tree Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(308, -291), "MQ Deku Tree Lobby Grass 3", "MQ Deku Tree Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(81, -416), "MQ Deku Tree Lobby Grass 4", "MQ Deku Tree Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(143, -401), "MQ Deku Tree Lobby Grass 5", "MQ Deku Tree Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-11, -344), "MQ Deku Tree Lobby Grass 6", "MQ Deku Tree Lobby Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6)); - locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-159, -302), "MQ Deku Tree Lobby Grass 7", "MQ Deku Tree Lobby Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-636, 161), "MQ Deku Tree Slingshot Grass 1", "MQ Deku Tree Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-693, 182), "MQ Deku Tree Slingshot Grass 2", "MQ Deku Tree Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1443, 167), "MQ Deku Tree Slingshot Grass 3", "MQ Deku Tree Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1515, 140), "MQ Deku Tree Slingshot Grass 4", "MQ Deku Tree Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-753, 614), "MQ Deku Tree Before Compass Grass 1", "MQ Deku Tree Before Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-736, 795), "MQ Deku Tree Before Compass Grass 2", "MQ Deku Tree Before Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-575, 627), "MQ Deku Tree Before Compass Grass 3", "MQ Deku Tree Before Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-572, 727), "MQ Deku Tree Before Compass Grass 4", "MQ Deku Tree Before Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-788, 702), "MQ Deku Tree Before Compass Grass 5", "MQ Deku Tree Before Compass Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-654, 582), "MQ Deku Tree Before Compass Grass 6", "MQ Deku Tree Before Compass Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-643, 798), "MQ Deku Tree Before Compass Grass 7", "MQ Deku Tree Before Compass Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7)); - locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1279, 1024), "MQ Deku Tree Compass Grass 1", "MQ Deku Tree Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1228, 1004), "MQ Deku Tree Compass Grass 2", "MQ Deku Tree Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1017, 1261), "MQ Deku Tree Compass Grass 3", "MQ Deku Tree Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1004, 1214), "MQ Deku Tree Compass Grass 4", "MQ Deku Tree Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-15, -261), "MQ Deku Tree Basement Lower Grass 1", "MQ Deku Tree Basement Lower Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-7, -328), "MQ Deku Tree Basement Lower Grass 2", "MQ Deku Tree Basement Lower Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(5, 119), "MQ Deku Tree Basement Lower Grass 3", "MQ Deku Tree Basement Lower Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-39, 118), "MQ Deku Tree Basement Lower Grass 4", "MQ Deku Tree Basement Lower Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-807, -228), "MQ Deku Tree Basement Upper Grass 1", "MQ Deku Tree Basement Upper Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-764, 280), "MQ Deku Tree Basement Upper Grass 2", "MQ Deku Tree Basement Upper Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, 237), "MQ Deku Tree Basement Upper Grass 3", "MQ Deku Tree Basement Upper Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-466, 865), "MQ Deku Tree Spike Roller Front Grass 1", "MQ Deku Tree Spike Roller Front Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-495, 906), "MQ Deku Tree Spike Roller Front Grass 2", "MQ Deku Tree Spike Roller Front Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-538, 907), "MQ Deku Tree Spike Roller Front Grass 3", "MQ Deku Tree Spike Roller Front Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1360, 838), "MQ Deku Tree Spike Roller Back Grass 1", "MQ Deku Tree Spike Roller Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1309, 838), "MQ Deku Tree Spike Roller Back Grass 2", "MQ Deku Tree Spike Roller Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-227, 790), "MQ Deku Tree Torches Grass 1", "MQ Deku Tree Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-201, 749), "MQ Deku Tree Torches Grass 2", "MQ Deku Tree Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(50, 750), "MQ Deku Tree Torches Grass 3", "MQ Deku Tree Torches Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, 792), "MQ Deku Tree Torches Grass 4", "MQ Deku Tree Torches Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1795, 819), "MQ Deku Tree Larvae Grass 1", "MQ Deku Tree Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1918, 818), "MQ Deku Tree Larvae Grass 2", "MQ Deku Tree Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1678, -120), "MQ Deku Tree Graves Grass 1", "MQ Deku Tree Graves Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1700, 196), "MQ Deku Tree Graves Grass 2", "MQ Deku Tree Graves Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2165, 350), "MQ Deku Tree Graves Grass 3", "MQ Deku Tree Graves Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2215, 56), "MQ Deku Tree Graves Grass 4", "MQ Deku Tree Graves Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1901, 604), "MQ Deku Tree Graves Grass 5", "MQ Deku Tree Graves Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2708, -522), "MQ Deku Tree Back Grass 1", "MQ Deku Tree Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2395, -587), "MQ Deku Tree Back Grass 2", "MQ Deku Tree Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2553, -433), "MQ Deku Tree Back Grass 3", "MQ Deku Tree Back Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -517), "MQ Deku Tree Before Boss Grass 1", "MQ Deku Tree Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -579), "MQ Deku Tree Before Boss Grass 2", "MQ Deku Tree Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2)); - locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-268, -645), "MQ Deku Tree Before Boss Grass 3", "MQ Deku Tree Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1721, -579), "MQ Dodongo's Cavern Compass Grass 1", "MQ Dodongo's Cavern Compass Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1731, -45), "MQ Dodongo's Cavern Compass Grass 2", "MQ Dodongo's Cavern Compass Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2218, -56), "MQ Dodongo's Cavern Compass Grass 3", "MQ Dodongo's Cavern Compass Grass 3", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2230, -556), "MQ Dodongo's Cavern Compass Grass 4", "MQ Dodongo's Cavern Compass Grass 4", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1765, -3940), "MQ Dodongo's Cavern Armos Grass", "MQ Dodongo's Cavern Armos Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1285, -4693), "MQ Dodongo's Cavern Back Poe Grass", "MQ Dodongo's Cavern Back Poe Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS)); - locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2644, -3368), "MQ Dodongo's Cavern Scrub Grass 1", "MQ Dodongo's Cavern Scrub Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2614, -3387), "MQ Dodongo's Cavern Scrub Grass 2", "MQ Dodongo's Cavern Scrub Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-219, -61), "MQ Jabu Jabu's Belly First Grass 1", "MQ Jabu Jabu's Belly First Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(213, -398), "MQ Jabu Jabu's Belly First Grass 2", "MQ Jabu Jabu's Belly First Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3209), "MQ Jabu Jabu's Belly Pit Grass 1", "MQ Jabu Jabu's Belly Pit Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3534), "MQ Jabu Jabu's Belly Pit Grass 2", "MQ Jabu Jabu's Belly Pit Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-91, -2815), "MQ Jabu Jabu's Belly Basement Grass 1", "MQ Jabu Jabu's Belly Basement Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(231, -3575), "MQ Jabu Jabu's Belly Basement Grass 2", "MQ Jabu Jabu's Belly Basement Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(305, -3481), "MQ Jabu Jabu's Belly Basement Grass 3", "MQ Jabu Jabu's Belly Basement Grass 3", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3)); - locationTable[RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1089, -1489), "MQ Jabu Jabu's Belly Wigglers Grass", "MQ Jabu Jabu's Belly Wigglers Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS)); - locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(652, -5687), "MQ Jabu Jabu's Belly Like Like Grass", "MQ Jabu Jabu's Belly Like Like Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1228, -2647), "MQ Jabu Jabu's Belly Basement Boomerang Grass", "MQ Jabu Jabu's Belly Basement Boomerang Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS)); - locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1360, -3606), "MQ Jabu Jabu's Belly After Big Octo Grass 1", "MQ Jabu Jabu's Belly After Big Octo Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1086, -3346), "MQ Jabu Jabu's Belly After Big Octo Grass 2", "MQ Jabu Jabu's Belly After Big Octo Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1477, -1366), "MQ Jabu Jabu's Belly Before Boss Grass 1", "MQ Jabu Jabu's Belly Before Boss Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1691, -1576), "MQ Jabu Jabu's Belly Before Boss Grass 2", "MQ Jabu Jabu's Belly Before Boss Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1604, 3), "MQ Bottom of the Well Dead Hand Grass 1", "MQ Bottom of the Well Dead Hand Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1529, 2), "MQ Bottom of the Well Dead Hand Grass 2", "MQ Bottom of the Well Dead Hand Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1492, -49), "MQ Bottom of the Well Dead Hand Grass 3", "MQ Bottom of the Well Dead Hand Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1458, -130), "MQ Bottom of the Well Dead Hand Grass 4", "MQ Bottom of the Well Dead Hand Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(392, -158), "MQ Lobby Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(356, -235), "MQ Lobby Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(308, -291), "MQ Lobby Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(81, -416), "MQ Lobby Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(143, -401), "MQ Lobby Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-11, -344), "MQ Lobby Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_LOBBY_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-159, -302), "MQ Lobby Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-636, 161), "MQ Slingshot Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-693, 182), "MQ Slingshot Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1443, 167), "MQ Slingshot Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1515, 140), "MQ Slingshot Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-753, 614), "MQ Before Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-736, 795), "MQ Before Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-575, 627), "MQ Before Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-572, 727), "MQ Before Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-788, 702), "MQ Before Compass Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-654, 582), "MQ Before Compass Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-643, 798), "MQ Before Compass Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1279, 1024), "MQ Compass Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1228, 1004), "MQ Compass Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1017, 1261), "MQ Compass Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1004, 1214), "MQ Compass Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-15, -261), "MQ Basement Lower Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-7, -328), "MQ Basement Lower Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(5, 119), "MQ Basement Lower Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-39, 118), "MQ Basement Lower Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-807, -228), "MQ Basement Upper Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-764, 280), "MQ Basement Upper Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, 237), "MQ Basement Upper Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-466, 865), "MQ Spike Roller Front Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-495, 906), "MQ Spike Roller Front Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-538, 907), "MQ Spike Roller Front Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1360, 838), "MQ Spike Roller Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1309, 838), "MQ Spike Roller Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-227, 790), "MQ Torches Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-201, 749), "MQ Torches Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(50, 750), "MQ Torches Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, 792), "MQ Torches Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1795, 819), "MQ Larvae Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1918, 818), "MQ Larvae Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1678, -120), "MQ Graves Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1700, 196), "MQ Graves Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2165, 350), "MQ Graves Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2215, 56), "MQ Graves Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-1901, 604), "MQ Graves Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2708, -522), "MQ Back Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2395, -587), "MQ Back Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-2553, -433), "MQ Back Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -517), "MQ Before Boss Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-272, -579), "MQ Before Boss Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3] = Location::Grass(RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-268, -645), "MQ Before Boss Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1721, -579), "MQ Compass Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1731, -45), "MQ Compass Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2218, -56), "MQ Compass Grass 3", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4] = Location::Grass(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2230, -556), "MQ Compass Grass 4", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1765, -3940), "MQ Armos Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS] = Location::Grass(RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1285, -4693), "MQ Back Poe Grass", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2644, -3368), "MQ Scrub Grass 1", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2] = Location::Grass(RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2614, -3387), "MQ Scrub Grass 2", RHT_DODONGOS_CAVERN_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-219, -61), "MQ First Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(213, -398), "MQ First Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-192, -3209), "MQ Pit Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(350, -3534), "MQ Pit Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-91, -2815), "MQ Basement Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(231, -3575), "MQ Basement Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(305, -3481), "MQ Basement Grass 3", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3)); + locationTable[RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1089, -1489), "MQ Wigglers Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(652, -5687), "MQ Like Like Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1228, -2647), "MQ Basement Boomerang Grass", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1360, -3606), "MQ After Big Octo Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1086, -3346), "MQ After Big Octo Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1477, -1366), "MQ Before Boss Grass 1", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2] = Location::Grass(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1691, -1576), "MQ Before Boss Grass 2", RHT_JABU_JABUS_BELLY_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1604, 3), "MQ Dead Hand Grass 1", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1529, 2), "MQ Dead Hand Grass 2", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1492, -49), "MQ Dead Hand Grass 3", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4] = Location::Grass(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(1458, -130), "MQ Dead Hand Grass 4", RHT_BOTTOM_OF_THE_WELL_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4)); // Shared Dungeon Grass - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(545, -75), "Deku Tree Queen Gohma Grass 1", "Deku Tree Queen Gohma Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(525, -375), "Deku Tree Queen Gohma Grass 2", "Deku Tree Queen Gohma Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-646, 108), "Deku Tree Queen Gohma Grass 3", "Deku Tree Queen Gohma Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-444, 323), "Deku Tree Queen Gohma Grass 4", "Deku Tree Queen Gohma Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-848, -166), "Deku Tree Queen Gohma Grass 5", "Deku Tree Queen Gohma Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-855, -596), "Deku Tree Queen Gohma Grass 6", "Deku Tree Queen Gohma Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Deku Tree Queen Gohma Grass 7", "Deku Tree Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); - locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Deku Tree Queen Gohma Grass 8", "Deku Tree Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(545, -75), "Queen Gohma Grass 1", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(525, -375), "Queen Gohma Grass 2", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-646, 108), "Queen Gohma Grass 3", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-444, 323), "Queen Gohma Grass 4", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-848, -166), "Queen Gohma Grass 5", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(-855, -596), "Queen Gohma Grass 6", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(480, -681), "Queen Gohma Grass 7", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7)); + locationTable[RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8] = Location::Grass(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE_BOSS, TWO_ACTOR_PARAMS(194, -974), "Queen Gohma Grass 8", RHT_DEKU_TREE_GRASS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)); // End Grass // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index da65ea681..9ac4cabfd 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -418,8 +418,7 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest } Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, - std::string&& spoilerName_, RandomizerHintTextKey hintKey, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, collectionCheck }; + return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, collectionCheck }; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index e66fd58b9..1043cb3c5 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -200,7 +200,7 @@ class Location { SpoilerCollectionCheck collectionCheck); static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); From 714b9a731a257238b4a36c040ca98bd25311923e Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Sun, 30 Mar 2025 19:52:29 +0100 Subject: [PATCH 168/267] Fix fast money accumulator setting (#5256) --- soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp index b7b6587ba..347787c27 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp @@ -14,7 +14,7 @@ extern "C" { void FasterRupeeAccumulator_Register() { GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.FasterRupeeAccumulator"), 0)) return; + if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0)) return; if (gSaveContext.rupeeAccumulator == 0) { return; From 28393fba78bcc7e6881fef10bfafb0e3f20bbd31 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Sun, 30 Mar 2025 20:07:48 +0100 Subject: [PATCH 169/267] Fix early eyeball frog source adaption in King Zora (#5255) * Fix early eyeball frog source adaption in king zora * revert inftable sets --- soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 23 ++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) 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 99695266b..ceb2ab224 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 @@ -125,23 +125,23 @@ u16 EnKz_GetText(PlayState* play, Actor* thisx) { s16 func_80A9C6C0(PlayState* play, Actor* thisx) { EnKz* this = (EnKz*)thisx; - s16 ret = NPC_TALK_STATE_TALKING; + s16 talkState = NPC_TALK_STATE_TALKING; switch (Message_GetState(&play->msgCtx)) { case TEXT_STATE_DONE: if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { if (Message_ShouldAdvance(play)) { - ret = NPC_TALK_STATE_ITEM_GIVEN; + talkState = NPC_TALK_STATE_ITEM_GIVEN; } } else { - ret = NPC_TALK_STATE_IDLE; + talkState = NPC_TALK_STATE_IDLE; switch (this->actor.textId) { case 0x4012: Flags_SetInfTable(INFTABLE_139); - ret = NPC_TALK_STATE_ACTION; + talkState = NPC_TALK_STATE_ACTION; break; case 0x401B: - ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION; + talkState = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION; break; case 0x401F: Flags_SetInfTable(INFTABLE_139); @@ -151,14 +151,13 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { break; case TEXT_STATE_CLOSING: if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { - ret = NPC_TALK_STATE_IDLE; + talkState = NPC_TALK_STATE_IDLE; switch (this->actor.textId) { case 0x4012: Flags_SetInfTable(INFTABLE_139); - ret = NPC_TALK_STATE_ACTION; - break; + FALLTHROUGH; case 0x401B: - ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION; + talkState = NPC_TALK_STATE_ACTION; break; case 0x401F: Flags_SetInfTable(INFTABLE_139); @@ -187,7 +186,7 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) { EnKz_SetupGetItem(this, play); } - ret = NPC_TALK_STATE_ACTION; + talkState = NPC_TALK_STATE_ACTION; } else { this->actor.textId = 0x4016; Message_ContinueTextbox(play, this->actor.textId); @@ -196,7 +195,7 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { break; case TEXT_STATE_EVENT: if (Message_ShouldAdvance(play)) { - ret = NPC_TALK_STATE_ACTION; + talkState = NPC_TALK_STATE_ACTION; } break; case TEXT_STATE_NONE: @@ -206,7 +205,7 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) { case TEXT_STATE_9: break; } - return ret; + return talkState; } void EnKz_UpdateEyes(EnKz* this) { From 035c03bd85de97807414d39c54088864d36f1872 Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 30 Mar 2025 17:28:53 -0400 Subject: [PATCH 170/267] Bump latest LUS main (#5252) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index 7e40f9de1..ffc062cbf 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 7e40f9de1b1ca5fda9a129676c235bbf0cec4582 +Subproject commit ffc062cbf44ce8dc07ac9fc0185224010bd78cc5 From c38205ddcfc079caff8a5fe02b85a9bf76012739 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:51:00 +0100 Subject: [PATCH 171/267] Apply better big poe logic (#5245) --- soh/soh/Enhancements/randomizer/3drando/fill.cpp | 15 +++++++++++++-- .../Enhancements/randomizer/location_access.cpp | 3 +++ .../location_access/overworld/kakariko.cpp | 2 +- .../location_access/overworld/market.cpp | 1 - soh/soh/Enhancements/randomizer/logic.cpp | 6 ++++-- soh/soh/Enhancements/randomizer/logic.h | 7 +++++-- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index b0548f5ee..78f0dd3ca 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -146,6 +146,10 @@ static void ValidateOtherEntrance(GetAccessibleLocationsStruct& gals) { ApplyStartingInventory(); // RANDOTODO when proper ammo logic is done, this could be moved to the start } } + //If we are not shuffling the guard house, add the key so we can properly check for poe merchant access + if (gals.validatedStartingRegion && gals.foundTempleOfTime && !ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)){ + Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); + } } // Apply all items that are necessary for checking all location access @@ -162,7 +166,9 @@ 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->CouldEmptyBigPoes && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { + if ((!logic->AreCheckingBigPoes || logic->CanEmptyBigPoes) && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { + //stop checking for big poes + logic->AreCheckingBigPoes = false; // Apply all items that are necessary for checking all location access ApplyAllAdvancmentItems(); // Reset access as the non-starting age @@ -563,7 +569,7 @@ void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAcce ctx->allLocationsReachable = false; if (checkPoeCollectorAccess){ - logic->CouldEmptyBigPoes = false; + logic->AreCheckingBigPoes = true; } if (checkOtherEntranceAccess){ @@ -580,6 +586,11 @@ void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAcce RegionTable(RR_ROOT)->adultNight = true; RegionTable(RR_ROOT)->childDay = true; RegionTable(RR_ROOT)->adultDay = true; + } else if (checkPoeCollectorAccess){ + //If we are not shuffling the guard house, add the key so we can properly check for poe merchant access + if (!ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)){ + Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); + } } else { ApplyAllAdvancmentItems(); } diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index f6b55868b..33abc3ce8 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -265,6 +265,9 @@ void RegionTable_Init() { areaTable[RR_ROOT] = Region("Root", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + //The big poes bottle softlock safety check does not account for the guard house lock if the guard house is not shuffled, so the key is needed before we can safely allow bottle use in logic + //RANDOTODO a setting that lets you drink/dump big poes so we don't need this logic + EventAccess(&logic->CouldEmptyBigPoes, []{return ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) || logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }, { //Locations LOCATION(RC_LINKS_POCKET, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 0e51ea173..777e29050 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -8,7 +8,7 @@ void RegionTable_Init_Kakariko() { areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->BugRock, []{return true;}), - //Open Gate setting is applies in RR_ROOT + //Open Gate setting is applied in RR_ROOT EventAccess(&logic->KakarikoVillageGateOpen, []{return logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER);}), }, { //Locations diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 0fd154259..2016b24cd 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -50,7 +50,6 @@ void RegionTable_Init_Market() { areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", "Market Guard House", {}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->CouldEmptyBigPoes, []{return logic->IsAdult;}), EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}), }, { //Locations diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 06b1f4494..836a817c4 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -407,6 +407,7 @@ namespace Rando { } } + //RANDOMISERTODO intergrate into HasItem bool Logic::CanOpenOverworldDoor(RandomizerGet key) { if (!ctx->GetOption(RSK_LOCK_OVERWORLD_DOORS)) { return true; @@ -945,7 +946,7 @@ namespace Rando { uint8_t Logic::BottleCount() { uint8_t count = 0; - if (CouldEmptyBigPoes){ + if (CouldEmptyBigPoes && !AreCheckingBigPoes){ for (int i = SLOT_BOTTLE_1; i <= SLOT_BOTTLE_4; i++) { uint8_t item = GetSaveContext()->inventory.items[i]; switch (item) { @@ -2237,7 +2238,8 @@ namespace Rando { //Bottle Count Bottles = 0; NumBottles = 0; - CanEmptyBigPoes = false; + CanEmptyBigPoes = false; + CouldEmptyBigPoes = false; //Drops and Bottle Contents Access NutPot = false; diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index c976287a7..2f68017e2 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -66,8 +66,11 @@ class Logic { uint8_t NumBottles = 0; //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; + //this event covers if the player could, if they filled their bottle with big poes in field, empty them at the poe merchant. + //Works in tandem with the big poes safety check during entrance validation + bool CouldEmptyBigPoes = false; + //this check is used to tell logic that we are checking big poes accessibility in logic, to ensure it's not bottle-locked. + bool AreCheckingBigPoes = false; // Drops and Bottle Contents Access bool NutPot = false; From 026a418789368906f900bee2898e2cba4e3c50b0 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:51:20 +0100 Subject: [PATCH 172/267] Fix various HBA issues (#5246) * Fix various HBA issues * forgot to save * cleanup to address review --- .../Enhancements/randomizer/3drando/hint_list.cpp | 6 +++--- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 11 +++++++++++ soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 15 +++++++++------ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 182e5eba5..f0d7742f0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -2281,15 +2281,15 @@ void StaticData::HintTable_Init() { {QM_RED, QM_GREEN, QM_GREEN, QM_GREEN}, {}, TEXTBOX_TYPE_WOODEN)); hintTextTable[RHT_HBA_HINT_NOT_ON_HORSE] = HintText(CustomMessage("Hey, rookie!&Come back on your #horse# and take on then #Horseback Archery# challenge!^" - "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for my #[[2]]#!", + "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for #[[2]]#!", {QM_RED, QM_RED, QM_GREEN, QM_GREEN})); hintTextTable[RHT_HBA_HINT_INITIAL] = HintText(CustomMessage("Hey, rookie!&Want to take on the #Horseback Archery# challenge?^" - "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for my #[[2]]#!\x0B", + "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for #[[2]]#!\x0B", {QM_RED, QM_GREEN, QM_GREEN})); hintTextTable[RHT_HBA_HINT_HAVE_1000] = HintText(CustomMessage("Hey, newcomer!&Want to take on the #Horseback Archery# challenge?^" - "Prove yourself to be a horsemaster by scoring 1500 points to win my #[[1]]#!\x0B", + "Prove yourself to be a horsemaster by scoring 1500 points to win #[[2]]#!\x0B", {QM_RED, QM_GREEN})); hintTextTable[RHT_MALON_HINT_HOW_IS_EPONA] = HintText(CustomMessage("@! You should come back with Epona and try to beat my time on the #Obstacle Course#!^" diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 8169bbb17..37a5d7323 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -55,6 +55,7 @@ extern "C" { #include "src/overlays/actors/ovl_En_Xc/z_en_xc.h" #include "src/overlays/actors/ovl_Fishing/z_fishing.h" #include "src/overlays/actors/ovl_En_Mk/z_en_mk.h" +#include "src/overlays/actors/ovl_En_Ge1/z_en_ge1.h" #include "draw.h" extern SaveContext gSaveContext; @@ -65,6 +66,8 @@ extern s32 Player_SetupWaitForPutAway(PlayState* play, Player* player, AfterPutA extern void Play_InitEnvironment(PlayState * play, s16 skyboxId); extern void EnMk_Wait(EnMk* enMk, PlayState* play); extern void func_80ABA778(EnNiwLady* enNiwLady, PlayState* play); +extern void EnGe1_Wait_Archery(EnGe1* enGe1, PlayState* play); +extern void EnGe1_SetAnimationIdle(EnGe1* enGe1); } #define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() @@ -1317,10 +1320,18 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY: { + EnGe1* enGe1 = va_arg(args, EnGe1*); // give both rewards at the same time + if (gSaveContext.minigameScore >= 1000) { + Flags_SetInfTable(INFTABLE_190); + } if (gSaveContext.minigameScore >= 1500) { Flags_SetItemGetInf(ITEMGETINF_0F); } + //move gerudo actor onto her wait loop + enGe1->actionFunc = EnGe1_Wait_Archery; + EnGe1_SetAnimationIdle(enGe1); + //skip the vanilla gives. *should = false; break; } 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 1614bac81..467e24678 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 @@ -521,7 +521,10 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, PlayState* play) { GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; s32 getItemId; - if (Actor_HasParent(&this->actor, play) || !GameInteractor_Should(VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY, true, this)) { + if (!GameInteractor_Should(VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY, true, this)){ + return; + } + if (Actor_HasParent(&this->actor, play)) { this->actionFunc = EnGe1_SetupWait_Archery; if (this->stateFlags & GE1_STATE_GIVE_QUIVER) { @@ -543,10 +546,7 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, PlayState* play) { } else { getItemId = GI_HEART_PIECE; } - - if (GameInteractor_Should(VB_GIVE_ITEM_FROM_HORSEBACK_ARCHERY, true, this)) { - Actor_OfferGetItem(&this->actor, play, getItemId, 10000.0f, 50.0f); - } + Actor_OfferGetItem(&this->actor, play, getItemId, 10000.0f, 50.0f); } } @@ -561,7 +561,10 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, PlayState* play) { if (this->stateFlags & GE1_STATE_GIVE_QUIVER) { switch (CUR_UPG_VALUE(UPG_QUIVER)) { - //! @bug Asschest. See next function for details + //! @bug Asschest: the compiler inserts a default assigning *(sp+0x24) to getItemId, which is junk data left + //! over from the previous function run in EnGe1_Update, namely EnGe1_CueUpAnimation. The top stack variable + //! in that function is &this->skelAnime = thisx + 198, and depending on where this loads in memory, the + //! getItemId changes. case 1: getItemId = GI_QUIVER_40; break; From 0dc5ff498494898bf5678c8b32acea76bcec85f2 Mon Sep 17 00:00:00 2001 From: inspectredc <78732756+inspectredc@users.noreply.github.com> Date: Sun, 30 Mar 2025 23:16:24 +0100 Subject: [PATCH 173/267] NTSC GC Support (#5254) * copy n64 pal 10 doing this so i can check diffs i make * transfer german->jp icon item * overlays, message data, icon item jpn, audio, code todo: title_static, gameplay keep * add kanji and fix title cards * title static * spell folder correctly * boss title cards, do action, icon item, item name, map name * headers for jpn stuff * gameplay_keep * Scenes, audio, jp text extraction, rom support, overlay fixes, sheik & darunia todo: test & disable darunia fix cvar for ntsc * msgptr init fix * icon item offsets * comment out title cards until zapd can fix itself (we extract these in a different file anyway) * compile and font implemented to get past title screen * file select * message, kaleido and everything else but rando * uintptr_t * rando and custom messages working! * ntsc-j 1.0 support * n64 logo? * copy ntsc 10 to 11 * ntsc 11 extraction * change title version names * copy ntsc 11 to 12 * ntsc 12 extraction * clean up some todos * re checkout submodules post merge * fix US filename * support cross-version filenames * add new versions to non-mq list * use correct message table init * Fix ntsc nes message table overriding pal nes message table * actual fix, allows extraction * fix file name using wrong font of file being hovered over * Fix barinade crash * re-add pal * better jabu fix and revert LUS * fix gerudo title cards * better better owl select * more owl fixes * build * fix some name decode issues * Switch Language Mid Text * Fix PAL displaying for JP filenames * Fix AskToEquip Crash * Disable Credits Timing Fix on NTSC * Fix JP Text positioning * basic language switching (BIG todo: file select, title screen) * Title Screen Hopefully working * add ntsc to linux appimage stuff, TODO: add .v64/.n64 support * Update OTRExporter * Fix pause to decide offset * Fix bomb item name crash * fix fire arrows and PoH * builds * update asset changes and fix menu language changing * fix name decode * Fix crashes and add rando/boss rush select stuff * Revive debug feature by setting language cvar too * Fix ocarina text speed softlock, and update jp text speed changes * Merge remote-tracking branch 'upstream/develop' into NTSC * Fix options menu and let pal use japanese fully * Resolve some suggestions * match up gTextSpeed changes to english (still broken!) * Fix text speed crash * Set default filename language on save init funcs * copy n64 ntsc 1.2 to gc nmq ntsc and add rom info * extractor working for ntsc gc u * Extraction Works * bump otrexporter * Display same correct info for n64 ntsc-j and ntsc-u * ovl asset fixes * final font diff * change the correct ovl file choose xml * copy asset files for jp * JP Working * Copy jp and us xmls to mq * MQ Working * quicktext more closely aligned with decomp * add versions to mq switch * linux appimage v64/n64 checksums * bump zapd * Credits Fix Tooltip Adjusted * update supported hashes json * update shasums to include JP n64 * add shasum hashes * Bump submodules back to upstream --- OTRExporter | 2 +- ZAPDTR | 2 +- docs/supportedHashes.json | 20 + scripts/linux/appimage/soh.sh.in | 70 + soh/assets/extractor/Config_GC_MQ_NTSC_J.xml | 8 + soh/assets/extractor/Config_GC_MQ_NTSC_U.xml | 8 + soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml | 8 + .../extractor/Config_GC_NMQ_NTSC_J_CE.xml | 8 + soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml | 8 + soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml | 1558 +++++++ .../xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml | 13 + .../xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml | 8 + .../xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml | 10 + .../xml/GC_MQ_NTSC_J/code/sys_matrix.xml | 5 + .../xml/GC_MQ_NTSC_J/misc/link_animetion.xml | 577 +++ .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../GC_MQ_NTSC_J/objects/gameplay_keep.xml | 1011 +++++ .../xml/GC_MQ_NTSC_J/objects/object_Bb.xml | 37 + .../xml/GC_MQ_NTSC_J/objects/object_ahg.xml | 61 + .../xml/GC_MQ_NTSC_J/objects/object_am.xml | 22 + .../xml/GC_MQ_NTSC_J/objects/object_ane.xml | 59 + .../xml/GC_MQ_NTSC_J/objects/object_ani.xml | 67 + .../GC_MQ_NTSC_J/objects/object_anubice.xml | 29 + .../xml/GC_MQ_NTSC_J/objects/object_aob.xml | 59 + .../GC_MQ_NTSC_J/objects/object_b_heart.xml | 8 + .../xml/GC_MQ_NTSC_J/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../xml/GC_MQ_NTSC_J/objects/object_bdoor.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_bg.xml | 50 + .../GC_MQ_NTSC_J/objects/object_bigokuta.xml | 58 + .../xml/GC_MQ_NTSC_J/objects/object_bird.xml | 30 + .../xml/GC_MQ_NTSC_J/objects/object_bji.xml | 56 + .../xml/GC_MQ_NTSC_J/objects/object_bl.xml | 32 + .../GC_MQ_NTSC_J/objects/object_blkobj.xml | 37 + .../xml/GC_MQ_NTSC_J/objects/object_bob.xml | 47 + .../xml/GC_MQ_NTSC_J/objects/object_boj.xml | 65 + .../xml/GC_MQ_NTSC_J/objects/object_bombf.xml | 14 + .../GC_MQ_NTSC_J/objects/object_bombiwa.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_bowl.xml | 18 + .../xml/GC_MQ_NTSC_J/objects/object_box.xml | 30 + .../xml/GC_MQ_NTSC_J/objects/object_brob.xml | 25 + .../GC_MQ_NTSC_J/objects/object_bubble.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_bv.xml | 116 + .../xml/GC_MQ_NTSC_J/objects/object_bw.xml | 29 + .../xml/GC_MQ_NTSC_J/objects/object_bwall.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_bxa.xml | 13 + .../xml/GC_MQ_NTSC_J/objects/object_cne.xml | 53 + .../xml/GC_MQ_NTSC_J/objects/object_cob.xml | 41 + .../xml/GC_MQ_NTSC_J/objects/object_cow.xml | 55 + .../xml/GC_MQ_NTSC_J/objects/object_crow.xml | 11 + .../xml/GC_MQ_NTSC_J/objects/object_cs.xml | 60 + .../objects/object_d_elevator.xml | 7 + .../GC_MQ_NTSC_J/objects/object_d_hsblock.xml | 10 + .../GC_MQ_NTSC_J/objects/object_d_lift.xml | 8 + .../xml/GC_MQ_NTSC_J/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../GC_MQ_NTSC_J/objects/object_dekubaba.xml | 38 + .../GC_MQ_NTSC_J/objects/object_dekujr.xml | 13 + .../GC_MQ_NTSC_J/objects/object_dekunuts.xml | 32 + .../GC_MQ_NTSC_J/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_dh.xml | 59 + .../xml/GC_MQ_NTSC_J/objects/object_dnk.xml | 35 + .../xml/GC_MQ_NTSC_J/objects/object_dns.xml | 40 + .../GC_MQ_NTSC_J/objects/object_dodojr.xml | 33 + .../GC_MQ_NTSC_J/objects/object_dodongo.xml | 41 + .../xml/GC_MQ_NTSC_J/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/GC_MQ_NTSC_J/objects/object_ds.xml | 38 + .../xml/GC_MQ_NTSC_J/objects/object_ds2.xml | 34 + .../xml/GC_MQ_NTSC_J/objects/object_du.xml | 81 + .../GC_MQ_NTSC_J/objects/object_dy_obj.xml | 121 + .../xml/GC_MQ_NTSC_J/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../GC_MQ_NTSC_J/objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../GC_MQ_NTSC_J/objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../GC_MQ_NTSC_J/objects/object_efc_tw.xml | 13 + .../xml/GC_MQ_NTSC_J/objects/object_ei.xml | 56 + .../xml/GC_MQ_NTSC_J/objects/object_fa.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_fd.xml | 103 + .../xml/GC_MQ_NTSC_J/objects/object_fd2.xml | 52 + .../xml/GC_MQ_NTSC_J/objects/object_fhg.xml | 54 + .../xml/GC_MQ_NTSC_J/objects/object_fire.xml | 14 + .../GC_MQ_NTSC_J/objects/object_firefly.xml | 21 + .../xml/GC_MQ_NTSC_J/objects/object_fish.xml | 180 + .../xml/GC_MQ_NTSC_J/objects/object_fr.xml | 65 + .../xml/GC_MQ_NTSC_J/objects/object_fu.xml | 55 + .../xml/GC_MQ_NTSC_J/objects/object_fw.xml | 106 + .../xml/GC_MQ_NTSC_J/objects/object_fz.xml | 12 + .../xml/GC_MQ_NTSC_J/objects/object_ganon.xml | 106 + .../GC_MQ_NTSC_J/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_ge1.xml | 78 + .../xml/GC_MQ_NTSC_J/objects/object_geff.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_geldb.xml | 44 + .../GC_MQ_NTSC_J/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../GC_MQ_NTSC_J/objects/object_gi_bean.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../objects/object_gi_boots_2.xml | 7 + .../objects/object_gi_bosskey.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../objects/object_gi_clothes.xml | 11 + .../GC_MQ_NTSC_J/objects/object_gi_coin.xml | 10 + .../objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../GC_MQ_NTSC_J/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_fire.xml | 8 + .../GC_MQ_NTSC_J/objects/object_gi_fish.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_frog.xml | 7 + .../GC_MQ_NTSC_J/objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../GC_MQ_NTSC_J/objects/object_gi_ghost.xml | 11 + .../objects/object_gi_glasses.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_gloves.xml | 11 + .../objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../GC_MQ_NTSC_J/objects/object_gi_grass.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_hammer.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_heart.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../GC_MQ_NTSC_J/objects/object_gi_insect.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_jewel.xml | 15 + .../GC_MQ_NTSC_J/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../GC_MQ_NTSC_J/objects/object_gi_letter.xml | 8 + .../GC_MQ_NTSC_J/objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_map.xml | 7 + .../GC_MQ_NTSC_J/objects/object_gi_medal.xml | 11 + .../GC_MQ_NTSC_J/objects/object_gi_melody.xml | 11 + .../GC_MQ_NTSC_J/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../GC_MQ_NTSC_J/objects/object_gi_nuts.xml | 6 + .../objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../GC_MQ_NTSC_J/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_rupy.xml | 16 + .../GC_MQ_NTSC_J/objects/object_gi_saw.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_scale.xml | 10 + .../GC_MQ_NTSC_J/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../objects/object_gi_soldout.xml | 6 + .../GC_MQ_NTSC_J/objects/object_gi_soul.xml | 8 + .../GC_MQ_NTSC_J/objects/object_gi_stick.xml | 5 + .../GC_MQ_NTSC_J/objects/object_gi_sutaru.xml | 6 + .../objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/GC_MQ_NTSC_J/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_gla.xml | 85 + .../xml/GC_MQ_NTSC_J/objects/object_gm.xml | 5 + .../xml/GC_MQ_NTSC_J/objects/object_gnd.xml | 87 + .../GC_MQ_NTSC_J/objects/object_gnd_magic.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_gndd.xml | 106 + .../GC_MQ_NTSC_J/objects/object_god_lgt.xml | 9 + .../xml/GC_MQ_NTSC_J/objects/object_gol.xml | 59 + .../xml/GC_MQ_NTSC_J/objects/object_goma.xml | 169 + .../GC_MQ_NTSC_J/objects/object_goroiwa.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_gr.xml | 27 + .../xml/GC_MQ_NTSC_J/objects/object_gs.xml | 8 + .../xml/GC_MQ_NTSC_J/objects/object_gt.xml | 38 + .../xml/GC_MQ_NTSC_J/objects/object_haka.xml | 10 + .../GC_MQ_NTSC_J/objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/GC_MQ_NTSC_J/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../GC_MQ_NTSC_J/objects/object_hintnuts.xml | 29 + .../xml/GC_MQ_NTSC_J/objects/object_hni.xml | 51 + .../xml/GC_MQ_NTSC_J/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/GC_MQ_NTSC_J/objects/object_hs.xml | 47 + .../xml/GC_MQ_NTSC_J/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/GC_MQ_NTSC_J/objects/object_ik.xml | 108 + .../xml/GC_MQ_NTSC_J/objects/object_im.xml | 79 + .../xml/GC_MQ_NTSC_J/objects/object_in.xml | 142 + .../GC_MQ_NTSC_J/objects/object_ingate.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_jj.xml | 77 + .../xml/GC_MQ_NTSC_J/objects/object_js.xml | 55 + .../GC_MQ_NTSC_J/objects/object_jya_door.xml | 8 + .../GC_MQ_NTSC_J/objects/object_jya_iron.xml | 13 + .../GC_MQ_NTSC_J/objects/object_jya_obj.xml | 87 + .../xml/GC_MQ_NTSC_J/objects/object_ka.xml | 64 + .../GC_MQ_NTSC_J/objects/object_kanban.xml | 18 + .../GC_MQ_NTSC_J/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/GC_MQ_NTSC_J/objects/object_km1.xml | 39 + .../xml/GC_MQ_NTSC_J/objects/object_kusa.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_kw1.xml | 63 + .../xml/GC_MQ_NTSC_J/objects/object_kz.xml | 45 + .../objects/object_light_ring.xml | 6 + .../GC_MQ_NTSC_J/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../GC_MQ_NTSC_J/objects/object_link_boy.xml | 282 ++ .../objects/object_link_child.xml | 225 + .../xml/GC_MQ_NTSC_J/objects/object_ma1.xml | 67 + .../xml/GC_MQ_NTSC_J/objects/object_ma2.xml | 75 + .../xml/GC_MQ_NTSC_J/objects/object_mag.xml | 21 + .../GC_MQ_NTSC_J/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/GC_MQ_NTSC_J/objects/object_mb.xml | 73 + .../xml/GC_MQ_NTSC_J/objects/object_md.xml | 87 + .../xml/GC_MQ_NTSC_J/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../GC_MQ_NTSC_J/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/GC_MQ_NTSC_J/objects/object_mjin.xml | 8 + .../GC_MQ_NTSC_J/objects/object_mjin_dark.xml | 5 + .../objects/object_mjin_flame.xml | 5 + .../objects/object_mjin_flash.xml | 5 + .../GC_MQ_NTSC_J/objects/object_mjin_ice.xml | 5 + .../GC_MQ_NTSC_J/objects/object_mjin_oka.xml | 8 + .../GC_MQ_NTSC_J/objects/object_mjin_soul.xml | 5 + .../GC_MQ_NTSC_J/objects/object_mjin_wind.xml | 5 + .../xml/GC_MQ_NTSC_J/objects/object_mk.xml | 44 + .../xml/GC_MQ_NTSC_J/objects/object_mm.xml | 25 + .../xml/GC_MQ_NTSC_J/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../GC_MQ_NTSC_J/objects/object_mori_tex.xml | 29 + .../xml/GC_MQ_NTSC_J/objects/object_ms.xml | 43 + .../xml/GC_MQ_NTSC_J/objects/object_mu.xml | 96 + .../xml/GC_MQ_NTSC_J/objects/object_nb.xml | 118 + .../xml/GC_MQ_NTSC_J/objects/object_niw.xml | 49 + .../xml/GC_MQ_NTSC_J/objects/object_nwc.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_ny.xml | 10 + .../xml/GC_MQ_NTSC_J/objects/object_oA1.xml | 69 + .../xml/GC_MQ_NTSC_J/objects/object_oA10.xml | 66 + .../xml/GC_MQ_NTSC_J/objects/object_oA11.xml | 66 + .../xml/GC_MQ_NTSC_J/objects/object_oA2.xml | 58 + .../xml/GC_MQ_NTSC_J/objects/object_oA3.xml | 11 + .../xml/GC_MQ_NTSC_J/objects/object_oA4.xml | 64 + .../xml/GC_MQ_NTSC_J/objects/object_oA5.xml | 64 + .../xml/GC_MQ_NTSC_J/objects/object_oA6.xml | 64 + .../xml/GC_MQ_NTSC_J/objects/object_oA7.xml | 62 + .../xml/GC_MQ_NTSC_J/objects/object_oA8.xml | 61 + .../xml/GC_MQ_NTSC_J/objects/object_oA9.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_oB1.xml | 69 + .../xml/GC_MQ_NTSC_J/objects/object_oB2.xml | 76 + .../xml/GC_MQ_NTSC_J/objects/object_oB3.xml | 70 + .../xml/GC_MQ_NTSC_J/objects/object_oB4.xml | 64 + .../xml/GC_MQ_NTSC_J/objects/object_oE1.xml | 70 + .../xml/GC_MQ_NTSC_J/objects/object_oE10.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_oE11.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_oE12.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_oE1s.xml | 52 + .../xml/GC_MQ_NTSC_J/objects/object_oE2.xml | 71 + .../xml/GC_MQ_NTSC_J/objects/object_oE3.xml | 73 + .../xml/GC_MQ_NTSC_J/objects/object_oE4.xml | 69 + .../xml/GC_MQ_NTSC_J/objects/object_oE4s.xml | 48 + .../xml/GC_MQ_NTSC_J/objects/object_oE5.xml | 64 + .../xml/GC_MQ_NTSC_J/objects/object_oE6.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_oE7.xml | 14 + .../xml/GC_MQ_NTSC_J/objects/object_oE8.xml | 15 + .../xml/GC_MQ_NTSC_J/objects/object_oE9.xml | 15 + .../GC_MQ_NTSC_J/objects/object_oE_anime.xml | 10 + .../GC_MQ_NTSC_J/objects/object_oF1d_map.xml | 54 + .../xml/GC_MQ_NTSC_J/objects/object_oF1s.xml | 58 + .../GC_MQ_NTSC_J/objects/object_o_anime.xml | 11 + .../xml/GC_MQ_NTSC_J/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/GC_MQ_NTSC_J/objects/object_os.xml | 36 + .../GC_MQ_NTSC_J/objects/object_os_anime.xml | 69 + .../xml/GC_MQ_NTSC_J/objects/object_ossan.xml | 23 + .../GC_MQ_NTSC_J/objects/object_ouke_haka.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_owl.xml | 79 + .../GC_MQ_NTSC_J/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../GC_MQ_NTSC_J/objects/object_po_field.xml | 31 + .../objects/object_po_sisters.xml | 56 + .../xml/GC_MQ_NTSC_J/objects/object_poh.xml | 25 + .../xml/GC_MQ_NTSC_J/objects/object_ps.xml | 42 + .../GC_MQ_NTSC_J/objects/object_pu_box.xml | 13 + .../xml/GC_MQ_NTSC_J/objects/object_rd.xml | 124 + .../xml/GC_MQ_NTSC_J/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/GC_MQ_NTSC_J/objects/object_rl.xml | 52 + .../xml/GC_MQ_NTSC_J/objects/object_rr.xml | 8 + .../xml/GC_MQ_NTSC_J/objects/object_rs.xml | 32 + .../xml/GC_MQ_NTSC_J/objects/object_ru1.xml | 83 + .../xml/GC_MQ_NTSC_J/objects/object_ru2.xml | 92 + .../xml/GC_MQ_NTSC_J/objects/object_sa.xml | 100 + .../xml/GC_MQ_NTSC_J/objects/object_sb.xml | 30 + .../xml/GC_MQ_NTSC_J/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../GC_MQ_NTSC_J/objects/object_shopnuts.xml | 67 + .../GC_MQ_NTSC_J/objects/object_siofuki.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_sk2.xml | 130 + .../xml/GC_MQ_NTSC_J/objects/object_skb.xml | 64 + .../xml/GC_MQ_NTSC_J/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../objects/object_spot08_obj.xml | 27 + .../objects/object_spot09_obj.xml | 35 + .../objects/object_spot11_obj.xml | 9 + .../objects/object_spot12_obj.xml | 13 + .../objects/object_spot15_obj.xml | 13 + .../objects/object_spot16_obj.xml | 11 + .../objects/object_spot17_obj.xml | 12 + .../objects/object_spot18_obj.xml | 36 + .../xml/GC_MQ_NTSC_J/objects/object_ssh.xml | 61 + .../xml/GC_MQ_NTSC_J/objects/object_sst.xml | 71 + .../xml/GC_MQ_NTSC_J/objects/object_st.xml | 71 + .../GC_MQ_NTSC_J/objects/object_stream.xml | 6 + .../GC_MQ_NTSC_J/objects/object_syokudai.xml | 13 + .../xml/GC_MQ_NTSC_J/objects/object_ta.xml | 72 + .../GC_MQ_NTSC_J/objects/object_timeblock.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_tite.xml | 55 + .../xml/GC_MQ_NTSC_J/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../GC_MQ_NTSC_J/objects/object_torch2.xml | 13 + .../xml/GC_MQ_NTSC_J/objects/object_toryo.xml | 53 + .../xml/GC_MQ_NTSC_J/objects/object_tp.xml | 17 + .../xml/GC_MQ_NTSC_J/objects/object_tr.xml | 149 + .../xml/GC_MQ_NTSC_J/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/GC_MQ_NTSC_J/objects/object_ts.xml | 34 + .../xml/GC_MQ_NTSC_J/objects/object_tsubo.xml | 9 + .../xml/GC_MQ_NTSC_J/objects/object_tw.xml | 332 ++ .../GC_MQ_NTSC_J/objects/object_umajump.xml | 8 + .../xml/GC_MQ_NTSC_J/objects/object_vali.xml | 63 + .../xml/GC_MQ_NTSC_J/objects/object_vase.xml | 7 + .../xml/GC_MQ_NTSC_J/objects/object_vm.xml | 41 + .../objects/object_wallmaster.xml | 35 + .../xml/GC_MQ_NTSC_J/objects/object_warp1.xml | 39 + .../xml/GC_MQ_NTSC_J/objects/object_warp2.xml | 6 + .../xml/GC_MQ_NTSC_J/objects/object_wf.xml | 128 + .../GC_MQ_NTSC_J/objects/object_wood02.xml | 35 + .../xml/GC_MQ_NTSC_J/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../GC_MQ_NTSC_J/objects/object_yukabyun.xml | 9 + .../xml/GC_MQ_NTSC_J/objects/object_zf.xml | 182 + .../xml/GC_MQ_NTSC_J/objects/object_zg.xml | 8 + .../xml/GC_MQ_NTSC_J/objects/object_zl1.xml | 115 + .../xml/GC_MQ_NTSC_J/objects/object_zl2.xml | 75 + .../objects/object_zl2_anime1.xml | 30 + .../objects/object_zl2_anime2.xml | 40 + .../xml/GC_MQ_NTSC_J/objects/object_zl4.xml | 91 + .../xml/GC_MQ_NTSC_J/objects/object_zo.xml | 88 + .../GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml | 11 + .../GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml | 11 + .../GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../overlays/ovl_Boss_Dodongo.xml | 6 + .../GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml | 68 + .../GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml | 76 + .../GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml | 10 + .../GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml | 10 + .../xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml | 7 + .../overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml | 8 + .../GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml | 38 + .../GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml | 8 + .../xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml | 9 + .../xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml | 8 + .../xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml | 8 + .../xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml | 15 + .../GC_MQ_NTSC_J/overlays/ovl_End_Title.xml | 17 + .../GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml | 22 + .../GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml | 12 + .../GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml | 10 + .../GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml | 15 + .../GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml | 10 + .../GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml | 11 + .../GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml | 10 + .../GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml | 11 + .../GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml | 10 + .../GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml | 11 + .../GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml | 231 + .../GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml | 34 + .../GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml | 191 + .../scenes/dungeons/HAKAdanCH.xml | 70 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml | 288 ++ .../GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml | 262 ++ .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml | 96 + .../scenes/dungeons/bdan_boss.xml | 20 + .../xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml | 220 + .../scenes/dungeons/ddan_boss.xml | 22 + .../GC_MQ_NTSC_J/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../scenes/dungeons/ganon_tou.xml | 34 + .../scenes/dungeons/ganontika.xml | 254 ++ .../scenes/dungeons/ganontikasonogo.xml | 36 + .../scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 106 + .../scenes/dungeons/jyasinboss.xml | 49 + .../scenes/dungeons/jyasinzou.xml | 358 ++ .../xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml | 126 + .../scenes/dungeons/moribossroom.xml | 33 + .../xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml | 157 + .../scenes/dungeons/ydan_boss.xml | 26 + .../GC_MQ_NTSC_J/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml | 8 + .../scenes/indoors/hylia_labo.xml | 39 + .../xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml | 8 + .../GC_MQ_NTSC_J/scenes/indoors/kakariko.xml | 8 + .../scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml | 8 + .../GC_MQ_NTSC_J/scenes/indoors/link_home.xml | 8 + .../GC_MQ_NTSC_J/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../scenes/indoors/miharigoya.xml | 28 + .../GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../GC_MQ_NTSC_J/scenes/indoors/takaraya.xml | 53 + .../xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml | 8 + .../GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml | 18 + .../xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml | 26 + .../GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml | 37 + .../GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml | 8 + .../GC_MQ_NTSC_J/scenes/misc/kakariko3.xml | 8 + .../GC_MQ_NTSC_J/scenes/misc/kakusiana.xml | 113 + .../xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml | 23 + .../GC_MQ_NTSC_J/scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../GC_MQ_NTSC_J/scenes/misc/market_day.xml | 9 + .../GC_MQ_NTSC_J/scenes/misc/market_night.xml | 9 + .../GC_MQ_NTSC_J/scenes/misc/market_ruins.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml | 9 + .../xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml | 35 + .../GC_MQ_NTSC_J/scenes/overworld/entra.xml | 8 + .../GC_MQ_NTSC_J/scenes/overworld/souko.xml | 44 + .../GC_MQ_NTSC_J/scenes/overworld/spot00.xml | 69 + .../GC_MQ_NTSC_J/scenes/overworld/spot01.xml | 51 + .../GC_MQ_NTSC_J/scenes/overworld/spot02.xml | 64 + .../GC_MQ_NTSC_J/scenes/overworld/spot03.xml | 41 + .../GC_MQ_NTSC_J/scenes/overworld/spot04.xml | 81 + .../GC_MQ_NTSC_J/scenes/overworld/spot05.xml | 43 + .../GC_MQ_NTSC_J/scenes/overworld/spot06.xml | 58 + .../GC_MQ_NTSC_J/scenes/overworld/spot07.xml | 47 + .../GC_MQ_NTSC_J/scenes/overworld/spot08.xml | 36 + .../GC_MQ_NTSC_J/scenes/overworld/spot09.xml | 37 + .../GC_MQ_NTSC_J/scenes/overworld/spot10.xml | 71 + .../GC_MQ_NTSC_J/scenes/overworld/spot11.xml | 41 + .../GC_MQ_NTSC_J/scenes/overworld/spot12.xml | 52 + .../GC_MQ_NTSC_J/scenes/overworld/spot13.xml | 39 + .../GC_MQ_NTSC_J/scenes/overworld/spot15.xml | 52 + .../GC_MQ_NTSC_J/scenes/overworld/spot16.xml | 50 + .../GC_MQ_NTSC_J/scenes/overworld/spot17.xml | 54 + .../GC_MQ_NTSC_J/scenes/overworld/spot18.xml | 105 + .../GC_MQ_NTSC_J/scenes/overworld/spot20.xml | 36 + .../GC_MQ_NTSC_J/scenes/shops/alley_shop.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/shops/drag.xml | 8 + .../GC_MQ_NTSC_J/scenes/shops/face_shop.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/shops/golon.xml | 8 + .../GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml | 8 + .../GC_MQ_NTSC_J/scenes/shops/night_shop.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml | 8 + .../xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml | 8 + .../GC_MQ_NTSC_J/text/elf_message_field.xml | 5 + .../GC_MQ_NTSC_J/text/elf_message_ydan.xml | 5 + .../GC_MQ_NTSC_J/text/message_data_static.xml | 11 + .../xml/GC_MQ_NTSC_J/textures/backgrounds.xml | 246 + .../textures/boss_title_cards.xml | 42 + .../textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../textures/icon_item_static.xml | 188 + .../textures/item_name_static.xml | 250 ++ .../xml/GC_MQ_NTSC_J/textures/kanji.xml | 3984 +++++++++++++++++ .../textures/map_48x85_static.xml | 72 + .../textures/map_grand_static.xml | 28 + .../GC_MQ_NTSC_J/textures/map_i_static.xml | 243 + .../GC_MQ_NTSC_J/textures/map_name_static.xml | 72 + .../GC_MQ_NTSC_J/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../GC_MQ_NTSC_J/textures/nes_font_static.xml | 144 + .../textures/nintendo_rogo_static.xml | 9 + .../textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/GC_MQ_NTSC_J/textures/skyboxes.xml | 113 + .../GC_MQ_NTSC_J/textures/title_static.xml | 169 + soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml | 1558 +++++++ .../xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml | 13 + .../xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml | 8 + .../xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml | 10 + .../xml/GC_MQ_NTSC_U/code/sys_matrix.xml | 5 + .../xml/GC_MQ_NTSC_U/misc/link_animetion.xml | 577 +++ .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../GC_MQ_NTSC_U/objects/gameplay_keep.xml | 1011 +++++ .../xml/GC_MQ_NTSC_U/objects/object_Bb.xml | 37 + .../xml/GC_MQ_NTSC_U/objects/object_ahg.xml | 61 + .../xml/GC_MQ_NTSC_U/objects/object_am.xml | 22 + .../xml/GC_MQ_NTSC_U/objects/object_ane.xml | 59 + .../xml/GC_MQ_NTSC_U/objects/object_ani.xml | 67 + .../GC_MQ_NTSC_U/objects/object_anubice.xml | 29 + .../xml/GC_MQ_NTSC_U/objects/object_aob.xml | 59 + .../GC_MQ_NTSC_U/objects/object_b_heart.xml | 8 + .../xml/GC_MQ_NTSC_U/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../xml/GC_MQ_NTSC_U/objects/object_bdoor.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_bg.xml | 50 + .../GC_MQ_NTSC_U/objects/object_bigokuta.xml | 58 + .../xml/GC_MQ_NTSC_U/objects/object_bird.xml | 30 + .../xml/GC_MQ_NTSC_U/objects/object_bji.xml | 56 + .../xml/GC_MQ_NTSC_U/objects/object_bl.xml | 32 + .../GC_MQ_NTSC_U/objects/object_blkobj.xml | 37 + .../xml/GC_MQ_NTSC_U/objects/object_bob.xml | 47 + .../xml/GC_MQ_NTSC_U/objects/object_boj.xml | 65 + .../xml/GC_MQ_NTSC_U/objects/object_bombf.xml | 14 + .../GC_MQ_NTSC_U/objects/object_bombiwa.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_bowl.xml | 18 + .../xml/GC_MQ_NTSC_U/objects/object_box.xml | 30 + .../xml/GC_MQ_NTSC_U/objects/object_brob.xml | 25 + .../GC_MQ_NTSC_U/objects/object_bubble.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_bv.xml | 116 + .../xml/GC_MQ_NTSC_U/objects/object_bw.xml | 29 + .../xml/GC_MQ_NTSC_U/objects/object_bwall.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_bxa.xml | 13 + .../xml/GC_MQ_NTSC_U/objects/object_cne.xml | 53 + .../xml/GC_MQ_NTSC_U/objects/object_cob.xml | 41 + .../xml/GC_MQ_NTSC_U/objects/object_cow.xml | 55 + .../xml/GC_MQ_NTSC_U/objects/object_crow.xml | 11 + .../xml/GC_MQ_NTSC_U/objects/object_cs.xml | 60 + .../objects/object_d_elevator.xml | 7 + .../GC_MQ_NTSC_U/objects/object_d_hsblock.xml | 10 + .../GC_MQ_NTSC_U/objects/object_d_lift.xml | 8 + .../xml/GC_MQ_NTSC_U/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../GC_MQ_NTSC_U/objects/object_dekubaba.xml | 38 + .../GC_MQ_NTSC_U/objects/object_dekujr.xml | 13 + .../GC_MQ_NTSC_U/objects/object_dekunuts.xml | 32 + .../GC_MQ_NTSC_U/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_dh.xml | 59 + .../xml/GC_MQ_NTSC_U/objects/object_dnk.xml | 35 + .../xml/GC_MQ_NTSC_U/objects/object_dns.xml | 40 + .../GC_MQ_NTSC_U/objects/object_dodojr.xml | 33 + .../GC_MQ_NTSC_U/objects/object_dodongo.xml | 41 + .../xml/GC_MQ_NTSC_U/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/GC_MQ_NTSC_U/objects/object_ds.xml | 38 + .../xml/GC_MQ_NTSC_U/objects/object_ds2.xml | 34 + .../xml/GC_MQ_NTSC_U/objects/object_du.xml | 81 + .../GC_MQ_NTSC_U/objects/object_dy_obj.xml | 121 + .../xml/GC_MQ_NTSC_U/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../GC_MQ_NTSC_U/objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../GC_MQ_NTSC_U/objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../GC_MQ_NTSC_U/objects/object_efc_tw.xml | 13 + .../xml/GC_MQ_NTSC_U/objects/object_ei.xml | 56 + .../xml/GC_MQ_NTSC_U/objects/object_fa.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_fd.xml | 103 + .../xml/GC_MQ_NTSC_U/objects/object_fd2.xml | 52 + .../xml/GC_MQ_NTSC_U/objects/object_fhg.xml | 54 + .../xml/GC_MQ_NTSC_U/objects/object_fire.xml | 14 + .../GC_MQ_NTSC_U/objects/object_firefly.xml | 21 + .../xml/GC_MQ_NTSC_U/objects/object_fish.xml | 180 + .../xml/GC_MQ_NTSC_U/objects/object_fr.xml | 65 + .../xml/GC_MQ_NTSC_U/objects/object_fu.xml | 55 + .../xml/GC_MQ_NTSC_U/objects/object_fw.xml | 106 + .../xml/GC_MQ_NTSC_U/objects/object_fz.xml | 12 + .../xml/GC_MQ_NTSC_U/objects/object_ganon.xml | 106 + .../GC_MQ_NTSC_U/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_ge1.xml | 78 + .../xml/GC_MQ_NTSC_U/objects/object_geff.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_geldb.xml | 44 + .../GC_MQ_NTSC_U/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../GC_MQ_NTSC_U/objects/object_gi_bean.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../objects/object_gi_boots_2.xml | 7 + .../objects/object_gi_bosskey.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../objects/object_gi_clothes.xml | 11 + .../GC_MQ_NTSC_U/objects/object_gi_coin.xml | 10 + .../objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../GC_MQ_NTSC_U/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_fire.xml | 8 + .../GC_MQ_NTSC_U/objects/object_gi_fish.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_frog.xml | 7 + .../GC_MQ_NTSC_U/objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../GC_MQ_NTSC_U/objects/object_gi_ghost.xml | 11 + .../objects/object_gi_glasses.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_gloves.xml | 11 + .../objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../GC_MQ_NTSC_U/objects/object_gi_grass.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_hammer.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_heart.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../GC_MQ_NTSC_U/objects/object_gi_insect.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_jewel.xml | 15 + .../GC_MQ_NTSC_U/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../GC_MQ_NTSC_U/objects/object_gi_letter.xml | 8 + .../GC_MQ_NTSC_U/objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_map.xml | 7 + .../GC_MQ_NTSC_U/objects/object_gi_medal.xml | 11 + .../GC_MQ_NTSC_U/objects/object_gi_melody.xml | 11 + .../GC_MQ_NTSC_U/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../GC_MQ_NTSC_U/objects/object_gi_nuts.xml | 6 + .../objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../GC_MQ_NTSC_U/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_rupy.xml | 16 + .../GC_MQ_NTSC_U/objects/object_gi_saw.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_scale.xml | 10 + .../GC_MQ_NTSC_U/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../objects/object_gi_soldout.xml | 6 + .../GC_MQ_NTSC_U/objects/object_gi_soul.xml | 8 + .../GC_MQ_NTSC_U/objects/object_gi_stick.xml | 5 + .../GC_MQ_NTSC_U/objects/object_gi_sutaru.xml | 6 + .../objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/GC_MQ_NTSC_U/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_gla.xml | 85 + .../xml/GC_MQ_NTSC_U/objects/object_gm.xml | 5 + .../xml/GC_MQ_NTSC_U/objects/object_gnd.xml | 87 + .../GC_MQ_NTSC_U/objects/object_gnd_magic.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_gndd.xml | 106 + .../GC_MQ_NTSC_U/objects/object_god_lgt.xml | 9 + .../xml/GC_MQ_NTSC_U/objects/object_gol.xml | 59 + .../xml/GC_MQ_NTSC_U/objects/object_goma.xml | 169 + .../GC_MQ_NTSC_U/objects/object_goroiwa.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_gr.xml | 27 + .../xml/GC_MQ_NTSC_U/objects/object_gs.xml | 8 + .../xml/GC_MQ_NTSC_U/objects/object_gt.xml | 38 + .../xml/GC_MQ_NTSC_U/objects/object_haka.xml | 10 + .../GC_MQ_NTSC_U/objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/GC_MQ_NTSC_U/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../GC_MQ_NTSC_U/objects/object_hintnuts.xml | 29 + .../xml/GC_MQ_NTSC_U/objects/object_hni.xml | 51 + .../xml/GC_MQ_NTSC_U/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/GC_MQ_NTSC_U/objects/object_hs.xml | 47 + .../xml/GC_MQ_NTSC_U/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/GC_MQ_NTSC_U/objects/object_ik.xml | 108 + .../xml/GC_MQ_NTSC_U/objects/object_im.xml | 79 + .../xml/GC_MQ_NTSC_U/objects/object_in.xml | 142 + .../GC_MQ_NTSC_U/objects/object_ingate.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_jj.xml | 77 + .../xml/GC_MQ_NTSC_U/objects/object_js.xml | 55 + .../GC_MQ_NTSC_U/objects/object_jya_door.xml | 8 + .../GC_MQ_NTSC_U/objects/object_jya_iron.xml | 13 + .../GC_MQ_NTSC_U/objects/object_jya_obj.xml | 87 + .../xml/GC_MQ_NTSC_U/objects/object_ka.xml | 64 + .../GC_MQ_NTSC_U/objects/object_kanban.xml | 18 + .../GC_MQ_NTSC_U/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/GC_MQ_NTSC_U/objects/object_km1.xml | 39 + .../xml/GC_MQ_NTSC_U/objects/object_kusa.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_kw1.xml | 63 + .../xml/GC_MQ_NTSC_U/objects/object_kz.xml | 45 + .../objects/object_light_ring.xml | 6 + .../GC_MQ_NTSC_U/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../GC_MQ_NTSC_U/objects/object_link_boy.xml | 282 ++ .../objects/object_link_child.xml | 225 + .../xml/GC_MQ_NTSC_U/objects/object_ma1.xml | 67 + .../xml/GC_MQ_NTSC_U/objects/object_ma2.xml | 75 + .../xml/GC_MQ_NTSC_U/objects/object_mag.xml | 23 + .../GC_MQ_NTSC_U/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/GC_MQ_NTSC_U/objects/object_mb.xml | 73 + .../xml/GC_MQ_NTSC_U/objects/object_md.xml | 87 + .../xml/GC_MQ_NTSC_U/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../GC_MQ_NTSC_U/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/GC_MQ_NTSC_U/objects/object_mjin.xml | 8 + .../GC_MQ_NTSC_U/objects/object_mjin_dark.xml | 5 + .../objects/object_mjin_flame.xml | 5 + .../objects/object_mjin_flash.xml | 5 + .../GC_MQ_NTSC_U/objects/object_mjin_ice.xml | 5 + .../GC_MQ_NTSC_U/objects/object_mjin_oka.xml | 8 + .../GC_MQ_NTSC_U/objects/object_mjin_soul.xml | 5 + .../GC_MQ_NTSC_U/objects/object_mjin_wind.xml | 5 + .../xml/GC_MQ_NTSC_U/objects/object_mk.xml | 44 + .../xml/GC_MQ_NTSC_U/objects/object_mm.xml | 25 + .../xml/GC_MQ_NTSC_U/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../GC_MQ_NTSC_U/objects/object_mori_tex.xml | 29 + .../xml/GC_MQ_NTSC_U/objects/object_ms.xml | 43 + .../xml/GC_MQ_NTSC_U/objects/object_mu.xml | 96 + .../xml/GC_MQ_NTSC_U/objects/object_nb.xml | 118 + .../xml/GC_MQ_NTSC_U/objects/object_niw.xml | 49 + .../xml/GC_MQ_NTSC_U/objects/object_nwc.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_ny.xml | 10 + .../xml/GC_MQ_NTSC_U/objects/object_oA1.xml | 69 + .../xml/GC_MQ_NTSC_U/objects/object_oA10.xml | 66 + .../xml/GC_MQ_NTSC_U/objects/object_oA11.xml | 66 + .../xml/GC_MQ_NTSC_U/objects/object_oA2.xml | 58 + .../xml/GC_MQ_NTSC_U/objects/object_oA3.xml | 11 + .../xml/GC_MQ_NTSC_U/objects/object_oA4.xml | 64 + .../xml/GC_MQ_NTSC_U/objects/object_oA5.xml | 64 + .../xml/GC_MQ_NTSC_U/objects/object_oA6.xml | 64 + .../xml/GC_MQ_NTSC_U/objects/object_oA7.xml | 62 + .../xml/GC_MQ_NTSC_U/objects/object_oA8.xml | 61 + .../xml/GC_MQ_NTSC_U/objects/object_oA9.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_oB1.xml | 69 + .../xml/GC_MQ_NTSC_U/objects/object_oB2.xml | 76 + .../xml/GC_MQ_NTSC_U/objects/object_oB3.xml | 70 + .../xml/GC_MQ_NTSC_U/objects/object_oB4.xml | 64 + .../xml/GC_MQ_NTSC_U/objects/object_oE1.xml | 70 + .../xml/GC_MQ_NTSC_U/objects/object_oE10.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_oE11.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_oE12.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_oE1s.xml | 52 + .../xml/GC_MQ_NTSC_U/objects/object_oE2.xml | 71 + .../xml/GC_MQ_NTSC_U/objects/object_oE3.xml | 73 + .../xml/GC_MQ_NTSC_U/objects/object_oE4.xml | 69 + .../xml/GC_MQ_NTSC_U/objects/object_oE4s.xml | 48 + .../xml/GC_MQ_NTSC_U/objects/object_oE5.xml | 64 + .../xml/GC_MQ_NTSC_U/objects/object_oE6.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_oE7.xml | 14 + .../xml/GC_MQ_NTSC_U/objects/object_oE8.xml | 15 + .../xml/GC_MQ_NTSC_U/objects/object_oE9.xml | 15 + .../GC_MQ_NTSC_U/objects/object_oE_anime.xml | 10 + .../GC_MQ_NTSC_U/objects/object_oF1d_map.xml | 54 + .../xml/GC_MQ_NTSC_U/objects/object_oF1s.xml | 58 + .../GC_MQ_NTSC_U/objects/object_o_anime.xml | 11 + .../xml/GC_MQ_NTSC_U/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/GC_MQ_NTSC_U/objects/object_os.xml | 36 + .../GC_MQ_NTSC_U/objects/object_os_anime.xml | 69 + .../xml/GC_MQ_NTSC_U/objects/object_ossan.xml | 23 + .../GC_MQ_NTSC_U/objects/object_ouke_haka.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_owl.xml | 79 + .../GC_MQ_NTSC_U/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../GC_MQ_NTSC_U/objects/object_po_field.xml | 31 + .../objects/object_po_sisters.xml | 56 + .../xml/GC_MQ_NTSC_U/objects/object_poh.xml | 25 + .../xml/GC_MQ_NTSC_U/objects/object_ps.xml | 42 + .../GC_MQ_NTSC_U/objects/object_pu_box.xml | 13 + .../xml/GC_MQ_NTSC_U/objects/object_rd.xml | 124 + .../xml/GC_MQ_NTSC_U/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/GC_MQ_NTSC_U/objects/object_rl.xml | 52 + .../xml/GC_MQ_NTSC_U/objects/object_rr.xml | 8 + .../xml/GC_MQ_NTSC_U/objects/object_rs.xml | 32 + .../xml/GC_MQ_NTSC_U/objects/object_ru1.xml | 83 + .../xml/GC_MQ_NTSC_U/objects/object_ru2.xml | 92 + .../xml/GC_MQ_NTSC_U/objects/object_sa.xml | 100 + .../xml/GC_MQ_NTSC_U/objects/object_sb.xml | 30 + .../xml/GC_MQ_NTSC_U/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../GC_MQ_NTSC_U/objects/object_shopnuts.xml | 67 + .../GC_MQ_NTSC_U/objects/object_siofuki.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_sk2.xml | 130 + .../xml/GC_MQ_NTSC_U/objects/object_skb.xml | 64 + .../xml/GC_MQ_NTSC_U/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../objects/object_spot08_obj.xml | 27 + .../objects/object_spot09_obj.xml | 35 + .../objects/object_spot11_obj.xml | 9 + .../objects/object_spot12_obj.xml | 13 + .../objects/object_spot15_obj.xml | 13 + .../objects/object_spot16_obj.xml | 11 + .../objects/object_spot17_obj.xml | 12 + .../objects/object_spot18_obj.xml | 36 + .../xml/GC_MQ_NTSC_U/objects/object_ssh.xml | 61 + .../xml/GC_MQ_NTSC_U/objects/object_sst.xml | 71 + .../xml/GC_MQ_NTSC_U/objects/object_st.xml | 71 + .../GC_MQ_NTSC_U/objects/object_stream.xml | 6 + .../GC_MQ_NTSC_U/objects/object_syokudai.xml | 13 + .../xml/GC_MQ_NTSC_U/objects/object_ta.xml | 72 + .../GC_MQ_NTSC_U/objects/object_timeblock.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_tite.xml | 55 + .../xml/GC_MQ_NTSC_U/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../GC_MQ_NTSC_U/objects/object_torch2.xml | 13 + .../xml/GC_MQ_NTSC_U/objects/object_toryo.xml | 53 + .../xml/GC_MQ_NTSC_U/objects/object_tp.xml | 17 + .../xml/GC_MQ_NTSC_U/objects/object_tr.xml | 149 + .../xml/GC_MQ_NTSC_U/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/GC_MQ_NTSC_U/objects/object_ts.xml | 34 + .../xml/GC_MQ_NTSC_U/objects/object_tsubo.xml | 9 + .../xml/GC_MQ_NTSC_U/objects/object_tw.xml | 332 ++ .../GC_MQ_NTSC_U/objects/object_umajump.xml | 8 + .../xml/GC_MQ_NTSC_U/objects/object_vali.xml | 63 + .../xml/GC_MQ_NTSC_U/objects/object_vase.xml | 7 + .../xml/GC_MQ_NTSC_U/objects/object_vm.xml | 41 + .../objects/object_wallmaster.xml | 35 + .../xml/GC_MQ_NTSC_U/objects/object_warp1.xml | 39 + .../xml/GC_MQ_NTSC_U/objects/object_warp2.xml | 6 + .../xml/GC_MQ_NTSC_U/objects/object_wf.xml | 128 + .../GC_MQ_NTSC_U/objects/object_wood02.xml | 35 + .../xml/GC_MQ_NTSC_U/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../GC_MQ_NTSC_U/objects/object_yukabyun.xml | 9 + .../xml/GC_MQ_NTSC_U/objects/object_zf.xml | 182 + .../xml/GC_MQ_NTSC_U/objects/object_zg.xml | 8 + .../xml/GC_MQ_NTSC_U/objects/object_zl1.xml | 115 + .../xml/GC_MQ_NTSC_U/objects/object_zl2.xml | 75 + .../objects/object_zl2_anime1.xml | 30 + .../objects/object_zl2_anime2.xml | 40 + .../xml/GC_MQ_NTSC_U/objects/object_zl4.xml | 91 + .../xml/GC_MQ_NTSC_U/objects/object_zo.xml | 88 + .../GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml | 11 + .../GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml | 11 + .../GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../overlays/ovl_Boss_Dodongo.xml | 6 + .../GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml | 68 + .../GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml | 76 + .../GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml | 10 + .../GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml | 10 + .../xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml | 7 + .../overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml | 8 + .../GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml | 38 + .../GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml | 8 + .../xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml | 9 + .../xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml | 8 + .../xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml | 8 + .../xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml | 15 + .../GC_MQ_NTSC_U/overlays/ovl_End_Title.xml | 17 + .../GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml | 22 + .../GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml | 12 + .../GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml | 10 + .../GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml | 15 + .../GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml | 10 + .../GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml | 11 + .../GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml | 10 + .../GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml | 11 + .../GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml | 10 + .../GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml | 11 + .../GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml | 231 + .../GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml | 34 + .../GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml | 191 + .../scenes/dungeons/HAKAdanCH.xml | 70 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml | 288 ++ .../GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml | 262 ++ .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml | 96 + .../scenes/dungeons/bdan_boss.xml | 20 + .../xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml | 220 + .../scenes/dungeons/ddan_boss.xml | 22 + .../GC_MQ_NTSC_U/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../scenes/dungeons/ganon_tou.xml | 34 + .../scenes/dungeons/ganontika.xml | 254 ++ .../scenes/dungeons/ganontikasonogo.xml | 36 + .../scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 106 + .../scenes/dungeons/jyasinboss.xml | 49 + .../scenes/dungeons/jyasinzou.xml | 358 ++ .../xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml | 126 + .../scenes/dungeons/moribossroom.xml | 33 + .../xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml | 157 + .../scenes/dungeons/ydan_boss.xml | 26 + .../GC_MQ_NTSC_U/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml | 8 + .../scenes/indoors/hylia_labo.xml | 39 + .../xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml | 8 + .../GC_MQ_NTSC_U/scenes/indoors/kakariko.xml | 8 + .../scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml | 8 + .../GC_MQ_NTSC_U/scenes/indoors/link_home.xml | 8 + .../GC_MQ_NTSC_U/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../scenes/indoors/miharigoya.xml | 28 + .../GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../GC_MQ_NTSC_U/scenes/indoors/takaraya.xml | 53 + .../xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml | 8 + .../GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml | 18 + .../xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml | 26 + .../GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml | 37 + .../GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml | 8 + .../GC_MQ_NTSC_U/scenes/misc/kakariko3.xml | 8 + .../GC_MQ_NTSC_U/scenes/misc/kakusiana.xml | 113 + .../xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml | 23 + .../GC_MQ_NTSC_U/scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../GC_MQ_NTSC_U/scenes/misc/market_day.xml | 9 + .../GC_MQ_NTSC_U/scenes/misc/market_night.xml | 9 + .../GC_MQ_NTSC_U/scenes/misc/market_ruins.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml | 9 + .../xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml | 35 + .../GC_MQ_NTSC_U/scenes/overworld/entra.xml | 8 + .../GC_MQ_NTSC_U/scenes/overworld/souko.xml | 44 + .../GC_MQ_NTSC_U/scenes/overworld/spot00.xml | 69 + .../GC_MQ_NTSC_U/scenes/overworld/spot01.xml | 51 + .../GC_MQ_NTSC_U/scenes/overworld/spot02.xml | 64 + .../GC_MQ_NTSC_U/scenes/overworld/spot03.xml | 41 + .../GC_MQ_NTSC_U/scenes/overworld/spot04.xml | 81 + .../GC_MQ_NTSC_U/scenes/overworld/spot05.xml | 43 + .../GC_MQ_NTSC_U/scenes/overworld/spot06.xml | 58 + .../GC_MQ_NTSC_U/scenes/overworld/spot07.xml | 47 + .../GC_MQ_NTSC_U/scenes/overworld/spot08.xml | 36 + .../GC_MQ_NTSC_U/scenes/overworld/spot09.xml | 37 + .../GC_MQ_NTSC_U/scenes/overworld/spot10.xml | 71 + .../GC_MQ_NTSC_U/scenes/overworld/spot11.xml | 41 + .../GC_MQ_NTSC_U/scenes/overworld/spot12.xml | 52 + .../GC_MQ_NTSC_U/scenes/overworld/spot13.xml | 39 + .../GC_MQ_NTSC_U/scenes/overworld/spot15.xml | 52 + .../GC_MQ_NTSC_U/scenes/overworld/spot16.xml | 50 + .../GC_MQ_NTSC_U/scenes/overworld/spot17.xml | 54 + .../GC_MQ_NTSC_U/scenes/overworld/spot18.xml | 105 + .../GC_MQ_NTSC_U/scenes/overworld/spot20.xml | 36 + .../GC_MQ_NTSC_U/scenes/shops/alley_shop.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/shops/drag.xml | 8 + .../GC_MQ_NTSC_U/scenes/shops/face_shop.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/shops/golon.xml | 8 + .../GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml | 8 + .../GC_MQ_NTSC_U/scenes/shops/night_shop.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml | 8 + .../xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml | 8 + .../GC_MQ_NTSC_U/text/elf_message_field.xml | 5 + .../GC_MQ_NTSC_U/text/elf_message_ydan.xml | 5 + .../GC_MQ_NTSC_U/text/message_data_static.xml | 11 + .../xml/GC_MQ_NTSC_U/textures/backgrounds.xml | 246 + .../textures/boss_title_cards.xml | 42 + .../textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../textures/icon_item_static.xml | 188 + .../textures/item_name_static.xml | 250 ++ .../xml/GC_MQ_NTSC_U/textures/kanji.xml | 3984 +++++++++++++++++ .../textures/map_48x85_static.xml | 72 + .../textures/map_grand_static.xml | 28 + .../GC_MQ_NTSC_U/textures/map_i_static.xml | 243 + .../GC_MQ_NTSC_U/textures/map_name_static.xml | 72 + .../GC_MQ_NTSC_U/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../GC_MQ_NTSC_U/textures/nes_font_static.xml | 145 + .../textures/nintendo_rogo_static.xml | 9 + .../textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/GC_MQ_NTSC_U/textures/skyboxes.xml | 113 + .../GC_MQ_NTSC_U/textures/title_static.xml | 169 + soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml | 1558 +++++++ .../xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml | 13 + .../GC_NMQ_NTSC_J/code/fbdemo_triforce.xml | 8 + .../xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml | 10 + .../xml/GC_NMQ_NTSC_J/code/sys_matrix.xml | 5 + .../xml/GC_NMQ_NTSC_J/misc/link_animetion.xml | 577 +++ .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../GC_NMQ_NTSC_J/objects/gameplay_keep.xml | 1011 +++++ .../xml/GC_NMQ_NTSC_J/objects/object_Bb.xml | 37 + .../xml/GC_NMQ_NTSC_J/objects/object_ahg.xml | 61 + .../xml/GC_NMQ_NTSC_J/objects/object_am.xml | 22 + .../xml/GC_NMQ_NTSC_J/objects/object_ane.xml | 59 + .../xml/GC_NMQ_NTSC_J/objects/object_ani.xml | 67 + .../GC_NMQ_NTSC_J/objects/object_anubice.xml | 29 + .../xml/GC_NMQ_NTSC_J/objects/object_aob.xml | 59 + .../GC_NMQ_NTSC_J/objects/object_b_heart.xml | 8 + .../xml/GC_NMQ_NTSC_J/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../GC_NMQ_NTSC_J/objects/object_bdoor.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_bg.xml | 50 + .../GC_NMQ_NTSC_J/objects/object_bigokuta.xml | 58 + .../xml/GC_NMQ_NTSC_J/objects/object_bird.xml | 30 + .../xml/GC_NMQ_NTSC_J/objects/object_bji.xml | 56 + .../xml/GC_NMQ_NTSC_J/objects/object_bl.xml | 32 + .../GC_NMQ_NTSC_J/objects/object_blkobj.xml | 37 + .../xml/GC_NMQ_NTSC_J/objects/object_bob.xml | 47 + .../xml/GC_NMQ_NTSC_J/objects/object_boj.xml | 65 + .../GC_NMQ_NTSC_J/objects/object_bombf.xml | 14 + .../GC_NMQ_NTSC_J/objects/object_bombiwa.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_bowl.xml | 18 + .../xml/GC_NMQ_NTSC_J/objects/object_box.xml | 30 + .../xml/GC_NMQ_NTSC_J/objects/object_brob.xml | 25 + .../GC_NMQ_NTSC_J/objects/object_bubble.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_bv.xml | 116 + .../xml/GC_NMQ_NTSC_J/objects/object_bw.xml | 29 + .../GC_NMQ_NTSC_J/objects/object_bwall.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_bxa.xml | 13 + .../xml/GC_NMQ_NTSC_J/objects/object_cne.xml | 53 + .../xml/GC_NMQ_NTSC_J/objects/object_cob.xml | 41 + .../xml/GC_NMQ_NTSC_J/objects/object_cow.xml | 55 + .../xml/GC_NMQ_NTSC_J/objects/object_crow.xml | 11 + .../xml/GC_NMQ_NTSC_J/objects/object_cs.xml | 60 + .../objects/object_d_elevator.xml | 7 + .../objects/object_d_hsblock.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_d_lift.xml | 8 + .../GC_NMQ_NTSC_J/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../GC_NMQ_NTSC_J/objects/object_dekubaba.xml | 38 + .../GC_NMQ_NTSC_J/objects/object_dekujr.xml | 13 + .../GC_NMQ_NTSC_J/objects/object_dekunuts.xml | 32 + .../GC_NMQ_NTSC_J/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_dh.xml | 59 + .../xml/GC_NMQ_NTSC_J/objects/object_dnk.xml | 35 + .../xml/GC_NMQ_NTSC_J/objects/object_dns.xml | 40 + .../GC_NMQ_NTSC_J/objects/object_dodojr.xml | 33 + .../GC_NMQ_NTSC_J/objects/object_dodongo.xml | 41 + .../xml/GC_NMQ_NTSC_J/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/GC_NMQ_NTSC_J/objects/object_ds.xml | 38 + .../xml/GC_NMQ_NTSC_J/objects/object_ds2.xml | 34 + .../xml/GC_NMQ_NTSC_J/objects/object_du.xml | 81 + .../GC_NMQ_NTSC_J/objects/object_dy_obj.xml | 121 + .../xml/GC_NMQ_NTSC_J/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../GC_NMQ_NTSC_J/objects/object_efc_tw.xml | 13 + .../xml/GC_NMQ_NTSC_J/objects/object_ei.xml | 56 + .../xml/GC_NMQ_NTSC_J/objects/object_fa.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_fd.xml | 103 + .../xml/GC_NMQ_NTSC_J/objects/object_fd2.xml | 52 + .../xml/GC_NMQ_NTSC_J/objects/object_fhg.xml | 54 + .../xml/GC_NMQ_NTSC_J/objects/object_fire.xml | 14 + .../GC_NMQ_NTSC_J/objects/object_firefly.xml | 21 + .../xml/GC_NMQ_NTSC_J/objects/object_fish.xml | 180 + .../xml/GC_NMQ_NTSC_J/objects/object_fr.xml | 65 + .../xml/GC_NMQ_NTSC_J/objects/object_fu.xml | 55 + .../xml/GC_NMQ_NTSC_J/objects/object_fw.xml | 106 + .../xml/GC_NMQ_NTSC_J/objects/object_fz.xml | 12 + .../GC_NMQ_NTSC_J/objects/object_ganon.xml | 106 + .../GC_NMQ_NTSC_J/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_ge1.xml | 78 + .../xml/GC_NMQ_NTSC_J/objects/object_geff.xml | 7 + .../GC_NMQ_NTSC_J/objects/object_geldb.xml | 44 + .../GC_NMQ_NTSC_J/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../GC_NMQ_NTSC_J/objects/object_gi_bean.xml | 5 + .../objects/object_gi_bomb_1.xml | 5 + .../objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../objects/object_gi_boots_2.xml | 7 + .../objects/object_gi_bosskey.xml | 6 + .../objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../objects/object_gi_clothes.xml | 11 + .../GC_NMQ_NTSC_J/objects/object_gi_coin.xml | 10 + .../objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../GC_NMQ_NTSC_J/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_gi_fire.xml | 8 + .../GC_NMQ_NTSC_J/objects/object_gi_fish.xml | 5 + .../GC_NMQ_NTSC_J/objects/object_gi_frog.xml | 7 + .../objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_gi_ghost.xml | 11 + .../objects/object_gi_glasses.xml | 6 + .../objects/object_gi_gloves.xml | 11 + .../objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_gi_grass.xml | 5 + .../objects/object_gi_hammer.xml | 5 + .../GC_NMQ_NTSC_J/objects/object_gi_heart.xml | 5 + .../objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../objects/object_gi_insect.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_gi_jewel.xml | 15 + .../GC_NMQ_NTSC_J/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../objects/object_gi_letter.xml | 8 + .../objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_gi_map.xml | 7 + .../GC_NMQ_NTSC_J/objects/object_gi_medal.xml | 11 + .../objects/object_gi_melody.xml | 11 + .../GC_NMQ_NTSC_J/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_gi_nuts.xml | 6 + .../objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../GC_NMQ_NTSC_J/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../GC_NMQ_NTSC_J/objects/object_gi_rupy.xml | 16 + .../GC_NMQ_NTSC_J/objects/object_gi_saw.xml | 5 + .../GC_NMQ_NTSC_J/objects/object_gi_scale.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../objects/object_gi_soldout.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_gi_soul.xml | 8 + .../GC_NMQ_NTSC_J/objects/object_gi_stick.xml | 5 + .../objects/object_gi_sutaru.xml | 6 + .../objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/GC_NMQ_NTSC_J/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_gla.xml | 85 + .../xml/GC_NMQ_NTSC_J/objects/object_gm.xml | 5 + .../xml/GC_NMQ_NTSC_J/objects/object_gnd.xml | 87 + .../objects/object_gnd_magic.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_gndd.xml | 106 + .../GC_NMQ_NTSC_J/objects/object_god_lgt.xml | 9 + .../xml/GC_NMQ_NTSC_J/objects/object_gol.xml | 59 + .../xml/GC_NMQ_NTSC_J/objects/object_goma.xml | 169 + .../GC_NMQ_NTSC_J/objects/object_goroiwa.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_gr.xml | 27 + .../xml/GC_NMQ_NTSC_J/objects/object_gs.xml | 8 + .../xml/GC_NMQ_NTSC_J/objects/object_gt.xml | 38 + .../xml/GC_NMQ_NTSC_J/objects/object_haka.xml | 10 + .../objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/GC_NMQ_NTSC_J/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../GC_NMQ_NTSC_J/objects/object_hintnuts.xml | 29 + .../xml/GC_NMQ_NTSC_J/objects/object_hni.xml | 51 + .../GC_NMQ_NTSC_J/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/GC_NMQ_NTSC_J/objects/object_hs.xml | 47 + .../GC_NMQ_NTSC_J/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/GC_NMQ_NTSC_J/objects/object_ik.xml | 108 + .../xml/GC_NMQ_NTSC_J/objects/object_im.xml | 79 + .../xml/GC_NMQ_NTSC_J/objects/object_in.xml | 142 + .../GC_NMQ_NTSC_J/objects/object_ingate.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_jj.xml | 77 + .../xml/GC_NMQ_NTSC_J/objects/object_js.xml | 55 + .../GC_NMQ_NTSC_J/objects/object_jya_door.xml | 8 + .../GC_NMQ_NTSC_J/objects/object_jya_iron.xml | 13 + .../GC_NMQ_NTSC_J/objects/object_jya_obj.xml | 87 + .../xml/GC_NMQ_NTSC_J/objects/object_ka.xml | 64 + .../GC_NMQ_NTSC_J/objects/object_kanban.xml | 18 + .../GC_NMQ_NTSC_J/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/GC_NMQ_NTSC_J/objects/object_km1.xml | 39 + .../xml/GC_NMQ_NTSC_J/objects/object_kusa.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_kw1.xml | 63 + .../xml/GC_NMQ_NTSC_J/objects/object_kz.xml | 45 + .../objects/object_light_ring.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../GC_NMQ_NTSC_J/objects/object_link_boy.xml | 282 ++ .../objects/object_link_child.xml | 225 + .../xml/GC_NMQ_NTSC_J/objects/object_ma1.xml | 67 + .../xml/GC_NMQ_NTSC_J/objects/object_ma2.xml | 75 + .../xml/GC_NMQ_NTSC_J/objects/object_mag.xml | 20 + .../GC_NMQ_NTSC_J/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/GC_NMQ_NTSC_J/objects/object_mb.xml | 73 + .../xml/GC_NMQ_NTSC_J/objects/object_md.xml | 87 + .../GC_NMQ_NTSC_J/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../GC_NMQ_NTSC_J/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/GC_NMQ_NTSC_J/objects/object_mjin.xml | 8 + .../objects/object_mjin_dark.xml | 5 + .../objects/object_mjin_flame.xml | 5 + .../objects/object_mjin_flash.xml | 5 + .../GC_NMQ_NTSC_J/objects/object_mjin_ice.xml | 5 + .../GC_NMQ_NTSC_J/objects/object_mjin_oka.xml | 8 + .../objects/object_mjin_soul.xml | 5 + .../objects/object_mjin_wind.xml | 5 + .../xml/GC_NMQ_NTSC_J/objects/object_mk.xml | 44 + .../xml/GC_NMQ_NTSC_J/objects/object_mm.xml | 25 + .../xml/GC_NMQ_NTSC_J/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../GC_NMQ_NTSC_J/objects/object_mori_tex.xml | 29 + .../xml/GC_NMQ_NTSC_J/objects/object_ms.xml | 43 + .../xml/GC_NMQ_NTSC_J/objects/object_mu.xml | 96 + .../xml/GC_NMQ_NTSC_J/objects/object_nb.xml | 118 + .../xml/GC_NMQ_NTSC_J/objects/object_niw.xml | 49 + .../xml/GC_NMQ_NTSC_J/objects/object_nwc.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_ny.xml | 10 + .../xml/GC_NMQ_NTSC_J/objects/object_oA1.xml | 69 + .../xml/GC_NMQ_NTSC_J/objects/object_oA10.xml | 66 + .../xml/GC_NMQ_NTSC_J/objects/object_oA11.xml | 66 + .../xml/GC_NMQ_NTSC_J/objects/object_oA2.xml | 58 + .../xml/GC_NMQ_NTSC_J/objects/object_oA3.xml | 11 + .../xml/GC_NMQ_NTSC_J/objects/object_oA4.xml | 64 + .../xml/GC_NMQ_NTSC_J/objects/object_oA5.xml | 64 + .../xml/GC_NMQ_NTSC_J/objects/object_oA6.xml | 64 + .../xml/GC_NMQ_NTSC_J/objects/object_oA7.xml | 62 + .../xml/GC_NMQ_NTSC_J/objects/object_oA8.xml | 61 + .../xml/GC_NMQ_NTSC_J/objects/object_oA9.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_oB1.xml | 69 + .../xml/GC_NMQ_NTSC_J/objects/object_oB2.xml | 76 + .../xml/GC_NMQ_NTSC_J/objects/object_oB3.xml | 70 + .../xml/GC_NMQ_NTSC_J/objects/object_oB4.xml | 64 + .../xml/GC_NMQ_NTSC_J/objects/object_oE1.xml | 70 + .../xml/GC_NMQ_NTSC_J/objects/object_oE10.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_oE11.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_oE12.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml | 52 + .../xml/GC_NMQ_NTSC_J/objects/object_oE2.xml | 71 + .../xml/GC_NMQ_NTSC_J/objects/object_oE3.xml | 73 + .../xml/GC_NMQ_NTSC_J/objects/object_oE4.xml | 69 + .../xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml | 48 + .../xml/GC_NMQ_NTSC_J/objects/object_oE5.xml | 64 + .../xml/GC_NMQ_NTSC_J/objects/object_oE6.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_oE7.xml | 14 + .../xml/GC_NMQ_NTSC_J/objects/object_oE8.xml | 15 + .../xml/GC_NMQ_NTSC_J/objects/object_oE9.xml | 15 + .../GC_NMQ_NTSC_J/objects/object_oE_anime.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_oF1d_map.xml | 54 + .../xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml | 58 + .../GC_NMQ_NTSC_J/objects/object_o_anime.xml | 11 + .../GC_NMQ_NTSC_J/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/GC_NMQ_NTSC_J/objects/object_os.xml | 36 + .../GC_NMQ_NTSC_J/objects/object_os_anime.xml | 69 + .../GC_NMQ_NTSC_J/objects/object_ossan.xml | 23 + .../objects/object_ouke_haka.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_owl.xml | 79 + .../GC_NMQ_NTSC_J/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../GC_NMQ_NTSC_J/objects/object_po_field.xml | 31 + .../objects/object_po_sisters.xml | 56 + .../xml/GC_NMQ_NTSC_J/objects/object_poh.xml | 25 + .../xml/GC_NMQ_NTSC_J/objects/object_ps.xml | 42 + .../GC_NMQ_NTSC_J/objects/object_pu_box.xml | 13 + .../xml/GC_NMQ_NTSC_J/objects/object_rd.xml | 124 + .../GC_NMQ_NTSC_J/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/GC_NMQ_NTSC_J/objects/object_rl.xml | 52 + .../xml/GC_NMQ_NTSC_J/objects/object_rr.xml | 8 + .../xml/GC_NMQ_NTSC_J/objects/object_rs.xml | 32 + .../xml/GC_NMQ_NTSC_J/objects/object_ru1.xml | 83 + .../xml/GC_NMQ_NTSC_J/objects/object_ru2.xml | 92 + .../xml/GC_NMQ_NTSC_J/objects/object_sa.xml | 100 + .../xml/GC_NMQ_NTSC_J/objects/object_sb.xml | 30 + .../xml/GC_NMQ_NTSC_J/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../GC_NMQ_NTSC_J/objects/object_shopnuts.xml | 67 + .../GC_NMQ_NTSC_J/objects/object_siofuki.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_sk2.xml | 130 + .../xml/GC_NMQ_NTSC_J/objects/object_skb.xml | 64 + .../xml/GC_NMQ_NTSC_J/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../objects/object_spot08_obj.xml | 27 + .../objects/object_spot09_obj.xml | 35 + .../objects/object_spot11_obj.xml | 9 + .../objects/object_spot12_obj.xml | 13 + .../objects/object_spot15_obj.xml | 13 + .../objects/object_spot16_obj.xml | 11 + .../objects/object_spot17_obj.xml | 12 + .../objects/object_spot18_obj.xml | 36 + .../xml/GC_NMQ_NTSC_J/objects/object_ssh.xml | 61 + .../xml/GC_NMQ_NTSC_J/objects/object_sst.xml | 71 + .../xml/GC_NMQ_NTSC_J/objects/object_st.xml | 71 + .../GC_NMQ_NTSC_J/objects/object_stream.xml | 6 + .../GC_NMQ_NTSC_J/objects/object_syokudai.xml | 13 + .../xml/GC_NMQ_NTSC_J/objects/object_ta.xml | 72 + .../objects/object_timeblock.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_tite.xml | 55 + .../xml/GC_NMQ_NTSC_J/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../GC_NMQ_NTSC_J/objects/object_torch2.xml | 13 + .../GC_NMQ_NTSC_J/objects/object_toryo.xml | 53 + .../xml/GC_NMQ_NTSC_J/objects/object_tp.xml | 17 + .../xml/GC_NMQ_NTSC_J/objects/object_tr.xml | 149 + .../xml/GC_NMQ_NTSC_J/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/GC_NMQ_NTSC_J/objects/object_ts.xml | 34 + .../GC_NMQ_NTSC_J/objects/object_tsubo.xml | 9 + .../xml/GC_NMQ_NTSC_J/objects/object_tw.xml | 332 ++ .../GC_NMQ_NTSC_J/objects/object_umajump.xml | 8 + .../xml/GC_NMQ_NTSC_J/objects/object_vali.xml | 63 + .../xml/GC_NMQ_NTSC_J/objects/object_vase.xml | 7 + .../xml/GC_NMQ_NTSC_J/objects/object_vm.xml | 41 + .../objects/object_wallmaster.xml | 35 + .../GC_NMQ_NTSC_J/objects/object_warp1.xml | 39 + .../GC_NMQ_NTSC_J/objects/object_warp2.xml | 6 + .../xml/GC_NMQ_NTSC_J/objects/object_wf.xml | 128 + .../GC_NMQ_NTSC_J/objects/object_wood02.xml | 35 + .../xml/GC_NMQ_NTSC_J/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../GC_NMQ_NTSC_J/objects/object_yukabyun.xml | 9 + .../xml/GC_NMQ_NTSC_J/objects/object_zf.xml | 182 + .../xml/GC_NMQ_NTSC_J/objects/object_zg.xml | 8 + .../xml/GC_NMQ_NTSC_J/objects/object_zl1.xml | 115 + .../xml/GC_NMQ_NTSC_J/objects/object_zl2.xml | 75 + .../objects/object_zl2_anime1.xml | 30 + .../objects/object_zl2_anime2.xml | 40 + .../xml/GC_NMQ_NTSC_J/objects/object_zl4.xml | 91 + .../xml/GC_NMQ_NTSC_J/objects/object_zo.xml | 88 + .../GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml | 11 + .../GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml | 11 + .../overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../overlays/ovl_Boss_Dodongo.xml | 6 + .../GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml | 68 + .../overlays/ovl_Boss_Ganon2.xml | 76 + .../GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml | 10 + .../GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml | 10 + .../GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml | 7 + .../overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml | 8 + .../GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml | 38 + .../GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml | 8 + .../xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml | 9 + .../xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml | 8 + .../xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml | 8 + .../xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml | 15 + .../GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml | 17 + .../overlays/ovl_File_Choose.xml | 22 + .../GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml | 12 + .../GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml | 10 + .../GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml | 15 + .../GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml | 10 + .../overlays/ovl_Oceff_Storm.xml | 11 + .../GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml | 10 + .../overlays/ovl_Oceff_Wipe2.xml | 11 + .../overlays/ovl_Oceff_Wipe3.xml | 10 + .../overlays/ovl_Oceff_Wipe4.xml | 11 + .../GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml | 231 + .../GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml | 34 + .../GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml | 191 + .../scenes/dungeons/HAKAdanCH.xml | 69 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml | 288 ++ .../GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml | 262 ++ .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml | 96 + .../scenes/dungeons/bdan_boss.xml | 20 + .../GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml | 220 + .../scenes/dungeons/ddan_boss.xml | 22 + .../GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../scenes/dungeons/ganon_tou.xml | 34 + .../scenes/dungeons/ganontika.xml | 254 ++ .../scenes/dungeons/ganontikasonogo.xml | 36 + .../scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 105 + .../scenes/dungeons/jyasinboss.xml | 49 + .../scenes/dungeons/jyasinzou.xml | 358 ++ .../xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml | 127 + .../scenes/dungeons/moribossroom.xml | 33 + .../GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml | 157 + .../scenes/dungeons/ydan_boss.xml | 26 + .../GC_NMQ_NTSC_J/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml | 8 + .../scenes/indoors/hylia_labo.xml | 39 + .../xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml | 8 + .../GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml | 8 + .../scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml | 8 + .../scenes/indoors/link_home.xml | 8 + .../GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../scenes/indoors/miharigoya.xml | 28 + .../GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml | 53 + .../xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml | 8 + .../GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml | 18 + .../GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml | 26 + .../scenes/misc/hakaana_ouke.xml | 37 + .../GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml | 8 + .../GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml | 8 + .../GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml | 113 + .../xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml | 23 + .../scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../GC_NMQ_NTSC_J/scenes/misc/market_day.xml | 9 + .../scenes/misc/market_night.xml | 9 + .../scenes/misc/market_ruins.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml | 8 + .../GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml | 9 + .../GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml | 8 + .../GC_NMQ_NTSC_J/scenes/misc/turibori.xml | 35 + .../GC_NMQ_NTSC_J/scenes/overworld/entra.xml | 8 + .../GC_NMQ_NTSC_J/scenes/overworld/souko.xml | 44 + .../GC_NMQ_NTSC_J/scenes/overworld/spot00.xml | 69 + .../GC_NMQ_NTSC_J/scenes/overworld/spot01.xml | 51 + .../GC_NMQ_NTSC_J/scenes/overworld/spot02.xml | 64 + .../GC_NMQ_NTSC_J/scenes/overworld/spot03.xml | 41 + .../GC_NMQ_NTSC_J/scenes/overworld/spot04.xml | 81 + .../GC_NMQ_NTSC_J/scenes/overworld/spot05.xml | 43 + .../GC_NMQ_NTSC_J/scenes/overworld/spot06.xml | 58 + .../GC_NMQ_NTSC_J/scenes/overworld/spot07.xml | 47 + .../GC_NMQ_NTSC_J/scenes/overworld/spot08.xml | 36 + .../GC_NMQ_NTSC_J/scenes/overworld/spot09.xml | 37 + .../GC_NMQ_NTSC_J/scenes/overworld/spot10.xml | 71 + .../GC_NMQ_NTSC_J/scenes/overworld/spot11.xml | 41 + .../GC_NMQ_NTSC_J/scenes/overworld/spot12.xml | 52 + .../GC_NMQ_NTSC_J/scenes/overworld/spot13.xml | 39 + .../GC_NMQ_NTSC_J/scenes/overworld/spot15.xml | 52 + .../GC_NMQ_NTSC_J/scenes/overworld/spot16.xml | 50 + .../GC_NMQ_NTSC_J/scenes/overworld/spot17.xml | 54 + .../GC_NMQ_NTSC_J/scenes/overworld/spot18.xml | 105 + .../GC_NMQ_NTSC_J/scenes/overworld/spot20.xml | 36 + .../GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml | 8 + .../GC_NMQ_NTSC_J/scenes/shops/face_shop.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml | 8 + .../scenes/shops/kokiri_shop.xml | 8 + .../GC_NMQ_NTSC_J/scenes/shops/night_shop.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml | 8 + .../xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml | 8 + .../GC_NMQ_NTSC_J/text/elf_message_field.xml | 5 + .../GC_NMQ_NTSC_J/text/elf_message_ydan.xml | 5 + .../text/message_data_static.xml | 11 + .../GC_NMQ_NTSC_J/textures/backgrounds.xml | 246 + .../textures/boss_title_cards.xml | 42 + .../textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../textures/icon_item_static.xml | 188 + .../textures/item_name_static.xml | 250 ++ .../xml/GC_NMQ_NTSC_J/textures/kanji.xml | 3984 +++++++++++++++++ .../textures/map_48x85_static.xml | 72 + .../textures/map_grand_static.xml | 28 + .../GC_NMQ_NTSC_J/textures/map_i_static.xml | 243 + .../textures/map_name_static.xml | 72 + .../GC_NMQ_NTSC_J/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../textures/nes_font_static.xml | 144 + .../textures/nintendo_rogo_static.xml | 9 + .../textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/GC_NMQ_NTSC_J/textures/skyboxes.xml | 113 + .../GC_NMQ_NTSC_J/textures/title_static.xml | 169 + .../xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml | 1558 +++++++ .../GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml | 13 + .../GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml | 8 + .../GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml | 10 + .../xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml | 5 + .../GC_NMQ_NTSC_J_CE/misc/link_animetion.xml | 577 +++ .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../objects/gameplay_keep.xml | 1011 +++++ .../GC_NMQ_NTSC_J_CE/objects/object_Bb.xml | 37 + .../GC_NMQ_NTSC_J_CE/objects/object_ahg.xml | 61 + .../GC_NMQ_NTSC_J_CE/objects/object_am.xml | 22 + .../GC_NMQ_NTSC_J_CE/objects/object_ane.xml | 59 + .../GC_NMQ_NTSC_J_CE/objects/object_ani.xml | 67 + .../objects/object_anubice.xml | 29 + .../GC_NMQ_NTSC_J_CE/objects/object_aob.xml | 59 + .../objects/object_b_heart.xml | 8 + .../GC_NMQ_NTSC_J_CE/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_bg.xml | 50 + .../objects/object_bigokuta.xml | 58 + .../GC_NMQ_NTSC_J_CE/objects/object_bird.xml | 30 + .../GC_NMQ_NTSC_J_CE/objects/object_bji.xml | 56 + .../GC_NMQ_NTSC_J_CE/objects/object_bl.xml | 32 + .../objects/object_blkobj.xml | 37 + .../GC_NMQ_NTSC_J_CE/objects/object_bob.xml | 47 + .../GC_NMQ_NTSC_J_CE/objects/object_boj.xml | 65 + .../GC_NMQ_NTSC_J_CE/objects/object_bombf.xml | 14 + .../objects/object_bombiwa.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_bowl.xml | 18 + .../GC_NMQ_NTSC_J_CE/objects/object_box.xml | 30 + .../GC_NMQ_NTSC_J_CE/objects/object_brob.xml | 25 + .../objects/object_bubble.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_bv.xml | 116 + .../GC_NMQ_NTSC_J_CE/objects/object_bw.xml | 29 + .../GC_NMQ_NTSC_J_CE/objects/object_bwall.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_bxa.xml | 13 + .../GC_NMQ_NTSC_J_CE/objects/object_cne.xml | 53 + .../GC_NMQ_NTSC_J_CE/objects/object_cob.xml | 41 + .../GC_NMQ_NTSC_J_CE/objects/object_cow.xml | 55 + .../GC_NMQ_NTSC_J_CE/objects/object_crow.xml | 11 + .../GC_NMQ_NTSC_J_CE/objects/object_cs.xml | 60 + .../objects/object_d_elevator.xml | 7 + .../objects/object_d_hsblock.xml | 10 + .../objects/object_d_lift.xml | 8 + .../GC_NMQ_NTSC_J_CE/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../objects/object_dekubaba.xml | 38 + .../objects/object_dekujr.xml | 13 + .../objects/object_dekunuts.xml | 32 + .../objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_dh.xml | 59 + .../GC_NMQ_NTSC_J_CE/objects/object_dnk.xml | 35 + .../GC_NMQ_NTSC_J_CE/objects/object_dns.xml | 40 + .../objects/object_dodojr.xml | 33 + .../objects/object_dodongo.xml | 41 + .../GC_NMQ_NTSC_J_CE/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../GC_NMQ_NTSC_J_CE/objects/object_ds.xml | 38 + .../GC_NMQ_NTSC_J_CE/objects/object_ds2.xml | 34 + .../GC_NMQ_NTSC_J_CE/objects/object_du.xml | 81 + .../objects/object_dy_obj.xml | 121 + .../GC_NMQ_NTSC_J_CE/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../objects/object_efc_tw.xml | 13 + .../GC_NMQ_NTSC_J_CE/objects/object_ei.xml | 56 + .../GC_NMQ_NTSC_J_CE/objects/object_fa.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_fd.xml | 103 + .../GC_NMQ_NTSC_J_CE/objects/object_fd2.xml | 52 + .../GC_NMQ_NTSC_J_CE/objects/object_fhg.xml | 54 + .../GC_NMQ_NTSC_J_CE/objects/object_fire.xml | 14 + .../objects/object_firefly.xml | 21 + .../GC_NMQ_NTSC_J_CE/objects/object_fish.xml | 180 + .../GC_NMQ_NTSC_J_CE/objects/object_fr.xml | 65 + .../GC_NMQ_NTSC_J_CE/objects/object_fu.xml | 55 + .../GC_NMQ_NTSC_J_CE/objects/object_fw.xml | 106 + .../GC_NMQ_NTSC_J_CE/objects/object_fz.xml | 12 + .../GC_NMQ_NTSC_J_CE/objects/object_ganon.xml | 106 + .../objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_ge1.xml | 78 + .../GC_NMQ_NTSC_J_CE/objects/object_geff.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_geldb.xml | 44 + .../objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../objects/object_gi_bean.xml | 5 + .../objects/object_gi_bomb_1.xml | 5 + .../objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../objects/object_gi_boots_2.xml | 7 + .../objects/object_gi_bosskey.xml | 6 + .../objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../objects/object_gi_clothes.xml | 11 + .../objects/object_gi_coin.xml | 10 + .../objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../objects/object_gi_fire.xml | 8 + .../objects/object_gi_fish.xml | 5 + .../objects/object_gi_frog.xml | 7 + .../objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../objects/object_gi_ghost.xml | 11 + .../objects/object_gi_glasses.xml | 6 + .../objects/object_gi_gloves.xml | 11 + .../objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../objects/object_gi_grass.xml | 5 + .../objects/object_gi_hammer.xml | 5 + .../objects/object_gi_heart.xml | 5 + .../objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../objects/object_gi_insect.xml | 6 + .../objects/object_gi_jewel.xml | 15 + .../objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../objects/object_gi_letter.xml | 8 + .../objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../objects/object_gi_map.xml | 7 + .../objects/object_gi_medal.xml | 11 + .../objects/object_gi_melody.xml | 11 + .../objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../objects/object_gi_nuts.xml | 6 + .../objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../objects/object_gi_rupy.xml | 16 + .../objects/object_gi_saw.xml | 5 + .../objects/object_gi_scale.xml | 10 + .../objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../objects/object_gi_soldout.xml | 6 + .../objects/object_gi_soul.xml | 8 + .../objects/object_gi_stick.xml | 5 + .../objects/object_gi_sutaru.xml | 6 + .../objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../GC_NMQ_NTSC_J_CE/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_gla.xml | 85 + .../GC_NMQ_NTSC_J_CE/objects/object_gm.xml | 5 + .../GC_NMQ_NTSC_J_CE/objects/object_gnd.xml | 87 + .../objects/object_gnd_magic.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_gndd.xml | 106 + .../objects/object_god_lgt.xml | 9 + .../GC_NMQ_NTSC_J_CE/objects/object_gol.xml | 59 + .../GC_NMQ_NTSC_J_CE/objects/object_goma.xml | 169 + .../objects/object_goroiwa.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_gr.xml | 27 + .../GC_NMQ_NTSC_J_CE/objects/object_gs.xml | 8 + .../GC_NMQ_NTSC_J_CE/objects/object_gt.xml | 38 + .../GC_NMQ_NTSC_J_CE/objects/object_haka.xml | 10 + .../objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../GC_NMQ_NTSC_J_CE/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../objects/object_hintnuts.xml | 29 + .../GC_NMQ_NTSC_J_CE/objects/object_hni.xml | 51 + .../GC_NMQ_NTSC_J_CE/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../GC_NMQ_NTSC_J_CE/objects/object_hs.xml | 47 + .../GC_NMQ_NTSC_J_CE/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../GC_NMQ_NTSC_J_CE/objects/object_ik.xml | 108 + .../GC_NMQ_NTSC_J_CE/objects/object_im.xml | 79 + .../GC_NMQ_NTSC_J_CE/objects/object_in.xml | 142 + .../objects/object_ingate.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_jj.xml | 77 + .../GC_NMQ_NTSC_J_CE/objects/object_js.xml | 55 + .../objects/object_jya_door.xml | 8 + .../objects/object_jya_iron.xml | 13 + .../objects/object_jya_obj.xml | 87 + .../GC_NMQ_NTSC_J_CE/objects/object_ka.xml | 64 + .../objects/object_kanban.xml | 18 + .../objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../GC_NMQ_NTSC_J_CE/objects/object_km1.xml | 39 + .../GC_NMQ_NTSC_J_CE/objects/object_kusa.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_kw1.xml | 63 + .../GC_NMQ_NTSC_J_CE/objects/object_kz.xml | 45 + .../objects/object_light_ring.xml | 6 + .../objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../objects/object_link_boy.xml | 282 ++ .../objects/object_link_child.xml | 225 + .../GC_NMQ_NTSC_J_CE/objects/object_ma1.xml | 67 + .../GC_NMQ_NTSC_J_CE/objects/object_ma2.xml | 75 + .../GC_NMQ_NTSC_J_CE/objects/object_mag.xml | 21 + .../objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../GC_NMQ_NTSC_J_CE/objects/object_mb.xml | 73 + .../GC_NMQ_NTSC_J_CE/objects/object_md.xml | 87 + .../GC_NMQ_NTSC_J_CE/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../GC_NMQ_NTSC_J_CE/objects/object_mjin.xml | 8 + .../objects/object_mjin_dark.xml | 5 + .../objects/object_mjin_flame.xml | 5 + .../objects/object_mjin_flash.xml | 5 + .../objects/object_mjin_ice.xml | 5 + .../objects/object_mjin_oka.xml | 8 + .../objects/object_mjin_soul.xml | 5 + .../objects/object_mjin_wind.xml | 5 + .../GC_NMQ_NTSC_J_CE/objects/object_mk.xml | 44 + .../GC_NMQ_NTSC_J_CE/objects/object_mm.xml | 25 + .../GC_NMQ_NTSC_J_CE/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../objects/object_mori_tex.xml | 29 + .../GC_NMQ_NTSC_J_CE/objects/object_ms.xml | 43 + .../GC_NMQ_NTSC_J_CE/objects/object_mu.xml | 96 + .../GC_NMQ_NTSC_J_CE/objects/object_nb.xml | 118 + .../GC_NMQ_NTSC_J_CE/objects/object_niw.xml | 49 + .../GC_NMQ_NTSC_J_CE/objects/object_nwc.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_ny.xml | 10 + .../GC_NMQ_NTSC_J_CE/objects/object_oA1.xml | 69 + .../GC_NMQ_NTSC_J_CE/objects/object_oA10.xml | 66 + .../GC_NMQ_NTSC_J_CE/objects/object_oA11.xml | 66 + .../GC_NMQ_NTSC_J_CE/objects/object_oA2.xml | 58 + .../GC_NMQ_NTSC_J_CE/objects/object_oA3.xml | 11 + .../GC_NMQ_NTSC_J_CE/objects/object_oA4.xml | 64 + .../GC_NMQ_NTSC_J_CE/objects/object_oA5.xml | 64 + .../GC_NMQ_NTSC_J_CE/objects/object_oA6.xml | 64 + .../GC_NMQ_NTSC_J_CE/objects/object_oA7.xml | 62 + .../GC_NMQ_NTSC_J_CE/objects/object_oA8.xml | 61 + .../GC_NMQ_NTSC_J_CE/objects/object_oA9.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_oB1.xml | 69 + .../GC_NMQ_NTSC_J_CE/objects/object_oB2.xml | 76 + .../GC_NMQ_NTSC_J_CE/objects/object_oB3.xml | 70 + .../GC_NMQ_NTSC_J_CE/objects/object_oB4.xml | 64 + .../GC_NMQ_NTSC_J_CE/objects/object_oE1.xml | 70 + .../GC_NMQ_NTSC_J_CE/objects/object_oE10.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_oE11.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_oE12.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml | 52 + .../GC_NMQ_NTSC_J_CE/objects/object_oE2.xml | 71 + .../GC_NMQ_NTSC_J_CE/objects/object_oE3.xml | 73 + .../GC_NMQ_NTSC_J_CE/objects/object_oE4.xml | 69 + .../GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml | 48 + .../GC_NMQ_NTSC_J_CE/objects/object_oE5.xml | 64 + .../GC_NMQ_NTSC_J_CE/objects/object_oE6.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_oE7.xml | 14 + .../GC_NMQ_NTSC_J_CE/objects/object_oE8.xml | 15 + .../GC_NMQ_NTSC_J_CE/objects/object_oE9.xml | 15 + .../objects/object_oE_anime.xml | 10 + .../objects/object_oF1d_map.xml | 54 + .../GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml | 58 + .../objects/object_o_anime.xml | 11 + .../GC_NMQ_NTSC_J_CE/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../GC_NMQ_NTSC_J_CE/objects/object_os.xml | 36 + .../objects/object_os_anime.xml | 69 + .../GC_NMQ_NTSC_J_CE/objects/object_ossan.xml | 23 + .../objects/object_ouke_haka.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_owl.xml | 79 + .../objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../objects/object_po_field.xml | 31 + .../objects/object_po_sisters.xml | 56 + .../GC_NMQ_NTSC_J_CE/objects/object_poh.xml | 25 + .../GC_NMQ_NTSC_J_CE/objects/object_ps.xml | 42 + .../objects/object_pu_box.xml | 13 + .../GC_NMQ_NTSC_J_CE/objects/object_rd.xml | 124 + .../GC_NMQ_NTSC_J_CE/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../GC_NMQ_NTSC_J_CE/objects/object_rl.xml | 52 + .../GC_NMQ_NTSC_J_CE/objects/object_rr.xml | 8 + .../GC_NMQ_NTSC_J_CE/objects/object_rs.xml | 32 + .../GC_NMQ_NTSC_J_CE/objects/object_ru1.xml | 83 + .../GC_NMQ_NTSC_J_CE/objects/object_ru2.xml | 92 + .../GC_NMQ_NTSC_J_CE/objects/object_sa.xml | 100 + .../GC_NMQ_NTSC_J_CE/objects/object_sb.xml | 30 + .../GC_NMQ_NTSC_J_CE/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../objects/object_shopnuts.xml | 67 + .../objects/object_siofuki.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_sk2.xml | 130 + .../GC_NMQ_NTSC_J_CE/objects/object_skb.xml | 64 + .../GC_NMQ_NTSC_J_CE/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../objects/object_spot08_obj.xml | 27 + .../objects/object_spot09_obj.xml | 35 + .../objects/object_spot11_obj.xml | 9 + .../objects/object_spot12_obj.xml | 13 + .../objects/object_spot15_obj.xml | 13 + .../objects/object_spot16_obj.xml | 11 + .../objects/object_spot17_obj.xml | 12 + .../objects/object_spot18_obj.xml | 36 + .../GC_NMQ_NTSC_J_CE/objects/object_ssh.xml | 61 + .../GC_NMQ_NTSC_J_CE/objects/object_sst.xml | 71 + .../GC_NMQ_NTSC_J_CE/objects/object_st.xml | 71 + .../objects/object_stream.xml | 6 + .../objects/object_syokudai.xml | 13 + .../GC_NMQ_NTSC_J_CE/objects/object_ta.xml | 72 + .../objects/object_timeblock.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_tite.xml | 55 + .../GC_NMQ_NTSC_J_CE/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../objects/object_torch2.xml | 13 + .../GC_NMQ_NTSC_J_CE/objects/object_toryo.xml | 53 + .../GC_NMQ_NTSC_J_CE/objects/object_tp.xml | 17 + .../GC_NMQ_NTSC_J_CE/objects/object_tr.xml | 149 + .../GC_NMQ_NTSC_J_CE/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../GC_NMQ_NTSC_J_CE/objects/object_ts.xml | 34 + .../GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml | 9 + .../GC_NMQ_NTSC_J_CE/objects/object_tw.xml | 332 ++ .../objects/object_umajump.xml | 8 + .../GC_NMQ_NTSC_J_CE/objects/object_vali.xml | 63 + .../GC_NMQ_NTSC_J_CE/objects/object_vase.xml | 7 + .../GC_NMQ_NTSC_J_CE/objects/object_vm.xml | 41 + .../objects/object_wallmaster.xml | 35 + .../GC_NMQ_NTSC_J_CE/objects/object_warp1.xml | 39 + .../GC_NMQ_NTSC_J_CE/objects/object_warp2.xml | 6 + .../GC_NMQ_NTSC_J_CE/objects/object_wf.xml | 128 + .../objects/object_wood02.xml | 35 + .../GC_NMQ_NTSC_J_CE/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../objects/object_yukabyun.xml | 9 + .../GC_NMQ_NTSC_J_CE/objects/object_zf.xml | 182 + .../GC_NMQ_NTSC_J_CE/objects/object_zg.xml | 8 + .../GC_NMQ_NTSC_J_CE/objects/object_zl1.xml | 115 + .../GC_NMQ_NTSC_J_CE/objects/object_zl2.xml | 75 + .../objects/object_zl2_anime1.xml | 30 + .../objects/object_zl2_anime2.xml | 40 + .../GC_NMQ_NTSC_J_CE/objects/object_zl4.xml | 91 + .../GC_NMQ_NTSC_J_CE/objects/object_zo.xml | 88 + .../overlays/ovl_Arrow_Fire.xml | 11 + .../overlays/ovl_Arrow_Ice.xml | 11 + .../overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../overlays/ovl_Boss_Dodongo.xml | 6 + .../overlays/ovl_Boss_Ganon.xml | 68 + .../overlays/ovl_Boss_Ganon2.xml | 76 + .../overlays/ovl_Boss_Sst.xml | 10 + .../overlays/ovl_Demo_Shd.xml | 10 + .../GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml | 7 + .../overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml | 8 + .../overlays/ovl_En_Jsjutan.xml | 38 + .../overlays/ovl_En_Kanban.xml | 8 + .../GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml | 9 + .../GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml | 8 + .../GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml | 8 + .../GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml | 15 + .../overlays/ovl_End_Title.xml | 17 + .../overlays/ovl_File_Choose.xml | 22 + .../overlays/ovl_Magic_Dark.xml | 12 + .../overlays/ovl_Magic_Fire.xml | 10 + .../overlays/ovl_Magic_Wind.xml | 15 + .../overlays/ovl_Oceff_Spot.xml | 10 + .../overlays/ovl_Oceff_Storm.xml | 11 + .../overlays/ovl_Oceff_Wipe.xml | 10 + .../overlays/ovl_Oceff_Wipe2.xml | 11 + .../overlays/ovl_Oceff_Wipe3.xml | 10 + .../overlays/ovl_Oceff_Wipe4.xml | 11 + .../scenes/dungeons/Bmori1.xml | 231 + .../scenes/dungeons/FIRE_bs.xml | 34 + .../scenes/dungeons/HAKAdan.xml | 191 + .../scenes/dungeons/HAKAdanCH.xml | 69 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../scenes/dungeons/HIDAN.xml | 288 ++ .../scenes/dungeons/MIZUsin.xml | 262 ++ .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml | 96 + .../scenes/dungeons/bdan_boss.xml | 20 + .../GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml | 220 + .../scenes/dungeons/ddan_boss.xml | 22 + .../scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../scenes/dungeons/ganon_tou.xml | 34 + .../scenes/dungeons/ganontika.xml | 254 ++ .../scenes/dungeons/ganontikasonogo.xml | 36 + .../scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 105 + .../scenes/dungeons/jyasinboss.xml | 49 + .../scenes/dungeons/jyasinzou.xml | 358 ++ .../GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml | 127 + .../scenes/dungeons/moribossroom.xml | 33 + .../GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml | 157 + .../scenes/dungeons/ydan_boss.xml | 26 + .../scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml | 8 + .../scenes/indoors/hylia_labo.xml | 39 + .../GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml | 8 + .../scenes/indoors/kakariko.xml | 8 + .../scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml | 8 + .../scenes/indoors/link_home.xml | 8 + .../scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../scenes/indoors/miharigoya.xml | 28 + .../scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../scenes/indoors/takaraya.xml | 53 + .../GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml | 8 + .../scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml | 18 + .../GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml | 26 + .../scenes/misc/hakaana_ouke.xml | 37 + .../scenes/misc/hiral_demo.xml | 8 + .../scenes/misc/kakariko3.xml | 8 + .../scenes/misc/kakusiana.xml | 113 + .../GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml | 23 + .../scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../scenes/misc/market_day.xml | 9 + .../scenes/misc/market_night.xml | 9 + .../scenes/misc/market_ruins.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml | 9 + .../GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml | 35 + .../scenes/overworld/entra.xml | 8 + .../scenes/overworld/souko.xml | 44 + .../scenes/overworld/spot00.xml | 69 + .../scenes/overworld/spot01.xml | 51 + .../scenes/overworld/spot02.xml | 64 + .../scenes/overworld/spot03.xml | 41 + .../scenes/overworld/spot04.xml | 81 + .../scenes/overworld/spot05.xml | 43 + .../scenes/overworld/spot06.xml | 58 + .../scenes/overworld/spot07.xml | 47 + .../scenes/overworld/spot08.xml | 36 + .../scenes/overworld/spot09.xml | 37 + .../scenes/overworld/spot10.xml | 71 + .../scenes/overworld/spot11.xml | 41 + .../scenes/overworld/spot12.xml | 52 + .../scenes/overworld/spot13.xml | 39 + .../scenes/overworld/spot15.xml | 52 + .../scenes/overworld/spot16.xml | 50 + .../scenes/overworld/spot17.xml | 54 + .../scenes/overworld/spot18.xml | 105 + .../scenes/overworld/spot20.xml | 36 + .../scenes/shops/alley_shop.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml | 8 + .../scenes/shops/face_shop.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml | 8 + .../scenes/shops/kokiri_shop.xml | 8 + .../scenes/shops/night_shop.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml | 8 + .../GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml | 8 + .../text/elf_message_field.xml | 5 + .../text/elf_message_ydan.xml | 5 + .../text/message_data_static.xml | 11 + .../GC_NMQ_NTSC_J_CE/textures/backgrounds.xml | 246 + .../textures/boss_title_cards.xml | 42 + .../textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../textures/icon_item_static.xml | 188 + .../textures/item_name_static.xml | 250 ++ .../xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml | 3984 +++++++++++++++++ .../textures/map_48x85_static.xml | 72 + .../textures/map_grand_static.xml | 28 + .../textures/map_i_static.xml | 243 + .../textures/map_name_static.xml | 72 + .../textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../textures/nes_font_static.xml | 145 + .../textures/nintendo_rogo_static.xml | 9 + .../textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../GC_NMQ_NTSC_J_CE/textures/skyboxes.xml | 113 + .../textures/title_static.xml | 169 + soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml | 1558 +++++++ .../xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml | 13 + .../GC_NMQ_NTSC_U/code/fbdemo_triforce.xml | 8 + .../xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml | 10 + .../xml/GC_NMQ_NTSC_U/code/sys_matrix.xml | 5 + .../xml/GC_NMQ_NTSC_U/misc/link_animetion.xml | 577 +++ .../objects/gameplay_dangeon_keep.xml | 75 + .../objects/gameplay_field_keep.xml | 62 + .../GC_NMQ_NTSC_U/objects/gameplay_keep.xml | 1011 +++++ .../xml/GC_NMQ_NTSC_U/objects/object_Bb.xml | 37 + .../xml/GC_NMQ_NTSC_U/objects/object_ahg.xml | 61 + .../xml/GC_NMQ_NTSC_U/objects/object_am.xml | 22 + .../xml/GC_NMQ_NTSC_U/objects/object_ane.xml | 59 + .../xml/GC_NMQ_NTSC_U/objects/object_ani.xml | 67 + .../GC_NMQ_NTSC_U/objects/object_anubice.xml | 29 + .../xml/GC_NMQ_NTSC_U/objects/object_aob.xml | 59 + .../GC_NMQ_NTSC_U/objects/object_b_heart.xml | 8 + .../xml/GC_NMQ_NTSC_U/objects/object_bba.xml | 45 + .../objects/object_bdan_objects.xml | 61 + .../GC_NMQ_NTSC_U/objects/object_bdoor.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_bg.xml | 50 + .../GC_NMQ_NTSC_U/objects/object_bigokuta.xml | 58 + .../xml/GC_NMQ_NTSC_U/objects/object_bird.xml | 30 + .../xml/GC_NMQ_NTSC_U/objects/object_bji.xml | 56 + .../xml/GC_NMQ_NTSC_U/objects/object_bl.xml | 32 + .../GC_NMQ_NTSC_U/objects/object_blkobj.xml | 37 + .../xml/GC_NMQ_NTSC_U/objects/object_bob.xml | 47 + .../xml/GC_NMQ_NTSC_U/objects/object_boj.xml | 65 + .../GC_NMQ_NTSC_U/objects/object_bombf.xml | 14 + .../GC_NMQ_NTSC_U/objects/object_bombiwa.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_bowl.xml | 18 + .../xml/GC_NMQ_NTSC_U/objects/object_box.xml | 30 + .../xml/GC_NMQ_NTSC_U/objects/object_brob.xml | 25 + .../GC_NMQ_NTSC_U/objects/object_bubble.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_bv.xml | 116 + .../xml/GC_NMQ_NTSC_U/objects/object_bw.xml | 29 + .../GC_NMQ_NTSC_U/objects/object_bwall.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_bxa.xml | 13 + .../xml/GC_NMQ_NTSC_U/objects/object_cne.xml | 53 + .../xml/GC_NMQ_NTSC_U/objects/object_cob.xml | 41 + .../xml/GC_NMQ_NTSC_U/objects/object_cow.xml | 55 + .../xml/GC_NMQ_NTSC_U/objects/object_crow.xml | 11 + .../xml/GC_NMQ_NTSC_U/objects/object_cs.xml | 60 + .../objects/object_d_elevator.xml | 7 + .../objects/object_d_hsblock.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_d_lift.xml | 8 + .../GC_NMQ_NTSC_U/objects/object_daiku.xml | 60 + .../objects/object_ddan_objects.xml | 32 + .../GC_NMQ_NTSC_U/objects/object_dekubaba.xml | 38 + .../GC_NMQ_NTSC_U/objects/object_dekujr.xml | 13 + .../GC_NMQ_NTSC_U/objects/object_dekunuts.xml | 32 + .../GC_NMQ_NTSC_U/objects/object_demo_6k.xml | 13 + .../objects/object_demo_kekkai.xml | 57 + .../objects/object_demo_tre_lgt.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_dh.xml | 59 + .../xml/GC_NMQ_NTSC_U/objects/object_dnk.xml | 35 + .../xml/GC_NMQ_NTSC_U/objects/object_dns.xml | 40 + .../GC_NMQ_NTSC_U/objects/object_dodojr.xml | 33 + .../GC_NMQ_NTSC_U/objects/object_dodongo.xml | 41 + .../xml/GC_NMQ_NTSC_U/objects/object_dog.xml | 41 + .../objects/object_door_gerudo.xml | 7 + .../objects/object_door_killer.xml | 17 + .../xml/GC_NMQ_NTSC_U/objects/object_ds.xml | 38 + .../xml/GC_NMQ_NTSC_U/objects/object_ds2.xml | 34 + .../xml/GC_NMQ_NTSC_U/objects/object_du.xml | 81 + .../GC_NMQ_NTSC_U/objects/object_dy_obj.xml | 121 + .../xml/GC_NMQ_NTSC_U/objects/object_ec.xml | 26 + .../objects/object_efc_crystal_light.xml | 6 + .../objects/object_efc_doughnut.xml | 8 + .../objects/object_efc_erupc.xml | 12 + .../objects/object_efc_fire_ball.xml | 7 + .../objects/object_efc_flash.xml | 6 + .../objects/object_efc_lgt_shower.xml | 6 + .../objects/object_efc_star_field.xml | 8 + .../GC_NMQ_NTSC_U/objects/object_efc_tw.xml | 13 + .../xml/GC_NMQ_NTSC_U/objects/object_ei.xml | 56 + .../xml/GC_NMQ_NTSC_U/objects/object_fa.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_fd.xml | 103 + .../xml/GC_NMQ_NTSC_U/objects/object_fd2.xml | 52 + .../xml/GC_NMQ_NTSC_U/objects/object_fhg.xml | 54 + .../xml/GC_NMQ_NTSC_U/objects/object_fire.xml | 14 + .../GC_NMQ_NTSC_U/objects/object_firefly.xml | 21 + .../xml/GC_NMQ_NTSC_U/objects/object_fish.xml | 180 + .../xml/GC_NMQ_NTSC_U/objects/object_fr.xml | 65 + .../xml/GC_NMQ_NTSC_U/objects/object_fu.xml | 55 + .../xml/GC_NMQ_NTSC_U/objects/object_fw.xml | 106 + .../xml/GC_NMQ_NTSC_U/objects/object_fz.xml | 12 + .../GC_NMQ_NTSC_U/objects/object_ganon.xml | 106 + .../GC_NMQ_NTSC_U/objects/object_ganon2.xml | 174 + .../objects/object_ganon_anime1.xml | 29 + .../objects/object_ganon_anime2.xml | 21 + .../objects/object_ganon_anime3.xml | 13 + .../objects/object_ganon_objects.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_ge1.xml | 78 + .../xml/GC_NMQ_NTSC_U/objects/object_geff.xml | 7 + .../GC_NMQ_NTSC_U/objects/object_geldb.xml | 44 + .../GC_NMQ_NTSC_U/objects/object_gi_arrow.xml | 7 + .../objects/object_gi_arrowcase.xml | 12 + .../GC_NMQ_NTSC_U/objects/object_gi_bean.xml | 5 + .../objects/object_gi_bomb_1.xml | 5 + .../objects/object_gi_bomb_2.xml | 5 + .../objects/object_gi_bombpouch.xml | 12 + .../objects/object_gi_boomerang.xml | 5 + .../objects/object_gi_boots_2.xml | 7 + .../objects/object_gi_bosskey.xml | 6 + .../objects/object_gi_bottle.xml | 6 + .../objects/object_gi_bottle_letter.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_gi_bow.xml | 5 + .../objects/object_gi_bracelet.xml | 5 + .../objects/object_gi_brokensword.xml | 5 + .../objects/object_gi_butterfly.xml | 7 + .../objects/object_gi_clothes.xml | 11 + .../GC_NMQ_NTSC_U/objects/object_gi_coin.xml | 10 + .../objects/object_gi_compass.xml | 6 + .../objects/object_gi_dekupouch.xml | 13 + .../GC_NMQ_NTSC_U/objects/object_gi_egg.xml | 6 + .../objects/object_gi_eye_lotion.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_gi_fire.xml | 8 + .../GC_NMQ_NTSC_U/objects/object_gi_fish.xml | 5 + .../GC_NMQ_NTSC_U/objects/object_gi_frog.xml | 7 + .../objects/object_gi_gerudo.xml | 6 + .../objects/object_gi_gerudomask.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_gi_ghost.xml | 11 + .../objects/object_gi_glasses.xml | 6 + .../objects/object_gi_gloves.xml | 11 + .../objects/object_gi_goddess.xml | 9 + .../objects/object_gi_golonmask.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_gi_grass.xml | 5 + .../objects/object_gi_hammer.xml | 5 + .../GC_NMQ_NTSC_U/objects/object_gi_heart.xml | 5 + .../objects/object_gi_hearts.xml | 7 + .../objects/object_gi_hookshot.xml | 6 + .../objects/object_gi_hoverboots.xml | 7 + .../objects/object_gi_insect.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_gi_jewel.xml | 15 + .../GC_NMQ_NTSC_U/objects/object_gi_key.xml | 5 + .../objects/object_gi_ki_tan_mask.xml | 7 + .../objects/object_gi_letter.xml | 8 + .../objects/object_gi_liquid.xml | 19 + .../objects/object_gi_longsword.xml | 5 + .../objects/object_gi_m_arrow.xml | 9 + .../objects/object_gi_magicpot.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_gi_map.xml | 7 + .../GC_NMQ_NTSC_U/objects/object_gi_medal.xml | 11 + .../objects/object_gi_melody.xml | 11 + .../GC_NMQ_NTSC_U/objects/object_gi_milk.xml | 7 + .../objects/object_gi_mushroom.xml | 5 + .../objects/object_gi_niwatori.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_gi_nuts.xml | 6 + .../objects/object_gi_ocarina.xml | 7 + .../objects/object_gi_ocarina_0.xml | 7 + .../objects/object_gi_pachinko.xml | 5 + .../objects/object_gi_powder.xml | 5 + .../objects/object_gi_prescription.xml | 7 + .../GC_NMQ_NTSC_U/objects/object_gi_purse.xml | 17 + .../objects/object_gi_rabit_mask.xml | 7 + .../objects/object_gi_redead_mask.xml | 5 + .../GC_NMQ_NTSC_U/objects/object_gi_rupy.xml | 16 + .../GC_NMQ_NTSC_U/objects/object_gi_saw.xml | 5 + .../GC_NMQ_NTSC_U/objects/object_gi_scale.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_gi_seed.xml | 5 + .../objects/object_gi_shield_1.xml | 6 + .../objects/object_gi_shield_2.xml | 5 + .../objects/object_gi_shield_3.xml | 8 + .../objects/object_gi_skj_mask.xml | 5 + .../objects/object_gi_soldout.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_gi_soul.xml | 8 + .../GC_NMQ_NTSC_U/objects/object_gi_stick.xml | 5 + .../objects/object_gi_sutaru.xml | 6 + .../objects/object_gi_sword_1.xml | 5 + .../objects/object_gi_ticketstone.xml | 8 + .../objects/object_gi_truth_mask.xml | 8 + .../objects/object_gi_zoramask.xml | 10 + .../xml/GC_NMQ_NTSC_U/objects/object_gj.xml | 45 + .../objects/object_gjyo_objects.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_gla.xml | 85 + .../xml/GC_NMQ_NTSC_U/objects/object_gm.xml | 5 + .../xml/GC_NMQ_NTSC_U/objects/object_gnd.xml | 87 + .../objects/object_gnd_magic.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_gndd.xml | 106 + .../GC_NMQ_NTSC_U/objects/object_god_lgt.xml | 9 + .../xml/GC_NMQ_NTSC_U/objects/object_gol.xml | 59 + .../xml/GC_NMQ_NTSC_U/objects/object_goma.xml | 169 + .../GC_NMQ_NTSC_U/objects/object_goroiwa.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_gr.xml | 27 + .../xml/GC_NMQ_NTSC_U/objects/object_gs.xml | 8 + .../xml/GC_NMQ_NTSC_U/objects/object_gt.xml | 38 + .../xml/GC_NMQ_NTSC_U/objects/object_haka.xml | 10 + .../objects/object_haka_door.xml | 12 + .../objects/object_haka_objects.xml | 85 + .../objects/object_hakach_objects.xml | 29 + .../xml/GC_NMQ_NTSC_U/objects/object_hata.xml | 50 + .../objects/object_heavy_object.xml | 9 + .../objects/object_hidan_objects.xml | 109 + .../GC_NMQ_NTSC_U/objects/object_hintnuts.xml | 29 + .../xml/GC_NMQ_NTSC_U/objects/object_hni.xml | 51 + .../GC_NMQ_NTSC_U/objects/object_horse.xml | 67 + .../objects/object_horse_ganon.xml | 33 + .../objects/object_horse_link_child.xml | 30 + .../objects/object_horse_normal.xml | 34 + .../objects/object_horse_zelda.xml | 26 + .../xml/GC_NMQ_NTSC_U/objects/object_hs.xml | 47 + .../GC_NMQ_NTSC_U/objects/object_human.xml | 216 + .../objects/object_ice_objects.xml | 26 + .../xml/GC_NMQ_NTSC_U/objects/object_ik.xml | 108 + .../xml/GC_NMQ_NTSC_U/objects/object_im.xml | 79 + .../xml/GC_NMQ_NTSC_U/objects/object_in.xml | 142 + .../GC_NMQ_NTSC_U/objects/object_ingate.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_jj.xml | 77 + .../xml/GC_NMQ_NTSC_U/objects/object_js.xml | 55 + .../GC_NMQ_NTSC_U/objects/object_jya_door.xml | 8 + .../GC_NMQ_NTSC_U/objects/object_jya_iron.xml | 13 + .../GC_NMQ_NTSC_U/objects/object_jya_obj.xml | 87 + .../xml/GC_NMQ_NTSC_U/objects/object_ka.xml | 64 + .../GC_NMQ_NTSC_U/objects/object_kanban.xml | 18 + .../GC_NMQ_NTSC_U/objects/object_kibako2.xml | 19 + .../objects/object_kingdodongo.xml | 130 + .../xml/GC_NMQ_NTSC_U/objects/object_km1.xml | 39 + .../xml/GC_NMQ_NTSC_U/objects/object_kusa.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_kw1.xml | 63 + .../xml/GC_NMQ_NTSC_U/objects/object_kz.xml | 45 + .../objects/object_light_ring.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_lightbox.xml | 15 + .../objects/object_lightswitch.xml | 14 + .../GC_NMQ_NTSC_U/objects/object_link_boy.xml | 282 ++ .../objects/object_link_child.xml | 225 + .../xml/GC_NMQ_NTSC_U/objects/object_ma1.xml | 67 + .../xml/GC_NMQ_NTSC_U/objects/object_ma2.xml | 75 + .../xml/GC_NMQ_NTSC_U/objects/object_mag.xml | 21 + .../GC_NMQ_NTSC_U/objects/object_mamenoki.xml | 15 + .../objects/object_mastergolon.xml | 5 + .../objects/object_masterkokiri.xml | 5 + .../objects/object_masterkokirihead.xml | 16 + .../objects/object_masterzoora.xml | 5 + .../xml/GC_NMQ_NTSC_U/objects/object_mb.xml | 73 + .../xml/GC_NMQ_NTSC_U/objects/object_md.xml | 87 + .../GC_NMQ_NTSC_U/objects/object_medal.xml | 17 + .../objects/object_menkuri_objects.xml | 18 + .../GC_NMQ_NTSC_U/objects/object_mir_ray.xml | 13 + .../objects/object_mizu_objects.xml | 55 + .../xml/GC_NMQ_NTSC_U/objects/object_mjin.xml | 8 + .../objects/object_mjin_dark.xml | 5 + .../objects/object_mjin_flame.xml | 5 + .../objects/object_mjin_flash.xml | 5 + .../GC_NMQ_NTSC_U/objects/object_mjin_ice.xml | 5 + .../GC_NMQ_NTSC_U/objects/object_mjin_oka.xml | 8 + .../objects/object_mjin_soul.xml | 5 + .../objects/object_mjin_wind.xml | 5 + .../xml/GC_NMQ_NTSC_U/objects/object_mk.xml | 44 + .../xml/GC_NMQ_NTSC_U/objects/object_mm.xml | 25 + .../xml/GC_NMQ_NTSC_U/objects/object_mo.xml | 87 + .../objects/object_mori_hineri1.xml | 7 + .../objects/object_mori_hineri1a.xml | 7 + .../objects/object_mori_hineri2.xml | 7 + .../objects/object_mori_hineri2a.xml | 7 + .../objects/object_mori_objects.xml | 25 + .../GC_NMQ_NTSC_U/objects/object_mori_tex.xml | 29 + .../xml/GC_NMQ_NTSC_U/objects/object_ms.xml | 43 + .../xml/GC_NMQ_NTSC_U/objects/object_mu.xml | 96 + .../xml/GC_NMQ_NTSC_U/objects/object_nb.xml | 118 + .../xml/GC_NMQ_NTSC_U/objects/object_niw.xml | 49 + .../xml/GC_NMQ_NTSC_U/objects/object_nwc.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_ny.xml | 10 + .../xml/GC_NMQ_NTSC_U/objects/object_oA1.xml | 69 + .../xml/GC_NMQ_NTSC_U/objects/object_oA10.xml | 66 + .../xml/GC_NMQ_NTSC_U/objects/object_oA11.xml | 66 + .../xml/GC_NMQ_NTSC_U/objects/object_oA2.xml | 58 + .../xml/GC_NMQ_NTSC_U/objects/object_oA3.xml | 11 + .../xml/GC_NMQ_NTSC_U/objects/object_oA4.xml | 64 + .../xml/GC_NMQ_NTSC_U/objects/object_oA5.xml | 64 + .../xml/GC_NMQ_NTSC_U/objects/object_oA6.xml | 64 + .../xml/GC_NMQ_NTSC_U/objects/object_oA7.xml | 62 + .../xml/GC_NMQ_NTSC_U/objects/object_oA8.xml | 61 + .../xml/GC_NMQ_NTSC_U/objects/object_oA9.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_oB1.xml | 69 + .../xml/GC_NMQ_NTSC_U/objects/object_oB2.xml | 76 + .../xml/GC_NMQ_NTSC_U/objects/object_oB3.xml | 70 + .../xml/GC_NMQ_NTSC_U/objects/object_oB4.xml | 64 + .../xml/GC_NMQ_NTSC_U/objects/object_oE1.xml | 70 + .../xml/GC_NMQ_NTSC_U/objects/object_oE10.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_oE11.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_oE12.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml | 52 + .../xml/GC_NMQ_NTSC_U/objects/object_oE2.xml | 71 + .../xml/GC_NMQ_NTSC_U/objects/object_oE3.xml | 73 + .../xml/GC_NMQ_NTSC_U/objects/object_oE4.xml | 69 + .../xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml | 48 + .../xml/GC_NMQ_NTSC_U/objects/object_oE5.xml | 64 + .../xml/GC_NMQ_NTSC_U/objects/object_oE6.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_oE7.xml | 14 + .../xml/GC_NMQ_NTSC_U/objects/object_oE8.xml | 15 + .../xml/GC_NMQ_NTSC_U/objects/object_oE9.xml | 15 + .../GC_NMQ_NTSC_U/objects/object_oE_anime.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_oF1d_map.xml | 54 + .../xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml | 58 + .../GC_NMQ_NTSC_U/objects/object_o_anime.xml | 11 + .../GC_NMQ_NTSC_U/objects/object_okuta.xml | 29 + .../objects/object_opening_demo1.xml | 11 + .../xml/GC_NMQ_NTSC_U/objects/object_os.xml | 36 + .../GC_NMQ_NTSC_U/objects/object_os_anime.xml | 69 + .../GC_NMQ_NTSC_U/objects/object_ossan.xml | 23 + .../objects/object_ouke_haka.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_owl.xml | 79 + .../GC_NMQ_NTSC_U/objects/object_peehat.xml | 53 + .../objects/object_po_composer.xml | 30 + .../GC_NMQ_NTSC_U/objects/object_po_field.xml | 31 + .../objects/object_po_sisters.xml | 56 + .../xml/GC_NMQ_NTSC_U/objects/object_poh.xml | 25 + .../xml/GC_NMQ_NTSC_U/objects/object_ps.xml | 42 + .../GC_NMQ_NTSC_U/objects/object_pu_box.xml | 13 + .../xml/GC_NMQ_NTSC_U/objects/object_rd.xml | 124 + .../GC_NMQ_NTSC_U/objects/object_reeba.xml | 27 + .../objects/object_relay_objects.xml | 19 + .../xml/GC_NMQ_NTSC_U/objects/object_rl.xml | 52 + .../xml/GC_NMQ_NTSC_U/objects/object_rr.xml | 8 + .../xml/GC_NMQ_NTSC_U/objects/object_rs.xml | 32 + .../xml/GC_NMQ_NTSC_U/objects/object_ru1.xml | 83 + .../xml/GC_NMQ_NTSC_U/objects/object_ru2.xml | 92 + .../xml/GC_NMQ_NTSC_U/objects/object_sa.xml | 100 + .../xml/GC_NMQ_NTSC_U/objects/object_sb.xml | 30 + .../xml/GC_NMQ_NTSC_U/objects/object_sd.xml | 70 + .../objects/object_shop_dungen.xml | 10 + .../GC_NMQ_NTSC_U/objects/object_shopnuts.xml | 67 + .../GC_NMQ_NTSC_U/objects/object_siofuki.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_sk2.xml | 130 + .../xml/GC_NMQ_NTSC_U/objects/object_skb.xml | 64 + .../xml/GC_NMQ_NTSC_U/objects/object_skj.xml | 75 + .../objects/object_spot00_break.xml | 13 + .../objects/object_spot00_objects.xml | 14 + .../objects/object_spot01_matoya.xml | 30 + .../objects/object_spot01_matoyab.xml | 18 + .../objects/object_spot01_objects.xml | 16 + .../objects/object_spot01_objects2.xml | 6 + .../objects/object_spot02_objects.xml | 44 + .../objects/object_spot03_object.xml | 16 + .../objects/object_spot04_objects.xml | 10 + .../objects/object_spot05_objects.xml | 10 + .../objects/object_spot06_objects.xml | 24 + .../objects/object_spot07_object.xml | 23 + .../objects/object_spot08_obj.xml | 27 + .../objects/object_spot09_obj.xml | 35 + .../objects/object_spot11_obj.xml | 9 + .../objects/object_spot12_obj.xml | 13 + .../objects/object_spot15_obj.xml | 13 + .../objects/object_spot16_obj.xml | 11 + .../objects/object_spot17_obj.xml | 12 + .../objects/object_spot18_obj.xml | 36 + .../xml/GC_NMQ_NTSC_U/objects/object_ssh.xml | 61 + .../xml/GC_NMQ_NTSC_U/objects/object_sst.xml | 71 + .../xml/GC_NMQ_NTSC_U/objects/object_st.xml | 71 + .../GC_NMQ_NTSC_U/objects/object_stream.xml | 6 + .../GC_NMQ_NTSC_U/objects/object_syokudai.xml | 13 + .../xml/GC_NMQ_NTSC_U/objects/object_ta.xml | 72 + .../objects/object_timeblock.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_tite.xml | 55 + .../xml/GC_NMQ_NTSC_U/objects/object_tk.xml | 35 + .../objects/object_toki_objects.xml | 25 + .../GC_NMQ_NTSC_U/objects/object_torch2.xml | 13 + .../GC_NMQ_NTSC_U/objects/object_toryo.xml | 53 + .../xml/GC_NMQ_NTSC_U/objects/object_tp.xml | 17 + .../xml/GC_NMQ_NTSC_U/objects/object_tr.xml | 149 + .../xml/GC_NMQ_NTSC_U/objects/object_trap.xml | 11 + .../objects/object_triforce_spot.xml | 14 + .../xml/GC_NMQ_NTSC_U/objects/object_ts.xml | 34 + .../GC_NMQ_NTSC_U/objects/object_tsubo.xml | 9 + .../xml/GC_NMQ_NTSC_U/objects/object_tw.xml | 332 ++ .../GC_NMQ_NTSC_U/objects/object_umajump.xml | 8 + .../xml/GC_NMQ_NTSC_U/objects/object_vali.xml | 63 + .../xml/GC_NMQ_NTSC_U/objects/object_vase.xml | 7 + .../xml/GC_NMQ_NTSC_U/objects/object_vm.xml | 41 + .../objects/object_wallmaster.xml | 35 + .../GC_NMQ_NTSC_U/objects/object_warp1.xml | 39 + .../GC_NMQ_NTSC_U/objects/object_warp2.xml | 6 + .../xml/GC_NMQ_NTSC_U/objects/object_wf.xml | 128 + .../GC_NMQ_NTSC_U/objects/object_wood02.xml | 35 + .../xml/GC_NMQ_NTSC_U/objects/object_xc.xml | 60 + .../objects/object_yabusame_point.xml | 8 + .../objects/object_ydan_objects.xml | 34 + .../GC_NMQ_NTSC_U/objects/object_yukabyun.xml | 9 + .../xml/GC_NMQ_NTSC_U/objects/object_zf.xml | 182 + .../xml/GC_NMQ_NTSC_U/objects/object_zg.xml | 8 + .../xml/GC_NMQ_NTSC_U/objects/object_zl1.xml | 115 + .../xml/GC_NMQ_NTSC_U/objects/object_zl2.xml | 75 + .../objects/object_zl2_anime1.xml | 30 + .../objects/object_zl2_anime2.xml | 40 + .../xml/GC_NMQ_NTSC_U/objects/object_zl4.xml | 91 + .../xml/GC_NMQ_NTSC_U/objects/object_zo.xml | 88 + .../GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml | 11 + .../GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml | 11 + .../overlays/ovl_Arrow_Light.xml | 11 + .../overlays/ovl_Bg_Ganon_Otyuka.xml | 29 + .../overlays/ovl_Bg_Jya_Cobra.xml | 10 + .../overlays/ovl_Boss_Dodongo.xml | 6 + .../GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml | 68 + .../overlays/ovl_Boss_Ganon2.xml | 76 + .../GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml | 10 + .../GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml | 10 + .../GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml | 7 + .../overlays/ovl_En_Clear_Tag.xml | 28 + .../overlays/ovl_En_Ganon_Mant.xml | 22 + .../overlays/ovl_En_Ganon_Organ.xml | 19 + .../GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml | 8 + .../GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml | 38 + .../GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml | 8 + .../xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml | 9 + .../xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml | 8 + .../xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml | 8 + .../xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml | 15 + .../GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml | 17 + .../overlays/ovl_File_Choose.xml | 22 + .../GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml | 12 + .../GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml | 10 + .../GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml | 15 + .../GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml | 10 + .../overlays/ovl_Oceff_Storm.xml | 11 + .../GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml | 10 + .../overlays/ovl_Oceff_Wipe2.xml | 11 + .../overlays/ovl_Oceff_Wipe3.xml | 10 + .../overlays/ovl_Oceff_Wipe4.xml | 11 + .../GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml | 231 + .../GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml | 34 + .../GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml | 191 + .../scenes/dungeons/HAKAdanCH.xml | 69 + .../scenes/dungeons/HAKAdan_bs.xml | 23 + .../GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml | 288 ++ .../GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml | 262 ++ .../scenes/dungeons/MIZUsin_bs.xml | 29 + .../GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml | 96 + .../scenes/dungeons/bdan_boss.xml | 20 + .../GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml | 220 + .../scenes/dungeons/ddan_boss.xml | 22 + .../GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml | 121 + .../scenes/dungeons/ganon_boss.xml | 31 + .../scenes/dungeons/ganon_demo.xml | 19 + .../scenes/dungeons/ganon_final.xml | 34 + .../scenes/dungeons/ganon_sonogo.xml | 72 + .../scenes/dungeons/ganon_tou.xml | 34 + .../scenes/dungeons/ganontika.xml | 254 ++ .../scenes/dungeons/ganontikasonogo.xml | 36 + .../scenes/dungeons/gerudoway.xml | 55 + .../scenes/dungeons/ice_doukutu.xml | 105 + .../scenes/dungeons/jyasinboss.xml | 49 + .../scenes/dungeons/jyasinzou.xml | 358 ++ .../xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml | 127 + .../scenes/dungeons/moribossroom.xml | 33 + .../GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml | 157 + .../scenes/dungeons/ydan_boss.xml | 26 + .../GC_NMQ_NTSC_U/scenes/indoors/bowling.xml | 36 + .../scenes/indoors/daiyousei_izumi.xml | 25 + .../scenes/indoors/hairal_niwa.xml | 32 + .../scenes/indoors/hairal_niwa_n.xml | 21 + .../scenes/indoors/hakasitarelay.xml | 80 + .../xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml | 8 + .../scenes/indoors/hylia_labo.xml | 39 + .../xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml | 8 + .../GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml | 8 + .../scenes/indoors/kenjyanoma.xml | 27 + .../scenes/indoors/kokiri_home.xml | 8 + .../scenes/indoors/kokiri_home3.xml | 8 + .../scenes/indoors/kokiri_home4.xml | 8 + .../scenes/indoors/kokiri_home5.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml | 8 + .../scenes/indoors/link_home.xml | 8 + .../GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml | 21 + .../scenes/indoors/malon_stable.xml | 8 + .../scenes/indoors/miharigoya.xml | 28 + .../GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml | 44 + .../scenes/indoors/syatekijyou.xml | 30 + .../GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml | 53 + .../xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml | 8 + .../GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml | 47 + .../scenes/indoors/yousei_izumi_tate.xml | 18 + .../scenes/indoors/yousei_izumi_yoko.xml | 24 + .../xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml | 18 + .../GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml | 26 + .../scenes/misc/hakaana_ouke.xml | 37 + .../GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml | 8 + .../GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml | 8 + .../GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml | 113 + .../xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml | 23 + .../scenes/misc/market_alley.xml | 8 + .../scenes/misc/market_alley_n.xml | 9 + .../GC_NMQ_NTSC_U/scenes/misc/market_day.xml | 9 + .../scenes/misc/market_night.xml | 9 + .../scenes/misc/market_ruins.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml | 8 + .../GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml | 9 + .../GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml | 8 + .../GC_NMQ_NTSC_U/scenes/misc/turibori.xml | 35 + .../GC_NMQ_NTSC_U/scenes/overworld/entra.xml | 8 + .../GC_NMQ_NTSC_U/scenes/overworld/souko.xml | 44 + .../GC_NMQ_NTSC_U/scenes/overworld/spot00.xml | 69 + .../GC_NMQ_NTSC_U/scenes/overworld/spot01.xml | 51 + .../GC_NMQ_NTSC_U/scenes/overworld/spot02.xml | 64 + .../GC_NMQ_NTSC_U/scenes/overworld/spot03.xml | 41 + .../GC_NMQ_NTSC_U/scenes/overworld/spot04.xml | 81 + .../GC_NMQ_NTSC_U/scenes/overworld/spot05.xml | 43 + .../GC_NMQ_NTSC_U/scenes/overworld/spot06.xml | 58 + .../GC_NMQ_NTSC_U/scenes/overworld/spot07.xml | 47 + .../GC_NMQ_NTSC_U/scenes/overworld/spot08.xml | 36 + .../GC_NMQ_NTSC_U/scenes/overworld/spot09.xml | 37 + .../GC_NMQ_NTSC_U/scenes/overworld/spot10.xml | 71 + .../GC_NMQ_NTSC_U/scenes/overworld/spot11.xml | 41 + .../GC_NMQ_NTSC_U/scenes/overworld/spot12.xml | 52 + .../GC_NMQ_NTSC_U/scenes/overworld/spot13.xml | 39 + .../GC_NMQ_NTSC_U/scenes/overworld/spot15.xml | 52 + .../GC_NMQ_NTSC_U/scenes/overworld/spot16.xml | 50 + .../GC_NMQ_NTSC_U/scenes/overworld/spot17.xml | 54 + .../GC_NMQ_NTSC_U/scenes/overworld/spot18.xml | 105 + .../GC_NMQ_NTSC_U/scenes/overworld/spot20.xml | 36 + .../GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml | 8 + .../GC_NMQ_NTSC_U/scenes/shops/face_shop.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml | 8 + .../scenes/shops/kokiri_shop.xml | 8 + .../GC_NMQ_NTSC_U/scenes/shops/night_shop.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml | 8 + .../xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml | 8 + .../GC_NMQ_NTSC_U/text/elf_message_field.xml | 5 + .../GC_NMQ_NTSC_U/text/elf_message_ydan.xml | 5 + .../text/message_data_static.xml | 11 + .../GC_NMQ_NTSC_U/textures/backgrounds.xml | 246 + .../textures/boss_title_cards.xml | 42 + .../textures/do_action_static.xml | 62 + .../textures/icon_item_24_static.xml | 24 + .../textures/icon_item_dungeon_static.xml | 23 + .../textures/icon_item_field_static.xml | 32 + .../textures/icon_item_gameover_static.xml | 10 + .../textures/icon_item_jpn_static.xml | 35 + .../textures/icon_item_nes_static.xml | 35 + .../textures/icon_item_static.xml | 188 + .../textures/item_name_static.xml | 250 ++ .../xml/GC_NMQ_NTSC_U/textures/kanji.xml | 3984 +++++++++++++++++ .../textures/map_48x85_static.xml | 72 + .../textures/map_grand_static.xml | 28 + .../GC_NMQ_NTSC_U/textures/map_i_static.xml | 243 + .../textures/map_name_static.xml | 72 + .../GC_NMQ_NTSC_U/textures/message_static.xml | 11 + .../textures/message_texture_static.xml | 6 + .../textures/nes_font_static.xml | 145 + .../textures/nintendo_rogo_static.xml | 9 + .../textures/parameter_static.xml | 60 + .../textures/place_title_cards.xml | 230 + .../xml/GC_NMQ_NTSC_U/textures/skyboxes.xml | 113 + .../GC_NMQ_NTSC_U/textures/title_static.xml | 169 + soh/soh/Extractor/Extract.cpp | 32 +- soh/soh/ResourceManagerHelpers.cpp | 2 + soh/soh/SohGui/SohMenuSettings.cpp | 10 + soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c | 16 +- .../ovl_file_choose/z_file_choose.c | 20 +- 2749 files changed, 144218 insertions(+), 7 deletions(-) create mode 100644 soh/assets/extractor/Config_GC_MQ_NTSC_J.xml create mode 100644 soh/assets/extractor/Config_GC_MQ_NTSC_U.xml create mode 100644 soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml create mode 100644 soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml create mode 100644 soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml create mode 100644 soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml create mode 100644 soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml diff --git a/OTRExporter b/OTRExporter index a7f24ae8a..41052efcd 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit a7f24ae8a0da54440f4666c1619283676863ca6a +Subproject commit 41052efcdf8df8e67517cc93da8975fcd4e14af9 diff --git a/ZAPDTR b/ZAPDTR index 8a26737d4..2aeababbf 160000 --- a/ZAPDTR +++ b/ZAPDTR @@ -1 +1 @@ -Subproject commit 8a26737d4783a5282fb2c25ce7028556cbe5a394 +Subproject commit 2aeababbfb81b00d34673406453e8e8e2deaa27b diff --git a/docs/supportedHashes.json b/docs/supportedHashes.json index 3e4ab41b4..c5b3d5b2f 100644 --- a/docs/supportedHashes.json +++ b/docs/supportedHashes.json @@ -54,5 +54,25 @@ { "name": "NTSC 1.2 (JP)", "sha1": "fa5f5942b27480d60243c2d52c0e93e26b9e6b86" + }, + { + "name": "NTSC GC (US)", + "sha1": "b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b" + }, + { + "name": "NTSC MQ (US)", + "sha1": "8b5d13aac69bfbf989861cfdc50b1d840945fc1d" + }, + { + "name": "NTSC GC (JP)", + "sha1": "0769c84615422d60f16925cd859593cdfa597f84" + }, + { + "name": "NTSC GC (JP) (Collector's Edition)", + "sha1": "2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73" + }, + { + "name": "NTSC MQ (JP)", + "sha1": "dd14e143c4275861fe93ea79d0c02e36ae8c6c2f" } ] diff --git a/scripts/linux/appimage/soh.sh.in b/scripts/linux/appimage/soh.sh.in index 1d148cdfc..e02b44fc7 100644 --- a/scripts/linux/appimage/soh.sh.in +++ b/scripts/linux/appimage/soh.sh.in @@ -128,6 +128,36 @@ while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do d90bbe422ac728ac54ac6a2c9fec942f7ff04df9) # n64 ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86 ;; + 44c75962911e13bdfdc31b35e0b8e3be6a6a49ab) # v64 + b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b + ;; + 5d47025581060af5ba19e6719c25fea7398e87cf) # n64 + b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b + ;; + e1d070ad7b017de9f992b362164dcd9d7f820f7e) # v64 + 8b5d13aac69bfbf989861cfdc50b1d840945fc1d + ;; + a8c04cd5aa94a6a32198f36ff2069d43342d18a8) # n64 + 8b5d13aac69bfbf989861cfdc50b1d840945fc1d + ;; + 245410280d152f28d5b1c0c0fc37f384db0020cd) # v64 + 0769c84615422d60f16925cd859593cdfa597f84 + ;; + fbdc9e444807f9b881e3432cedf66f38746b81d8) # n64 + 0769c84615422d60f16925cd859593cdfa597f84 + ;; + b6d33d6bf5d6700c64b6a873ab8b06ff039619bc) # v64 + 2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73 + ;; + 2c7113d20044f93c82ec888c19aa09ea7797396d) # n64 + 2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73 + ;; + 06c3c098f0e14ed61811dfaf0e8e4519d7d7a826) # v64 + dd14e143c4275861fe93ea79d0c02e36ae8c6c2f + ;; + bb3f85bfaad9ae7a20afbf618fc9fe126c8c1b4f) # n64 + dd14e143c4275861fe93ea79d0c02e36ae8c6c2f + ;; esac case "$ROMHASH" in @@ -225,6 +255,46 @@ while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do continue fi ;; + b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=GC_NMQ_NTSC_U + OTRNAME="oot.otr" + else + continue + fi + ;; + 8b5d13aac69bfbf989861cfdc50b1d840945fc1d) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_NTSC_U + OTRNAME="oot-mq.otr" + else + continue + fi + ;; + 0769c84615422d60f16925cd859593cdfa597f84) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=GC_NMQ_NTSC_J + OTRNAME="oot.otr" + else + continue + fi + ;; + 2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=GC_NMQ_NTSC_J_CE + OTRNAME="oot.otr" + else + continue + fi + ;; + dd14e143c4275861fe93ea79d0c02e36ae8c6c2f) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_NTSC_J + OTRNAME="oot-mq.otr" + else + continue + fi + ;; *) echo -e "\n$romfile - $ROMHASH rom hash does not match\n" continue;; diff --git a/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml b/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml new file mode 100644 index 000000000..9e714df03 --- /dev/null +++ b/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml b/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml new file mode 100644 index 000000000..e3baed50f --- /dev/null +++ b/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml new file mode 100644 index 000000000..a5fe09f12 --- /dev/null +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml new file mode 100644 index 000000000..199030c69 --- /dev/null +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml new file mode 100644 index 000000000..5fa22a5b8 --- /dev/null +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml b/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml new file mode 100644 index 000000000..90f5dee24 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml @@ -0,0 +1,1558 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml new file mode 100644 index 000000000..e6b4bba12 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml new file mode 100644 index 000000000..bbc709a4f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..9d2e12231 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml new file mode 100644 index 000000000..1521be9f1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml b/soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml new file mode 100644 index 000000000..b2b082e6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..c4e829f1c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..bfb83104f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..d7348bd6c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..5e7096391 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..0798a1de0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..25396b7f9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..d85ebbea2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..d70769842 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..51ded47f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..3f6d5243c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..ed0ebdec3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..f4022c46e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..fea6529a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..7b3b03732 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..9a6be6182 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..95e53a79b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..1c470beaa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..ae9ea715f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..8dd8e396d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml new file mode 100644 index 000000000..2b959296f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..75dc7ea35 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..c9dbe3384 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..6b0b7848d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..c5153a78e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..e5a353ba3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..053730eea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..5f83c9b1a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..0eecf0387 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..5af20cff6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..a79d02b74 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..f55d57ca4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..d6cfddde8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..a39e5ccd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..a2c20d692 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..ea300b96c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..502dcd839 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..f8b5d8b6c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..9eb1ee61a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..c46e8ad27 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..05633e53e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..1c9bf84b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..7d5f5a123 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..ba5542faa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..a441206b0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..f2d07a288 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..7ad60c2a0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..166244e29 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml new file mode 100644 index 000000000..679436de0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/men.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..377c7a682 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml new file mode 100644 index 000000000..eb725afa6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml new file mode 100644 index 000000000..f33860420 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml new file mode 100644 index 000000000..5bb9e059c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml new file mode 100644 index 000000000..f41b226f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml new file mode 100644 index 000000000..feb267251 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml new file mode 100644 index 000000000..94948fa8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml new file mode 100644 index 000000000..f1b80ee04 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml b/soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_J/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml b/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml new file mode 100644 index 000000000..4c5b001e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml @@ -0,0 +1,1558 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml new file mode 100644 index 000000000..a117b43ae --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml new file mode 100644 index 000000000..2353ae220 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..f2de3afce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml b/soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml new file mode 100644 index 000000000..7d1e905d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml b/soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml new file mode 100644 index 000000000..dfe25df27 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mag.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..dce4da772 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..76d82579e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..8bee2c8dd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..f7795146c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..84910e5f0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..a19dbed0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..4ecda6020 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..89e10b5b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..14195ccf8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..b286b9612 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..f5d5f1708 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..9dd01857a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..b69dbff0e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..37953cff5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..193e86796 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..64d24dd76 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..20230c5ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..ece03e8ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..5d05b4faf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml new file mode 100644 index 000000000..4b87f9a6f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..263813cce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..539e97f48 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..5fa756368 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..8e77b2ead --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..d7b3b3293 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..0229a1587 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..556c166a9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..fab89b3aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..3d813da57 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..88eb30653 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..7604e81ff --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..7fa56605f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..a39e5ccd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..a2c20d692 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..ea300b96c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..502dcd839 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..f8b5d8b6c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..9eb1ee61a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..c46e8ad27 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..05633e53e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..1c9bf84b4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..7d5f5a123 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..ba5542faa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..a441206b0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..f2d07a288 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..7ad60c2a0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..166244e29 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml new file mode 100644 index 000000000..679436de0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/men.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..377c7a682 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml new file mode 100644 index 000000000..eb725afa6 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml new file mode 100644 index 000000000..f33860420 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml new file mode 100644 index 000000000..5bb9e059c --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml new file mode 100644 index 000000000..f41b226f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml new file mode 100644 index 000000000..feb267251 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml new file mode 100644 index 000000000..ff37dac65 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml new file mode 100644 index 000000000..b01646cb5 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml b/soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/GC_MQ_NTSC_U/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml new file mode 100644 index 000000000..849499cc2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml @@ -0,0 +1,1558 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml new file mode 100644 index 000000000..0c552b70e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml new file mode 100644 index 000000000..ee0922d81 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..f45e58536 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml new file mode 100644 index 000000000..9088e3a63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml new file mode 100644 index 000000000..b68d4227a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mag.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..ef34ff91e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..13bb1b610 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..6f985a0b1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..c3c809065 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..3106fdab5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..ddc03690e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..72b81e798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..802a42bd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..23093c9f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..e9d9ba222 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..5db330f6e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..ddbf1bb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..cab7d3ce4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..a4cea2ff9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..0a02bddb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..de46f6ed3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..e181840b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..cd24cb8d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..2e419c8c4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml new file mode 100644 index 000000000..fecbf6f1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..22f1e683e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..7b083bdd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..6b0b7848d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..a037bbdf6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..1f42916e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..19bdd2f32 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..ff49072ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..8e0c6beac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..c35e96db1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..a56c505ad --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..7d0f5ddc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..c7513e94c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..373f36030 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..e557c80a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..97401aff6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..fa4d784f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..00c5aa82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..a9e520f4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..1446a9c98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..05633e53e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..3ec568cfb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..84ef36950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..a5ff210ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..060d4941b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..827277614 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..0f1bc3b28 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..bc14a46ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml new file mode 100644 index 000000000..d9e5960e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..aed7d2660 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml new file mode 100644 index 000000000..eb725afa6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml new file mode 100644 index 000000000..f33860420 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml new file mode 100644 index 000000000..5bb9e059c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml new file mode 100644 index 000000000..f41b226f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml new file mode 100644 index 000000000..feb267251 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml new file mode 100644 index 000000000..fc181170a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml new file mode 100644 index 000000000..f1b80ee04 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nes_font_static.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml new file mode 100644 index 000000000..90f5dee24 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml @@ -0,0 +1,1558 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml new file mode 100644 index 000000000..e6b4bba12 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml new file mode 100644 index 000000000..bbc709a4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..9d2e12231 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml new file mode 100644 index 000000000..1521be9f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml new file mode 100644 index 000000000..84467d76d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..b894516eb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..9337a2fc0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..0d5ce829a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..0f3862138 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..a3fdd07b7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..9e2db033b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..0d2f36720 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..d14798ac3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..49909db29 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..b48f36ba0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..7501319f0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..fb53e6224 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..c00e7c5b0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..0aa7e71df --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..62f8a3375 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..ed9f58adc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..20bea0c8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..f9d5e322c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..6d85ff620 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml new file mode 100644 index 000000000..a41477d9e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..187e5ae76 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..f307aa446 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..5fa756368 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..7e1315d50 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..22a94dcce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..229cb9eae --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..e5aa927a7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..f927d1db2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..d822d5238 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..9213b354f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..e7ed30c0b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..796db3ee1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..373f36030 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..e557c80a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..97401aff6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..fa4d784f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..00c5aa82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..a9e520f4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..1446a9c98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..05633e53e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..3ec568cfb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..84ef36950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..a5ff210ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..060d4941b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..827277614 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..0f1bc3b28 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..bc14a46ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml new file mode 100644 index 000000000..d9e5960e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..aed7d2660 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml new file mode 100644 index 000000000..eb725afa6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml new file mode 100644 index 000000000..f33860420 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml new file mode 100644 index 000000000..5bb9e059c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml new file mode 100644 index 000000000..f41b226f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml new file mode 100644 index 000000000..feb267251 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml new file mode 100644 index 000000000..94948fa8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml new file mode 100644 index 000000000..b01646cb5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml new file mode 100644 index 000000000..90f5dee24 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml @@ -0,0 +1,1558 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml new file mode 100644 index 000000000..e6b4bba12 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml new file mode 100644 index 000000000..bbc709a4f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_triforce.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml new file mode 100644 index 000000000..9d2e12231 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/fbdemo_wipe1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml b/soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml new file mode 100644 index 000000000..1521be9f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/code/sys_matrix.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml new file mode 100644 index 000000000..9de1e92d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/misc/link_animetion.xml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml new file mode 100644 index 000000000..5b1a9050d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_dangeon_keep.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml new file mode 100644 index 000000000..011e8f7fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_field_keep.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml new file mode 100644 index 000000000..94eee8845 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/gameplay_keep.xml @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml new file mode 100644 index 000000000..5d04bde45 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_Bb.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml new file mode 100644 index 000000000..4d37b1b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ahg.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml new file mode 100644 index 000000000..b70c70d70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_am.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml new file mode 100644 index 000000000..1e29b351e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ane.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml new file mode 100644 index 000000000..c70621c6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ani.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml new file mode 100644 index 000000000..fb029586b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_anubice.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml new file mode 100644 index 000000000..e6202d0cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_aob.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml new file mode 100644 index 000000000..00f7cd677 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_b_heart.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml new file mode 100644 index 000000000..ccc5c2136 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bba.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml new file mode 100644 index 000000000..dcd56d385 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdan_objects.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml new file mode 100644 index 000000000..a092f0c23 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bdoor.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml new file mode 100644 index 000000000..791226b71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bg.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml new file mode 100644 index 000000000..1c7d39e31 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bigokuta.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml new file mode 100644 index 000000000..167a5022d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bird.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml new file mode 100644 index 000000000..c665b6b00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bji.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml new file mode 100644 index 000000000..1c2ef4ec6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml new file mode 100644 index 000000000..345a8ebd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_blkobj.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml new file mode 100644 index 000000000..289e994e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bob.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml new file mode 100644 index 000000000..4be4764ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_boj.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml new file mode 100644 index 000000000..83e60248d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml new file mode 100644 index 000000000..26ab6b4f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bombiwa.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml new file mode 100644 index 000000000..ffe6d43db --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bowl.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml new file mode 100644 index 000000000..106d2d335 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_box.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml new file mode 100644 index 000000000..718dcd561 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_brob.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml new file mode 100644 index 000000000..f5de18692 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bubble.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml new file mode 100644 index 000000000..58db6e1d4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bv.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml new file mode 100644 index 000000000..6fd39fbb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bw.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml new file mode 100644 index 000000000..d4f43ddc1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bwall.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml new file mode 100644 index 000000000..fb78c117e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_bxa.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml new file mode 100644 index 000000000..0c14d0bc5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cne.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml new file mode 100644 index 000000000..ba051cfa7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml new file mode 100644 index 000000000..5d067c329 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cow.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml new file mode 100644 index 000000000..77337c644 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_crow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml new file mode 100644 index 000000000..83804ccaf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_cs.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml new file mode 100644 index 000000000..6be59c154 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_elevator.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml new file mode 100644 index 000000000..4bb50c2b4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_hsblock.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml new file mode 100644 index 000000000..291238519 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_d_lift.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml new file mode 100644 index 000000000..1524c7a26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_daiku.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml new file mode 100644 index 000000000..3fc563b96 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ddan_objects.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml new file mode 100644 index 000000000..7202a833f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekubaba.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml new file mode 100644 index 000000000..e906bf61c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekujr.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml new file mode 100644 index 000000000..5fceef416 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dekunuts.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml new file mode 100644 index 000000000..73058d5e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_6k.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml new file mode 100644 index 000000000..aa54bc2ee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_kekkai.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml new file mode 100644 index 000000000..9ea19012b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_demo_tre_lgt.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml new file mode 100644 index 000000000..7a52d7dbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dh.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml new file mode 100644 index 000000000..3bce34304 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dnk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml new file mode 100644 index 000000000..8b78ffcf2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dns.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml new file mode 100644 index 000000000..4dfd7d6e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodojr.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml new file mode 100644 index 000000000..779e20e9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dodongo.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml new file mode 100644 index 000000000..ef00442b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml new file mode 100644 index 000000000..2f1726204 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_gerudo.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml new file mode 100644 index 000000000..a37f590d6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_door_killer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml new file mode 100644 index 000000000..0413a9e2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml new file mode 100644 index 000000000..683bcc68d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ds2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml new file mode 100644 index 000000000..0babd962b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_du.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml new file mode 100644 index 000000000..5e792edb5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_dy_obj.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml new file mode 100644 index 000000000..7ec83e284 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ec.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml new file mode 100644 index 000000000..9215b6a39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_crystal_light.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml new file mode 100644 index 000000000..7f12c56f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_doughnut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml new file mode 100644 index 000000000..800d9535f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_erupc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml new file mode 100644 index 000000000..2fc65b16f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_fire_ball.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml new file mode 100644 index 000000000..5f962f162 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_flash.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml new file mode 100644 index 000000000..67ef5ce7e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_lgt_shower.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml new file mode 100644 index 000000000..00b47c460 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_star_field.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml new file mode 100644 index 000000000..de5376569 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_efc_tw.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml new file mode 100644 index 000000000..e4132491f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ei.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml new file mode 100644 index 000000000..2f1bf9a5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fa.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml new file mode 100644 index 000000000..9bc25d3a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml new file mode 100644 index 000000000..44b5f5f9c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fd2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml new file mode 100644 index 000000000..6a275daeb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fhg.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml new file mode 100644 index 000000000..49bf620cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fire.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml new file mode 100644 index 000000000..8c26a4341 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_firefly.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml new file mode 100644 index 000000000..f5ad4f6da --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fish.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml new file mode 100644 index 000000000..25ee2ad42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fr.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml new file mode 100644 index 000000000..82c449e3d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fu.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml new file mode 100644 index 000000000..ee9821d26 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fw.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml new file mode 100644 index 000000000..dad6fec5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_fz.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml new file mode 100644 index 000000000..5b68602ba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml new file mode 100644 index 000000000..7e715dd41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon2.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml new file mode 100644 index 000000000..b1016299b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime1.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml new file mode 100644 index 000000000..180e5995c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml new file mode 100644 index 000000000..be4c4dcb1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_anime3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml new file mode 100644 index 000000000..5e32610ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ganon_objects.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml new file mode 100644 index 000000000..79e0768b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ge1.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml new file mode 100644 index 000000000..f0667743b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geff.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml new file mode 100644 index 000000000..49b12ef2e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_geldb.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml new file mode 100644 index 000000000..4b58787a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml new file mode 100644 index 000000000..267b0a734 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_arrowcase.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml new file mode 100644 index 000000000..e74247816 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bean.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml new file mode 100644 index 000000000..bae86c11d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml new file mode 100644 index 000000000..1400c4a4d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bomb_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml new file mode 100644 index 000000000..07134748c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bombpouch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml new file mode 100644 index 000000000..3c1a0fe7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boomerang.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml new file mode 100644 index 000000000..3bcb6a47a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_boots_2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml new file mode 100644 index 000000000..e5e4bc86c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bosskey.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml new file mode 100644 index 000000000..3b0884a03 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml new file mode 100644 index 000000000..443219caf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bottle_letter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml new file mode 100644 index 000000000..946e9c496 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bow.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml new file mode 100644 index 000000000..5a0b62a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_bracelet.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml new file mode 100644 index 000000000..408741ac5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_brokensword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml new file mode 100644 index 000000000..7b60a7724 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_butterfly.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml new file mode 100644 index 000000000..3f897b6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_clothes.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml new file mode 100644 index 000000000..22e29f255 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_coin.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml new file mode 100644 index 000000000..076229b11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_compass.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml new file mode 100644 index 000000000..8925e6fa5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_dekupouch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml new file mode 100644 index 000000000..2b2e2847d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_egg.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml new file mode 100644 index 000000000..5128c5f6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_eye_lotion.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml new file mode 100644 index 000000000..4bfd76a7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fire.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml new file mode 100644 index 000000000..edb39dc29 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_fish.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml new file mode 100644 index 000000000..a656c306b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_frog.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml new file mode 100644 index 000000000..d65daee8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml new file mode 100644 index 000000000..cfcb878d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gerudomask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml new file mode 100644 index 000000000..795f0cfd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ghost.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml new file mode 100644 index 000000000..63d32ab5a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_glasses.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml new file mode 100644 index 000000000..0e1c4259d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_gloves.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml new file mode 100644 index 000000000..50cbdd891 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_goddess.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml new file mode 100644 index 000000000..844d90e71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_golonmask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml new file mode 100644 index 000000000..ae7834201 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_grass.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml new file mode 100644 index 000000000..feb5c8659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hammer.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml new file mode 100644 index 000000000..48e78b1b5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_heart.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml new file mode 100644 index 000000000..d2e763e63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hearts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml new file mode 100644 index 000000000..a6b3b0fda --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hookshot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml new file mode 100644 index 000000000..6d41df8fd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_hoverboots.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml new file mode 100644 index 000000000..7af5b5b3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_insect.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml new file mode 100644 index 000000000..e83c65116 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_jewel.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml new file mode 100644 index 000000000..a37d45a71 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_key.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml new file mode 100644 index 000000000..46eff7d3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ki_tan_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml new file mode 100644 index 000000000..bea868339 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_letter.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml new file mode 100644 index 000000000..18a5c3d7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_liquid.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml new file mode 100644 index 000000000..7161e42e3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_longsword.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml new file mode 100644 index 000000000..0fd659ae9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_m_arrow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml new file mode 100644 index 000000000..7623e6353 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_magicpot.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml new file mode 100644 index 000000000..471c1dab9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml new file mode 100644 index 000000000..28e5b1e68 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_medal.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml new file mode 100644 index 000000000..b01fca953 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_melody.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml new file mode 100644 index 000000000..a3e223b3e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_milk.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml new file mode 100644 index 000000000..5b19bca74 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_mushroom.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml new file mode 100644 index 000000000..c8389f62c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_niwatori.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml new file mode 100644 index 000000000..c59903c43 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_nuts.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml new file mode 100644 index 000000000..82607677d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml new file mode 100644 index 000000000..2c5f70d98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ocarina_0.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml new file mode 100644 index 000000000..5f808baf9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_pachinko.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml new file mode 100644 index 000000000..fb7dc0155 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_powder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml new file mode 100644 index 000000000..75ae7eb2b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_prescription.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml new file mode 100644 index 000000000..054731dec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_purse.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml new file mode 100644 index 000000000..9d4eb9487 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rabit_mask.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml new file mode 100644 index 000000000..7de08487f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_redead_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml new file mode 100644 index 000000000..0a1af96d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_rupy.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml new file mode 100644 index 000000000..dcc038b7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_saw.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml new file mode 100644 index 000000000..1cf5de5b9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_scale.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml new file mode 100644 index 000000000..82c15c82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_seed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml new file mode 100644 index 000000000..2f11e3f6d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml new file mode 100644 index 000000000..176ae025f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_2.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml new file mode 100644 index 000000000..8d1e5dafd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_shield_3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml new file mode 100644 index 000000000..e6c90f76f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_skj_mask.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml new file mode 100644 index 000000000..a15b1253e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soldout.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml new file mode 100644 index 000000000..a68178eba --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_soul.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml new file mode 100644 index 000000000..fed89f465 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_stick.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml new file mode 100644 index 000000000..a2606afbe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sutaru.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml new file mode 100644 index 000000000..e1119abca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_sword_1.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml new file mode 100644 index 000000000..73bf888d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_ticketstone.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml new file mode 100644 index 000000000..3b4edf3de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_truth_mask.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml new file mode 100644 index 000000000..e3b1ab10e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gi_zoramask.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml new file mode 100644 index 000000000..ee6dab74f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gj.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml new file mode 100644 index 000000000..ea4f8444f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gjyo_objects.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml new file mode 100644 index 000000000..499a3720d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gla.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml new file mode 100644 index 000000000..91b10cc42 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gm.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml new file mode 100644 index 000000000..3ae3b57f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml new file mode 100644 index 000000000..a88d419d7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gnd_magic.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml new file mode 100644 index 000000000..8bf5d770c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gndd.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml new file mode 100644 index 000000000..60df9e469 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_god_lgt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml new file mode 100644 index 000000000..7e04508cb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gol.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml new file mode 100644 index 000000000..ec3e42114 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goma.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml new file mode 100644 index 000000000..5d406e957 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_goroiwa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml new file mode 100644 index 000000000..5f7360ae5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gr.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml new file mode 100644 index 000000000..145be1665 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gs.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml new file mode 100644 index 000000000..1d79d4e39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_gt.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml new file mode 100644 index 000000000..f6b263c37 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml new file mode 100644 index 000000000..1376d0356 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_door.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml new file mode 100644 index 000000000..3ca6d27c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_haka_objects.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml new file mode 100644 index 000000000..0de02aaf1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hakach_objects.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml new file mode 100644 index 000000000..b0324c3be --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hata.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml new file mode 100644 index 000000000..ecc795321 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_heavy_object.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml new file mode 100644 index 000000000..f41c0ee5e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hidan_objects.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml new file mode 100644 index 000000000..a7290f395 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hintnuts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml new file mode 100644 index 000000000..6b317eb7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hni.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml new file mode 100644 index 000000000..74619e597 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml new file mode 100644 index 000000000..0a55462e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_ganon.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml new file mode 100644 index 000000000..146c564f5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_link_child.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml new file mode 100644 index 000000000..2facab39c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_normal.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml new file mode 100644 index 000000000..af270c658 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_horse_zelda.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml new file mode 100644 index 000000000..cf5d06e1a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_hs.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml new file mode 100644 index 000000000..05795cb33 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_human.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml new file mode 100644 index 000000000..c7d059d70 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ice_objects.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml new file mode 100644 index 000000000..8a6028f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ik.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml new file mode 100644 index 000000000..a628a113a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_im.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml new file mode 100644 index 000000000..84c114047 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_in.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml new file mode 100644 index 000000000..e6be42beb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ingate.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml new file mode 100644 index 000000000..62bae8cb9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jj.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml new file mode 100644 index 000000000..ff7bd3efa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_js.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml new file mode 100644 index 000000000..60a7b3788 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_door.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml new file mode 100644 index 000000000..c6f6773c6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_iron.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml new file mode 100644 index 000000000..a1f19b806 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_jya_obj.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml new file mode 100644 index 000000000..eb952732b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ka.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml new file mode 100644 index 000000000..9ffc7a2ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kanban.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml new file mode 100644 index 000000000..a701b294d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kibako2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml new file mode 100644 index 000000000..a865c15de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kingdodongo.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml new file mode 100644 index 000000000..0a918a798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_km1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml new file mode 100644 index 000000000..67291a554 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kusa.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml new file mode 100644 index 000000000..eab561b1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kw1.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml new file mode 100644 index 000000000..4624fefdb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_kz.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml new file mode 100644 index 000000000..babe7d2aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_light_ring.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml new file mode 100644 index 000000000..552a79d7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightbox.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml new file mode 100644 index 000000000..cfd5dcfb4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_lightswitch.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml new file mode 100644 index 000000000..6351af505 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_boy.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml new file mode 100644 index 000000000..0de400373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_link_child.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml new file mode 100644 index 000000000..63eeb3895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma1.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml new file mode 100644 index 000000000..ce5910fb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ma2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml new file mode 100644 index 000000000..84467d76d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mag.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml new file mode 100644 index 000000000..819d89022 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mamenoki.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml new file mode 100644 index 000000000..6dd9d1659 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mastergolon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml new file mode 100644 index 000000000..af5a9ec15 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokiri.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml new file mode 100644 index 000000000..c64aa1c49 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterkokirihead.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml new file mode 100644 index 000000000..2c703274e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_masterzoora.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml new file mode 100644 index 000000000..23c0930c0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mb.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml new file mode 100644 index 000000000..161c73dca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_md.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml new file mode 100644 index 000000000..533872a55 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_medal.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml new file mode 100644 index 000000000..4c2b51df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_menkuri_objects.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml new file mode 100644 index 000000000..2acc9391a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mir_ray.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml new file mode 100644 index 000000000..5a18b95cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mizu_objects.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml new file mode 100644 index 000000000..daf9b0541 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml new file mode 100644 index 000000000..2fa0bdbe4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_dark.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml new file mode 100644 index 000000000..6274feaee --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flame.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml new file mode 100644 index 000000000..c1040ea11 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_flash.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml new file mode 100644 index 000000000..1aaeea193 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_ice.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml new file mode 100644 index 000000000..0f823b923 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_oka.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml new file mode 100644 index 000000000..6386f7f9e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_soul.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml new file mode 100644 index 000000000..8bba7eb91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mjin_wind.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml new file mode 100644 index 000000000..0b4aaae8a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mk.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml new file mode 100644 index 000000000..b27837e57 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml new file mode 100644 index 000000000..f450368f3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mo.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml new file mode 100644 index 000000000..bb1b31e2f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml new file mode 100644 index 000000000..c750ce20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri1a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml new file mode 100644 index 000000000..785b85857 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml new file mode 100644 index 000000000..ad1bb4d5f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_hineri2a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml new file mode 100644 index 000000000..58ea8c085 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml new file mode 100644 index 000000000..8ba4ff2d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mori_tex.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml new file mode 100644 index 000000000..a87d0e6b3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ms.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml new file mode 100644 index 000000000..7251ff721 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_mu.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml new file mode 100644 index 000000000..74de9e285 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nb.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml new file mode 100644 index 000000000..4eafec956 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_niw.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml new file mode 100644 index 000000000..96ffa3238 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_nwc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml new file mode 100644 index 000000000..e2e8187ff --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ny.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml new file mode 100644 index 000000000..1d665f101 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml new file mode 100644 index 000000000..65d080834 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA10.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml new file mode 100644 index 000000000..92ae474b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA11.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml new file mode 100644 index 000000000..ffdcd7989 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA2.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml new file mode 100644 index 000000000..a492bd875 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA3.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml new file mode 100644 index 000000000..dcdbbfff9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml new file mode 100644 index 000000000..55072176d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml new file mode 100644 index 000000000..c17a51088 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA6.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml new file mode 100644 index 000000000..52c68f639 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA7.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml new file mode 100644 index 000000000..8ed2d3df5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA8.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml new file mode 100644 index 000000000..d5c16abfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oA9.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml new file mode 100644 index 000000000..2f50c967b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB1.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml new file mode 100644 index 000000000..230783cea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml new file mode 100644 index 000000000..1c42ddacc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB3.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml new file mode 100644 index 000000000..2924c9e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oB4.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml new file mode 100644 index 000000000..4d5b1663f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml new file mode 100644 index 000000000..04ce91437 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE10.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml new file mode 100644 index 000000000..04f6f186d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml new file mode 100644 index 000000000..a5fa39fd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml new file mode 100644 index 000000000..d311e6010 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE1s.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml new file mode 100644 index 000000000..af62ad6d1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE2.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml new file mode 100644 index 000000000..95227da38 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE3.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml new file mode 100644 index 000000000..ae48d2ade --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml new file mode 100644 index 000000000..6037de52f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE4s.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml new file mode 100644 index 000000000..f5edf745a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE5.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml new file mode 100644 index 000000000..95bb602b6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE6.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml new file mode 100644 index 000000000..b3e588d4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE7.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml new file mode 100644 index 000000000..be5de2494 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE8.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml new file mode 100644 index 000000000..8ea7ee18c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE9.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml new file mode 100644 index 000000000..f6b4659e2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oE_anime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml new file mode 100644 index 000000000..f14fecd82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1d_map.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml new file mode 100644 index 000000000..fe41dde63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_oF1s.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml new file mode 100644 index 000000000..4ef4ac44c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_o_anime.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml new file mode 100644 index 000000000..b4fccea6f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_okuta.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml new file mode 100644 index 000000000..fd0323027 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_opening_demo1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml new file mode 100644 index 000000000..5880a9293 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml new file mode 100644 index 000000000..f23636343 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_os_anime.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml new file mode 100644 index 000000000..5788e3a20 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ossan.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml new file mode 100644 index 000000000..11da9b26e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ouke_haka.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml new file mode 100644 index 000000000..64fdf64c5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_owl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml new file mode 100644 index 000000000..42ee66cde --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_peehat.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml new file mode 100644 index 000000000..ff995efce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_composer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml new file mode 100644 index 000000000..78bc0d65a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_field.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml new file mode 100644 index 000000000..b429be258 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_po_sisters.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml new file mode 100644 index 000000000..be6d6eff4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_poh.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml new file mode 100644 index 000000000..9f9c894a6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml new file mode 100644 index 000000000..e1d686e97 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_pu_box.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml new file mode 100644 index 000000000..22c7d3373 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rd.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml new file mode 100644 index 000000000..32c697bd9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_reeba.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml new file mode 100644 index 000000000..47b92fcd2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_relay_objects.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml new file mode 100644 index 000000000..2a5ad30f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rl.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml new file mode 100644 index 000000000..98726b14b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rr.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml new file mode 100644 index 000000000..152b5489e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_rs.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml new file mode 100644 index 000000000..3d413619f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru1.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml new file mode 100644 index 000000000..fedf37d48 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ru2.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml new file mode 100644 index 000000000..ec45ac961 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sa.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml new file mode 100644 index 000000000..64d3bb005 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sb.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml new file mode 100644 index 000000000..fb58428c3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sd.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml new file mode 100644 index 000000000..594c43d39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shop_dungen.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml new file mode 100644 index 000000000..7065f8941 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_shopnuts.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml new file mode 100644 index 000000000..a23240a72 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_siofuki.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml new file mode 100644 index 000000000..f2e7ef6d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sk2.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml new file mode 100644 index 000000000..5b5efb484 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skb.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml new file mode 100644 index 000000000..74548e518 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_skj.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml new file mode 100644 index 000000000..d3be88315 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_break.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml new file mode 100644 index 000000000..10fb13aea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot00_objects.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml new file mode 100644 index 000000000..d44b944e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoya.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml new file mode 100644 index 000000000..720f50cd3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_matoyab.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml new file mode 100644 index 000000000..413e032a9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml new file mode 100644 index 000000000..36741a949 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot01_objects2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml new file mode 100644 index 000000000..65f45ff51 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot02_objects.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml new file mode 100644 index 000000000..f182e7d99 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot03_object.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml new file mode 100644 index 000000000..66293d752 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot04_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml new file mode 100644 index 000000000..6e7079149 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot05_objects.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml new file mode 100644 index 000000000..e3da63b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot06_objects.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml new file mode 100644 index 000000000..5bc2bfb6b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot07_object.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml new file mode 100644 index 000000000..4d71f3473 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot08_obj.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml new file mode 100644 index 000000000..eb6528393 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot09_obj.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml new file mode 100644 index 000000000..257298f7c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot11_obj.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml new file mode 100644 index 000000000..d619c781e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot12_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml new file mode 100644 index 000000000..bd59b8cd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot15_obj.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml new file mode 100644 index 000000000..d39de812a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot16_obj.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml new file mode 100644 index 000000000..d4239d8d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot17_obj.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml new file mode 100644 index 000000000..cc12b7894 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_spot18_obj.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml new file mode 100644 index 000000000..6283f8e9f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ssh.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml new file mode 100644 index 000000000..d64787fa1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_sst.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml new file mode 100644 index 000000000..983b9e2ea --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_st.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml new file mode 100644 index 000000000..59b0838e4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_stream.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml new file mode 100644 index 000000000..c1670edec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_syokudai.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml new file mode 100644 index 000000000..5e446bf5c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ta.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml new file mode 100644 index 000000000..1d6b9e698 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_timeblock.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml new file mode 100644 index 000000000..1be65c495 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tite.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml new file mode 100644 index 000000000..6b6cce724 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tk.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml new file mode 100644 index 000000000..cd07e60d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toki_objects.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml new file mode 100644 index 000000000..3388e7d34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_torch2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml new file mode 100644 index 000000000..73f3dcb1e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_toryo.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml new file mode 100644 index 000000000..8ea908825 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml new file mode 100644 index 000000000..17ab9ae39 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tr.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml new file mode 100644 index 000000000..56195cf41 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_trap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml new file mode 100644 index 000000000..87d449458 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_triforce_spot.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml new file mode 100644 index 000000000..567277bc3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml new file mode 100644 index 000000000..ee2c5e184 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tsubo.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml new file mode 100644 index 000000000..d238e10ab --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_tw.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml new file mode 100644 index 000000000..2ee4ade46 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_umajump.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml new file mode 100644 index 000000000..2bab5efaa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vali.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml new file mode 100644 index 000000000..091d4c51e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vase.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml new file mode 100644 index 000000000..c5b949b36 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_vm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml new file mode 100644 index 000000000..fbbc4f4af --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wallmaster.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml new file mode 100644 index 000000000..1497d7a10 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp1.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml new file mode 100644 index 000000000..b6d1b3624 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_warp2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml new file mode 100644 index 000000000..ebfb708d2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wf.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml new file mode 100644 index 000000000..47ec342ca --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_wood02.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml new file mode 100644 index 000000000..bb2bf3e7a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_xc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml new file mode 100644 index 000000000..bed9e8a60 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yabusame_point.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml new file mode 100644 index 000000000..e2adf307f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_ydan_objects.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml new file mode 100644 index 000000000..d594ebbb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_yukabyun.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml new file mode 100644 index 000000000..7f20eb786 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zf.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml new file mode 100644 index 000000000..79005516c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml new file mode 100644 index 000000000..001e5be14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl1.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml new file mode 100644 index 000000000..959a919ec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml new file mode 100644 index 000000000..cada50486 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml new file mode 100644 index 000000000..47016e2e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl2_anime2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml new file mode 100644 index 000000000..8e7a2837e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zl4.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml new file mode 100644 index 000000000..77465760e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/objects/object_zo.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml new file mode 100644 index 000000000..4c562a20d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Fire.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml new file mode 100644 index 000000000..9a5798ff0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Ice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml new file mode 100644 index 000000000..4f183e040 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Arrow_Light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml new file mode 100644 index 000000000..745a1974f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Ganon_Otyuka.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml new file mode 100644 index 000000000..752a28b0a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Bg_Jya_Cobra.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml new file mode 100644 index 000000000..5dba82099 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Dodongo.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml new file mode 100644 index 000000000..d69b3d473 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml new file mode 100644 index 000000000..da1dba0c2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Ganon2.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml new file mode 100644 index 000000000..83576e0ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Boss_Sst.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml new file mode 100644 index 000000000..d898616a7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Demo_Shd.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml new file mode 100644 index 000000000..1e806241e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Bili.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml new file mode 100644 index 000000000..e5394879f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Clear_Tag.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml new file mode 100644 index 000000000..9b59ab564 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Mant.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml new file mode 100644 index 000000000..109aa0056 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ganon_Organ.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml new file mode 100644 index 000000000..5118d7a03 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Holl.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml new file mode 100644 index 000000000..7d25a4015 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Jsjutan.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml new file mode 100644 index 000000000..00ef7e06d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Kanban.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml new file mode 100644 index 000000000..13a75e568 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sda.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml new file mode 100644 index 000000000..3028aa3f6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Ssh.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml new file mode 100644 index 000000000..0bbe47ce0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_St.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml new file mode 100644 index 000000000..517a47630 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_En_Sth.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml new file mode 100644 index 000000000..5fa2fa107 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_End_Title.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml new file mode 100644 index 000000000..9fe7266ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_File_Choose.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml new file mode 100644 index 000000000..d5579801b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml new file mode 100644 index 000000000..87a8d3258 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Fire.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml new file mode 100644 index 000000000..261606e52 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Magic_Wind.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml new file mode 100644 index 000000000..dfc63dca1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Spot.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml new file mode 100644 index 000000000..131239ad9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Storm.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 000000000..e32e56a4e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml new file mode 100644 index 000000000..f31b1201d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml new file mode 100644 index 000000000..a9bb00657 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml new file mode 100644 index 000000000..1cfceb7a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/overlays/ovl_Oceff_Wipe4.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml new file mode 100644 index 000000000..373f36030 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/Bmori1.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml new file mode 100644 index 000000000..89331ecc2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/FIRE_bs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml new file mode 100644 index 000000000..e557c80a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml new file mode 100644 index 000000000..97401aff6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdanCH.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml new file mode 100644 index 000000000..d36ac6b77 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HAKAdan_bs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml new file mode 100644 index 000000000..fa4d784f1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/HIDAN.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml new file mode 100644 index 000000000..00c5aa82d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml new file mode 100644 index 000000000..99ae2b3ef --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/MIZUsin_bs.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml new file mode 100644 index 000000000..a9e520f4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml new file mode 100644 index 000000000..9fccf2c30 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/bdan_boss.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml new file mode 100644 index 000000000..1446a9c98 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml new file mode 100644 index 000000000..05633e53e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ddan_boss.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml new file mode 100644 index 000000000..f857dbe94 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml new file mode 100644 index 000000000..36c5e8107 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_boss.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml new file mode 100644 index 000000000..56c98efed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_demo.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml new file mode 100644 index 000000000..3ec568cfb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_final.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml new file mode 100644 index 000000000..84ef36950 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_sonogo.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml new file mode 100644 index 000000000..1ae37b963 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganon_tou.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml new file mode 100644 index 000000000..a5ff210ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontika.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml new file mode 100644 index 000000000..060d4941b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ganontikasonogo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml new file mode 100644 index 000000000..827277614 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/gerudoway.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml new file mode 100644 index 000000000..0f1bc3b28 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ice_doukutu.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml new file mode 100644 index 000000000..86c0d317b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinboss.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml new file mode 100644 index 000000000..bc14a46ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/jyasinzou.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml new file mode 100644 index 000000000..d9e5960e8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/men.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml new file mode 100644 index 000000000..b9959eefa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/moribossroom.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml new file mode 100644 index 000000000..aed7d2660 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml new file mode 100644 index 000000000..7ea240547 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/dungeons/ydan_boss.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml new file mode 100644 index 000000000..9a41763a2 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/bowling.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml new file mode 100644 index 000000000..4f9a03fc0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/daiyousei_izumi.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml new file mode 100644 index 000000000..06d89f2fe --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml new file mode 100644 index 000000000..6f4c181e0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hairal_niwa_n.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml new file mode 100644 index 000000000..91be63d14 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hakasitarelay.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml new file mode 100644 index 000000000..a4ef5715f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml new file mode 100644 index 000000000..56822e67a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/hylia_labo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml new file mode 100644 index 000000000..db757e3d3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/impa.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml new file mode 100644 index 000000000..e4e9b102c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kakariko.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml new file mode 100644 index 000000000..4e8a58f3b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kenjyanoma.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml new file mode 100644 index 000000000..8c0305493 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml new file mode 100644 index 000000000..9f36eb41c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml new file mode 100644 index 000000000..eb861aedb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml new file mode 100644 index 000000000..974987fed --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/kokiri_home5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml new file mode 100644 index 000000000..c0a9d2eb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/labo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml new file mode 100644 index 000000000..2fb88ae34 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/link_home.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml new file mode 100644 index 000000000..8ae462f9d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/mahouya.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml new file mode 100644 index 000000000..aff97eeb8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/malon_stable.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml new file mode 100644 index 000000000..63f8676ac --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/miharigoya.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml new file mode 100644 index 000000000..2fb2d5e6a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/nakaniwa.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml new file mode 100644 index 000000000..05243b52c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/syatekijyou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml new file mode 100644 index 000000000..5b438980b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/takaraya.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml new file mode 100644 index 000000000..de72cc5f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tent.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml new file mode 100644 index 000000000..d7878b895 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/tokinoma.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml new file mode 100644 index 000000000..3b6dd2dec --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_tate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml new file mode 100644 index 000000000..90a8d95d0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/indoors/yousei_izumi_yoko.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml new file mode 100644 index 000000000..d8c06e545 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/enrui.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml new file mode 100644 index 000000000..5b408ac3a --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/entra_n.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml new file mode 100644 index 000000000..e7dc93dd0 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml new file mode 100644 index 000000000..2d8ba4906 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml new file mode 100644 index 000000000..17f53613e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hakaana_ouke.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml new file mode 100644 index 000000000..1331fdd4c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/hiral_demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml new file mode 100644 index 000000000..07b62c44d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakariko3.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml new file mode 100644 index 000000000..c3f993ff4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kakusiana.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml new file mode 100644 index 000000000..aac0f6c4e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/kinsuta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml new file mode 100644 index 000000000..c30467303 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml new file mode 100644 index 000000000..65db60411 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_alley_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml new file mode 100644 index 000000000..00887e69c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_day.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml new file mode 100644 index 000000000..c58e38744 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_night.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml new file mode 100644 index 000000000..f0ec75e75 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/market_ruins.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml new file mode 100644 index 000000000..b9ddf2cf7 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml new file mode 100644 index 000000000..4878338aa --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml new file mode 100644 index 000000000..122036791 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/shrine_r.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml new file mode 100644 index 000000000..0633224d9 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/misc/turibori.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml new file mode 100644 index 000000000..92ee57f59 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/entra.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml new file mode 100644 index 000000000..8dd9d9e48 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/souko.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml new file mode 100644 index 000000000..508d9309b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot00.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml new file mode 100644 index 000000000..eb725afa6 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot01.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml new file mode 100644 index 000000000..c7924c29d --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot02.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml new file mode 100644 index 000000000..9434185f4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot03.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml new file mode 100644 index 000000000..f33860420 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot04.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml new file mode 100644 index 000000000..4f7c62b91 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot05.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml new file mode 100644 index 000000000..f4af602cf --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot06.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml new file mode 100644 index 000000000..eeb976f7f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot07.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml new file mode 100644 index 000000000..86582f0dc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot08.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml new file mode 100644 index 000000000..5bb9e059c --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot09.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml new file mode 100644 index 000000000..66365e3d8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot10.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml new file mode 100644 index 000000000..76ff3b822 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot11.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml new file mode 100644 index 000000000..e21523b21 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot12.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml new file mode 100644 index 000000000..c68913065 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot13.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml new file mode 100644 index 000000000..e75f7b684 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot15.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml new file mode 100644 index 000000000..f41b226f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml new file mode 100644 index 000000000..feb267251 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot17.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml new file mode 100644 index 000000000..d70fccf4b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot18.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml new file mode 100644 index 000000000..1381f6ecb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/overworld/spot20.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml new file mode 100644 index 000000000..95548de1b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/alley_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml new file mode 100644 index 000000000..acb6515fb --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/drag.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml new file mode 100644 index 000000000..16a974608 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/face_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml new file mode 100644 index 000000000..c58672798 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/golon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml new file mode 100644 index 000000000..50cd633e5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/kokiri_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml new file mode 100644 index 000000000..5954d9c83 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/night_shop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml new file mode 100644 index 000000000..525a06d63 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/shop1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml new file mode 100644 index 000000000..0e4ac18f8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/scenes/shops/zoora.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml new file mode 100644 index 000000000..789a554ce --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_field.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml new file mode 100644 index 000000000..f784afcf4 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/text/elf_message_ydan.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml new file mode 100644 index 000000000..94948fa8e --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/text/message_data_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml new file mode 100644 index 000000000..c60ff57a8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/backgrounds.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml new file mode 100644 index 000000000..84f555bd1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/boss_title_cards.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml new file mode 100644 index 000000000..efabd54a5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/do_action_static.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml new file mode 100644 index 000000000..cdb8cc737 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_24_static.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml new file mode 100644 index 000000000..873c490fc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_dungeon_static.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml new file mode 100644 index 000000000..ed991406b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_field_static.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml new file mode 100644 index 000000000..ffd392868 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_gameover_static.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml new file mode 100644 index 000000000..f2fe854b8 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_jpn_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml new file mode 100644 index 000000000..6cd92acfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_nes_static.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml new file mode 100644 index 000000000..9e844615b --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/icon_item_static.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml new file mode 100644 index 000000000..266b3c200 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/item_name_static.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml new file mode 100644 index 000000000..5159387a1 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/kanji.xml @@ -0,0 +1,3984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml new file mode 100644 index 000000000..b2ea46340 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_48x85_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml new file mode 100644 index 000000000..201955bfc --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_grand_static.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml new file mode 100644 index 000000000..1721f6d84 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_i_static.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml new file mode 100644 index 000000000..ca4c4c0bd --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/map_name_static.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml new file mode 100644 index 000000000..afdde60de --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_static.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml new file mode 100644 index 000000000..bbf7e1259 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/message_texture_static.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml new file mode 100644 index 000000000..b01646cb5 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nes_font_static.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml new file mode 100644 index 000000000..f09de3b0f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/nintendo_rogo_static.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml new file mode 100644 index 000000000..c51dacf1f --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/parameter_static.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml new file mode 100644 index 000000000..b688cce00 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/place_title_cards.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml new file mode 100644 index 000000000..104ffb2a3 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/skyboxes.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml b/soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml new file mode 100644 index 000000000..5f58c5a82 --- /dev/null +++ b/soh/assets/xml/GC_NMQ_NTSC_U/textures/title_static.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/soh/Extractor/Extract.cpp b/soh/soh/Extractor/Extract.cpp index 4b4e31aa8..1d5305158 100644 --- a/soh/soh/Extractor/Extract.cpp +++ b/soh/soh/Extractor/Extract.cpp @@ -58,6 +58,11 @@ static constexpr uint32_t OOT_PAL_GC_DBG2 = 0x87121EFE; // 03-13-2002 build static constexpr uint32_t OOT_PAL_GC_MQ_DBG = 0x917D18F6; static constexpr uint32_t OOT_PAL_10 = 0xB044B569; static constexpr uint32_t OOT_PAL_11 = 0xB2055FBD; +static constexpr uint32_t OOT_NTSC_US_GC = 0xF3DD35BA; +static constexpr uint32_t OOT_NTSC_JP_GC = 0xF611F4BA; +static constexpr uint32_t OOT_NTSC_JP_GC_CE = 0xF7F52DB8; +static constexpr uint32_t OOT_NTSC_US_MQ = 0xF034001A; +static constexpr uint32_t OOT_NTSC_JP_MQ = 0xF43B45BA; static constexpr uint32_t OOT_NTSC_10 = 0xEC7011B7; static constexpr uint32_t OOT_NTSC_11 = 0xD43DA81F; static constexpr uint32_t OOT_NTSC_12 = 0x693BA2AE; @@ -70,13 +75,18 @@ static const std::unordered_map verMap = { { OOT_PAL_GC_MQ_DBG, "PAL MQ Debug" }, { OOT_PAL_10, "PAL N64 1.0" }, { OOT_PAL_11, "PAL N64 1.1" }, + { OOT_NTSC_US_GC, "NTSC Gamecube US" }, + { OOT_NTSC_JP_GC, "NTSC Gamecube JP" }, + { OOT_NTSC_JP_GC_CE, "NTSC Gamecube JP (Collector's Edition)" }, + { OOT_NTSC_US_GC, "NTSC MQ US" }, + { OOT_NTSC_JP_GC, "NTSC MQ JP" }, { OOT_NTSC_10, "NTSC N64 1.0" }, { OOT_NTSC_11, "NTSC N64 1.1" }, { OOT_NTSC_12, "NTSC N64 1.2" }, }; // TODO only check the first 54MB of the rom. -static constexpr std::array goodCrcs = { +static constexpr std::array goodCrcs = { 0xfa8c0555, // MQ DBG 64MB (Original overdump) 0x8652ac4c, // MQ DBG 64MB 0x5B8A1EB7, // MQ DBG 64MB (Empty overdump) @@ -93,6 +103,11 @@ static constexpr std::array goodCrcs = { 0xA25D1262, // N64 NTSC JP 1.1 0x15736A58, // N64 NTSC US 1.2 0x83B8967D, // N64 NTSC JP 1.2 + 0xD61453DE, // GC NTSC US + 0x4129C825, // GC MQ NTSC US + 0x11A4BE61, // GC NTSC JP + 0x2BC6C6FD, // GC NTSC JP Collector's Edition + 0x02CD974C, // GC MQ NTSC JP }; enum class ButtonId : int { @@ -519,10 +534,15 @@ bool Extractor::IsMasterQuest() const { switch (GetRomVerCrc()) { case OOT_PAL_MQ: case OOT_PAL_GC_MQ_DBG: + case OOT_NTSC_US_MQ: + case OOT_NTSC_JP_MQ: return true; case OOT_NTSC_10: case OOT_NTSC_11: case OOT_NTSC_12: + case OOT_NTSC_US_GC: + case OOT_NTSC_JP_GC: + case OOT_NTSC_JP_GC_CE: case OOT_PAL_10: case OOT_PAL_11: case OOT_PAL_GC: @@ -547,6 +567,16 @@ const char* Extractor::GetZapdVerStr() const { return "N64_PAL_10"; case OOT_PAL_11: return "N64_PAL_11"; + case OOT_NTSC_US_GC: + return "GC_NMQ_NTSC_U"; + case OOT_NTSC_JP_GC: + return "GC_NMQ_NTSC_J"; + case OOT_NTSC_JP_GC_CE: + return "GC_NMQ_NTSC_J_CE"; + case OOT_NTSC_US_MQ: + return "GC_MQ_NTSC_U"; + case OOT_NTSC_JP_MQ: + return "GC_MQ_NTSC_J"; case OOT_NTSC_10: return "N64_NTSC_10"; case OOT_NTSC_11: diff --git a/soh/soh/ResourceManagerHelpers.cpp b/soh/soh/ResourceManagerHelpers.cpp index 39a04e022..e2f9dbd61 100644 --- a/soh/soh/ResourceManagerHelpers.cpp +++ b/soh/soh/ResourceManagerHelpers.cpp @@ -35,6 +35,7 @@ extern "C" uint32_t ResourceMgr_GetGamePlatform(int index) { case OOT_PAL_11: return GAME_PLATFORM_N64; case OOT_NTSC_JP_GC: + case OOT_NTSC_JP_GC_CE: case OOT_NTSC_US_GC: case OOT_PAL_GC: case OOT_NTSC_JP_MQ: @@ -55,6 +56,7 @@ extern "C" uint32_t ResourceMgr_GetGameRegion(int index) { case OOT_NTSC_US_11: case OOT_NTSC_US_12: case OOT_NTSC_JP_GC: + case OOT_NTSC_JP_GC_CE: case OOT_NTSC_US_GC: case OOT_NTSC_JP_MQ: case OOT_NTSC_US_MQ: diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index e8d841a29..cad237336 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -26,6 +26,16 @@ const char* GetGameVersionString(uint32_t index) { return "NTSC 1.1"; case OOT_NTSC_US_12: return "NTSC 1.2"; + case OOT_NTSC_US_GC: + return "NTSC-U GC"; + case OOT_NTSC_JP_GC: + return "NTSC-J GC"; + case OOT_NTSC_JP_GC_CE: + return "NTSC-J GC (Collector's Edition)"; + case OOT_NTSC_US_MQ: + return "NTSC-U MQ"; + case OOT_NTSC_JP_MQ: + return "NTSC-J MQ"; case OOT_PAL_10: return "PAL 1.0"; case OOT_PAL_11: 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 9af8a6ca5..c2cca3aef 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 @@ -591,7 +591,11 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxP) { gDPPipeSync(gfx++); gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, (s16)this->subAlpha); - EnMag_DrawImageRGBA32(&gfx, 174, 145, (u8*)gTitleMasterQuestSubtitleTex, 128, 32); + if (gSaveContext.language == LANGUAGE_JPN || ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_MQ) { + EnMag_DrawImageRGBA32(&gfx, 235, 149, (u8*)gTitleUraLogoTex, 40, 40); + } else { + EnMag_DrawImageRGBA32(&gfx, 174, 145, (u8*)gTitleMasterQuestSubtitleTex, 128, 32); + } } } @@ -605,8 +609,14 @@ void EnMag_DrawInner(Actor* thisx, PlayState* play, Gfx** gfxP) { gDPSetRenderMode(gfx++, G_RM_PASS, G_RM_XLU_SURF2); } gDPSetCombineLERP(gfx++, TEXEL1, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); - gDPSetPrimColor(gfx++, 0, 0x80, 255, 255, 170, (s16)this->subAlpha); - gDPSetEnvColor(gfx++, 255, 150, 0, 255); + + if (!isMQ) { + gDPSetPrimColor(gfx++, 0, 0x80, 255, 255, 170, (s16)this->subAlpha); + gDPSetEnvColor(gfx++, 255, 150, 0, 255); + } else { + gDPSetPrimColor(gfx++, 0, 0x80, 170, 255, 255, (s16)this->subAlpha); + gDPSetEnvColor(gfx++, ZREG(34), 100 + ZREG(35), 255 + ZREG(36), 255); + } if ((s16)this->subAlpha != 0) { gDPLoadTextureBlock(gfx++, gTitleTitleJPNTex, G_IM_FMT_I, G_IM_SIZ_8b, 128, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); 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 0b7b2798d..74ae389a4 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 @@ -2448,7 +2448,25 @@ void FileChoose_DrawWindowContents(GameState* thisx) { FileChoose_DrawTextureI8(this->state.gfxCtx, gTitleTheLegendOfTextTex, 72, 8, 156, 108, 72, 8, 1024, 1024); FileChoose_DrawTextureI8(this->state.gfxCtx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 154, 163, 96, 8, 1024, 1024); FileChoose_DrawImageRGBA32(this->state.gfxCtx, 160, 135, gTitleZeldaShieldLogoMQTex, 160, 160); - FileChoose_DrawImageRGBA32(this->state.gfxCtx, 182, 180, gTitleMasterQuestSubtitleTex, 128, 32); + if (gSaveContext.language == LANGUAGE_JPN || ResourceMgr_GetGameVersion(0) == OOT_NTSC_JP_MQ) { + FileChoose_DrawImageRGBA32(this->state.gfxCtx, 243, 184, gTitleUraLogoTex, 40, 40); + gDPPipeSync(POLY_OPA_DISP++); + gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2); + gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 170, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, ZREG(34), 100 + ZREG(35), 255 + ZREG(36), 255); + + gDPLoadTextureBlock(POLY_OPA_DISP++, gTitleTitleJPNTex, G_IM_FMT_I, G_IM_SIZ_8b, 128, 16, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); + gDPLoadMultiBlock(POLY_OPA_DISP++, gTitleFlameEffectTex, 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, 1); + gDPSetTileSize(POLY_OPA_DISP++, 1, 0 & 0x7F, 0 & 0x7F, (0 & 0x7F) + ((32 - 1) << 2), (0 & 0x7F) + ((32 - 1) << 2)); + gSPTextureRectangle(POLY_OPA_DISP++, 114 << 2, 179 << 2, (114 + 128) << 2, (179 + 16) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + } else { + FileChoose_DrawImageRGBA32(this->state.gfxCtx, 182, 180, gTitleMasterQuestSubtitleTex, 128, 32); + } break; case QUEST_RANDOMIZER: From bcd8842bde248263e430a63f65b9e4c15cd5b1b4 Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 30 Mar 2025 18:16:44 -0400 Subject: [PATCH 174/267] Fix messages crashing when no ntsc game is loaded (#5259) * Fix messages crashing when no ntsc game is loaded * rename func --- soh/include/functions.h | 2 +- soh/src/code/z_kanfont.c | 20 +++++++++++++++---- soh/src/code/z_message_PAL.c | 38 +++++++++++++++++++----------------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index 5631b417a..86e3bf77f 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -901,7 +901,7 @@ s32 Jpeg_Decode(void* data, void* zbuffer, void* workBuff, u32 workSize); void KaleidoSetup_Update(PlayState* play); void KaleidoSetup_Init(PlayState* play); void KaleidoSetup_Destroy(PlayState* play); -void func_8006EE50(Font* font, u16 arg1, u16 arg2); +void Font_LoadCharWide(Font* font, u16 arg1, u16 arg2); void Font_LoadChar(Font* font, u8 character, u16 codePointIndex); void Font_LoadMessageBoxIcon(Font* font, u16 icon); void Font_LoadOrderedFont(Font* font); diff --git a/soh/src/code/z_kanfont.c b/soh/src/code/z_kanfont.c index 97ed4294c..5cd4e5510 100644 --- a/soh/src/code/z_kanfont.c +++ b/soh/src/code/z_kanfont.c @@ -7,6 +7,9 @@ #include "textures/kanji/kanji.h" #include "textures/message_static/message_static.h" +// SOH [NTSC] +extern MessageTableEntry* sJpnMessageEntryTablePtr; + // #region SOH [Port] Asset tables we can pull from instead of from ROM const char* fontTbl[140] = { @@ -4141,9 +4144,20 @@ const char* msgStaticTbl[] = }; // #endregion -void func_8006EE50(Font* font, u16 character, u16 codePointIndex) { - // #region SOH [NTSC] +/** + * Loads a texture from kanji for the requested `character` into the character texture buffer + * at `codePointIndex`. The value of `character` is the SHIFT-JIS encoding of the character. + */ +void Font_LoadCharWide(Font* font, u16 character, u16 codePointIndex) { // DmaMgr_RequestSync(&font->charTexBuf[codePointIndex], _kanjiSegmentStart + Kanji_OffsetFromShiftJIS(character), 0x80); + + // #region SOH [NTSC] + // This function is called even for non-nstc, but this function would be empty for non-ntsc. + // To simulate that, we check if the jpn message table is loaded and if not immediately return. + if (sJpnMessageEntryTablePtr == NULL) { + return; + } + s32 charIndex = Kanji_OffsetFromShiftJIS(character); charIndex /= FONT_CHAR_TEX_SIZE; if (charIndex < ARRAY_COUNT(kanjiFontTbl)) @@ -4213,8 +4227,6 @@ void Font_LoadOrderedFont(Font* font) { } // #region SOH [NTSC] -extern MessageTableEntry* sJpnMessageEntryTablePtr; - void Font_LoadOrderedFontNTSC(Font* font) { s32 len; s32 size; diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 317f317ca..33967e63b 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1995,17 +1995,17 @@ void Message_DecodeJPN(PlayState* play) { } for (i = 0; i < 4; i++) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; if (i == 1) { - func_8006EE50(font, 0x95AA, charTexIdx); + Font_LoadCharWide(font, 0x95AA, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = 0x95AA; decodedBufPos++; } else if (i == 3) { - func_8006EE50(font, 0x9562, charTexIdx); + Font_LoadCharWide(font, 0x9562, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = 0x9562; } @@ -2032,7 +2032,7 @@ void Message_DecodeJPN(PlayState* play) { loadChar = true; } if (loadChar) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; @@ -2058,7 +2058,7 @@ void Message_DecodeJPN(PlayState* play) { loadChar = true; } if (loadChar) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; @@ -2076,7 +2076,7 @@ void Message_DecodeJPN(PlayState* play) { for (i = 0; i < 2; i++) { if (i == 1 || digits[i] != 0) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; @@ -2118,7 +2118,7 @@ void Message_DecodeJPN(PlayState* play) { loadChar = true; } if (loadChar) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; @@ -2148,17 +2148,17 @@ void Message_DecodeJPN(PlayState* play) { } for (i = 0; i < 4; i++) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; if (i == 1) { - func_8006EE50(font, 0x95AA, charTexIdx); + Font_LoadCharWide(font, 0x95AA, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = 0x95AA; decodedBufPos++; } else if (i == 3) { - func_8006EE50(font, 0x9562, charTexIdx); + Font_LoadCharWide(font, 0x9562, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = 0x9562; } @@ -2182,17 +2182,17 @@ void Message_DecodeJPN(PlayState* play) { } for (i = 0; i < 4; i++) { - func_8006EE50(font, digits[i] + 0x824F, charTexIdx); + Font_LoadCharWide(font, digits[i] + 0x824F, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; if (i == 1) { - func_8006EE50(font, 0x8E9E, charTexIdx); + Font_LoadCharWide(font, 0x8E9E, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = 0x8E9E; decodedBufPos++; } else if (i == 3) { - func_8006EE50(font, 0x95AA, charTexIdx); + Font_LoadCharWide(font, 0x95AA, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; msgCtx->msgBufDecodedWide[decodedBufPos] = 0x95AA; } @@ -2231,7 +2231,7 @@ void Message_DecodeJPN(PlayState* play) { msgCtx->choiceNum = 3; R_TEXT_INIT_XPOS += 32; } else if (curChar != MESSAGE_SPACE_JPN) { - func_8006EE50(font, curChar, charTexIdx); + Font_LoadCharWide(font, curChar, charTexIdx); charTexIdx += FONT_CHAR_TEX_SIZE; } } @@ -3010,8 +3010,9 @@ void Message_StartOcarina(PlayState* play, u16 ocarinaActionId) { gSaveContext.unk_13EA = 0; Interface_ChangeAlpha(1); } - for (k = 0, j = 0; j < 48; j++, k += 0x80) { - func_8006EE50(&play->msgCtx.font, 0x8140, k); + for (k = 0, j = 0; j < 48; j++) { + Font_LoadCharWide(&play->msgCtx.font, 0x8140, k); + k += FONT_CHAR_TEX_SIZE; } } @@ -3326,8 +3327,9 @@ void Message_DrawMain(PlayState* play, Gfx** p) { break; case MSGMODE_TEXT_CONTINUING: if (msgCtx->stateTimer == 1) { - for (j = 0, i = 0; i < 48; i++, j += 0x80) { - func_8006EE50(&play->msgCtx.font, 0x8140, j); + for (j = 0, i = 0; i < 48; i++) { + Font_LoadCharWide(&play->msgCtx.font, 0x8140, j); + j += FONT_CHAR_TEX_SIZE; } if (gSaveContext.language == LANGUAGE_JPN && !sTextIsCredits && !sDisplayNextMessageAsEnglish) { Message_DrawTextJPN(play, &gfx); From 9355aca23ed9af50d5859a60cd862288f3b7e447 Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 30 Mar 2025 18:17:09 -0400 Subject: [PATCH 175/267] More prep for clang-format (#5239) --- soh/soh/Enhancements/ExtraTraps.cpp | 2 +- .../cosmetics/authenticGfxPatches.cpp | 15 +- soh/soh/Enhancements/debugconsole.cpp | 58 ++-- soh/soh/Enhancements/debugger/actorViewer.cpp | 2 +- soh/soh/Enhancements/enemyrandomizer.cpp | 2 +- soh/soh/Enhancements/enhancementTypes.h | 4 +- soh/soh/Enhancements/pausewarp.c | 8 +- .../Enhancements/randomizer/3drando/fill.cpp | 6 +- .../Enhancements/randomizer/3drando/shops.cpp | 294 +++++++++--------- .../randomizer/LockOverworldDoors.cpp | 3 + .../Enhancements/randomizer/ShuffleCows.cpp | 2 +- .../Enhancements/randomizer/hook_handlers.cpp | 5 +- .../Enhancements/randomizer/location_list.cpp | 3 +- .../randomizer/randomizer_check_tracker.cpp | 6 +- .../randomizer/randomizer_entrance.c | 8 +- .../randomizer/randomizer_item_tracker.cpp | 26 +- .../Enhancements/randomizer/static_data.cpp | 6 +- soh/soh/OTRGlobals.cpp | 2 +- soh/soh/SohGui/SohMenu.h | 30 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 2 +- soh/soh/SohGui/SohMenuSettings.cpp | 4 +- soh/src/code/z_kanfont.c | 2 +- .../overlays/gamestates/ovl_select/z_select.c | 84 +++-- 23 files changed, 311 insertions(+), 263 deletions(-) diff --git a/soh/soh/Enhancements/ExtraTraps.cpp b/soh/soh/Enhancements/ExtraTraps.cpp index 196fc63f4..3391903ab 100644 --- a/soh/soh/Enhancements/ExtraTraps.cpp +++ b/soh/soh/Enhancements/ExtraTraps.cpp @@ -45,7 +45,7 @@ const char* altTrapTypeCvars[] = { CVAR_ENHANCEMENT("ExtraTraps.Void"), CVAR_ENHANCEMENT("ExtraTraps.Ammo"), CVAR_ENHANCEMENT("ExtraTraps.Kill"), - CVAR_ENHANCEMENT("ExtraTraps.Teleport") + CVAR_ENHANCEMENT("ExtraTraps.Teleport"), }; std::vector getEnabledAddTraps () { diff --git a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp index 0738ff6da..85e569b33 100644 --- a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp +++ b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp @@ -27,39 +27,50 @@ static DListPatchInfo freezardBodyDListPatchInfos[] = { }; static DListPatchInfo ironKnuckleDListPatchInfos[] = { + // VambraceLeft { object_ik_DL_01BE98, 39 }, { object_ik_DL_01BE98, 59 }, + // ArmLeft { object_ik_DL_01C130, 38 }, + // VambraceRight { object_ik_DL_01C2B8, 39 }, { object_ik_DL_01C2B8, 59 }, + // ArmRight { object_ik_DL_01C550, 38 }, + // Waist { object_ik_DL_01C7B8, 8 }, { object_ik_DL_01C7B8, 28 }, + // PauldronLeft { object_ik_DL_01CB58, 8 }, { object_ik_DL_01CB58, 31 }, + // BootTipLeft { object_ik_DL_01CCA0, 15 }, { object_ik_DL_01CCA0, 37 }, { object_ik_DL_01CCA0, 52 }, { object_ik_DL_01CCA0, 68 }, + // WaistArmorLeft { object_ik_DL_01CEE0, 27 }, { object_ik_DL_01CEE0, 46 }, { object_ik_DL_01CEE0, 125 }, + // PauldronRight { object_ik_DL_01D2B0, 8 }, { object_ik_DL_01D2B0, 32 }, - + + // BootTipRight { object_ik_DL_01D3F8, 15 }, { object_ik_DL_01D3F8, 37 }, { object_ik_DL_01D3F8, 52 }, { object_ik_DL_01D3F8, 68 }, + // WaistArmorRight { object_ik_DL_01D638, 23 }, { object_ik_DL_01D638, 42 }, { object_ik_DL_01D638, 110 }, @@ -336,7 +347,7 @@ void PatchMirroredSunSongEtching() { // Only need to patch over the two SetTile commands to get the MIRROR effect Gfx mirroredSunSongTex[] = { gsDPLoadTextureBlock("", G_IM_FMT_IA, G_IM_SIZ_8b, 128, 32, 0, G_TX_MIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_CLAMP, 7, 5, G_TX_NOLOD, G_TX_NOLOD) + G_TX_NOMIRROR | G_TX_CLAMP, 7, 5, G_TX_NOLOD, G_TX_NOLOD), }; if (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) { diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 33eed43f9..1420ad287 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -219,7 +219,7 @@ const static std::map ammoItems{ { "sticks", ITEM_STICK }, { "nuts", ITEM_NUT }, { "bombs", ITEM_BOMB }, { "seeds", ITEM_SLINGSHOT }, { "arrows", ITEM_BOW }, { "bombchus", ITEM_BOMBCHU }, - { "beans", ITEM_BEAN } + { "beans", ITEM_BEAN }, }; static bool AddAmmoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { @@ -1418,17 +1418,17 @@ void DebugConsole_Init(void) { CMD_REGISTER("save_state", {SaveStateHandler, "Save a state."}); CMD_REGISTER("load_state", {LoadStateHandler, "Load a state."}); CMD_REGISTER("set_slot", {StateSlotSelectHandler, "Selects a SaveState slot", { - {"Slot number", Ship::ArgumentType::NUMBER,} + {"Slot number", Ship::ArgumentType::NUMBER}, }}); // Map & Location CMD_REGISTER("void", {VoidHandler, "Voids out of the current map."}); CMD_REGISTER("reload", {ReloadHandler, "Reloads the current map."}); CMD_REGISTER("fw", {FWHandler, "Spawns the player where Farore's Wind is set.", { - {"clear|warp|backup", Ship::ArgumentType::TEXT} + {"clear|warp|backup", Ship::ArgumentType::TEXT}, }}); CMD_REGISTER("entrance", {EntranceHandler, "Sends player to the entered entrance (hex)", { - {"entrance", Ship::ArgumentType::NUMBER} + {"entrance", Ship::ArgumentType::NUMBER}, }}); // Gameplay @@ -1437,11 +1437,11 @@ void DebugConsole_Init(void) { CMD_REGISTER("map", {LoadSceneHandler, "Load up kak?"}); CMD_REGISTER("rupee", {RupeeHandler, "Set your rupee counter.", { - {"amount", Ship::ArgumentType::NUMBER} + {"amount", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("bItem", {BHandler, "Set an item to the B button.", { - {"Item ID", Ship::ArgumentType::NUMBER} + {"Item ID", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("spawn", { ActorSpawnHandler, "Spawn an actor.", { { "actor name/id", Ship::ArgumentType::NUMBER }, // TODO there should be an actor_id arg type @@ -1451,50 +1451,50 @@ void DebugConsole_Init(void) { {"z", Ship::ArgumentType::NUMBER, true}, {"rx", Ship::ArgumentType::NUMBER, true}, {"ry", Ship::ArgumentType::NUMBER, true}, - {"rz", Ship::ArgumentType::NUMBER, true} + {"rz", Ship::ArgumentType::NUMBER, true}, }}); CMD_REGISTER("pos", {SetPosHandler, "Sets the position of the player.", { {"x", Ship::ArgumentType::NUMBER, true}, {"y", Ship::ArgumentType::NUMBER, true}, - {"z", Ship::ArgumentType::NUMBER, true} + {"z", Ship::ArgumentType::NUMBER, true}, }}); CMD_REGISTER("addammo", {AddAmmoHandler, "Adds ammo of an item.", { {"sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT}, - {"count", Ship::ArgumentType::NUMBER} + {"count", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("takeammo", {TakeAmmoHandler, "Removes ammo of an item.", { {"sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT}, - {"count", Ship::ArgumentType::NUMBER} + {"count", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("bottle", {BottleHandler, "Changes item in a bottle slot.", { {"item", Ship::ArgumentType::TEXT}, - {"slot", Ship::ArgumentType::NUMBER} + {"slot", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("give_item", {GiveItemHandler, "Gives an item to the player as if it was given from an actor", { {"vanilla|randomizer", Ship::ArgumentType::TEXT}, - {"giveItemID", Ship::ArgumentType::NUMBER} + {"giveItemID", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("item", {ItemHandler, "Sets item ID in arg 1 into slot arg 2. No boundary checks. Use with caution.", { {"slot", Ship::ArgumentType::NUMBER}, - {"item id", Ship::ArgumentType::NUMBER} + {"item id", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("invisible", {InvisibleHandler, "Activate Link's Elvish cloak, making him appear invisible.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("giant_link", {GiantLinkHandler, "Turn Link into a giant Lonky boi.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("minish_link", {MinishLinkHandler, "Turn Link into a minish boi.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("add_heart_container", @@ -1504,25 +1504,25 @@ void DebugConsole_Init(void) { {RemoveHeartContainerHandler, "Remove a heart from Link. The minimal amount of hearts is 3."}); CMD_REGISTER("gravity", {GravityHandler, "Set gravity level.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("no_ui", {NoUIHandler, "Disables the UI.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("freeze", {FreezeHandler, "Freezes Link in place"}); CMD_REGISTER("defense_modifier", {DefenseModifierHandler, "Sets the defense modifier.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("damage", {DamageHandler, "Deal damage to Link.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("heal", {HealHandler, "Heals Link.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("fill_magic", {FillMagicHandler, "Fills magic."}); @@ -1530,34 +1530,34 @@ void DebugConsole_Init(void) { CMD_REGISTER("empty_magic", {EmptyMagicHandler, "Empties magic."}); CMD_REGISTER("no_z", {NoZHandler, "Disables Z-button presses.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("ohko", {OneHitKOHandler, "Activates one hit KO. Any damage kills Link and he cannot gain health in this mode.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("pacifist", {PacifistHandler, "Activates pacifist mode. Prevents Link from using his weapon.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("paper_link", {PaperLinkHandler, "Link but made out of paper.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("rainstorm", {RainstormHandler, "Activates rainstorm."}); CMD_REGISTER("reverse_controls", {ReverseControlsHandler, "Reverses the controls.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("update_rupees", {UpdateRupeesHandler, "Adds rupees.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("speed_modifier", {SpeedModifierHandler, "Sets the speed modifier.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("boots", {BootsHandler, "Activates boots.", { @@ -1573,7 +1573,7 @@ void DebugConsole_Init(void) { }}); CMD_REGISTER("knockback", {KnockbackHandler, "Knocks Link back.", { - {"value", Ship::ArgumentType::NUMBER} + {"value", Ship::ArgumentType::NUMBER}, }}); CMD_REGISTER("electrocute", {ElectrocuteHandler, "Electrocutes Link."}); diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index 5d5b7a0d2..8be4fcc4d 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -57,7 +57,7 @@ std::array acMapping = { "Misc.", "Boss", "Door", - "Chest" + "Chest", }; using namespace UIWidgets; diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 0b73af41a..42bd8d042 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -159,7 +159,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_HINTNUTS, // Hint Deku Scrubs ACTOR_EN_WF, // Wolfos ACTOR_EN_SKB, // Stalchild - ACTOR_EN_CROW // Guay + ACTOR_EN_CROW, // Guay }; extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *posX, f32 *posY, f32 *posZ, int16_t *rotX, diff --git a/soh/soh/Enhancements/enhancementTypes.h b/soh/soh/Enhancements/enhancementTypes.h index a7745192a..ee3b26d2e 100644 --- a/soh/soh/Enhancements/enhancementTypes.h +++ b/soh/soh/Enhancements/enhancementTypes.h @@ -102,13 +102,13 @@ typedef enum { typedef enum { TIME_TRAVEL_DISABLED, TIME_TRAVEL_OOT, - TIME_TRAVEL_ANY + TIME_TRAVEL_ANY, } TimeTravelType; typedef enum { WATERFALL_ALWAYS, WATERFALL_ONCE, - WATERFALL_NEVER + WATERFALL_NEVER, } SleepingWaterfallType; #endif diff --git a/soh/soh/Enhancements/pausewarp.c b/soh/soh/Enhancements/pausewarp.c index c767a3412..4934f6050 100644 --- a/soh/soh/Enhancements/pausewarp.c +++ b/soh/soh/Enhancements/pausewarp.c @@ -10,7 +10,7 @@ static const int songMessageMap[] = { TEXT_WARP_SERENADE_OF_WATER, TEXT_WARP_REQUIEM_OF_SPIRIT, TEXT_WARP_NOCTURNE_OF_SHADOW, - TEXT_WARP_PRELUDE_OF_LIGHT + TEXT_WARP_PRELUDE_OF_LIGHT, }; static const int ocarinaSongMap[] = { @@ -19,7 +19,7 @@ static const int ocarinaSongMap[] = { OCARINA_SONG_SERENADE, OCARINA_SONG_REQUIEM, OCARINA_SONG_NOCTURNE, - OCARINA_SONG_PRELUDE + OCARINA_SONG_PRELUDE, }; static const int entranceIndexMap[] = { @@ -28,7 +28,7 @@ static const int entranceIndexMap[] = { ENTR_LAKE_HYLIA_WARP_PAD, // Serenade ENTR_DESERT_COLOSSUS_WARP_PAD, // Requiem ENTR_GRAVEYARD_WARP_PAD, // Nocturne - ENTR_TEMPLE_OF_TIME_WARP_PAD // Prelude + ENTR_TEMPLE_OF_TIME_WARP_PAD, // Prelude }; static const int songAudioMap[] = { @@ -37,7 +37,7 @@ static const int songAudioMap[] = { NA_BGM_OCA_SERENADE, NA_BGM_OCA_REQUIEM, NA_BGM_OCA_NOCTURNE, - NA_BGM_OCA_LIGHT + NA_BGM_OCA_LIGHT, }; static bool isWarpActive = false; diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 78f0dd3ca..56675d41d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -33,7 +33,7 @@ PriceSettingsStruct shopsanityPrices = {RSK_SHOPSANITY_PRICES, RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT, RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT, RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_AFFORDABLE}; + RSK_SHOPSANITY_PRICES_AFFORDABLE, }; PriceSettingsStruct scrubPrices = {RSK_SCRUBS_PRICES, RSK_SCRUBS_PRICES_FIXED_PRICE, @@ -44,7 +44,7 @@ PriceSettingsStruct scrubPrices = {RSK_SCRUBS_PRICES, RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT, RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT, RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_AFFORDABLE}; + RSK_SCRUBS_PRICES_AFFORDABLE, }; PriceSettingsStruct merchantPrices = {RSK_MERCHANT_PRICES, RSK_MERCHANT_PRICES_FIXED_PRICE, @@ -55,7 +55,7 @@ PriceSettingsStruct merchantPrices = {RSK_MERCHANT_PRICES, RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT, RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT, RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_AFFORDABLE}; + RSK_MERCHANT_PRICES_AFFORDABLE, }; static void RemoveStartingItemsFromPool() { for (RandomizerGet startingItem : StartingInventory) { diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 75120fa41..636f9ecd7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -151,7 +151,8 @@ static constexpr std::array ShopPriceProbability= { // Generate random number from 5 to wallet max int GetPriceFromMax(int max) { - return Random(1, max) * 5; // random range of 1 - wallet max / 5, where wallet max is the highest it goes as a multiple of 5 + // random range of 1 - wallet max / 5, where wallet max is the highest it goes as a multiple of 5 + return Random(1, max) * 5; } uint16_t GetPriceFromSettings(Rando::Location *loc, PriceSettingsStruct priceSettings) { @@ -165,8 +166,9 @@ uint16_t GetPriceFromSettings(Rando::Location *loc, PriceSettingsStruct priceSet double random = RandomDouble(); //Randomly generated probability value for (size_t i = 0; i < ShopPriceProbability.size(); i++) { if (random < ShopPriceProbability[i]) { - //The randomly generated value has surpassed the total probability up to this point, so this is the generated price - return i * 5; //i in range [0, 59], output in range [0, 295] in increments of 5 + // The randomly generated value has surpassed the total probability up to this point, so this is the generated price + // i in range [0, 59], output in range [0, 295] in increments of 5 + return i * 5; } } return 150; @@ -289,67 +291,67 @@ void InitTrickNames() { trickNameTable[RG_KOKIRI_SWORD] = { Text{"Korok Sword", "Épée Korok", "Espada Korok"}, Text{"Hero's Sword", "Épée du Héros", "Espada del héroe"}, - Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"} + Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}, }; trickNameTable[RG_MASTER_SWORD] = { Text{"Goddess Sword", "Épée de la déesse", "Espada Divina"}, Text{"Gilded Sword", "Excalibur", "Espada de los Sabios"}, - Text{"Magical Sword", "Lame dorée", "Fay"} + Text{"Magical Sword", "Lame dorée", "Fay"}, }; trickNameTable[RG_GIANTS_KNIFE] = { Text{"Medigoron's Sword", "l'Épée de Medigoron", "La espada de Medigoron"}, Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}, - Text{"Royal Claymore", "Claymore Royale", "Royal Claymore"} + Text{"Royal Claymore", "Claymore Royale", "Royal Claymore"}, }; trickNameTable[RG_BIGGORON_SWORD] = { Text{"Power Sword", "Épée de Puissance", "Espada de poder"}, Text{"Fierce Deity Sword", "Épée du dieu démon", "Espada de la Fiera Deidad"}, Text{"Tempered Sword", "Épée de Légende Nv.2", "Espada Maestra mejorada"}, - Text{"Biggoron's Knife", "Lame de Grogoron", "Daga de Biggoron"} + Text{"Biggoron's Knife", "Lame de Grogoron", "Daga de Biggoron"}, }; trickNameTable[RG_DEKU_SHIELD] = { Text{"Boko Shield", "Bouclier Boko", "Escudo Boko"}, Text{"Ordon Shield", "Bouclier de Toal", "Escudo de Ordon"}, - Text{"Wooden Shield", "Bouclier de Bois", "Escudo de madera"} + Text{"Wooden Shield", "Bouclier de Bois", "Escudo de madera"}, }; trickNameTable[RG_HYLIAN_SHIELD] = { Text{"Hyrule Shield", "Bouclier d'Hyrule", "Escudo Hylian"}, Text{"Goddess Shield", "Bouclier Sacré", "Escudo Divino"}, - Text{"Hero's Shield", "Bouclier du Héros", "Escudo del héroe"} + Text{"Hero's Shield", "Bouclier du Héros", "Escudo del héroe"}, }; trickNameTable[RG_MIRROR_SHIELD] = { Text{"Magic Mirror", "Miroir Magique", "Escudo mágico"}, Text{"Magical Shield", "Bouclier Magique", "Escudo arcano"}, - Text{"Mirror of Twilight", "Miroir des Ombres", "Espejo del Crepúsculo"} + Text{"Mirror of Twilight", "Miroir des Ombres", "Espejo del Crepúsculo"}, }; trickNameTable[RG_GORON_TUNIC] = { Text{"Gerudo Top", "Tunique Gerudo", "Pechera gerudo"}, Text{"Flamebreaker Armor", "Armure de Pierre", " Armadura ignífuga"}, - Text{"Red Mail", "Habits Rouges", "Ropas rojas"} + Text{"Red Mail", "Habits Rouges", "Ropas rojas"}, }; trickNameTable[RG_ZORA_TUNIC] = { Text{"Rito Tunic", "Tunique Rito", "Sayo rito"}, Text{"Mermaid Suit", "Costume de sirène", "Costume de sirène"}, Text{"Zora Armor", "Armure Zora", "Túnica Zora"}, - Text{"Blue Mail", "Habits Bleus", "Ropas azules"} + Text{"Blue Mail", "Habits Bleus", "Ropas azules"}, }; trickNameTable[RG_IRON_BOOTS] = { Text{"Iron Hoofs", "Patins de Plomb", "Botas férreas"}, Text{"Snow Boots", "Bottes de Neige", "Botas de nieve"}, Text{"Red Boots", "Bottes rouges", "Botas rojas"}, Text{"Zora Greaves", "Bottes Zora", "Zora Greaves"}, - Text{"Boots of Power", "Bottes de Puissance", "Botas de plomo"} + Text{"Boots of Power", "Bottes de Puissance", "Botas de plomo"}, }; trickNameTable[RG_HOVER_BOOTS] = { Text{"Hover Hoofs", "Patins des airs", "Botas flotadoras"}, Text{"Golden Boots", "Bottes dorées", "Botas de Oro"}, Text{"Pegasus Boots", "Bottes pégase", "Botas de Pegaso"}, - Text{"Boots of Speed", "Bottes de vitesse", "Botas del desierto"} + Text{"Boots of Speed", "Bottes de vitesse", "Botas del desierto"}, }; trickNameTable[RG_WEIRD_EGG] = { Text{"Poached Egg", "Oeuf à la coque", "Huevo pasado"}, Text{"Lon Lon Egg", "Oeuf Lon Lon", "Huevo Lon Lon"}, - Text{"Zora Egg", "Oeuf Zora", "Huevo Zora"} + Text{"Zora Egg", "Oeuf Zora", "Huevo Zora"}, }; trickNameTable[RG_ZELDAS_LETTER] = { Text{"Ruto's Letter", "Lettre de Ruto", "Carta de Ruto"}, @@ -357,109 +359,109 @@ void InitTrickNames() { Text{"Zelda's Business Card", "Carte d'affaires de Zelda", "Carta"}, Text{"Letter to Kafei", "Lettre pour Kafei", "Carta para Kafei "}, Text{"Goat's Letter", "Lettre de la Chèvre", "Carta de la Cabra"}, - Text{"Maggie's Letter", "Lettre de Maggy", "Carta de Dolores"} + Text{"Maggie's Letter", "Lettre de Maggy", "Carta de Dolores"}, }; trickNameTable[RG_BOOMERANG] = { Text{"Banana", "Banane", "Plátano"}, Text{"Prank Fetch Toy", "Inséparable Bâtonnet", "Bumerang"}, Text{"Gale Boomerang", "Boomerang Tornade", "Bumerán tornado"}, - Text{"Magic Boomerang", "Boomerang Magique", "Bumerán mágico"} + Text{"Magic Boomerang", "Boomerang Magique", "Bumerán mágico"}, }; trickNameTable[RG_LENS_OF_TRUTH] = { Text{"Sheikah-leidoscope", "Sheikah-léidoscope", "Monóculo de la Verdad"}, Text{"Sheikah Sensor", "Sonar Sheikah", "Sensor Sheikah"}, Text{"Crystal of Vision", "Cristal de Vision", "Cristal de Visión"}, - Text{"Magnifying Lens", "Loupe", "Lente Aumentadora"} + Text{"Magnifying Lens", "Loupe", "Lente Aumentadora"}, }; trickNameTable[RG_MEGATON_HAMMER] = { Text{"Goron Gavel", "Masse Perforatrice", "Mazo Goron"}, Text{"Magic Hammer", "Marteau Magique", "Martillo mágico"}, - Text{"Skull Hammer", "Maillet Ressort", "Martillo de hierro"} + Text{"Skull Hammer", "Maillet Ressort", "Martillo de hierro"}, }; trickNameTable[RG_STONE_OF_AGONY] = { Text{"Cave Charm", "Charme de grotte", "Amuleto de la cueva"}, Text{"Stone of Agahnim", "Fragment d'Agahnim", "Piedra de Agahnim"}, Text{"Shard of Agony", "Fragment de Souffrance", "Piedra de la Agonía"}, - Text{"Pirate's Charm", "Pierre de Pirate", "Amuleto Pirata"} + Text{"Pirate's Charm", "Pierre de Pirate", "Amuleto Pirata"}, }; trickNameTable[RG_DINS_FIRE] = { Text{"Eldin's Fire", "Feu d'Eldin", "Fuego de Eldin"}, Text{"Din's Blaze", "Flamme de Din", "Poder de Din"}, Text{"Magic Lantern", "Lanterne Magique", "Linterna mágica"}, Text{"Ether Medallion", "Médaillon d'Éther", "Medallón de Tesoro"}, - Text{"Bombos Medallion", "Médaillon des Flammes", "Medallón del Temblor"} + Text{"Bombos Medallion", "Médaillon des Flammes", "Medallón del Temblor"}, }; trickNameTable[RG_FARORES_WIND] = { Text{"Faron's Wind", "Vent de Firone", "Viento de Farone"}, Text{"Farore's Windfall", "Zéphyr de Farore", "Valor de Farore"}, Text{"Tingle Air", "Tingle Air", "Tingle de aire"}, Text{"Travel Medallion", "Amulette de téléportation", "Medallón Maligno"}, - Text{"Irene's Taxi", "Le taxi d'Aëline", "El taxi de Airín"} + Text{"Irene's Taxi", "Le taxi d'Aëline", "El taxi de Airín"}, }; trickNameTable[RG_NAYRUS_LOVE] = { Text{"Lanayru's Love", "Amour de Lanelle", "Amor de Lanayru"}, Text{"Nayru's Passion", "Passion de Nayru", "Sabiduría de Nayru"}, Text{"Tingle Shield", "Bouclier Tingle", "Escudo de hormigueo"}, Text{"Shield Spell", "Bouclier Magique", "Hechizo de Protección"}, - Text{"Magic Armor", "Armure Magique", "Armadura mágica"} + Text{"Magic Armor", "Armure Magique", "Armadura mágica"}, }; trickNameTable[RG_FIRE_ARROWS] = { Text{"Fire Rod", "Baguette de feu", "Cetro de fuego"}, Text{"Bomb Arrow", "Flèche-Bombe", "Flecha bomba"}, - Text{"Red Candle", "Bougie Rouge", "Vela roja"} + Text{"Red Candle", "Bougie Rouge", "Vela roja"}, }; trickNameTable[RG_ICE_ARROWS] = { Text{"Ice Rod", "Baguette des Glaces", "Cetro de Hielo"}, Text{"Ancient Arrow", "Flèche Archéonique", "Flecha ancestral"}, - Text{"Ice Trap Arrow", "Flèche de Piège de Glace", "Cetro de hielo"} + Text{"Ice Trap Arrow", "Flèche de Piège de Glace", "Cetro de hielo"}, }; trickNameTable[RG_LIGHT_ARROWS] = { Text{"Wind Arrow", "Flèche de Vent", "Flecha del Viento"}, Text{"Wand of Gamelon", "Baguette de Gamelon", "Varita de Gamelón"}, Text{"Shock Arrow", "Flèches Électriques", "Flecha eléctrica"}, - Text{"Silver Arrow", "Flèches d'Argent", "Flecha de plata"} + Text{"Silver Arrow", "Flèches d'Argent", "Flecha de plata"}, }; trickNameTable[RG_GERUDO_MEMBERSHIP_CARD] = { Text{"Desert Title Deed", "Abonnement Gerudo", "Escritura del desierto"}, Text{"Sickle Moon Flag", "Drapeau du croissant de lune", "Bandera de la Luna Creciente"}, Text{"Complimentary ID", "Bon de félicitation", "Cupón especial"}, Text{"Gerudo's Card", "Carte Goron", "Tóken Gerudo"}, - Text{"Gerudo's Membership Card", "Autographe de Nabooru", "Tarjeta Gerudo"} + Text{"Gerudo's Membership Card", "Autographe de Nabooru", "Tarjeta Gerudo"}, }; trickNameTable[RG_MAGIC_BEAN_PACK] = { Text{"Funky Bean Pack", "Paquet de Fèves Magiques", "Lote de frijoles mágicos"}, Text{"Grapple Berries", "Baies de grappin", "Bayas de garfio"}, Text{"Crenel Bean Pack", "Paquet de Haricots Gonggle", "Lote de alubias mágicas"}, - Text{"Mystical Seed Pack", "Pack de graines mystiques", "Paquete de semillas místicas"} + Text{"Mystical Seed Pack", "Pack de graines mystiques", "Paquete de semillas místicas"}, }; trickNameTable[RG_DOUBLE_DEFENSE] = { Text{"Diamond Hearts", "Coeurs de Diamant", "Contenedor de diamante"}, Text{"Double Damage", "Double Souffrance", "Doble daño receptivo"}, - Text{"Quadruple Defence", "Quadruple Défence", "Defensa cuádruple"} + Text{"Quadruple Defence", "Quadruple Défence", "Defensa cuádruple"}, }; trickNameTable[RG_POCKET_EGG] = { Text{"Arpagos Egg", "Oeuf d'Arpagos", "Huevo de Arpagos"}, Text{"Lon Lon Egg", "oeuf Lon Lon", "Huevo Lon Lon"}, - Text{"Zora Egg", "oeuf Zora", "Huevo del Pez Viento"} + Text{"Zora Egg", "oeuf Zora", "Huevo del Pez Viento"}, }; trickNameTable[RG_POCKET_EGG] = { Text{"D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Alarma emplumada portátil"}, Text{"Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko"}, - Text{"Hatched Cucco", "Cocotte éclose", "Pollo de bolsillo"} + Text{"Hatched Cucco", "Cocotte éclose", "Pollo de bolsillo"}, }; trickNameTable[RG_COJIRO] = { Text{"Blucco", "Chair-Qui-Poule", "Cucazul"}, Text{"Piyoko", "Piyoko", "Piyoko"}, Text{"Dark Cucco", "Cocotte Sombre", "Cucco oscuro"}, - Text{"Grog's Cucco", "Cocotte de Grog", "Cuco de Grog"} + Text{"Grog's Cucco", "Cocotte de Grog", "Cuco de Grog"}, }; trickNameTable[RG_ODD_MUSHROOM] = { Text{"Magic Mushroom", "Champignon magique", "Champiñón mágico"}, Text{"Endura Shroom", "Champi Vigueur", "Champiñón del bosque"}, Text{"Sleepy Toadstool", "Crapaud Fatigué", "Seta durmiente"}, - Text{"Mushroom", "Champignon", "Seta"} + Text{"Mushroom", "Champignon", "Seta"}, }; trickNameTable[RG_ODD_POTION] = { Text{"Odd Medicine", "Élixir suspect", "Poción rara"}, @@ -467,21 +469,21 @@ void InitTrickNames() { Text{"Mushroom Poultice", "Mixture de champignon", "Medicina de champiñones"}, Text{"Secret Medicine", "Médicament", "Pócima secreta"}, Text{"Mushroom Spores", "Spores de Champignons", "Esporas de hongos"}, - Text{"Hanyu Spore", "Hanyu Spore", "Espora Hanyu"} + Text{"Hanyu Spore", "Hanyu Spore", "Espora Hanyu"}, }; trickNameTable[RG_POACHERS_SAW] = { Text{"Carpenter's Saw", "Scie du charpentier", "Sierra del carpintero"}, Text{"Poacher's Sword", "Hache du chasseur", "Espada del capataz"}, Text{"Ancient Bladesaw", "Longue Épée Archéonique", "Mandoble ancestral"}, Text{"Woodcutter's Axe", "Hache du Bûcheron", "Hacha de leñador"}, - Text{"Grog's Saw", "Scie de Grog", "Sierra del Cazador Furtivo"} + Text{"Grog's Saw", "Scie de Grog", "Sierra del Cazador Furtivo"}, }; trickNameTable[RG_BROKEN_SWORD] = { Text{"Broken Biggoron's Sword", "Épée brisée de Grogoron", "Espada de Biggoron rota"}, Text{"Broken Giant's Knife", "Lame des Géants brisée", "Daga gigante rota"}, Text{"Broken Noble Sword", "Épée noble brisée", "Espada noble rota"}, Text{"Broken Picori Blade", "Épée Minish brisée", "Espada minish rota"}, - Text{"Decayed Master Sword", "Épée de légende pourrie", "Espada decadente de leyenda"} + Text{"Decayed Master Sword", "Épée de légende pourrie", "Espada decadente de leyenda"}, }; trickNameTable[RG_PRESCRIPTION] = { Text{"Biggoron's Prescription", "Ordonnance de Grogoron", "Receta de Biggoron"}, @@ -489,26 +491,26 @@ void InitTrickNames() { Text{"Urgent Prescription", "Ordonnance urgente", "Prescripción"}, Text{"Swordsman's Scroll", "Précis d'escrime", "Esgrimidorium"}, Text{"Portrait of Oren", "Portrait d'Orlène", "Retrato de Oren"}, - Text{"Letter to King Zora", "Lettre au roi Zora", "Carta al Rey Zora"} + Text{"Letter to King Zora", "Lettre au roi Zora", "Carta al Rey Zora"}, }; trickNameTable[RG_EYEBALL_FROG] = { Text{"Don Gero", "Don Gero", "Don Gero"}, Text{"Hot-Footed Frog", "Grenouille à pieds chauds", "Rana de patas calientes"}, Text{"Lost Swordsmith", "Forgeron perdu", "Espadachín perdido"}, - Text{"Eyedrop Frog", "Grenouille-qui-louche", "Globo Ocular de Rana"} + Text{"Eyedrop Frog", "Grenouille-qui-louche", "Globo Ocular de Rana"}, }; trickNameTable[RG_EYEDROPS] = { Text{"Biggoron's Eyedrops", "Gouttes de Grogoron", "Gotas de Biggoron"}, Text{"Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Gotas oculares"}, Text{"Moon's Tear", "Larme de Lune", "Lágrima de Luna"}, Text{"Engine Grease", "Graisse moteur", "Grasa del motor"}, - Text{"Zora Perfume", "Parfum Zora", "Perfume Zora"} + Text{"Zora Perfume", "Parfum Zora", "Perfume Zora"}, }; trickNameTable[RG_CLAIM_CHECK] = { Text{"Clay Check", "Certificat Grogoron", "Comprobante de Reclamación"}, Text{"Ancient Tablet", "Stèle ancienne", "Litografía arcana"}, Text{"Sheikah Slate", "Tablette Sheikah", "Piedra Sheikah"}, - Text{"Cyclone Slate", "Ardoise des tornades", "Pizarra de los Torbellinos"} + Text{"Cyclone Slate", "Ardoise des tornades", "Pizarra de los Torbellinos"}, }; trickNameTable[RG_GOLD_SKULLTULA_TOKEN] = { @@ -517,19 +519,19 @@ void InitTrickNames() { Text{"Gold Walltula Token", "Jeton de Walltula dorée", "Skulltula dorada"}, Text{"Maiamai", "Ti'gorneau", "Maimai"}, Text{"Gratitude Crystal", "Cristal de gratitude", "Gema de gratitud"}, - Text{"Korok Seed", "Noix korogu", "Semilla de kolog"} + Text{"Korok Seed", "Noix korogu", "Semilla de kolog"}, }; trickNameTable[RG_PROGRESSIVE_HOOKSHOT] = { Text{"Progressive Grappling Hook", "Lance-chaîne (prog.)", "Garra progresiva"}, Text{"Progressive Clawshot", "Grappin-griffe (prog.)", "Zarpa progresiva"}, Text{"Progressive Gripshot", "Grappince (prog.)", "Enganchador progresivo"}, - Text{"Progressive Rope", "Corde (prog.)", "Cuerda progresivo"} + Text{"Progressive Rope", "Corde (prog.)", "Cuerda progresivo"}, }; trickNameTable[RG_PROGRESSIVE_STRENGTH] = { Text{"Power Glove", "Gant de Puissance (prog.)", "Guanteletes progresivos"}, Text{"Power Bracelet", "Bracelet de Force (prog.)", "Brasaletes progresivos"}, - Text{"Magic Bracelet", "Bracelet Magique (prog.)", "Manoplas progresivas"} + Text{"Magic Bracelet", "Bracelet Magique (prog.)", "Manoplas progresivas"}, }; trickNameTable[RG_PROGRESSIVE_BOMB_BAG] = { Text{"Progressive Bomb Capacity", "Capacité de bombes (prog.)", "Mayor capacidad de bombas"}, @@ -537,7 +539,7 @@ void InitTrickNames() { Text{"Progressive Bomb Box", "Boîte à bombes (prog.)", "Bolsa de bombas progresiva"}, Text{"Progressive Blast Mask", "Masque d'Explosion (prog.)", "Máscara explosiva progresiva"}, Text{"Progressive Powder Kegs", "Baril de Poudre (prog.)", "Barril de polvo progresivo"}, - Text{"Progressive Remote Bombs", "Bombes à distance (prog.)", "Bombas remotas progresivas"} + Text{"Progressive Remote Bombs", "Bombes à distance (prog.)", "Bombas remotas progresivas"}, }; trickNameTable[RG_PROGRESSIVE_BOW] = { Text{"Progressive Arrow Capacity", "Capacité de flèches (prog.)", "Mayor capacidad de flechas"}, @@ -545,14 +547,14 @@ void InitTrickNames() { Text{"Progressive Arrow Holder", "Arbalète (prog.)", "Ballesta progresiva"}, Text{"Progressive Crossbow", "Arbalète (prog.)", "Ballesta progresiva"}, Text{"Progressive Sacred Bow", "Arc sacré (prog)", "Arco Sagrado Progresivo"}, - Text{"Progressive Lynel Bow", "Arc de Lynel (prog.)", "Arco de centaleón Progresivo"} + Text{"Progressive Lynel Bow", "Arc de Lynel (prog.)", "Arco de centaleón Progresivo"}, }; trickNameTable[RG_PROGRESSIVE_SLINGSHOT] = { Text{"Progressive Seed Capacity", "Capacité de graines (prog.)", "Mayor capacidad de semillas"}, Text{"Progressive Catapult", "Catapulte (prog.)", "Catapulta progresiva"}, Text{"Progressive Scattershot", "Lance-Pierre rafale (prog.)", "Resortera múltiple progresiva"}, Text{"Progressive Seed Launcher", "Lanceur de semences (prog.)", "Lanzador de semillas progresivo"}, - Text{"Progressive Seed Satchel", "Sac de graines (prog.)", "Bolsa de semillas progresiva"} + Text{"Progressive Seed Satchel", "Sac de graines (prog.)", "Bolsa de semillas progresiva"}, }; trickNameTable[RG_PROGRESSIVE_WALLET] = { Text{"Progressive Rupee Capacity", "Capacité de rubis (prog.)", "Mayor capacidad de rupias"}, @@ -560,45 +562,45 @@ void InitTrickNames() { Text{"Progressive Rupee Bag", "Sac à rubis (prog.)", "Zurrón de rupias progresivo"}, Text{"Progressive Rupoor Capacity", "Capacité de Roupir (prog.)", "Capacidad progresiva Rupobre"}, Text{"Progressive Spoils Bag", "Sac à Butin (prog.)", "Bolsa de trofeos progresiva"}, - Text{"Progressive Ruby Bag", "Capacité du sac Ruby (prog.)", "Bolso Ruby progresivo"} + Text{"Progressive Ruby Bag", "Capacité du sac Ruby (prog.)", "Bolso Ruby progresivo"}, }; trickNameTable[RG_PROGRESSIVE_SCALE] = { Text{"Progressive Flippers", "Palmes de Zora (prog.)", "Aletas de zora progresiva"}, Text{"Progressive Dragon's Scale", "Écaille du dragon d'eau (prog.)", "Escama dragón acuático progresiva"}, Text{"Progressive Diving Ability", "Plongée (prog.)", "Buceo progresivo"}, Text{"Progressive Pearl", "Perle (prog.)", "Perla progresiva"}, - Text{"Progressive Scute", "Bulle (prog.)", "Fragmento Zora progresivo"} + Text{"Progressive Scute", "Bulle (prog.)", "Fragmento Zora progresivo"}, }; trickNameTable[RG_PROGRESSIVE_NUT_UPGRADE] = { Text{"Progressive Nut Pack", "Paquet de noix (prog.)", "Mayor capacidad de semillas"}, Text{"Progressive Bait Bag", "Sac à Appâts (prog.)", "Bolsa de cebo progresiva"}, Text{"Progressive Pear Capacity", "Capacité de poire (prog.)", "Capacidad progresiva de pera"}, Text{"Progressive Nut Bag", "Sac de noix (prog.)", "Bolsa de nueces progresiva"}, - Text{"Progressive Husk Capacity", "Capacité de noisettes (prog.)", "Mayor capacidad de castañas"} + Text{"Progressive Husk Capacity", "Capacité de noisettes (prog.)", "Mayor capacidad de castañas"}, }; trickNameTable[RG_PROGRESSIVE_STICK_UPGRADE] = { Text{"Progressive Stick Bag", "Sac de bâtons (prog.)", "Mayor capacidad de ramas deku"}, Text{"Progressive Stick Pack", "Paquet de bâtons Mojo (prog.)", "Mayor capacidad de bastones"}, Text{"Progressive Branch Capacity", "Capacité de la succursale (prog.)", "Capacidad progresiva de la sucursal"}, - Text{"Progressive Rod Capacity", "Capacité de tiges (prog.)", "Mayor capacidad de cetros deku"} + Text{"Progressive Rod Capacity", "Capacité de tiges (prog.)", "Mayor capacidad de cetros deku"}, }; trickNameTable[RG_PROGRESSIVE_BOMBCHUS] = { Text{"Progressive Bomblings", "Bombinsectes (prog.)", "Bombinsectos progresivos"}, Text{"Progressive Sentrobe Bombs", "Bombe de Sphérodrone (prog.)", "Bomba de helicobot progresivo"}, Text{"Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Soldado bomba progresivo"}, Text{"Progressive Missiles", "Missiles (prog.)", "Misiles progresivos"}, - Text{"Progressive Bombchu Bag", "Sac à Bombchu (prog.)", "Bombachus progresivos"} + Text{"Progressive Bombchu Bag", "Sac à Bombchu (prog.)", "Bombachus progresivos"}, }; trickNameTable[RG_PROGRESSIVE_MAGIC_METER] = { Text{"Progressive Stamina Meter", "Jauge d'endurance (prog.)", "Medidor de vigor progresivo"}, Text{"Progressive Energy Gauge", "Jauge d'énergie (prog.)", "Medidor de energía progresivo"}, - Text{"Progressive Magic Powder", "Poudre magique (prog.)", "Medidor de carga progresivo"} + Text{"Progressive Magic Powder", "Poudre magique (prog.)", "Medidor de carga progresivo"}, }; trickNameTable[RG_PROGRESSIVE_OCARINA] = { Text{"Progressive Memento", "Souvenir (prog.)", "Silbato progresivo"}, Text{"Progressive Whistle", "Siffler (prog.)", "Silbido progresivo"}, Text{"Progressive Flute", "Flûte (prog.)", "Flauta progresiva"}, - Text{"Progressive Recorder", "Harmonica (prog.)", "Armónica progresiva"} + Text{"Progressive Recorder", "Harmonica (prog.)", "Armónica progresiva"}, }; trickNameTable[RG_PROGRESSIVE_GORONSWORD] = { Text{"Progressive Titan Blade", "Lame des Titans (prog.)", "Hoja del Titán progresiva"}, @@ -606,7 +608,7 @@ void InitTrickNames() { Text{"Progressive Giant Sword", "Épée géante (prog.)", "Espada gigante progresiva"}, Text{"Progressive Darknut Sword", "Épée de Darknut (prog.)", "Espada Darknut progresiva"}, Text{"Progressive Power Sword", "Épée de Puissance (prog.)", "Espada de poder progresiva"}, - Text{"Progressive Big Stabby", "Gros coup de poignard (prog.)", "Gran puñalada progresiva"} + Text{"Progressive Big Stabby", "Gros coup de poignard (prog.)", "Gran puñalada progresiva"}, }; trickNameTable[RG_EMPTY_BOTTLE] = { @@ -615,7 +617,7 @@ void InitTrickNames() { Text{"Tingle Bottle", "Flacon de Tingle", "Botella de Tingle"}, Text{"Magic Bottle", "Flacon magique", "Frasco feérico"}, Text{"Glass Bottle", "Flacon de verre", "Botella de cristal"}, - Text{"Bottle with Water", "Flacon d'eau", "Botella Tingle"} + Text{"Bottle with Water", "Flacon d'eau", "Botella Tingle"}, }; trickNameTable[RG_BOTTLE_WITH_MILK] = { Text{"Bottle with Chateau Romani", "Flacon de cuvée Romani", "Botella de Reserva Romani"}, @@ -626,121 +628,121 @@ void InitTrickNames() { Text{"Bottle with Red Chu Jelly", "Flacon de gelée Chuchu rouge", "Jugo de Chuchu Rojo"}, Text{"Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", "Botella de poción de Hibisco"}, Text{"Bottle with Medicine of Life", "Flacon d'élixir rouge", "Botella de medicina de la vida"}, - Text{"Bottle with Heart Potion", "Flacon de potion de soin", "Botella de poción de salud"} + Text{"Bottle with Heart Potion", "Flacon de potion de soin", "Botella de poción de salud"}, }; trickNameTable[RG_BOTTLE_WITH_GREEN_POTION] = { Text{"Bottle with Green Chu Jelly", "Flacon de gelée Chuchu verte", "Jugo de Chuchu Verde"}, Text{"Bottle with Lamp Oil", "Flacon de Huile à lanterne", "Botella de Aceite de candil "}, Text{"Bottle with Medicine of Magic", "Flacon d'élixir vert", "Botella de medicina mágica"}, - Text{"Bottle with Stamina Potion", "Flacon d'Endurol", "Botella de elixir vigorizante"} + Text{"Bottle with Stamina Potion", "Flacon d'Endurol", "Botella de elixir vigorizante"}, }; trickNameTable[RG_BOTTLE_WITH_BLUE_POTION] = { Text{"Bottle with Blue Chu Jelly", "Flacon de gelée Chuchu bleue", "Jugo de Chuchu Azul"}, Text{"Bottle with Water of Life", "Flacon d'élixir bleu", "Botella de agua de la vida"}, - Text{"Bottle with Air Potion", "Flacon de potion d'oxygène", "Botella de oxígeno"} + Text{"Bottle with Air Potion", "Flacon de potion d'oxygène", "Botella de oxígeno"}, }; trickNameTable[RG_BOTTLE_WITH_FAIRY] = { Text{"Bottle with Forest Firefly", "Flacon avec une luciole", "Luciérnaga del bosque"}, Text{"Bottle with Deku Princess", "Flacon avec Deku Princess", "Botella con Deku Princess"}, - Text{"Bottle with Stray Fairy", "Flacon avec une fée perdue", "Hada perdida en una botella"} + Text{"Bottle with Stray Fairy", "Flacon avec une fée perdue", "Hada perdida en una botella"}, }; trickNameTable[RG_BOTTLE_WITH_FISH] = { Text{"Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", "Lord Chapu-Chapu embotellado"}, Text{"Bottle with Reekfish", "Flacon avec Reekfish", "Reekfish embotellada"}, Text{"Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", "Locha de Hyrule embotellada"}, - Text{"Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", "Perca de Términa embotellada"} + Text{"Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", "Perca de Términa embotellada"}, }; trickNameTable[RG_BOTTLE_WITH_BLUE_FIRE] = { Text{"Bottle with Will-O-Wisp", "Flacon avec feu follet", "Botella de llama azul"}, Text{"Bottle with Ancient Flame", "Flacon de flamme ancienne", "Botella de fuego ancestral"}, Text{"Bottle with a Blue Candle", "Flacon avec une bougie bleue", "Botella con una vela azul"}, Text{"Bottle with Red Ice", "Flacon de Glace Rouge", "Botella de Hielo rojo"}, - Text{"Bottle with Nayru's Flame", "Flacon de flamme de Nayru", "Botella de llamas de Nayru"} + Text{"Bottle with Nayru's Flame", "Flacon de flamme de Nayru", "Botella de llamas de Nayru"}, }; trickNameTable[RG_BOTTLE_WITH_BUGS] = { Text{"Bottle with Baby Tektites", "Flacon de bébé Araknon", "Tektites en una botella"}, Text{"Bottle with A Beetle", "Flacon avec un scarabée", "Botella con un escarabajo"}, Text{"Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", "Celestarabajo embotellado"}, Text{"Bottle with Insects", "Flacon de bibittes", "Saltabosques embotellados"}, - Text{"Bottle with a Golden Bee", "Flacon avec une abeille dorée", "Botella con una abeja dorada"} + Text{"Bottle with a Golden Bee", "Flacon avec une abeille dorée", "Botella con una abeja dorada"}, }; trickNameTable[RG_BOTTLE_WITH_POE] = { Text{"Bottle with Ghini", "Flacon avec Ghini", "Ghini en una botella"}, Text{"Bottle with Reapling", "Flacon avec Âme Damnée", "Reapling en una botella"}, Text{"Bottle with Imp Poe", "Flacon avec Spectre", "Espectro en una botella"}, - Text{"Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Whisp en una botella"} + Text{"Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Whisp en una botella"}, }; trickNameTable[RG_RUTOS_LETTER] = { Text{"Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", "Carta de Dolores"}, Text{"Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", "Carta para Kafei"}, - Text{"Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", "Carta náutica"} + Text{"Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", "Carta náutica"}, }; trickNameTable[RG_BOTTLE_WITH_BIG_POE] = { Text{"Bottle with Composer Brother", "Flacon avec un compositeur", "Hermana Poe embotellada"}, Text{"Bottle with Jalhalla", "Flacon avec Jalhalla", "Yaihalla embotellado"}, - Text{"Bottle with Grim Repoe", "Flacon avec le Faucheur", "Bubble en una botella"} + Text{"Bottle with Grim Repoe", "Flacon avec le Faucheur", "Bubble en una botella"}, }; trickNameTable[RG_ZELDAS_LULLABY] = { Text{"Ballad of the Goddess", "Chant de la déesse", "Cántico de la Diosa"}, Text{"Song of Healing", "Chant de l'apaisement", "Canción de curación"}, - Text{"Song of the Hero", "Chant du héros", "Canción del héroe"} + Text{"Song of the Hero", "Chant du héros", "Canción del héroe"}, }; trickNameTable[RG_EPONAS_SONG] = { Text{"Song of Birds","Chant des oiseaux","Cantar del ave"}, Text{"Song of Soaring", "Chant de l'envol", "Canción del viento"}, - Text{"Song of Horse", "Chant du cheval", "Chant du cheval"} + Text{"Song of Horse", "Chant du cheval", "Chant du cheval"}, }; trickNameTable[RG_SARIAS_SONG] = { Text{"Mido's Song", "La chanson de Mido", "La canción de Mido"}, Text{"Kass' Theme", "Le thème de Kass", "El tema de Kass"}, - Text{"Tune of Echoes", "Chant des Échos ", "Melodía del Eco "} + Text{"Tune of Echoes", "Chant des Échos ", "Melodía del Eco "}, }; trickNameTable[RG_SUNS_SONG] = { Text{"Song of Passing", "Mambo de Manbo", "Melodía del transcurrir"}, Text{"Command Melody", "Air du marionnettiste", "Cara al Sol"}, - Text{"Moon's Song", "La chanson de Moon", "La canción de la luna"} + Text{"Moon's Song", "La chanson de Moon", "La canción de la luna"}, }; trickNameTable[RG_SONG_OF_TIME] = { Text{"Song of Double Time", "Chant accéléré", "Canción del doble tiempo"}, Text{"Inverted Song of Time", "Chant du temps inversé", "Canción del tiempo invertida"}, - Text{"Tune of Ages", "Chant du Temps", "Melodía del Tiempo"} + Text{"Tune of Ages", "Chant du Temps", "Melodía del Tiempo"}, }; trickNameTable[RG_SONG_OF_STORMS] = { Text{"Ballad of Gales", "Requiem de la tornade", "Melodía del Tornado"}, Text{"Frog's Song of Soul", "Rap des grenouilles", "Canción del alma de la rana"}, - Text{"Wind's Requiem", "Mélodie du vent", "Melodía del Viento"} + Text{"Wind's Requiem", "Mélodie du vent", "Melodía del Viento"}, }; trickNameTable[RG_MINUET_OF_FOREST] = { Text{"Saria's Karaoke", "Karaoké de Saria", "Dueto del bosque"}, Text{"Sonata of Awakening", "Sonate de l'éveil", "Sonata del despertar"}, - Text{"Wind God's Aria", "Hymne du dieu du vent", "Melodía del Espíritu del Viento"} + Text{"Wind God's Aria", "Hymne du dieu du vent", "Melodía del Espíritu del Viento"}, }; trickNameTable[RG_BOLERO_OF_FIRE] = { Text{"Darunia's Tango", "Tango de Darunia", "Coro del fuego"}, Text{"Tune of Currents", "Chants des Flux", "Melodía de las Corrientes"}, - Text{"Goron Lullaby", "Berceuse des Gorons", "Nana goron"} + Text{"Goron Lullaby", "Berceuse des Gorons", "Nana goron"}, }; trickNameTable[RG_SERENADE_OF_WATER] = { Text{"Ruto's Blues", "Blues de Ruto", "Sonata del agua"}, Text{"New Wave Bossa Nova", "Bossa-nova des flots", "Bossanova de las olas"}, - Text{"Manbo's Mambo", "Mambo de Manbo", "Mambo de Manbo"} + Text{"Manbo's Mambo", "Mambo de Manbo", "Mambo de Manbo"}, }; trickNameTable[RG_REQUIEM_OF_SPIRIT] = { Text{"Nabooru's Reggae", "Reggae de Nabooru", "Reggae del espíritu"}, Text{"Elegy of Emptiness", "Hymne du vide", "Elegía al vacío"}, - Text{"Earth God's Lyric", "Hymne du dieu de la terre", "Melodía del Espíritu de la Tierra"} + Text{"Earth God's Lyric", "Hymne du dieu de la terre", "Melodía del Espíritu de la Tierra"}, }; trickNameTable[RG_NOCTURNE_OF_SHADOW] = { Text{"Impa's Death Metal", "Death métal d'Impa", "Diurno de la sombra"}, Text{"Oath to Order", "Ode de l'appel", "Oda al orden"}, - Text{"Song of Discovery", "Chant des secrets", "Canto revelador"} + Text{"Song of Discovery", "Chant des secrets", "Canto revelador"}, }; trickNameTable[RG_PRELUDE_OF_LIGHT] = { Text{"Rauru's Sing-Along", "Chansonnette de Rauru", "Predulio de luz"}, Text{"Ballad of the Wind Fish", "Ballade sur Poisson-Rêve", "Balada del Piez Viento"}, - Text{"Song of Light", "Chant de la lumière", "Sonidos de la luz"} + Text{"Song of Light", "Chant de la lumière", "Sonidos de la luz"}, }; trickNameTable[RG_KOKIRI_EMERALD] = { @@ -748,93 +750,93 @@ void InitTrickNames() { Text{"Farore's Pearl", "Perle de Farore", "Orbe de Farore"}, Text{"Aquanine", "Smaragdine", "Yerbánida"}, Text{"Farore's Emerald", "Émeraude de Farore", "Esmeralda de Farore"}, - Text{"Kokiri's Peridot", "Péridot Kokiri", "Ágata de los Kokiri"} + Text{"Kokiri's Peridot", "Péridot Kokiri", "Ágata de los Kokiri"}, }; trickNameTable[RG_GORON_RUBY] = { Text{"Pendant of Power", "Pendentif de la force", "Colgante del poder"}, Text{"Din's Pearl", "Perle de Din", "Orbe de Din"}, Text{"Crimsonine", "Alzanine", "Bermellina"}, Text{"Din's Ruby", "Rubis de Din", "Rubí de Din"}, - Text{"Goron's Garnet", "Grenat Goron", "Topacio de los Goron"} + Text{"Goron's Garnet", "Grenat Goron", "Topacio de los Goron"}, }; trickNameTable[RG_ZORA_SAPPHIRE] = { Text{"Pendant of Wisdom", "Pendentif de la sagesse", "Colgante de la sabiduría"}, Text{"Nayru's Pearl", "Perle de Nayru", "Orbe de Nayru"}, Text{"Azurine", "Aquanine", "Azurina"}, Text{"Nayru's Sapphire", "Saphir de Nayru", "Zafiro de Nayru"}, - Text{"Zora's Aquamarine", "Aquamarine Zora", "Lapislázuli de los Zora"} + Text{"Zora's Aquamarine", "Aquamarine Zora", "Lapislázuli de los Zora"}, }; trickNameTable[RG_FOREST_MEDALLION] = { Text{"Wind Medallion", "Médaillon du vent", "Medallón del Viento"}, Text{"Wind Element", "Elément Vent", "Elemento de aire"}, Text{"Saria's Medallion", "Médaillon de Saria", "Medallón de Saria"}, Text{"Sign of Air", "Glyphe de l'air", "Glifo de aire"}, - Text{"Medallion of Forest", "Médaillon du Temple de la Forêt", "Medalla del Bosque"} + Text{"Medallion of Forest", "Médaillon du Temple de la Forêt", "Medalla del Bosque"}, }; trickNameTable[RG_FIRE_MEDALLION] = { Text{"Fire Element", "Elément Feu", "Elemento de fuego"}, Text{"Darunia's Medallion", "Médaillon de Darunia", "Medallón de Darunia"}, Text{"Sign of Fire", "Glyphe de feu", "Glifo de fuego"}, - Text{"Medallion of Fire", "Médaillon du Temple du Feu", "Medalla del Fuego"} + Text{"Medallion of Fire", "Médaillon du Temple du Feu", "Medalla del Fuego"}, }; trickNameTable[RG_WATER_MEDALLION] = { Text{"Water Element", "Elément Eau", "Elemento de agua"}, Text{"Ice Medallion", "Médaillon de glace", "Medallón Helado"}, Text{"Ruto's Medallion", "Médaillon de Ruto", "Medallón de Ruto"}, Text{"Sign of Water", "Glyphe de l'eau", "Glifo de agua"}, - Text{"Medallion of Water", "Médaillon du Temple de l'Eau", "Medalla del Agua"} + Text{"Medallion of Water", "Médaillon du Temple de l'Eau", "Medalla del Agua"}, }; trickNameTable[RG_SPIRIT_MEDALLION] = { Text{"Earth Element", "Elément Terre", "Elemento de tierra"}, Text{"Nabooru's Medallion", "Médaillon de Nabooru", "Medallón de Nabooru"}, Text{"Sign of Earth", "Glyphe de la Terre", "Glifo de la tierra"}, - Text{"Medallion of Spirit", "Médaillon du Temple de l'Esprit", "Medalla del Espíritu"} + Text{"Medallion of Spirit", "Médaillon du Temple de l'Esprit", "Medalla del Espíritu"}, }; trickNameTable[RG_SHADOW_MEDALLION] = { Text{"Fused Shadow", "Cristal d'ombre", "Sombra Fundida"}, Text{"Impa's Medallion", "Médaillon d'Impa", "Medallón de Impa"}, Text{"Sign of Illusion", "Glyphe de l'illusion", "Glifo de ilusión"}, - Text{"Medallion of Shadow", "Médaillon du Temple de l'Ombre", "Medalla de la Sombra"} + Text{"Medallion of Shadow", "Médaillon du Temple de l'Ombre", "Medalla de la Sombra"}, }; trickNameTable[RG_LIGHT_MEDALLION] = { Text{"Compass of Light", "Boussole de lumière", "Brújula de Luz"}, Text{"Rauru's Medallion", "Médaillon de Rauru", "Medallón de Rauru"}, Text{"Sign of Destiny", "Glyphe du destin", "Glifo del destino"}, - Text{"Medallion of Light", "Médaillon du temple de lumière", "Medalla de la Luz"} + Text{"Medallion of Light", "Médaillon du temple de lumière", "Medalla de la Luz"}, }; trickNameTable[RG_RECOVERY_HEART] = { Text{"Love", "Bisou", "Te amo"}, Text{"Life", "Vie", "vida"}, - Text{"HP", "VP", "VP"} + Text{"HP", "VP", "VP"}, }; trickNameTable[RG_GREEN_RUPEE] = { Text{"False Greg", "Faux Greg", "Falso Greg"}, Text{"One Ruby", "Un rubis", "Un rubí"}, Text{"Rupoor (1)", "Roupir (1)", "Rupobre (1)"}, Text{"One Rupee", "Un rubis", "Guaraní hyliano"}, - Text{"Rupee (1)", "Rubis (1)", "Peso hyliano"} + Text{"Rupee (1)", "Rubis (1)", "Peso hyliano"}, }; trickNameTable[RG_BLUE_RUPEE] = { Text{"Blupee", "Bleubi", "Azupia"}, Text{"Five Rubies", "Cinq Rubys", "Cinco rubíes"}, Text{"Five Rupees", "Cinq rubis", "Bolívar hyliano"}, Text{"Rupee (5)", "Rubis (5)", "Peso hyliano"}, - Text{"Rupoor (5)", "Roupir (5)", "Rupobre (5)"} + Text{"Rupoor (5)", "Roupir (5)", "Rupobre (5)"}, }; trickNameTable[RG_RED_RUPEE] = { Text{"Big 20", "Grand 20", "Los 20 grandes"}, Text{"Twenty Rubies", "vingt rubis", "Veinte rubíes"}, Text{"Rupoor (20)", "Roupir (20)", "Rupobre (20)"}, Text{"Twenty Rupees", "Vingt rubis", "Colon hyliano"}, - Text{"Rupee (20)", "Rubis (20)", "Peso hyliano"} + Text{"Rupee (20)", "Rubis (20)", "Peso hyliano"}, }; trickNameTable[RG_PURPLE_RUPEE] = { Text{"Purpee", "pourbi", "morupiua"}, Text{"Fifty Rubies", "cinquante rubis", "Cincuenta rubíes"}, Text{"Rupoor (50)", "Roupir (50)", "Rupobre (50)"}, Text{"Fifty Rupees", "Cinquante rubis", "Balboa hyliano"}, - Text{"Rupee (50)", "Rubis (50)", "Peso hyliano"} + Text{"Rupee (50)", "Rubis (50)", "Peso hyliano"}, }; trickNameTable[RG_HUGE_RUPEE] = { Text{"Hugo", "Or Rubi", "Oro Rubi"}, @@ -842,102 +844,102 @@ void InitTrickNames() { Text{"Diamond", "Diamant", "Diamante"}, Text{"Huge Ruby", "Énorme rubis", "Rubi gigante"}, Text{"Two Hundred Rupees", "Deux cent rubis", "Euro hyliano"}, - Text{"Rupee (200)", "Rubis (200)", "Dólar hyliano"} + Text{"Rupee (200)", "Rubis (200)", "Dólar hyliano"}, }; trickNameTable[RG_PIECE_OF_HEART] = { Text{"Pizza Heart", "Fromage de cœur", "Pieza de Chorizo"}, Text{"Little Bit Of Love", "Un peu d'amour", "Un poco de amor"}, - Text{"Rare Peach Stone", "Pierre de pêche rare", "Pierre de pêche rare"} + Text{"Rare Peach Stone", "Pierre de pêche rare", "Pierre de pêche rare"}, }; trickNameTable[RG_HEART_CONTAINER] = { Text{"Crystal Heart", "Cœur de cristal", "Corazón de cristal"}, Text{"Life Heart", "Cœur de vie", "Vida Corazón"}, - Text{"Lots of Love", "Beaucoup d'amour", "Mucho amor"} + Text{"Lots of Love", "Beaucoup d'amour", "Mucho amor"}, }; trickNameTable[RG_TRIFORCE_PIECE] = { Text{"Piece of Cheese", "Morceau de Fromage", "Piece of Cheese"}, Text{"Triforce Shard", "Éclat de Triforce", "Triforce Shard"}, - Text{"Shiny Rock", "Caiiloux Brillant", "Shiny Rock"} + Text{"Shiny Rock", "Caiiloux Brillant", "Shiny Rock"}, }; trickNameTable[RG_GOHMA_SOUL] = { Text{"Spider Sense", "", ""}, Text{"Deku Spirit", "", ""}, - Text{"Ghost of Ghoma", "", ""} + Text{"Ghost of Ghoma", "", ""}, }; trickNameTable[RG_KING_DODONGO_SOUL] = { Text{"Lizard Soul", "", ""}, Text{"Regal Remains", "", ""}, - Text{"Dodongo's Core", "", ""} + Text{"Dodongo's Core", "", ""}, }; trickNameTable[RG_BARINADE_SOUL] = { Text{"Parasitic Poltergeist", "", ""}, Text{"Jabu Insides", "", ""}, - Text{"Barinade Bacteria", "", ""} + Text{"Barinade Bacteria", "", ""}, }; trickNameTable[RG_PHANTOM_GANON_SOUL] = { Text{"Bigger Poe", "", ""}, Text{"Sacred Forest Pine Tree", "", ""}, - Text{"Ganon's Phantom", "", ""} + Text{"Ganon's Phantom", "", ""}, }; trickNameTable[RG_VOLVAGIA_SOUL] = { Text{"Dragon Roast", "", ""}, Text{"Hot n' Ready", "", ""}, - Text{"Volvagia's Vitality", "", ""} + Text{"Volvagia's Vitality", "", ""}, }; trickNameTable[RG_MORPHA_SOUL] = { Text{"Dihydrogen Monoxide", "", ""}, Text{"Morpha Molecules", "", ""}, - Text{"Wet Stuff", "", ""} + Text{"Wet Stuff", "", ""}, }; trickNameTable[RG_BONGO_BONGO_SOUL] = { Text{"Shadow Soul", "", ""}, Text{"Dark Essence", "", ""}, - Text{"Bongo Bongo's Bongo", "", ""} + Text{"Bongo Bongo's Bongo", "", ""}, }; trickNameTable[RG_TWINROVA_SOUL] = { Text{"Sandy Ashes", "", ""}, Text{"Spiritual Spirit", "", ""}, - Text{"Twin Rovers", "", ""} + Text{"Twin Rovers", "", ""}, }; trickNameTable[RG_GANON_SOUL] = { Text{"Pure Evil", "", ""}, Text{"Ganon's Ghost", "", ""}, - Text{"Pork", "", ""} + Text{"Pork", "", ""}, }; trickNameTable[RG_FISHING_POLE] = { Text{"Fish Tickler", "Fish Tickler", "Fish Tickler"}, Text{"Floating Lure", "Floating Lure", "Floating Lure"}, - Text{"Fishing Reel", "Fishing Reel", "Fishing Reel"} + Text{"Fishing Reel", "Fishing Reel", "Fishing Reel"}, }; trickNameTable[RG_OCARINA_A_BUTTON] = { Text{"Ocarina J Button", "", ""}, Text{"Ocarina Ayy Button", "", ""}, - Text{"Ocarina A Trigger", "", ""} + Text{"Ocarina A Trigger", "", ""}, }; trickNameTable[RG_OCARINA_C_UP_BUTTON] = { Text{"Ocarina C North Button", "", ""}, Text{"Ocarina C App Button", "", ""}, - Text{"Ocarina Sup Button", "", ""} + Text{"Ocarina Sup Button", "", ""}, }; trickNameTable[RG_OCARINA_C_DOWN_BUTTON] = { Text{"Ocarina C South Button", "", ""}, Text{"Ocarina Z Down Button", "", ""}, Text{"Ocarina See Down Button", "", ""}, - Text{"Ocarina C Dawn Button", "", ""} + Text{"Ocarina C Dawn Button", "", ""}, }; trickNameTable[RG_OCARINA_C_LEFT_BUTTON] = { Text{"Ocarina C West Button", "", ""}, Text{"Ocarina Sea Left Button", "", ""}, Text{"Ocarina C Lift Button", "", ""}, - Text{"Ocarina Rewind Button", "", ""} + Text{"Ocarina Rewind Button", "", ""}, }; trickNameTable[RG_OCARINA_C_RIGHT_BUTTON] = { Text{"Ocarina C East Button", "", ""}, Text{"Ocarina C Wright Button", "", ""}, - Text{"Overworld C Right Button", "", ""} + Text{"Overworld C Right Button", "", ""}, }; /* @@ -945,182 +947,182 @@ void InitTrickNames() { trickNameTable[GI_HOOKSHOT] = { Text{"Grappling Hook", "Grappin-griffe", "Gancho lanzable"}, Text{"Clawshot", "Lance-chaîne", "Zarpa"}, - Text{"Gripshot", "Grappince", "Enganchador"} + Text{"Gripshot", "Grappince", "Enganchador"}, }; trickNameTable[GI_LONGSHOT] = { Text{"Longshot, no strings attached", "Grappin sans attrape", "Gancho lanzable más largo"}, Text{"Double Clawshot", "Double-grappin", "Superzarpa"}, - Text{"Switch Hook", "Great grappin", "Gancho chulo"} + Text{"Switch Hook", "Great grappin", "Gancho chulo"}, }; trickNameTable[GI_BOMB_BAG_1] = { Text{"Bomb Capacity (20)", "Capacité de bombes (20)", "Bolsa de bombas (contiene 20)"}, Text{"Bronze Bomb Bag", "Sac de Bombes de bronze", "Saco de bronce de bombas"}, - Text{"Small Bomb Bag", "Petit Sac de Bombes", "Zurrón de bombas pequeño"} + Text{"Small Bomb Bag", "Petit Sac de Bombes", "Zurrón de bombas pequeño"}, }; trickNameTable[GI_BOMB_BAG_2] = { Text{"Bomb Capacity (30)", "Capacité de bombes (30)", "Bolsa de bombas (contiene 30)"}, Text{"Silver Bomb Bag", "Sac de Bombes d'argent", "Saco plateado de bombas"}, - Text{"Medium Bomb Bag", "Sac de Bombes moyen", "Zurrón de bombas mediano"} + Text{"Medium Bomb Bag", "Sac de Bombes moyen", "Zurrón de bombas mediano"}, }; trickNameTable[GI_BOMB_BAG_3] = { Text{"Bomb Capacity (40)", "Capacité de bombes (40)", "Bolsa de bombas (contiene 40)"}, Text{"Golden Bomb Bag", "Sac de Bombes d'or", "Saco dorado de bombas"}, - Text{"Large Bomb Bag", "Gros Sac de Bombes", "Zurrón de bombas grande"} + Text{"Large Bomb Bag", "Gros Sac de Bombes", "Zurrón de bombas grande"}, }; trickNameTable[GI_BOW_1] = { Text{"Bow", "Arc", "Arco del Hada"}, Text{"Hero's Bow", "Arc du héros", "Arco del héroe"}, - Text{"Small Quiver", "Petit carquois", "Saco de flechas pequeño"} + Text{"Small Quiver", "Petit carquois", "Saco de flechas pequeño"}, }; trickNameTable[GI_BOW_2] = { Text{"Arrow Capacity (40)", "Capacité de flèches (40)", "Capacidad de flechas (40)"}, Text{"Silver Quiver", "Carquois d'argent", "Carcaj plateado"}, - Text{"Medium Quiver", "Carquois moyen", "Saco de flechas mediano"} + Text{"Medium Quiver", "Carquois moyen", "Saco de flechas mediano"}, }; trickNameTable[GI_BOW_3] = { Text{"Arrow Capacity (50)", "Capacité de flèches (50)", "Capacidad de flechas (50)"}, Text{"Golden Quiver", "Carquois d'or", "Carcaj dorado"}, - Text{"Large Quiver", "Gros carquois", "Saco de flechas grande"} + Text{"Large Quiver", "Gros carquois", "Saco de flechas grande"}, }; trickNameTable[GI_SLINGSHOT_1] = { Text{"Slingshot", "Lance-Pierre", "Tirachinas del Hada"}, Text{"Scattershot", "Lance-Pierre rafale", "Tirachinas múltiple"}, - Text{"Small Seed Satchel", "Petit sac de graines", "Bolsa de semillas pequeña"} + Text{"Small Seed Satchel", "Petit sac de graines", "Bolsa de semillas pequeña"}, }; trickNameTable[GI_SLINGSHOT_2] = { Text{"Deku Seed Capacity (40)", "Capacité de graines (40)", "Capacidad de semillas (40)"}, Text{"Silver Deku Seed Bullet Bag", "Sac de graines d'argent", "Bolsa de balas (contiene 40)"}, - Text{"Medium Seed Satchel", "Sac de graines moyen", "Bolsa de semillas mediana"} + Text{"Medium Seed Satchel", "Sac de graines moyen", "Bolsa de semillas mediana"}, }; trickNameTable[GI_SLINGSHOT_3] = { Text{"Deku Seed Capacity (50)", "Capacité de graines (50)", "Capacidad de semillas (50)"}, Text{"Golden Deku Seed Bullet Bag", "Sac de graines d'or", "Bolsa de balas (contiene 50)"}, - Text{"Large Seed Satchel", "Gros sac de graines", "Bolsa de semillas grande"} + Text{"Large Seed Satchel", "Gros sac de graines", "Bolsa de semillas grande"}, }; trickNameTable[GI_STRENGTH_1] = { Text{"Goron's Gauntlet", "Gantelet Goron", "Brazalete amarillo"}, Text{"Power Bracelet", "Bracelet de force", "Brazalete de fuerza"}, - Text{"Magic Bracelet", "Bracelet de Lavio", "Brazalete de Ravio"} + Text{"Magic Bracelet", "Bracelet de Lavio", "Brazalete de Ravio"}, }; trickNameTable[GI_STRENGTH_2] = { Text{"Silver Bracelets", "Bracelets d'argent", "Guantes Moguma"}, Text{"Power Gloves", "Gant de puissance", "Guante del Poder"}, - Text{"Magic Gauntlets", "Gantelet magique", "Guante mágico"} + Text{"Magic Gauntlets", "Gantelet magique", "Guante mágico"}, }; trickNameTable[GI_STRENGTH_3] = { Text{"Golden Bracelets", "Bracelets d'or", "Guantelete de Thanos"}, Text{"Titan's Mitts", "Moufle de titan", "Guantes de Titán"}, - Text{"Magnetic Gloves", "Magnéto-gants", "Guantes de fuego"} + Text{"Magnetic Gloves", "Magnéto-gants", "Guantes de fuego"}, }; trickNameTable[GI_SCALE_1] = { Text{"Silver Pearl", "Perle d'argent", "Perla de Plata progresiva"}, Text{"Adult Scale", "Écaille d'adulte", "Bola de bolos zora"}, - Text{"Zora Scale", "Écaille Zora", "Escama de Zora"} + Text{"Zora Scale", "Écaille Zora", "Escama de Zora"}, }; trickNameTable[GI_SCALE_2] = { Text{"Golden Pearl", "Perle d'or", "Perla de Oro progresiva"}, Text{"Giant Scale", "Écaille de géant", "Escama de Faren"}, - Text{"Water Dragon Scale", "Écaille du dragon de l'eau", "Escama de dragón acuático"} + Text{"Water Dragon Scale", "Écaille du dragon de l'eau", "Escama de dragón acuático"}, }; trickNameTable[GI_WALLET_1] = { Text{"Rupee Capacity (200)", "Capacité de rubis (200)", "Capacidad de rupias (200)"}, Text{"Silver Wallet", "Bourse d'argent", "Cartera de rupias de adulto"}, - Text{"Medium Wallet", "Bourse moyenne", "Zurrón de rupias mediano"} + Text{"Medium Wallet", "Bourse moyenne", "Zurrón de rupias mediano"}, }; trickNameTable[GI_WALLET_2] = { Text{"Rupee Capacity (500)", "Capacité de rubis (500)", "Capacidad de rupias (500)"}, Text{"Golden Wallet", "Bourse d'or", "Cartera de rupias gigante"}, - Text{"Large Wallet", "Grosse Bourse", "Zurrón de rupias grande"} + Text{"Large Wallet", "Grosse Bourse", "Zurrón de rupias grande"}, }; trickNameTable[GI_WALLET_3] = { Text{"Rupee Capacity (999)", "Capacité de rubis (999)", "Capacidad de rupias (999)"}, Text{"Golden Wallet", "Bourse d'or", "Cartera de ricachón"}, - Text{"Large Wallet", "Grosse Bourse", "Zurrón de rupias gigante"} + Text{"Large Wallet", "Grosse Bourse", "Zurrón de rupias gigante"}, }; trickNameTable[GI_DEKU_NUT_UPGRADE_1] = { Text{"Deku Bomb Capacity (30)", "Capacité de bombes Mojo (30)", "Capacidad de semillas deku (40)"}, Text{"Baba Nut Capacity (30)", "Capacité de noix Baba (30)", "Capacidad de nueces baba (40)"}, - Text{"Deku Nut Pack (30)", "Paquet de noix Mojo (30)", "Capacidad de nueces mojo (40)"} + Text{"Deku Nut Pack (30)", "Paquet de noix Mojo (30)", "Capacidad de nueces mojo (40)"}, }; trickNameTable[GI_DEKU_NUT_UPGRADE_2] = { Text{"Deku Bomb Capacity (40)", "Capacité de bombes Mojo (40)", "Capacidad de semillas deku (50)"}, Text{"Baba Nut Capacity (40)", "Capacité de noix Baba (40)", "Capacidad de nueces baba (50)"}, - Text{"Deku Nut Pack (40)", "Paquet de noix Mojo (40)", "Capacidad de nueces mojo (50)"} + Text{"Deku Nut Pack (40)", "Paquet de noix Mojo (40)", "Capacidad de nueces mojo (50)"}, }; trickNameTable[GI_DEKU_STICK_UPGRADE_1] = { Text{"Deku Rod Capacity (20)", "Capacité de tiges Mojo (20)", "Capacidad de palos mojo (20)"}, Text{"Boko Stick Capacity (20)", "Capacité de Bâtons Boko (20)", "Capacidad de palos boko (20)"}, - Text{"Deku Stick Pack (20)", "Paquet de bâtons Mojo (20)", "Capacidad de bastones deku (20)"} + Text{"Deku Stick Pack (20)", "Paquet de bâtons Mojo (20)", "Capacidad de bastones deku (20)"}, }; trickNameTable[GI_DEKU_STICK_UPGRADE_2] = { Text{"Deku Rod Capacity (30)", "Capacité de tiges Mojo (30)", "Capacidad de palos mojo (30)"}, Text{"Boko Stick Capacity (30)", "Capacité de Bâtons Boko (30)", "Capacidad de palos boko (30)"}, - Text{"Deku Stick Pack (30)", "Paquet de bâtons Mojo (30)", "Capacidad de bastones deku (30)"} + Text{"Deku Stick Pack (30)", "Paquet de bâtons Mojo (30)", "Capacidad de bastones deku (30)"}, }; trickNameTable[GI_MAGIC_1] = { Text{"Stamina Meter", "Jauge d'endurance", "Medidor de vigor"}, Text{"Energy Meter", "Jauge d'énergie", "Medidor de energía"}, - Text{"Magic Powder", "Poudre magique", "Medidor de carga"} + Text{"Magic Powder", "Poudre magique", "Medidor de carga"}, }; trickNameTable[GI_MAGIC_2] = { Text{"Enhanced Stamina Meter", "Jauge d'endurance améliorée", "Medidor de vigor mejorado"}, Text{"Enhanced Energy Meter", "Jauge d'énergie améliorée", "Medidor de energía mejorado"}, - Text{"Enhanced Magic Powder", "Poudre magique améliorée", "Medidor de carga mejorado"} + Text{"Enhanced Magic Powder", "Poudre magique améliorée", "Medidor de carga mejorado"}, }; trickNameTable[GI_OCARINA_1] = { Text{"Ocarina", "Ocarina", "Ocarina"}, Text{"Saria's Ocarina", "Ocarina de Saria", "Ocarina de Saria"}, - Text{"Wood Ocarina", "Ocarina de bois", "Ocarina del Hada"} + Text{"Wood Ocarina", "Ocarina de bois", "Ocarina del Hada"}, }; trickNameTable[GI_OCARINA_2] = { Text{"Flute", "Flûte", "Flauta"}, Text{"Zelda's Ocarina", "Ocarina de Zelda", "Ocarina de Zelda"}, - Text{"Ocarina of Winds", "Ocarina des vents", "Ocarina del Viento"} + Text{"Ocarina of Winds", "Ocarina des vents", "Ocarina del Viento"}, }; trickNameTable[GI_CUCCO] = { Text{"D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Alarma emplumada"}, Text{"Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko"}, - Text{"Hatched Cucco", "Cocotte éclose", "Pollo"} + Text{"Hatched Cucco", "Cocotte éclose", "Pollo"}, }; trickNameTable[GI_MASK_KEATON] = { Text{"Kee... Something Mask", "Masque de Quiche", "Máscara Kealgo"}, Text{"Kitsune Mask", "Masque de Kitsune", "Máscara Kitsune"}, - Text{"Kafei's Mask", "Masque de Kafei", "Máscara de Kafei"} + Text{"Kafei's Mask", "Masque de Kafei", "Máscara de Kafei"}, }; trickNameTable[GI_MASK_SKULL] = { Text{"Skull Kid's Mask", "Masque de Skull Kid", "Máscara de Skull Kid"}, Text{"Stalfos Mask", "Masque de squelette", "Máscara de Stalfos"}, - Text{"Captain's Hat", "Heaume du capitaine", "Casco del capitán"} + Text{"Captain's Hat", "Heaume du capitaine", "Casco del capitán"}, }; trickNameTable[GI_MASK_SPOOKY] = { Text{"Skrik Mask", "Masque Skrik", "Máscara Escalofriante"}, Text{"ReDead Mask", "Masque de Remort", "Máscara de ReDead"}, - Text{"Gibdo Mask", "Masque de Gibdo", "Careta de Gibdo"} + Text{"Gibdo Mask", "Masque de Gibdo", "Careta de Gibdo"}, }; trickNameTable[GI_MASK_BUNNY] = { Text{"Peppy Mask", "Masque de Peppy", "Capucha de Pascua"}, Text{"Bunny Ears", "Oreilles de lapin", "Orejas de conejo"}, - Text{"Postman's Hat", "Casquette du facteur", "Gorra de cartero"} + Text{"Postman's Hat", "Casquette du facteur", "Gorra de cartero"}, }; trickNameTable[GI_MASK_GORON] = { Text{"Goro Mask", "Masque Goro", "Máscara Goro"}, Text{"Mask of Goron", "Masque des Gorons", "Máscara de los Goron"}, - Text{"Darunia Mask", "Masque de Darunia", "Máscara de Darmani"} + Text{"Darunia Mask", "Masque de Darunia", "Máscara de Darmani"}, }; trickNameTable[GI_MASK_ZORA] = { Text{"Zola Mask", "Masque Zola", "Máscara Zola"}, Text{"Mask of Zora", "Masque des Zoras", "Máscara de los Zora"}, - Text{"Ruto Mask", "Masque de Ruto", "Máscara de Mikau"} + Text{"Ruto Mask", "Masque de Ruto", "Máscara de Mikau"}, }; trickNameTable[GI_MASK_GERUDO] = { Text{"Ganguro Mask", "Masque de Ganguro", "Máscara Canguro"}, Text{"Mask of Gerudo", "Masque des Gerudos", "Máscara de las Gerudo"}, - Text{"Nabooru Mask", "Masque de Nabooru", "Máscara de Nabooru"} + Text{"Nabooru Mask", "Masque de Nabooru", "Máscara de Nabooru"}, }; trickNameTable[GI_MASK_TRUTH] = { Text{"Sheikah Mask", "Masque Sheikah", "Máscara Sheikah"}, Text{"Mask of Gossip", "Masque de potins", "Máscara chismosa"}, - Text{"Eye of Truth", "oeil de vérité", "Ojo de la Verdad"} + Text{"Eye of Truth", "oeil de vérité", "Ojo de la Verdad"}, }; */ } diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp index 33e264bd4..2d9d34e2b 100644 --- a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -13,6 +13,7 @@ extern PlayState* gPlayState; using SceneDoorParamsPair = std::pair; std::map lookupTable = { + // clang-format off {{ 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 }, @@ -61,6 +62,8 @@ std::map lookupTable = { {{ SCENE_LON_LON_RANCH, 447 }, RAND_INF_BACK_TOWER_UNLOCKED }, {{ SCENE_LAKE_HYLIA, 447 }, RAND_INF_HYLIA_LAB_UNLOCKED }, {{ SCENE_LAKE_HYLIA, 1471 }, RAND_INF_FISHING_HOLE_UNLOCKED }, + + // clang-format on }; static void OnDoorInit(void* actorRef) { diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp index 0f03bd196..168dcee45 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -62,7 +62,7 @@ void Rando::StaticData::RegisterCowLocations() { static bool registered = false; if (registered) return; registered = true; - // clang-format-off + // clang-format off locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW)); locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), "Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW)); diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 37a5d7323..c3500edc0 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1090,9 +1090,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } - case VB_GIVE_ITEM_FROM_MEDIGORON: { - // fallthrough - case VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE: + case VB_GIVE_ITEM_FROM_MEDIGORON: + case VB_BE_ELIGIBLE_FOR_GIANTS_KNIFE_PURCHASE: { if (EnGm_RandoCanGetMedigoronItem()) { if (id == VB_GIVE_ITEM_FROM_MEDIGORON) { EnGm* enGm = va_arg(args, EnGm*); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 116b7d709..2fb191a11 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -113,8 +113,9 @@ std::vector Rando::StaticData::GetOverworldFairyLocations() { return fairyLocations; } -void Rando::StaticData::InitLocationTable() { // Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Hint Text Key Vanilla Item Spoiler Collection Check Vanilla Progression Price +void Rando::StaticData::InitLocationTable() { // clang-format off + // Randomizer Check Quest Type Area Actor ID Scene ID Params Flags Short Name Hint Text Key Vanilla Item Spoiler Collection Check Vanilla Progression Price locationTable[RC_UNKNOWN_CHECK] = Location::Base(RC_UNKNOWN_CHECK, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_INVALID, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Invalid Location", "Invalid Location", RHT_NONE, RG_NONE); // Kokiri Forest locationTable[RC_KF_KOKIRI_SWORD_CHEST] = Location::Chest(RC_KF_KOKIRI_SWORD_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_KOKIRI_FOREST, 1248, 0x00, "Kokiri Sword Chest", RHT_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, true); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index ad09fe652..80aeead5c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -93,7 +93,7 @@ std::map startingShopItem = { { SCENE_KOKIRI_SHOP, RC { SCENE_BOMBCHU_SHOP, RC_MARKET_BOMBCHU_SHOP_ITEM_1 }, { SCENE_POTION_SHOP_KAKARIKO, RC_KAK_POTION_SHOP_ITEM_1 }, { SCENE_ZORA_SHOP, RC_ZD_SHOP_ITEM_1 }, - { SCENE_GORON_SHOP, RC_GC_SHOP_ITEM_1 } }; + { SCENE_GORON_SHOP, RC_GC_SHOP_ITEM_1 }, }; std::map DungeonRCAreasBySceneID = { {SCENE_DEKU_TREE, RCAREA_DEKU_TREE}, @@ -124,7 +124,7 @@ std::vector spoilingEntrances = { ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_ICE_CAVERN_ENTRANCE, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, - ENTR_INSIDE_GANONS_CASTLE_ENTRANCE + ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, }; std::map> checksByArea; @@ -418,7 +418,7 @@ bool vector_contains_scene(std::vector vec, const int16_t scene) { return std::any_of(vec.begin(), vec.end(), [&](const auto& x) { return x == scene; }); } -std::vector skipScenes = {SCENE_GANON_BOSS, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SCENE_GANON_BOSS, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR}; +std::vector skipScenes = {SCENE_GANON_BOSS, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SCENE_GANON_BOSS, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR,}; void ClearAreaChecksAndTotals() { for (auto& [rcArea, vec] : checksByArea) { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 96c916824..9d15c7cc1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -34,10 +34,14 @@ s16 dynamicExitList[] = { ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, // HC Fairy - ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT + ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, }; -// Warp Song indices array : 0x53C33C = { ENTR_SACRED_FOREST_MEADOW_WARP_PAD, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, ENTR_LAKE_HYLIA_WARP_PAD, ENTR_DESERT_COLOSSUS_WARP_PAD, ENTR_GRAVEYARD_WARP_PAD, ENTR_TEMPLE_OF_TIME_WARP_PAD } +// Warp Song indices array: +// 0x53C33C = { +// ENTR_SACRED_FOREST_MEADOW_WARP_PAD, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, ENTR_LAKE_HYLIA_WARP_PAD, +// ENTR_DESERT_COLOSSUS_WARP_PAD, ENTR_GRAVEYARD_WARP_PAD, ENTR_TEMPLE_OF_TIME_WARP_PAD +// } // Owl Flights : 0x492064 and 0x492080 diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 13046874f..0c24aa181 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -340,7 +340,7 @@ std::vector buttonMap = { BTN_DUP, BTN_DDOWN, BTN_DLEFT, - BTN_DRIGHT + BTN_DRIGHT, }; typedef enum { @@ -354,18 +354,18 @@ typedef enum { typedef enum { KEYS_COLLECTED_MAX, KEYS_CURRENT_COLLECTED_MAX, - KEYS_CURRENT_MAX + KEYS_CURRENT_MAX, } ItemTrackerKeysNumberOption; typedef enum { TRIFORCE_PIECE_COLLECTED_REQUIRED, - TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX + TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, } ItemTrackerTriforcePieceNumberOption; typedef enum { SECTION_DISPLAY_HIDDEN, SECTION_DISPLAY_MAIN_WINDOW, - SECTION_DISPLAY_SEPARATE + SECTION_DISPLAY_SEPARATE, } ItemTrackerDisplayType; typedef enum { @@ -377,7 +377,7 @@ typedef enum { typedef enum { SECTION_DISPLAY_MINIMAL_HIDDEN, - SECTION_DISPLAY_MINIMAL_SEPARATE + SECTION_DISPLAY_MINIMAL_SEPARATE, } ItemTrackerMinimalDisplayType; struct ItemTrackerNumbers { @@ -1562,20 +1562,20 @@ void ItemTrackerWindow::DrawElement() { static std::unordered_map itemTrackerCapacityTrackOptions = { { ITEM_TRACKER_NUMBER_NONE, "No Numbers" }, { ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, "Current Capacity" }, { ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, "Current Ammo" }, - { ITEM_TRACKER_NUMBER_CAPACITY, "Current Capacity / Max Capacity" }, { ITEM_TRACKER_NUMBER_AMMO, "Current Ammo / Current Capacity" }}; + { ITEM_TRACKER_NUMBER_CAPACITY, "Current Capacity / Max Capacity" }, { ITEM_TRACKER_NUMBER_AMMO, "Current Ammo / Current Capacity" },}; static std::unordered_map itemTrackerKeyTrackOptions = { - { KEYS_COLLECTED_MAX, "Collected / Max" }, { KEYS_CURRENT_COLLECTED_MAX, "Current / Collected / Max" }, { KEYS_CURRENT_MAX, "Current / Max" }}; + { KEYS_COLLECTED_MAX, "Collected / Max" }, { KEYS_CURRENT_COLLECTED_MAX, "Current / Collected / Max" }, { KEYS_CURRENT_MAX, "Current / Max" },}; static std::unordered_map itemTrackerTriforcePieceTrackOptions = { - { TRIFORCE_PIECE_COLLECTED_REQUIRED, "Collected / Required" }, { TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, "Collected / Required / Max" }}; -static std::unordered_map windowTypes = {{ TRACKER_WINDOW_FLOATING, "Floating" }, { TRACKER_WINDOW_WINDOW, "Window" }}; -static std::unordered_map displayModes = {{ TRACKER_DISPLAY_ALWAYS, "Always" }, { TRACKER_DISPLAY_COMBO_BUTTON, "Combo Button Hold" }}; + { TRIFORCE_PIECE_COLLECTED_REQUIRED, "Collected / Required" }, { TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, "Collected / Required / Max" },}; +static std::unordered_map windowTypes = {{ TRACKER_WINDOW_FLOATING, "Floating" }, { TRACKER_WINDOW_WINDOW, "Window" },}; +static std::unordered_map displayModes = {{ TRACKER_DISPLAY_ALWAYS, "Always" }, { TRACKER_DISPLAY_COMBO_BUTTON, "Combo Button Hold" },}; static std::unordered_map buttons = {{ TRACKER_COMBO_BUTTON_A, "A" }, { TRACKER_COMBO_BUTTON_B, "B"}, { TRACKER_COMBO_BUTTON_C_UP, "C-Up"}, { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, { TRACKER_COMBO_BUTTON_L, "L" }, { TRACKER_COMBO_BUTTON_Z, "Z" }, { TRACKER_COMBO_BUTTON_R, "R" }, { TRACKER_COMBO_BUTTON_START, "Start" }, { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, - { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }}; -static std::unordered_map displayTypes = {{ SECTION_DISPLAY_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_SEPARATE, "Separate" }}; + { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" },}; +static std::unordered_map displayTypes = {{ SECTION_DISPLAY_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_SEPARATE, "Separate" },}; static std::unordered_map extendedDisplayTypes = {{ SECTION_DISPLAY_EXTENDED_HIDDEN, "Hidden" }, - { SECTION_DISPLAY_EXTENDED_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_EXTENDED_MISC_WINDOW, "Misc Window" }, { SECTION_DISPLAY_EXTENDED_SEPARATE, "Separate" }}; + { SECTION_DISPLAY_EXTENDED_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_EXTENDED_MISC_WINDOW, "Misc Window" }, { SECTION_DISPLAY_EXTENDED_SEPARATE, "Separate" },}; static std::unordered_map minimalDisplayTypes = {{ SECTION_DISPLAY_MINIMAL_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MINIMAL_SEPARATE, "Separate" }}; void ItemTrackerSettingsWindow::DrawElement() { diff --git a/soh/soh/Enhancements/randomizer/static_data.cpp b/soh/soh/Enhancements/randomizer/static_data.cpp index 40fdc9c50..104a8fb97 100644 --- a/soh/soh/Enhancements/randomizer/static_data.cpp +++ b/soh/soh/Enhancements/randomizer/static_data.cpp @@ -174,7 +174,7 @@ std::unordered_map StaticData::areaNames = { // {RA_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL}, {RA_ICE_CAVERN, RHT_ICE_CAVERN}, {RA_GERUDO_TRAINING_GROUND, RHT_GERUDO_TRAINING_GROUND}, - {RA_GANONS_CASTLE, RHT_GANONS_CASTLE} + {RA_GANONS_CASTLE, RHT_GANONS_CASTLE}, }; std::unordered_map StaticData::trialData = { @@ -183,7 +183,7 @@ std::unordered_map StaticData::trialData = { {TK_FIRE_TRIAL, RHT_FIRE_TRIAL}, {TK_WATER_TRIAL, RHT_WATER_TRIAL}, {TK_SHADOW_TRIAL, RHT_SHADOW_TRIAL}, - {TK_SPIRIT_TRIAL, RHT_SPIRIT_TRIAL} + {TK_SPIRIT_TRIAL, RHT_SPIRIT_TRIAL}, }; std::unordered_map StaticData::staticHintInfoMap = { @@ -303,7 +303,7 @@ std::unordered_map StaticData::grottoChestParamsToHint{ {22984, RH_KAK_OPEN_GROTTO_GOSSIP_STONE}, {22985, RH_ZR_OPEN_GROTTO_GOSSIP_STONE}, {23802, RH_DMC_UPPER_GROTTO_GOSSIP_STONE}, - {22988, RH_KF_STORMS_GROTTO_GOSSIP_STONE} + {22988, RH_KF_STORMS_GROTTO_GOSSIP_STONE}, }; std::array StaticData::hintTextTable = {}; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2b1eec610..83b13c21c 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -314,7 +314,7 @@ OTRGlobals::OTRGlobals() { OOT_NTSC_US_GC, OOT_PAL_GC, OOT_PAL_GC_DBG1, - OOT_PAL_GC_DBG2 + OOT_PAL_GC_DBG2, }; context = Ship::Context::CreateUninitializedInstance("Ship of Harkinian", appShortName, "shipofharkinian.json"); diff --git a/soh/soh/SohGui/SohMenu.h b/soh/soh/SohGui/SohMenu.h index b8d6bf85f..97cc3b021 100644 --- a/soh/soh/SohGui/SohMenu.h +++ b/soh/soh/SohGui/SohMenu.h @@ -64,39 +64,39 @@ static const std::unordered_map notificationPosition = { static const std::unordered_map dekuStickCheat = { { DEKU_STICK_NORMAL, "Normal" }, { DEKU_STICK_UNBREAKABLE, "Unbreakable" }, - { DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, "Unbreakable + Always on Fire" } + { DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, "Unbreakable + Always on Fire" }, }; static const std::unordered_map skipForcedDialogOptions = { { FORCED_DIALOG_SKIP_NONE, "None" }, { FORCED_DIALOG_SKIP_NAVI, "Navi" }, { FORCED_DIALOG_SKIP_NPC, "NPCs" }, - { FORCED_DIALOG_SKIP_ALL, "All" } + { FORCED_DIALOG_SKIP_ALL, "All" }, }; static const std::unordered_map skipGetItemAnimationOptions = { { SGIA_DISABLED, "Disabled" }, { SGIA_JUNK, "Junk Items" }, - { SGIA_ALL, "All Items" } + { SGIA_ALL, "All Items" }, }; static const std::unordered_map chestStyleMatchesContentsOptions = { { CSMC_DISABLED, "Disabled" }, { CSMC_BOTH, "Both" }, { CSMC_TEXTURE, "Texture Only" }, - { CSMC_SIZE, "Size Only" } + { CSMC_SIZE, "Size Only" }, }; static const std::unordered_map timeTravelOptions = { { TIME_TRAVEL_DISABLED, "Disabled" }, { TIME_TRAVEL_OOT, "Ocarina of Time" }, - { TIME_TRAVEL_ANY, "Any Ocarina" } + { TIME_TRAVEL_ANY, "Any Ocarina" }, }; static const std::unordered_map sleepingWaterfallOptions = { { WATERFALL_ALWAYS, "Always" }, { WATERFALL_ONCE, "Once" }, - { WATERFALL_NEVER, "Never" } + { WATERFALL_NEVER, "Never" }, }; static const std::unordered_map allPowers = { @@ -108,7 +108,7 @@ static const std::unordered_map allPowers = { { DAMAGE_RIDICULOUS, "Ridiculous (32x)" }, { DAMAGE_MERCILESS, "Merciless (64x)" }, { DAMAGE_TORTURE, "Pure Torture (128x)" }, - { DAMAGE_OHKO, "OHKO (256x)" } + { DAMAGE_OHKO, "OHKO (256x)" }, }; static const std::unordered_map subPowers = { @@ -140,25 +140,25 @@ static const std::unordered_map bonkDamageValues = { { BONK_DAMAGE_2_HEARTS, "2 Hearts" }, { BONK_DAMAGE_4_HEARTS, "4 Hearts" }, { BONK_DAMAGE_8_HEARTS, "8 Hearts" }, - { BONK_DAMAGE_OHKO, "OHKO" } + { BONK_DAMAGE_OHKO, "OHKO" }, }; static const std::unordered_map cursorAnywhereValues = { { PAUSE_ANY_CURSOR_RANDO_ONLY, "Only in Rando" }, { PAUSE_ANY_CURSOR_ALWAYS_ON, "Always" }, - { PAUSE_ANY_CURSOR_ALWAYS_OFF, "Never" } + { PAUSE_ANY_CURSOR_ALWAYS_OFF, "Never" }, }; static const std::unordered_map swordToggleModes = { { SWORD_TOGGLE_NONE, "None" }, { SWORD_TOGGLE_CHILD, "Child Toggle" }, - { SWORD_TOGGLE_BOTH_AGES, "Both Ages" } + { SWORD_TOGGLE_BOTH_AGES, "Both Ages" }, }; static const std::unordered_map zFightingOptions = { { ZFIGHT_FIX_DISABLED, "Disabled" }, { ZFIGHT_FIX_CONSISTENT_VANISH, "Consistent Vanish" }, - { ZFIGHT_FIX_NO_VANISH, "No Vanish" } + { ZFIGHT_FIX_NO_VANISH, "No Vanish" }, }; static const std::unordered_map mirroredWorldModes = { @@ -170,13 +170,13 @@ static const std::unordered_map mirroredWorldModes = { { MIRRORED_WORLD_DUNGEONS_VANILLA, "Dungeons (Vanilla)" }, { MIRRORED_WORLD_DUNGEONS_MQ, "Dungeons (MQ)" }, { MIRRORED_WORLD_DUNGEONS_RANDOM, "Dungeons Random" }, - { MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED, "Dungeons Random (Seeded)"} + { MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED, "Dungeons Random (Seeded)"}, }; static const std::unordered_map enemyRandomizerModes = { { ENEMY_RANDOMIZER_OFF, "Disabled" }, { ENEMY_RANDOMIZER_RANDOM, "Random" }, - { ENEMY_RANDOMIZER_RANDOM_SEEDED, "Random (Seeded)"} + { ENEMY_RANDOMIZER_RANDOM_SEEDED, "Random (Seeded)"}, }; static const std::unordered_map debugSaveFileModes = { @@ -186,14 +186,14 @@ static const std::unordered_map debugSaveFileModes = { static const std::unordered_map bootSequenceLabels = { { BOOTSEQUENCE_DEFAULT, "Default" }, { BOOTSEQUENCE_AUTHENTIC, "Authentic" }, - { BOOTSEQUENCE_FILESELECT, "File Select" } + { BOOTSEQUENCE_FILESELECT, "File Select" }, }; static const std::unordered_map enhancementPresetList = { { ENHANCEMENT_PRESET_DEFAULT, "Default" }, { ENHANCEMENT_PRESET_VANILLA_PLUS, "Vanilla Plus" }, { ENHANCEMENT_PRESET_ENHANCED, "Enhanced" }, - { ENHANCEMENT_PRESET_RANDOMIZER, "Randomizer" } + { ENHANCEMENT_PRESET_RANDOMIZER, "Randomizer" }, }; class SohMenu : public Ship::Menu { diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 50242e349..cc104b87d 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -10,7 +10,7 @@ static std::string comboboxTooltip = ""; static int32_t enhancementPresetSelected = ENHANCEMENT_PRESET_DEFAULT; bool isBetaQuestEnabled = false; -static std::unordered_map bunnyHoodEffectMap = {{ BUNNY_HOOD_VANILLA, "Vanilla" }, { BUNNY_HOOD_FAST, "Faster Run" }, { BUNNY_HOOD_FAST_AND_JUMP, "Faster + Longer Jump" }}; +static std::unordered_map bunnyHoodEffectMap = {{ BUNNY_HOOD_VANILLA, "Vanilla" }, { BUNNY_HOOD_FAST, "Faster Run" }, { BUNNY_HOOD_FAST_AND_JUMP, "Faster + Longer Jump" },}; extern "C" { void enableBetaQuest() { isBetaQuestEnabled = true; } diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index cad237336..a0096a0ce 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -14,8 +14,8 @@ namespace SohGui { extern std::shared_ptr mSohMenu; using namespace UIWidgets; -static const std::unordered_map languages = {{ LANGUAGE_ENG, "English" }, { LANGUAGE_GER, "German" }, { LANGUAGE_FRA, "French" }, { LANGUAGE_JPN, "Japanese"}}; -static std::unordered_map imguiScaleOptions = {{ 0, "Small" }, { 1, "Normal" }, { 2, "Large" }, { 3, "X-Large" }}; +static const std::unordered_map languages = {{ LANGUAGE_ENG, "English" }, { LANGUAGE_GER, "German" }, { LANGUAGE_FRA, "French" }, { LANGUAGE_JPN, "Japanese"}, }; +static std::unordered_map imguiScaleOptions = {{ 0, "Small" }, { 1, "Normal" }, { 2, "Large" }, { 3, "X-Large" }, }; const char* GetGameVersionString(uint32_t index) { uint32_t gameVersion = ResourceMgr_GetGameVersion(index); diff --git a/soh/src/code/z_kanfont.c b/soh/src/code/z_kanfont.c index 5cd4e5510..7f474a5bc 100644 --- a/soh/src/code/z_kanfont.c +++ b/soh/src/code/z_kanfont.c @@ -4140,7 +4140,7 @@ const char* msgStaticTbl[] = gFadingMessageBackgroundTex, gMessageContinueTriangleTex, gMessageEndSquareTex, - gMessageArrowTex + gMessageArrowTex, }; // #endregion diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index 7e6d8cee0..7db4538fd 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -663,34 +663,62 @@ static BetterSceneSelectEntry sBetterScenes[] = { }; static BetterSceneSelectGrottoData sBetterGrottos[] = { - { ENTR_GROTTOS_0, ENTR_KOKIRI_FOREST_0, 0, 0x2C, SCENE_KOKIRI_FOREST, { -504.0, 380.0, -1224.0 }}, // Kokiri Forest -> KF Storms Grotto - { ENTR_GROTTOS_0, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, 2, 0x14, SCENE_LOST_WOODS, { 922.0, 0.0, -933.0 }}, // Lost Woods -> LW Near Shortcuts Grotto - { ENTR_GROTTOS_8, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, 0, 0xED, SCENE_SACRED_FOREST_MEADOW, { -201.0, 0.0, 1906.0 }}, // SFM Entryway -> SFM Wolfos Grotto - { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN, 0, 0x00, SCENE_HYRULE_FIELD, { -1428.0, 0.0, 790.0 }}, // Hyrule Field -> HF Near Market Grotto - { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_FENCE_EXIT, 0, 0x03, SCENE_HYRULE_FIELD, { -4026.0, -700.0, 13858.0 }}, // Hyrule Field -> HF Open Grotto - { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_FENCE_EXIT, 0, 0x22, SCENE_HYRULE_FIELD, { -259.0, -500.0, 12356.0 }}, // Hyrule Field -> HF Southeast Grotto - { ENTR_GROTTOS_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, 0, 0x28, SCENE_KAKARIKO_VILLAGE, { 861.0, 80.0, -253.0 }}, // Kak Backyard -> Kak Open Grotto - { ENTR_GROTTOS_3, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, 0, 0xE7, SCENE_KAKARIKO_VILLAGE, { -400.0, 0.0, 408.0 }}, // Kakariko Village -> Kak Redead Grotto - { ENTR_GROTTOS_0, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, 0, 0x57, SCENE_DEATH_MOUNTAIN_TRAIL, { -389.0, 1386.0, -1202.0 }}, // Death Mountain -> DMT Storms Grotto - { ENTR_GROTTOS_0, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, 1, 0x7A, SCENE_DEATH_MOUNTAIN_CRATER, { 50.0, 1233.0, 1776.0 }}, // DMC Upper Nearby -> DMC Upper Grotto - { ENTR_GROTTOS_0, ENTR_ZORAS_RIVER_WATERFALL_EXIT, 0, 0x29, SCENE_ZORAS_RIVER, { 369.0, 570.0, 128.0 }}, // Zora River -> ZR Open Grotto - { ENTR_GROTTOS_2, ENTR_HYRULE_FIELD_FENCE_EXIT, 0, 0xE6, SCENE_HYRULE_FIELD, { -5002.0, -700.0, 13823.0 }}, // Hyrule Field -> HF Inside Fence Grotto - { ENTR_GROTTOS_4, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, 1, 0xF9, SCENE_DEATH_MOUNTAIN_CRATER, { -1703.0, 722.0, -481.0 }}, // DMC Lower Nearby -> DMC Hammer Grotto - { ENTR_GROTTOS_4, ENTR_GORON_CITY_UPPER_EXIT, 3, 0xFB, SCENE_GORON_CITY, { 1091.0, 580.0, -1192.0 }}, // GC Grotto Platform -> GC Grotto - { ENTR_GROTTOS_4, ENTR_LON_LON_RANCH_OUTSIDE_TOWER, 0, 0xFC, SCENE_LON_LON_RANCH, { 1798.0, 0.0, 1498.0 }}, // Lon Lon Ranch -> LLR Grotto - { ENTR_GROTTOS_4, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, 0, 0xEF, SCENE_LAKE_HYLIA, { -3044.0, -1033.0, 6070.0 }}, // Lake Hylia -> LH Grotto - { ENTR_GROTTOS_7, ENTR_LOST_WOODS_NORTH_EXIT, 8, 0xF5, SCENE_LOST_WOODS, { 677.0, 0.0, -2515.0 }}, // LW Beyond Mido -> LW Scrubs Grotto - { ENTR_GROTTOS_10, ENTR_ZORAS_RIVER_WEST_EXIT, 0, 0xEB, SCENE_ZORAS_RIVER, { -1632.0, 100.0, -123.0 }}, // Zora River -> ZR Storms Grotto - { ENTR_GROTTOS_10, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, 0, 0xEE, SCENE_SACRED_FOREST_MEADOW, { 317.0, 480.0, -2303.0 }}, // Sacred Forest Meadow -> SFM Storms Grotto - { ENTR_GROTTOS_10, ENTR_GERUDO_VALLEY_OUTSIDE_TENT, 0, 0xF0, SCENE_GERUDO_VALLEY, { -1321.0, 15.0, -968.0 }}, // GV Fortress Side -> GV Storms Grotto - { ENTR_GROTTOS_10, ENTR_DESERT_COLOSSUS_WARP_PAD, 0, 0xFD, SCENE_DESERT_COLOSSUS, { 71.0, -32.0, -1303.0 }}, // Desert Colossus -> Colossus Grotto - { ENTR_GROTTOS_12, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, 6, 0xF3, SCENE_LOST_WOODS, { 75.0, -20.0, -1596.0 }}, // LW Beyond Mido -> Deku Theater - { ENTR_GROTTOS_1, ENTR_HYRULE_FIELD_STAIRS_EXIT, 0, 0xE5, SCENE_HYRULE_FIELD, { 2059.0, 20.0, -174.0 }}, // Hyrule Field -> HF Near Kak Grotto - { ENTR_GROTTOS_9, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, 0, 0xF6, SCENE_HYRULE_CASTLE, { 986.0, 1571.0, 837.0 }}, // Hyrule Castle Grounds -> HC Storms Grotto - { ENTR_GROTTOS_5, ENTR_HYRULE_FIELD_ROCKY_PATH, 0, 0xE4, SCENE_HYRULE_FIELD, { -7873.0, -300.0, 6916.0 }}, // Hyrule Field -> HF Cow Grotto - { ENTR_GROTTOS_13, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, 0, 0xF8, SCENE_DEATH_MOUNTAIN_TRAIL, { -678.0, 1946.0, -284.0 }}, // Death Mountain Summit -> DMT Cow Grotto - { ENTR_GROTTOS_6, ENTR_GERUDO_VALLEY_EAST_EXIT, 0, 0xF2, SCENE_GERUDO_VALLEY, { 271.0, -555.0, 1465.0 }}, // GV Grotto Ledge -> GV Octorok Grotto - { ENTR_GROTTOS_11, ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN, 0, 0xE1, SCENE_HYRULE_FIELD, { -4945.0, -300.0, 2841.0 }}, // Hyrule Field -> HF Tektite Grotto + // Kokiri Forest -> KF Storms Grotto + { ENTR_GROTTOS_0, ENTR_KOKIRI_FOREST_0, 0, 0x2C, SCENE_KOKIRI_FOREST, { -504.0, 380.0, -1224.0 }}, + // Lost Woods -> LW Near Shortcuts Grotto + { ENTR_GROTTOS_0, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, 2, 0x14, SCENE_LOST_WOODS, { 922.0, 0.0, -933.0 }}, + // SFM Entryway -> SFM Wolfos Grotto + { ENTR_GROTTOS_8, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, 0, 0xED, SCENE_SACRED_FOREST_MEADOW, { -201.0, 0.0, 1906.0 }}, + // Hyrule Field -> HF Near Market Grotto + { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN, 0, 0x00, SCENE_HYRULE_FIELD, { -1428.0, 0.0, 790.0 }}, + // Hyrule Field -> HF Open Grotto + { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_FENCE_EXIT, 0, 0x03, SCENE_HYRULE_FIELD, { -4026.0, -700.0, 13858.0 }}, + // Hyrule Field -> HF Southeast Grotto + { ENTR_GROTTOS_0, ENTR_HYRULE_FIELD_FENCE_EXIT, 0, 0x22, SCENE_HYRULE_FIELD, { -259.0, -500.0, 12356.0 }}, + // Kak Backyard -> Kak Open Grotto + { ENTR_GROTTOS_0, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, 0, 0x28, SCENE_KAKARIKO_VILLAGE, { 861.0, 80.0, -253.0 }}, + // Kakariko Village -> Kak Redead Grotto + { ENTR_GROTTOS_3, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, 0, 0xE7, SCENE_KAKARIKO_VILLAGE, { -400.0, 0.0, 408.0 }}, + // Death Mountain -> DMT Storms Grotto + { ENTR_GROTTOS_0, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, 0, 0x57, SCENE_DEATH_MOUNTAIN_TRAIL, { -389.0, 1386.0, -1202.0 }}, + // DMC Upper Nearby -> DMC Upper Grotto + { ENTR_GROTTOS_0, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, 1, 0x7A, SCENE_DEATH_MOUNTAIN_CRATER, { 50.0, 1233.0, 1776.0 }}, + // Zora River -> ZR Open Grotto + { ENTR_GROTTOS_0, ENTR_ZORAS_RIVER_WATERFALL_EXIT, 0, 0x29, SCENE_ZORAS_RIVER, { 369.0, 570.0, 128.0 }}, + // Hyrule Field -> HF Inside Fence Grotto + { ENTR_GROTTOS_2, ENTR_HYRULE_FIELD_FENCE_EXIT, 0, 0xE6, SCENE_HYRULE_FIELD, { -5002.0, -700.0, 13823.0 }}, + // DMC Lower Nearby -> DMC Hammer Grotto + { ENTR_GROTTOS_4, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, 1, 0xF9, SCENE_DEATH_MOUNTAIN_CRATER, { -1703.0, 722.0, -481.0 }}, + // GC Grotto Platform -> GC Grotto + { ENTR_GROTTOS_4, ENTR_GORON_CITY_UPPER_EXIT, 3, 0xFB, SCENE_GORON_CITY, { 1091.0, 580.0, -1192.0 }}, + // Lon Lon Ranch -> LLR Grotto + { ENTR_GROTTOS_4, ENTR_LON_LON_RANCH_OUTSIDE_TOWER, 0, 0xFC, SCENE_LON_LON_RANCH, { 1798.0, 0.0, 1498.0 }}, + // Lake Hylia -> LH Grotto + { ENTR_GROTTOS_4, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, 0, 0xEF, SCENE_LAKE_HYLIA, { -3044.0, -1033.0, 6070.0 }}, + // LW Beyond Mido -> LW Scrubs Grotto + { ENTR_GROTTOS_7, ENTR_LOST_WOODS_NORTH_EXIT, 8, 0xF5, SCENE_LOST_WOODS, { 677.0, 0.0, -2515.0 }}, + // Zora River -> ZR Storms Grotto + { ENTR_GROTTOS_10, ENTR_ZORAS_RIVER_WEST_EXIT, 0, 0xEB, SCENE_ZORAS_RIVER, { -1632.0, 100.0, -123.0 }}, + // Sacred Forest Meadow -> SFM Storms Grotto + { ENTR_GROTTOS_10, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, 0, 0xEE, SCENE_SACRED_FOREST_MEADOW, { 317.0, 480.0, -2303.0 }}, + // GV Fortress Side -> GV Storms Grotto + { ENTR_GROTTOS_10, ENTR_GERUDO_VALLEY_OUTSIDE_TENT, 0, 0xF0, SCENE_GERUDO_VALLEY, { -1321.0, 15.0, -968.0 }}, + // Desert Colossus -> Colossus Grotto + { ENTR_GROTTOS_10, ENTR_DESERT_COLOSSUS_WARP_PAD, 0, 0xFD, SCENE_DESERT_COLOSSUS, { 71.0, -32.0, -1303.0 }}, + // LW Beyond Mido -> Deku Theater + { ENTR_GROTTOS_12, ENTR_LOST_WOODS_TUNNEL_SHORTCUT, 6, 0xF3, SCENE_LOST_WOODS, { 75.0, -20.0, -1596.0 }}, + // Hyrule Field -> HF Near Kak Grotto + { ENTR_GROTTOS_1, ENTR_HYRULE_FIELD_STAIRS_EXIT, 0, 0xE5, SCENE_HYRULE_FIELD, { 2059.0, 20.0, -174.0 }}, + // Hyrule Castle Grounds -> HC Storms Grotto + { ENTR_GROTTOS_9, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, 0, 0xF6, SCENE_HYRULE_CASTLE, { 986.0, 1571.0, 837.0 }}, + // Hyrule Field -> HF Cow Grotto + { ENTR_GROTTOS_5, ENTR_HYRULE_FIELD_ROCKY_PATH, 0, 0xE4, SCENE_HYRULE_FIELD, { -7873.0, -300.0, 6916.0 }}, + // Death Mountain Summit -> DMT Cow Grotto + { ENTR_GROTTOS_13, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, 0, 0xF8, SCENE_DEATH_MOUNTAIN_TRAIL, { -678.0, 1946.0, -284.0 }}, + // GV Grotto Ledge -> GV Octorok Grotto + { ENTR_GROTTOS_6, ENTR_GERUDO_VALLEY_EAST_EXIT, 0, 0xF2, SCENE_GERUDO_VALLEY, { 271.0, -555.0, 1465.0 }}, + // Hyrule Field -> HF Tektite Grotto + { ENTR_GROTTOS_11, ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN, 0, 0xE1, SCENE_HYRULE_FIELD, { -4945.0, -300.0, 2841.0 }}, }; void Select_UpdateMenu(SelectContext* this) { From ae209709ea2e8404bf023f0471ad3170682864ab Mon Sep 17 00:00:00 2001 From: Archez Date: Sun, 30 Mar 2025 19:24:59 -0400 Subject: [PATCH 176/267] Default VSync on to match LUS default (#5261) --- soh/soh/SohGui/SohMenuSettings.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index a0096a0ce..43bc3c8dc 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -334,7 +334,9 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Enable Vsync", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_VSYNC_ENABLED) .PreFunc([](WidgetInfo& info) { info.isHidden = mSohMenu->disabledMap.at(DISABLE_FOR_NO_VSYNC).active; }) - .Options(CheckboxOptions().Tooltip("Removes tearing, but clamps your max FPS to your displays refresh rate.")); + .Options(CheckboxOptions() + .Tooltip("Removes tearing, but clamps your max FPS to your displays refresh rate.") + .DefaultValue(true)); AddWidget(path, "Windowed Fullscreen", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SDL_WINDOWED_FULLSCREEN) .PreFunc([](WidgetInfo& info) { From 35d17b8b0b5eaa6eb30e5c3ec16e68894dd40245 Mon Sep 17 00:00:00 2001 From: xxAtrain223 Date: Mon, 31 Mar 2025 00:18:42 -0500 Subject: [PATCH 177/267] Available Randomizer Checks (#5091) * Calculate accessible checks and show them in the check tracker. * Added added DoorUnlocked checks to the Fire Temple doors. This is needed when calculating Accessible checks while playing and using small keys. Otherwise checks will appear unaccessible because Keys have been used. * Changed RecalculateAccessibleChecks to use the logic ReachabilitySearch. * Reverted DoorUnlocked changes. * Added recalculate_accessible_checks debug console command. * Skip CanBuy check when calculating accessible checks, it spoils that some items can't be bought with the current wallet. * Set RAND_INF_ZELDAS_LETTER. * Don't add locations to the pool when calculating accessible checks. * Save and Load randomizer trick options. * Get the number of used small keys. * Added check if bean was planted. * Show number of Accessible checks in each Area. * Accounted for missing RG_POCKET_CUCCO in logic HasItem and ApplyItemEffect. * Show accessible checks via an icon. * Check shop price against current wallet. * Recalculate Accessible Checks in CheckTrackerLoadGame instead of LoadFile. * RecalculateAccessibleChecks on save. * Don't unset Zelda's Letter. * Added Only Show Available Checks checkbox. * Rename Accessible Checks to Available Checks. * Added option to Enable Available Checks. * Remove debug console to recalculate available checks, this can now be done by toggling Enable Available Checks in the settings. * Remove extra requiredTrial. * Default "Hide unshuffled shop item checks" unchecked. * Updated GetSmallKeyCount to return int8_t. * Default AmmoDrop to true until the setting is implemented. * Fixed Sleeping Waterfall timesaver. * Updated Only Show Available Checks to let Show Hidden Items reveal hidden available checks. * Revert "Don't unset Zelda's Letter." This reverts commit 4b5903940f18a20b69620f3741760fd19ac3876f. * Set RAND_INF_ZELDAS_LETTER. * Revert "Fixed Sleeping Waterfall timesaver." This reverts commit 9b62fd5297cf5bf778ba26bd593c4728c9038be8. * Added isMagicAcquired to Logic::HasItem. * GetDungeonSmallKeyDoors return static emptyVector. * Comment out AmmoCanDrop in ResetLogic. * Added location_access CanBuy todo. * Reverted Get and Set SmallKeyCount to use uint8_t and handled -1 keys. * Added todo for MQ Water GetUsedSmallKeyCount. --- .../Enhancements/debugger/debugSaveEditor.h | 3 + .../debugger/performanceTimer.cpp | 4 + .../Enhancements/debugger/performanceTimer.h | 2 + .../Enhancements/randomizer/3drando/fill.cpp | 20 +- .../Enhancements/randomizer/3drando/fill.hpp | 4 +- .../Enhancements/randomizer/hook_handlers.cpp | 9 + .../Enhancements/randomizer/item_location.cpp | 9 + .../Enhancements/randomizer/item_location.h | 3 + .../randomizer/location_access.cpp | 78 ++++++- .../Enhancements/randomizer/location_access.h | 2 +- soh/soh/Enhancements/randomizer/logic.cpp | 122 ++++++++++- soh/soh/Enhancements/randomizer/logic.h | 2 +- .../randomizer/randomizer_check_tracker.cpp | 194 ++++++++++++++++-- .../randomizer/randomizer_check_tracker.h | 1 + soh/soh/Enhancements/randomizer/savefile.cpp | 3 +- soh/soh/SaveManager.cpp | 12 +- 16 files changed, 432 insertions(+), 36 deletions(-) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index b99931a6e..04e01917d 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -1164,6 +1164,9 @@ const std::vector flagTables = { { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, + { RAND_INF_ZELDAS_LETTER, "RAND_INF_ZELDAS_LETTER" }, + { RAND_INF_WEIRD_EGG, "RAND_INF_WEIRD_EGG" }, + { RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE" }, { RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, "RAND_INF_KF_NORTH_GRASS_WEST_RUPEE" }, { RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, "RAND_INF_KF_NORTH_GRASS_EAST_RUPEE" }, diff --git a/soh/soh/Enhancements/debugger/performanceTimer.cpp b/soh/soh/Enhancements/debugger/performanceTimer.cpp index 69ffc6925..54e1cb983 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.cpp +++ b/soh/soh/Enhancements/debugger/performanceTimer.cpp @@ -12,6 +12,10 @@ std::chrono::duration GetPerformanceTimer(TimerID timer){ return totalTimes[timer]; } +void ResetPerformanceTimer(TimerID timer) { + totalTimes[timer] = {}; +} + void ResetPerformanceTimers(){ totalTimes = {}; } \ No newline at end of file diff --git a/soh/soh/Enhancements/debugger/performanceTimer.h b/soh/soh/Enhancements/debugger/performanceTimer.h index f4bc8f017..b94ab5f6d 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.h +++ b/soh/soh/Enhancements/debugger/performanceTimer.h @@ -25,12 +25,14 @@ typedef enum { PT_TOD_ACCESS, PT_ENTRANCE_LOGIC, PT_LOCATION_LOGIC, + PT_RECALCULATE_AVAILABLE_CHECKS, PT_MAX } TimerID; void StartPerformanceTimer(TimerID timer); void StopPerformanceTimer(TimerID timer); std::chrono::duration GetPerformanceTimer(TimerID timer); +void ResetPerformanceTimer(TimerID timer); void ResetPerformanceTimers(); static std::array, PT_MAX> totalTimes = {}; static std::array timeStarted = {}; diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 56675d41d..356bc507b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -402,7 +402,13 @@ bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals Rando::ItemLocation* location = ctx->GetItemLocation(loc); RandomizerGet locItem = location->GetPlacedRandomizerGet(); - if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion)) { + if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, gals.calculatingAvailableChecks)) { + if (gals.calculatingAvailableChecks) { + gals.accessibleLocations.push_back(loc); + StopPerformanceTimer(PT_LOCATION_LOGIC); + return false; + } + location->AddToPool(); if (locItem == RG_NONE) { @@ -498,19 +504,23 @@ void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, Randomize } // Return any of the targetLocations that are accessible in logic -std::vector ReachabilitySearch(const std::vector& targetLocations, RandomizerGet ignore /* = RG_NONE*/) { +std::vector ReachabilitySearch(const std::vector& targetLocations, RandomizerGet ignore /* = RG_NONE*/, bool calculatingAvailableChecks /* = false */) { auto ctx = Rando::Context::GetInstance(); GetAccessibleLocationsStruct gals(0); - ResetLogic(ctx, gals, true); + gals.calculatingAvailableChecks = calculatingAvailableChecks; + ResetLogic(ctx, gals, !calculatingAvailableChecks); do { gals.InitLoop(); for (size_t i = 0; i < gals.regionPool.size(); i++) { ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore); } } while (gals.logicUpdated); - erase_if(gals.accessibleLocations, [&targetLocations, ctx](RandomizerCheck loc){ + erase_if(gals.accessibleLocations, [&targetLocations, ctx, calculatingAvailableChecks](RandomizerCheck loc) { + if (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE && !calculatingAvailableChecks) { + return false; + } for (RandomizerCheck allowedLocation : targetLocations) { - if (loc == allowedLocation || ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE) { + if (loc == allowedLocation) { return false; } } diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index 106af7aab..bb013cc13 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -34,6 +34,8 @@ struct GetAccessibleLocationsStruct { std::vector itemSphere; std::list entranceSphere; + bool calculatingAvailableChecks = false; + GetAccessibleLocationsStruct(int _maxGsCount){ regionPool = {RR_ROOT}; gsCount = 0; @@ -62,7 +64,7 @@ std::vector GetEmptyLocations(std::vector allo void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, bool stopOnBeatable = false, bool addToPlaythrough = false); -std::vector ReachabilitySearch(const std::vector& allowedLocations, RandomizerGet ignore=RG_NONE); +std::vector ReachabilitySearch(const std::vector& allowedLocations, RandomizerGet ignore=RG_NONE, bool calculatingAvailableChecks=false); void GeneratePlaythrough(); diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index c3500edc0..a3088aabc 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -236,6 +236,14 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN); } + if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_OBTAINED_ZELDAS_LETTER) { + Flags_SetRandomizerInf(RAND_INF_ZELDAS_LETTER); + } + + if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_OBTAINED_POCKET_EGG) { + Flags_SetRandomizerInf(RAND_INF_WEIRD_EGG); + } + RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag); if (rc == RC_UNKNOWN_CHECK) return; @@ -351,6 +359,7 @@ void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { loc->SetCheckStatus(RCSHOW_COLLECTED); CheckTracker::SpoilAreaFromCheck(randomizerQueuedCheck); CheckTracker::RecalculateAllAreaTotals(); + CheckTracker::RecalculateAvailableChecks(); SaveManager::Instance->SaveSection(gSaveContext.fileNum, SECTION_ID_TRACKER_DATA, true); randomizerQueuedCheck = RC_UNKNOWN_CHECK; randomizerQueuedItemEntry = GET_ITEM_NONE; diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index 00e0366ab..cfdfb4204 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -228,5 +228,14 @@ void ItemLocation::ResetVariables() { areas = {}; status = RCSHOW_UNCHECKED; isSkipped = false; + isAvailable = false; +} + +bool ItemLocation::IsAvailable() const { + return isAvailable; +} + +void ItemLocation::SetAvailable(bool isAvailable_) { + isAvailable = isAvailable_; } } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_location.h b/soh/soh/Enhancements/randomizer/item_location.h index 142ac1c0b..e60d358eb 100644 --- a/soh/soh/Enhancements/randomizer/item_location.h +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -56,6 +56,8 @@ class ItemLocation { bool IsFoolishCandidate() const; void SetBarrenCandidate(); void ResetVariables(); + bool IsAvailable() const; + void SetAvailable(bool isAvailable_); private: RandomizerCheck rc; @@ -76,5 +78,6 @@ class ItemLocation { bool barrenCandidate = false; RandomizerCheckStatus status = RCSHOW_UNCHECKED; bool isSkipped = false; + bool isAvailable = false; }; } // 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 33abc3ce8..e2781e9fb 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -11,6 +11,11 @@ #include +extern "C" { + extern SaveContext gSaveContext; + extern PlayState* gPlayState; +} + //generic grotto event list std::vector grottoEvents; @@ -27,7 +32,7 @@ bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const { return GetConditionsMet(); } -bool LocationAccess::ConditionsMet(Region* parentRegion) const { +bool LocationAccess::ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const { //WARNING enterance validation can run this after resetting the access for sphere 0 validation //When refactoring ToD access, either fix the above or do not assume that we //have any access at all just because this is being run @@ -41,8 +46,8 @@ bool LocationAccess::ConditionsMet(Region* parentRegion) const { ) { conditionsMet = true; } - - return conditionsMet && CanBuy(); + + return conditionsMet && (calculatingAvailableChecks || CanBuy()); // TODO: run CanBuy when price is known due to settings } bool LocationAccess::CanBuy() const { @@ -224,8 +229,73 @@ bool MQSpiritSharedBrokenWallRoom(const RandomizerRegion region, ConditionFn con return areaTable[region].MQSpiritShared(condition, true, anyAge); } +bool BeanPlanted(const RandomizerRegion region) { + // swchFlag found using the Actor Viewer to get the Obj_Bean parameters & 0x3F + // not tested with multiple OTRs, but can be automated similarly to GetDungeonSmallKeyDoors + SceneID sceneID; + uint8_t swchFlag; + switch (region) { + case RR_ZORAS_RIVER: + sceneID = SceneID::SCENE_ZORAS_RIVER; + swchFlag = 3; + break; + case RR_THE_GRAVEYARD: + sceneID = SceneID::SCENE_GRAVEYARD; + swchFlag = 3; + break; + case RR_KOKIRI_FOREST: + sceneID = SceneID::SCENE_KOKIRI_FOREST; + swchFlag = 9; + break; + case RR_THE_LOST_WOODS: + sceneID = SceneID::SCENE_LOST_WOODS; + swchFlag = 4; + break; + case RR_LW_BEYOND_MIDO: + sceneID = SceneID::SCENE_LOST_WOODS; + swchFlag = 18; + break; + case RR_DEATH_MOUNTAIN_TRAIL: + sceneID = SceneID::SCENE_DEATH_MOUNTAIN_TRAIL; + swchFlag = 6; + break; + case RR_LAKE_HYLIA: + sceneID = SceneID::SCENE_LAKE_HYLIA; + swchFlag = 1; + break; + case RR_GERUDO_VALLEY: + sceneID = SceneID::SCENE_GERUDO_VALLEY; + swchFlag = 3; + break; + case RR_DMC_CENTRAL_LOCAL: + sceneID = SceneID::SCENE_DEATH_MOUNTAIN_CRATER; + swchFlag = 3; + break; + case RR_DESERT_COLOSSUS: + sceneID = SceneID::SCENE_DESERT_COLOSSUS; + swchFlag = 24; + break; + default: + sceneID = SCENE_ID_MAX; + swchFlag = 0; + break; + } + + // Get the swch value for the scene + uint32_t swch; + if (gPlayState != nullptr && gPlayState->sceneNum == sceneID) { + swch = gPlayState->actorCtx.flags.swch; + } else if (sceneID != SCENE_ID_MAX) { + swch = gSaveContext.sceneFlags[sceneID].swch; + } else { + swch = 0; + } + + return swch >> swchFlag & 1; +} + bool CanPlantBean(const RandomizerRegion region) { - return areaTable[region].CanPlantBeanCheck(); + return areaTable[region].CanPlantBeanCheck() || BeanPlanted(region); } bool BothAges(const RandomizerRegion region) { diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 986d08d6a..ad7061963 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -75,7 +75,7 @@ class LocationAccess { bool CheckConditionAtAgeTime(bool& age, bool& time) const; - bool ConditionsMet(Region* parentRegion) const; + bool ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const; RandomizerCheck GetLocation() const { return location; diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 836a817c4..43ff3ce56 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -13,6 +13,11 @@ #include "macros.h" #include "variables.h" #include +#include "StringHelper.h" +#include "soh/resource/type/Scene.h" +#include "soh/resource/type/scenecommand/SetTransitionActorList.h" +#include "src/overlays/actors/ovl_En_Door/z_en_door.h" +#include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h" namespace Rando { @@ -87,7 +92,7 @@ namespace Rando { case RG_BOMB_BAG: return CurrentUpgrade(UPG_BOMB_BAG); case RG_MAGIC_SINGLE: - return GetSaveContext()->magicLevel >= 1; + return GetSaveContext()->magicLevel >= 1 || GetSaveContext()->isMagicAcquired; // Songs case RG_ZELDAS_LULLABY: case RG_EPONAS_SONG: @@ -217,6 +222,7 @@ namespace Rando { case RG_GOLDEN_SCALE: return CurrentUpgrade(UPG_SCALE) >= 2; case RG_POCKET_EGG: + return CheckRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); case RG_COJIRO: case RG_ODD_MUSHROOM: case RG_ODD_POTION: @@ -226,7 +232,7 @@ namespace Rando { case RG_EYEBALL_FROG: case RG_EYEDROPS: case RG_CLAIM_CHECK: - return CheckRandoInf(itemName - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); + return CheckRandoInf(itemName - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO); case RG_BOTTLE_WITH_BIG_POE: case RG_BOTTLE_WITH_BLUE_FIRE: case RG_BOTTLE_WITH_BLUE_POTION: @@ -1509,6 +1515,8 @@ namespace Rando { mSaveContext->isDoubleDefenseAcquired = state; break; case RG_POCKET_EGG: + SetRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); + break; case RG_COJIRO: case RG_ODD_MUSHROOM: case RG_ODD_POTION: @@ -1518,7 +1526,7 @@ namespace Rando { case RG_EYEBALL_FROG: case RG_EYEDROPS: case RG_CLAIM_CHECK: - SetRandoInf(randoGet - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); + SetRandoInf(randoGet - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO, state); break; case RG_PROGRESSIVE_HOOKSHOT: { @@ -2096,8 +2104,111 @@ namespace Rando { } } + std::unordered_map SceneToDungeon = { + { SceneID::SCENE_DEKU_TREE, DungeonKey::DEKU_TREE }, + { SceneID::SCENE_DODONGOS_CAVERN, DungeonKey::DODONGOS_CAVERN }, + { SceneID::SCENE_JABU_JABU, DungeonKey::JABU_JABUS_BELLY }, + { SceneID::SCENE_FOREST_TEMPLE, DungeonKey::FOREST_TEMPLE }, + { SceneID::SCENE_FIRE_TEMPLE, DungeonKey::FIRE_TEMPLE }, + { SceneID::SCENE_WATER_TEMPLE, DungeonKey::WATER_TEMPLE }, + { SceneID::SCENE_SPIRIT_TEMPLE, DungeonKey::SPIRIT_TEMPLE }, + { SceneID::SCENE_SHADOW_TEMPLE, DungeonKey::SHADOW_TEMPLE }, + { SceneID::SCENE_BOTTOM_OF_THE_WELL, DungeonKey::BOTTOM_OF_THE_WELL }, + { SceneID::SCENE_ICE_CAVERN, DungeonKey::ICE_CAVERN }, + { SceneID::SCENE_GERUDO_TRAINING_GROUND, DungeonKey::GERUDO_TRAINING_GROUND }, + { SceneID::SCENE_INSIDE_GANONS_CASTLE, DungeonKey::GANONS_CASTLE }, + }; + + // Get the swch bit positions for the dungeon + const std::vector& GetDungeonSmallKeyDoors(SceneID sceneId) { + static const std::vector emptyVector; + auto foundDungeon = SceneToDungeon.find(static_cast(sceneId)); + if (foundDungeon == SceneToDungeon.end()) { + return emptyVector; + } + + bool masterQuest = Rando::Context::GetInstance()->GetDungeon(foundDungeon->second)->IsMQ(); + + // Create a unique key for the dungeon and master quest + uint8_t key = sceneId | (masterQuest << 7); + + static std::unordered_map> dungeonSmallKeyDoors; + auto foundEntry = dungeonSmallKeyDoors.find(key); + if (foundEntry != dungeonSmallKeyDoors.end()) { + return foundEntry->second; + } + dungeonSmallKeyDoors[key] = {}; + + // Get the scene path + SceneTableEntry* sceneTableEntry = &gSceneTable[sceneId]; + std::string scenePath = StringHelper::Sprintf("scenes/%s/%s/%s", masterQuest ? "mq" : "nonmq", + sceneTableEntry->sceneFile.fileName, sceneTableEntry->sceneFile.fileName); + + // Load the scene + std::shared_ptr scene = std::dynamic_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(scenePath)); + if (scene == nullptr) { + return emptyVector; + } + + // Find the SetTransitionActorList command + std::shared_ptr transitionActorListCommand = nullptr; + for (auto& command : scene->commands) { + if (command->cmdId == SOH::SceneCommandID::SetTransitionActorList) { + transitionActorListCommand = std::dynamic_pointer_cast(command); + break; + } + } + if (transitionActorListCommand == nullptr) { + return emptyVector; + } + + // Find the bit position for the small key doors + for (auto& transitionActor : transitionActorListCommand->transitionActorList) { + if (transitionActor.id == ACTOR_EN_DOOR) { + uint8_t doorType = (transitionActor.params >> 7) & 7; + if (doorType == DOOR_LOCKED) { + dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); + } + } else if (transitionActor.id == ACTOR_DOOR_SHUTTER) { + uint8_t doorType = (transitionActor.params >> 7) & 15; + if (doorType == SHUTTER_BACK_LOCKED || doorType == SHUTTER_BOSS || doorType == SHUTTER_KEY_LOCKED) { + dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); + } + } + } + + return dungeonSmallKeyDoors[key]; + } + + int8_t GetUsedSmallKeyCount(SceneID sceneId) { + const auto& smallKeyDoors = GetDungeonSmallKeyDoors(sceneId); + + // Get the swch value for the scene + uint32_t swch; + if (gPlayState != nullptr && gPlayState->sceneNum == sceneId) { + swch = gPlayState->actorCtx.flags.swch; + } else { + swch = gSaveContext.sceneFlags[sceneId].swch; + } + + // Count the number of small keys doors unlocked + int8_t unlockedSmallKeyDoors = 0; + for (auto& smallKeyDoor : smallKeyDoors) { + unlockedSmallKeyDoors += swch >> smallKeyDoor & 1; + } + + // RANDOTODO: Account for MQ Water trick that causes the basement lock to unlock when the player clears the stalfos pit. + return unlockedSmallKeyDoors; + } + uint8_t Logic::GetSmallKeyCount(uint32_t dungeonIndex) { - return mSaveContext->inventory.dungeonKeys[dungeonIndex]; + int8_t dungeonKeys = mSaveContext->inventory.dungeonKeys[dungeonIndex]; + if (dungeonKeys == -1) { + // never got keys, so can't have used keys + return 0; + } + return dungeonKeys + GetUsedSmallKeyCount(SceneID(dungeonIndex)); } void Logic::SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count) { @@ -2172,7 +2283,8 @@ namespace Rando { IsKeysanity = ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE); - AmmoCanDrop = /*AmmoDrops.IsNot(AMMODROPS_NONE) TODO: AmmoDrop setting*/ true; + + //AmmoCanDrop = /*AmmoDrops.IsNot(AMMODROPS_NONE)*/ false; TODO: AmmoDrop setting //Child item logic SkullMask = false; diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 2f68017e2..5b0922d6e 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -90,7 +90,7 @@ class Logic { bool FairyPot = false; bool FreeFairies = false; bool FairyPond = false; - bool AmmoCanDrop = false; + bool AmmoCanDrop = true; uint8_t PieceOfHeart = 0; uint8_t HeartContainer = 0; diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 80aeead5c..270bdbb7f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -9,7 +9,10 @@ #include "soh/SohGui/UIWidgets.hpp" #include "soh/SohGui/SohGui.hpp" #include "dungeon.h" +#include "entrance.h" #include "location_access.h" +#include "3drando/fill.hpp" +#include "soh/Enhancements/debugger/performanceTimer.h" #include #include @@ -84,7 +87,7 @@ bool fishsanityAgeSplit; bool initialized; bool doAreaScroll; bool previousShowHidden = false; -bool hideShopUnshuffledChecks = true; +bool hideShopUnshuffledChecks = false; bool alwaysShowGS = false; std::map startingShopItem = { { SCENE_KOKIRI_SHOP, RC_KF_SHOP_ITEM_1 }, @@ -132,8 +135,10 @@ bool areasFullyChecked[RCAREA_INVALID]; u32 areasSpoiled = 0; bool showVOrMQ; s8 areaChecksGotten[RCAREA_INVALID]; //| "Kokiri Forest (4/9)" +s8 areaChecksAvailable[RCAREA_INVALID]; s8 areaCheckTotals[RCAREA_INVALID]; uint16_t totalChecks = 0; +uint16_t totalChecksAvailable = 0; uint16_t totalChecksGotten = 0; bool optCollapseAll; // A bool that will collapse all checks once bool optExpandAll; // A bool that will expand all checks once @@ -166,6 +171,8 @@ bool hideCollected = false; bool showHidden = true; bool mystery = false; bool showLogicTooltip = false; +bool enableAvailableChecks = false; +bool onlyShowAvailable = false; SceneID DungeonSceneLookupByArea(RandomizerCheckArea area) { switch (area) { @@ -235,10 +242,12 @@ void TrySetAreas() { void CalculateTotals() { totalChecks = 0; + totalChecksAvailable = 0; totalChecksGotten = 0; for (uint8_t i = 0; i < RCAREA_INVALID; i++) { totalChecks += areaCheckTotals[i]; + totalChecksAvailable += areaChecksAvailable[i]; totalChecksGotten += areaChecksGotten[i]; } } @@ -251,17 +260,43 @@ uint16_t GetTotalChecksGotten() { return totalChecksGotten; } +bool IsCheckHidden(RandomizerCheck rc) { + Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + RandomizerCheckStatus status = itemLocation->GetCheckStatus(); + bool available = itemLocation->IsAvailable(); + bool skipped = itemLocation->GetIsSkipped(); + bool obtained = itemLocation->HasObtained(); + bool seen = status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED; + bool scummed = status == RCSHOW_SCUMMED; + bool unchecked = status == RCSHOW_UNCHECKED; + + return !showHidden && ( + (skipped && hideSkipped) || + (seen && hideSeen) || + (scummed && hideScummed) || + (unchecked && hideUnchecked) + ); +} + void RecalculateAreaTotals(RandomizerCheckArea rcArea) { areaChecksGotten[rcArea] = 0; + areaChecksAvailable[rcArea] = 0; areaCheckTotals[rcArea] = 0; for (auto rc : checksByArea.at(rcArea)) { if (!IsVisibleInCheckTracker(rc)) { continue; } areaCheckTotals[rcArea]++; - if (OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetIsSkipped() || OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->HasObtained()) { + + Rando::ItemLocation* itemLoc = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + + if (itemLoc->GetIsSkipped() || itemLoc->HasObtained()) { areaChecksGotten[rcArea]++; } + + if (itemLoc->IsAvailable() && !IsCheckHidden(rc)) { + areaChecksAvailable[rcArea]++; + } } CalculateTotals(); } @@ -308,6 +343,7 @@ void SetCheckCollected(RandomizerCheck rc) { if (IsVisibleInCheckTracker(rc)) { if (!OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetIsSkipped()) { areaChecksGotten[loc->GetArea()]++; + areaChecksAvailable[loc->GetArea()]--; } else { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); } @@ -424,10 +460,12 @@ void ClearAreaChecksAndTotals() { for (auto& [rcArea, vec] : checksByArea) { vec.clear(); areaChecksGotten[rcArea] = 0; + areaChecksAvailable[rcArea] = 0; areaCheckTotals[rcArea] = 0; } totalChecks = 0; totalChecksGotten = 0; + totalChecksAvailable = 0; } void SetShopSeen(uint32_t sceneNum, bool prices) { @@ -469,6 +507,9 @@ void CheckTrackerLoadGame(int32_t fileNum) { if (loc->GetCheckStatus() == RCSHOW_SAVED || loc->GetIsSkipped()) { areaChecksGotten[entry2->GetArea()]++; } + if (loc->IsAvailable()) { + areaChecksAvailable[entry2->GetArea()]++; + } } if (areaChecksGotten[entry2->GetArea()] != 0 || RandomizerCheckObjects::AreaIsOverworld(entry2->GetArea()) || @@ -524,6 +565,7 @@ void CheckTrackerLoadGame(int32_t fileNum) { UpdateAllOrdering(); UpdateInventoryChecks(); UpdateFilters(); + RecalculateAvailableChecks(); } void CheckTrackerShopSlotChange(uint8_t cursorSlot, int16_t basePrice) { @@ -539,6 +581,7 @@ void CheckTrackerShopSlotChange(uint8_t cursorSlot, int16_t basePrice) { if (status == RCSHOW_SEEN) { OTRGlobals::Instance->gRandoContext->GetItemLocation(slot)->SetCheckStatus(RCSHOW_IDENTIFIED); SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); + RecalculateAvailableChecks(); } } @@ -812,6 +855,9 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { SaveTrackerData(saveContext, sectionID, fullSave); + if (fullSave) { + RecalculateAvailableChecks(); + } } void LoadFile() { @@ -882,6 +928,8 @@ void CheckTrackerWindow::DrawElement() { showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); + enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); + onlyShowAvailable = CVarGetInteger(CVAR_TRACKER_CHECK("OnlyShowAvailable"), 0); hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); @@ -932,9 +980,21 @@ void CheckTrackerWindow::DrawElement() { ImGui::TableNextRow(0, headerHeight); ImGui::TableNextColumn(); - UIWidgets::CVarCheckbox( - "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), UIWidgets::CheckboxOptions({{ .tooltip = "When active, items will show hidden checks by default when updated to this state." }}) - .Color(THEME_COLOR)); + if (UIWidgets::CVarCheckbox( + "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), UIWidgets::CheckboxOptions({{.tooltip = "When active, items will show hidden checks by default when updated to this state." }}) + .Color(THEME_COLOR))) { + doAreaScroll = true; + showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); + RecalculateAllAreaTotals(); + } + if (enableAvailableChecks) { + if (UIWidgets::CVarCheckbox( + "Only Show Available Checks", CVAR_TRACKER_CHECK("OnlyShowAvailable"), UIWidgets::CheckboxOptions({{ .tooltip = "When active, unavailable checks will be hidden." }}) + .Color(THEME_COLOR))) { + doAreaScroll = true; + RecalculateAllAreaTotals(); + } + } UIWidgets::PaddedSeparator(); if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { optCollapseAll = false; @@ -960,7 +1020,13 @@ void CheckTrackerWindow::DrawElement() { ImGui::Separator(); - ImGui::Text("Total Checks: %d / %d", totalChecksGotten, totalChecks); + std::ostringstream totalChecksSS; + totalChecksSS << "Total Checks: "; + if (enableAvailableChecks) { + totalChecksSS << totalChecksAvailable << " Available / "; + } + totalChecksSS << totalChecksGotten << " Checked / " << totalChecks << " Total"; + ImGui::Text(totalChecksSS.str().c_str()); UIWidgets::PaddedSeparator(); @@ -1012,7 +1078,8 @@ void CheckTrackerWindow::DrawElement() { doAreaScroll = true; } if ((shouldHideFilteredAreas && filterAreasHidden[rcArea]) || - (!showHidden && ((hideComplete && thisAreaFullyChecked) || (hideIncomplete && !thisAreaFullyChecked))) + (!showHidden && ((hideComplete && thisAreaFullyChecked) || (hideIncomplete && !thisAreaFullyChecked))) || + (enableAvailableChecks && onlyShowAvailable && areaChecksAvailable[rcArea] == 0) ) { doDraw = false; } else { @@ -1051,14 +1118,27 @@ void CheckTrackerWindow::DrawElement() { isThisAreaSpoiled = IsAreaSpoiled(rcArea) || mqSpoilers; if (isThisAreaSpoiled) { - if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) { - if (OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(DungeonSceneLookupByArea(rcArea))->IsMQ()) - ImGui::Text("(%d/%d) - MQ", areaChecksGotten[rcArea], areaCheckTotals[rcArea]); - else - ImGui::Text("(%d/%d) - Vanilla", areaChecksGotten[rcArea], areaCheckTotals[rcArea]); - } else { - ImGui::Text("(%d/%d)", areaChecksGotten[rcArea], areaCheckTotals[rcArea]); + std::ostringstream areaTotalsSS; + std::ostringstream areaTotalsTooltipSS; + + areaTotalsSS << "("; + if (enableAvailableChecks) { + areaTotalsSS << static_cast(areaChecksAvailable[rcArea]) << " / "; + areaTotalsTooltipSS << "Available / "; } + areaTotalsSS << static_cast(areaChecksGotten[rcArea]) << " / " << static_cast(areaCheckTotals[rcArea]) << ")"; + areaTotalsTooltipSS << "Checked / Total"; + + if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) { + if (OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(DungeonSceneLookupByArea(rcArea))->IsMQ()) { + areaTotalsSS << " - MQ"; + } else { + areaTotalsSS << " - Vanilla"; + } + } + + ImGui::Text(areaTotalsSS.str().c_str()); + UIWidgets::Tooltip(areaTotalsTooltipSS.str().c_str()); } else { ImGui::Text("???"); } @@ -1561,6 +1641,12 @@ void DrawLocation(RandomizerCheck rc) { Rando::ItemLocation* itemLoc = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); RandomizerCheckStatus status = itemLoc->GetCheckStatus(); bool skipped = itemLoc->GetIsSkipped(); + bool available = itemLoc->IsAvailable(); + + if (enableAvailableChecks && onlyShowAvailable && !available) { + return; + } + if (status == RCSHOW_COLLECTED) { if (!showHidden && hideCollected) { return; @@ -1637,10 +1723,18 @@ void DrawLocation(RandomizerCheck rc) { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); areaChecksGotten[loc->GetArea()]--; totalChecksGotten--; + if (available) { + areaChecksAvailable[loc->GetArea()]++; + totalChecksAvailable++; + } } else { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(true); areaChecksGotten[loc->GetArea()]++; totalChecksGotten++; + if (available) { + areaChecksAvailable[loc->GetArea()]--; + totalChecksAvailable--; + } } UpdateOrdering(loc->GetArea()); UpdateInventoryChecks(); @@ -1654,7 +1748,19 @@ void DrawLocation(RandomizerCheck rc) { ImGui::SameLine(); //Draw - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(mainColor.r / 255.0f, mainColor.g / 255.0f, mainColor.b / 255.0f, mainColor.a / 255.0f)); + ImVec4 styleColor(mainColor.r / 255.0f, mainColor.g / 255.0f, mainColor.b / 255.0f, mainColor.a / 255.0f); + if (enableAvailableChecks) { + if (itemLoc->HasObtained()) { + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0, 0, 0, 0)); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, styleColor); + } + ImGui::Text("%s", available ? ICON_FA_UNLOCK : ICON_FA_LOCK); + ImGui::PopStyleColor(); + ImGui::SameLine(); + } + + ImGui::PushStyleColor(ImGuiCol_Text, styleColor); ImGui::Text("%s", txt.c_str()); ImGui::PopStyleColor(); @@ -1726,7 +1832,7 @@ void DrawLocation(RandomizerCheck rc) { if (conditionStr != "true") { UIWidgets::Tooltip(conditionStr.c_str()); } - return; + break; } } } @@ -1804,6 +1910,55 @@ void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, UIWidgets::PopStyleCombobox(); } +void RecalculateAvailableChecks() { + if (!enableAvailableChecks) { + return; + } + + ResetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + StartPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + + std::vector targetLocations; + targetLocations.reserve(RR_MAX); + for (auto& location : Rando::StaticData::GetLocationTable()) { + RandomizerCheck rc = location.GetRandomizerCheck(); + Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + itemLocation->SetAvailable(false); + if (!itemLocation->HasObtained()) { + targetLocations.emplace_back(rc); + } + } + + std::vector availableChecks = ReachabilitySearch(targetLocations, RG_NONE, true); + for (auto& rc : availableChecks) { + const auto& location = Rando::StaticData::GetLocation(rc); + const auto& itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + if (location->GetRCType() == RCTYPE_SHOP && itemLocation->GetCheckStatus() == RCSHOW_IDENTIFIED) { + if (CanBuyAnother(rc)) { + itemLocation->SetAvailable(true); + } + } else { + itemLocation->SetAvailable(true); + } + } + + totalChecksAvailable = 0; + for (auto& [rcArea, vec] : checksByArea) { + areaChecksAvailable[rcArea] = 0; + for (auto& rc : vec) { + Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + if (itemLocation->IsAvailable() && IsVisibleInCheckTracker(rc) && !IsCheckHidden(rc)) { + areaChecksAvailable[rcArea]++; + } + } + totalChecksAvailable += areaChecksAvailable[rcArea]; + } + + StopPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + SPDLOG_INFO("Recalculate Available Checks Time: {}ms", GetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS).count()); +} + + void CheckTrackerWindow::Draw() { if (!IsVisible()) { return; @@ -1858,7 +2013,7 @@ void CheckTrackerSettingsWindow::DrawElement() { .Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked.").Color(THEME_COLOR)); if (UIWidgets::CVarCheckbox("Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), UIWidgets::CheckboxOptions().Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles.").Color(THEME_COLOR))) { - hideShopUnshuffledChecks = !hideShopUnshuffledChecks; + hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); UpdateFilters(); } if (UIWidgets::CVarCheckbox("Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), @@ -1868,6 +2023,11 @@ void CheckTrackerSettingsWindow::DrawElement() { } UIWidgets::CVarCheckbox("Show Logic", CVAR_TRACKER_CHECK("ShowLogic"), UIWidgets::CheckboxOptions().Tooltip("If enabled, will show a check's logic when hovering over it.").Color(THEME_COLOR)); + if (UIWidgets::CVarCheckbox("Enable Available Checks", CVAR_TRACKER_CHECK("EnableAvailableChecks"), + UIWidgets::CheckboxOptions().Tooltip("If enabled, will show the checks that are available to be collected with your current progress.").Color(THEME_COLOR))) { + enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); + RecalculateAvailableChecks(); + } // Filtering settings UIWidgets::PaddedSeparator(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index c5bcaa074..962da88e3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -61,4 +61,5 @@ void UpdateAllOrdering(); void UpdateAllAreas(); void RecalculateAllAreaTotals(); void SpoilAreaFromCheck(RandomizerCheck rc); +void RecalculateAvailableChecks(); } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index f43fecf9e..049b87f65 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -306,11 +306,13 @@ extern "C" void Randomizer_InitSaveFile() { // Malon/Talon back at ranch. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG); + Flags_SetRandomizerInf(RAND_INF_WEIRD_EGG); Flags_SetEventChkInf(EVENTCHKINF_TALON_WOKEN_IN_CASTLE); Flags_SetEventChkInf(EVENTCHKINF_TALON_RETURNED_FROM_CASTLE); // Set "Got Zelda's Letter" flag. Also ensures Saria is back at SFM. Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER); + Flags_SetRandomizerInf(RAND_INF_ZELDAS_LETTER); Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); // Got item from Impa. @@ -321,7 +323,6 @@ extern "C" void Randomizer_InitSaveFile() { // Set this at the end to ensure we always start with the letter. // This is for the off chance, we got the Weird Egg from Impa (which should never happen). INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA; - Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && startingAge == RO_AGE_ADULT) { diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 6bde466ea..06a986a20 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -459,10 +459,16 @@ void SaveManager::LoadRandomizerVersion3() { }); randoContext->GetTrials()->SkipAll(); - SaveManager::Instance->LoadArray("requiredTrials", randoContext->GetOption(RSK_TRIAL_COUNT).Get() + 1, [&](size_t i) { + SaveManager::Instance->LoadArray("requiredTrials", randoContext->GetOption(RSK_TRIAL_COUNT).Get(), [&](size_t i) { size_t trialId; SaveManager::Instance->LoadData("", trialId); randoContext->GetTrial(trialId)->SetAsRequired(); + }); + + SaveManager::Instance->LoadArray("trickOptions", RT_MAX, [&](size_t i) { + uint8_t value = 0; + SaveManager::Instance->LoadData("", value); + randoContext->GetTrickOption(RandomizerTrick(i)).Set(value); }); } @@ -596,6 +602,10 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f SaveManager::Instance->SaveData("", i); } }); + + SaveManager::Instance->SaveArray("trickOptions", RT_MAX, [&](size_t i) { + SaveManager::Instance->SaveData("", randoContext->GetTrickOption(RandomizerTrick(i)).Get()); + }); } // Init() here is an extension of InitSram, and thus not truly an initializer for SaveManager itself. don't put any class initialization stuff here From eb17f2e99d67d72ad51e59c2dffc292363aa80e5 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Mon, 31 Mar 2025 20:15:41 +0100 Subject: [PATCH 178/267] Lock mask select behind zelda's letter in rando (#5267) * Lock mask select behind letter in rando * change to rand inf --- soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 9096271c1..25f0b3632 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -317,7 +317,8 @@ void KaleidoScope_HandleItemCycleExtras(PlayState* play, u8 slot, bool canCycle, bool CanMaskSelect() { if (IS_RANDO) { - return CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0) /* || Randomizer_GetSettingValue(RSK_SHUFFLE_CHILD_TRADE) */; + return CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0) + && Flags_GetRandomizerInf(RAND_INF_ZELDAS_LETTER);/* || Randomizer_GetSettingValue(RSK_SHUFFLE_CHILD_TRADE) */ } // only allow mask select when: From 05219cbbf78bfbe77ccb4128de49f6beec858c38 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 31 Mar 2025 15:28:48 -0400 Subject: [PATCH 179/267] Prevent GameplayStats and TimeDisplay from getting reset on ship json drag and drop (#5269) --- CMake/soh-cvars.cmake | 4 +++ .../Enhancements/TimeDisplay/TimeDisplay.cpp | 12 ++++---- soh/soh/Enhancements/gameplaystats.cpp | 28 +++++++++---------- soh/soh/Enhancements/gameplaystats.h | 2 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 4 +-- soh/soh/config/ConfigMigrators.h | 8 ++---- soh/soh/cvar_prefixes.h | 4 ++- soh/src/code/z_parameter.c | 2 +- 8 files changed, 33 insertions(+), 31 deletions(-) diff --git a/CMake/soh-cvars.cmake b/CMake/soh-cvars.cmake index e5ff8a384..227cfb2bb 100644 --- a/CMake/soh-cvars.cmake +++ b/CMake/soh-cvars.cmake @@ -10,6 +10,8 @@ set(CVAR_PREFIX_TRACKER "gTrackers") set(CVAR_PREFIX_DEVELOPER_TOOLS "gDeveloperTools") set(CVAR_PREFIX_GENERAL "gGeneral") set(CVAR_PREFIX_REMOTE "gRemote") +set(CVAR_PREFIX_GAMEPLAY_STATS "gGameplayStats") +set(CVAR_PREFIX_TIME_DISPLAY "gTimeDisplay") add_compile_definitions( CVAR_PREFIX_RANDOMIZER_ENHANCEMENT="${CVAR_PREFIX_RANDOMIZER_ENHANCEMENT}" CVAR_PREFIX_RANDOMIZER_SETTING="${CVAR_PREFIX_RANDOMIZER_SETTING}" @@ -23,4 +25,6 @@ add_compile_definitions( CVAR_PREFIX_DEVELOPER_TOOLS="${CVAR_PREFIX_DEVELOPER_TOOLS}" CVAR_PREFIX_GENERAL="${CVAR_PREFIX_GENERAL}" CVAR_PREFIX_REMOTE="${CVAR_PREFIX_REMOTE}" + CVAR_PREFIX_GAMEPLAY_STATS="${CVAR_PREFIX_GAMEPLAY_STATS}" + CVAR_PREFIX_TIME_DISPLAY="${CVAR_PREFIX_TIME_DISPLAY}" ) \ No newline at end of file diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index 80d048d68..4b374ed8e 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -37,10 +37,10 @@ const static std::vector> digitList = { }; const std::vector timeDisplayList = { - { DISPLAY_IN_GAME_TIMER, "Display Gameplay Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.InGameTimer") }, - { DISPLAY_TIME_OF_DAY, "Display Time of Day", CVAR_ENHANCEMENT("TimeDisplay.Timers.TimeofDay") }, - { DISPLAY_CONDITIONAL_TIMER, "Display Conditional Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.HotWater") }, - { DISPLAY_NAVI_TIMER, "Display Navi Timer", CVAR_ENHANCEMENT("TimeDisplay.Timers.NaviTimer") } + { DISPLAY_IN_GAME_TIMER, "Display Gameplay Timer", CVAR_TIME_DISPLAY("Timers.InGameTimer") }, + { DISPLAY_TIME_OF_DAY, "Display Time of Day", CVAR_TIME_DISPLAY("Timers.TimeofDay") }, + { DISPLAY_CONDITIONAL_TIMER, "Display Conditional Timer", CVAR_TIME_DISPLAY("Timers.HotWater") }, + { DISPLAY_NAVI_TIMER, "Display Navi Timer", CVAR_TIME_DISPLAY("Timers.NaviTimer") } }; static std::vector activeTimers; @@ -227,11 +227,11 @@ void TimeDisplayWindow::Draw() { } void TimeDisplayInitSettings() { - fontScale = CVarGetFloat(CVAR_ENHANCEMENT("TimeDisplay.FontScale"), 1.0f); + fontScale = CVarGetFloat(CVAR_TIME_DISPLAY("FontScale"), 1.0f); if (fontScale < 1.0f) { fontScale = 1.0f; } - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeDisplay.ShowWindowBG"), 0)) { + if (CVarGetInteger(CVAR_TIME_DISPLAY("ShowWindowBG"), 0)) { windowBG = ImVec4(0, 0, 0, 0); } else { windowBG = ImVec4(0, 0, 0, 0.5f); diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index e939fa18c..347bfe982 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -391,7 +391,7 @@ void GameplayStatsRow(const char* label, const std::string& value, ImVec4 color } bool compareTimestampInfoByTime(const TimestampInfo& a, const TimestampInfo& b) { - return CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.ReverseTimestamps"), 0) ? a.time > b.time : a.time < b.time; + return CVarGetInteger(CVAR_GAMEPLAY_STATS("ReverseTimestamps"), 0) ? a.time > b.time : a.time < b.time; } const char* ResolveSceneID(int sceneID, int roomID){ @@ -452,13 +452,13 @@ void DrawGameplayStatsHeader() { } else { 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 + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("ShowAdditionalTimers"), 0)) { // !Only display total game time 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 + if (gPlayState != NULL && CVarGetInteger(CVAR_GAMEPLAY_STATS("ShowDebugInfo"), 0)) { // && display debug info GameplayStatsRow("play->sceneNum:", formatHexGameplayStat(gPlayState->sceneNum), COLOR_YELLOW); GameplayStatsRow("gSaveContext.entranceIndex:", formatHexGameplayStat(gSaveContext.entranceIndex), COLOR_YELLOW); GameplayStatsRow("gSaveContext.cutsceneIndex:", formatHexOnlyGameplayStat(gSaveContext.cutsceneIndex), COLOR_YELLOW); @@ -576,13 +576,13 @@ void DrawGameplayStatsBreakdownTab() { 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.ship.stats.sceneTimestamps[i].scene != SCENE_GROTTOS) { + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("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) ? + sceneTimestampDisplay[i].time = CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) ? gSaveContext.ship.stats.sceneTimestamps[i].roomTime : gSaveContext.ship.stats.sceneTimestamps[i].sceneTime; sceneTimestampDisplay[i].color = COLOR_GREY; sceneTimestampDisplay[i].isRoom = gSaveContext.ship.stats.sceneTimestamps[i].isRoom; @@ -593,13 +593,13 @@ void DrawGameplayStatsBreakdownTab() { ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); for (int i = 0; i < gSaveContext.ship.stats.tsIdx; i++) { TimestampInfo tsInfo = sceneTimestampDisplay[i]; - bool canShow = !tsInfo.isRoom || CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0); + bool canShow = !tsInfo.isRoom || CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0); if (tsInfo.time > 0 && strnlen(tsInfo.name, 40) > 1 && canShow) { GameplayStatsRow(tsInfo.name, formatTimestampGameplayStat(tsInfo.time), tsInfo.color); } } std::string toPass; - if (CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneNum != SCENE_GROTTOS) { + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("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.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum); @@ -610,27 +610,27 @@ void DrawGameplayStatsBreakdownTab() { } void DrawGameplayStatsOptionsTab() { - UIWidgets::CVarCheckbox("Show in-game total timer", CVAR_ENHANCEMENT("GameplayStats.ShowIngameTimer"), + UIWidgets::CVarCheckbox("Show in-game total timer", CVAR_GAMEPLAY_STATS("ShowIngameTimer"), UIWidgets::CheckboxOptions() .Tooltip("Keep track of the timer as an in-game HUD element. The position of the " "timer can be changed in the Cosmetics Editor.") .Color(THEME_COLOR)); - UIWidgets::CVarCheckbox("Show latest timestamps on top", CVAR_ENHANCEMENT("GameplayStats.ReverseTimestamps"), + UIWidgets::CVarCheckbox("Show latest timestamps on top", CVAR_GAMEPLAY_STATS("ReverseTimestamps"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); - UIWidgets::CVarCheckbox("Room Breakdown", CVAR_ENHANCEMENT("GameplayStats.RoomBreakdown"), + UIWidgets::CVarCheckbox("Room Breakdown", CVAR_GAMEPLAY_STATS("RoomBreakdown"), UIWidgets::CheckboxOptions() .Tooltip("Allows a more in-depth perspective of time spent in a certain map.") .Color(THEME_COLOR)); - UIWidgets::CVarCheckbox("RTA Timing on new files", CVAR_ENHANCEMENT("GameplayStats.RTATiming"), + UIWidgets::CVarCheckbox("RTA Timing on new files", CVAR_GAMEPLAY_STATS("RTATiming"), UIWidgets::CheckboxOptions() .Tooltip("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") .Color(THEME_COLOR)); - UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_ENHANCEMENT("GameplayStats.ShowAdditionalTimers"), + UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_GAMEPLAY_STATS("ShowAdditionalTimers"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); - UIWidgets::CVarCheckbox("Show Debug Info", CVAR_ENHANCEMENT("GameplayStats.ShowDebugInfo"), + UIWidgets::CVarCheckbox("Show Debug Info", CVAR_GAMEPLAY_STATS("ShowDebugInfo"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); } @@ -671,7 +671,7 @@ void InitStats(bool isDebug) { for (int dungeon = 0; dungeon < ARRAY_COUNT(gSaveContext.ship.stats.dungeonKeys); dungeon++) { gSaveContext.ship.stats.dungeonKeys[dungeon] = isDebug ? 8 : 0; } - gSaveContext.ship.stats.rtaTiming = CVarGetInteger(CVAR_ENHANCEMENT("GameplayStats.RTATiming"), 0); + gSaveContext.ship.stats.rtaTiming = CVarGetInteger(CVAR_GAMEPLAY_STATS("RTATiming"), 0); gSaveContext.ship.stats.fileCreatedAt = 0; gSaveContext.ship.stats.playTimer = 0; gSaveContext.ship.stats.pauseTimer = 0; diff --git a/soh/soh/Enhancements/gameplaystats.h b/soh/soh/Enhancements/gameplaystats.h index 81190c01e..b4d140f1f 100644 --- a/soh/soh/Enhancements/gameplaystats.h +++ b/soh/soh/Enhancements/gameplaystats.h @@ -27,7 +27,7 @@ extern "C" { : 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) ?\ +#define CURRENT_MODE_TIMER (CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) ?\ gSaveContext.ship.stats.roomTimer :\ gSaveContext.ship.stats.sceneTimer) diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index cc104b87d..febaa0a4a 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1775,7 +1775,7 @@ void SohMenu::AddMenuEnhancements() { .WindowName("Additional Timers") .Options(WindowButtonOptions().Tooltip("Enables the separate Additional Timers Window.")); AddWidget(path, "Font Scale: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) - .CVar(CVAR_ENHANCEMENT("TimeDisplay.FontScale")) + .CVar(CVAR_TIME_DISPLAY("FontScale")) .Callback([](WidgetInfo& info) { TimeDisplayInitSettings(); }) @@ -1786,7 +1786,7 @@ void SohMenu::AddMenuEnhancements() { .Format("%.2fx") ); AddWidget(path, "Hide Background", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_ENHANCEMENT("TimeDisplay.ShowWindowBG")) + .CVar(CVAR_TIME_DISPLAY("ShowWindowBG")) .Callback([](WidgetInfo& info) { TimeDisplayInitSettings(); }); diff --git a/soh/soh/config/ConfigMigrators.h b/soh/soh/config/ConfigMigrators.h index f3c663f66..021cab88e 100644 --- a/soh/soh/config/ConfigMigrators.h +++ b/soh/soh/config/ConfigMigrators.h @@ -299,12 +299,8 @@ namespace SOH { { MigrationAction::Rename, "gUniformLR", "gEnhancements.FixMenuLR" }, { MigrationAction::Rename, "gVisualAgony", "gEnhancements.VisualAgony" }, { MigrationAction::Rename, "gVoidDamageMul", "gEnhancements.VoidDamageMult" }, - { MigrationAction::Rename, "gGameplayStats.ShowAdditionalTimers", "gEnhancements.GameplayStats.ShowAdditionalTimers" }, - { MigrationAction::Rename, "gGameplayStats.ShowDebugInfo", "gEnhancements.GameplayStats.ShowDebugInfo" }, - { MigrationAction::Rename, "gGameplayStats.RoomBreakdown", "gEnhancements.GameplayStats.RoomBreakdown" }, - { MigrationAction::Rename, "gGameplayStats.ShowIngameTimer", "gEnhancements.GameplayStats.ShowInGameTimer" }, - { MigrationAction::Rename, "gGameplayStats.TimestampsReverse", "gEnhancements.GameplayStats.ReverseTimestamps" }, - { MigrationAction::Rename, "gGameplayStats.RTATiming", "gEnhancements.GameplayStats.RTATiming" }, + { MigrationAction::Rename, "gGameplayStats.ShowIngameTimer", "gGameplayStats.ShowInGameTimer" }, + { MigrationAction::Rename, "gGameplayStats.TimestampsReverse", "gGameplayStats.ReverseTimestamps" }, { MigrationAction::Rename, "gMirroredWorld", "gEnhancements.MirroredWorld" }, { MigrationAction::Rename, "gBetaQuestWorld", "gCheats.BetaQuestWorld" }, { MigrationAction::Rename, "gBombTimerMultiplier", "gCheats.BombTimerMultiplier" }, diff --git a/soh/soh/cvar_prefixes.h b/soh/soh/cvar_prefixes.h index 4b8d9f93a..375833cb1 100644 --- a/soh/soh/cvar_prefixes.h +++ b/soh/soh/cvar_prefixes.h @@ -14,4 +14,6 @@ #define CVAR_GENERAL(var) CVAR_PREFIX_GENERAL "." var #define CVAR_REMOTE(var) CVAR_PREFIX_REMOTE "." var #define CVAR_REMOTE_CROWD_CONTROL(var) CVAR_REMOTE("CrowdControl." var) -#define CVAR_REMOTE_SAIL(var) CVAR_REMOTE("Sail." var) \ No newline at end of file +#define CVAR_REMOTE_SAIL(var) CVAR_REMOTE("Sail." var) +#define CVAR_GAMEPLAY_STATS(var) CVAR_PREFIX_GAMEPLAY_STATS "." var +#define CVAR_TIME_DISPLAY(var) CVAR_PREFIX_TIME_DISPLAY "." var \ No newline at end of file diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index a221e570f..5060a0ab9 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -6123,7 +6123,7 @@ void Interface_DrawTotalGameplayTimer(PlayState* play) { // Draw timer based on the Gameplay Stats total time. 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)) { + (CVarGetInteger(CVAR_GAMEPLAY_STATS("ShowIngameTimer"), 0) && gSaveContext.fileNum >= 0 && gSaveContext.fileNum <= 2)) { s32 X_Margins_Timer = 0; if (CVarGetInteger(CVAR_COSMETIC("HUD.IGT.UseMargins"), 0) != 0) { From 2bde8fbe5db48969b47324b86c39272d3e335c2d Mon Sep 17 00:00:00 2001 From: xxAtrain223 Date: Mon, 31 Mar 2025 23:18:07 -0500 Subject: [PATCH 180/267] Use GetDungeonFromScene (#5271) * Use GetDungeonFromScene. * Remove SceneToDungeon map. --- soh/soh/Enhancements/randomizer/logic.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 43ff3ce56..a567cd789 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -2104,30 +2104,16 @@ namespace Rando { } } - std::unordered_map SceneToDungeon = { - { SceneID::SCENE_DEKU_TREE, DungeonKey::DEKU_TREE }, - { SceneID::SCENE_DODONGOS_CAVERN, DungeonKey::DODONGOS_CAVERN }, - { SceneID::SCENE_JABU_JABU, DungeonKey::JABU_JABUS_BELLY }, - { SceneID::SCENE_FOREST_TEMPLE, DungeonKey::FOREST_TEMPLE }, - { SceneID::SCENE_FIRE_TEMPLE, DungeonKey::FIRE_TEMPLE }, - { SceneID::SCENE_WATER_TEMPLE, DungeonKey::WATER_TEMPLE }, - { SceneID::SCENE_SPIRIT_TEMPLE, DungeonKey::SPIRIT_TEMPLE }, - { SceneID::SCENE_SHADOW_TEMPLE, DungeonKey::SHADOW_TEMPLE }, - { SceneID::SCENE_BOTTOM_OF_THE_WELL, DungeonKey::BOTTOM_OF_THE_WELL }, - { SceneID::SCENE_ICE_CAVERN, DungeonKey::ICE_CAVERN }, - { SceneID::SCENE_GERUDO_TRAINING_GROUND, DungeonKey::GERUDO_TRAINING_GROUND }, - { SceneID::SCENE_INSIDE_GANONS_CASTLE, DungeonKey::GANONS_CASTLE }, - }; - // Get the swch bit positions for the dungeon const std::vector& GetDungeonSmallKeyDoors(SceneID sceneId) { static const std::vector emptyVector; - auto foundDungeon = SceneToDungeon.find(static_cast(sceneId)); - if (foundDungeon == SceneToDungeon.end()) { + + auto dungeonInfo = Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(sceneId); + if (dungeonInfo == nullptr) { return emptyVector; } - bool masterQuest = Rando::Context::GetInstance()->GetDungeon(foundDungeon->second)->IsMQ(); + bool masterQuest = dungeonInfo->IsMQ(); // Create a unique key for the dungeon and master quest uint8_t key = sceneId | (masterQuest << 7); From 17b91ecc2da5e225f0a97f216c7b62154777fe29 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 1 Apr 2025 16:53:07 -0400 Subject: [PATCH 181/267] Fix some misc. Rando menu issues (#5272) * Fix issue where random and clear seed buttons overlap text input. * Fix issue where item scale is incorrectly disabled. On fresh json, there was a mismatch on the defaults where SGIA_JUNK was default for the actual combobx but SGIA_DISABLED, was used as the default when the CVar was checked in the scale slider's PreFunc. --- soh/soh/Enhancements/randomizer/randomizer.cpp | 12 ++++++------ soh/soh/SohGui/SohMenuRandomizer.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8d09b6839..5b1a7fc55 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2710,12 +2710,7 @@ void RandomizerSettingsWindow::DrawElement() { "Characters from a-z, A-Z, and 0-9 are supported.\n" "Character limit is 1023, after which the seed will be truncated.\n" ); - if (strnlen(seedString, MAX_SEED_STRING_SIZE) == 0) { - ImGui::SameLine(17.0f); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Leave blank for random seed"); - } - UIWidgets::PopStyleInput(); - ImGui::SameLine(0.f, 50.f); + ImGui::SameLine(); if (UIWidgets::Button(ICON_FA_RANDOM, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)).Tooltip( "Creates a new random seed value to be used when generating a randomizer" ))) { @@ -2725,6 +2720,11 @@ void RandomizerSettingsWindow::DrawElement() { if (UIWidgets::Button(ICON_FA_ERASER, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)))) { memset(seedString, 0, MAX_SEED_STRING_SIZE); } + if (strnlen(seedString, MAX_SEED_STRING_SIZE) == 0) { + ImGui::SameLine(17.0f); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Leave blank for random seed"); + } + UIWidgets::PopStyleInput(); } UIWidgets::Spacer(0); diff --git a/soh/soh/SohGui/SohMenuRandomizer.cpp b/soh/soh/SohGui/SohMenuRandomizer.cpp index 5c724ec1e..dc8f5673a 100644 --- a/soh/soh/SohGui/SohMenuRandomizer.cpp +++ b/soh/soh/SohGui/SohMenuRandomizer.cpp @@ -79,7 +79,7 @@ void SohMenu::AddMenuRandomizer() { .CVar(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimationScale")) .PreFunc([](WidgetInfo& info) { info.options->disabled = - !CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_DISABLED); + !CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK); info.options->disabledTooltip = "This slider only applies when using the \"Skip Get Item Animations\" option."; }) .Options(FloatSliderOptions() From e8389e0b2e116bac34cbaea1e1eda0280a77da1a Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 1 Apr 2025 17:09:44 -0400 Subject: [PATCH 182/267] Add clang-format scripts and github runner action (#5270) --- .github/workflows/clang-format.yml | 21 +++++++++++++ .gitignore | 4 +++ run-clang-format.ps1 | 48 ++++++++++++++++++++++++++++++ run-clang-format.sh | 29 ++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 .github/workflows/clang-format.yml create mode 100644 run-clang-format.ps1 create mode 100755 run-clang-format.sh diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 000000000..604a3dd70 --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,21 @@ +name: clang-format +on: [pull_request] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + clang-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - name: Install clang-format + run: | + sudo apt-get update + sudo apt-get install -y clang-format-14 + - name: Run clang-format + run: | + ./run-clang-format.sh + git diff --exit-code diff --git a/.gitignore b/.gitignore index ec5401c38..ac767f114 100644 --- a/.gitignore +++ b/.gitignore @@ -452,3 +452,7 @@ _packages soh/src/boot/build.c soh/properties.h + +# Tools +/clang-format +/clang-format.exe diff --git a/run-clang-format.ps1 b/run-clang-format.ps1 new file mode 100644 index 000000000..6aaf12ea4 --- /dev/null +++ b/run-clang-format.ps1 @@ -0,0 +1,48 @@ +Using Namespace System +$url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/LLVM-14.0.6-win64.exe" +$llvmInstallerPath = ".\LLVM-14.0.6-win64.exe" +$clangFormatFilePath = ".\clang-format.exe" +$requiredVersion = "clang-format version 14.0.6" +$currentVersion = "" + +function Test-7ZipInstalled { + $sevenZipPath = "C:\Program Files\7-Zip\7z.exe" + return Test-Path $sevenZipPath -PathType Leaf +} + +if (Test-Path $clangFormatFilePath) { + $currentVersion = & $clangFormatFilePath --version + if (-not ($currentVersion -eq $requiredVersion)) { + # Delete the existing file if the version is incorrect + Remove-Item $clangFormatFilePath -Force + } +} + +if (-not (Test-Path $clangFormatFilePath) -or ($currentVersion -ne $requiredVersion)) { + if (-not (Test-7ZipInstalled)) { + Write-Host "7-Zip is not installed. Please install 7-Zip and run the script again." + exit + } + + $wc = New-Object net.webclient + $wc.Downloadfile($url, $llvmInstallerPath) + + $sevenZipPath = "C:\Program Files\7-Zip\7z.exe" + $specificFileInArchive = "bin\clang-format.exe" + & "$sevenZipPath" e $llvmInstallerPath $specificFileInArchive + + Remove-Item $llvmInstallerPath -Force +} + +$basePath = (Resolve-Path .).Path +$files = Get-ChildItem -Path $basePath\soh -Recurse -File ` + | Where-Object { ($_.Extension -eq '.c' -or $_.Extension -eq '.cpp' -or ` + ($_.Extension -eq '.h' -and ` + (-not ($_.FullName -like "*\soh\src\*" -or $_.FullName -like "*\soh\include\*")))) -and ` + (-not ($_.FullName -like "*\soh\assets\*")) } + +foreach ($file in $files) { + $relativePath = $file.FullName.Substring($basePath.Length + 1) + Write-Host "Formatting $relativePath" + .\clang-format.exe -i $file.FullName +} diff --git a/run-clang-format.sh b/run-clang-format.sh new file mode 100755 index 000000000..6f9fc0c80 --- /dev/null +++ b/run-clang-format.sh @@ -0,0 +1,29 @@ +# this line does quite a bit, so let's break it down +# +# find soh +# use "find" to look in the "soh" directory +# this ensures we don't try to format stuff in the submodules +# +# -type f +# only look for files +# +# -name "*.c" -o -name "*.cpp" +# find all .c and .cpp files +# +# -name "*.h" ! -path "soh/src/**.h" ! -path "soh/include/**.h" +# find all .h files that aren't in soh/src or soh/include +# this is because zret decomp only runs clang-format on c files +# https://github.com/zeldaret/mm/blob/b7e5468ca16315a7e322055eff3d97fe980bbc25/format.py#L182 +# +# ! -path "soh/assets/*" +# asset headers are autogenerated, don't fight them +# +# | sed 's| |\\ |g' +# pipe the result of find into sed to +# ensure all the paths returned by find have spaces escaped +# +# | xargs clang-format-14 -i +# use xargs to take each path we've found +# and pass it as an argument to clang-format + +find soh -type f \( -name "*.c" -o -name "*.cpp" -o \( -name "*.h" ! -path "soh/src/**.h" ! -path "soh/include/**.h" \) \) ! -path "soh/assets/*" | sed 's| |\\ |g' | xargs clang-format-14 -i From 8f126344a4ef22765cfa550146f89bf428e86053 Mon Sep 17 00:00:00 2001 From: Archez Date: Tue, 1 Apr 2025 22:33:38 -0400 Subject: [PATCH 183/267] Apply clang-format to files (#5273) --- soh/platform/pathconf.c | 2 +- soh/resource.h | 12 +- soh/soh/ActorDB.cpp | 13 +- soh/soh/ActorDB.h | 5 +- soh/soh/CrashHandlerExp.h | 3 +- soh/soh/CrashHandlerExt.cpp | 6 +- .../Enhancements/AssignableTunicsAndBoots.cpp | 14 +- soh/soh/Enhancements/Cheats/DekuStick.cpp | 8 +- soh/soh/Enhancements/Cheats/FreezeTime.cpp | 3 +- .../Enhancements/Cheats/Infinite/Money.cpp | 5 +- .../Cheats/Infinite/NayrusLove.cpp | 3 +- soh/soh/Enhancements/ExtraTraps.cpp | 34 +- .../Enhancements/FileSelectEnhancements.cpp | 45 +- .../Enhancements/Presets/PresetEntries.cpp | 111 +- soh/soh/Enhancements/Presets/Presets.cpp | 15 +- .../Enhancements/RemoveSpinAttackDarkness.cpp | 7 +- .../Restorations/BottleAdventure.cpp | 375 +- .../Restorations/PauseBufferInputs.cpp | 12 +- .../Enhancements/TimeDisplay/TimeDisplay.cpp | 42 +- .../Enhancements/TimeDisplay/TimeDisplay.h | 4 +- .../TimeSavers/FasterHeavyBlockLift.cpp | 27 +- .../TimeSavers/FasterRupeeAccumulator.cpp | 19 +- .../SkipCutscene/Story/SkipBlueWarp.cpp | 70 +- .../SkipCutscene/Story/SkipDekuTreeIntro.cpp | 7 +- .../Story/SkipLostWoodsBridge.cpp | 19 +- .../Story/SkipToGivingZeldasLetter.cpp | 11 +- .../Story/SkipZeldaFleeingCastle.cpp | 22 +- .../MoveJabuJabuElevator.cpp | 25 +- .../MoveMidoInKokiriForest.cpp | 21 +- .../SkipChildRutoInteractions.cpp | 17 +- .../Enhancements/TimeSavers/TimeSavers.cpp | 20 +- soh/soh/Enhancements/TimeSavers/TimeSavers.h | 20 +- .../Enhancements/audio/AudioCollection.cpp | 30 +- soh/soh/Enhancements/audio/AudioCollection.h | 86 +- soh/soh/Enhancements/audio/AudioEditor.cpp | 158 +- soh/soh/Enhancements/audio/AudioEditor.h | 13 +- soh/soh/Enhancements/bootcommands.c | 3 +- soh/soh/Enhancements/boss-rush/BossRush.cpp | 267 +- soh/soh/Enhancements/boss-rush/BossRush.h | 12 +- soh/soh/Enhancements/controls/InputViewer.cpp | 520 +- soh/soh/Enhancements/controls/InputViewer.h | 18 +- soh/soh/Enhancements/controls/Mouse.cpp | 19 +- soh/soh/Enhancements/controls/Mouse.h | 4 +- .../controls/SohInputEditorWindow.cpp | 338 +- .../controls/SohInputEditorWindow.h | 5 +- .../cosmetics/CosmeticsEditor.cpp | 1723 ++--- .../Enhancements/cosmetics/CosmeticsEditor.h | 12 +- .../cosmetics/CustomLogoTitle.cpp | 37 +- .../Enhancements/cosmetics/NoMasterSword.cpp | 28 +- .../cosmetics/authenticGfxPatches.cpp | 12 +- .../Enhancements/cosmetics/cosmeticsTypes.h | 12 +- .../custom-message/CustomMessageManager.cpp | 234 +- .../custom-message/CustomMessageManager.h | 39 +- .../custom-message/CustomMessageTypes.h | 6 +- soh/soh/Enhancements/debugconsole.cpp | 705 ++- .../Enhancements/debugger/MessageViewer.cpp | 18 +- soh/soh/Enhancements/debugger/MessageViewer.h | 10 +- .../Enhancements/debugger/SohStatsWindow.h | 6 +- soh/soh/Enhancements/debugger/actorViewer.cpp | 386 +- soh/soh/Enhancements/debugger/actorViewer.h | 2 +- soh/soh/Enhancements/debugger/colViewer.cpp | 112 +- soh/soh/Enhancements/debugger/colViewer.h | 8 +- .../Enhancements/debugger/debugSaveEditor.cpp | 1104 ++-- .../Enhancements/debugger/debugSaveEditor.h | 3213 +++++----- soh/soh/Enhancements/debugger/dlViewer.cpp | 36 +- soh/soh/Enhancements/debugger/dlViewer.h | 2 +- soh/soh/Enhancements/debugger/hookDebugger.h | 2 +- .../debugger/performanceTimer.cpp | 8 +- .../Enhancements/debugger/performanceTimer.h | 45 +- soh/soh/Enhancements/debugger/valueViewer.cpp | 46 +- soh/soh/Enhancements/debugger/valueViewer.h | 2 +- soh/soh/Enhancements/enemyrandomizer.cpp | 197 +- soh/soh/Enhancements/enemyrandomizer.h | 3 +- .../game-interactor/GameInteractionEffect.cpp | 1224 ++-- .../game-interactor/GameInteractionEffect.h | 414 +- .../game-interactor/GameInteractor.cpp | 7 +- .../GameInteractor_HookTable.h | 4 +- .../game-interactor/GameInteractor_Hooks.cpp | 7 +- .../game-interactor/GameInteractor_Hooks.h | 4 +- .../GameInteractor_RawAction.cpp | 77 +- .../vanilla-behavior/GIVanillaBehavior.h | 20 +- soh/soh/Enhancements/gameconsole.c | 3 +- soh/soh/Enhancements/gameconsole.h | 11 +- soh/soh/Enhancements/gameplaystats.cpp | 219 +- soh/soh/Enhancements/gameplaystats.h | 62 +- soh/soh/Enhancements/gameplaystatswindow.h | 2 +- .../item-tables/ItemTableManager.h | 18 +- .../Enhancements/item-tables/ItemTableTypes.h | 26 +- soh/soh/Enhancements/kaleido.cpp | 750 ++- soh/soh/Enhancements/kaleido.h | 42 +- soh/soh/Enhancements/mods.cpp | 439 +- soh/soh/Enhancements/nametag.cpp | 37 +- soh/soh/Enhancements/nametag.h | 4 +- soh/soh/Enhancements/pausewarp.c | 75 +- .../randomizer/3drando/custom_messages.cpp | 108 +- .../Enhancements/randomizer/3drando/fill.cpp | 2208 +++---- .../randomizer/3drando/hint_list.cpp | 2 +- .../hint_list/hint_list_exclude_dungeon.cpp | 2 +- .../hint_list/hint_list_exclude_overworld.cpp | 2 +- .../3drando/hint_list/hint_list_item.cpp | 2 +- .../Enhancements/randomizer/3drando/hints.cpp | 1025 +-- .../randomizer/3drando/item_pool.cpp | 2512 ++++---- .../Enhancements/randomizer/3drando/menu.cpp | 6 +- .../randomizer/3drando/playthrough.cpp | 12 +- .../randomizer/3drando/rando_main.cpp | 2 +- .../randomizer/3drando/random.cpp | 12 +- .../Enhancements/randomizer/3drando/shops.cpp | 1187 ++-- .../randomizer/3drando/spoiler_log.cpp | 260 +- .../randomizer/3drando/starting_inventory.cpp | 332 +- .../randomizer/ColoredMapsAndCompasses.cpp | 16 +- .../randomizer/LockOverworldDoors.cpp | 23 +- .../Enhancements/randomizer/Plandomizer.cpp | 732 +-- .../Enhancements/randomizer/ShuffleCows.cpp | 6 +- .../Enhancements/randomizer/ShuffleCrates.cpp | 201 +- .../Enhancements/randomizer/ShuffleCrates.h | 2 +- .../randomizer/ShuffleFairies.cpp | 40 +- .../randomizer/ShuffleFreestanding.cpp | 15 +- .../Enhancements/randomizer/ShuffleGrass.cpp | 18 +- .../Enhancements/randomizer/ShuffleGrass.h | 2 +- .../Enhancements/randomizer/ShufflePots.cpp | 12 +- soh/soh/Enhancements/randomizer/ShufflePots.h | 2 +- .../randomizer/ShuffleTradeItems.c | 8 +- soh/soh/Enhancements/randomizer/context.cpp | 107 +- soh/soh/Enhancements/randomizer/context.h | 3 +- soh/soh/Enhancements/randomizer/draw.cpp | 226 +- soh/soh/Enhancements/randomizer/draw.h | 7 +- soh/soh/Enhancements/randomizer/dungeon.cpp | 68 +- soh/soh/Enhancements/randomizer/dungeon.h | 7 +- soh/soh/Enhancements/randomizer/entrance.cpp | 56 +- soh/soh/Enhancements/randomizer/entrance.h | 7 +- .../Enhancements/randomizer/fishsanity.cpp | 862 +-- soh/soh/Enhancements/randomizer/fishsanity.h | 90 +- soh/soh/Enhancements/randomizer/hint.cpp | 1153 ++-- soh/soh/Enhancements/randomizer/hint.h | 127 +- .../Enhancements/randomizer/hook_handlers.cpp | 783 +-- soh/soh/Enhancements/randomizer/item.cpp | 59 +- soh/soh/Enhancements/randomizer/item.h | 11 +- .../Enhancements/randomizer/item_location.cpp | 28 +- .../Enhancements/randomizer/item_location.h | 4 +- .../Enhancements/randomizer/item_override.cpp | 6 +- .../Enhancements/randomizer/item_override.h | 3 +- soh/soh/Enhancements/randomizer/location.cpp | 382 +- soh/soh/Enhancements/randomizer/location.h | 263 +- .../randomizer/location_access.cpp | 309 +- .../Enhancements/randomizer/location_access.h | 484 +- .../Enhancements/randomizer/location_list.cpp | 9 +- soh/soh/Enhancements/randomizer/logic.cpp | 4676 +++++++------- soh/soh/Enhancements/randomizer/logic.h | 16 +- soh/soh/Enhancements/randomizer/option.cpp | 77 +- soh/soh/Enhancements/randomizer/option.h | 88 +- .../randomizer/option_descriptions.cpp | 313 +- .../Enhancements/randomizer/randomizer.cpp | 5514 ++++++++++------- soh/soh/Enhancements/randomizer/randomizer.h | 10 +- .../Enhancements/randomizer/randomizerTypes.h | 138 +- .../randomizer/randomizer_check_objects.cpp | 88 +- .../randomizer/randomizer_check_objects.h | 16 +- .../randomizer/randomizer_check_tracker.cpp | 975 +-- .../randomizer/randomizer_check_tracker.h | 28 +- .../randomizer/randomizer_entrance.c | 206 +- .../randomizer/randomizer_entrance.h | 14 +- .../randomizer_entrance_tracker.cpp | 164 +- .../randomizer/randomizer_entrance_tracker.h | 14 +- .../randomizer/randomizer_grotto.c | 55 +- .../Enhancements/randomizer/randomizer_inf.h | 7 +- .../randomizer/randomizer_item_tracker.cpp | 997 +-- .../randomizer/randomizer_item_tracker.h | 20 +- soh/soh/Enhancements/randomizer/savefile.cpp | 47 +- soh/soh/Enhancements/randomizer/settings.cpp | 2427 +++++--- soh/soh/Enhancements/randomizer/settings.h | 8 +- .../Enhancements/randomizer/static_data.cpp | 481 +- soh/soh/Enhancements/randomizer/static_data.h | 125 +- soh/soh/Enhancements/randomizer/trial.cpp | 8 +- soh/soh/Enhancements/randomizer/trial.h | 4 +- soh/soh/Enhancements/randomizer/tricks.cpp | 193 +- soh/soh/Enhancements/randomizer/tricks.h | 40 +- soh/soh/Enhancements/savestates.cpp | 113 +- soh/soh/Enhancements/savestates.h | 11 +- .../Enhancements/timesaver_hook_handlers.cpp | 439 +- .../Enhancements/timesplits/TimeSplits.cpp | 150 +- soh/soh/Enhancements/tts/tts.cpp | 508 +- soh/soh/Extractor/Extract.cpp | 66 +- soh/soh/Extractor/Extract.h | 8 +- soh/soh/Extractor/FastCrc32C.c | 11 +- soh/soh/Extractor/portable-file-dialogs.h | 997 ++- soh/soh/GbiWrap.cpp | 19 +- soh/soh/Network/CrowdControl/CrowdControl.cpp | 19 +- soh/soh/Network/CrowdControl/CrowdControl.h | 128 +- soh/soh/Network/Sail/Sail.cpp | 164 +- soh/soh/Notification/Notification.cpp | 39 +- soh/soh/Notification/Notification.h | 4 +- soh/soh/OTRGlobals.cpp | 676 +- soh/soh/OTRGlobals.h | 53 +- soh/soh/ResourceManagerHelpers.cpp | 85 +- soh/soh/ResourceManagerHelpers.h | 92 +- soh/soh/SaveManager.cpp | 588 +- soh/soh/ShipUtils.cpp | 22 +- soh/soh/SohGui/ImGuiUtils.cpp | 92 +- soh/soh/SohGui/ImGuiUtils.h | 22 +- soh/soh/SohGui/Menu.cpp | 28 +- soh/soh/SohGui/MenuTypes.h | 10 +- soh/soh/SohGui/ResolutionEditor.cpp | 537 +- soh/soh/SohGui/ResolutionEditor.h | 2 +- soh/soh/SohGui/SohGui.cpp | 384 +- soh/soh/SohGui/SohMenu.cpp | 4 +- soh/soh/SohGui/SohMenu.h | 59 +- soh/soh/SohGui/SohMenuBar.cpp | 16 +- soh/soh/SohGui/SohMenuBar.h | 3 +- soh/soh/SohGui/SohMenuDevTools.cpp | 14 +- soh/soh/SohGui/SohMenuEnhancements.cpp | 501 +- soh/soh/SohGui/SohMenuNetwork.cpp | 170 +- soh/soh/SohGui/SohMenuRandomizer.cpp | 71 +- soh/soh/SohGui/SohMenuSettings.cpp | 115 +- soh/soh/SohGui/SohModals.cpp | 8 +- soh/soh/SohGui/SohModals.h | 8 +- soh/soh/SohGui/UIWidgets.cpp | 73 +- soh/soh/config/ConfigMigrators.h | 2940 ++++----- soh/soh/config/ConfigUpdaters.cpp | 199 +- soh/soh/config/ConfigUpdaters.h | 32 +- soh/soh/frame_interpolation.cpp | 642 +- soh/soh/mixer.c | 294 +- .../resource/importer/AnimationFactory.cpp | 4 +- soh/soh/resource/importer/AnimationFactory.h | 3 +- soh/soh/resource/importer/ArrayFactory.cpp | 6 +- soh/soh/resource/importer/ArrayFactory.h | 5 +- .../resource/importer/AudioSampleFactory.cpp | 10 +- .../resource/importer/AudioSampleFactory.h | 3 +- .../importer/AudioSequenceFactory.cpp | 6 +- .../resource/importer/AudioSequenceFactory.h | 3 +- .../importer/AudioSoundFontFactory.cpp | 19 +- .../resource/importer/AudioSoundFontFactory.h | 3 +- .../resource/importer/BackgroundFactory.cpp | 4 +- soh/soh/resource/importer/BackgroundFactory.h | 3 +- .../importer/CollisionHeaderFactory.cpp | 23 +- .../importer/CollisionHeaderFactory.h | 6 +- soh/soh/resource/importer/CutsceneFactory.cpp | 4 +- soh/soh/resource/importer/CutsceneFactory.h | 3 +- soh/soh/resource/importer/PathFactory.cpp | 20 +- soh/soh/resource/importer/PathFactory.h | 6 +- .../importer/PlayerAnimationFactory.cpp | 4 +- .../importer/PlayerAnimationFactory.h | 3 +- soh/soh/resource/importer/SceneFactory.cpp | 31 +- soh/soh/resource/importer/SceneFactory.h | 21 +- soh/soh/resource/importer/SkeletonFactory.cpp | 21 +- soh/soh/resource/importer/SkeletonFactory.h | 6 +- .../resource/importer/SkeletonLimbFactory.cpp | 28 +- .../resource/importer/SkeletonLimbFactory.h | 6 +- soh/soh/resource/importer/TextFactory.cpp | 11 +- soh/soh/resource/importer/TextFactory.h | 6 +- .../scenecommand/EndMarkerFactory.cpp | 4 +- .../importer/scenecommand/EndMarkerFactory.h | 7 +- .../scenecommand/SceneCommandFactory.cpp | 3 +- .../scenecommand/SceneCommandFactory.h | 18 +- .../scenecommand/SetActorListFactory.cpp | 8 +- .../scenecommand/SetActorListFactory.h | 8 +- .../SetAlternateHeadersFactory.cpp | 28 +- .../scenecommand/SetAlternateHeadersFactory.h | 8 +- .../scenecommand/SetCameraSettingsFactory.cpp | 12 +- .../scenecommand/SetCameraSettingsFactory.h | 8 +- .../SetCollisionHeaderFactory.cpp | 18 +- .../scenecommand/SetCollisionHeaderFactory.h | 8 +- .../scenecommand/SetCsCameraFactory.cpp | 8 +- .../scenecommand/SetCsCameraFactory.h | 8 +- .../scenecommand/SetCutscenesFactory.cpp | 14 +- .../scenecommand/SetCutscenesFactory.h | 8 +- .../scenecommand/SetEchoSettingsFactory.cpp | 11 +- .../scenecommand/SetEchoSettingsFactory.h | 8 +- .../scenecommand/SetEntranceListFactory.cpp | 19 +- .../scenecommand/SetEntranceListFactory.h | 8 +- .../scenecommand/SetExitListFactory.cpp | 10 +- .../scenecommand/SetExitListFactory.h | 8 +- .../scenecommand/SetLightListFactory.cpp | 16 +- .../scenecommand/SetLightListFactory.h | 8 +- .../SetLightingSettingsFactory.cpp | 10 +- .../scenecommand/SetLightingSettingsFactory.h | 8 +- .../importer/scenecommand/SetMeshFactory.cpp | 44 +- .../importer/scenecommand/SetMeshFactory.h | 8 +- .../scenecommand/SetObjectListFactory.cpp | 8 +- .../scenecommand/SetObjectListFactory.h | 8 +- .../scenecommand/SetPathwaysFactory.cpp | 14 +- .../scenecommand/SetPathwaysFactory.h | 8 +- .../scenecommand/SetRoomBehaviorFactory.cpp | 11 +- .../scenecommand/SetRoomBehaviorFactory.h | 8 +- .../scenecommand/SetRoomListFactory.cpp | 18 +- .../scenecommand/SetRoomListFactory.h | 8 +- .../scenecommand/SetSkyboxModifierFactory.cpp | 14 +- .../scenecommand/SetSkyboxModifierFactory.h | 8 +- .../scenecommand/SetSkyboxSettingsFactory.cpp | 12 +- .../scenecommand/SetSkyboxSettingsFactory.h | 8 +- .../scenecommand/SetSoundSettingsFactory.cpp | 9 +- .../scenecommand/SetSoundSettingsFactory.h | 8 +- .../scenecommand/SetSpecialObjectsFactory.cpp | 12 +- .../scenecommand/SetSpecialObjectsFactory.h | 8 +- .../SetStartPositionListFactory.cpp | 12 +- .../SetStartPositionListFactory.h | 8 +- .../scenecommand/SetTimeSettingsFactory.cpp | 11 +- .../scenecommand/SetTimeSettingsFactory.h | 8 +- .../SetTransitionActorListFactory.cpp | 14 +- .../SetTransitionActorListFactory.h | 8 +- .../scenecommand/SetWindSettingsFactory.cpp | 11 +- .../scenecommand/SetWindSettingsFactory.h | 8 +- soh/soh/resource/logging/PathLogger.cpp | 42 +- soh/soh/resource/logging/PathLogger.h | 2 +- .../resource/logging/SceneCommandLoggers.cpp | 10 +- .../resource/logging/SceneCommandLoggers.h | 2 +- soh/soh/resource/type/Animation.cpp | 4 +- soh/soh/resource/type/Animation.h | 17 +- soh/soh/resource/type/Array.cpp | 2 +- soh/soh/resource/type/Array.h | 2 +- soh/soh/resource/type/AudioSample.h | 99 +- soh/soh/resource/type/AudioSequence.h | 7 +- soh/soh/resource/type/AudioSoundFont.h | 9 +- soh/soh/resource/type/Background.h | 5 +- soh/soh/resource/type/CollisionHeader.h | 12 +- soh/soh/resource/type/Cutscene.cpp | 2 +- soh/soh/resource/type/Cutscene.h | 4 +- soh/soh/resource/type/Path.h | 13 +- soh/soh/resource/type/PlayerAnimation.cpp | 2 +- soh/soh/resource/type/PlayerAnimation.h | 3 +- soh/soh/resource/type/Scene.cpp | 2 +- soh/soh/resource/type/Scene.h | 13 +- soh/soh/resource/type/Skeleton.cpp | 31 +- soh/soh/resource/type/Skeleton.h | 12 +- soh/soh/resource/type/SkeletonLimb.cpp | 2 +- soh/soh/resource/type/SkeletonLimb.h | 33 +- soh/soh/resource/type/Text.cpp | 2 +- soh/soh/resource/type/Text.h | 22 +- .../resource/type/scenecommand/EndMarker.cpp | 2 +- .../resource/type/scenecommand/EndMarker.h | 2 +- soh/soh/resource/type/scenecommand/RomFile.h | 12 +- .../resource/type/scenecommand/SceneCommand.h | 7 +- .../type/scenecommand/SetActorList.cpp | 2 +- .../resource/type/scenecommand/SetActorList.h | 6 +- .../type/scenecommand/SetAlternateHeaders.h | 3 +- .../type/scenecommand/SetCameraSettings.cpp | 2 +- .../type/scenecommand/SetCameraSettings.h | 6 +- .../type/scenecommand/SetCollisionHeader.cpp | 2 +- .../type/scenecommand/SetCollisionHeader.h | 2 +- .../type/scenecommand/SetCsCamera.cpp | 2 +- .../resource/type/scenecommand/SetCsCamera.h | 2 +- .../type/scenecommand/SetCutscenes.cpp | 2 +- .../resource/type/scenecommand/SetCutscenes.h | 2 +- .../type/scenecommand/SetEchoSettings.cpp | 2 +- .../type/scenecommand/SetEchoSettings.h | 4 +- .../type/scenecommand/SetEntranceList.cpp | 2 +- .../type/scenecommand/SetEntranceList.h | 2 +- .../type/scenecommand/SetExitList.cpp | 2 +- .../resource/type/scenecommand/SetExitList.h | 2 +- .../type/scenecommand/SetLightList.cpp | 2 +- .../resource/type/scenecommand/SetLightList.h | 2 +- .../type/scenecommand/SetLightingSettings.cpp | 2 +- .../type/scenecommand/SetLightingSettings.h | 2 +- .../resource/type/scenecommand/SetMesh.cpp | 2 +- soh/soh/resource/type/scenecommand/SetMesh.h | 56 +- .../type/scenecommand/SetObjectList.cpp | 2 +- .../type/scenecommand/SetObjectList.h | 2 +- .../resource/type/scenecommand/SetPathways.h | 2 +- .../type/scenecommand/SetRoomBehavior.cpp | 2 +- .../type/scenecommand/SetRoomBehavior.h | 6 +- .../type/scenecommand/SetRoomList.cpp | 2 +- .../resource/type/scenecommand/SetRoomList.h | 3 +- .../type/scenecommand/SetSkyboxModifier.cpp | 2 +- .../type/scenecommand/SetSkyboxModifier.h | 6 +- .../type/scenecommand/SetSkyboxSettings.cpp | 2 +- .../type/scenecommand/SetSkyboxSettings.h | 10 +- .../type/scenecommand/SetSoundSettings.cpp | 2 +- .../type/scenecommand/SetSoundSettings.h | 8 +- .../type/scenecommand/SetSpecialObjects.cpp | 2 +- .../type/scenecommand/SetSpecialObjects.h | 6 +- .../scenecommand/SetStartPositionList.cpp | 2 +- .../type/scenecommand/SetStartPositionList.h | 2 +- .../type/scenecommand/SetTimeSettings.cpp | 2 +- .../type/scenecommand/SetTimeSettings.h | 8 +- .../scenecommand/SetTransitionActorList.cpp | 2 +- .../scenecommand/SetTransitionActorList.h | 12 +- .../type/scenecommand/SetWindSettings.cpp | 2 +- .../type/scenecommand/SetWindSettings.h | 10 +- soh/soh/stubs.c | 238 +- soh/soh/util.cpp | 40 +- soh/soh/util.h | 24 +- soh/soh/z_message_OTR.cpp | 37 +- soh/soh/z_play_otr.cpp | 19 +- soh/soh/z_scene_otr.cpp | 13 +- soh/src/boot/boot_main.c | 2 +- soh/src/boot/idle.c | 9 +- soh/src/boot/is_debug.c | 2 +- soh/src/boot/z_std_dma.c | 14 +- soh/src/buffers/heaps.c | 6 +- soh/src/code/PreRender.c | 4 +- soh/src/code/TwoHeadArena.c | 2 +- soh/src/code/__osMalloc.c | 11 +- soh/src/code/audioMgr.c | 55 +- soh/src/code/audio_data.c | 6 +- soh/src/code/audio_effects.c | 2 +- soh/src/code/audio_heap.c | 3 +- soh/src/code/audio_load.c | 144 +- soh/src/code/audio_playback.c | 4 +- soh/src/code/audio_seqplayer.c | 25 +- soh/src/code/audio_synthesis.c | 24 +- soh/src/code/code_800A9F30.c | 1 - soh/src/code/code_800D2E30.c | 2 +- soh/src/code/code_800E4FE0.c | 8 +- soh/src/code/code_800EC960.c | 112 +- soh/src/code/code_800F7260.c | 24 +- soh/src/code/code_800F9280.c | 18 +- soh/src/code/code_800FC620.c | 3 +- soh/src/code/db_camera.c | 179 +- soh/src/code/fault.c | 49 +- soh/src/code/game.c | 10 +- soh/src/code/graph.c | 46 +- soh/src/code/loadfragment2.c | 3 +- soh/src/code/main.c | 6 +- soh/src/code/padmgr.c | 21 +- soh/src/code/padutils.c | 2 +- soh/src/code/relocation.c | 4 +- soh/src/code/sched.c | 2 +- soh/src/code/sys_cfb.c | 10 +- soh/src/code/sys_matrix.c | 13 +- soh/src/code/z_DLF.c | 31 +- soh/src/code/z_actor.c | 310 +- soh/src/code/z_bgcheck.c | 42 +- soh/src/code/z_camera.c | 67 +- soh/src/code/z_cheap_proc.c | 16 +- soh/src/code/z_collision_check.c | 171 +- soh/src/code/z_construct.c | 4 +- soh/src/code/z_debug.c | 58 +- soh/src/code/z_debug_display.c | 6 +- soh/src/code/z_demo.c | 111 +- soh/src/code/z_draw.c | 225 +- soh/src/code/z_eff_blure.c | 4 +- soh/src/code/z_eff_shield_particle.c | 2 +- soh/src/code/z_effect_soft_sprite.c | 15 +- soh/src/code/z_effect_soft_sprite_dlftbls.c | 12 +- soh/src/code/z_effect_soft_sprite_old_init.c | 92 +- soh/src/code/z_elf_message.c | 2 +- soh/src/code/z_en_a_keep.c | 8 +- soh/src/code/z_en_item00.c | 95 +- soh/src/code/z_face_reaction.c | 4 +- soh/src/code/z_fbdemo_circle.c | 6 +- soh/src/code/z_fbdemo_triforce.c | 2 +- soh/src/code/z_fcurve_data_skelanime.c | 11 +- soh/src/code/z_frame_advance.c | 4 +- soh/src/code/z_game_over.c | 5 +- soh/src/code/z_horse.c | 62 +- soh/src/code/z_inventory.c | 3 +- soh/src/code/z_jpeg.c | 3 +- soh/src/code/z_kaleido_manager.c | 14 +- soh/src/code/z_kaleido_scope_call.c | 12 +- soh/src/code/z_kaleido_setup.c | 8 +- soh/src/code/z_kanfont.c | 21 +- soh/src/code/z_kankyo.c | 186 +- soh/src/code/z_lifemeter.c | 59 +- soh/src/code/z_lights.c | 5 +- soh/src/code/z_malloc.c | 2 +- soh/src/code/z_map_data.c | 35 +- soh/src/code/z_map_exp.c | 286 +- soh/src/code/z_map_mark.c | 98 +- soh/src/code/z_message_PAL.c | 476 +- soh/src/code/z_moji.c | 8 +- soh/src/code/z_olib.c | 1 - soh/src/code/z_onepointdemo.c | 11 +- soh/src/code/z_parameter.c | 1682 ++--- soh/src/code/z_play.c | 130 +- soh/src/code/z_player_call.c | 4 +- soh/src/code/z_player_lib.c | 494 +- soh/src/code/z_rcp.c | 12 +- soh/src/code/z_room.c | 55 +- soh/src/code/z_scene.c | 23 +- soh/src/code/z_scene_table.c | 292 +- soh/src/code/z_skelanime.c | 127 +- soh/src/code/z_skin_awb.c | 6 +- soh/src/code/z_sound_source.c | 3 +- soh/src/code/z_sram.c | 34 +- soh/src/code/z_ss_sram.c | 8 +- soh/src/code/z_view.c | 26 +- soh/src/code/z_vismono.c | 2 +- soh/src/code/z_vr_box.c | 739 +-- soh/src/code/z_vr_box_draw.c | 4 +- soh/src/libultra/gu/guLookAt.c | 4 +- soh/src/libultra/gu/guPerspectiveF.c | 2 +- soh/src/libultra/gu/ortho.c | 2 +- soh/src/libultra/libc/sprintf.c | 6 +- .../actors/ovl_Arms_Hook/z_arms_hook.c | 24 +- .../actors/ovl_Arrow_Fire/z_arrow_fire.c | 18 +- .../actors/ovl_Arrow_Ice/z_arrow_ice.c | 18 +- .../actors/ovl_Arrow_Light/z_arrow_light.c | 18 +- .../ovl_Bg_Bdan_Objects/z_bg_bdan_objects.c | 12 +- .../ovl_Bg_Bdan_Switch/z_bg_bdan_switch.c | 3 +- .../actors/ovl_Bg_Bowl_Wall/z_bg_bowl_wall.c | 6 +- .../actors/ovl_Bg_Breakwall/z_bg_breakwall.c | 26 +- .../actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.c | 4 +- .../actors/ovl_Bg_Dodoago/z_bg_dodoago.c | 22 +- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c | 36 +- .../ovl_Bg_Ganon_Otyuka/z_bg_ganon_otyuka.c | 14 +- .../ovl_Bg_Gate_Shutter/z_bg_gate_shutter.c | 3 +- .../ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c | 20 +- .../ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c | 6 +- .../ovl_Bg_Gnd_Firemeiro/z_bg_gnd_firemeiro.c | 6 +- .../ovl_Bg_Gnd_Soulmeiro/z_bg_gnd_soulmeiro.c | 18 +- .../overlays/actors/ovl_Bg_Haka/z_bg_haka.c | 18 +- .../actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c | 13 +- .../ovl_Bg_Haka_Sgami/z_bg_haka_sgami.c | 4 +- .../actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c | 15 +- .../actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c | 9 +- .../actors/ovl_Bg_Haka_Tubo/z_bg_haka_tubo.c | 11 +- .../ovl_Bg_Haka_Water/z_bg_haka_water.c | 11 +- .../actors/ovl_Bg_Haka_Zou/z_bg_haka_zou.c | 4 +- .../ovl_Bg_Heavy_Block/z_bg_heavy_block.c | 17 +- .../ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c | 11 +- .../z_bg_hidan_firewall.c | 3 +- .../ovl_Bg_Hidan_Fslift/z_bg_hidan_fslift.c | 6 +- .../ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c | 3 +- .../ovl_Bg_Hidan_Hamstep/z_bg_hidan_hamstep.c | 11 +- .../ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.c | 3 +- .../z_bg_hidan_kowarerukabe.c | 7 +- .../ovl_Bg_Hidan_Rock/z_bg_hidan_rock.c | 8 +- .../z_bg_hidan_rsekizou.c | 7 +- .../ovl_Bg_Hidan_Sekizou/z_bg_hidan_sekizou.c | 23 +- .../ovl_Bg_Hidan_Sima/z_bg_hidan_sima.c | 14 +- .../ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c | 25 +- .../ovl_Bg_Ice_Turara/z_bg_ice_turara.c | 3 +- .../actors/ovl_Bg_Ingate/z_bg_ingate.c | 3 +- .../z_bg_jya_amishutter.c | 3 +- .../ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.c | 15 +- .../actors/ovl_Bg_Jya_Block/z_bg_jya_block.c | 3 +- .../z_bg_jya_bombchuiwa.c | 9 +- .../actors/ovl_Bg_Jya_Cobra/z_bg_jya_cobra.c | 9 +- .../ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c | 3 +- .../ovl_Bg_Jya_Ironobj/z_bg_jya_ironobj.c | 7 +- .../actors/ovl_Bg_Jya_Lift/z_bg_jya_lift.c | 9 +- .../ovl_Bg_Jya_Megami/z_bg_jya_megami.c | 8 +- .../z_bg_jya_zurerukabe.c | 3 +- .../ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c | 3 +- .../ovl_Bg_Mizu_Bwall/z_bg_mizu_bwall.c | 48 +- .../ovl_Bg_Mizu_Movebg/z_bg_mizu_movebg.c | 13 +- .../ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c | 3 +- .../ovl_Bg_Mizu_Water/z_bg_mizu_water.c | 3 +- .../overlays/actors/ovl_Bg_Mjin/z_bg_mjin.c | 3 +- .../ovl_Bg_Mori_Bigst/z_bg_mori_bigst.c | 26 +- .../ovl_Bg_Mori_Elevator/z_bg_mori_elevator.c | 3 +- .../ovl_Bg_Mori_Hashigo/z_bg_mori_hashigo.c | 18 +- .../ovl_Bg_Mori_Hashira4/z_bg_mori_hashira4.c | 9 +- .../ovl_Bg_Mori_Hineri/z_bg_mori_hineri.c | 27 +- .../ovl_Bg_Mori_Idomizu/z_bg_mori_idomizu.c | 6 +- .../z_bg_mori_kaitenkabe.c | 6 +- .../z_bg_mori_rakkatenjo.c | 3 +- .../actors/ovl_Bg_Po_Event/z_bg_po_event.c | 24 +- .../ovl_Bg_Po_Syokudai/z_bg_po_syokudai.c | 18 +- .../actors/ovl_Bg_Pushbox/z_bg_pushbox.c | 3 +- .../z_bg_spot00_hanebasi.c | 12 +- .../ovl_Bg_Spot01_Fusya/z_bg_spot01_fusya.c | 3 +- .../z_bg_spot01_idohashira.c | 6 +- .../z_bg_spot01_idomizu.c | 7 +- .../z_bg_spot01_idosoko.c | 9 +- .../z_bg_spot01_objects2.c | 6 +- .../z_bg_spot02_objects.c | 48 +- .../ovl_Bg_Spot03_Taki/z_bg_spot03_taki.c | 5 +- .../z_bg_spot06_objects.c | 28 +- .../ovl_Bg_Spot07_Taki/z_bg_spot07_taki.c | 10 +- .../z_bg_spot08_bakudankabe.c | 4 +- .../z_bg_spot08_iceblock.c | 3 +- .../ovl_Bg_Spot09_Obj/z_bg_spot09_obj.c | 7 +- .../z_bg_spot11_bakudankabe.c | 4 +- .../ovl_Bg_Spot11_Oasis/z_bg_spot11_oasis.c | 11 +- .../ovl_Bg_Spot15_Rrbox/z_bg_spot15_rrbox.c | 7 +- .../ovl_Bg_Spot15_Saku/z_bg_spot15_saku.c | 3 +- .../z_bg_spot16_bombstone.c | 44 +- .../z_bg_spot16_doughnut.c | 11 +- .../z_bg_spot17_bakudankabe.c | 10 +- .../ovl_Bg_Spot17_Funen/z_bg_spot17_funen.c | 6 +- .../ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c | 7 +- .../ovl_Bg_Spot18_Obj/z_bg_spot18_obj.c | 3 +- .../actors/ovl_Bg_Sst_Floor/z_bg_sst_floor.c | 6 +- .../ovl_Bg_Toki_Hikari/z_bg_toki_hikari.c | 21 +- .../actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 13 +- .../actors/ovl_Bg_Treemouth/z_bg_treemouth.c | 12 +- .../actors/ovl_Bg_Vb_Sima/z_bg_vb_sima.c | 7 +- .../actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c | 8 +- .../actors/ovl_Bg_Ydan_Sp/z_bg_ydan_sp.c | 22 +- soh/src/overlays/actors/ovl_Bg_Zg/z_bg_zg.c | 7 +- .../actors/ovl_Boss_Dodongo/z_boss_dodongo.c | 45 +- .../overlays/actors/ovl_Boss_Fd/z_boss_fd.c | 109 +- .../overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c | 33 +- .../actors/ovl_Boss_Ganon/z_boss_ganon.c | 205 +- .../actors/ovl_Boss_Ganon2/z_boss_ganon2.c | 108 +- .../ovl_Boss_Ganon2/z_boss_ganon2_data.c | 2 +- .../ovl_Boss_Ganondrof/z_boss_ganondrof.c | 42 +- .../actors/ovl_Boss_Goma/z_boss_goma.c | 59 +- .../overlays/actors/ovl_Boss_Mo/z_boss_mo.c | 92 +- .../overlays/actors/ovl_Boss_Sst/z_boss_sst.c | 82 +- .../overlays/actors/ovl_Boss_Tw/z_boss_tw.c | 287 +- .../overlays/actors/ovl_Boss_Va/z_boss_va.c | 232 +- .../overlays/actors/ovl_Demo_6K/z_demo_6k.c | 35 +- .../overlays/actors/ovl_Demo_Du/z_demo_du.c | 25 +- .../overlays/actors/ovl_Demo_Ec/z_demo_ec.c | 24 +- .../actors/ovl_Demo_Effect/z_demo_effect.c | 140 +- .../overlays/actors/ovl_Demo_Ext/z_demo_ext.c | 4 +- .../actors/ovl_Demo_Geff/z_demo_geff.c | 3 +- .../overlays/actors/ovl_Demo_Gj/z_demo_gj.c | 14 +- .../overlays/actors/ovl_Demo_Gt/z_demo_gt.c | 22 +- .../overlays/actors/ovl_Demo_Ik/z_demo_ik.c | 37 +- .../overlays/actors/ovl_Demo_Im/z_demo_im.c | 16 +- .../actors/ovl_Demo_Kankyo/z_demo_kankyo.c | 44 +- .../actors/ovl_Demo_Kekkai/z_demo_kekkai.c | 22 +- .../overlays/actors/ovl_Demo_Sa/z_demo_sa.c | 14 +- .../overlays/actors/ovl_Demo_Shd/z_demo_shd.c | 11 +- .../actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c | 4 +- .../overlays/actors/ovl_Door_Ana/z_door_ana.c | 10 +- .../actors/ovl_Door_Gerudo/z_door_gerudo.c | 3 +- .../actors/ovl_Door_Killer/z_door_killer.c | 18 +- .../actors/ovl_Door_Shutter/z_door_shutter.c | 50 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 76 +- .../actors/ovl_Efc_Erupc/z_efc_erupc.c | 9 +- .../overlays/actors/ovl_Eff_Dust/z_eff_dust.c | 6 +- .../overlays/actors/ovl_Elf_Msg/z_elf_msg.c | 8 +- .../overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c | 11 +- soh/src/overlays/actors/ovl_En_Am/z_en_am.c | 45 +- soh/src/overlays/actors/ovl_En_Ani/z_en_ani.c | 4 +- .../actors/ovl_En_Anubice/z_en_anubice.c | 13 +- .../ovl_En_Anubice_Fire/z_en_anubice_fire.c | 3 +- .../actors/ovl_En_Arow_Trap/z_en_arow_trap.c | 6 +- .../overlays/actors/ovl_En_Arrow/z_en_arrow.c | 45 +- soh/src/overlays/actors/ovl_En_Ba/z_en_ba.c | 21 +- soh/src/overlays/actors/ovl_En_Bb/z_en_bb.c | 18 +- .../actors/ovl_En_Bdfire/z_en_bdfire.c | 7 +- .../actors/ovl_En_Bigokuta/z_en_bigokuta.c | 11 +- .../overlays/actors/ovl_En_Bili/z_en_bili.c | 14 +- .../actors/ovl_En_Blkobj/z_en_blkobj.c | 20 +- soh/src/overlays/actors/ovl_En_Bom/z_en_bom.c | 15 +- .../ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c | 34 +- .../actors/ovl_En_Bom_Chu/z_en_bom_chu.c | 20 +- .../overlays/actors/ovl_En_Bombf/z_en_bombf.c | 29 +- .../overlays/actors/ovl_En_Boom/z_en_boom.c | 10 +- soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 90 +- .../overlays/actors/ovl_En_Brob/z_en_brob.c | 4 +- .../actors/ovl_En_Bubble/z_en_bubble.c | 3 +- .../overlays/actors/ovl_En_Butte/z_en_butte.c | 6 +- soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c | 38 +- soh/src/overlays/actors/ovl_En_Bx/z_en_bx.c | 6 +- .../actors/ovl_En_Changer/z_en_changer.c | 26 +- .../actors/ovl_En_Clear_Tag/z_en_clear_tag.c | 79 +- soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c | 9 +- .../overlays/actors/ovl_En_Crow/z_en_crow.c | 16 +- .../overlays/actors/ovl_En_Daiku/z_en_daiku.c | 15 +- .../z_en_daiku_kakariko.c | 9 +- .../actors/ovl_En_Dekubaba/z_en_dekubaba.c | 40 +- .../actors/ovl_En_Dekunuts/z_en_dekunuts.c | 21 +- soh/src/overlays/actors/ovl_En_Dh/z_en_dh.c | 17 +- .../ovl_En_Diving_Game/z_en_diving_game.c | 11 +- soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c | 20 +- .../actors/ovl_En_Dnt_Demo/z_en_dnt_demo.c | 10 +- .../actors/ovl_En_Dnt_Jiji/z_en_dnt_jiji.c | 6 +- .../actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c | 23 +- .../actors/ovl_En_Dodojr/z_en_dodojr.c | 14 +- .../actors/ovl_En_Dodongo/z_en_dodongo.c | 13 +- soh/src/overlays/actors/ovl_En_Dog/z_en_dog.c | 9 +- .../overlays/actors/ovl_En_Door/z_en_door.c | 24 +- soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c | 10 +- soh/src/overlays/actors/ovl_En_Du/z_en_du.c | 21 +- .../actors/ovl_En_Dy_Extra/z_en_dy_extra.c | 7 +- .../overlays/actors/ovl_En_Eiyer/z_en_eiyer.c | 11 +- soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 19 +- .../actors/ovl_En_Encount1/z_en_encount1.c | 26 +- .../actors/ovl_En_Encount2/z_en_encount2.c | 17 +- .../actors/ovl_En_Ex_Item/z_en_ex_item.c | 9 +- .../actors/ovl_En_Ex_Ruppy/z_en_ex_ruppy.c | 18 +- soh/src/overlays/actors/ovl_En_Fd/z_en_fd.c | 34 +- .../actors/ovl_En_Fd_Fire/z_en_fd_fire.c | 9 +- .../actors/ovl_En_Fhg_Fire/z_en_fhg_fire.c | 59 +- .../actors/ovl_En_Fire_Rock/z_en_fire_rock.c | 11 +- .../actors/ovl_En_Firefly/z_en_firefly.c | 19 +- .../overlays/actors/ovl_En_Fish/z_en_fish.c | 11 +- .../actors/ovl_En_Floormas/z_en_floormas.c | 18 +- soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c | 51 +- soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 4 +- soh/src/overlays/actors/ovl_En_Fw/z_en_fw.c | 17 +- soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c | 19 +- .../actors/ovl_En_G_Switch/z_en_g_switch.c | 60 +- .../ovl_En_Ganon_Mant/z_en_ganon_mant.c | 9 +- .../ovl_En_Ganon_Organ/z_en_ganon_organ.c | 5 +- soh/src/overlays/actors/ovl_En_Gb/z_en_gb.c | 10 +- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 11 +- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 6 +- soh/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 2 +- .../overlays/actors/ovl_En_GeldB/z_en_geldb.c | 19 +- .../overlays/actors/ovl_En_GirlA/z_en_girla.c | 69 +- soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c | 8 +- soh/src/overlays/actors/ovl_En_Go/z_en_go.c | 44 +- soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c | 103 +- .../overlays/actors/ovl_En_Goma/z_en_goma.c | 38 +- .../actors/ovl_En_Goroiwa/z_en_goroiwa.c | 16 +- soh/src/overlays/actors/ovl_En_Gs/z_en_gs.c | 46 +- .../overlays/actors/ovl_En_Guest/z_en_guest.c | 6 +- .../overlays/actors/ovl_En_Hata/z_en_hata.c | 4 +- .../actors/ovl_En_Heishi1/z_en_heishi1.c | 19 +- .../actors/ovl_En_Heishi2/z_en_heishi2.c | 19 +- .../actors/ovl_En_Heishi3/z_en_heishi3.c | 10 +- .../actors/ovl_En_Heishi4/z_en_heishi4.c | 21 +- .../actors/ovl_En_Hintnuts/z_en_hintnuts.c | 22 +- .../overlays/actors/ovl_En_Holl/z_en_holl.c | 3 +- .../actors/ovl_En_Honotrap/z_en_honotrap.c | 6 +- .../overlays/actors/ovl_En_Horse/z_en_horse.c | 187 +- .../z_en_horse_game_check.c | 15 +- .../ovl_En_Horse_Ganon/z_en_horse_ganon.c | 10 +- .../z_en_horse_link_child.c | 27 +- .../ovl_En_Horse_Normal/z_en_horse_normal.c | 54 +- .../ovl_En_Horse_Zelda/z_en_horse_zelda.c | 3 +- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 51 +- .../actors/ovl_En_Ice_Hono/z_en_ice_hono.c | 16 +- soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c | 101 +- soh/src/overlays/actors/ovl_En_In/z_en_in.c | 20 +- .../actors/ovl_En_Insect/z_en_insect.c | 6 +- .../overlays/actors/ovl_En_Ishi/z_en_ishi.c | 12 +- soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c | 7 +- soh/src/overlays/actors/ovl_En_Js/z_en_js.c | 9 +- .../actors/ovl_En_Jsjutan/z_en_jsjutan.c | 6 +- .../actors/ovl_En_Kakasi2/z_en_kakasi2.c | 12 +- .../actors/ovl_En_Kakasi3/z_en_kakasi3.c | 3 +- .../actors/ovl_En_Kanban/z_en_kanban.c | 16 +- .../actors/ovl_En_Karebaba/z_en_karebaba.c | 22 +- soh/src/overlays/actors/ovl_En_Ko/z_en_ko.c | 32 +- soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 23 +- .../overlays/actors/ovl_En_Light/z_en_light.c | 8 +- .../actors/ovl_En_Lightbox/z_en_lightbox.c | 8 +- .../actors/ovl_En_M_Thunder/z_en_m_thunder.c | 70 +- soh/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 32 +- soh/src/overlays/actors/ovl_En_Ma2/z_en_ma2.c | 7 +- soh/src/overlays/actors/ovl_En_Ma3/z_en_ma3.c | 4 +- soh/src/overlays/actors/ovl_En_Mag/z_en_mag.c | 46 +- soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c | 32 +- soh/src/overlays/actors/ovl_En_Md/z_en_md.c | 45 +- soh/src/overlays/actors/ovl_En_Mk/z_en_mk.c | 5 +- soh/src/overlays/actors/ovl_En_Ms/z_en_ms.c | 8 +- soh/src/overlays/actors/ovl_En_Nb/z_en_nb.c | 19 +- soh/src/overlays/actors/ovl_En_Niw/z_en_niw.c | 7 +- .../actors/ovl_En_Niw_Girl/z_en_niw_girl.c | 6 +- .../actors/ovl_En_Niw_Lady/z_en_niw_lady.c | 13 +- .../actors/ovl_En_Nutsball/z_en_nutsball.c | 19 +- soh/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c | 3 +- soh/src/overlays/actors/ovl_En_Ny/z_en_ny.c | 13 +- .../z_en_okarina_effect.c | 4 +- .../ovl_En_Okarina_Tag/z_en_okarina_tag.c | 18 +- .../overlays/actors/ovl_En_Okuta/z_en_okuta.c | 30 +- .../overlays/actors/ovl_En_Ossan/z_en_ossan.c | 63 +- soh/src/overlays/actors/ovl_En_Owl/z_en_owl.c | 20 +- .../overlays/actors/ovl_En_Part/z_en_part.c | 15 +- .../actors/ovl_En_Partner/z_en_partner.c | 33 +- .../actors/ovl_En_Peehat/z_en_peehat.c | 28 +- .../actors/ovl_En_Po_Desert/z_en_po_desert.c | 17 +- .../actors/ovl_En_Po_Field/z_en_po_field.c | 69 +- .../actors/ovl_En_Po_Relay/z_en_po_relay.c | 46 +- .../ovl_En_Po_Sisters/z_en_po_sisters.c | 38 +- soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c | 67 +- .../actors/ovl_En_Pu_box/z_en_pu_box.c | 4 +- soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c | 60 +- .../overlays/actors/ovl_En_Reeba/z_en_reeba.c | 12 +- .../ovl_En_River_Sound/z_en_river_sound.c | 9 +- soh/src/overlays/actors/ovl_En_Rl/z_en_rl.c | 10 +- soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c | 15 +- soh/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c | 52 +- soh/src/overlays/actors/ovl_En_Ru2/z_en_ru2.c | 7 +- soh/src/overlays/actors/ovl_En_Sa/z_en_sa.c | 25 +- soh/src/overlays/actors/ovl_En_Sda/z_en_sda.c | 9 +- .../actors/ovl_En_Shopnuts/z_en_shopnuts.c | 19 +- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 3 +- .../actors/ovl_En_Siofuki/z_en_siofuki.c | 3 +- soh/src/overlays/actors/ovl_En_Skb/z_en_skb.c | 9 +- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 51 +- .../actors/ovl_En_Skjneedle/z_en_skjneedle.c | 3 +- soh/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c | 18 +- soh/src/overlays/actors/ovl_En_St/z_en_st.c | 7 +- soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 15 +- .../actors/ovl_En_Stream/z_en_stream.c | 7 +- soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c | 39 +- .../ovl_En_Syateki_Itm/z_en_syateki_itm.c | 22 +- .../ovl_En_Syateki_Man/z_en_syateki_man.c | 27 +- .../ovl_En_Syateki_Niw/z_en_syateki_niw.c | 10 +- soh/src/overlays/actors/ovl_En_Ta/z_en_ta.c | 6 +- .../ovl_En_Takara_Man/z_en_takara_man.c | 13 +- .../overlays/actors/ovl_En_Tana/z_en_tana.c | 6 +- .../overlays/actors/ovl_En_Test/z_en_test.c | 17 +- .../overlays/actors/ovl_En_Tite/z_en_tite.c | 23 +- soh/src/overlays/actors/ovl_En_Tk/z_en_tk.c | 19 +- .../actors/ovl_En_Torch2/z_en_torch2.c | 48 +- .../overlays/actors/ovl_En_Toryo/z_en_toryo.c | 6 +- soh/src/overlays/actors/ovl_En_Tp/z_en_tp.c | 43 +- soh/src/overlays/actors/ovl_En_Tr/z_en_tr.c | 13 +- .../actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c | 10 +- .../overlays/actors/ovl_En_Vali/z_en_vali.c | 26 +- .../actors/ovl_En_Vb_Ball/z_en_vb_ball.c | 33 +- .../actors/ovl_En_Viewer/z_en_viewer.c | 75 +- soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c | 25 +- .../actors/ovl_En_Wallmas/z_en_wallmas.c | 27 +- .../ovl_En_Weather_Tag/z_en_weather_tag.c | 9 +- .../actors/ovl_En_Weiyer/z_en_weiyer.c | 11 +- soh/src/overlays/actors/ovl_En_Wf/z_en_wf.c | 7 +- .../ovl_En_Wonder_Item/z_en_wonder_item.c | 5 +- .../ovl_En_Wonder_Talk/z_en_wonder_talk.c | 10 +- .../actors/ovl_En_Wood02/z_en_wood02.c | 29 +- soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c | 38 +- .../actors/ovl_En_Yukabyun/z_en_yukabyun.c | 3 +- soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c | 48 +- soh/src/overlays/actors/ovl_En_Zl1/z_en_zl1.c | 10 +- soh/src/overlays/actors/ovl_En_Zl2/z_en_zl2.c | 13 +- soh/src/overlays/actors/ovl_En_Zl3/z_en_zl3.c | 29 +- soh/src/overlays/actors/ovl_En_Zl4/z_en_zl4.c | 4 +- soh/src/overlays/actors/ovl_En_Zo/z_en_zo.c | 15 +- soh/src/overlays/actors/ovl_En_fHG/z_en_fhg.c | 17 +- .../actors/ovl_End_Title/z_end_title.c | 7 +- .../overlays/actors/ovl_Fishing/z_fishing.c | 215 +- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 6 +- .../ovl_Item_Etcetera/z_item_etcetera.c | 2 +- .../actors/ovl_Item_Ocarina/z_item_ocarina.c | 19 +- .../actors/ovl_Item_Shield/z_item_shield.c | 6 +- .../actors/ovl_Magic_Dark/z_magic_dark.c | 17 +- .../actors/ovl_Magic_Fire/z_magic_fire.c | 12 +- .../actors/ovl_Magic_Wind/z_magic_wind.c | 11 +- .../overlays/actors/ovl_Mir_Ray/z_mir_ray.c | 3 +- .../overlays/actors/ovl_Obj_Bean/z_obj_bean.c | 6 +- .../overlays/actors/ovl_Obj_Comb/z_obj_comb.c | 7 +- .../actors/ovl_Obj_Dekujr/z_obj_dekujr.c | 14 +- .../actors/ovl_Obj_Elevator/z_obj_elevator.c | 4 +- .../actors/ovl_Obj_Hamishi/z_obj_hamishi.c | 7 +- .../actors/ovl_Obj_Hsblock/z_obj_hsblock.c | 9 +- .../actors/ovl_Obj_Ice_Poly/z_obj_ice_poly.c | 3 +- .../actors/ovl_Obj_Kibako/z_obj_kibako.c | 15 +- .../actors/ovl_Obj_Kibako2/z_obj_kibako2.c | 11 +- .../ovl_Obj_Lightswitch/z_obj_lightswitch.c | 35 +- .../ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c | 5 +- .../overlays/actors/ovl_Obj_Mure/z_obj_mure.c | 3 +- .../actors/ovl_Obj_Mure2/z_obj_mure2.c | 3 +- .../actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c | 18 +- .../ovl_Obj_Roomtimer/z_obj_roomtimer.c | 3 +- .../actors/ovl_Obj_Switch/z_obj_switch.c | 15 +- .../actors/ovl_Obj_Syokudai/z_obj_syokudai.c | 23 +- .../ovl_Obj_Timeblock/z_obj_timeblock.c | 11 +- .../actors/ovl_Obj_Tsubo/z_obj_tsubo.c | 6 +- .../ovl_Obj_Warp2block/z_obj_warp2block.c | 12 +- .../ovl_Object_Kankyo/z_object_kankyo.c | 25 +- .../actors/ovl_Oceff_Spot/z_oceff_spot.c | 7 +- .../actors/ovl_Oceff_Storm/z_oceff_storm.c | 7 +- .../actors/ovl_Oceff_Wipe/z_oceff_wipe.c | 3 +- .../actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c | 3 +- .../actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c | 3 +- .../actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c | 5 +- .../actors/ovl_player_actor/z_player.c | 971 +-- .../ovl_Effect_Ss_Blast/z_eff_ss_blast.c | 3 +- .../ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c | 3 +- .../ovl_Effect_Ss_Dead_Db/z_eff_ss_dead_db.c | 3 +- .../ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c | 3 +- .../z_eff_ss_dead_sound.c | 3 +- .../z_eff_ss_dt_bubble.c | 3 +- .../ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.c | 9 +- .../ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.c | 3 +- .../ovl_Effect_Ss_Extra/z_eff_ss_extra.c | 3 +- .../ovl_Effect_Ss_Fcircle/z_eff_ss_fcircle.c | 3 +- .../z_eff_ss_fhg_flash.c | 6 +- .../z_eff_ss_fire_tail.c | 9 +- .../z_eff_ss_g_magma2.c | 3 +- .../ovl_Effect_Ss_Hahen/z_eff_ss_hahen.c | 6 +- .../z_eff_ss_ice_piece.c | 3 +- .../z_eff_ss_ice_smoke.c | 5 +- .../ovl_Effect_Ss_K_Fire/z_eff_ss_k_fire.c | 7 +- .../ovl_Effect_Ss_Kakera/z_eff_ss_kakera.c | 6 +- .../ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c | 3 +- .../ovl_Effect_Ss_Sibuki2/z_eff_ss_sibuki2.c | 3 +- .../z_eff_ss_solder_srch_ball.c | 6 +- .../ovl_Effect_Ss_Stick/z_eff_ss_stick.c | 3 +- .../ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c | 3 +- .../ovl_file_choose/z_file_choose.c | 970 +-- .../ovl_file_choose/z_file_copy_erase.c | 66 +- .../ovl_file_choose/z_file_nameset_NES.c | 495 +- .../ovl_file_choose/z_file_nameset_PAL.c | 187 +- .../ovl_file_choose/z_file_nameset_data.c | 4 +- .../overlays/gamestates/ovl_select/z_select.c | 553 +- .../overlays/gamestates/ovl_title/z_title.c | 15 +- .../ovl_kaleido_scope/z_kaleido_collect.c | 80 +- .../misc/ovl_kaleido_scope/z_kaleido_debug.c | 3 +- .../ovl_kaleido_scope/z_kaleido_equipment.c | 185 +- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 395 +- .../ovl_kaleido_scope/z_kaleido_map_PAL.c | 55 +- .../misc/ovl_kaleido_scope/z_kaleido_prompt.c | 12 +- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 735 ++- .../misc/ovl_kaleido_scope/z_lmap_mark.c | 6 +- .../misc/ovl_kaleido_scope/z_lmap_mark_data.c | 199 +- .../misc/ovl_map_mark_data/z_map_mark_data.c | 10 +- 885 files changed, 40384 insertions(+), 36263 deletions(-) diff --git a/soh/platform/pathconf.c b/soh/platform/pathconf.c index 9e4111db3..a52d313a5 100644 --- a/soh/platform/pathconf.c +++ b/soh/platform/pathconf.c @@ -1,5 +1,5 @@ #include -long pathconf(const char *path, int name) { +long pathconf(const char* path, int name) { return -1; } \ No newline at end of file diff --git a/soh/resource.h b/soh/resource.h index 8a193b3e8..771a9af38 100644 --- a/soh/resource.h +++ b/soh/resource.h @@ -2,15 +2,15 @@ // Microsoft Visual C++ generated include file. // Used by Resource.rc // -#define IDI_ICON1 111 +#define IDI_ICON1 111 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 113 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 113 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index 8b7c43ee6..70ea29675 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -4,7 +4,6 @@ ActorDB* ActorDB::Instance; - #define DEFINE_ACTOR(name, _1, _2) extern "C" ActorInit name##_InitVars; #define DEFINE_ACTOR_INTERNAL(name, _1, _2) extern "C" ActorInit name##_InitVars; #define DEFINE_ACTOR_UNSET(_0) @@ -464,7 +463,8 @@ static constexpr std::pair actorDescriptionData[] = { { ACTOR_BG_JYA_BLOCK, "Silver Block (Child Era)" }, { ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" }, }; -static std::unordered_map actorDescriptions = std::unordered_map(std::begin(actorDescriptionData), std::end(actorDescriptionData)); +static std::unordered_map actorDescriptions = + std::unordered_map(std::begin(actorDescriptionData), std::end(actorDescriptionData)); ActorDB::ActorDB() { db.reserve(ACTOR_NUMBER_MAX); // reserve size for all initial entries so we don't do it for each @@ -475,7 +475,8 @@ ActorDB::ActorDB() { // Adds an actor at the given index. The name must be unique. ActorDB::Entry& ActorDB::AddEntry(const std::string& name, const std::string& desc, size_t index) { - assert(!nameTable.contains(name)); // TODO this should maybe throw instead. We'll need to think about error handling for mods that try to declare the same actor. + assert(!nameTable.contains(name)); // TODO this should maybe throw instead. We'll need to think about error handling + // for mods that try to declare the same actor. if (db.size() < (index + 1)) { db.resize(index + 1); @@ -513,7 +514,8 @@ ActorDB::Entry& ActorDB::AddEntry(const std::string& name, const std::string& de return entry; } -// Adds an actor with the new ActorDBInit struct. The id assigned to the actor is dynamic. Use the return Entry or RetrieveId to get it. +// Adds an actor with the new ActorDBInit struct. The id assigned to the actor is dynamic. Use the return Entry or +// RetrieveId to get it. ActorDB::Entry& ActorDB::AddEntry(const ActorDBInit& init) { Entry& entry = AddEntry(init.name, init.desc, nextFreeId); @@ -598,7 +600,8 @@ static ActorDBInit EnPartnerInit = { "En_Partner", "Ivan", ACTORCAT_ITEMACTION, - (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER | ACTOR_FLAG_CAN_PRESS_SWITCHES), + (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/ActorDB.h b/soh/soh/ActorDB.h index 8bcbb3f6a..dd8ecf901 100644 --- a/soh/soh/ActorDB.h +++ b/soh/soh/ActorDB.h @@ -39,7 +39,7 @@ struct ActorDBInit { }; class ActorDB { -public: + public: static ActorDB* Instance; ActorDB(); @@ -65,7 +65,8 @@ public: static void AddBuiltInCustomActors(); int GetEntryCount(); -private: + + private: Entry& AddEntry(const std::string& name, const std::string& desc, size_t index); Entry& AddEntry(const std::string& name, const std::string& desc, const ActorInit& init); diff --git a/soh/soh/CrashHandlerExp.h b/soh/soh/CrashHandlerExp.h index fd57bba42..8cda6e61e 100644 --- a/soh/soh/CrashHandlerExp.h +++ b/soh/soh/CrashHandlerExp.h @@ -1,11 +1,10 @@ #include - #ifdef __cplusplus extern "C" { #endif -void CrashHandler_PrintSohData(char* buffer, size_t* pos); +void CrashHandler_PrintSohData(char* buffer, size_t* pos); #ifdef __cplusplus } diff --git a/soh/soh/CrashHandlerExt.cpp b/soh/soh/CrashHandlerExt.cpp index c4a535f12..cc9c7b1ee 100644 --- a/soh/soh/CrashHandlerExt.cpp +++ b/soh/soh/CrashHandlerExt.cpp @@ -22,7 +22,7 @@ static std::array sCatToStrArray{ #define DEFINE_SCENE(_1, _2, enumName, _4, _5, _6) #enumName static std::array sSceneIdToStrArray{ - #include "tables/scene_table.h" +#include "tables/scene_table.h" }; #undef DEFINE_SCENE @@ -46,7 +46,7 @@ static void CrashHandler_WriteActorData(char* buffer, size_t* pos) { ActorListEntry* entry = &gPlayState->actorCtx.actorLists[i]; Actor* cur; - if(entry->length == 0) { + if (entry->length == 0) { continue; } WRITE_VAR_LINE(buffer, pos, "Actor Cat: ", sCatToStrArray[i]); @@ -76,7 +76,7 @@ extern "C" void CrashHandler_PrintSohData(char* buffer, size_t* pos) { if (gPlayState != nullptr) { append_line(buffer, pos, "Actors:"); CrashHandler_WriteActorData(buffer, pos); - + WRITE_VAR_LINE(buffer, pos, "Scene: ", sSceneIdToStrArray[gPlayState->sceneNum]); snprintf(intCharBuffer, sizeof(intCharBuffer), "%i", gPlayState->roomCtx.curRoom.num); diff --git a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp index 3b4b11686..1ca5a7c19 100644 --- a/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp +++ b/soh/soh/Enhancements/AssignableTunicsAndBoots.cpp @@ -16,10 +16,9 @@ static u16 sItemButtons[] = { BTN_B, BTN_CLEFT, BTN_CDOWN, BTN_CRIGHT, BTN_DUP, void UseTunicBoots(Player* player, PlayState* play, Input* input) { // Boots and tunics equip despite state - if ( - player->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD) || - player->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING - ) { + if (player->stateFlags1 & (PLAYER_STATE1_INPUT_DISABLED | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE | + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD) || + player->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING) { return; } @@ -40,7 +39,8 @@ void UseTunicBoots(Player* player, PlayState* play, Input* input) { Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, bootsValue); } Player_SetEquipmentData(play, player); - func_808328EC(player, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS : NA_SE_PL_CHANGE_ARMS); + func_808328EC(player, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS + : NA_SE_PL_CHANGE_ARMS); } else { u16 tunicValue = item - ITEM_TUNIC_KOKIRI + 1; if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == tunicValue) { @@ -87,7 +87,7 @@ void RegisterAssignableTunicsBoots() { } }); - // don't throw items when the pressed button is a tunic or boots + // don't throw items when the pressed button is a tunic or boots COND_VB_SHOULD(VB_THROW_OR_PUT_DOWN_HELD_ITEM, CVAR_TUNICBOOTS_VALUE != CVAR_TUNICBOOTS_DEFAULT, { // if the vanilla condition doesn't want us to throw/put down the item, early return if (!*should) { @@ -103,7 +103,7 @@ void RegisterAssignableTunicsBoots() { break; } } - + if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) { *should = false; } diff --git a/soh/soh/Enhancements/Cheats/DekuStick.cpp b/soh/soh/Enhancements/Cheats/DekuStick.cpp index 8afa0e330..679878071 100644 --- a/soh/soh/Enhancements/Cheats/DekuStick.cpp +++ b/soh/soh/Enhancements/Cheats/DekuStick.cpp @@ -13,13 +13,13 @@ extern PlayState* gPlayState; #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_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 + player->unk_860 = 200; // Keeps the stick's flame lit + player->unk_85C = 1.0f; // Ensures the stick is the proper length *should = true; }); } diff --git a/soh/soh/Enhancements/Cheats/FreezeTime.cpp b/soh/soh/Enhancements/Cheats/FreezeTime.cpp index 2296c4fc9..a3028d7da 100644 --- a/soh/soh/Enhancements/Cheats/FreezeTime.cpp +++ b/soh/soh/Enhancements/Cheats/FreezeTime.cpp @@ -30,7 +30,8 @@ void RegisterFreezeTime() { GameInteractor::Instance->UnregisterGameHook(hookId); hookId = 0; if (CVAR_FREEZE_TIME_VALUE) { - hookId = GameInteractor::Instance->RegisterGameHook(OnGameFrameUpdateFreezeTime); + hookId = + GameInteractor::Instance->RegisterGameHook(OnGameFrameUpdateFreezeTime); } else { CVarClear(CVAR_PREV_TIME_NAME); } diff --git a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp index 292f65065..38b402d6d 100644 --- a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp +++ b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp @@ -15,10 +15,7 @@ extern s32 Flags_GetRandomizerInf(RandomizerInf flag); #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)) - ) { + if (!GameInteractor::IsSaveLoaded(true) || (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET))) { return; } diff --git a/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp index 0bea9afc9..f3ff5fe04 100644 --- a/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp +++ b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp @@ -7,7 +7,8 @@ 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) +#define CVAR_INFINITE_NAYRUS_LOVE_VALUE \ + CVarGetInteger(CVAR_INFINITE_NAYRUS_LOVE_NAME, CVAR_INFINITE_NAYRUS_LOVE_DEFAULT) void OnGameFrameUpdateInfiniteNayrusLove() { if (!GameInteractor::IsSaveLoaded(true)) { diff --git a/soh/soh/Enhancements/ExtraTraps.cpp b/soh/soh/Enhancements/ExtraTraps.cpp index 3391903ab..92806bacc 100644 --- a/soh/soh/Enhancements/ExtraTraps.cpp +++ b/soh/soh/Enhancements/ExtraTraps.cpp @@ -36,23 +36,19 @@ 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"), + 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 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)) { + 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)); @@ -65,7 +61,8 @@ std::vector getEnabledAddTraps () { }; static void RollRandomTrap(uint32_t seed) { - uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); + uint32_t finalSeed = + seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(finalSeed); roll = RandomElement(getEnabledAddTraps()); @@ -83,7 +80,8 @@ static void RollRandomTrap(uint32_t seed) { eventTimer = 3; break; case ADD_SPEED_TRAP: - Audio_PlaySoundGeneral(NA_SE_VO_KZ_MOVE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_VO_KZ_MOVE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); GameInteractor::State::RunSpeedModifier = -2; statusTimer = 200; Notification::Emit({ .message = "Speed Decreased!" }); @@ -92,7 +90,8 @@ static void RollRandomTrap(uint32_t seed) { eventTimer = 3; break; case ADD_VOID_TRAP: - Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); eventTimer = 3; break; case ADD_AMMO_TRAP: @@ -133,7 +132,8 @@ static void OnPlayerUpdate() { 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); + Audio_PlaySoundGeneral(NA_SE_VO_FR_SMILE_0, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); break; case ADD_TELEPORT_TRAP: { int entrance; @@ -199,5 +199,3 @@ void RegisterExtraTraps() { } static RegisterShipInitFunc initFunc(RegisterExtraTraps, { CVAR_EXTRA_TRAPS_NAME }); - - diff --git a/soh/soh/Enhancements/FileSelectEnhancements.cpp b/soh/soh/Enhancements/FileSelectEnhancements.cpp index 84cff9d12..f9e993b6a 100644 --- a/soh/soh/Enhancements/FileSelectEnhancements.cpp +++ b/soh/soh/Enhancements/FileSelectEnhancements.cpp @@ -6,7 +6,7 @@ #include #include -std::array RandomizerSettingsMenuText[RSM_MAX] = { +std::array RandomizerSettingsMenuText[RSM_MAX] = { { // English "Start Randomizer", @@ -39,28 +39,27 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // French "Génération en cours...", }, - { - // English - "No randomizer seed loaded.\nPlease generate one first" - #if defined(__WIIU__) || defined(__SWITCH__) - ".", - #else - ",\nor drop a spoiler log on the game window.", - #endif - // German - "No randomizer seed loaded.\nPlease generate one first" - #if defined(__WIIU__) || defined(__SWITCH__) - ".", - #else - ",\nor drop a spoiler log on the game window.", - #endif - // French - "Aucune Seed de Randomizer actuellement disponible.\nGénérez-en une dans les \"Randomizer Settings\"" - #if (defined(__WIIU__) || defined(__SWITCH__)) - "." - #else - "\nou glissez un spoilerlog sur la fenêtre du jeu." - #endif + { // English + "No randomizer seed loaded.\nPlease generate one first" +#if defined(__WIIU__) || defined(__SWITCH__) + ".", +#else + ",\nor drop a spoiler log on the game window.", +#endif + // German + "No randomizer seed loaded.\nPlease generate one first" +#if defined(__WIIU__) || defined(__SWITCH__) + ".", +#else + ",\nor drop a spoiler log on the game window.", +#endif + // French + "Aucune Seed de Randomizer actuellement disponible.\nGénérez-en une dans les \"Randomizer Settings\"" +#if (defined(__WIIU__) || defined(__SWITCH__)) + "." +#else + "\nou glissez un spoilerlog sur la fenêtre du jeu." +#endif }, }; diff --git a/soh/soh/Enhancements/Presets/PresetEntries.cpp b/soh/soh/Enhancements/Presets/PresetEntries.cpp index bfa3197ea..ebf6d4a19 100644 --- a/soh/soh/Enhancements/Presets/PresetEntries.cpp +++ b/soh/soh/Enhancements/Presets/PresetEntries.cpp @@ -3,10 +3,14 @@ #include "soh/cvar_prefixes.h" #include "soh/Enhancements/enhancementTypes.h" -#define PRESET_ENTRY_S32(cvar, value) { cvar, PRESET_ENTRY_TYPE_S32, value } -#define PRESET_ENTRY_FLOAT(cvar, value) { cvar, PRESET_ENTRY_TYPE_FLOAT, value } -#define PRESET_ENTRY_STRING(cvar, value) { cvar, PRESET_ENTRY_TYPE_STRING, value } -#define PRESET_ENTRY_CPP_STRING(cvar, value) { cvar, PRESET_ENTRY_TYPE_CPP_STRING, value } +#define PRESET_ENTRY_S32(cvar, value) \ + { cvar, PRESET_ENTRY_TYPE_S32, value } +#define PRESET_ENTRY_FLOAT(cvar, value) \ + { cvar, PRESET_ENTRY_TYPE_FLOAT, value } +#define PRESET_ENTRY_STRING(cvar, value) \ + { cvar, PRESET_ENTRY_TYPE_STRING, value } +#define PRESET_ENTRY_CPP_STRING(cvar, value) \ + { cvar, PRESET_ENTRY_TYPE_CPP_STRING, value } // TODO: Ideally everything in this file will come from one/many JSON files @@ -20,16 +24,14 @@ const std::vector vanillaPlusPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), // Skips & Speed-ups - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), // Graphics PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableLOD"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RememberMapToggleState"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("WidescreenActorCulling"), 1), @@ -41,26 +43,20 @@ const std::vector vanillaPlusPresetEntries = { // Fixes PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixTexturesOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixHammerHand"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_CONSISTENT_VANISH), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), // Difficulty // NONE @@ -78,42 +74,33 @@ const std::vector vanillaPlusPresetEntries = { const std::vector enhancedPresetEntries = { // Quality of Life - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseWarp"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("Autosave"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseWarp"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NoInputForCredits"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableCritWiggle"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableCritWiggle"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterOwl"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantPutaway"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeSavers.SleepingWaterfall"), 1), // Skips & Speed-ups - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipText"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TextSpeed"), 5), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SlowTextSpeed"), 5), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CrawlSpeed"), 2), - PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSwimDeepEndAnim"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ClimbSpeed"), 3), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterBlockPush"), 5), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CrawlSpeed"), 2), + PRESET_ENTRY_FLOAT(CVAR_ENHANCEMENT("MweepSpeed"), 5.0f), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("InstantScarecrow"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkulltulaFreeze"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipSaveConfirmation"), 1), // Graphics - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableLOD"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableLOD"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NewDrops"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PauseMenuAnimatedLink"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ShowDoorLocksOnBothSides"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("ToTMedallionsColors"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RememberMapToggleState"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("VisualAgony"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DynamicWalletIcon"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterAmmoRendering"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("WidescreenActorCulling"), 1), @@ -125,49 +112,36 @@ const std::vector enhancedPresetEntries = { PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DpadNoDropOcarinaInput"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastOcarinaPlayback"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("MMBunnyHood"), BUNNY_HOOD_FAST), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PersistentMasks"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PersistentMasks"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NutsExplodeBombs"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DisableFirstPersonChus"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterBombchuShopping"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SeparateArrows"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterFarore"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SkipArrowAnimation"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastBoomerang"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BetterFarore"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FastFarores"), 1), // Fixes PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GravediggingTourFix"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixFloorSwitches"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixZoraHintDialogue"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixVineFall"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnemySpawnsOverWaterboxes"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixSawSoftlock"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DekuNutUpgradeFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixGrokenGiantsKnife"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixMenuLR"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDungeonMinimapIcon"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("TwoHandedIdle"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("NaviTextFix"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("GerudoWarriorClothingFix"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixTexturesOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixEyesOpenWhileSleeping"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixHammerHand"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_CONSISTENT_VANISH), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("SilverRupeeJingleExtend"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("FixDaruniaDanceSpeed"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CreditsFix"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("RedGanonBlood"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("PulsateBossIcon"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("HoverFishing"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("N64WeirdFrames"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("BombchusOOB"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickPutaway"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("QuickBongoKill"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 1), // Difficulty - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnableBombchuDrops"), 1), - PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), + PRESET_ENTRY_S32(CVAR_ENHANCEMENT("EnableBombchuDrops"), 1), PRESET_ENTRY_S32(CVAR_ENHANCEMENT("DampeWin"), 1), // Minigames PRESET_ENTRY_S32(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 1), @@ -502,15 +476,12 @@ const std::vector randomizerAdvancedPresetEntries = { PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SheikLAHint"), 0), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("DampeHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("GregHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("SariaHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FrogsHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MalonHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("HBAHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("MerchantText"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), - PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), + PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("40GSHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("50GSHint"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("FullWallets"), 1), PRESET_ENTRY_S32(CVAR_RANDOMIZER_SETTING("BombchuBag"), 1), diff --git a/soh/soh/Enhancements/Presets/Presets.cpp b/soh/soh/Enhancements/Presets/Presets.cpp index 79552ef5d..cef3f8362 100644 --- a/soh/soh/Enhancements/Presets/Presets.cpp +++ b/soh/soh/Enhancements/Presets/Presets.cpp @@ -10,14 +10,14 @@ std::string FormatLocations(std::vector locs) { std::string locString = ""; - for (auto loc: locs) { + for (auto loc : locs) { locString += std::to_string(loc) + ","; } return locString; } void applyPreset(std::vector entries) { - for(auto& [cvar, type, value] : entries) { + for (auto& [cvar, type, value] : entries) { switch (type) { case PRESET_ENTRY_TYPE_S32: CVarSetInteger(cvar, std::get(value)); @@ -41,20 +41,21 @@ void DrawPresetSelector(PresetType presetTypeId) { const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(presetTypeId); const PresetTypeDefinition presetTypeDef = presetTypes.at(presetTypeId); uint16_t selectedPresetId = CVarGetInteger(presetTypeCvar.c_str(), 0); - if(selectedPresetId >= presetTypeDef.presets.size()){ + if (selectedPresetId >= presetTypeDef.presets.size()) { selectedPresetId = 0; } const PresetDefinition selectedPresetDef = presetTypeDef.presets.at(selectedPresetId); std::string comboboxTooltip = ""; - for ( auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter ) { - if (iter->first != 0) comboboxTooltip += "\n\n"; + for (auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter) { + if (iter->first != 0) + comboboxTooltip += "\n\n"; comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); } ImGui::Text("Presets"); UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##PresetsComboBox", selectedPresetDef.label)) { - for ( auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter ) { + for (auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter) { if (ImGui::Selectable(iter->second.label, iter->first == selectedPresetId)) { CVarSetInteger(presetTypeCvar.c_str(), iter->first); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -68,7 +69,7 @@ void DrawPresetSelector(PresetType presetTypeId) { UIWidgets::PushStyleButton(THEME_COLOR); if (ImGui::Button(("Apply Preset##" + presetTypeCvar).c_str())) { - for(const char* block : presetTypeDef.blocksToClear) { + for (const char* block : presetTypeDef.blocksToClear) { CVarClearBlock(block); } if (selectedPresetId != 0) { diff --git a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp index 37fed1b7d..965817030 100644 --- a/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp +++ b/soh/soh/Enhancements/RemoveSpinAttackDarkness.cpp @@ -33,10 +33,13 @@ void OnEnMThunderInitReplaceUpdateWithCustom(void* thunder) { #define CVAR_REMOVESPINATTACKDARKNESS_NAME CVAR_ENHANCEMENT("RemoveSpinAttackDarkness") #define CVAR_REMOVESPINATTACKDARKNESS_DEFAULT 0 -#define CVAR_REMOVESPINATTACKDARKNESS_VALUE CVarGetInteger(CVAR_REMOVESPINATTACKDARKNESS_NAME, CVAR_REMOVESPINATTACKDARKNESS_DEFAULT) +#define CVAR_REMOVESPINATTACKDARKNESS_VALUE \ + CVarGetInteger(CVAR_REMOVESPINATTACKDARKNESS_NAME, CVAR_REMOVESPINATTACKDARKNESS_DEFAULT) void RegisterCustomEnMThunderUpdate() { - COND_ID_HOOK(OnActorInit, ACTOR_EN_M_THUNDER, CVAR_REMOVESPINATTACKDARKNESS_VALUE != CVAR_REMOVESPINATTACKDARKNESS_DEFAULT, OnEnMThunderInitReplaceUpdateWithCustom); + COND_ID_HOOK(OnActorInit, ACTOR_EN_M_THUNDER, + CVAR_REMOVESPINATTACKDARKNESS_VALUE != CVAR_REMOVESPINATTACKDARKNESS_DEFAULT, + OnEnMThunderInitReplaceUpdateWithCustom); } static RegisterShipInitFunc initFunc(RegisterCustomEnMThunderUpdate, { CVAR_REMOVESPINATTACKDARKNESS_NAME }); diff --git a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp index c581a325d..22cc74e67 100644 --- a/soh/soh/Enhancements/Restorations/BottleAdventure.cpp +++ b/soh/soh/Enhancements/Restorations/BottleAdventure.cpp @@ -98,11 +98,13 @@ void HandleBAInventoryQuestItems() { void HandleRBAInventoryQuestItems(uint8_t itemToPutInBottle) { auto itemOnCRight = gSaveContext.equips.buttonItems[3]; - + if (itemOnCRight == ITEM_ODD_MUSHROOM) { - gSaveContext.inventory.questItems = (itemToPutInBottle << 24) | (gSaveContext.inventory.questItems & 0x00FFFFFF); + gSaveContext.inventory.questItems = + (itemToPutInBottle << 24) | (gSaveContext.inventory.questItems & 0x00FFFFFF); } else if (itemOnCRight == ITEM_ODD_POTION) { - gSaveContext.inventory.questItems = (itemToPutInBottle << 16) | (gSaveContext.inventory.questItems & 0xFF00FFFF); + gSaveContext.inventory.questItems = + (itemToPutInBottle << 16) | (gSaveContext.inventory.questItems & 0xFF00FFFF); } else if (itemOnCRight == ITEM_SAW) { gSaveContext.inventory.questItems = (itemToPutInBottle << 8) | (gSaveContext.inventory.questItems & 0xFFFF00FF); } else if (itemOnCRight == ITEM_SWORD_BROKEN) { @@ -119,7 +121,7 @@ void HandleBAInventoryDungeonItems() { void HandleRBAInventoryDungeonItems(uint8_t itemToPutInBottle) { auto itemOnCRight = gSaveContext.equips.buttonItems[3]; - + gSaveContext.inventory.dungeonItems[itemOnCRight - ITEM_PRESCRIPTION] = itemToPutInBottle; } @@ -132,7 +134,7 @@ void HandleBAInventoryDungeonKeys() { void HandleRBAInventoryDungeonKeys(uint8_t itemToPutInBottle) { auto itemOnCRight = gSaveContext.equips.buttonItems[3]; - + gSaveContext.inventory.dungeonKeys[itemOnCRight - ITEM_BULLET_BAG_40] = itemToPutInBottle; } @@ -172,90 +174,90 @@ void HandleBASceneFlags() { u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; u32 scene = offset / sizeof(SavedSceneFlags); switch (offset % sizeof(SavedSceneFlags)) { - case 0: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 24) & 0xFF; - break; - case 1: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 16) & 0xFF; - break; - case 2: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 8) & 0xFF; - break; - case 3: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].chest & 0xFF; - break; - case 4: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 24) & 0xFF; - break; - case 5: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 16) & 0xFF; - break; - case 6: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 8) & 0xFF; - break; - case 7: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].swch & 0xFF; - break; - case 8: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 24) & 0xFF; - break; - case 9: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 16) & 0xFF; - break; - case 10: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 8) & 0xFF; - break; - case 11: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].clear & 0xFF; - break; - case 12: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 24) & 0xFF; - break; - case 13: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 16) & 0xFF; - break; - case 14: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 8) & 0xFF; - break; - case 15: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].collect & 0xFF; - break; - case 16: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 24) & 0xFF; - break; - case 17: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 16) & 0xFF; - break; - case 18: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 8) & 0xFF; - break; - case 19: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].unk & 0xFF; - break; - case 20: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 24) & 0xFF; - break; - case 21: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 16) & 0xFF; - break; - case 22: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 8) & 0xFF; - break; - case 23: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].rooms & 0xFF; - break; - case 24: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 24) & 0xFF; - break; - case 25: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 16) & 0xFF; - break; - case 26: - gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 8) & 0xFF; - break; - case 27: - gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].floors & 0xFF; - break; + case 0: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 24) & 0xFF; + break; + case 1: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 16) & 0xFF; + break; + case 2: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].chest >> 8) & 0xFF; + break; + case 3: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].chest & 0xFF; + break; + case 4: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 24) & 0xFF; + break; + case 5: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 16) & 0xFF; + break; + case 6: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].swch >> 8) & 0xFF; + break; + case 7: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].swch & 0xFF; + break; + case 8: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 24) & 0xFF; + break; + case 9: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 16) & 0xFF; + break; + case 10: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].clear >> 8) & 0xFF; + break; + case 11: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].clear & 0xFF; + break; + case 12: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 24) & 0xFF; + break; + case 13: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 16) & 0xFF; + break; + case 14: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].collect >> 8) & 0xFF; + break; + case 15: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].collect & 0xFF; + break; + case 16: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 24) & 0xFF; + break; + case 17: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 16) & 0xFF; + break; + case 18: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].unk >> 8) & 0xFF; + break; + case 19: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].unk & 0xFF; + break; + case 20: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 24) & 0xFF; + break; + case 21: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 16) & 0xFF; + break; + case 22: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].rooms >> 8) & 0xFF; + break; + case 23: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].rooms & 0xFF; + break; + case 24: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 24) & 0xFF; + break; + case 25: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 16) & 0xFF; + break; + case 26: + gSaveContext.equips.buttonItems[0] = (gSaveContext.sceneFlags[scene].floors >> 8) & 0xFF; + break; + case 27: + gSaveContext.equips.buttonItems[0] = gSaveContext.sceneFlags[scene].floors & 0xFF; + break; } } @@ -264,90 +266,117 @@ void HandleRBASceneFlags(uint8_t itemToPutInBottle) { u32 offset = gSaveContext.equips.buttonItems[3] - ITEM_SONG_LULLABY; u32 scene = offset / sizeof(SavedSceneFlags); switch (offset % sizeof(SavedSceneFlags)) { - case 0: - gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].chest & 0x00FFFFFF); - break; - case 1: - gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].chest & 0xFF00FFFF); - break; - case 2: - gSaveContext.sceneFlags[scene].chest = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].chest & 0xFFFF00FF); - break; - case 3: - gSaveContext.sceneFlags[scene].chest = itemToPutInBottle | (gSaveContext.sceneFlags[scene].chest & 0xFFFFFF00); - break; - case 4: - gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].swch & 0x00FFFFFF); - break; - case 5: - gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].swch & 0xFF00FFFF); - break; - case 6: - gSaveContext.sceneFlags[scene].swch = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].swch & 0xFFFF00FF); - break; - case 7: - gSaveContext.sceneFlags[scene].swch = itemToPutInBottle | (gSaveContext.sceneFlags[scene].swch & 0xFFFFFF00); - break; - case 8: - gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].clear & 0x00FFFFFF); - break; - case 9: - gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].clear & 0xFF00FFFF); - break; - case 10: - gSaveContext.sceneFlags[scene].clear = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].clear & 0xFFFF00FF); - break; - case 11: - gSaveContext.sceneFlags[scene].clear = itemToPutInBottle | (gSaveContext.sceneFlags[scene].clear & 0xFFFFFF00); - break; - case 12: - gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].collect & 0x00FFFFFF); - break; - case 13: - gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].collect & 0xFF00FFFF); - break; - case 14: - gSaveContext.sceneFlags[scene].collect = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].collect & 0xFFFF00FF); - break; - case 15: - gSaveContext.sceneFlags[scene].collect = itemToPutInBottle | (gSaveContext.sceneFlags[scene].collect & 0xFFFFFF00); - break; - case 16: - gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].unk & 0x00FFFFFF); - break; - case 17: - gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].unk & 0xFF00FFFF); - break; - case 18: - gSaveContext.sceneFlags[scene].unk = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].unk & 0xFFFF00FF); - break; - case 19: - gSaveContext.sceneFlags[scene].unk = itemToPutInBottle | (gSaveContext.sceneFlags[scene].unk & 0xFFFFFF00); - break; - case 20: - gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].rooms & 0x00FFFFFF); - break; - case 21: - gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].rooms & 0xFF00FFFF); - break; - case 22: - gSaveContext.sceneFlags[scene].rooms = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].rooms & 0xFFFF00FF); - break; - case 23: - gSaveContext.sceneFlags[scene].rooms = itemToPutInBottle | (gSaveContext.sceneFlags[scene].rooms & 0xFFFFFF00); - break; - case 24: - gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].floors & 0x00FFFFFF); - break; - case 25: - gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].floors & 0xFF00FFFF); - break; - case 26: - gSaveContext.sceneFlags[scene].floors = (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].floors & 0xFFFF00FF); - break; - case 27: - gSaveContext.sceneFlags[scene].floors = itemToPutInBottle | (gSaveContext.sceneFlags[scene].floors & 0xFFFFFF00); - break; + case 0: + gSaveContext.sceneFlags[scene].chest = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].chest & 0x00FFFFFF); + break; + case 1: + gSaveContext.sceneFlags[scene].chest = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].chest & 0xFF00FFFF); + break; + case 2: + gSaveContext.sceneFlags[scene].chest = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].chest & 0xFFFF00FF); + break; + case 3: + gSaveContext.sceneFlags[scene].chest = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].chest & 0xFFFFFF00); + break; + case 4: + gSaveContext.sceneFlags[scene].swch = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].swch & 0x00FFFFFF); + break; + case 5: + gSaveContext.sceneFlags[scene].swch = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].swch & 0xFF00FFFF); + break; + case 6: + gSaveContext.sceneFlags[scene].swch = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].swch & 0xFFFF00FF); + break; + case 7: + gSaveContext.sceneFlags[scene].swch = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].swch & 0xFFFFFF00); + break; + case 8: + gSaveContext.sceneFlags[scene].clear = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].clear & 0x00FFFFFF); + break; + case 9: + gSaveContext.sceneFlags[scene].clear = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].clear & 0xFF00FFFF); + break; + case 10: + gSaveContext.sceneFlags[scene].clear = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].clear & 0xFFFF00FF); + break; + case 11: + gSaveContext.sceneFlags[scene].clear = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].clear & 0xFFFFFF00); + break; + case 12: + gSaveContext.sceneFlags[scene].collect = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].collect & 0x00FFFFFF); + break; + case 13: + gSaveContext.sceneFlags[scene].collect = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].collect & 0xFF00FFFF); + break; + case 14: + gSaveContext.sceneFlags[scene].collect = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].collect & 0xFFFF00FF); + break; + case 15: + gSaveContext.sceneFlags[scene].collect = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].collect & 0xFFFFFF00); + break; + case 16: + gSaveContext.sceneFlags[scene].unk = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].unk & 0x00FFFFFF); + break; + case 17: + gSaveContext.sceneFlags[scene].unk = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].unk & 0xFF00FFFF); + break; + case 18: + gSaveContext.sceneFlags[scene].unk = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].unk & 0xFFFF00FF); + break; + case 19: + gSaveContext.sceneFlags[scene].unk = itemToPutInBottle | (gSaveContext.sceneFlags[scene].unk & 0xFFFFFF00); + break; + case 20: + gSaveContext.sceneFlags[scene].rooms = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].rooms & 0x00FFFFFF); + break; + case 21: + gSaveContext.sceneFlags[scene].rooms = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].rooms & 0xFF00FFFF); + break; + case 22: + gSaveContext.sceneFlags[scene].rooms = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].rooms & 0xFFFF00FF); + break; + case 23: + gSaveContext.sceneFlags[scene].rooms = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].rooms & 0xFFFFFF00); + break; + case 24: + gSaveContext.sceneFlags[scene].floors = + (itemToPutInBottle << 24) | (gSaveContext.sceneFlags[scene].floors & 0x00FFFFFF); + break; + case 25: + gSaveContext.sceneFlags[scene].floors = + (itemToPutInBottle << 16) | (gSaveContext.sceneFlags[scene].floors & 0xFF00FFFF); + break; + case 26: + gSaveContext.sceneFlags[scene].floors = + (itemToPutInBottle << 8) | (gSaveContext.sceneFlags[scene].floors & 0xFFFF00FF); + break; + case 27: + gSaveContext.sceneFlags[scene].floors = + itemToPutInBottle | (gSaveContext.sceneFlags[scene].floors & 0xFFFFFF00); + break; } } diff --git a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp index 373d481ef..090c46a60 100644 --- a/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp +++ b/soh/soh/Enhancements/Restorations/PauseBufferInputs.cpp @@ -31,8 +31,9 @@ void RegisterPauseBufferInputs() { COND_VB_SHOULD(VB_KALEIDO_UNPAUSE_CLOSE, CVAR_BUFFER_VALUE || CVAR_INCLUDE_VALUE, { Input* input = &gPlayState->state.input[0]; - // STEP #3: If the user opts to include held inputs in the buffer window, store the currnently held inputs, minus - // the held inputs when the pause menu was opened. This only applies to the first frame of the buffer window + // STEP #3: If the user opts to include held inputs in the buffer window, store the currnently held inputs, + // minus the held inputs when the pause menu was opened. This only applies to the first frame of the buffer + // window if (CVAR_INCLUDE_VALUE && inputBufferTimer == 0) { pauseInputs |= input->cur.button & ~prePauseInputs; prePauseInputs = 0; @@ -56,16 +57,15 @@ void RegisterPauseBufferInputs() { Input* input = &gPlayState->state.input[0]; PauseContext* pauseCtx = &gPlayState->pauseCtx; - // STEP #1: If the user opts to include held inputs in the buffer window, store the held inputs at the beginning + // STEP #1: 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; } // STEP #2: The unpause process has begun, so let's reset the input buffer timer - if (pauseCtx->state == PAUSE_STATE_UNPAUSE_SETUP || ( - pauseCtx->state == PAUSE_STATE_SAVEPROMPT && (pauseCtx->unk_1EC == 2 || pauseCtx->unk_1EC == 5) - )) { + if (pauseCtx->state == PAUSE_STATE_UNPAUSE_SETUP || + (pauseCtx->state == PAUSE_STATE_SAVEPROMPT && (pauseCtx->unk_1EC == 2 || pauseCtx->unk_1EC == 5))) { inputBufferTimer = 0; } diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp index 4b374ed8e..8f1f0ac40 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.cpp @@ -147,18 +147,18 @@ void TimeDisplayUpdateDisplayOptions() { } } - //if (pushBack) { - // activeTimers.push_back(timeDisplayList[timeID]); - //} else { - // uint32_t index = 0; - // for (auto& check : activeTimers) { - // if (check.timeID == timeID) { - // activeTimers.erase(activeTimers.begin() + index); - // return; - // } - // index++; - // } - //} + // if (pushBack) { + // activeTimers.push_back(timeDisplayList[timeID]); + // } else { + // uint32_t index = 0; + // for (auto& check : activeTimers) { + // if (check.timeID == timeID) { + // activeTimers.erase(activeTimers.begin() + index); + // return; + // } + // index++; + // } + // } } void TimeDisplayWindow::Draw() { @@ -174,9 +174,9 @@ void TimeDisplayWindow::Draw() { ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin("TimerDisplay", nullptr, - ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar); + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar); ImGui::SetWindowFontScale(fontScale); if (activeTimers.size() == 0) { ImGui::Text("No Enabled Timers..."); @@ -247,13 +247,17 @@ static void TimeDisplayInitTimers() { } void TimeDisplayWindow::InitElement() { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("GAMEPLAY_TIMER", gClockIconTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("DAY_TIME_TIMER", gSunIconTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("NIGHT_TIME_TIMER", gMoonIconTex, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("GAMEPLAY_TIMER", gClockIconTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("DAY_TIME_TIMER", gSunIconTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("NIGHT_TIME_TIMER", gMoonIconTex, + ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("NAVI_TIMER", gNaviIconTex, ImVec4(1, 1, 1, 1)); for (auto& load : digitList) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(load.first.c_str(), load.second, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(load.first.c_str(), load.second, + ImVec4(1, 1, 1, 1)); } TimeDisplayInitSettings(); diff --git a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h index 41cda077f..eb213640e 100644 --- a/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h +++ b/soh/soh/Enhancements/TimeDisplay/TimeDisplay.h @@ -5,9 +5,9 @@ class TimeDisplayWindow : public Ship::GuiWindow { using GuiWindow::GuiWindow; void InitElement() override; - void DrawElement() override {}; + void DrawElement() override{}; void Draw() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; void TimeDisplayUpdateDisplayOptions(); diff --git a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp index 73909cbda..10a22d903 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp @@ -4,12 +4,12 @@ #include "spdlog/spdlog.h" extern "C" { - #include "z64save.h" - #include "macros.h" - #include "variables.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } /** @@ -20,29 +20,30 @@ void FasterHeavyBlockLift_Register() { REGISTER_VB_SHOULD(VB_PLAY_ONEPOINT_ACTOR_CS, { Actor* actor = va_arg(args, Actor*); - if ( - actor->id == ACTOR_BG_HEAVY_BLOCK && - (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) - ) { + if (actor->id == ACTOR_BG_HEAVY_BLOCK && + (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO))) { *should = false; } }); REGISTER_VB_SHOULD(VB_FREEZE_LINK_FOR_BLOCK_THROW, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) { *should = false; } }); REGISTER_VB_SHOULD(VB_PLAY_THROW_ANIMATION, { - Player *player = GET_PLAYER(gPlayState); + Player* player = GET_PLAYER(gPlayState); Actor* interactRangeActor = player->interactRangeActor; s32 interactActorId = interactRangeActor->id; LinkAnimationHeader* anim = va_arg(args, LinkAnimationHeader*); // Same actor is used for small and large silver rocks, use actor params to identify large ones bool isLargeSilverRock = interactActorId == ACTOR_EN_ISHI && interactRangeActor->params & 1 == 1; - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) && (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) && + (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK)) { *should = false; LinkAnimation_PlayOnceSetSpeed(gPlayState, &player->skelAnime, anim, 5.0f); } diff --git a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp index 347787c27..36a780b6a 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp @@ -4,17 +4,18 @@ #include "spdlog/spdlog.h" extern "C" { - #include "z64save.h" - #include "macros.h" - #include "variables.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } void FasterRupeeAccumulator_Register() { GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0)) return; + if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0)) + return; if (gSaveContext.rupeeAccumulator == 0) { return; @@ -28,10 +29,10 @@ void FasterRupeeAccumulator_Register() { } if (gSaveContext.rupeeAccumulator >= 10 && gSaveContext.rupees + 10 < CUR_CAPACITY(UPG_WALLET)) { - gSaveContext.rupeeAccumulator-= 10; + gSaveContext.rupeeAccumulator -= 10; gSaveContext.rupees += 10; } - // Losing rupees + // Losing rupees } else if (gSaveContext.rupeeAccumulator < 0) { // No rupees to lose if (gSaveContext.rupees == 0) { diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index ae4236218..674adcdfb 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -24,7 +24,7 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_l if (IS_BOSS_RUSH) { return; } - + bool overrideBlueWarpDestinations = IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); @@ -37,16 +37,19 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_l if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) { gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP; isBlueWarpCutscene = true; - // Dodongo's Cavern Blue warp - } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT && gSaveContext.cutsceneIndex == 0xFFF1) { + // Dodongo's Cavern Blue warp + } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT && + gSaveContext.cutsceneIndex == 0xFFF1) { gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP; isBlueWarpCutscene = true; - // Jabu Jabu's Blue warp - } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP && gSaveContext.cutsceneIndex == 0xFFF0) { + // Jabu Jabu's Blue warp + } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP && + gSaveContext.cutsceneIndex == 0xFFF0) { gSaveContext.entranceIndex = ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP; isBlueWarpCutscene = true; - // Forest Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { + // Forest Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { // Normally set in the blue warp cutscene Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_DEKU_TREE_SPROUT); @@ -57,27 +60,31 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_l } isBlueWarpCutscene = true; - // Fire Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && gSaveContext.cutsceneIndex == 0xFFF3) { + // Fire Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && + gSaveContext.cutsceneIndex == 0xFFF3) { // Normally set in the blue warp cutscene Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP; isBlueWarpCutscene = true; - // Water Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { + // Water Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { // Normally set in the blue warp cutscene gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4800; Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP; isBlueWarpCutscene = true; - // Spirit Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { + // Spirit Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP; isBlueWarpCutscene = true; - // Shadow Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { + // Shadow Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { gSaveContext.entranceIndex = ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP; isBlueWarpCutscene = true; } @@ -92,7 +99,8 @@ void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_l gSaveContext.cutsceneIndex = 0; } - // This is outside the above condition because we want to handle both first and following visits to the blue warp + // This is outside the above condition because we want to handle both first and following visits to the blue + // warp if (sEnteredBlueWarp && overrideBlueWarpDestinations) { Entrance_OverrideBlueWarp(); } @@ -111,7 +119,7 @@ void SkipBlueWarp_ShouldPlayBlueWarpCS(GIVanillaBehavior _, bool* should, va_lis /** * While we could rely on the Item_Give that's normally called, it's not very clear to the player that they - * received the item when skipping the blue warp cutscene, so we'll prevent that and queue it up to be given + * received the item when skipping the blue warp cutscene, so we'll prevent that and queue it up to be given * to the player instead. */ void SkipBlueWarp_ShouldGiveItem(GIVanillaBehavior _, bool* should, va_list originalArgs) { @@ -142,31 +150,35 @@ void EnKo_MoveWhenReady(EnKo* enKo, PlayState* play) { void SkipBlueWarp_OnActorUpdate(void* actorPtr) { EnKo* enKo = static_cast(actorPtr); - if ( - (enKo->actor.params & 0xFF) == ENKO_TYPE_CHILD_3 && - enKo->actionFunc == func_80A995CC && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) - ) { + if ((enKo->actor.params & 0xFF) == ENKO_TYPE_CHILD_3 && enKo->actionFunc == func_80A995CC && + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { enKo->actionFunc = EnKo_MoveWhenReady; } } /** * This will ensure that the Deku Tree Sprout considers the Forest Temple finished when you skip the blue warp cutscene. - * Typically this checks for if you have the medallion, and when skipping the cutscene at this point you don't have it yet. + * Typically this checks for if you have the medallion, and when skipping the cutscene at this point you don't have it + * yet. */ void SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished(GIVanillaBehavior _, bool* should, va_list originalArgs) { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP && gSaveContext.cutsceneIndex == 0xFFF1) { + if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP && + gSaveContext.cutsceneIndex == 0xFFF1) { *should = Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP); } } } void SkipBlueWarp_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_KO, SkipBlueWarp_OnActorUpdate); - GameInteractor::Instance->RegisterGameHookForID(VB_PLAY_TRANSITION_CS, SkipBlueWarp_ShouldPlayTransitionCS); - GameInteractor::Instance->RegisterGameHookForID(VB_PLAY_BLUE_WARP_CS, SkipBlueWarp_ShouldPlayBlueWarpCS); - GameInteractor::Instance->RegisterGameHookForID(VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished); - GameInteractor::Instance->RegisterGameHookForID(VB_GIVE_ITEM_FROM_BLUE_WARP, SkipBlueWarp_ShouldGiveItem); + GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_KO, + SkipBlueWarp_OnActorUpdate); + GameInteractor::Instance->RegisterGameHookForID( + VB_PLAY_TRANSITION_CS, SkipBlueWarp_ShouldPlayTransitionCS); + GameInteractor::Instance->RegisterGameHookForID( + VB_PLAY_BLUE_WARP_CS, SkipBlueWarp_ShouldPlayBlueWarpCS); + GameInteractor::Instance->RegisterGameHookForID( + VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished); + GameInteractor::Instance->RegisterGameHookForID(VB_GIVE_ITEM_FROM_BLUE_WARP, + SkipBlueWarp_ShouldGiveItem); } diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp index e1cc1db21..361f69d68 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp @@ -3,18 +3,19 @@ #include "soh/OTRGlobals.h" extern "C" { - #include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" +#include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" } /** * This will skip the Deku Tree intro, and simply open the mouth as you approach it. -*/ + */ void SkipDekuTreeIntro_Register() { REGISTER_VB_SHOULD(VB_PLAY_DEKU_TREE_INTRO_CS, { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { BgTreemouth* treeMouth = va_arg(args, BgTreemouth*); Flags_SetEventChkInf(EVENTCHKINF_DEKU_TREE_OPENED_MOUTH); - Audio_PlaySoundGeneral(NA_SE_EV_WOODDOOR_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_EV_WOODDOOR_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); BgTreemouth_SetupAction(treeMouth, func_808BC6F8); *should = false; } diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp index d487c1f47..9485bdb0f 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp @@ -3,19 +3,21 @@ #include "soh/OTRGlobals.h" extern "C" { - #include "z64save.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } void SkipLostWoodsBridge_Register() { /** - * This skips the cutscene where you speak to Saria on the bridge in Lost Woods, where she gives you the Fairy Ocarina. + * This skips the cutscene where you speak to Saria on the bridge in Lost Woods, where she gives you the Fairy + * Ocarina. */ REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_BRIDGE_EAST_EXIT) && !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { + if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_BRIDGE_EAST_EXIT) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE); if (GameInteractor_Should(VB_GIVE_ITEM_FAIRY_OCARINA, true)) { Item_Give(gPlayState, ITEM_OCARINA_FAIRY); @@ -26,8 +28,9 @@ void SkipLostWoodsBridge_Register() { }); /** - * While we could rely on the Item_Give that's normally called (and that we have above), it's not very clear to the player - * that they received the item when skipping the cutscene, so we'll prevent it, and queue it up to be given instead. + * While we could rely on the Item_Give that's normally called (and that we have above), it's not very clear to the + * player that they received the item when skipping the cutscene, so we'll prevent it, and queue it up to be given + * instead. */ REGISTER_VB_SHOULD(VB_GIVE_ITEM_FAIRY_OCARINA, { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp index 357125db8..c623d46d2 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp @@ -3,7 +3,7 @@ #include "soh/OTRGlobals.h" extern "C" { - #include "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h" +#include "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h" } /** @@ -21,7 +21,8 @@ void EnZl4_SkipToGivingZeldasLetter(EnZl4* enZl4, PlayState* play) { Audio_PlayFanfare(NA_BGM_APPEAR); enZl4->csState = 8; // ZL4_CS_PLAN } else { - Npc_UpdateTalking(play, &enZl4->actor, &enZl4->interactInfo.talkState, enZl4->collider.dim.radius + 60.0f, EnZl4_GiveItemTextId, func_80B5B9B0); + Npc_UpdateTalking(play, &enZl4->actor, &enZl4->interactInfo.talkState, enZl4->collider.dim.radius + 60.0f, + EnZl4_GiveItemTextId, func_80B5B9B0); func_80B5BB78(enZl4, play); if (enZl4->interactInfo.talkState != NPC_TALK_STATE_IDLE) { @@ -34,12 +35,14 @@ void EnZl4_SkipToGivingZeldasLetter(EnZl4* enZl4, PlayState* play) { void SkipToGivingZeldasLetter_OnActorInit(void* actorPtr) { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { EnZl4* enZl4 = static_cast(actorPtr); - if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0) return; + if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0) + return; enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter; } } void SkipToGivingZeldasLetter_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ZL4, SkipToGivingZeldasLetter_OnActorInit); + GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ZL4, + SkipToGivingZeldasLetter_OnActorInit); } diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp index 1cb331539..56d26f01d 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp @@ -3,9 +3,9 @@ #include "soh/OTRGlobals.h" extern "C" { - #include "z64save.h" - #include "functions.h" - extern SaveContext gSaveContext; +#include "z64save.h" +#include "functions.h" +extern SaveContext gSaveContext; } void SkipZeldaFleeingCastle_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { @@ -46,13 +46,11 @@ void SkipZeldaFleeingCastle_OnActorUpdate(void* actorPtr) { void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) { Actor* actor = static_cast(actorPtr); - if ( - actor->params == 3 && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) - ) { + if (actor->params == 3 && CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { framesSinceSpawn = 0; - itemOcarinaUpdateHook = GameInteractor::Instance->RegisterGameHookForPtr((uintptr_t)actorPtr, SkipZeldaFleeingCastle_OnActorUpdate); - sceneInitHook = GameInteractor::Instance->RegisterGameHook([] (int16_t sceneNum) { + itemOcarinaUpdateHook = GameInteractor::Instance->RegisterGameHookForPtr( + (uintptr_t)actorPtr, SkipZeldaFleeingCastle_OnActorUpdate); + sceneInitHook = GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { GameInteractor::Instance->UnregisterGameHookForPtr(itemOcarinaUpdateHook); GameInteractor::Instance->UnregisterGameHook(sceneInitHook); itemOcarinaUpdateHook = 0; @@ -62,6 +60,8 @@ void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) { } void SkipZeldaFleeingCastle_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_ITEM_OCARINA, SkipZeldaFleeingCastle_OnActorInit); - GameInteractor::Instance->RegisterGameHookForID(VB_PLAY_TRANSITION_CS, SkipZeldaFleeingCastle_ShouldPlayTransitionCS); + GameInteractor::Instance->RegisterGameHookForID(ACTOR_ITEM_OCARINA, + SkipZeldaFleeingCastle_OnActorInit); + GameInteractor::Instance->RegisterGameHookForID( + VB_PLAY_TRANSITION_CS, SkipZeldaFleeingCastle_ShouldPlayTransitionCS); } diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp index 1e1c6ceb5..704339424 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp @@ -10,18 +10,19 @@ extern "C" { * Adjusts the behavior of the elevator to start near the bottom if you are entering the room from the bottom */ void MoveJabuJabuElevator_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_BG_BDAN_OBJECTS, [](void* actorRef) { - Player* player = GET_PLAYER(gPlayState); - BgBdanObjects* bgBdanObjects = static_cast(actorRef); + GameInteractor::Instance->RegisterGameHookForID( + ACTOR_BG_BDAN_OBJECTS, [](void* actorRef) { + Player* player = GET_PLAYER(gPlayState); + BgBdanObjects* bgBdanObjects = static_cast(actorRef); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (bgBdanObjects->dyna.actor.params == 1) { - if (player->actor.world.pos.y < -500.0f) { - bgBdanObjects->timer = 220; + if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { + return; } - } - }); + + if (bgBdanObjects->dyna.actor.params == 1) { + if (player->actor.world.pos.y < -500.0f) { + bgBdanObjects->timer = 220; + } + } + }); } diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp index 59381968a..6e9b94b4a 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp @@ -3,12 +3,12 @@ #include "soh/OTRGlobals.h" extern "C" { - #include "z64save.h" - #include "macros.h" - #include "variables.h" - #include "functions.h" - extern PlayState* gPlayState; - extern SaveContext gSaveContext; +#include "z64save.h" +#include "macros.h" +#include "variables.h" +#include "functions.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; } /** @@ -17,13 +17,10 @@ extern "C" { */ void MoveMidoInKokiriForest_Register() { REGISTER_VB_SHOULD(VB_MOVE_MIDO_IN_KOKIRI_FOREST, { - if ( - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD) && - (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) && - (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI) && - gSaveContext.cutsceneIndex == 0 - ) { + (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) && + (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI) && gSaveContext.cutsceneIndex == 0) { Flags_SetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD); *should = true; } diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp index 2894cb914..97b65a543 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp @@ -29,7 +29,7 @@ void SkipChildRutoInteractions_Register() { if (*should) { Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildTurnAroundAnim, 1.0f, 0, - Animation_GetLastFrame((void*)&gRutoChildTurnAroundAnim), ANIMMODE_ONCE, -8.0f); + Animation_GetLastFrame((void*)&gRutoChildTurnAroundAnim), ANIMMODE_ONCE, -8.0f); enRu1->action = 10; } @@ -48,7 +48,8 @@ void SkipChildRutoInteractions_Register() { } }); - // Prevents Ruto from running to the Sapphire when she wants to be tossed to it, instead she just stands up and waits for link to get closer + // Prevents Ruto from running to the Sapphire when she wants to be tossed to it, instead she just stands up and + // waits for link to get closer REGISTER_VB_SHOULD(VB_RUTO_RUN_TO_SAPPHIRE, { EnRu1* enRu1 = va_arg(args, EnRu1*); DynaPolyActor* dynaPolyActor = va_arg(args, DynaPolyActor*); @@ -63,12 +64,13 @@ void SkipChildRutoInteractions_Register() { Flags_SetSwitch(gPlayState, 0x02); Flags_SetSwitch(gPlayState, 0x1F); enRu1->action = 42; - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, - Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, + Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); // If we aren't skipping one point cutscenes and BgBdan objects has set the camera setting // to CAM_SET_NORMAL1 (2), don't reset the camera setting to 1. This prevents the One Point // Cutscene of Ruto getting lifted up from getting queued up twice. - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || enRu1->unk_28C->cameraSetting != 2) { + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || + enRu1->unk_28C->cameraSetting != 2) { enRu1->unk_28C->cameraSetting = 1; } Actor* sapphire = func_80AEB124(gPlayState); @@ -80,7 +82,8 @@ void SkipChildRutoInteractions_Register() { } }); - // This overrides the behavior that causes Ruto to get upset at you before sitting back down again when INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME is set + // This overrides the behavior that causes Ruto to get upset at you before sitting back down again when + // INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME is set GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_RU1, [](void* actorRef) { EnRu1* enRu1 = static_cast(actorRef); if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { @@ -92,7 +95,7 @@ void SkipChildRutoInteractions_Register() { enRu1->drawConfig = 1; 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); + Animation_GetLastFrame((void*)&gRutoChildSittingAnim), ANIMMODE_LOOP, 0.0f); } }); } diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp index a198f8289..a881675d6 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp @@ -2,17 +2,17 @@ void TimeSavers_Register() { // SkipCutscene - // Story - SkipBlueWarp_Register(); - SkipDekuTreeIntro_Register(); - SkipLostWoodsBridge_Register(); - SkipToGivingZeldasLetter_Register(); - SkipZeldaFleeingCastle_Register(); - SkipIntro_Register(); + // Story + SkipBlueWarp_Register(); + SkipDekuTreeIntro_Register(); + SkipLostWoodsBridge_Register(); + SkipToGivingZeldasLetter_Register(); + SkipZeldaFleeingCastle_Register(); + SkipIntro_Register(); // SkipMiscInteractions - MoveJabuJabuElevator_Register(); - MoveMidoInKokiriForest_Register(); - SkipChildRutoInteractions_Register(); + MoveJabuJabuElevator_Register(); + MoveMidoInKokiriForest_Register(); + SkipChildRutoInteractions_Register(); FasterHeavyBlockLift_Register(); FasterRupeeAccumulator_Register(); } diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.h b/soh/soh/Enhancements/TimeSavers/TimeSavers.h index ad521c6c2..9448260d6 100644 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.h +++ b/soh/soh/Enhancements/TimeSavers/TimeSavers.h @@ -4,17 +4,17 @@ void TimeSavers_Register(); // SkipCutscene - // Story - void SkipBlueWarp_Register(); - void SkipDekuTreeIntro_Register(); - void SkipLostWoodsBridge_Register(); - void SkipToGivingZeldasLetter_Register(); - void SkipZeldaFleeingCastle_Register(); - void SkipIntro_Register(); +// Story +void SkipBlueWarp_Register(); +void SkipDekuTreeIntro_Register(); +void SkipLostWoodsBridge_Register(); +void SkipToGivingZeldasLetter_Register(); +void SkipZeldaFleeingCastle_Register(); +void SkipIntro_Register(); // SkipMiscInteractions - void MoveJabuJabuElevator_Register(); - void MoveMidoInKokiriForest_Register(); - void SkipChildRutoInteractions_Register(); +void MoveJabuJabuElevator_Register(); +void MoveMidoInKokiriForest_Register(); +void SkipChildRutoInteractions_Register(); void FasterHeavyBlockLift_Register(); void FasterRupeeAccumulator_Register(); diff --git a/soh/soh/Enhancements/audio/AudioCollection.cpp b/soh/soh/Enhancements/audio/AudioCollection.cpp index 13b793b90..69b3723b4 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.cpp +++ b/soh/soh/Enhancements/audio/AudioCollection.cpp @@ -11,7 +11,11 @@ #include #define SEQUENCE_MAP_ENTRY(sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement) \ - { sequenceId, { sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement } } + { \ + sequenceId, { \ + sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement \ + } \ + } AudioCollection::AudioCollection() { // clang-format off @@ -355,10 +359,13 @@ void AudioCollection::AddToCollection(char* otrPath, uint16_t seqNum) { if (typeString == "fanfare") { type = SEQ_FANFARE; } - SequenceInfo info = {seqNum, - sequenceName, - StringHelper::Replace(StringHelper::Replace(StringHelper::Replace(sequenceName, " ", "_"), "~", "-"),".", ""), - type, false, true}; + SequenceInfo info = { seqNum, + sequenceName, + StringHelper::Replace( + StringHelper::Replace(StringHelper::Replace(sequenceName, " ", "_"), "~", "-"), ".", ""), + type, + false, + true }; sequenceMap.emplace(seqNum, info); } @@ -367,7 +374,8 @@ uint16_t AudioCollection::GetReplacementSequence(uint16_t seqId) { // for Hyrule Field instead. Otherwise, leave it alone, so that without any sfx editor modifications we will // play the normal track as usual. if (seqId == NA_BGM_FIELD_MORNING) { - if (CVarGetInteger(CVAR_AUDIO("ReplacedSequences.NA_BGM_FIELD_LOGIC.value"), NA_BGM_FIELD_LOGIC) != NA_BGM_FIELD_LOGIC) { + if (CVarGetInteger(CVAR_AUDIO("ReplacedSequences.NA_BGM_FIELD_LOGIC.value"), NA_BGM_FIELD_LOGIC) != + NA_BGM_FIELD_LOGIC) { seqId = NA_BGM_FIELD_LOGIC; } } @@ -402,10 +410,12 @@ void AudioCollection::AddToShufflePool(SequenceInfo* seqInfo) { } void AudioCollection::InitializeShufflePool() { - if (shufflePoolInitialized) return; - + if (shufflePoolInitialized) + return; + for (auto& [seqId, seqInfo] : sequenceMap) { - if (!seqInfo.canBeUsedAsReplacement) continue; + if (!seqInfo.canBeUsedAsReplacement) + continue; const std::string cvarKey = std::string(CVAR_AUDIO("Excluded.")) + seqInfo.sfxKey; if (CVarGetInteger(cvarKey.c_str(), 0)) { excludedSequences.insert(&seqInfo); @@ -417,7 +427,7 @@ void AudioCollection::InitializeShufflePool() { shufflePoolInitialized = true; }; -extern "C" void AudioCollection_AddToCollection(char *otrPath, uint16_t seqNum) { +extern "C" void AudioCollection_AddToCollection(char* otrPath, uint16_t seqNum) { AudioCollection::Instance->AddToCollection(otrPath, seqNum); } diff --git a/soh/soh/Enhancements/audio/AudioCollection.h b/soh/soh/Enhancements/audio/AudioCollection.h index f3fd964bc..2cdb02e21 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.h +++ b/soh/soh/Enhancements/audio/AudioCollection.h @@ -6,16 +6,16 @@ #include enum SeqType { - SEQ_NOSHUFFLE = 0, - SEQ_BGM_WORLD = 1 << 0, - SEQ_BGM_EVENT = 1 << 1, + SEQ_NOSHUFFLE = 0, + SEQ_BGM_WORLD = 1 << 0, + SEQ_BGM_EVENT = 1 << 1, SEQ_BGM_BATTLE = 1 << 2, - SEQ_OCARINA = 1 << 3, - SEQ_FANFARE = 1 << 4, - SEQ_BGM_ERROR = 1 << 5, - SEQ_SFX = 1 << 6, + SEQ_OCARINA = 1 << 3, + SEQ_FANFARE = 1 << 4, + SEQ_BGM_ERROR = 1 << 5, + SEQ_SFX = 1 << 6, SEQ_INSTRUMENT = 1 << 7, - SEQ_VOICE = 1 << 8, + SEQ_VOICE = 1 << 8, SEQ_BGM_CUSTOM = SEQ_BGM_WORLD | SEQ_BGM_EVENT | SEQ_BGM_BATTLE, }; @@ -31,45 +31,45 @@ struct SequenceInfo { }; class AudioCollection { - private: - // All Loaded Audio - std::map sequenceMap; - - // Sequences/SFX to include in/exclude from shuffle pool - struct compareSequenceLabel { - bool operator() (SequenceInfo* a, SequenceInfo* b) const { - return a->label < b->label; - }; - }; - std::set includedSequences; - std::set excludedSequences; - bool shufflePoolInitialized = false; + private: + // All Loaded Audio + std::map sequenceMap; - public: - static AudioCollection* Instance; - AudioCollection(); - std::map GetAllSequences() const { - return sequenceMap; - } - std::set GetIncludedSequences() const { - return includedSequences; + // Sequences/SFX to include in/exclude from shuffle pool + struct compareSequenceLabel { + bool operator()(SequenceInfo* a, SequenceInfo* b) const { + return a->label < b->label; }; - std::set GetExcludedSequences() const { - return excludedSequences; - }; - void AddToShufflePool(SequenceInfo*); - void RemoveFromShufflePool(SequenceInfo*); - void AddToCollection(char* otrPath, uint16_t seqNum); - uint16_t GetReplacementSequence(uint16_t seqId); - void InitializeShufflePool(); - const char* GetSequenceName(uint16_t seqId); - bool HasSequenceNum(uint16_t seqId); - size_t SequenceMapSize(); - std::string GetCvarKey(std::string sfxKey); - std::string GetCvarLockKey(std::string sfxKey); + }; + std::set includedSequences; + std::set excludedSequences; + bool shufflePoolInitialized = false; + + public: + static AudioCollection* Instance; + AudioCollection(); + std::map GetAllSequences() const { + return sequenceMap; + } + std::set GetIncludedSequences() const { + return includedSequences; + }; + std::set GetExcludedSequences() const { + return excludedSequences; + }; + void AddToShufflePool(SequenceInfo*); + void RemoveFromShufflePool(SequenceInfo*); + void AddToCollection(char* otrPath, uint16_t seqNum); + uint16_t GetReplacementSequence(uint16_t seqId); + void InitializeShufflePool(); + const char* GetSequenceName(uint16_t seqId); + bool HasSequenceNum(uint16_t seqId); + size_t SequenceMapSize(); + std::string GetCvarKey(std::string sfxKey); + std::string GetCvarLockKey(std::string sfxKey); }; #else -void AudioCollection_AddToCollection(char *otrPath, uint16_t seqNum); +void AudioCollection_AddToCollection(char* otrPath, uint16_t seqNum); const char* AudioCollection_GetSequenceName(uint16_t seqId); bool AudioCollection_HasSequenceNum(uint16_t seqId); size_t AudioCollection_SequenceMapSize(); diff --git a/soh/soh/Enhancements/audio/AudioEditor.cpp b/soh/soh/Enhancements/audio/AudioEditor.cpp index 2e94e924a..9865615bd 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.cpp +++ b/soh/soh/Enhancements/audio/AudioEditor.cpp @@ -17,8 +17,8 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" extern "C" { - #include "z64save.h" - extern SaveContext gSaveContext; +#include "z64save.h" +extern SaveContext gSaveContext; } Vec3f pos = { 0.0f, 0.0f, 0.0f }; @@ -58,7 +58,7 @@ size_t AuthenticCountBySequenceType(SeqType type) { case SEQ_VOICE: return SEQ_COUNT_VOICE; default: - return 0; + return 0; } } @@ -101,7 +101,8 @@ void RandomizeGroup(SeqType type) { } // if we didn't find any, return early without shuffling to prevent an infinite loop - if (!values.size()) return; + if (!values.size()) + return; } Shuffle(values); for (const auto& [seqId, seqData] : AudioCollection::Instance->GetAllSequences()) { @@ -110,7 +111,9 @@ void RandomizeGroup(SeqType type) { // don't randomize locked entries if ((seqData.category & type) && CVarGetInteger(cvarLockKey.c_str(), 0) == 0) { // Only save authentic sequence CVars - if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && seqData.sequenceId >= MAX_AUTHENTIC_SEQID) || seqData.canBeReplaced == false) { + if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && + seqData.sequenceId >= MAX_AUTHENTIC_SEQID) || + seqData.canBeReplaced == false) { continue; } const int randomValue = values.back(); @@ -172,20 +175,20 @@ void DrawPreviewButton(uint16_t sequenceId, std::string sfxKey, SeqType sequence if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) == sequenceId) { if (UIWidgets::Button(stopButton.c_str(), UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(10.0f, 6.0f)) - .Tooltip("Stop Preview") - .Color(THEME_COLOR))) { + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Stop Preview") + .Color(THEME_COLOR))) { func_800F5C2C(); CVarSetInteger(CVAR_AUDIO("Playing"), 0); } } else { if (UIWidgets::Button(previewButton.c_str(), UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(10.0f, 6.0f)) - .Tooltip("Play Preview") - .Color(THEME_COLOR))) { - if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) != 0) { + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Play Preview") + .Color(THEME_COLOR))) { + if (CVarGetInteger(CVAR_AUDIO("Playing"), 0) != 0) { func_800F5C2C(); CVarSetInteger(CVAR_AUDIO("Playing"), 0); } else { @@ -215,7 +218,7 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN ImGui::SeparatorText(tabName.c_str()); if (UIWidgets::Button(resetAllButton.c_str(), - UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); ResetGroup(map, type); @@ -227,7 +230,7 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN } ImGui::SameLine(); if (UIWidgets::Button(randomizeAllButton.c_str(), - UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); RandomizeGroup(type); @@ -239,7 +242,7 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN } ImGui::SameLine(); if (UIWidgets::Button(lockAllButton.c_str(), - UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); LockGroup(map, type); @@ -251,7 +254,7 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN } ImGui::SameLine(); if (UIWidgets::Button(unlockAllButton.c_str(), - UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { auto currentBGM = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); auto prevReplacement = AudioCollection::Instance->GetReplacementSequence(currentBGM); UnlockGroup(map, type); @@ -273,7 +276,9 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN continue; } // Do not display custom sequences in the list - if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && defaultValue >= MAX_AUTHENTIC_SEQID) || seqData.canBeReplaced == false) { + if ((((seqData.category & SEQ_BGM_CUSTOM) || seqData.category == SEQ_FANFARE) && + defaultValue >= MAX_AUTHENTIC_SEQID) || + seqData.canBeReplaced == false) { continue; } @@ -296,8 +301,10 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo(hiddenKey.c_str(), map.at(initialValue).label.c_str())) { for (const auto& [value, seqData] : map) { - // If excluded as a replacement sequence, don't show in other dropdowns except the effect's own dropdown. - if (~(seqData.category) & type || (!seqData.canBeUsedAsReplacement && initialSfxKey != seqData.sfxKey)) { + // If excluded as a replacement sequence, don't show in other dropdowns except the effect's own + // dropdown. + if (~(seqData.category) & type || + (!seqData.canBeUsedAsReplacement && initialSfxKey != seqData.sfxKey)) { continue; } @@ -317,15 +324,17 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN UIWidgets::PopStyleCombobox(); ImGui::TableNextColumn(); ImGui::PushItemWidth(-FLT_MIN); - DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue : currentValue, seqData.sfxKey, type); - auto locked = CVarGetInteger(cvarLockKey.c_str(), 0) == 1; + DrawPreviewButton((type == SEQ_SFX || type == SEQ_VOICE || type == SEQ_INSTRUMENT) ? defaultValue + : currentValue, + seqData.sfxKey, type); + auto locked = CVarGetInteger(cvarLockKey.c_str(), 0) == 1; ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); if (UIWidgets::Button(resetButton.c_str(), UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(10.0f, 6.0f)) - .Tooltip("Reset to default") - .Color(THEME_COLOR))) { + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Reset to default") + .Color(THEME_COLOR))) { CVarClear(cvarKey.c_str()); CVarClear(cvarLockKey.c_str()); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -334,10 +343,10 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(10.0f, 6.0f)) - .Tooltip("Randomize this sound") - .Color(THEME_COLOR))) { + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip("Randomize this sound") + .Color(THEME_COLOR))) { std::vector validSequences = {}; for (const auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (seqInfo->category & type) { @@ -354,16 +363,16 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN } Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); UpdateCurrentBGM(defaultValue, type); - } + } } ImGui::SameLine(); ImGui::PushItemWidth(-FLT_MIN); if (UIWidgets::Button(locked ? lockedButton.c_str() : unlockedButton.c_str(), - UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(10.0f, 6.0f)) - .Tooltip(locked ? "Sound locked" : "Sound unlocked") - .Color(THEME_COLOR))) { + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.0f, 6.0f)) + .Tooltip(locked ? "Sound locked" : "Sound unlocked") + .Color(THEME_COLOR))) { if (locked) { CVarClear(cvarLockKey.c_str()); } else { @@ -442,7 +451,6 @@ void DrawTypeChip(SeqType type, std::string sequenceName) { ImGui::EndDisabled(); } - void AudioEditorRegisterOnSceneInitHook() { GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { if (gSaveContext.gameMode != GAMEMODE_END_CREDITS && CVarGetInteger(CVAR_AUDIO("RandomizeAllOnNewScene"), 0)) { @@ -460,40 +468,39 @@ void AudioEditor::DrawElement() { UIWidgets::Separator(); if (UIWidgets::Button("Randomize All Groups", - UIWidgets::ButtonOptions() - .Size(ImVec2(230.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("Randomizes all unlocked music and sound effects across tab groups"))) { + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Randomizes all unlocked music and sound effects across tab groups"))) { AudioEditor_RandomizeAll(); } ImGui::SameLine(); if (UIWidgets::Button("Reset All Groups", - UIWidgets::ButtonOptions() - .Size(ImVec2(230.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("Resets all unlocked music and sound effects across tab groups"))) { + UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Resets all unlocked music and sound effects across tab groups"))) { AudioEditor_ResetAll(); } ImGui::SameLine(); if (UIWidgets::Button("Lock All Groups", UIWidgets::ButtonOptions() - .Size(ImVec2(230.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("Locks all music and sound effects across tab groups"))) { + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Locks all music and sound effects across tab groups"))) { AudioEditor_LockAll(); } ImGui::SameLine(); - if (UIWidgets::Button("Unlock All Groups", - UIWidgets::ButtonOptions() - .Size(ImVec2(230.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("Unlocks all music and sound effects across tab groups"))) { + if (UIWidgets::Button("Unlock All Groups", UIWidgets::ButtonOptions() + .Size(ImVec2(230.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Unlocks all music and sound effects across tab groups"))) { AudioEditor_UnlockAll(); } UIWidgets::Separator(); UIWidgets::PushStyleTabs(THEME_COLOR); if (ImGui::BeginTabBar("SfxContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) { - + static ImVec2 cellPadding(8.0f, 8.0f); if (ImGui::BeginTabItem("Audio Options")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); @@ -609,16 +616,10 @@ void AudioEditor::DrawElement() { excludeTabOpen = true; } - static std::map showType { - {SEQ_BGM_WORLD, true}, - {SEQ_BGM_EVENT, true}, - {SEQ_BGM_BATTLE, true}, - {SEQ_OCARINA, true}, - {SEQ_FANFARE, true}, - {SEQ_SFX, true }, - {SEQ_VOICE, true }, - {SEQ_INSTRUMENT, true}, - {SEQ_BGM_CUSTOM, true}, + static std::map showType{ + { SEQ_BGM_WORLD, true }, { SEQ_BGM_EVENT, true }, { SEQ_BGM_BATTLE, true }, + { SEQ_OCARINA, true }, { SEQ_FANFARE, true }, { SEQ_SFX, true }, + { SEQ_VOICE, true }, { SEQ_INSTRUMENT, true }, { SEQ_BGM_CUSTOM, true }, }; // make temporary sets because removing from the set we're iterating through crashes ImGui @@ -631,7 +632,7 @@ void AudioEditor::DrawElement() { UIWidgets::PopStyleInput(); ImGui::SameLine(); if (UIWidgets::Button("Exclude All", - UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { for (auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { seqsToExclude.insert(seqInfo); @@ -640,7 +641,7 @@ void AudioEditor::DrawElement() { } ImGui::SameLine(); if (UIWidgets::Button("Include All", - UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR))) { for (auto seqInfo : AudioCollection::Instance->GetExcludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { seqsToInclude.insert(seqInfo); @@ -648,7 +649,8 @@ void AudioEditor::DrawElement() { } } - ImGui::BeginTable("sequenceTypes", 9, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders); + ImGui::BeginTable("sequenceTypes", 9, + ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders); ImGui::TableNextColumn(); ImGui::PushStyleColor(ImGuiCol_Header, GetSequenceTypeColor(SEQ_BGM_WORLD)); @@ -710,10 +712,10 @@ void AudioEditor::DrawElement() { for (auto seqInfo : AudioCollection::Instance->GetIncludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { if (UIWidgets::Button(std::string(ICON_FA_TIMES "##" + seqInfo->sfxKey).c_str(), - UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(9.0f, 6.0f)) - .Color(THEME_COLOR))) { + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(9.0f, 6.0f)) + .Color(THEME_COLOR))) { seqsToExclude.insert(seqInfo); } ImGui::SameLine(); @@ -738,10 +740,10 @@ void AudioEditor::DrawElement() { for (auto seqInfo : AudioCollection::Instance->GetExcludedSequences()) { if (sequenceSearch.PassFilter(seqInfo->label.c_str()) && showType[seqInfo->category]) { if (UIWidgets::Button(std::string(ICON_FA_PLUS "##" + seqInfo->sfxKey).c_str(), - UIWidgets::ButtonOptions() - .Size(UIWidgets::Sizes::Inline) - .Padding(ImVec2(9.0f, 6.0f)) - .Color(THEME_COLOR))) { + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(9.0f, 6.0f)) + .Color(THEME_COLOR))) { seqsToInclude.insert(seqInfo); } ImGui::SameLine(); @@ -772,7 +774,9 @@ void AudioEditor::DrawElement() { UIWidgets::PopStyleTabs(); } -std::vector allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE, }; +std::vector allTypes = { + SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE, +}; void AudioEditor_RandomizeAll() { for (auto type : allTypes) { diff --git a/soh/soh/Enhancements/audio/AudioEditor.h b/soh/soh/Enhancements/audio/AudioEditor.h index b1b034f24..a5b0b385a 100644 --- a/soh/soh/Enhancements/audio/AudioEditor.h +++ b/soh/soh/Enhancements/audio/AudioEditor.h @@ -8,13 +8,13 @@ #include "AudioCollection.h" class AudioEditor : public Ship::GuiWindow { - public: - using GuiWindow::GuiWindow; + public: + using GuiWindow::GuiWindow; - void DrawElement() override; - void InitElement() override; - void UpdateElement() override {}; - ~AudioEditor() {}; + void DrawElement() override; + void InitElement() override; + void UpdateElement() override{}; + ~AudioEditor(){}; }; void AudioEditor_RandomizeAll(); @@ -29,7 +29,6 @@ extern "C" { u16 AudioEditor_GetReplacementSeq(u16 seqId); - #ifdef __cplusplus } #endif diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c index ac2ae2bc5..dde827ec5 100644 --- a/soh/soh/Enhancements/bootcommands.c +++ b/soh/soh/Enhancements/bootcommands.c @@ -12,8 +12,7 @@ #include "soh/OTRGlobals.h" #include "soh/cvar_prefixes.h" -void BootCommands_Init() -{ +void BootCommands_Init() { // Clears vars to prevent randomizer menu from being disabled CVarClear(CVAR_GENERAL("RandoGenerating")); // Clear when a crash happened during rando seed generation CVarClear(CVAR_GENERAL("NewSeedGenerated")); diff --git a/soh/soh/Enhancements/boss-rush/BossRush.cpp b/soh/soh/Enhancements/boss-rush/BossRush.cpp index 6f218fcb3..76cf5637e 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.cpp +++ b/soh/soh/Enhancements/boss-rush/BossRush.cpp @@ -8,18 +8,18 @@ #include extern "C" { - #include "functions.h" - #include "macros.h" - #include "variables.h" - #include "src/overlays/actors/ovl_Boss_Goma/z_boss_goma.h" - #include "src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h" - #include "src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h" - extern PlayState* gPlayState; +#include "functions.h" +#include "macros.h" +#include "variables.h" +#include "src/overlays/actors/ovl_Boss_Goma/z_boss_goma.h" +#include "src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h" +#include "src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h" +extern PlayState* gPlayState; - Gfx* KaleidoScope_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, u16 point); - #include "textures/icon_item_nes_static/icon_item_nes_static.h" - #include "textures/icon_item_ger_static/icon_item_ger_static.h" - #include "textures/icon_item_fra_static/icon_item_fra_static.h" +Gfx* KaleidoScope_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, u16 point); +#include "textures/icon_item_nes_static/icon_item_nes_static.h" +#include "textures/icon_item_ger_static/icon_item_ger_static.h" +#include "textures/icon_item_fra_static/icon_item_fra_static.h" } typedef struct BossRushSetting { @@ -27,103 +27,79 @@ typedef struct BossRushSetting { std::vector> choices; } BossRushSetting; -BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { - { - { "BOSSES:", "BOSSE:", "BOSS:" }, - { - { "All", "Alle", "Tous" }, - { "Child", "Kind", "Enfant" }, - { "Adult", "Erwachsener", "Adulte" }, - { "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" }, - } - }, - { - { "HEARTS:", "HERZEN:", "COEURS:" }, - { - { "10", "10", "10" }, - { "15", "15", "15" }, - { "20", "20", "20" }, - { "3", "3", "3" }, - { "5", "5", "5" }, - { "7", "7", "7" }, - } - }, - { - { "AMMO:", "MUNITION:", "MUNITIONS:" }, - { - { "Limited", "Limitiert", "Limitées" }, - { "Full", "Voll", "Pleines" }, - { "Maxed", "Maximum", "Maximum" }, - } - }, - { - { "HEAL:", "REGENERATION:", "SOIN:" }, - { - { "Before Ganondorf", "Vor Ganondorf", "Avant Ganondorf" }, - { "Every Boss", "Bei jedem Boss", "Tous les Boss" }, - { "Never", "Niemals", "Jamais" }, - } - }, - { - { "HYPER BOSSES:", "HYPER-BOSSE:", "HYPER BOSS:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" }, - } - }, - { - { "MAGIC:", "MAGIE:", "MAGIE:" }, - { - { "Single", "Einzel", "Simple" }, - { "Double", "Doppel", "Double" }, - } - }, - { - { "BIG. SWORD:", "BIG.-SCHWERT:", "EPÉE DE BIG.:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" }, - } - }, - { - { "BOTTLE:", "FLASCHEN:", "BOUTEILLE:" }, - { - { "No", "Nein", "Non" }, - { "Empty", "Leer", "Vide" }, - { "Fairy", "Fee", "Fée" }, - { "Red Potion", "Rotes Elixier", "Potion Rouge" }, - { "Green Potion", "Grünes Elixier", "Potion Verte" }, - { "Blue Potion", "Blaues Elixier", "Potion Bleue" }, - } - }, - { - { "LONGSHOT:", "ENTERHAKEN:", "SUPER GRAPPIN:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" }, - } - }, - { - { "HOVER BOOTS:", "GLEITSTIEFEL:", "BOTTES DES AIRS:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" }, - } - }, - { - { "BUNNY HOOD:", "HASENOHREN:", "MASQUE DU LAPIN:" }, - { - { "No", "Nein", "Non" }, - { "Yes", "Ja", "Oui" }, - } - }, - { - { "TIMER:", "TIMER:", "TIMER:" }, - { - { "Yes", "Ja", "Oui" }, - { "No", "Nein", "Non" }, - } - } +BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = { + { { "BOSSES:", "BOSSE:", "BOSS:" }, + { + { "All", "Alle", "Tous" }, + { "Child", "Kind", "Enfant" }, + { "Adult", "Erwachsener", "Adulte" }, + { "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" }, + } }, + { { "HEARTS:", "HERZEN:", "COEURS:" }, + { + { "10", "10", "10" }, + { "15", "15", "15" }, + { "20", "20", "20" }, + { "3", "3", "3" }, + { "5", "5", "5" }, + { "7", "7", "7" }, + } }, + { { "AMMO:", "MUNITION:", "MUNITIONS:" }, + { + { "Limited", "Limitiert", "Limitées" }, + { "Full", "Voll", "Pleines" }, + { "Maxed", "Maximum", "Maximum" }, + } }, + { { "HEAL:", "REGENERATION:", "SOIN:" }, + { + { "Before Ganondorf", "Vor Ganondorf", "Avant Ganondorf" }, + { "Every Boss", "Bei jedem Boss", "Tous les Boss" }, + { "Never", "Niemals", "Jamais" }, + } }, + { { "HYPER BOSSES:", "HYPER-BOSSE:", "HYPER BOSS:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "MAGIC:", "MAGIE:", "MAGIE:" }, + { + { "Single", "Einzel", "Simple" }, + { "Double", "Doppel", "Double" }, + } }, + { { "BIG. SWORD:", "BIG.-SCHWERT:", "EPÉE DE BIG.:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "BOTTLE:", "FLASCHEN:", "BOUTEILLE:" }, + { + { "No", "Nein", "Non" }, + { "Empty", "Leer", "Vide" }, + { "Fairy", "Fee", "Fée" }, + { "Red Potion", "Rotes Elixier", "Potion Rouge" }, + { "Green Potion", "Grünes Elixier", "Potion Verte" }, + { "Blue Potion", "Blaues Elixier", "Potion Bleue" }, + } }, + { { "LONGSHOT:", "ENTERHAKEN:", "SUPER GRAPPIN:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "HOVER BOOTS:", "GLEITSTIEFEL:", "BOTTES DES AIRS:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "BUNNY HOOD:", "HASENOHREN:", "MASQUE DU LAPIN:" }, + { + { "No", "Nein", "Non" }, + { "Yes", "Ja", "Oui" }, + } }, + { { "TIMER:", "TIMER:", "TIMER:" }, + { + { "Yes", "Ja", "Oui" }, + { "No", "Nein", "Non" }, + } } }; const char* BossRush_GetSettingName(u8 optionIndex, u8 language) { @@ -196,7 +172,7 @@ void BossRush_SetEquipment(u8 linkAge) { Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); - // Set Adult equipment. + // Set Adult equipment. } else { brButtonItems = { ITEM_SWORD_MASTER, ITEM_BOW, ITEM_HAMMER, ITEM_BOMB, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE }; @@ -229,34 +205,36 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { } else { play->nextEntranceIndex = ENTR_FOREST_TEMPLE_BOSS_ENTRANCE; } - // King Dodongo & Volvagia + // King Dodongo & Volvagia } else if (warpPosX == 100 && warpPosZ == -170) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { play->nextEntranceIndex = ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE; } else { play->nextEntranceIndex = ENTR_FIRE_TEMPLE_BOSS_ENTRANCE; } - // Barinade & Morb + // Barinade & Morb } else if (warpPosX == 199 && warpPosZ == 0) { if (gSaveContext.linkAge == LINK_AGE_CHILD) { play->nextEntranceIndex = ENTR_JABU_JABU_BOSS_ENTRANCE; } else { play->nextEntranceIndex = ENTR_WATER_TEMPLE_BOSS_ENTRANCE; } - // Twinrova + // Twinrova } else if (warpPosX == 100 && warpPosZ == 170) { play->nextEntranceIndex = ENTR_SPIRIT_TEMPLE_BOSS_2; - // Bongo Bongo + // Bongo Bongo } else if (warpPosX == -100 && warpPosZ == 170) { play->nextEntranceIndex = ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE; - // Ganondork + // Ganondork } else if (warpPosX == -199 && warpPosZ == 0) { play->nextEntranceIndex = ENTR_GANONDORF_BOSS_0; } else { - SPDLOG_ERROR("[BossRush]: Unknown blue warp in chamber of sages at position ({}, {}). Warping back to chamber of sages.", warpPosX, warpPosZ); + SPDLOG_ERROR("[BossRush]: Unknown blue warp in chamber of sages at position ({}, {}). Warping back to " + "chamber of sages.", + warpPosX, warpPosZ); play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; } - // If coming from a boss room, teleport back to Chamber of Sages and set flag. + // If coming from a boss room, teleport back to Chamber of Sages and set flag. } else { play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; @@ -267,7 +245,7 @@ void BossRush_HandleBlueWarp(PlayState* play, f32 warpPosX, f32 warpPosZ) { // Change to Adult Link. if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_BOSSES] == BR_CHOICE_BOSSES_ALL) { BossRush_SetEquipment(LINK_AGE_ADULT); - // Warp to credits. + // Warp to credits. } 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; @@ -328,7 +306,8 @@ void BossRush_HandleCompleteBoss(PlayState* play) { Health_ChangeBy(play, 320); } - if ((CheckDungeonCount() == 3 && gSaveContext.ship.quest.data.bossRush.options[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.ship.stats.playTimer += 2; gSaveContext.ship.stats.gameComplete = 1; @@ -399,17 +378,17 @@ void BossRush_InitSave() { gSaveContext.eventChkInf[7] |= 0x80; // bongo bongo // Sets all rando flags to false - // Boss Rush currently uses 2 randomizer flags (RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE & RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE) + // 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 std::array brItems = { - ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_NONE, ITEM_NONE, - ITEM_SLINGSHOT, ITEM_NONE, ITEM_NONE, ITEM_HOOKSHOT, ITEM_NONE, ITEM_NONE, - ITEM_BOOMERANG, ITEM_LENS, ITEM_NONE, ITEM_HAMMER, ITEM_ARROW_LIGHT, ITEM_NONE, - ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, + ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_NONE, ITEM_NONE, ITEM_SLINGSHOT, ITEM_NONE, + ITEM_NONE, ITEM_HOOKSHOT, ITEM_NONE, ITEM_NONE, ITEM_BOOMERANG, ITEM_LENS, ITEM_NONE, ITEM_HAMMER, + ITEM_ARROW_LIGHT, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, }; if (gSaveContext.ship.quest.data.bossRush.options[BR_OPTIONS_LONGSHOT] == BR_CHOICE_LONGSHOT_YES) { @@ -541,11 +520,13 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li break; } } - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, childPos.x, bossGoma->actor.world.pos.y, childPos.z, 0, 0, 0, WARP_DUNGEON_ADULT, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, childPos.x, + bossGoma->actor.world.pos.y, childPos.z, 0, 0, 0, WARP_DUNGEON_ADULT, false); break; } case SCENE_DODONGOS_CAVERN_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -890.0f, -1523.76f, -3304.0f, 0, 0, 0, WARP_DUNGEON_ADULT, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -890.0f, -1523.76f, -3304.0f, 0, 0, + 0, WARP_DUNGEON_ADULT, false); break; } case SCENE_JABU_JABU_BOSS: { @@ -563,28 +544,34 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } } - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, sWarpPos[sp7C].x, sWarpPos[sp7C].y, sWarpPos[sp7C].z, 0, 0, 0, WARP_DUNGEON_ADULT, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, sWarpPos[sp7C].x, sWarpPos[sp7C].y, + sWarpPos[sp7C].z, 0, 0, 0, WARP_DUNGEON_ADULT, false); break; } case SCENE_FOREST_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 14.0f, -33.0f, -3315.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 14.0f, -33.0f, -3315.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } case SCENE_FIRE_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 0.0f, 100.0f, 0.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 0.0f, 100.0f, 0.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } case SCENE_WATER_TEMPLE_BOSS: { BossMo* bossMo = va_arg(args, BossMo*); - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, bossMo->actor.world.pos.x, -280.0f, bossMo->actor.world.pos.z, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, bossMo->actor.world.pos.x, -280.0f, + bossMo->actor.world.pos.z, 0, 0, 0, WARP_DUNGEON_ADULT, true); break; } case SCENE_SPIRIT_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 600.0f, 230.0f, 0.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, 600.0f, 230.0f, 0.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } case SCENE_SHADOW_TEMPLE_BOSS: { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -50.0f, 0.0f, 400.0f, 0, 0, 0, WARP_DUNGEON_ADULT, true); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_DOOR_WARP1, -50.0f, 0.0f, 400.0f, 0, 0, 0, + WARP_DUNGEON_ADULT, true); break; } default: { @@ -699,12 +686,18 @@ void BossRush_RegisterHooks() { onBossDefeatHook = 0; onActorUpdate = 0; - if (!IS_BOSS_RUSH) return; + if (!IS_BOSS_RUSH) + return; - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnVanillaBehaviorHandler); - onSceneInitHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnSceneInitHandler); - onActorInitHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnActorInitHandler); - onBossDefeatHook = GameInteractor::Instance->RegisterGameHook(BossRush_OnBossDefeatHandler); - onActorUpdate = GameInteractor::Instance->RegisterGameHookForID(ACTOR_DOOR_WARP1, BossRush_OnBlueWarpUpdate); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( + BossRush_OnVanillaBehaviorHandler); + onSceneInitHook = + GameInteractor::Instance->RegisterGameHook(BossRush_OnSceneInitHandler); + onActorInitHook = + GameInteractor::Instance->RegisterGameHook(BossRush_OnActorInitHandler); + onBossDefeatHook = + GameInteractor::Instance->RegisterGameHook(BossRush_OnBossDefeatHandler); + onActorUpdate = GameInteractor::Instance->RegisterGameHookForID( + ACTOR_DOOR_WARP1, BossRush_OnBlueWarpUpdate); }); } diff --git a/soh/soh/Enhancements/boss-rush/BossRush.h b/soh/soh/Enhancements/boss-rush/BossRush.h index 292cbaf26..881d8d53f 100644 --- a/soh/soh/Enhancements/boss-rush/BossRush.h +++ b/soh/soh/Enhancements/boss-rush/BossRush.h @@ -5,12 +5,12 @@ #ifdef __cplusplus extern "C" { #endif - void BossRush_HandleBlueWarpHeal(PlayState* play); - void BossRush_InitSave(); - const char* BossRush_GetSettingName(u8 optionIndex, u8 language); - const char* BossRush_GetSettingChoiceName(u8 optionIndex, u8 choiceIndex, u8 language); - u8 BossRush_GetSettingOptionsAmount(u8 optionIndex); - void BossRush_RegisterHooks(); +void BossRush_HandleBlueWarpHeal(PlayState* play); +void BossRush_InitSave(); +const char* BossRush_GetSettingName(u8 optionIndex, u8 language); +const char* BossRush_GetSettingChoiceName(u8 optionIndex, u8 choiceIndex, u8 language); +u8 BossRush_GetSettingOptionsAmount(u8 optionIndex); +void BossRush_RegisterHooks(); #ifdef __cplusplus }; #endif diff --git a/soh/soh/Enhancements/controls/InputViewer.cpp b/soh/soh/Enhancements/controls/InputViewer.cpp index d26de6719..a48b1811f 100644 --- a/soh/soh/Enhancements/controls/InputViewer.cpp +++ b/soh/soh/Enhancements/controls/InputViewer.cpp @@ -20,15 +20,22 @@ static Color_RGBA8 textColorDefault = { 255, 255, 255, 255 }; static Color_RGBA8 range1ColorDefault = { 255, 178, 0, 255 }; static Color_RGBA8 range2ColorDefault = { 0, 255, 0, 255 }; -static std::unordered_map buttonOutlineOptions = - {{ BUTTON_OUTLINE_ALWAYS_SHOWN, "Always Shown" }, { BUTTON_OUTLINE_NOT_PRESSED, "Shown Only While Not Pressed" }, - { BUTTON_OUTLINE_PRESSED, "Shown Only While Pressed" }, { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Always Hidden" }}; -static std::unordered_map buttonOutlineOptionsVerbose = - {{ BUTTON_OUTLINE_ALWAYS_SHOWN, "Outline Always Shown" }, { BUTTON_OUTLINE_NOT_PRESSED, "Outline Shown Only While Not Pressed" }, - { BUTTON_OUTLINE_PRESSED, "Outline Shown Only While Pressed" }, { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Outline Always Hidden" }}; +static std::unordered_map buttonOutlineOptions = { + { BUTTON_OUTLINE_ALWAYS_SHOWN, "Always Shown" }, + { BUTTON_OUTLINE_NOT_PRESSED, "Shown Only While Not Pressed" }, + { BUTTON_OUTLINE_PRESSED, "Shown Only While Pressed" }, + { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Always Hidden" } +}; +static std::unordered_map buttonOutlineOptionsVerbose = { + { BUTTON_OUTLINE_ALWAYS_SHOWN, "Outline Always Shown" }, + { BUTTON_OUTLINE_NOT_PRESSED, "Outline Shown Only While Not Pressed" }, + { BUTTON_OUTLINE_PRESSED, "Outline Shown Only While Pressed" }, + { BUTTON_OUTLINE_ALWAYS_HIDDEN, "Outline Always Hidden" } +}; -static std::unordered_map stickModeOptions = - {{ STICK_MODE_ALWAYS_SHOWN, "Always" }, { STICK_MODE_HIDDEN_IN_DEADZONE, "While In Use" }, { STICK_MODE_ALWAYS_HIDDEN, "Never" }}; +static std::unordered_map stickModeOptions = { { STICK_MODE_ALWAYS_SHOWN, "Always" }, + { STICK_MODE_HIDDEN_IN_DEADZONE, "While In Use" }, + { STICK_MODE_ALWAYS_HIDDEN, "Never" } }; InputViewer::~InputViewer() { SPDLOG_TRACE("destruct input viewer"); @@ -68,66 +75,78 @@ void InputViewer::DrawElement() { if (!sButtonTexturesLoaded) { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( "Input-Viewer-Background", "textures/buttons/InputViewerBackground.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn", "textures/buttons/ABtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn", "textures/buttons/BBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn", "textures/buttons/LBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn", "textures/buttons/RBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn", "textures/buttons/ZBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Start-Btn", - "textures/buttons/StartBtn.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left", "textures/buttons/CLeft.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right", "textures/buttons/CRight.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up", "textures/buttons/CUp.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down", "textures/buttons/CDown.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Analog-Stick", - "textures/buttons/AnalogStick.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Left", - "textures/buttons/DPadLeft.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Right", - "textures/buttons/DPadRight.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up", "textures/buttons/DPadUp.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Down", - "textures/buttons/DPadDown.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1", "textures/buttons/Mod1.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2", "textures/buttons/Mod2.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Right-Stick", - "textures/buttons/RightStick.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn Outline", - "textures/buttons/ABtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn Outline", - "textures/buttons/BBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn Outline", - "textures/buttons/LBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn Outline", - "textures/buttons/RBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn Outline", - "textures/buttons/ZBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Start-Btn Outline", - "textures/buttons/StartBtnOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left Outline", - "textures/buttons/CLeftOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right Outline", - "textures/buttons/CRightOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up Outline", - "textures/buttons/CUpOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down Outline", - "textures/buttons/CDownOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Analog-Stick Outline", - "textures/buttons/AnalogStickOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Left Outline", - "textures/buttons/DPadLeftOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Right Outline", - "textures/buttons/DPadRightOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up Outline", - "textures/buttons/DPadUpOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Down Outline", - "textures/buttons/DPadDownOutline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1 Outline", - "textures/buttons/Mod1Outline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2 Outline", - "textures/buttons/Mod2Outline.png"); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Right-Stick Outline", - "textures/buttons/RightStickOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("A-Btn", + "textures/buttons/ABtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("B-Btn", + "textures/buttons/BBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("L-Btn", + "textures/buttons/LBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("R-Btn", + "textures/buttons/RBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Z-Btn", + "textures/buttons/ZBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Start-Btn", "textures/buttons/StartBtn.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Left", + "textures/buttons/CLeft.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Right", + "textures/buttons/CRight.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Up", + "textures/buttons/CUp.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("C-Down", + "textures/buttons/CDown.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Analog-Stick", "textures/buttons/AnalogStick.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Left", "textures/buttons/DPadLeft.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Right", "textures/buttons/DPadRight.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Dpad-Up", + "textures/buttons/DPadUp.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Down", "textures/buttons/DPadDown.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-1", + "textures/buttons/Mod1.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage("Modifier-2", + "textures/buttons/Mod2.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Right-Stick", "textures/buttons/RightStick.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "A-Btn Outline", "textures/buttons/ABtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "B-Btn Outline", "textures/buttons/BBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "L-Btn Outline", "textures/buttons/LBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "R-Btn Outline", "textures/buttons/RBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Z-Btn Outline", "textures/buttons/ZBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Start-Btn Outline", "textures/buttons/StartBtnOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Left Outline", "textures/buttons/CLeftOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Right Outline", "textures/buttons/CRightOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Up Outline", "textures/buttons/CUpOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "C-Down Outline", "textures/buttons/CDownOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Analog-Stick Outline", "textures/buttons/AnalogStickOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Left Outline", "textures/buttons/DPadLeftOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Right Outline", "textures/buttons/DPadRightOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Up Outline", "textures/buttons/DPadUpOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Dpad-Down Outline", "textures/buttons/DPadDownOutline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Modifier-1 Outline", "textures/buttons/Mod1Outline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Modifier-2 Outline", "textures/buttons/Mod2Outline.png"); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadTextureFromRawImage( + "Right-Stick Outline", "textures/buttons/RightStickOutline.png"); sButtonTexturesLoaded = true; } @@ -140,7 +159,8 @@ void InputViewer::DrawElement() { const float scale = CVarGetFloat(CVAR_INPUT_VIEWER("Scale"), 1.0f); #endif const int showAnalogAngles = CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0); - const int buttonOutlineMode = CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED); + const int buttonOutlineMode = + CVarGetInteger(CVAR_INPUT_VIEWER("ButtonOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED); const bool useGlobalOutlineMode = CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); ImVec2 bgSize = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureSize("Input-Viewer-Background"); @@ -148,12 +168,12 @@ void InputViewer::DrawElement() { ImGui::SetNextWindowSize( ImVec2(scaledBGSize.x + 20, scaledBGSize.y + - (showAnalogAngles ? ImGui::CalcTextSize("X").y : 0) * scale * - CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f) + - 20)); + (showAnalogAngles ? ImGui::CalcTextSize("X").y : 0) * scale * + CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f) + + 20)); ImGui::SetNextWindowContentSize( ImVec2(scaledBGSize.x, scaledBGSize.y + (showAnalogAngles ? 15 : 0) * scale * - CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f))); + CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f))); ImGui::SetNextWindowPos( ImVec2(mainPos.x + size.x - scaledBGSize.x - 30, mainPos.y + size.y - scaledBGSize.y - 30), ImGuiCond_FirstUseEver); @@ -161,11 +181,12 @@ void InputViewer::DrawElement() { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); - OSContPad* pads = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); + OSContPad* pads = + std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | - ImGuiWindowFlags_NoFocusOnAppearing; + ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | + ImGuiWindowFlags_NoFocusOnAppearing; if (!CVarGetInteger(CVAR_INPUT_VIEWER("EnableDragging"), 1)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; @@ -188,17 +209,17 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("B-Btn", "B-Btn Outline", pads[0].button & BTN_B, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("BBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("BBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("A-Btn", "A-Btn Outline", pads[0].button & BTN_A, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("ABtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("ABtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // C buttons @@ -206,33 +227,33 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Up", "C-Up Outline", pads[0].button & BTN_CUP, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CUpOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CUpOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Left", "C-Left Outline", pads[0].button & BTN_CLEFT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CLeftOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CLeftOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Right", "C-Right Outline", pads[0].button & BTN_CRIGHT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CRightOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CRightOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("C-Down", "C-Down Outline", pads[0].button & BTN_CDOWN, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("CDownOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("CDownOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // L/R/Z @@ -240,25 +261,25 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("L-Btn", "L-Btn Outline", pads[0].button & BTN_L, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("LBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("LBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("R-Btn", "R-Btn Outline", pads[0].button & BTN_R, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("RBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("RBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } if (CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Z-Btn", "Z-Btn Outline", pads[0].button & BTN_Z, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("ZBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Start @@ -266,9 +287,9 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Start-Btn", "Start-Btn Outline", pads[0].button & BTN_START, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("StartBtnOutlineMode"), + BUTTON_OUTLINE_NOT_PRESSED)); } // Dpad @@ -276,27 +297,27 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Left", "Dpad-Left Outline", pads[0].button & BTN_DLEFT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Right", "Dpad-Right Outline", pads[0].button & BTN_DRIGHT, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Up", "Dpad-Up Outline", pads[0].button & BTN_DUP, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Dpad-Down", "Dpad-Down Outline", pads[0].button & BTN_DDOWN, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("DpadOutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Modifier 1 @@ -304,18 +325,18 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Modifier-1", "Modifier-1 Outline", pads[0].button & BTN_CUSTOM_MODIFIER1, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("Mod1OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("Mod1OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } // Modifier 2 if (CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos(aPos); RenderButton("Modifier-2", "Modifier-2 Outline", pads[0].button & BTN_CUSTOM_MODIFIER2, scaledBGSize, - useGlobalOutlineMode - ? buttonOutlineMode - : CVarGetInteger(CVAR_INPUT_VIEWER("Mod2OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); + useGlobalOutlineMode + ? buttonOutlineMode + : CVarGetInteger(CVAR_INPUT_VIEWER("Mod2OutlineMode"), BUTTON_OUTLINE_NOT_PRESSED)); } const bool analogStickIsInDeadzone = !pads[0].stick_x && !pads[0].stick_y; @@ -340,9 +361,9 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos( ImVec2(aPos.x + maxStickDistance * ((float)(pads[0].stick_x) / MAX_AXIS_RANGE) * scale, - aPos.y - maxStickDistance * ((float)(pads[0].stick_y) / MAX_AXIS_RANGE) * scale)); + aPos.y - maxStickDistance * ((float)(pads[0].stick_y) / MAX_AXIS_RANGE) * scale)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Analog-Stick"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); } // Right Stick @@ -364,15 +385,16 @@ void InputViewer::DrawElement() { ImGui::SetNextItemAllowOverlap(); ImGui::SetCursorPos( ImVec2(aPos.x + maxRightStickDistance * ((float)(pads[0].right_stick_x) / MAX_AXIS_RANGE) * scale, - aPos.y - maxRightStickDistance * ((float)(pads[0].right_stick_y) / MAX_AXIS_RANGE) * scale)); + aPos.y - maxRightStickDistance * ((float)(pads[0].right_stick_y) / MAX_AXIS_RANGE) * scale)); ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("Right-Stick"), - scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); + scaledBGSize, ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, 255)); } // Analog stick angle text if (showAnalogAngles) { - ImGui::SetCursorPos(ImVec2(aPos.x + 10 + CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0) * scale, - scaledBGSize.y + aPos.y + 10)); + ImGui::SetCursorPos( + ImVec2(aPos.x + 10 + CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Offset"), 0) * scale, + scaledBGSize.y + aPos.y + 10)); // Scale font with input viewer scale float oldFontScale = ImGui::GetFont()->Scale; ImGui::GetFont()->Scale *= scale * CVarGetFloat(CVAR_INPUT_VIEWER("AnalogAngles.Scale"), 1.0f); @@ -392,18 +414,17 @@ void InputViewer::DrawElement() { if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0) && (rSquared >= (range1Min * range1Min)) && (rSquared < (range1Max * range1Max))) { ImGui::PushStyleColor( - ImGuiCol_Text, - VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color.Value"), range1ColorDefault))); - } - else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && - (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { + ImGuiCol_Text, VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color.Value"), + range1ColorDefault))); + } else if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0) && + (rSquared >= (range2Min * range2Min)) && (rSquared < (range2Max * range2Max))) { ImGui::PushStyleColor( - ImGuiCol_Text, - VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color.Value"), range2ColorDefault))); - } - else { - ImGui::PushStyleColor(ImGuiCol_Text, VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor.Value"), - textColorDefault))); + ImGuiCol_Text, VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color.Value"), + range2ColorDefault))); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, + VecFromRGBA8(CVarGetColor(CVAR_INPUT_VIEWER("AnalogAngles.TextColor.Value"), + textColorDefault))); } // Render text @@ -430,15 +451,23 @@ InputViewerSettingsWindow::~InputViewerSettingsWindow() { void InputViewerSettingsWindow::DrawElement() { // gInputViewer.Scale CVarSliderFloat("Input Viewer Scale: %.2f", CVAR_INPUT_VIEWER("Scale"), - FloatSliderOptions().Color(THEME_COLOR).DefaultValue(1.0f).Min(0.1f).Max(5.0f).ShowButtons(true).Tooltip("Sets the on screen size of the input viewer")); + FloatSliderOptions() + .Color(THEME_COLOR) + .DefaultValue(1.0f) + .Min(0.1f) + .Max(5.0f) + .ShowButtons(true) + .Tooltip("Sets the on screen size of the input viewer")); // gInputViewer.EnableDragging - CVarCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Enable Dragging", CVAR_INPUT_VIEWER("EnableDragging"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(true, true); // gInputViewer.ShowBackground - CVarCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show Background Layer", CVAR_INPUT_VIEWER("ShowBackground"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(true, true); @@ -446,121 +475,138 @@ void InputViewerSettingsWindow::DrawElement() { if (ImGui::CollapsingHeader("Buttons")) { // gInputViewer.ButtonOutlineMode - CVarCombobox("Button Outlines/Backgrounds", CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, - ComboboxOptions({{ .disabled = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), .disabledTooltip = "Disabled because Global Button Outline is off" }}) - .Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED) - .Tooltip("Sets the desired visibility behavior for the button outline/background layers. Useful for " - "custom input viewers.")); + CVarCombobox( + "Button Outlines/Backgrounds", CVAR_INPUT_VIEWER("ButtonOutlineMode"), buttonOutlineOptions, + ComboboxOptions({ { .disabled = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1), + .disabledTooltip = "Disabled because Global Button Outline is off" } }) + .Color(THEME_COLOR) + .DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED) + .Tooltip("Sets the desired visibility behavior for the button outline/background layers. Useful for " + "custom input viewers.")); // gInputViewer.UseGlobalButtonOutlineMode - CVarCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Use for all buttons", CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); UIWidgets::PaddedSeparator(); bool useIndividualOutlines = !CVarGetInteger(CVAR_INPUT_VIEWER("UseGlobalButtonOutlineMode"), 1); // gInputViewer.ABtn - CVarCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show A-Button Layers", CVAR_INPUT_VIEWER("ABtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ABtn"), 1)) { ImGui::Indent(); - CVarCombobox("##ABtnOutline", CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + CVarCombobox("##ABtnOutline", CVAR_INPUT_VIEWER("ABtnOutlineMode"), buttonOutlineOptionsVerbose, + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.BBtn - CVarCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show B-Button Layers", CVAR_INPUT_VIEWER("BBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("BBtn"), 1)) { ImGui::Indent(); CVarCombobox("##BBtnOutline", CVAR_INPUT_VIEWER("BBtnOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CUp - CVarCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show C-Up Layers", CVAR_INPUT_VIEWER("CUp"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CUp"), 1)) { ImGui::Indent(); CVarCombobox("##CUpOutline", CVAR_INPUT_VIEWER("CUpOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CRight - CVarCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show C-Right Layers", CVAR_INPUT_VIEWER("CRight"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CRight"), 1)) { ImGui::Indent(); CVarCombobox("##CRightOutline", CVAR_INPUT_VIEWER("CRightOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CDown - CVarCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show C-Down Layers", CVAR_INPUT_VIEWER("CDown"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CDown"), 1)) { ImGui::Indent(); CVarCombobox("##CDownOutline", CVAR_INPUT_VIEWER("CDownOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.CLeft - CVarCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show C-Left Layers", CVAR_INPUT_VIEWER("CLeft"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("CLeft"), 1)) { ImGui::Indent(); CVarCombobox("##CLeftOutline", CVAR_INPUT_VIEWER("CLeftOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.LBtn - CVarCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show L-Button Layers", CVAR_INPUT_VIEWER("LBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("LBtn"), 1)) { ImGui::Indent(); CVarCombobox("##LBtnOutline", CVAR_INPUT_VIEWER("LBtnOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.RBtn - CVarCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show R-Button Layers", CVAR_INPUT_VIEWER("RBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("RBtn"), 1)) { ImGui::Indent(); CVarCombobox("##RBtnOutline", CVAR_INPUT_VIEWER("RBtnOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.ZBtn - CVarCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show Z-Button Layers", CVAR_INPUT_VIEWER("ZBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("ZBtn"), 1)) { ImGui::Indent(); CVarCombobox("##ZBtnOutline", CVAR_INPUT_VIEWER("ZBtnOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.StartBtn - CVarCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show Start Button Layers", CVAR_INPUT_VIEWER("StartBtn"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("StartBtn"), 1)) { ImGui::Indent(); CVarCombobox("##StartBtnOutline", CVAR_INPUT_VIEWER("StartBtnOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Dpad - CVarCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show D-Pad Layers", CVAR_INPUT_VIEWER("Dpad"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Dpad"), 0)) { ImGui::Indent(); CVarCombobox("##DpadOutline", CVAR_INPUT_VIEWER("DpadOutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Mod1 - CVarCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show Modifier Button 1 Layers", CVAR_INPUT_VIEWER("Mod1"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod1"), 0)) { ImGui::Indent(); CVarCombobox("##Mmod1Outline", CVAR_INPUT_VIEWER("Mod1OutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } // gInputViewer.Mod2 - CVarCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); + CVarCheckbox("Show Modifier Button 2 Layers", CVAR_INPUT_VIEWER("Mod2"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true)); if (useIndividualOutlines && CVarGetInteger(CVAR_INPUT_VIEWER("Mod2"), 0)) { ImGui::Indent(); CVarCombobox("##Mod2Outline", CVAR_INPUT_VIEWER("Mod2OutlineMode"), buttonOutlineOptionsVerbose, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); + ComboboxOptions().Color(THEME_COLOR).DefaultIndex(BUTTON_OUTLINE_NOT_PRESSED)); ImGui::Unindent(); } @@ -569,72 +615,124 @@ void InputViewerSettingsWindow::DrawElement() { if (ImGui::CollapsingHeader("Analog Stick")) { // gInputViewer.AnalogStick.VisibilityMode - CVarCombobox("Analog Stick Visibility", CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) - .Tooltip("Determines the conditions under which the moving layer of the analog stick texture is visible.")); + CVarCombobox( + "Analog Stick Visibility", CVAR_INPUT_VIEWER("AnalogStick.VisibilityMode"), stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip( + "Determines the conditions under which the moving layer of the analog stick texture is visible.")); // gInputViewer.AnalogStick.OutlineMode - CVarCombobox("Analog Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), stickModeOptions, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) - .Tooltip("Determines the conditions under which the analog stick outline/background texture is visible.")); + CVarCombobox( + "Analog Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("AnalogStick.OutlineMode"), + stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip( + "Determines the conditions under which the analog stick outline/background texture is visible.")); // gInputViewer.AnalogStick.Movement - CVarSliderInt("Analog Stick Movement: %dpx", CVAR_INPUT_VIEWER("AnalogStick.Movement"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(200).DefaultValue(12).ShowButtons(true) - .Tooltip("Sets the distance to move the analog stick in the input viewer. Useful for custom input viewers.")); + CVarSliderInt("Analog Stick Movement: %dpx", CVAR_INPUT_VIEWER("AnalogStick.Movement"), + IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(200) + .DefaultValue(12) + .ShowButtons(true) + .Tooltip("Sets the distance to move the analog stick in the input viewer. Useful for custom " + "input viewers.")); UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { // gInputViewer.RightStick.VisibilityMode - CVarCombobox("Right Stick Visibility", CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) - .Tooltip("Determines the conditions under which the moving layer of the right stick texture is visible.")); + CVarCombobox( + "Right Stick Visibility", CVAR_INPUT_VIEWER("RightStick.VisibilityMode"), stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip( + "Determines the conditions under which the moving layer of the right stick texture is visible.")); // gInputViewer.RightStick.OutlineMode - CVarCombobox("Right Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, - ComboboxOptions().Color(THEME_COLOR).DefaultIndex(STICK_MODE_ALWAYS_SHOWN) - .Tooltip("Determines the conditions under which the right stick outline/background texture is visible.")); + CVarCombobox( + "Right Stick Outline/Background Visibility", CVAR_INPUT_VIEWER("RightStick.OutlineMode"), stickModeOptions, + ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(STICK_MODE_ALWAYS_SHOWN) + .Tooltip( + "Determines the conditions under which the right stick outline/background texture is visible.")); // gInputViewer.RightStick.Movement - CVarSliderInt("Right Stick Movement: %dpx", CVAR_INPUT_VIEWER("RightStick.Movement"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(200).DefaultValue(7).ShowButtons(true) - .Tooltip("Sets the distance to move the right stick in the input viewer. Useful for custom input viewers.")); + CVarSliderInt( + "Right Stick Movement: %dpx", CVAR_INPUT_VIEWER("RightStick.Movement"), + IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(200) + .DefaultValue(7) + .ShowButtons(true) + .Tooltip( + "Sets the distance to move the right stick in the input viewer. Useful for custom input viewers.")); UIWidgets::PaddedSeparator(true, true); } if (ImGui::CollapsingHeader("Analog Angle Values")) { // gAnalogAngles - CVarCheckbox("Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Displays analog stick angle values in the input viewer")); + CVarCheckbox( + "Show Analog Stick Angle Values", CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), + CheckboxOptions().Color(THEME_COLOR).Tooltip("Displays analog stick angle values in the input viewer")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Enabled"), 0)) { // gInputViewer.AnalogAngles.TextColor - CVarColorPicker("Text Color", CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), textColorDefault, - true, ColorPickerRandomButton | ColorPickerResetButton); + CVarColorPicker("Text Color", CVAR_INPUT_VIEWER("AnalogAngles.TextColor"), textColorDefault, true, + ColorPickerRandomButton | ColorPickerResetButton); // gAnalogAngleScale - CVarSliderFloat("Angle Text Scale: %.2f%%", CVAR_INPUT_VIEWER("AnalogAngles.Scale"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.1f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Angle Text Scale: %.2f%%", CVAR_INPUT_VIEWER("AnalogAngles.Scale"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); // gInputViewer.AnalogAngles.Offset - CVarSliderInt("Angle Text Offset: %dpx", CVAR_INPUT_VIEWER("AnalogAngles.Offset"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(400).DefaultValue(0).ShowButtons(true) - .Tooltip("Sets the distance to move the right stick in the input viewer. Useful for custom input viewers.")); + CVarSliderInt("Angle Text Offset: %dpx", CVAR_INPUT_VIEWER("AnalogAngles.Offset"), + IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(400) + .DefaultValue(0) + .ShowButtons(true) + .Tooltip("Sets the distance to move the right stick in the input viewer. Useful for " + "custom input viewers.")); UIWidgets::PaddedSeparator(true, true); // gInputViewer.AnalogAngles.Range1.Enabled - CVarCheckbox("Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Highlights the angle value text when the analog stick is in ESS position (on flat ground)")); + CVarCheckbox( + "Highlight ESS Position", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip( + "Highlights the angle value text when the analog stick is in ESS position (on flat ground)")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range1.Enabled"), 0)) { // gInputViewer.AnalogAngles.Range1.Color - CVarColorPicker("ESS Color", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), range1ColorDefault, - true, ColorPickerRandomButton | ColorPickerResetButton); + CVarColorPicker("ESS Color", CVAR_INPUT_VIEWER("AnalogAngles.Range1.Color"), range1ColorDefault, true, + ColorPickerRandomButton | ColorPickerResetButton); } UIWidgets::PaddedSeparator(true, true); // gInputViewer.AnalogAngles.Range2.Enabled - CVarCheckbox("Highlight Walking Speed Angles", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Highlights the angle value text when the analog stick is at an angle that would " - "produce a walking speed (on flat ground)\n\n" - "Useful for 1.0 Empty Jumpslash Quick Put Away")); + CVarCheckbox("Highlight Walking Speed Angles", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Highlights the angle value text when the analog stick is at an angle that would " + "produce a walking speed (on flat ground)\n\n" + "Useful for 1.0 Empty Jumpslash Quick Put Away")); if (CVarGetInteger(CVAR_INPUT_VIEWER("AnalogAngles.Range2.Enabled"), 0)) { // gInputViewer.AnalogAngles.Range2.Color - CVarColorPicker("Walking Speed Color", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), range2ColorDefault, - true, ColorPickerRandomButton | ColorPickerResetButton); + CVarColorPicker("Walking Speed Color", CVAR_INPUT_VIEWER("AnalogAngles.Range2.Color"), + range2ColorDefault, true, ColorPickerRandomButton | ColorPickerResetButton); } } } diff --git a/soh/soh/Enhancements/controls/InputViewer.h b/soh/soh/Enhancements/controls/InputViewer.h index a4b1cc44f..c370a4225 100644 --- a/soh/soh/Enhancements/controls/InputViewer.h +++ b/soh/soh/Enhancements/controls/InputViewer.h @@ -18,28 +18,28 @@ typedef enum { } StickMode; class InputViewer : public Ship::GuiWindow { -public: + public: using GuiWindow::GuiWindow; void Draw() override; - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; InputViewer(); ~InputViewer(); - - private: - void RenderButton(std::string btn, std::string btnOutline, int state, ImVec2 size, int outlineMode); + + private: + void RenderButton(std::string btn, std::string btnOutline, int state, ImVec2 size, int outlineMode); }; class InputViewerSettingsWindow : public Ship::GuiWindow { -public: + public: using GuiWindow::GuiWindow; - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; InputViewerSettingsWindow(); ~InputViewerSettingsWindow(); diff --git a/soh/soh/Enhancements/controls/Mouse.cpp b/soh/soh/Enhancements/controls/Mouse.cpp index ae3842a1a..4282c3718 100644 --- a/soh/soh/Enhancements/controls/Mouse.cpp +++ b/soh/soh/Enhancements/controls/Mouse.cpp @@ -42,10 +42,12 @@ void Mouse_HandleThirdPerson(f32* newCamX, f32* newCamY) { void Mouse_HandleFirstPerson(Player* player) { f32 xAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.X"), 1.0f); f32 yAxisMulti = CVarGetFloat(CVAR_SETTING("FirstPersonCameraSensitivity.Y"), 1.0f); - s8 invertXAxisMulti = ((CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) - && !CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) - || (!CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) - && CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0))) ? -1 : 1; + s8 invertXAxisMulti = ((CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) && + !CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0)) || + (!CVarGetInteger(CVAR_SETTING("Controls.InvertAimingXAxis"), 0) && + CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0))) + ? -1 + : 1; s8 invertYAxisMulti = CVarGetInteger(CVAR_SETTING("Controls.InvertAimingYAxis"), 1) ? 1 : -1; if (MOUSE_ENABLED) { player->actor.focus.rot.y -= mouseCoordRel.x * 6.0f * xAxisMulti * invertXAxisMulti; @@ -57,7 +59,7 @@ void Mouse_RecenterCursor() { u32 width = GetWindow()->GetWidth(); u32 height = GetWindow()->GetHeight(); if (MOUSE_ENABLED) { - GetWindow()->SetMousePos({(s32) (width/2), (s32) (height/2)}); + GetWindow()->SetMousePos({ (s32)(width / 2), (s32)(height / 2) }); } } @@ -67,7 +69,8 @@ void Mouse_HandleShield(f32* sp50, f32* sp54) { s32 height = GetWindow()->GetHeight(); f32 xBound = 7200 / ((f32)width / 2); f32 yBound = 6000 / ((f32)height / 2); - *sp50 += (mouseCoord.x - (width / 2)) * xBound * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? 1 : -1); + *sp50 += + (mouseCoord.x - (width / 2)) * xBound * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? 1 : -1); *sp54 += (mouseCoord.y - (height / 2)) * yBound; *sp50 = CLAMP(*sp50, -7200, 7200); *sp54 = CLAMP(*sp54, -6000, 6000); @@ -142,7 +145,7 @@ void Mouse_RegisterUpdateQuickspinCount() { } void Mouse_RegisterHandleQuickspin() { - REGISTER_VB_SHOULD(VB_SHOULD_QUICKSPIN, { Mouse_HandleQuickspin(should, va_arg(args, s8*), va_arg(args, s8*)); } ); + REGISTER_VB_SHOULD(VB_SHOULD_QUICKSPIN, { Mouse_HandleQuickspin(should, va_arg(args, s8*), va_arg(args, s8*)); }); } static RegisterShipInitFunc initFunc_shieldRecenter(Mouse_RegisterRecenterCursorOnShield, { CVAR_ENABLE_MOUSE_NAME }); @@ -150,4 +153,4 @@ static RegisterShipInitFunc initFunc_firstPerson(Mouse_RegisterHandleFirstPerson static RegisterShipInitFunc initFunc_quickspinCount(Mouse_RegisterUpdateQuickspinCount, { CVAR_ENABLE_MOUSE_NAME }); static RegisterShipInitFunc initFunc_quickspin(Mouse_RegisterHandleQuickspin, { CVAR_ENABLE_MOUSE_NAME }); static RegisterShipInitFunc initFunc_shieldMove(Mouse_RegisterHandleShield, { CVAR_ENABLE_MOUSE_NAME }); -} //extern "C" +} // extern "C" diff --git a/soh/soh/Enhancements/controls/Mouse.h b/soh/soh/Enhancements/controls/Mouse.h index 38d84e078..2ab954e47 100644 --- a/soh/soh/Enhancements/controls/Mouse.h +++ b/soh/soh/Enhancements/controls/Mouse.h @@ -18,8 +18,8 @@ void Mouse_HandleShield(f32* sp50, f32* sp54); bool Mouse_HandleQuickspin(bool* should, s8* iter2, s8* sp3C); void Mouse_UpdateQuickspinCount(); #ifdef __cplusplus -}; //extern "C" +}; // extern "C" #endif -//MOUSE_H +// MOUSE_H #endif diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index dcef762cf..3f77d1ed4 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -26,29 +26,25 @@ void SohInputEditorWindow::InitElement() { mButtonsBitmasks = { BTN_A, BTN_B, BTN_START, BTN_L, BTN_R, BTN_Z, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT }; mDpadBitmasks = { BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; mModifierButtonsBitmasks = { BTN_CUSTOM_MODIFIER1, BTN_CUSTOM_MODIFIER2 }; - mCustomOcarinaButtonsBitmasks = { - BTN_CUSTOM_OCARINA_NOTE_D4, - BTN_CUSTOM_OCARINA_NOTE_F4, - BTN_CUSTOM_OCARINA_NOTE_A4, - BTN_CUSTOM_OCARINA_NOTE_B4, - BTN_CUSTOM_OCARINA_NOTE_D5 - }; + mCustomOcarinaButtonsBitmasks = { BTN_CUSTOM_OCARINA_NOTE_D4, BTN_CUSTOM_OCARINA_NOTE_F4, + BTN_CUSTOM_OCARINA_NOTE_A4, BTN_CUSTOM_OCARINA_NOTE_B4, + BTN_CUSTOM_OCARINA_NOTE_D5 }; - addButtonName(BTN_A, "A"); - addButtonName(BTN_B, "B"); - addButtonName(BTN_CUP, "C Up"); - addButtonName(BTN_CDOWN, "C Down"); - addButtonName(BTN_CLEFT, "C Left"); - addButtonName(BTN_CRIGHT, "C Right"); - addButtonName(BTN_L, "L"); - addButtonName(BTN_Z, "Z"); - addButtonName(BTN_R, "R"); - addButtonName(BTN_START, "Start"); - addButtonName(BTN_DUP, "D-pad up"); - addButtonName(BTN_DDOWN, "D-pad down"); - addButtonName(BTN_DLEFT, "D-pad left"); - addButtonName(BTN_DRIGHT, "D-pad right"); - addButtonName(0, "None"); + addButtonName(BTN_A, "A"); + addButtonName(BTN_B, "B"); + addButtonName(BTN_CUP, "C Up"); + addButtonName(BTN_CDOWN, "C Down"); + addButtonName(BTN_CLEFT, "C Left"); + addButtonName(BTN_CRIGHT, "C Right"); + addButtonName(BTN_L, "L"); + addButtonName(BTN_Z, "Z"); + addButtonName(BTN_R, "R"); + addButtonName(BTN_START, "Start"); + addButtonName(BTN_DUP, "D-pad up"); + addButtonName(BTN_DDOWN, "D-pad down"); + addButtonName(BTN_DLEFT, "D-pad left"); + addButtonName(BTN_DRIGHT, "D-pad right"); + addButtonName(0, "None"); } #define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929 @@ -191,7 +187,7 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #define BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED ImVec4(0.431f, 0.369f, 0.706f, 1.0f) void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, - ImVec4& buttonHoveredColor) { + ImVec4& buttonHoveredColor) { switch (lusIndex) { case Ship::PhysicalDeviceType::Keyboard: buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE; @@ -669,8 +665,8 @@ void SohInputEditorWindow::DrawStickSection(uint8_t port, uint8_t stick, int32_t } ImGui::SameLine(0.0f, 0.0f); ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); - if (ImGui::SliderInt(StringHelper::Sprintf("##Sensitivity%d", id).c_str(), &sensitivityPercentage, 0, 200, "%d%%", - ImGuiSliderFlags_AlwaysClamp)) { + if (ImGui::SliderInt(StringHelper::Sprintf("##Sensitivity%d", id).c_str(), &sensitivityPercentage, 0, 200, + "%d%%", ImGuiSliderFlags_AlwaysClamp)) { controllerStick->SetSensitivity(sensitivityPercentage); } ImGui::SameLine(0.0f, 0.0f); @@ -1070,12 +1066,16 @@ void SohInputEditorWindow::DrawLEDSection(uint8_t port) { "Original Tunic Colors", "Cosmetics Tunic Colors", "Health Colors", "Original Navi Targeting Colors", "Cosmetics Navi Targeting Colors", "Custom" }; - CVarCombobox("Source", CVAR_SETTING("LEDColorSource"), ledSources, UIWidgets::ComboboxOptions().Color(THEME_COLOR).DefaultIndex(LED_SOURCE_TUNIC_ORIGINAL) - .Tooltip("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " - "health < 40%. Green otherwise.\n\n" - "Tunics: colors will mirror currently equipped tunic, whether original or the current " - "values in Cosmetics Editor.\n\n" - "Custom: single, solid color")); + CVarCombobox( + "Source", CVAR_SETTING("LEDColorSource"), ledSources, + UIWidgets::ComboboxOptions() + .Color(THEME_COLOR) + .DefaultIndex(LED_SOURCE_TUNIC_ORIGINAL) + .Tooltip("Health\n- Red when health critical (13-20% depending on max health)\n- Yellow when " + "health < 40%. Green otherwise.\n\n" + "Tunics: colors will mirror currently equipped tunic, whether original or the current " + "values in Cosmetics Editor.\n\n" + "Custom: single, solid color")); if (CVarGetInteger(CVAR_SETTING("LEDColorSource"), 1) == LED_SOURCE_CUSTOM) { UIWidgets::Spacer(3); auto port1Color = CVarGetColor24(CVAR_SETTING("LEDPort1Color"), { 255, 255, 255 }); @@ -1094,12 +1094,21 @@ void SohInputEditorWindow::DrawLEDSection(uint8_t port) { ImGui::Text("Custom Color"); } CVarSliderFloat("Brightness: %.1f %%", CVAR_SETTING("LEDBrightness"), - FloatSliderOptions().IsPercentage().Min(0.0f).Max(1.0f).DefaultValue(1.0f).ShowButtons(true) - .Tooltip("Sets the brightness of controller LEDs. 0% brightness = LEDs off.")); - CVarCheckbox("Critical Health Override", CVAR_SETTING("LEDCriticalOverride"), - CheckboxOptions({{ .disabled = CVarGetInteger(CVAR_SETTING("LEDColorSource"), LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, - .disabledTooltip = "Override redundant for health source."}}).DefaultValue(true) - .Tooltip("Shows red color when health is critical, otherwise displays according to color source.")); + FloatSliderOptions() + .IsPercentage() + .Min(0.0f) + .Max(1.0f) + .DefaultValue(1.0f) + .ShowButtons(true) + .Tooltip("Sets the brightness of controller LEDs. 0% brightness = LEDs off.")); + CVarCheckbox( + "Critical Health Override", CVAR_SETTING("LEDCriticalOverride"), + CheckboxOptions({ { .disabled = CVarGetInteger(CVAR_SETTING("LEDColorSource"), + LED_SOURCE_TUNIC_ORIGINAL) == LED_SOURCE_HEALTH, + .disabledTooltip = "Override redundant for health source." } }) + .DefaultValue(true) + .Tooltip( + "Shows red color when health is critical, otherwise displays according to color source.")); } ImGui::TreePop(); } @@ -1234,38 +1243,35 @@ void SohInputEditorWindow::DrawGyroSection(uint8_t port) { } } -const ImGuiTableFlags PANEL_TABLE_FLAGS = - ImGuiTableFlags_BordersH | - ImGuiTableFlags_BordersV; +const ImGuiTableFlags PANEL_TABLE_FLAGS = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; const ImGuiTableColumnFlags PANEL_TABLE_COLUMN_FLAGS = - ImGuiTableColumnFlags_IndentEnable | - ImGuiTableColumnFlags_NoSort; + ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; namespace TableHelper { - void InitHeader(bool has_header = true) { - if (has_header) { - ImGui::TableHeadersRow(); - } - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); //This is to adjust Vertical pos of item in a cell to be normlized. - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - } - - void NextCol() { - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - } - - void NextLine() { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); +void InitHeader(bool has_header = true) { + if (has_header) { + ImGui::TableHeadersRow(); } + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); // This is to adjust Vertical pos of item in a cell to be normlized. + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); } +void NextCol() { + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); +} + +void NextLine() { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); +} +} // namespace TableHelper + void SohInputEditorWindow::addButtonName(N64ButtonMask mask, const char* name) { buttons.push_back(std::make_pair(mask, name)); buttonNames[mask] = std::prev(buttons.end()); @@ -1292,7 +1298,7 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt ImGui::SetCursorPosY(cursorPos.y); ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); - if (ImGui::BeginCombo(StringHelper::Sprintf("##%s", mapping.cVarName).c_str(), preview)) { + if (ImGui::BeginCombo(StringHelper::Sprintf("##%s", mapping.cVarName).c_str(), preview)) { for (auto i = buttons.begin(); i != buttons.end(); i++) { if ((i->first & excludedButtons) != 0) { continue; @@ -1309,7 +1315,7 @@ void SohInputEditorWindow::DrawMapping(CustomButtonMap& mapping, float labelWidt void SohInputEditorWindow::DrawOcarinaControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x, cursor.y + 5)); - + CheckboxOptions checkOpt = CheckboxOptions().Color(THEME_COLOR); CVarCheckbox("Dpad Ocarina Playback", CVAR_SETTING("CustomOcarina.Dpad"), checkOpt); CVarCheckbox("Right Stick Ocarina Playback", CVAR_SETTING("CustomOcarina.RightStick"), checkOpt); @@ -1344,29 +1350,47 @@ void SohInputEditorWindow::DrawOcarinaControlPanel() { void SohInputEditorWindow::DrawCameraControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); - CVarCheckbox("Enable Mouse Controls", CVAR_SETTING("EnableMouse"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Allows for using the mouse to control the camera (must enable Free Look), " - "aim with the shield, and perform quickspin attacks (quickly rotate the mouse then press B)")); + CVarCheckbox( + "Enable Mouse Controls", CVAR_SETTING("EnableMouse"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Allows for using the mouse to control the camera (must enable Free Look), " + "aim with the shield, and perform quickspin attacks (quickly rotate the mouse then press B)")); Ship::GuiWindow::BeginGroupPanel("Aiming/First-Person Camera", ImGui::GetContentRegionAvail()); - CVarCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Right Stick Aiming", CVAR_SETTING("Controls.RightStickAim"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Allows for aiming with the right stick in:\n-First-Person/C-Up view\n-Weapon Aiming")); if (CVarGetInteger(CVAR_SETTING("Controls.RightStickAim"), 0)) { - CVarCheckbox("Allow moving while in first person mode", CVAR_SETTING("MoveInFirstPerson"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Changes the left stick to move the player while in first person mode")); + CVarCheckbox("Allow moving while in first person mode", CVAR_SETTING("MoveInFirstPerson"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Changes the left stick to move the player while in first person mode")); } - CVarCheckbox("Invert Aiming X Axis", CVAR_SETTING("Controls.InvertAimingXAxis"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); - CVarCheckbox("Invert Aiming Y Axis", CVAR_SETTING("Controls.InvertAimingYAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) - .Tooltip("Inverts the Camera Y Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); - CVarCheckbox("Invert Shield Aiming X Axis", CVAR_SETTING("Controls.InvertShieldAimingXAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) - .Tooltip("Inverts the Shield Aiming X Axis")); - CVarCheckbox("Invert Shield Aiming Y Axis", CVAR_SETTING("Controls.InvertShieldAimingYAxis"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Inverts the Shield Aiming Y Axis")); - CVarCheckbox("Invert Z-Weapon Aiming Y Axis", CVAR_SETTING("Controls.InvertZAimingYAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) - .Tooltip("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming")); - CVarCheckbox("Disable Auto-Centering in First-Person View", CVAR_SETTING("DisableFirstPersonAutoCenterView"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming")); - if (CVarCheckbox("Enable Custom Aiming/First-Person sensitivity", CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), CheckboxOptions().Color(THEME_COLOR))) { + CVarCheckbox("Invert Aiming X Axis", CVAR_SETTING("Controls.InvertAimingXAxis"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Inverts the Camera X Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Invert Aiming Y Axis", CVAR_SETTING("Controls.InvertAimingYAxis"), + CheckboxOptions() + .Color(THEME_COLOR) + .DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-First-Person/C-Up view\n-Weapon Aiming")); + CVarCheckbox("Invert Shield Aiming X Axis", CVAR_SETTING("Controls.InvertShieldAimingXAxis"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true).Tooltip("Inverts the Shield Aiming X Axis")); + CVarCheckbox("Invert Shield Aiming Y Axis", CVAR_SETTING("Controls.InvertShieldAimingYAxis"), + CheckboxOptions().Color(THEME_COLOR).Tooltip("Inverts the Shield Aiming Y Axis")); + CVarCheckbox("Invert Z-Weapon Aiming Y Axis", CVAR_SETTING("Controls.InvertZAimingYAxis"), + CheckboxOptions() + .Color(THEME_COLOR) + .DefaultValue(true) + .Tooltip("Inverts the Camera Y Axis in:\n-Z-Weapon Aiming")); + CVarCheckbox("Disable Auto-Centering in First-Person View", CVAR_SETTING("DisableFirstPersonAutoCenterView"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming")); + if (CVarCheckbox("Enable Custom Aiming/First-Person sensitivity", + CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), CheckboxOptions().Color(THEME_COLOR))) { if (!CVarGetInteger(CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), 0)) { CVarClear(CVAR_SETTING("FirstPersonCameraSensitivity.X")); CVarClear(CVAR_SETTING("FirstPersonCameraSensitivity.Y")); @@ -1374,10 +1398,24 @@ void SohInputEditorWindow::DrawCameraControlPanel() { } } if (CVarGetInteger(CVAR_SETTING("FirstPersonCameraSensitivity.Enabled"), 0)) { - CVarSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", CVAR_SETTING("FirstPersonCameraSensitivity.X"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); - CVarSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", CVAR_SETTING("FirstPersonCameraSensitivity.Y"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Aiming/First-Person Horizontal Sensitivity: %.0f %%", + CVAR_SETTING("FirstPersonCameraSensitivity.X"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Aiming/First-Person Vertical Sensitivity: %.0f %%", + CVAR_SETTING("FirstPersonCameraSensitivity.Y"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); } Ship::GuiWindow::EndGroupPanel(0); @@ -1385,19 +1423,37 @@ void SohInputEditorWindow::DrawCameraControlPanel() { ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("Third-Person Camera", ImGui::GetContentRegionAvail()); - CVarCheckbox("Free Look", CVAR_SETTING("FreeLook.Enabled"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Enables free look camera control\nNote: You must remap C buttons off of the right stick in the " - "controller config menu, and map the camera stick to the right stick.")); - CVarCheckbox("Invert Camera X Axis", CVAR_SETTING("FreeLook.InvertXAxis"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Inverts the Camera X Axis in:\n-Free look")); - CVarCheckbox("Invert Camera Y Axis", CVAR_SETTING("FreeLook.InvertYAxis"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) - .Tooltip("Inverts the Camera Y Axis in:\n-Free look")); - CVarSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.X"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); - CVarSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.Y"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.01f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); - CVarSliderInt("Camera Distance: %d", CVAR_SETTING("FreeLook.MaxCameraDistance"), IntSliderOptions().Color(THEME_COLOR).Min(100).Max(900).DefaultValue(185).ShowButtons(true)); - CVarSliderInt("Camera Transition Speed: %d", CVAR_SETTING("FreeLook.TransitionSpeed"), IntSliderOptions().Color(THEME_COLOR).Min(0).Max(900).DefaultValue(25).ShowButtons(true)); + CVarCheckbox( + "Free Look", CVAR_SETTING("FreeLook.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Enables free look camera control\nNote: You must remap C buttons off of the right stick in the " + "controller config menu, and map the camera stick to the right stick.")); + CVarCheckbox("Invert Camera X Axis", CVAR_SETTING("FreeLook.InvertXAxis"), + CheckboxOptions().Color(THEME_COLOR).Tooltip("Inverts the Camera X Axis in:\n-Free look")); + CVarCheckbox( + "Invert Camera Y Axis", CVAR_SETTING("FreeLook.InvertYAxis"), + CheckboxOptions().Color(THEME_COLOR).DefaultValue(true).Tooltip("Inverts the Camera Y Axis in:\n-Free look")); + CVarSliderFloat("Third-Person Horizontal Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.X"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Third-Person Vertical Sensitivity: %.0f %%", CVAR_SETTING("FreeLook.CameraSensitivity.Y"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.01f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderInt("Camera Distance: %d", CVAR_SETTING("FreeLook.MaxCameraDistance"), + IntSliderOptions().Color(THEME_COLOR).Min(100).Max(900).DefaultValue(185).ShowButtons(true)); + CVarSliderInt("Camera Transition Speed: %d", CVAR_SETTING("FreeLook.TransitionSpeed"), + IntSliderOptions().Color(THEME_COLOR).Min(0).Max(900).DefaultValue(25).ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); } @@ -1405,17 +1461,26 @@ void SohInputEditorWindow::DrawDpadControlPanel() { ImVec2 cursor = ImGui::GetCursorPos(); ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5)); Ship::GuiWindow::BeginGroupPanel("D-Pad Options", ImGui::GetContentRegionAvail()); - CVarCheckbox("D-pad Support on Pause Screen", CVAR_SETTING("DPadOnPause"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Navigate Pause with the D-pad\nIf used with \"D-pad as Equip Items\", you must hold C-Up to equip instead of navigate")); - CVarCheckbox("D-pad Support in Text Boxes", CVAR_SETTING("DpadInText"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Navigate choices in text boxes, shop item selection, and the file select / name entry screens with the D-pad")); + CVarCheckbox("D-pad Support on Pause Screen", CVAR_SETTING("DPadOnPause"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Navigate Pause with the D-pad\nIf used with \"D-pad as Equip Items\", you must hold " + "C-Up to equip instead of navigate")); + CVarCheckbox("D-pad Support in Text Boxes", CVAR_SETTING("DpadInText"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Navigate choices in text boxes, shop item selection, and the file select / name entry " + "screens with the D-pad")); if (!CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CVarGetInteger(CVAR_SETTING("DpadInText"), 0)) { ImGui::BeginDisabled(); } - CVarCheckbox("D-pad hold change", CVAR_SETTING("DpadHoldChange"), CheckboxOptions().Color(THEME_COLOR).DefaultValue(true) - .Tooltip("The cursor will only move a single space no matter how long a D-pad direction is held")); + CVarCheckbox("D-pad hold change", CVAR_SETTING("DpadHoldChange"), + CheckboxOptions() + .Color(THEME_COLOR) + .DefaultValue(true) + .Tooltip("The cursor will only move a single space no matter how long a D-pad direction is held")); if (!CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CVarGetInteger(CVAR_SETTING("DpadInText"), 0)) { ImGui::EndDisabled(); @@ -1457,7 +1522,7 @@ void SohInputEditorWindow::DrawDeviceToggles(uint8_t portIndex) { ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); auto notIgnored = !connectedDeviceManager->PortIsIgnoringInstanceId(portIndex, instanceId); ImGui::PopItemFlag(); - if(ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) { + if (ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) { if (notIgnored) { connectedDeviceManager->UnignoreInstanceIdForPort(portIndex, instanceId); } else { @@ -1536,24 +1601,52 @@ void SohInputEditorWindow::DrawLinkTab() { DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2); ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - CVarCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"), CheckboxOptions().Color(THEME_COLOR) - .Tooltip("Hold the assigned button to change the maximum walking or swimming speed")); + CVarCheckbox("Enable speed modifiers", CVAR_SETTING("WalkModifier.Enabled"), + CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Hold the assigned button to change the maximum walking or swimming speed")); if (CVarGetInteger(CVAR_SETTING("WalkModifier.Enabled"), 0)) { UIWidgets::Spacer(5); Ship::GuiWindow::BeginGroupPanel("Speed Modifier", ImGui::GetContentRegionAvail()); - CVarCheckbox("Toggle modifier instead of holding", CVAR_SETTING("WalkModifier.SpeedToggle"), CheckboxOptions().Color(THEME_COLOR)); + CVarCheckbox("Toggle modifier instead of holding", CVAR_SETTING("WalkModifier.SpeedToggle"), + CheckboxOptions().Color(THEME_COLOR)); Ship::GuiWindow::BeginGroupPanel("Walk Modifier", ImGui::GetContentRegionAvail()); - CVarCheckbox("Don't affect jump distance/velocity", CVAR_SETTING("WalkModifier.DoesntChangeJump"), CheckboxOptions().Color(THEME_COLOR)); - CVarSliderFloat("Walk Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.Mapping1"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); - CVarSliderFloat("Walk Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.Mapping2"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarCheckbox("Don't affect jump distance/velocity", CVAR_SETTING("WalkModifier.DoesntChangeJump"), + CheckboxOptions().Color(THEME_COLOR)); + CVarSliderFloat("Walk Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.Mapping1"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Walk Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.Mapping2"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); Ship::GuiWindow::BeginGroupPanel("Swim Modifier", ImGui::GetContentRegionAvail()); - CVarSliderFloat("Swim Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping1"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); - CVarSliderFloat("Swim Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping2"), - FloatSliderOptions().Color(THEME_COLOR).IsPercentage().Min(0.0f).Max(5.0f).DefaultValue(1.0f).ShowButtons(true)); + CVarSliderFloat("Swim Modifier 1: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping1"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); + CVarSliderFloat("Swim Modifier 2: %.0f %%", CVAR_SETTING("WalkModifier.SwimMapping2"), + FloatSliderOptions() + .Color(THEME_COLOR) + .IsPercentage() + .Min(0.0f) + .Max(5.0f) + .DefaultValue(1.0f) + .ShowButtons(true)); Ship::GuiWindow::EndGroupPanel(0); Ship::GuiWindow::EndGroupPanel(0); } @@ -1755,7 +1848,8 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { } PopStyleButton(); 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); + ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", + portIndex + 1); PushStyleButton(THEME_COLOR); if (ImGui::Button("Cancel")) { shouldClose = true; diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.h b/soh/soh/Enhancements/controls/SohInputEditorWindow.h index 4545f771d..76d33975e 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.h +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.h @@ -41,7 +41,8 @@ class SohInputEditorWindow : public Ship::GuiWindow { void DrawButtonLineEditMappingButton(uint8_t port, N64ButtonMask bitmask, std::string id); void DrawButtonLineAddMappingButton(uint8_t port, N64ButtonMask bitmask); - void DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction, std::string id); + void DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction, + std::string id); void DrawStickDirectionLineAddMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction); void DrawStickSection(uint8_t port, uint8_t stick, int32_t id, ImVec4 color); @@ -84,7 +85,7 @@ class SohInputEditorWindow : public Ship::GuiWindow { void UpdateStickDirectionToMappingIds(uint8_t port); void GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, - ImVec4& buttonHoveredColor); + ImVec4& buttonHoveredColor); void DrawLinkTab(); void DrawIvanTab(); void DrawDebugPortTab(uint8_t portIndex, std::string customName = ""); diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index f4a41f587..e0f530bc2 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -51,7 +51,8 @@ extern "C" { 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); +void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, + int sourceIndex); void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); } @@ -68,27 +69,27 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); static const ALIGN_ASSET(2) char gEndGrayscaleAndEndDlistDL[] = dgEndGrayscaleAndEndDlistDL; std::map groupLabels = { - { COSMETICS_GROUP_LINK, "Link" }, + { COSMETICS_GROUP_LINK, "Link" }, { COSMETICS_GROUP_MIRRORSHIELD, "Mirror Shield" }, - { 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" }, - { COSMETICS_GROUP_TITLE, "Title Screen" }, - { COSMETICS_GROUP_NPC, "NPCs" }, - { COSMETICS_GROUP_WORLD, "World" }, - { COSMETICS_GROUP_MAGIC, "Magic Effects" }, - { COSMETICS_GROUP_ARROWS, "Arrow Effects" }, - { COSMETICS_GROUP_SPIN_ATTACK, "Spin Attack" }, - { COSMETICS_GROUP_TRAILS, "Trails" }, - { COSMETICS_GROUP_NAVI, "Navi" }, - { COSMETICS_GROUP_IVAN, "Ivan" }, - { COSMETICS_GROUP_MESSAGE, "Message" }, + { 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" }, + { COSMETICS_GROUP_TITLE, "Title Screen" }, + { COSMETICS_GROUP_NPC, "NPCs" }, + { COSMETICS_GROUP_WORLD, "World" }, + { COSMETICS_GROUP_MAGIC, "Magic Effects" }, + { COSMETICS_GROUP_ARROWS, "Arrow Effects" }, + { COSMETICS_GROUP_SPIN_ATTACK, "Spin Attack" }, + { COSMETICS_GROUP_TRAILS, "Trails" }, + { COSMETICS_GROUP_NAVI, "Navi" }, + { COSMETICS_GROUP_IVAN, "Ivan" }, + { COSMETICS_GROUP_MESSAGE, "Message" }, }; typedef struct { @@ -111,13 +112,16 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { return color; } -#define COSMETIC_OPTION(id, label, group, defaultColor, supportsAlpha, supportsRainbow, advancedOption) \ - { id, { \ - CVAR_COSMETIC(id), CVAR_COSMETIC(id ".Value"), CVAR_COSMETIC(id ".Rainbow"), CVAR_COSMETIC(id ".Locked"), \ - CVAR_COSMETIC(id ".Changed"), label, group, \ - ImVec4(defaultColor.r / 255.0f, defaultColor.g / 255.0f, defaultColor.b / 255.0f, defaultColor.a / 255.0f), defaultColor, \ - supportsAlpha, supportsRainbow, advancedOption \ - } } +#define COSMETIC_OPTION(id, label, group, defaultColor, supportsAlpha, supportsRainbow, advancedOption) \ + { \ + id, { \ + CVAR_COSMETIC(id), CVAR_COSMETIC(id ".Value"), CVAR_COSMETIC(id ".Rainbow"), CVAR_COSMETIC(id ".Locked"), \ + CVAR_COSMETIC(id ".Changed"), label, group, \ + ImVec4(defaultColor.r / 255.0f, defaultColor.g / 255.0f, defaultColor.b / 255.0f, \ + defaultColor.a / 255.0f), \ + defaultColor, supportsAlpha, supportsRainbow, advancedOption \ + } \ + } // clang-format off /* @@ -442,43 +446,24 @@ static std::map cosmeticOptions = { }; // clang-format on -static const char* MarginCvarList[] { - CVAR_COSMETIC("HUD.Hearts"), - CVAR_COSMETIC("HUD.HeartsCount"), - CVAR_COSMETIC("HUD.MagicBar"), - CVAR_COSMETIC("HUD.VisualSoA"), - CVAR_COSMETIC("HUD.BButton"), - CVAR_COSMETIC("HUD.AButton"), - CVAR_COSMETIC("HUD.StartButton"), - CVAR_COSMETIC("HUD.CUpButton"), - CVAR_COSMETIC("HUD.CDownButton"), - CVAR_COSMETIC("HUD.CLeftButton"), - CVAR_COSMETIC("HUD.CRightButton"), - CVAR_COSMETIC("HUD.Dpad"), - CVAR_COSMETIC("HUD.Minimap"), - CVAR_COSMETIC("HUD.SmallKey"), - CVAR_COSMETIC("HUD.Rupees"), - CVAR_COSMETIC("HUD.Carrots"), - CVAR_COSMETIC("HUD.Timers"), - CVAR_COSMETIC("HUD.ArcheryScore"), - CVAR_COSMETIC("HUD.TitleCard.Map"), - CVAR_COSMETIC("HUD.TitleCard.Boss"), - CVAR_COSMETIC("HUD.IGT"), +static const char* MarginCvarList[]{ + CVAR_COSMETIC("HUD.Hearts"), CVAR_COSMETIC("HUD.HeartsCount"), CVAR_COSMETIC("HUD.MagicBar"), + CVAR_COSMETIC("HUD.VisualSoA"), CVAR_COSMETIC("HUD.BButton"), CVAR_COSMETIC("HUD.AButton"), + CVAR_COSMETIC("HUD.StartButton"), CVAR_COSMETIC("HUD.CUpButton"), CVAR_COSMETIC("HUD.CDownButton"), + CVAR_COSMETIC("HUD.CLeftButton"), CVAR_COSMETIC("HUD.CRightButton"), CVAR_COSMETIC("HUD.Dpad"), + CVAR_COSMETIC("HUD.Minimap"), CVAR_COSMETIC("HUD.SmallKey"), CVAR_COSMETIC("HUD.Rupees"), + CVAR_COSMETIC("HUD.Carrots"), CVAR_COSMETIC("HUD.Timers"), CVAR_COSMETIC("HUD.ArcheryScore"), + CVAR_COSMETIC("HUD.TitleCard.Map"), CVAR_COSMETIC("HUD.TitleCard.Boss"), CVAR_COSMETIC("HUD.IGT"), }; -static const char* MarginCvarNonAnchor[] { - CVAR_COSMETIC("HUD.Carrots"), - CVAR_COSMETIC("HUD.Timers"), - CVAR_COSMETIC("HUD.ArcheryScore"), - CVAR_COSMETIC("HUD.TitleCard.Map"), - CVAR_COSMETIC("HUD.TitleCard.Boss"), +static const char* MarginCvarNonAnchor[]{ + CVAR_COSMETIC("HUD.Carrots"), CVAR_COSMETIC("HUD.Timers"), CVAR_COSMETIC("HUD.ArcheryScore"), + CVAR_COSMETIC("HUD.TitleCard.Map"), CVAR_COSMETIC("HUD.TitleCard.Boss"), }; void SetMarginAll(const char* ButtonName, bool SetActivated, const char* tooltip) { - if (UIWidgets::Button(ButtonName, UIWidgets::ButtonOptions() - .Size(ImVec2(200.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip(tooltip))) { + if (UIWidgets::Button(ButtonName, + UIWidgets::ButtonOptions().Size(ImVec2(200.0f, 0.0f)).Color(THEME_COLOR).Tooltip(tooltip))) { // MarginCvarNonAnchor is an array that list every element that has No anchor by default, because if that the // case this function will not touch it with pose type 0. u8 arrayLengthNonMargin = sizeof(MarginCvarNonAnchor) / sizeof(*MarginCvarNonAnchor); @@ -514,10 +499,10 @@ void SetMarginAll(const char* ButtonName, bool SetActivated, const char* tooltip void ResetPositionAll() { if (UIWidgets::Button("Reset all positions", - UIWidgets::ButtonOptions() - .Size(ImVec2(200.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("Revert every element to use their original position and no margins"))) { + UIWidgets::ButtonOptions() + .Size(ImVec2(200.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("Revert every element to use their original position and no margins"))) { for (auto cvarName : MarginCvarList) { std::string cvarPosType = std::string(cvarName).append(".PosType"); std::string cvarNameMargins = std::string(cvarName).append(".UseMargins"); @@ -529,7 +514,8 @@ void ResetPositionAll() { int hue = 0; -// Runs every frame to update rainbow hue, a potential future optimization is to only run this a once or twice a second and increase the speed of the rainbow hue rotation. +// Runs every frame to update rainbow hue, a potential future optimization is to only run this a once or twice a second +// and increase the speed of the rainbow hue rotation. void CosmeticsUpdateTick() { int index = 0; float rainbowSpeed = CVarGetFloat(CVAR_COSMETIC("RainbowSpeed"), 0.6f); @@ -568,501 +554,725 @@ void CosmeticsUpdateTick() { } /* - This is called every time a color is changed in the UI, and every frame to update colors that have rainbow mode enabled - The columns/arguments for PATCH_GFX are as follows: - 1. Display List: This should be a valid display list pointer, if you have errors listing one here make sure to include the appropriate header file up top - 2. Patch Name: Each of these MUST be unique, used for restoring the original DList command, if these are not unique bugs WILL happen + This is called every time a color is changed in the UI, and every frame to update colors that have rainbow mode + enabled The columns/arguments for PATCH_GFX are as follows: + 1. Display List: This should be a valid display list pointer, if you have errors listing one here make sure to + include the appropriate header file up top + 2. Patch Name: Each of these MUST be unique, used for restoring the original DList command, if these are not unique + bugs WILL happen 3. Changed Cvar: What determines if a patch should be applied or reset. - 4. GFX Command Index: Index of the GFX command you want to replace, the instructions on finding this are in the giant comment block above the cosmeticOptions map + 4. GFX Command Index: Index of the GFX command you want to replace, the instructions on finding this are in the + giant comment block above the cosmeticOptions map 5. GFX Command: The GFX command you want to insert */ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& magicFaroresPrimary = cosmeticOptions.at("Magic.FaroresPrimary"); if (manualChange || CVarGetInteger(magicFaroresPrimary.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(magicFaroresPrimary.valuesCvar, magicFaroresPrimary.defaultColor); - PATCH_GFX(sInnerCylinderDL, "Magic_FaroresPrimary1", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(sOuterCylinderDL, "Magic_FaroresPrimary2", magicFaroresPrimary.changedCvar, 24, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(sInnerCylinderDL, "Magic_FaroresPrimary1", magicFaroresPrimary.changedCvar, 24, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(sOuterCylinderDL, "Magic_FaroresPrimary2", magicFaroresPrimary.changedCvar, 24, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& magicFaroresSecondary = cosmeticOptions.at("Magic.FaroresSecondary"); if (manualChange || CVarGetInteger(magicFaroresSecondary.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(magicFaroresSecondary.valuesCvar, magicFaroresSecondary.defaultColor); - PATCH_GFX(sInnerCylinderDL, "Magic_FaroresSecondary1", magicFaroresSecondary.changedCvar, 25, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(sOuterCylinderDL, "Magic_FaroresSecondary2", magicFaroresSecondary.changedCvar, 25, gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(sInnerCylinderDL, "Magic_FaroresSecondary1", magicFaroresSecondary.changedCvar, 25, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(sOuterCylinderDL, "Magic_FaroresSecondary2", magicFaroresSecondary.changedCvar, 25, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); } static CosmeticOption& linkGoronTunic = cosmeticOptions.at("Link.GoronTunic"); if (manualChange || CVarGetInteger(linkGoronTunic.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(linkGoronTunic.valuesCvar, linkGoronTunic.defaultColor); - PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic1", linkGoronTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic2", linkGoronTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic3", linkGoronTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic4", linkGoronTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic1", linkGoronTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic2", linkGoronTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGoronTunicColorDL, "Link_GoronTunic3", linkGoronTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGoronCollarColorDL, "Link_GoronTunic4", linkGoronTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& linkZoraTunic = cosmeticOptions.at("Link.ZoraTunic"); if (manualChange || CVarGetInteger(linkZoraTunic.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(linkZoraTunic.valuesCvar, linkZoraTunic.defaultColor); - PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic1", linkZoraTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic2", linkZoraTunic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic3", linkZoraTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic4", linkZoraTunic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic1", linkZoraTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic2", linkZoraTunic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiZoraTunicColorDL, "Link_ZoraTunic3", linkZoraTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiZoraCollarColorDL, "Link_ZoraTunic4", linkZoraTunic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& linkHair = cosmeticOptions.at("Link.Hair"); if (manualChange || CVarGetInteger(linkHair.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(linkHair.valuesCvar, linkHair.defaultColor); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair1", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair2", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair3", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair4", linkHair.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair1", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair2", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair3", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair4", linkHair.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair5", linkHair.changedCvar, 46, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair6", linkHair.changedCvar, 54, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair7", linkHair.changedCvar, 136, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair8", linkHair.changedCvar, 162, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair9", linkHair.changedCvar, 101, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair10", linkHair.changedCvar, 118, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair11", linkHair.changedCvar, 125, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair12", linkHair.changedCvar, 159, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair13", linkHair.changedCvar, 102, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair14", linkHair.changedCvar, 122, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair5", linkHair.changedCvar, 46, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair6", linkHair.changedCvar, 54, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair7", linkHair.changedCvar, 136, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Hair8", linkHair.changedCvar, 162, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair9", linkHair.changedCvar, 101, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Hair10", linkHair.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair11", linkHair.changedCvar, 125, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Hair12", linkHair.changedCvar, 159, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair13", linkHair.changedCvar, 102, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Hair14", linkHair.changedCvar, 122, gsSPGrayscale(false)); } } static CosmeticOption& linkLinen = cosmeticOptions.at("Link.Linen"); if (manualChange || CVarGetInteger(linkLinen.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(linkLinen.valuesCvar, linkLinen.defaultColor); - PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen1", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen2", linkLinen.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen3", linkLinen.changedCvar, 25, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen4", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen5", linkLinen.changedCvar, 70, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen6", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen7", linkLinen.changedCvar, 70, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen8", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftShoulderFarDL, "Link_Linen9", linkLinen.changedCvar, 55, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftShoulderNearDL, "Link_Linen10", linkLinen.changedCvar, 57, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightShoulderNearDL, "Link_Linen11", linkLinen.changedCvar, 57, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightShoulderFarDL, "Link_Linen12", linkLinen.changedCvar, 55, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultTorsoNearDL, "Link_Linen13", linkLinen.changedCvar, 66, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultTorsoFarDL, "Link_Linen14", linkLinen.changedCvar, 57, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightThighNearDL, "Link_Linen15", linkLinen.changedCvar, 53, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Linen16", linkLinen.changedCvar, 53, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightThighFarDL, "Link_Linen17", linkLinen.changedCvar, 54, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Linen18", linkLinen.changedCvar, 54, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen19", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen20", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen21", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen22", linkLinen.changedCvar, 30, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen1", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen2", linkLinen.changedCvar, 83, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen3", linkLinen.changedCvar, 25, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen4", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen5", linkLinen.changedCvar, 70, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen6", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen7", linkLinen.changedCvar, 70, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen8", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftShoulderFarDL, "Link_Linen9", linkLinen.changedCvar, 55, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftShoulderNearDL, "Link_Linen10", linkLinen.changedCvar, 57, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightShoulderNearDL, "Link_Linen11", linkLinen.changedCvar, 57, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightShoulderFarDL, "Link_Linen12", linkLinen.changedCvar, 55, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultTorsoNearDL, "Link_Linen13", linkLinen.changedCvar, 66, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultTorsoFarDL, "Link_Linen14", linkLinen.changedCvar, 57, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightThighNearDL, "Link_Linen15", linkLinen.changedCvar, 53, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Linen16", linkLinen.changedCvar, 53, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightThighFarDL, "Link_Linen17", linkLinen.changedCvar, 54, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Linen18", linkLinen.changedCvar, 54, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen19", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen20", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen21", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen22", linkLinen.changedCvar, 30, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen23", linkLinen.changedCvar, 35, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen24", linkLinen.changedCvar, 45, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen25", linkLinen.changedCvar, 40, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen26", linkLinen.changedCvar, 77, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen27", linkLinen.changedCvar, 35, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen28", linkLinen.changedCvar, 77, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen29", linkLinen.changedCvar, 42, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen30", linkLinen.changedCvar, 43, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen31", linkLinen.changedCvar, 43, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen32", linkLinen.changedCvar, 38, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); - PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen33", linkLinen.changedCvar, 38, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen23", linkLinen.changedCvar, 35, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmOutNearDL, "Link_Linen24", linkLinen.changedCvar, 45, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmNearDL, "Link_Linen25", linkLinen.changedCvar, 40, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftArmFarDL, "Link_Linen26", linkLinen.changedCvar, 77, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen27", linkLinen.changedCvar, 35, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightArmFarDL, "Link_Linen28", linkLinen.changedCvar, 77, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightArmNearDL, "Link_Linen29", linkLinen.changedCvar, 42, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Linen30", linkLinen.changedCvar, 43, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Linen31", linkLinen.changedCvar, 43, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Linen32", linkLinen.changedCvar, 38, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); + PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Linen33", linkLinen.changedCvar, 38, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)); } } static CosmeticOption& linkBoots = cosmeticOptions.at("Link.Boots"); if (manualChange || CVarGetInteger(linkBoots.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(linkBoots.valuesCvar, linkBoots.defaultColor); - PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots1", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots2", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots3", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots4", linkBoots.changedCvar, 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots1", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots2", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots3", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots4", linkBoots.changedCvar, 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots5", linkBoots.changedCvar, 53, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots6", linkBoots.changedCvar, 69, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots7", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots8", linkBoots.changedCvar, 61, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots9", linkBoots.changedCvar, 53, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots10", linkBoots.changedCvar, 69, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots11", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots12", linkBoots.changedCvar, 61, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightFootNearDL, "Link_Boots13", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightFootFarDL, "Link_Boots14", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFootNearDL, "Link_Boots15", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFootFarDL, "Link_Boots16", linkBoots.changedCvar, 30, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftThighNearDL, "Link_Boots17", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftThighFarDL, "Link_Boots18", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadNearDL, "Link_Boots19", linkBoots.changedCvar, 20, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHeadFarDL, "Link_Boots20", linkBoots.changedCvar, 20, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots21", linkBoots.changedCvar, 57, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots22", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Boots23", linkBoots.changedCvar, 57, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Boots24", linkBoots.changedCvar, 52, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Boots25", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Boots26", linkBoots.changedCvar, 10, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadNearDL, "Link_Boots27", linkBoots.changedCvar, 20, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHeadFarDL, "Link_Boots28", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots5", linkBoots.changedCvar, 53, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightShinNearDL, "Link_Boots6", linkBoots.changedCvar, 69, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots7", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightShinFarDL, "Link_Boots8", linkBoots.changedCvar, 61, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots9", linkBoots.changedCvar, 53, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftShinNearDL, "Link_Boots10", linkBoots.changedCvar, 69, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots11", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftShinFarDL, "Link_Boots12", linkBoots.changedCvar, 61, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightFootNearDL, "Link_Boots13", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightFootFarDL, "Link_Boots14", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftFootNearDL, "Link_Boots15", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftFootFarDL, "Link_Boots16", linkBoots.changedCvar, 30, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftThighNearDL, "Link_Boots17", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftThighFarDL, "Link_Boots18", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadNearDL, "Link_Boots19", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHeadFarDL, "Link_Boots20", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultRightLegNearDL, "Link_Boots21", linkBoots.changedCvar, 57, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultRightLegFarDL, "Link_Boots22", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftLegNearDL, "Link_Boots23", linkBoots.changedCvar, 57, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftLegFarDL, "Link_Boots24", linkBoots.changedCvar, 52, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftThighNearDL, "Link_Boots25", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultLeftThighFarDL, "Link_Boots26", linkBoots.changedCvar, 10, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadNearDL, "Link_Boots27", linkBoots.changedCvar, 20, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHeadFarDL, "Link_Boots28", linkBoots.changedCvar, 20, gsSPGrayscale(false)); } } static CosmeticOption& mirrorShieldBody = cosmeticOptions.at("MirrorShield.Body"); if (manualChange || CVarGetInteger(mirrorShieldBody.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(mirrorShieldBody.valuesCvar, mirrorShieldBody.defaultColor); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body1", mirrorShieldBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body2", mirrorShieldBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Body3", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Body4", mirrorShieldBody.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Body5", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Body6", mirrorShieldBody.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Body7", mirrorShieldBody.changedCvar, 28, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Body8", mirrorShieldBody.changedCvar, 95, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body1", mirrorShieldBody.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Body2", mirrorShieldBody.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Body3", mirrorShieldBody.changedCvar, 28, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Body4", mirrorShieldBody.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Body5", mirrorShieldBody.changedCvar, 28, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Body6", mirrorShieldBody.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Body7", mirrorShieldBody.changedCvar, 28, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Body8", mirrorShieldBody.changedCvar, 95, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& mirrorShieldMirror = cosmeticOptions.at("MirrorShield.Mirror"); if (manualChange || CVarGetInteger(mirrorShieldMirror.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(mirrorShieldMirror.valuesCvar, mirrorShieldMirror.defaultColor); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror1", mirrorShieldMirror.changedCvar, 47, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror2", mirrorShieldMirror.changedCvar, 48, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Mirror3", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Mirror4", mirrorShieldMirror.changedCvar, 33, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Mirror5", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Mirror6", mirrorShieldMirror.changedCvar, 33, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Mirror7", mirrorShieldMirror.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Mirror8", mirrorShieldMirror.changedCvar, 111, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror1", mirrorShieldMirror.changedCvar, 47, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldDL, "MirrorShield_Mirror2", mirrorShieldMirror.changedCvar, 48, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Mirror3", mirrorShieldMirror.changedCvar, + 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Mirror4", mirrorShieldMirror.changedCvar, 33, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Mirror5", mirrorShieldMirror.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Mirror6", mirrorShieldMirror.changedCvar, 33, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Mirror7", mirrorShieldMirror.changedCvar, + 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Mirror8", mirrorShieldMirror.changedCvar, + 111, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& mirrorShieldEmblem = cosmeticOptions.at("MirrorShield.Emblem"); if (manualChange || CVarGetInteger(mirrorShieldEmblem.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(mirrorShieldEmblem.valuesCvar, mirrorShieldEmblem.defaultColor); - PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem1", mirrorShieldEmblem.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 140)); - PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem2", mirrorShieldEmblem.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Emblem3", mirrorShieldEmblem.changedCvar, 165, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Emblem4", mirrorShieldEmblem.changedCvar, 135, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Emblem5", mirrorShieldEmblem.changedCvar, 129, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Emblem6", mirrorShieldEmblem.changedCvar, 103, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Emblem7", mirrorShieldEmblem.changedCvar, 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Emblem8", mirrorShieldEmblem.changedCvar, 133, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem1", mirrorShieldEmblem.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 140)); + PATCH_GFX(gGiMirrorShieldSymbolDL, "MirrorShield_Emblem2", mirrorShieldEmblem.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "MirrorShield_Emblem3", mirrorShieldEmblem.changedCvar, + 165, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "MirrorShield_Emblem4", mirrorShieldEmblem.changedCvar, + 135, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathNearDL, "MirrorShield_Emblem5", mirrorShieldEmblem.changedCvar, 129, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldAndSheathFarDL, "MirrorShield_Emblem6", mirrorShieldEmblem.changedCvar, 103, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldNearDL, "MirrorShield_Emblem7", mirrorShieldEmblem.changedCvar, + 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingMirrorShieldFarDL, "MirrorShield_Emblem8", mirrorShieldEmblem.changedCvar, + 133, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& swordsKokiriBlade = cosmeticOptions.at("Swords.KokiriBlade"); if (manualChange || CVarGetInteger(swordsKokiriBlade.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(swordsKokiriBlade.valuesCvar, swordsKokiriBlade.defaultColor); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriBlade1", swordsKokiriBlade.changedCvar, 79, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriBlade2", swordsKokiriBlade.changedCvar, 75, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade3", swordsKokiriBlade.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade4", swordsKokiriBlade.changedCvar, 6, gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriBlade1", swordsKokiriBlade.changedCvar, 79, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriBlade2", swordsKokiriBlade.changedCvar, 75, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade3", swordsKokiriBlade.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriBlade4", swordsKokiriBlade.changedCvar, 6, + gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); } /* static CosmeticOption& swordsKokiriHilt = cosmeticOptions.at("Swords.KokiriHilt"); if (manualChange || CVarGetInteger(swordsKokiriHilt.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(swordsKokiriHilt.valuesCvar, swordsKokiriHilt.defaultColor); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt1", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt2", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt3", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt4", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt5", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt6", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt7", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt8", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt9", swordsKokiriHilt.changedCvar, 64, gsDPSetPrimColor(0, 0, MAX(color.r - 50, 0), MAX(color.g - 50, 0), MAX(color.b - 50, 0), 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt10", swordsKokiriHilt.changedCvar, 66, gsDPSetEnvColor(MAX(color.r - 50, 0) / 3, MAX(color.g - 50, 0) / 3, MAX(color.b - 50, 0) / 3, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt11", swordsKokiriHilt.changedCvar, 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt12", swordsKokiriHilt.changedCvar, 164, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt1", swordsKokiriHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, + "Swords_KokiriHilt2", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt3", + swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt4", swordsKokiriHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, + "Swords_KokiriHilt5", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt6", + swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt7", swordsKokiriHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, + "Swords_KokiriHilt8", swordsKokiriHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt9", + swordsKokiriHilt.changedCvar, 64, gsDPSetPrimColor(0, 0, MAX(color.r - 50, 0), MAX(color.g - 50, 0), + MAX(color.b - 50, 0), 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt10", + swordsKokiriHilt.changedCvar, 66, gsDPSetEnvColor(MAX(color.r - 50, 0) / 3, MAX(color.g - 50, 0) / 3, + MAX(color.b - 50, 0) / 3, 255)); PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt11", + swordsKokiriHilt.changedCvar, 162, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiKokiriSwordDL, "Swords_KokiriHilt12", swordsKokiriHilt.changedCvar, + 164, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); if (manualChange) { - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt13", swordsKokiriHilt.changedCvar, 108, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt14", swordsKokiriHilt.changedCvar, 134, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt15", swordsKokiriHilt.changedCvar, 106, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt16", swordsKokiriHilt.changedCvar, 126, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt17", swordsKokiriHilt.changedCvar, 100, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt18", swordsKokiriHilt.changedCvar, 126, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt19", swordsKokiriHilt.changedCvar, 128, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt20", swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt21", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt22", swordsKokiriHilt.changedCvar, 120, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt23", swordsKokiriHilt.changedCvar, 166, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt24", swordsKokiriHilt.changedCvar, 192, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt25", swordsKokiriHilt.changedCvar, 194, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt26", swordsKokiriHilt.changedCvar, 156, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt27", swordsKokiriHilt.changedCvar, 176, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt28", swordsKokiriHilt.changedCvar, 178, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt29", swordsKokiriHilt.changedCvar, 162, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt30", swordsKokiriHilt.changedCvar, 188, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt31", swordsKokiriHilt.changedCvar, 190, gsSPEndDisplayList()); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt32", swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt33", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt13", swordsKokiriHilt.changedCvar, + 108, gsSPGrayscale(true)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordNearDL, "Swords_KokiriHilt14", + swordsKokiriHilt.changedCvar, 134, gsSPGrayscale(false)); PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, + "Swords_KokiriHilt15", swordsKokiriHilt.changedCvar, 106, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildLeftFistAndKokiriSwordFarDL, "Swords_KokiriHilt16", swordsKokiriHilt.changedCvar, + 126, gsSPGrayscale(false)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt17", + swordsKokiriHilt.changedCvar, 100, gsSPGrayscale(true)); PATCH_GFX(gLinkChildSwordAndSheathNearDL, + "Swords_KokiriHilt18", swordsKokiriHilt.changedCvar, 126, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildSwordAndSheathNearDL, "Swords_KokiriHilt19", swordsKokiriHilt.changedCvar, + 128, gsSPEndDisplayList()); PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt20", + swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); PATCH_GFX(gLinkChildSwordAndSheathFarDL, + "Swords_KokiriHilt21", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildSwordAndSheathFarDL, "Swords_KokiriHilt22", swordsKokiriHilt.changedCvar, + 120, gsSPEndDisplayList()); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt23", + swordsKokiriHilt.changedCvar, 166, gsSPGrayscale(true)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, + "Swords_KokiriHilt24", swordsKokiriHilt.changedCvar, 192, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildDekuShieldSwordAndSheathNearDL, "Swords_KokiriHilt25", swordsKokiriHilt.changedCvar, + 194, gsSPEndDisplayList()); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt26", + swordsKokiriHilt.changedCvar, 156, gsSPGrayscale(true)); PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, + "Swords_KokiriHilt27", swordsKokiriHilt.changedCvar, 176, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildDekuShieldSwordAndSheathFarDL, "Swords_KokiriHilt28", swordsKokiriHilt.changedCvar, + 178, gsSPEndDisplayList()); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt29", + swordsKokiriHilt.changedCvar, 162, gsSPGrayscale(true)); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, + "Swords_KokiriHilt30", swordsKokiriHilt.changedCvar, 188, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildHylianShieldSwordAndSheathNearDL, "Swords_KokiriHilt31", swordsKokiriHilt.changedCvar, + 190, gsSPEndDisplayList()); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, "Swords_KokiriHilt32", + swordsKokiriHilt.changedCvar, 98, gsSPGrayscale(true)); PATCH_GFX(gLinkChildHylianShieldSwordAndSheathFarDL, + "Swords_KokiriHilt33", swordsKokiriHilt.changedCvar, 118, gsSPGrayscale(false)); } } */ static CosmeticOption& swordsMasterBlade = cosmeticOptions.at("Swords.MasterBlade"); if (manualChange || CVarGetInteger(swordsMasterBlade.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(swordsMasterBlade.valuesCvar, swordsMasterBlade.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterBlade1", swordsMasterBlade.changedCvar, 60, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterBlade2", swordsMasterBlade.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade3", swordsMasterBlade.changedCvar, 13, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade4", swordsMasterBlade.changedCvar, 14, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade5", swordsMasterBlade.changedCvar, 13, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade6", swordsMasterBlade.changedCvar, 14, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterBlade1", swordsMasterBlade.changedCvar, 60, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterBlade2", swordsMasterBlade.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade3", swordsMasterBlade.changedCvar, 13, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterBlade4", swordsMasterBlade.changedCvar, 14, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade5", swordsMasterBlade.changedCvar, 13, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterBlade6", swordsMasterBlade.changedCvar, 14, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } /* static CosmeticOption& swordsMasterHilt = cosmeticOptions.at("Swords.MasterHilt"); if (manualChange || CVarGetInteger(swordsMasterHilt.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(swordsMasterHilt.valuesCvar, swordsMasterHilt.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt1", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt2", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt3", swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt4", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt5", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt6", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt7", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt8", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt9", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt10", swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt1", swordsMasterHilt.changedCvar, + 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, + "Swords_MasterHilt2", swordsMasterHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt3", + swordsMasterHilt.changedCvar, 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt4", swordsMasterHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, + "Swords_MasterHilt5", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt6", + swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt7", swordsMasterHilt.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, + "Swords_MasterHilt8", swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, + color.b, 255)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt9", + swordsMasterHilt.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt10", swordsMasterHilt.changedCvar, + 16, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt11", swordsMasterHilt.changedCvar, 38, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt12", swordsMasterHilt.changedCvar, 64, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt13", swordsMasterHilt.changedCvar, 106, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt14", swordsMasterHilt.changedCvar, 120, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt15", swordsMasterHilt.changedCvar, 104, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt16", swordsMasterHilt.changedCvar, 182, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt17", swordsMasterHilt.changedCvar, 184, gsSPEndDisplayList()); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt18", swordsMasterHilt.changedCvar, 80, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt19", swordsMasterHilt.changedCvar, 94, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt20", swordsMasterHilt.changedCvar, 162, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt21", swordsMasterHilt.changedCvar, 180, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt22", swordsMasterHilt.changedCvar, 154, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt23", swordsMasterHilt.changedCvar, 232, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt24", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt25", swordsMasterHilt.changedCvar, 130, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt26", swordsMasterHilt.changedCvar, 172, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt27", swordsMasterHilt.changedCvar, 186, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt28", swordsMasterHilt.changedCvar, 220, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt29", swordsMasterHilt.changedCvar, 298, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt30", swordsMasterHilt.changedCvar, 38, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt31", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt32", swordsMasterHilt.changedCvar, 86, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt33", swordsMasterHilt.changedCvar, 208, gsSPGrayscale(false)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt34", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt35", swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); - PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt36", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt37", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt38", swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); - PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt39", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); + PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt11", swordsMasterHilt.changedCvar, + 38, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt12", + swordsMasterHilt.changedCvar, 64, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, + "Swords_MasterHilt13", swordsMasterHilt.changedCvar, 106, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultMasterSwordAndSheathFarDL, "Swords_MasterHilt14", swordsMasterHilt.changedCvar, + 120, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt15", + swordsMasterHilt.changedCvar, 104, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, + "Swords_MasterHilt16", swordsMasterHilt.changedCvar, 182, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultMasterSwordAndSheathNearDL, "Swords_MasterHilt17", swordsMasterHilt.changedCvar, + 184, gsSPEndDisplayList()); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt18", + swordsMasterHilt.changedCvar, 80, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, + "Swords_MasterHilt19", swordsMasterHilt.changedCvar, 94, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt20", swordsMasterHilt.changedCvar, + 162, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathFarDL, "Swords_MasterHilt21", + swordsMasterHilt.changedCvar, 180, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt22", swordsMasterHilt.changedCvar, + 154, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultHylianShieldSwordAndSheathNearDL, "Swords_MasterHilt23", + swordsMasterHilt.changedCvar, 232, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, + "Swords_MasterHilt24", swordsMasterHilt.changedCvar, 112, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt25", swordsMasterHilt.changedCvar, + 130, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, "Swords_MasterHilt26", + swordsMasterHilt.changedCvar, 172, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathFarDL, + "Swords_MasterHilt27", swordsMasterHilt.changedCvar, 186, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt28", swordsMasterHilt.changedCvar, + 220, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultMirrorShieldSwordAndSheathNearDL, "Swords_MasterHilt29", + swordsMasterHilt.changedCvar, 298, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, + "Swords_MasterHilt30", swordsMasterHilt.changedCvar, 38, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordFarDL, "Swords_MasterHilt31", swordsMasterHilt.changedCvar, + 112, gsSPGrayscale(false)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, "Swords_MasterHilt32", + swordsMasterHilt.changedCvar, 86, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultLeftHandHoldingMasterSwordNearDL, + "Swords_MasterHilt33", swordsMasterHilt.changedCvar, 208, gsSPGrayscale(false)); + PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt34", swordsMasterHilt.changedCvar, + 112, gsSPGrayscale(true)); PATCH_GFX(object_toki_objects_DL_001BD0, "Swords_MasterHilt35", + swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); PATCH_GFX(object_toki_objects_DL_001BD0, + "Swords_MasterHilt36", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); + PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt37", swordsMasterHilt.changedCvar, + 112, gsSPGrayscale(true)); PATCH_GFX(gGanonMasterSwordDL, "Swords_MasterHilt38", + swordsMasterHilt.changedCvar, 278, gsSPGrayscale(false)); PATCH_GFX(gGanonMasterSwordDL, + "Swords_MasterHilt39", swordsMasterHilt.changedCvar, 280, gsSPEndDisplayList()); } } */ static CosmeticOption& swordsBiggoronBlade = cosmeticOptions.at("Swords.BiggoronBlade"); if (manualChange || CVarGetInteger(swordsBiggoronBlade.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(swordsBiggoronBlade.valuesCvar, swordsBiggoronBlade.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronBlade1", swordsBiggoronBlade.changedCvar, 108, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronBlade2", swordsBiggoronBlade.changedCvar, 63, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade3", swordsBiggoronBlade.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade4", swordsBiggoronBlade.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronBlade1", swordsBiggoronBlade.changedCvar, 108, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronBlade2", swordsBiggoronBlade.changedCvar, 63, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade3", swordsBiggoronBlade.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronBlade4", swordsBiggoronBlade.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } /* static CosmeticOption& swordsBiggoronHilt = cosmeticOptions.at("Swords.BiggoronHilt"); if (manualChange || CVarGetInteger(swordsBiggoronHilt.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(swordsBiggoronHilt.valuesCvar, swordsBiggoronHilt.defaultColor); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt1", swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt2", swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt3", swordsBiggoronHilt.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt4", swordsBiggoronHilt.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt5", swordsBiggoronHilt.changedCvar, 154, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt6", swordsBiggoronHilt.changedCvar, 156, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt1", + swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt2", + swordsBiggoronHilt.changedCvar, 20, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt3", + swordsBiggoronHilt.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt4", + swordsBiggoronHilt.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt5", + swordsBiggoronHilt.changedCvar, 154, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBiggoronSwordDL, "Swords_BiggoronHilt6", + swordsBiggoronHilt.changedCvar, 156, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); if (manualChange) { - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt7", swordsBiggoronHilt.changedCvar, 278, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt8", swordsBiggoronHilt.changedCvar, 332, gsSPGrayscale(false)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt9", swordsBiggoronHilt.changedCvar, 334, gsSPEndDisplayList()); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt10", swordsBiggoronHilt.changedCvar, 38, gsSPGrayscale(true)); - PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt11", swordsBiggoronHilt.changedCvar, 118, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt7", + swordsBiggoronHilt.changedCvar, 278, gsSPGrayscale(true)); PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, + "Swords_BiggoronHilt8", swordsBiggoronHilt.changedCvar, 332, gsSPGrayscale(false)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsFarDL, "Swords_BiggoronHilt9", + swordsBiggoronHilt.changedCvar, 334, gsSPEndDisplayList()); PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, + "Swords_BiggoronHilt10", swordsBiggoronHilt.changedCvar, 38, gsSPGrayscale(true)); + PATCH_GFX(gLinkAdultLeftHandHoldingBgsNearDL, "Swords_BiggoronHilt11", + swordsBiggoronHilt.changedCvar, 118, gsSPGrayscale(false)); } } */ static CosmeticOption& glovesGoronBracelet = cosmeticOptions.at("Gloves.GoronBracelet"); if (manualChange || CVarGetInteger(glovesGoronBracelet.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(glovesGoronBracelet.valuesCvar, glovesGoronBracelet.defaultColor); - PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet1", glovesGoronBracelet.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet2", glovesGoronBracelet.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet3", glovesGoronBracelet.changedCvar, 3, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet1", glovesGoronBracelet.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoronBraceletDL, "Gloves_GoronBracelet2", glovesGoronBracelet.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet3", glovesGoronBracelet.changedCvar, 3, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet4", glovesGoronBracelet.changedCvar, 11, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet5", glovesGoronBracelet.changedCvar, 39, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet4", glovesGoronBracelet.changedCvar, 11, + gsSPGrayscale(true)); + PATCH_GFX(gLinkChildGoronBraceletDL, "Gloves_GoronBracelet5", glovesGoronBracelet.changedCvar, 39, + gsSPGrayscale(false)); } } static CosmeticOption& glovesSilverGauntlets = cosmeticOptions.at("Gloves.SilverGauntlets"); if (manualChange || CVarGetInteger(glovesSilverGauntlets.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(glovesSilverGauntlets.valuesCvar, glovesSilverGauntlets.defaultColor); - PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets1", glovesSilverGauntlets.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets2", glovesSilverGauntlets.changedCvar, 4, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets1", glovesSilverGauntlets.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSilverGauntletsColorDL, "Gloves_SilverGauntlets2", glovesSilverGauntlets.changedCvar, 4, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } static CosmeticOption& glovesGoldenGauntlets = cosmeticOptions.at("Gloves.GoldenGauntlets"); if (manualChange || CVarGetInteger(glovesGoldenGauntlets.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(glovesGoldenGauntlets.valuesCvar, glovesGoldenGauntlets.defaultColor); - PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets1", glovesGoldenGauntlets.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets2", glovesGoldenGauntlets.changedCvar, 4, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets1", glovesGoldenGauntlets.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoldenGauntletsColorDL, "Gloves_GoldenGauntlets2", glovesGoldenGauntlets.changedCvar, 4, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); } static CosmeticOption& glovesGauntletsGem = cosmeticOptions.at("Gloves.GauntletsGem"); if (manualChange || CVarGetInteger(glovesGauntletsGem.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(glovesGauntletsGem.valuesCvar, glovesGauntletsGem.defaultColor); - PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem1", glovesGauntletsGem.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem2", glovesGauntletsGem.changedCvar, 85, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultLeftGauntletPlate2DL, "Gloves_GauntletsGem3", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightGauntletPlate2DL, "Gloves_GauntletsGem4", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftGauntletPlate3DL, "Gloves_GauntletsGem5", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightGauntletPlate3DL, "Gloves_GauntletsGem6", glovesGauntletsGem.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem1", glovesGauntletsGem.changedCvar, 84, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGauntletsDL, "Gloves_GauntletsGem2", glovesGauntletsGem.changedCvar, 85, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultLeftGauntletPlate2DL, "Gloves_GauntletsGem3", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightGauntletPlate2DL, "Gloves_GauntletsGem4", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftGauntletPlate3DL, "Gloves_GauntletsGem5", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightGauntletPlate3DL, "Gloves_GauntletsGem6", glovesGauntletsGem.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBoomerangBody = cosmeticOptions.at("Equipment.BoomerangBody"); if (manualChange || CVarGetInteger(equipmentBoomerangBody.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBoomerangBody.valuesCvar, equipmentBoomerangBody.defaultColor); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody1", equipmentBoomerangBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody2", equipmentBoomerangBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangBody3", equipmentBoomerangBody.changedCvar, 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangBody4", equipmentBoomerangBody.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gBoomerangDL, "Equipment_BoomerangBody5", equipmentBoomerangBody.changedCvar, 39, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody1", equipmentBoomerangBody.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangBody2", equipmentBoomerangBody.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangBody3", equipmentBoomerangBody.changedCvar, + 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangBody4", equipmentBoomerangBody.changedCvar, + 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gBoomerangDL, "Equipment_BoomerangBody5", equipmentBoomerangBody.changedCvar, 39, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBoomerangGem = cosmeticOptions.at("Equipment.BoomerangGem"); if (manualChange || CVarGetInteger(equipmentBoomerangGem.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBoomerangGem.valuesCvar, equipmentBoomerangGem.defaultColor); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem1", equipmentBoomerangGem.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem2", equipmentBoomerangGem.changedCvar, 85, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangGem3", equipmentBoomerangGem.changedCvar, 16, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gBoomerangDL, "Equipment_BoomerangGem4", equipmentBoomerangGem.changedCvar, 23, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem1", equipmentBoomerangGem.changedCvar, 84, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBoomerangDL, "Equipment_BoomerangGem2", equipmentBoomerangGem.changedCvar, 85, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildLeftFistAndBoomerangNearDL, "Equipment_BoomerangGem3", equipmentBoomerangGem.changedCvar, + 16, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gBoomerangDL, "Equipment_BoomerangGem4", equipmentBoomerangGem.changedCvar, 23, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); // There appears to be no gem rendered on the far LOD variant, not sure if this is an SOH bug or what. - // PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangGem5", equipmentBoomerangGem.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + // PATCH_GFX(gLinkChildLeftFistAndBoomerangFarDL, "Equipment_BoomerangGem5", equipmentBoomerangGem.changedCvar, + // 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } /* static CosmeticOption& equipmentSlingshotBody = cosmeticOptions.at("Equipment.SlingshotBody"); if (manualChange || CVarGetInteger(equipmentSlingshotBody.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentSlingshotBody.valuesCvar, equipmentSlingshotBody.defaultColor); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody1", equipmentSlingshotBody.changedCvar, 10, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), MAX(color.b - 100, 0), 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody2", equipmentSlingshotBody.changedCvar, 12, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, MAX(color.b - 100, 0) / 3, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody3", equipmentSlingshotBody.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody4", equipmentSlingshotBody.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody5", equipmentSlingshotBody.changedCvar, 128, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), MAX(color.b - 100, 0), 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody6", equipmentSlingshotBody.changedCvar, 130, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, MAX(color.b - 100, 0) / 3, 255)); - PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody7", equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody8", equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody9", equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody1", + equipmentSlingshotBody.changedCvar, 10, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), + MAX(color.b - 100, 0), 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody2", + equipmentSlingshotBody.changedCvar, 12, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, + MAX(color.b - 100, 0) / 3, 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody3", + equipmentSlingshotBody.changedCvar, 74, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody4", + equipmentSlingshotBody.changedCvar, 76, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody5", + equipmentSlingshotBody.changedCvar, 128, gsDPSetPrimColor(0, 0, MAX(color.r - 100, 0), MAX(color.g - 100, 0), + MAX(color.b - 100, 0), 255)); PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotBody6", + equipmentSlingshotBody.changedCvar, 130, gsDPSetEnvColor(MAX(color.r - 100, 0) / 3, MAX(color.g - 100, 0) / 3, + MAX(color.b - 100, 0) / 3, 255)); PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody7", + equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody8", + equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody9", + equipmentSlingshotBody.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody10",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, "Equipment_SlingshotBody11",equipmentSlingshotBody.changedCvar, 74, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody12",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, "Equipment_SlingshotBody13",equipmentSlingshotBody.changedCvar, 66, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody14",equipmentSlingshotBody.changedCvar, 96, gsSPGrayscale(true)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody15",equipmentSlingshotBody.changedCvar, 136, gsSPGrayscale(false)); - PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, "Equipment_SlingshotBody16",equipmentSlingshotBody.changedCvar, 138, gsSPEndDisplayList()); + PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, + "Equipment_SlingshotBody10",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightArmStretchedSlingshotDL, + "Equipment_SlingshotBody11",equipmentSlingshotBody.changedCvar, 74, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, + "Equipment_SlingshotBody12",equipmentSlingshotBody.changedCvar, 20, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotFarDL, + "Equipment_SlingshotBody13",equipmentSlingshotBody.changedCvar, 66, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, + "Equipment_SlingshotBody14",equipmentSlingshotBody.changedCvar, 96, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, + "Equipment_SlingshotBody15",equipmentSlingshotBody.changedCvar, 136, gsSPGrayscale(false)); + PATCH_GFX(gLinkChildRightHandHoldingSlingshotNearDL, + "Equipment_SlingshotBody16",equipmentSlingshotBody.changedCvar, 138, gsSPEndDisplayList()); } } */ static CosmeticOption& equipmentSlingshotString = cosmeticOptions.at("Equipment.SlingshotString"); if (manualChange || CVarGetInteger(equipmentSlingshotString.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentSlingshotString.valuesCvar, equipmentSlingshotString.defaultColor); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString1",equipmentSlingshotString.changedCvar, 75, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString2",equipmentSlingshotString.changedCvar, 76, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gLinkChildSlingshotStringDL, "Equipment_SlingshotString3",equipmentSlingshotString.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString1", equipmentSlingshotString.changedCvar, 75, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSlingshotDL, "Equipment_SlingshotString2", equipmentSlingshotString.changedCvar, 76, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gLinkChildSlingshotStringDL, "Equipment_SlingshotString3", equipmentSlingshotString.changedCvar, 9, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowTips = cosmeticOptions.at("Equipment.BowTips"); if (manualChange || CVarGetInteger(equipmentBowTips.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBowTips.valuesCvar, equipmentBowTips.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowTips1", equipmentBowTips.changedCvar, 86, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowTips2", equipmentBowTips.changedCvar, 87, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowTips3", equipmentBowTips.changedCvar, 34, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowTips4", equipmentBowTips.changedCvar, 26, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowTips5", equipmentBowTips.changedCvar, 25, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowTips1", equipmentBowTips.changedCvar, 86, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowTips2", equipmentBowTips.changedCvar, 87, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowTips3", equipmentBowTips.changedCvar, 34, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowTips4", equipmentBowTips.changedCvar, 26, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowTips5", equipmentBowTips.changedCvar, 25, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowString = cosmeticOptions.at("Equipment.BowString"); if (manualChange || CVarGetInteger(equipmentBowString.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBowString.valuesCvar, equipmentBowString.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowString1", equipmentBowString.changedCvar, 105, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowString2", equipmentBowString.changedCvar, 106, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultBowStringDL, "Equipment_BowString3", equipmentBowString.changedCvar, 9, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowString1", equipmentBowString.changedCvar, 105, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowString2", equipmentBowString.changedCvar, 106, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultBowStringDL, "Equipment_BowString3", equipmentBowString.changedCvar, 9, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowBody = cosmeticOptions.at("Equipment.BowBody"); if (manualChange || CVarGetInteger(equipmentBowBody.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBowBody.valuesCvar, equipmentBowBody.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowBody1", equipmentBowBody.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowBody2", equipmentBowBody.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowBody3", equipmentBowBody.changedCvar, 42, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowBody4", equipmentBowBody.changedCvar, 33, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowBody5", equipmentBowBody.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowBody1", equipmentBowBody.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowBody2", equipmentBowBody.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowBody3", equipmentBowBody.changedCvar, 42, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowBody4", equipmentBowBody.changedCvar, 33, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowBody5", equipmentBowBody.changedCvar, 31, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBowHandle = cosmeticOptions.at("Equipment.BowHandle"); if (manualChange || CVarGetInteger(equipmentBowHandle.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBowHandle.valuesCvar, equipmentBowHandle.defaultColor); - PATCH_GFX(gGiBowDL, "Equipment_BowHandle1", equipmentBowHandle.changedCvar, 51, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBowDL, "Equipment_BowHandle2", equipmentBowHandle.changedCvar, 52, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowHandle3", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowHandle4", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowHandle5", equipmentBowHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowHandle1", equipmentBowHandle.changedCvar, 51, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBowDL, "Equipment_BowHandle2", equipmentBowHandle.changedCvar, 52, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFirstPersonDL, "Equipment_BowHandle3", equipmentBowHandle.changedCvar, + 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowNearDL, "Equipment_BowHandle4", equipmentBowHandle.changedCvar, 18, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultRightHandHoldingBowFarDL, "Equipment_BowHandle5", equipmentBowHandle.changedCvar, 18, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentHammerHead = cosmeticOptions.at("Equipment.HammerHead"); if (manualChange || CVarGetInteger(equipmentHammerHead.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentHammerHead.valuesCvar, equipmentHammerHead.defaultColor); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead1", equipmentHammerHead.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead2", equipmentHammerHead.changedCvar, 6, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead3", equipmentHammerHead.changedCvar, 68, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHead4", equipmentHammerHead.changedCvar, 69, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHead5", equipmentHammerHead.changedCvar, 38, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHead6", equipmentHammerHead.changedCvar, 38, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead1", equipmentHammerHead.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead2", equipmentHammerHead.changedCvar, 6, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead3", equipmentHammerHead.changedCvar, 68, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHead4", equipmentHammerHead.changedCvar, 69, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHead5", equipmentHammerHead.changedCvar, 38, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHead6", equipmentHammerHead.changedCvar, 38, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentHammerHandle = cosmeticOptions.at("Equipment.HammerHandle"); if (manualChange || CVarGetInteger(equipmentHammerHandle.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentHammerHandle.valuesCvar, equipmentHammerHandle.defaultColor); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle1", equipmentHammerHandle.changedCvar, 84, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle2", equipmentHammerHandle.changedCvar, 85, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHandle5", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHandle6", equipmentHammerHandle.changedCvar, 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle1", equipmentHammerHandle.changedCvar, 84, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHammerDL, "Equipment_HammerHandle2", equipmentHammerHandle.changedCvar, 85, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerNearDL, "Equipment_HammerHandle5", equipmentHammerHandle.changedCvar, + 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultLeftHandHoldingHammerFarDL, "Equipment_HammerHandle6", equipmentHammerHandle.changedCvar, + 18, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentHookshotChain = cosmeticOptions.at("Equipment.HookshotChain"); if (manualChange || CVarGetInteger(equipmentHookshotChain.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentHookshotChain.valuesCvar, equipmentHookshotChain.defaultColor); - PATCH_GFX(gLinkAdultHookshotChainDL, "Equipment_HookshotChain1", equipmentHookshotChain.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gLinkAdultHookshotChainDL, "Equipment_HookshotChain1", equipmentHookshotChain.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentChuFace = cosmeticOptions.at("Equipment.ChuFace"); if (manualChange || CVarGetInteger(equipmentChuFace.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentChuFace.valuesCvar, equipmentChuFace.defaultColor); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace1", equipmentChuFace.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace2", equipmentChuFace.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gBombchuDL, "Equipment_ChuFace3", equipmentChuFace.changedCvar, 2, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace1", equipmentChuFace.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuFace2", equipmentChuFace.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gBombchuDL, "Equipment_ChuFace3", equipmentChuFace.changedCvar, 2, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gBombchuDL, "Equipment_ChuFace4", equipmentChuFace.changedCvar, 10, gsSPGrayscale(true)); - PATCH_GFX(gBombchuDL, "Equipment_ChuFace5", equipmentChuFace.changedCvar, 27, gsSPGrayscale(false)); + PATCH_GFX(gBombchuDL, "Equipment_ChuFace4", equipmentChuFace.changedCvar, 10, gsSPGrayscale(true)); + PATCH_GFX(gBombchuDL, "Equipment_ChuFace5", equipmentChuFace.changedCvar, 27, gsSPGrayscale(false)); } } static CosmeticOption& equipmentChuBody = cosmeticOptions.at("Equipment.ChuBody"); if (manualChange || CVarGetInteger(equipmentChuBody.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentChuBody.valuesCvar, equipmentChuBody.defaultColor); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody1", equipmentChuBody.changedCvar, 39, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody2", equipmentChuBody.changedCvar, 40, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody3", equipmentChuBody.changedCvar, 60, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody4", equipmentChuBody.changedCvar, 61, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gBombchuDL, "Equipment_ChuBody5", equipmentChuBody.changedCvar, 46, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody1", equipmentChuBody.changedCvar, 39, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody2", equipmentChuBody.changedCvar, 40, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody3", equipmentChuBody.changedCvar, 60, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBombchuDL, "Equipment_ChuBody4", equipmentChuBody.changedCvar, 61, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gBombchuDL, "Equipment_ChuBody5", equipmentChuBody.changedCvar, 46, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& equipmentBunnyHood = cosmeticOptions.at("Equipment.BunnyHood"); if (manualChange || CVarGetInteger(equipmentBunnyHood.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(equipmentBunnyHood.valuesCvar, equipmentBunnyHood.defaultColor); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood1", equipmentBunnyHood.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood2", equipmentBunnyHood.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood3", equipmentBunnyHood.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood4", equipmentBunnyHood.changedCvar, 84, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); - PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood5", equipmentBunnyHood.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood1", equipmentBunnyHood.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood2", equipmentBunnyHood.changedCvar, 6, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood3", equipmentBunnyHood.changedCvar, 83, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood4", equipmentBunnyHood.changedCvar, 84, + gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255)); + PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood5", equipmentBunnyHood.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); if (manualChange) { - PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood6", equipmentBunnyHood.changedCvar, 13, gsSPGrayscale(true)); + PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood6", equipmentBunnyHood.changedCvar, 13, + gsSPGrayscale(true)); if (CVarGetInteger(equipmentBunnyHood.changedCvar, 0)) { - ResourceMgr_PatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7", 125, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7", 125, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); } else { ResourceMgr_UnpatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7"); } @@ -1072,16 +1282,23 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& consumableGreenRupee = cosmeticOptions.at("Consumable.GreenRupee"); if (manualChange || CVarGetInteger(consumableGreenRupee.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumableGreenRupee.valuesCvar, consumableGreenRupee.defaultColor); - PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee1", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee2", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee3", consumableGreenRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee4", consumableGreenRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee1", consumableGreenRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGreenRupeeInnerColorDL, "Consumable_GreenRupee2", consumableGreenRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee3", consumableGreenRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiGreenRupeeOuterColorDL, "Consumable_GreenRupee4", consumableGreenRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); // Greg Bridge if (Randomizer_GetSettingValue(RSK_RAINBOW_BRIDGE) == RO_BRIDGE_GREG) { ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_StartGrayscale", 2, gsSPGrayscale(true)); - ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_MakeGreen", 10, gsDPSetGrayscaleColor(color.r, color.g, color.b, color.a)); - ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_EndGrayscaleAndEndDlist", 79, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_MakeGreen", 10, + gsDPSetGrayscaleColor(color.r, color.g, color.b, color.a)); + ResourceMgr_PatchGfxByName(gRainbowBridgeDL, "RainbowBridge_EndGrayscaleAndEndDlist", 79, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); } else { ResourceMgr_UnpatchGfxByName(gRainbowBridgeDL, "RainbowBridge_StartGrayscale"); ResourceMgr_UnpatchGfxByName(gRainbowBridgeDL, "RainbowBridge_MakeGreen"); @@ -1091,120 +1308,181 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { static CosmeticOption& consumableBlueRupee = cosmeticOptions.at("Consumable.BlueRupee"); if (manualChange || CVarGetInteger(consumableBlueRupee.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumableBlueRupee.valuesCvar, consumableBlueRupee.defaultColor); - PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee1", consumableBlueRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee2", consumableBlueRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee3", consumableBlueRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee4", consumableBlueRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee1", consumableBlueRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiBlueRupeeInnerColorDL, "Consumable_BlueRupee2", consumableBlueRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee3", consumableBlueRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiBlueRupeeOuterColorDL, "Consumable_BlueRupee4", consumableBlueRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumableRedRupee = cosmeticOptions.at("Consumable.RedRupee"); if (manualChange || CVarGetInteger(consumableRedRupee.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumableRedRupee.valuesCvar, consumableRedRupee.defaultColor); - PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee1", consumableRedRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee2", consumableRedRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee3", consumableRedRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee4", consumableRedRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee1", consumableRedRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiRedRupeeInnerColorDL, "Consumable_RedRupee2", consumableRedRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiRedRupeeOuterColorDL, "Consumable_RedRupee3", consumableRedRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiRedRupeeOuterColorDL, "Consumable_RedRupee4", consumableRedRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumablePurpleRupee = cosmeticOptions.at("Consumable.PurpleRupee"); if (manualChange || CVarGetInteger(consumablePurpleRupee.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumablePurpleRupee.valuesCvar, consumablePurpleRupee.defaultColor); - PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee1", consumablePurpleRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee2", consumablePurpleRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee3", consumablePurpleRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee4", consumablePurpleRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee1", consumablePurpleRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiPurpleRupeeInnerColorDL, "Consumable_PurpleRupee2", consumablePurpleRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee3", consumablePurpleRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiPurpleRupeeOuterColorDL, "Consumable_PurpleRupee4", consumablePurpleRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumableGoldRupee = cosmeticOptions.at("Consumable.GoldRupee"); if (manualChange || CVarGetInteger(consumableGoldRupee.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumableGoldRupee.valuesCvar, consumableGoldRupee.defaultColor); - PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee1", consumableGoldRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee2", consumableGoldRupee.changedCvar, 4, gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); - PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee3", consumableGoldRupee.changedCvar, 3, gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); - PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee4", consumableGoldRupee.changedCvar, 4, gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); + PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee1", consumableGoldRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGoldRupeeInnerColorDL, "Consumable_GoldRupee2", consumableGoldRupee.changedCvar, 4, + gsDPSetEnvColor(color.r / 5, color.g / 5, color.b / 5, 255)); + PATCH_GFX( + gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee3", consumableGoldRupee.changedCvar, 3, + gsDPSetPrimColor(0, 0, MIN(color.r + 100, 255), MIN(color.g + 100, 255), MIN(color.b + 100, 255), 255)); + PATCH_GFX(gGiGoldRupeeOuterColorDL, "Consumable_GoldRupee4", consumableGoldRupee.changedCvar, 4, + gsDPSetEnvColor(color.r * 0.75f, color.g * 0.75f, color.b * 0.75f, 255)); } static CosmeticOption& consumableHearts = cosmeticOptions.at("Consumable.Hearts"); if (manualChange || CVarGetInteger(consumableHearts.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumableHearts.valuesCvar, consumableHearts.defaultColor); /* - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts1", consumableHearts.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts2", consumableHearts.changedCvar, 26, gsSPGrayscale(true)); - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts3", consumableHearts.changedCvar, 72, gsSPGrayscale(false)); - PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts4", consumableHearts.changedCvar, 74, gsSPEndDisplayList()); + PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts1", consumableHearts.changedCvar, 4, + gsDPSetGrayscaleColor(color.r, color.g, color.b, 255)); PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts2", + consumableHearts.changedCvar, 26, gsSPGrayscale(true)); PATCH_GFX(gGiRecoveryHeartDL, + "Consumable_Hearts3", consumableHearts.changedCvar, 72, gsSPGrayscale(false)); + PATCH_GFX(gGiRecoveryHeartDL, "Consumable_Hearts4", consumableHearts.changedCvar, + 74, gsSPEndDisplayList()); */ - PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts5", consumableHearts.changedCvar, 2, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts6", consumableHearts.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts7", consumableHearts.changedCvar, 2, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts8", consumableHearts.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts9", consumableHearts.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts10", consumableHearts.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts5", consumableHearts.changedCvar, 2, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHeartPieceDL, "Consumable_Hearts6", consumableHearts.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts7", consumableHearts.changedCvar, 2, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiHeartContainerDL, "Consumable_Hearts8", consumableHearts.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts9", consumableHearts.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiRedPotColorDL, "Consumable_Hearts10", consumableHearts.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& consumableMagic = cosmeticOptions.at("Consumable.Magic"); if (manualChange || CVarGetInteger(consumableMagic.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(consumableMagic.valuesCvar, consumableMagic.defaultColor); - PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic1", consumableMagic.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic2", consumableMagic.changedCvar, 32, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic3", consumableMagic.changedCvar, 31, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic4", consumableMagic.changedCvar, 32, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic5", consumableMagic.changedCvar, 3, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic6", consumableMagic.changedCvar, 4, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic1", consumableMagic.changedCvar, 31, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMagicJarSmallDL, "Consumable_Magic2", consumableMagic.changedCvar, 32, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic3", consumableMagic.changedCvar, 31, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiMagicJarLargeDL, "Consumable_Magic4", consumableMagic.changedCvar, 32, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic5", consumableMagic.changedCvar, 3, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiGreenPotColorDL, "Consumable_Magic6", consumableMagic.changedCvar, 4, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); } static CosmeticOption& npcGoldenSkulltula = cosmeticOptions.at("NPC.GoldenSkulltula"); if (manualChange || CVarGetInteger(npcGoldenSkulltula.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(npcGoldenSkulltula.valuesCvar, npcGoldenSkulltula.defaultColor); - PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula1", npcGoldenSkulltula.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula2", npcGoldenSkulltula.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula3", npcGoldenSkulltula.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula4", npcGoldenSkulltula.changedCvar, 33, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula5", npcGoldenSkulltula.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula6", npcGoldenSkulltula.changedCvar, 6, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula7", npcGoldenSkulltula.changedCvar, 32, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula8", npcGoldenSkulltula.changedCvar, 33, gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); - PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula9", npcGoldenSkulltula.changedCvar, 118, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula10", npcGoldenSkulltula.changedCvar, 119, gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); + PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula1", npcGoldenSkulltula.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gSkulltulaTokenDL, "NPC_GoldenSkulltula2", npcGoldenSkulltula.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula3", npcGoldenSkulltula.changedCvar, 32, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gSkulltulaTokenFlameDL, "NPC_GoldenSkulltula4", npcGoldenSkulltula.changedCvar, 33, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula5", npcGoldenSkulltula.changedCvar, 5, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSkulltulaTokenDL, "NPC_GoldenSkulltula6", npcGoldenSkulltula.changedCvar, 6, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula7", npcGoldenSkulltula.changedCvar, 32, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGiSkulltulaTokenFlameDL, "NPC_GoldenSkulltula8", npcGoldenSkulltula.changedCvar, 33, + gsDPSetEnvColor(color.r / 2, color.g / 2, color.b / 2, 255)); + PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula9", npcGoldenSkulltula.changedCvar, 118, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(object_st_DL_003FB0, "NPC_GoldenSkulltula10", npcGoldenSkulltula.changedCvar, 119, + gsDPSetEnvColor(color.r / 4, color.g / 4, color.b / 4, 255)); } static CosmeticOption& npcGerudo = cosmeticOptions.at("NPC.Gerudo"); if (manualChange || CVarGetInteger(npcGerudo.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(npcGerudo.valuesCvar, npcGerudo.defaultColor); - PATCH_GFX(gGerudoPurpleTorsoDL, "NPC_Gerudo1", npcGerudo.changedCvar, 139, gsDPSetEnvColor( color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleRightThighDL, "NPC_Gerudo2", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleLeftThighDL, "NPC_Gerudo3", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleVeilDL, "NPC_Gerudo4", npcGerudo.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleLeftShinDL, "NPC_Gerudo5", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleRightShinDL, "NPC_Gerudo6", npcGerudo.changedCvar, 11, gsDPSetEnvColor(color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleLeftHandDL, "NPC_Gerudo7", npcGerudo.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); - PATCH_GFX(gGerudoPurpleRightHandDL, "NPC_Gerudo8", npcGerudo.changedCvar, 17, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleTorsoDL, "NPC_Gerudo1", npcGerudo.changedCvar, 139, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleRightThighDL, "NPC_Gerudo2", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleLeftThighDL, "NPC_Gerudo3", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleVeilDL, "NPC_Gerudo4", npcGerudo.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleLeftShinDL, "NPC_Gerudo5", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleRightShinDL, "NPC_Gerudo6", npcGerudo.changedCvar, 11, + gsDPSetEnvColor(color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleLeftHandDL, "NPC_Gerudo7", npcGerudo.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gGerudoPurpleRightHandDL, "NPC_Gerudo8", npcGerudo.changedCvar, 17, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& npcMetalTrap = cosmeticOptions.at("NPC.MetalTrap"); if (manualChange || CVarGetInteger(npcMetalTrap.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(npcMetalTrap.valuesCvar, npcMetalTrap.defaultColor); - PATCH_GFX(gSlidingBladeTrapDL, "NPC_MetalTrap1", npcMetalTrap.changedCvar, 59, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); + PATCH_GFX(gSlidingBladeTrapDL, "NPC_MetalTrap1", npcMetalTrap.changedCvar, 59, + gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); } static CosmeticOption& n64LogoRed = cosmeticOptions.at("Title.N64LogoRed"); if (manualChange || CVarGetInteger(n64LogoRed.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(n64LogoRed.valuesCvar, n64LogoRed.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed1", n64LogoRed.changedCvar, 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed2", n64LogoRed.changedCvar, 18, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed1", n64LogoRed.changedCvar, 17, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoRed2", n64LogoRed.changedCvar, 18, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoBlue = cosmeticOptions.at("Title.N64LogoBlue"); if (manualChange || CVarGetInteger(n64LogoBlue.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(n64LogoBlue.valuesCvar, n64LogoBlue.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue1", n64LogoBlue.changedCvar, 29, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue2", n64LogoBlue.changedCvar, 30, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue1", n64LogoBlue.changedCvar, 29, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoBlue2", n64LogoBlue.changedCvar, 30, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoGreen = cosmeticOptions.at("Title.N64LogoGreen"); if (manualChange || CVarGetInteger(n64LogoGreen.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(n64LogoGreen.valuesCvar, n64LogoGreen.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen1", n64LogoGreen.changedCvar, 56, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen2", n64LogoGreen.changedCvar, 57, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen1", n64LogoGreen.changedCvar, 56, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoGreen2", n64LogoGreen.changedCvar, 57, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } static CosmeticOption& n64LogoYellow = cosmeticOptions.at("Title.N64LogoYellow"); if (manualChange || CVarGetInteger(n64LogoYellow.rainbowCvar, 0)) { Color_RGBA8 color = CVarGetColor(n64LogoYellow.valuesCvar, n64LogoYellow.defaultColor); - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow1", n64LogoYellow.changedCvar, 81, gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) - PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow2", n64LogoYellow.changedCvar, 82, gsDPSetEnvColor(color.r, color.g, color.b, 128)); + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow1", n64LogoYellow.changedCvar, 81, + gsDPSetPrimColor(0, 0, 255, 255, 255, 255)) + PATCH_GFX(gNintendo64LogoDL, "Title_N64LogoYellow2", n64LogoYellow.changedCvar, 82, + gsDPSetEnvColor(color.r, color.g, color.b, 128)); } if (gPlayState != nullptr) { @@ -1219,12 +1497,10 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) { } extern "C" Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id) { - return Color_RGBA8 { - (uint8_t)(cosmeticOptions[id].defaultColor.r * 255.0f), + return Color_RGBA8{ (uint8_t)(cosmeticOptions[id].defaultColor.r * 255.0f), (uint8_t)(cosmeticOptions[id].defaultColor.g * 255.0f), (uint8_t)(cosmeticOptions[id].defaultColor.b * 255.0f), - (uint8_t)(cosmeticOptions[id].defaultColor.a * 255.0f) - }; + (uint8_t)(cosmeticOptions[id].defaultColor.a * 255.0f) }; } void Table_InitHeader(bool has_header = true) { @@ -1233,34 +1509,34 @@ void Table_InitHeader(bool has_header = true) { } ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::AlignTextToFramePadding(); //This is to adjust Vertical pos of item in a cell to be normlized. + ImGui::AlignTextToFramePadding(); // This is to adjust Vertical pos of item in a cell to be normlized. ImGui::SetCursorPosX(ImGui::GetCursorPosX() - 2); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - 60); } -void DrawUseMarginsSlider(const std::string ElementName, const std::string CvarName){ +void DrawUseMarginsSlider(const std::string ElementName, const std::string CvarName) { std::string CvarLabel = CvarName + ".UseMargins"; std::string Label = ElementName + " use margins"; UIWidgets::CVarCheckbox(Label.c_str(), CvarLabel.c_str(), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip("Using this allow you move the element with General margins sliders")); + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Using this allow you move the element with General margins sliders")); } void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = true) { std::string CvarLabel = CvarName + ".PosType"; UIWidgets::CVarRadioButton("Original position", CvarLabel.c_str(), 0, - UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR) - .Tooltip("This will use original intended elements position")); + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will use original intended elements position")); UIWidgets::CVarRadioButton("Anchor to the left", CvarLabel.c_str(), 1, - UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR) - .Tooltip("This will make your elements follow the left side of your game window")); + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the left side of your game window")); UIWidgets::CVarRadioButton("Anchor to the right", CvarLabel.c_str(), 2, - UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR) - .Tooltip("This will make your elements follow the right side of your game window")); + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("This will make your elements follow the right side of your game window")); if (NoAnchorEnabled) { UIWidgets::CVarRadioButton( "No anchors", CvarLabel.c_str(), 3, @@ -1273,37 +1549,40 @@ void DrawPositionsRadioBoxes(const std::string CvarName, bool NoAnchorEnabled = UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("This will make your elements hidden")); } -void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX, int MaxX){ +void DrawPositionSlider(const std::string CvarName, int MinY, int MaxY, int MinX, int MaxX) { std::string PosXCvar = CvarName + ".PosX"; std::string PosYCvar = CvarName + ".PosY"; std::string InvisibleLabelX = "##" + PosXCvar; std::string InvisibleLabelY = "##" + PosYCvar; UIWidgets::CVarSliderInt("Up <-> Down : %d", PosYCvar.c_str(), - UIWidgets::IntSliderOptions() - .Min(MinY) - .Max(MaxY) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("This slider is used to move Up and Down your elements.")); + UIWidgets::IntSliderOptions() + .Min(MinY) + .Max(MaxY) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This slider is used to move Up and Down your elements.")); UIWidgets::CVarSliderInt("Left <-> Right : %d", PosXCvar.c_str(), - UIWidgets::IntSliderOptions() - .Min(MinX) - .Max(MaxX) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("This slider is used to move Left and Right your elements.")); + UIWidgets::IntSliderOptions() + .Min(MinX) + .Max(MaxX) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This slider is used to move Left and Right your elements.")); } -void DrawScaleSlider(const std::string CvarName, float DefaultValue){ +void DrawScaleSlider(const std::string CvarName, float DefaultValue) { std::string InvisibleLabel = "##" + CvarName; std::string CvarLabel = CvarName + ".Scale"; - //Disabled for now. feature not done and several fixes needed to be merged. - //UIWidgets::EnhancementSliderFloat("Scale : %dx", InvisibleLabel.c_str(), CvarLabel.c_str(), 0.1f, 3.0f,"",DefaultValue,true); + // Disabled for now. feature not done and several fixes needed to be merged. + // UIWidgets::EnhancementSliderFloat("Scale : %dx", InvisibleLabel.c_str(), CvarLabel.c_str(), + // 0.1f, 3.0f,"",DefaultValue,true); } -void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, const char* Slider_Title, const char* Slider_ID, int MinY, int MaxY, int MinX, int MaxX, float Default_Value) { +void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, + const char* Slider_Title, const char* Slider_ID, int MinY, int MaxY, int MinX, int MaxX, + float Default_Value) { UIWidgets::PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader(Header_Title)) { if (ImGui::BeginTable(Table_ID, 1, FlagsTable)) { @@ -1319,7 +1598,9 @@ void Draw_Table_Dropdown(const char* Header_Title, const char* Table_ID, const c UIWidgets::PopStyleHeader(); } -void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, const char* Slider_Title, const char* Slider_ID, const char* Int_Type, float Slider_Scale_Value) { +void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const char* Column_Title, + const char* Slider_Title, const char* Slider_ID, const char* Int_Type, + float Slider_Scale_Value) { UIWidgets::PushStyleHeader(THEME_COLOR); if (ImGui::CollapsingHeader(Header_Title)) { if (ImGui::BeginTable(Table_ID, 1, FlagsTable)) { @@ -1329,18 +1610,20 @@ void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const cha DrawPositionsRadioBoxes(Slider_ID); s16 Min_X_CU = 0; s16 Max_X_CU = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - if(CVarGetInteger(Int_Type, 0) == 2){ + if (CVarGetInteger(Int_Type, 0) == 2) { Max_X_CU = 294; - } else if(CVarGetInteger(Int_Type, 0) == 3){ + } else if (CVarGetInteger(Int_Type, 0) == 3) { Max_X_CU = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - } else if(CVarGetInteger(Int_Type, 0) == 4){ + } else if (CVarGetInteger(Int_Type, 0) == 4) { Min_X_CU = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } - DrawPositionSlider(Slider_ID, 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_CU, Max_X_CU); + DrawPositionSlider(Slider_ID, 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_CU, + Max_X_CU); DrawScaleSlider(Slider_ID, Slider_Scale_Value); ImGui::EndTable(); } - std::shared_ptr controller = Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0); + std::shared_ptr controller = + Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(0); for (auto [id, mapping] : controller->GetButton(BTN_DDOWN)->GetAllButtonMappings()) { controller->GetButton(BTN_CUSTOM_OCARINA_NOTE_F4)->AddButtonMapping(mapping); } @@ -1357,37 +1640,37 @@ void C_Button_Dropdown(const char* Header_Title, const char* Table_ID, const cha UIWidgets::PopStyleHeader(); } -void Draw_Placements(){ +void Draw_Placements() { UIWidgets::PushStyleHeader(THEME_COLOR); ImGui::SeparatorText("General Margins Settings"); UIWidgets::CVarSliderInt("Top: %dpx", CVAR_COSMETIC("HUD.Margin.T"), - UIWidgets::IntSliderOptions() - .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) - .Max(25) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); UIWidgets::CVarSliderInt("Left: %dpx", CVAR_COSMETIC("HUD.Margin.L"), - UIWidgets::IntSliderOptions() - .Min(-25) - .Max(static_cast(ImGui::GetWindowViewport()->Size.x)) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::IntSliderOptions() + .Min(-25) + .Max(static_cast(ImGui::GetWindowViewport()->Size.x)) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); UIWidgets::CVarSliderInt("Right: %dpx", CVAR_COSMETIC("HUD.Margin.R"), - UIWidgets::IntSliderOptions() - .Min(static_cast(ImGui::GetWindowViewport()->Size.x) * -1) - .Max(25) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.x) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); UIWidgets::CVarSliderInt("Bottom: %dpx", CVAR_COSMETIC("HUD.Margin.B"), - UIWidgets::IntSliderOptions() - .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) - .Max(25) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::IntSliderOptions() + .Min(static_cast(ImGui::GetWindowViewport()->Size.y / 2) * -1) + .Max(25) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); SetMarginAll("All margins on", true, "Set most of the elements to use margins\nSome elements with default position will not be " "affected\nElements without Anchor or Hidden will not be turned on"); @@ -1402,16 +1685,19 @@ void Draw_Placements(){ Table_InitHeader(false); DrawUseMarginsSlider("Hearts counts", CVAR_COSMETIC("HUD.Hearts")); DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.HeartsCount")); - DrawPositionSlider(CVAR_COSMETIC("HUD.HeartsCount"), -22, static_cast(ImGui::GetWindowViewport()->Size.y), -125, static_cast(ImGui::GetWindowViewport()->Size.x)); + DrawPositionSlider(CVAR_COSMETIC("HUD.HeartsCount"), -22, + static_cast(ImGui::GetWindowViewport()->Size.y), -125, + static_cast(ImGui::GetWindowViewport()->Size.x)); DrawScaleSlider(CVAR_COSMETIC("HUD.HeartsCount"), 0.7f); - UIWidgets::CVarSliderInt("Heart line length : %d", CVAR_COSMETIC("HUD.Hearts.LineLength"), - UIWidgets::IntSliderOptions() - .Min(0) - .Max(20) - .DefaultValue(0) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("This will set the length of a row of hearts. Set to 0 for unlimited length.")); + UIWidgets::CVarSliderInt( + "Heart line length : %d", CVAR_COSMETIC("HUD.Hearts.LineLength"), + UIWidgets::IntSliderOptions() + .Min(0) + .Max(20) + .DefaultValue(0) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This will set the length of a row of hearts. Set to 0 for unlimited length.")); ImGui::EndTable(); } } @@ -1426,12 +1712,15 @@ void Draw_Placements(){ UIWidgets::RadioButtonsOptions() .Color(THEME_COLOR) .Tooltip("This will make your elements follow the bottom of the life meter")); - DrawPositionSlider(CVAR_COSMETIC("HUD.MagicBar"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -5, static_cast(ImGui::GetWindowViewport()->Size.x / 2)); + DrawPositionSlider(CVAR_COSMETIC("HUD.MagicBar"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -5, + static_cast(ImGui::GetWindowViewport()->Size.x / 2)); DrawScaleSlider(CVAR_COSMETIC("HUD.MagicBar"), 1.0f); ImGui::EndTable(); } } - if (CVarGetInteger(CVAR_ENHANCEMENT("VisualAgony"), 0) && ImGui::CollapsingHeader("Visual stone of agony position")) { + if (CVarGetInteger(CVAR_ENHANCEMENT("VisualAgony"), 0) && + ImGui::CollapsingHeader("Visual stone of agony position")) { if (ImGui::BeginTable("tabledvisualstoneofagony", 1, FlagsTable)) { ImGui::TableSetupColumn("Visual stone of agony settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); @@ -1439,23 +1728,34 @@ void Draw_Placements(){ DrawPositionsRadioBoxes(CVAR_COSMETIC("HUD.VisualSoA")); s16 Min_X_VSOA = 0; s16 Max_X_VSOA = static_cast(ImGui::GetWindowViewport()->Size.x / 2); - if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_RIGHT){ + if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == ANCHOR_RIGHT) { Max_X_VSOA = 290; - } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == HIDDEN){ + } else if (CVarGetInteger(CVAR_COSMETIC("HUD.VisualSoA.PosType"), 0) == HIDDEN) { Min_X_VSOA = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } - DrawPositionSlider(CVAR_COSMETIC("HUD.VisualSoA"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_VSOA, Max_X_VSOA); + DrawPositionSlider(CVAR_COSMETIC("HUD.VisualSoA"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_VSOA, Max_X_VSOA); DrawScaleSlider(CVAR_COSMETIC("HUD.VisualSoA"), 1.0f); ImGui::EndTable(); } } - Draw_Table_Dropdown("B Button position", "tablebbtn", "B Button settings", "B Button", CVAR_COSMETIC("HUD.BButton"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -1, static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); - Draw_Table_Dropdown("A Button position", "tableabtn", "A Button settings", "A Button", CVAR_COSMETIC("HUD.AButton"), -10, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -20, static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); - Draw_Table_Dropdown("Start Button position", "tablestartbtn", "Start Button settings", "Start Button", CVAR_COSMETIC("HUD.StartButton"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), 0, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 70, 0.75f); - C_Button_Dropdown("C Button Up position", "tablecubtn", "C Button Up settings", "C Button Up", CVAR_COSMETIC("HUD.CUpButton"), CVAR_COSMETIC("HUD.CUpButton.PosType"), 0.5f); - C_Button_Dropdown("C Button Down position", "tablecdbtn", "C Button Down settings", "C Button Down", CVAR_COSMETIC("HUD.CDownButton"), CVAR_COSMETIC("HUD.CDownButton.PosType"), 0.87f); - C_Button_Dropdown("C Button Left position", "tableclbtn", "C Button Left settings", "C Button Left", CVAR_COSMETIC("HUD.CLeftButton"), CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0.87f); - C_Button_Dropdown("C Button Right position", "tablecrbtn", "C Button Right settings", "C Button Right", CVAR_COSMETIC("HUD.CRightButton"), CVAR_COSMETIC("HUD.CRightButton.PosType"), 0.87f); + Draw_Table_Dropdown("B Button position", "tablebbtn", "B Button settings", "B Button", CVAR_COSMETIC("HUD.BButton"), + 0, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -1, + static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); + Draw_Table_Dropdown("A Button position", "tableabtn", "A Button settings", "A Button", CVAR_COSMETIC("HUD.AButton"), + -10, static_cast(ImGui::GetWindowViewport()->Size.y / 4) + 50, -20, + static_cast(ImGui::GetWindowViewport()->Size.x) - 50, 0.95f); + Draw_Table_Dropdown("Start Button position", "tablestartbtn", "Start Button settings", "Start Button", + CVAR_COSMETIC("HUD.StartButton"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), + 0, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 70, 0.75f); + C_Button_Dropdown("C Button Up position", "tablecubtn", "C Button Up settings", "C Button Up", + CVAR_COSMETIC("HUD.CUpButton"), CVAR_COSMETIC("HUD.CUpButton.PosType"), 0.5f); + C_Button_Dropdown("C Button Down position", "tablecdbtn", "C Button Down settings", "C Button Down", + CVAR_COSMETIC("HUD.CDownButton"), CVAR_COSMETIC("HUD.CDownButton.PosType"), 0.87f); + C_Button_Dropdown("C Button Left position", "tableclbtn", "C Button Left settings", "C Button Left", + CVAR_COSMETIC("HUD.CLeftButton"), CVAR_COSMETIC("HUD.CLeftButton.PosType"), 0.87f); + C_Button_Dropdown("C Button Right position", "tablecrbtn", "C Button Right settings", "C Button Right", + CVAR_COSMETIC("HUD.CRightButton"), CVAR_COSMETIC("HUD.CRightButton.PosType"), 0.87f); if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0) && ImGui::CollapsingHeader("DPad items position")) { if (ImGui::BeginTable("tabledpaditems", 1, FlagsTable)) { ImGui::TableSetupColumn("DPad items settings", FlagsCell, TablesCellsWidth); @@ -1469,39 +1769,53 @@ void Draw_Placements(){ } else if (CVarGetInteger(CVAR_COSMETIC("HUD.Dpad.PosType"), 0) == HIDDEN) { Min_X_Dpad = static_cast(ImGui::GetWindowViewport()->Size.x / 2) * -1; } - DrawPositionSlider(CVAR_COSMETIC("HUD.Dpad"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), Min_X_Dpad, Max_X_Dpad); + DrawPositionSlider(CVAR_COSMETIC("HUD.Dpad"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), + Min_X_Dpad, Max_X_Dpad); DrawScaleSlider(CVAR_COSMETIC("HUD.Dpad"), 1.0f); ImGui::EndTable(); } } - Draw_Table_Dropdown("Minimaps position", "tableminimapspos", "minimaps settings", "Minimap", CVAR_COSMETIC("HUD.Minimap"), - static_cast(ImGui::GetWindowViewport()->Size.y / 3) * -1, static_cast(ImGui::GetWindowViewport()->Size.y / 3), static_cast(ImGui::GetWindowViewport()->Size.x) * -1, static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); - Draw_Table_Dropdown("Small Keys counter position", "tablesmolekeys", "Small Keys counter settings", "Small Keys counter", CVAR_COSMETIC("HUD.SmallKey"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 3), -1, static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); - Draw_Table_Dropdown("Rupee counter position", "tablerupeecount", "Rupee counter settings", "Rupee counter", CVAR_COSMETIC("HUD.Rupees"), - -2, static_cast(ImGui::GetWindowViewport()->Size.y / 3), -3, static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); + Draw_Table_Dropdown("Minimaps position", "tableminimapspos", "minimaps settings", "Minimap", + CVAR_COSMETIC("HUD.Minimap"), static_cast(ImGui::GetWindowViewport()->Size.y / 3) * -1, + static_cast(ImGui::GetWindowViewport()->Size.y / 3), + static_cast(ImGui::GetWindowViewport()->Size.x) * -1, + static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); + Draw_Table_Dropdown("Small Keys counter position", "tablesmolekeys", "Small Keys counter settings", + "Small Keys counter", CVAR_COSMETIC("HUD.SmallKey"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 3), -1, + static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); + Draw_Table_Dropdown("Rupee counter position", "tablerupeecount", "Rupee counter settings", "Rupee counter", + CVAR_COSMETIC("HUD.Rupees"), -2, static_cast(ImGui::GetWindowViewport()->Size.y / 3), -3, + static_cast(ImGui::GetWindowViewport()->Size.x / 2), 1.0f); Draw_Table_Dropdown("Carrots position", "tableCarrots", "Carrots settings", "Carrots", CVAR_COSMETIC("HUD.Carrots"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 25, 1.0f); - Draw_Table_Dropdown("Timers position", "tabletimers", "Timers settings", "Timers", CVAR_COSMETIC("HUD.Timers"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); - Draw_Table_Dropdown("Archery Scores position", "tablearchery", "Archery Scores settings", "Archery scores", CVAR_COSMETIC("HUD.ArcheryScore"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); - Draw_Table_Dropdown("Title cards (Maps) position", "tabletcmaps", "Titlecard maps settings", "Title cards (overworld)", CVAR_COSMETIC("HUD.TitleCard.Map"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); - Draw_Table_Dropdown("Title cards (Bosses) position", "tabletcbosses", "Title cards (Bosses) settings", "Title cards (Bosses)", CVAR_COSMETIC("HUD.TitleCard.Boss"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); - Draw_Table_Dropdown("In-game Gameplay Timer position", "tablegameplaytimer", "In-game Gameplay Timer settings", "In-game Gameplay Timer", CVAR_COSMETIC("HUD.IGT"), - 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); + 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 25, 1.0f); + Draw_Table_Dropdown("Timers position", "tabletimers", "Timers settings", "Timers", CVAR_COSMETIC("HUD.Timers"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); + Draw_Table_Dropdown("Archery Scores position", "tablearchery", "Archery Scores settings", "Archery scores", + CVAR_COSMETIC("HUD.ArcheryScore"), 0, static_cast(ImGui::GetWindowViewport()->Size.y / 2), + -50, static_cast(ImGui::GetWindowViewport()->Size.x / 2) - 50, 1.0f); + Draw_Table_Dropdown("Title cards (Maps) position", "tabletcmaps", "Titlecard maps settings", + "Title cards (overworld)", CVAR_COSMETIC("HUD.TitleCard.Map"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); + Draw_Table_Dropdown("Title cards (Bosses) position", "tabletcbosses", "Title cards (Bosses) settings", + "Title cards (Bosses)", CVAR_COSMETIC("HUD.TitleCard.Boss"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); + Draw_Table_Dropdown("In-game Gameplay Timer position", "tablegameplaytimer", "In-game Gameplay Timer settings", + "In-game Gameplay Timer", CVAR_COSMETIC("HUD.IGT"), 0, + static_cast(ImGui::GetWindowViewport()->Size.y / 2), -50, + static_cast(ImGui::GetWindowViewport()->Size.x / 2) + 10, 1.0f); if (ImGui::CollapsingHeader("Enemy Health Bar position")) { if (ImGui::BeginTable("enemyhealthbar", 1, FlagsTable)) { ImGui::TableSetupColumn("Enemy Health Bar settings", FlagsCell, TablesCellsWidth); Table_InitHeader(false); std::string posTypeCVar = CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"); - UIWidgets::CVarRadioButton("Anchor to Enemy", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), - ENEMYHEALTH_ANCHOR_ACTOR, - UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR) - .Tooltip("This will use enemy on screen position")); + UIWidgets::CVarRadioButton( + "Anchor to Enemy", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_ACTOR, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("This will use enemy on screen position")); UIWidgets::CVarRadioButton( "Anchor to the top", CVAR_COSMETIC("HUD.EnemyHealthBar.PosType"), ENEMYHEALTH_ANCHOR_TOP, UIWidgets::RadioButtonsOptions() @@ -1512,22 +1826,23 @@ void Draw_Placements(){ UIWidgets::RadioButtonsOptions() .Color(THEME_COLOR) .Tooltip("This will make your elements follow the bottom edge of your game window")); - DrawPositionSlider(CVAR_COSMETIC("HUD.EnemyHealthBar."), -SCREEN_HEIGHT, SCREEN_HEIGHT, -static_cast(ImGui::GetWindowViewport()->Size.x / 2), static_cast(ImGui::GetWindowViewport()->Size.x / 2)); - if (UIWidgets::CVarSliderInt( - "Health Bar Width: %d", CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value"), - UIWidgets::IntSliderOptions() - .Min(32) - .Max(128) - .DefaultValue(64) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR) - .Tooltip("This will change the width of the health bar"))) { + DrawPositionSlider(CVAR_COSMETIC("HUD.EnemyHealthBar."), -SCREEN_HEIGHT, SCREEN_HEIGHT, + -static_cast(ImGui::GetWindowViewport()->Size.x / 2), + static_cast(ImGui::GetWindowViewport()->Size.x / 2)); + if (UIWidgets::CVarSliderInt("Health Bar Width: %d", CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value"), + UIWidgets::IntSliderOptions() + .Min(32) + .Max(128) + .DefaultValue(64) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR) + .Tooltip("This will change the width of the health bar"))) { CVarSetInteger(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed"), 1); } ImGui::SameLine(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button("Reset##EnemyHealthBarWidth", - UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Value")); CVarClear(CVAR_COSMETIC("HUD.EnemyHealthBar.Width.Changed")); } @@ -1540,8 +1855,7 @@ void Draw_Placements(){ void Reset_Option_Single(const char* Button_Title, const char* name) { ImGui::SameLine(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); - if (UIWidgets::Button(Button_Title, - UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + if (UIWidgets::Button(Button_Title, UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(name); } } @@ -1549,8 +1863,7 @@ void Reset_Option_Single(const char* Button_Title, const char* name) { void Reset_Option_Double(const char* Button_Title, const char* name) { ImGui::SameLine(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); - if (UIWidgets::Button(Button_Title, - UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + if (UIWidgets::Button(Button_Title, UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear((std::string(name) + ".Value").c_str()); CVarClear((std::string(name) + ".Changed").c_str()); } @@ -1562,27 +1875,28 @@ void DrawSillyTab() { UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarCheckbox("Let It Snow", CVAR_GENERAL("LetItSnow"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .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::CheckboxOptions() + .Color(THEME_COLOR) + .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::Separator(true, true, 2.0f, 2.0f); if (UIWidgets::CVarSliderFloat("Link Body Size", CVAR_COSMETIC("Link.BodySize.Value"), - UIWidgets::FloatSliderOptions() - .Format("%.3f") - .Min(0.001f) - .Max(0.05f) - .DefaultValue(0.01f) - .Step(0.001f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR))) { + UIWidgets::FloatSliderOptions() + .Format("%.3f") + .Min(0.001f) + .Max(0.05f) + .DefaultValue(0.01f) + .Step(0.001f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Link.BodySize.Changed"), 1); } ImGui::SameLine(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); if (UIWidgets::Button("Reset##Link_BodySize", - UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("Link.BodySize.Value")); CVarClear(CVAR_COSMETIC("Link.BodySize.Changed")); if (gPlayState != nullptr) { @@ -1595,14 +1909,14 @@ void DrawSillyTab() { UIWidgets::Separator(true, true, 2.0f, 2.0f); if (UIWidgets::CVarSliderFloat("Link Head Scale", CVAR_COSMETIC("Link.HeadScale.Value"), - UIWidgets::FloatSliderOptions() - .Format("%.1fx") - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f) - .Step(0.1f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR))) { + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Link.HeadScale.Changed"), 1); } Reset_Option_Double("Reset##Link_HeadScale", CVAR_COSMETIC("Link.HeadScale")); @@ -1610,14 +1924,14 @@ void DrawSillyTab() { UIWidgets::Separator(true, true, 2.0f, 2.0f); if (UIWidgets::CVarSliderFloat("Link Sword Scale", CVAR_COSMETIC("Link.SwordScale.Value"), - UIWidgets::FloatSliderOptions() - .Format("%.1fx") - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f) - .Step(0.1f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR))) { + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Link.SwordScale.Changed"), 1); } Reset_Option_Double("Reset##Link_SwordScale", CVAR_COSMETIC("Link.SwordScale")); @@ -1625,98 +1939,97 @@ void DrawSillyTab() { UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarSliderFloat("Bunny Hood Length", CVAR_COSMETIC("BunnyHood.EarLength"), - UIWidgets::FloatSliderOptions() - .Format("%.0f") - .Min(-300.0f) - .Max(1000.0f) - .DefaultValue(0.0f) - .Step(10.0f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(-300.0f) + .Max(1000.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##BunnyHood_EarLength", CVAR_COSMETIC("BunnyHood.EarLength")); UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarSliderFloat("Bunny Hood Spread", CVAR_COSMETIC("BunnyHood.EarSpread"), - UIWidgets::FloatSliderOptions() - .Format("%.0f") - .Min(-300.0f) - .Max(500.0f) - .DefaultValue(0.0f) - .Step(10.0f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(-300.0f) + .Max(500.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##BunnyHood_EarSpread", CVAR_COSMETIC("BunnyHood.EarSpread")); UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarSliderFloat("Goron Neck Length", CVAR_COSMETIC("Goron.NeckLength"), - UIWidgets::FloatSliderOptions() - .Format("%.0f") - .Min(0.0f) - .Max(5000.0f) - .DefaultValue(0.0f) - .Step(10.0f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(0.0f) + .Max(5000.0f) + .DefaultValue(0.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Goron_NeckLength", CVAR_COSMETIC("Goron.NeckLength")); UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarCheckbox("Unfix Goron Spin", CVAR_COSMETIC("UnfixGoronSpin"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarSliderFloat("Fairies Size", CVAR_COSMETIC("Fairies.Size"), - UIWidgets::FloatSliderOptions() - .Format("%.1fx") - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f) - .Step(0.1f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Fairies_Size", CVAR_COSMETIC("Fairies.Size")); UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarSliderFloat("N64 Logo Spin Speed", CVAR_COSMETIC("N64Logo.SpinSpeed"), - UIWidgets::FloatSliderOptions() - .Format("%.1fx") - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f) - .Step(0.1f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##N64Logo_SpinSpeed", CVAR_COSMETIC("N64Logo.SpinSpeed")); UIWidgets::Separator(true, true, 2.0f, 2.0f); UIWidgets::CVarSliderFloat("Moon Size", CVAR_COSMETIC("Moon.Size"), - UIWidgets::FloatSliderOptions() - .Format("%.1fx") - .Min(0.1f) - .Max(5.0f) - .DefaultValue(1.0f) - .Step(0.1f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.1fx") + .Min(0.1f) + .Max(5.0f) + .DefaultValue(1.0f) + .Step(0.1f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); Reset_Option_Single("Reset##Moon_Size", CVAR_COSMETIC("Moon.Size")); UIWidgets::Separator(true, true, 2.0f, 2.0f); if (UIWidgets::CVarSliderFloat("Kak Windmill Speed", CVAR_COSMETIC("Kak.Windmill_Speed.Value"), - UIWidgets::FloatSliderOptions() - .Format("%.0f") - .Min(100.0f) - .Max(6000.0f) - .DefaultValue(100.0f) - .Step(10.0f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR))) { + UIWidgets::FloatSliderOptions() + .Format("%.0f") + .Min(100.0f) + .Max(6000.0f) + .DefaultValue(100.0f) + .Step(10.0f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Kak.Windmill_Speed.Changed"), 1); } Reset_Option_Double("Reset##Kak_Windmill_Speed", CVAR_COSMETIC("Kak.Windmill_Speed")); @@ -1728,7 +2041,8 @@ void DrawSillyTab() { // Copies the RGB values from one cosmetic option to another, multiplied by the passed in amount, this // allows you create and use multiple shades of the same color. -void CopyMultipliedColor(CosmeticOption& cosmeticOptionSrc, CosmeticOption& cosmeticOptionTarget, float amount = 0.75f) { +void CopyMultipliedColor(CosmeticOption& cosmeticOptionSrc, CosmeticOption& cosmeticOptionTarget, + float amount = 0.75f) { Color_RGBA8 newColor; newColor.r = static_cast(MIN((cosmeticOptionSrc.currentColor.x * 255.0f) * amount, 255)); newColor.g = static_cast(MIN((cosmeticOptionSrc.currentColor.y * 255.0f) * amount, 255)); @@ -1807,7 +2121,8 @@ void RandomizeColor(CosmeticOption& cosmeticOption) { } void ResetColor(CosmeticOption& cosmeticOption) { - Color_RGBA8 defaultColor = {cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a}; + Color_RGBA8 defaultColor = { cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, + cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a }; cosmeticOption.currentColor.x = defaultColor.r / 255.0f; cosmeticOption.currentColor.y = defaultColor.g / 255.0f; cosmeticOption.currentColor.z = defaultColor.b / 255.0f; @@ -1867,16 +2182,15 @@ void ResetColor(CosmeticOption& cosmeticOption) { } void DrawCosmeticRow(CosmeticOption& cosmeticOption) { - if (UIWidgets::CVarColorPicker(cosmeticOption.label.c_str(), cosmeticOption.cvar, - cosmeticOption.defaultColor, - cosmeticOption.supportsAlpha, 0, THEME_COLOR)) { + if (UIWidgets::CVarColorPicker(cosmeticOption.label.c_str(), cosmeticOption.cvar, cosmeticOption.defaultColor, + cosmeticOption.supportsAlpha, 0, THEME_COLOR)) { CVarSetInteger((cosmeticOption.rainbowCvar), 0); CVarSetInteger((cosmeticOption.changedCvar), 1); ApplySideEffects(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - //the longest option name + // the longest option name ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow)").x * 1.0f) + 60.0f); if (UIWidgets::Button( ("Random##" + cosmeticOption.label).c_str(), @@ -1888,7 +2202,7 @@ void DrawCosmeticRow(CosmeticOption& cosmeticOption) { if (cosmeticOption.supportsRainbow) { ImGui::SameLine(); if (UIWidgets::CVarCheckbox(("Rainbow##" + cosmeticOption.label).c_str(), cosmeticOption.rainbowCvar, - UIWidgets::CheckboxOptions().Color(THEME_COLOR))) { + UIWidgets::CheckboxOptions().Color(THEME_COLOR))) { CVarSetInteger((cosmeticOption.changedCvar), 1); ApplySideEffects(cosmeticOption); ApplyOrResetCustomGfxPatches(); @@ -1898,12 +2212,12 @@ void DrawCosmeticRow(CosmeticOption& cosmeticOption) { ImGui::SameLine(); UIWidgets::CVarCheckbox(("Locked##" + cosmeticOption.label).c_str(), cosmeticOption.lockedCvar, - UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); if (CVarGetInteger((cosmeticOption.changedCvar), 0)) { ImGui::SameLine(); if (UIWidgets::Button(("Reset##" + cosmeticOption.label).c_str(), - UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { ResetColor(cosmeticOption); ApplyOrResetCustomGfxPatches(); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -1916,7 +2230,8 @@ void DrawCosmeticGroup(CosmeticGroup cosmeticGroup) { ImGui::Text("%s", label.c_str()); // the longest option name ImGui::SameLine((ImGui::CalcTextSize("Message Light Blue (None No Shadow)").x * 1.0f) + 60.0f); - if (UIWidgets::Button(("Random##" + label).c_str(), + if (UIWidgets::Button( + ("Random##" + label).c_str(), UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.group == cosmeticGroup && @@ -1929,7 +2244,7 @@ void DrawCosmeticGroup(CosmeticGroup cosmeticGroup) { } ImGui::SameLine(); if (UIWidgets::Button(("Reset##" + label).c_str(), - UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { + UIWidgets::ButtonOptions().Size(ImVec2(80, 31)).Padding(ImVec2(2.0f, 0.0f)))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.group == cosmeticGroup && !CVarGetInteger(cosmeticOption.lockedCvar, 0)) { ResetColor(cosmeticOption); @@ -1939,7 +2254,8 @@ void DrawCosmeticGroup(CosmeticGroup cosmeticGroup) { } UIWidgets::Spacer(); for (auto& [id, cosmeticOption] : cosmeticOptions) { - if (cosmeticOption.group == cosmeticGroup && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { + if (cosmeticOption.group == cosmeticGroup && + (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { DrawCosmeticRow(cosmeticOption); } } @@ -2044,27 +2360,26 @@ void CosmeticsEditorWindow::ApplyDungeonKeyColors() { void CosmeticsEditorWindow::DrawElement() { UIWidgets::CVarCombobox("Color Scheme", CVAR_COSMETIC("DefaultColorScheme"), colorSchemes, - UIWidgets::ComboboxOptions() - .DefaultIndex(COLORSCHEME_N64) - .Color(THEME_COLOR) - .LabelPosition(UIWidgets::LabelPositions::Near) - .ComponentAlignment(UIWidgets::ComponentAlignments::Right)); + UIWidgets::ComboboxOptions() + .DefaultIndex(COLORSCHEME_N64) + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right)); UIWidgets::CVarCheckbox("Sync Rainbow colors", CVAR_COSMETIC("RainbowSync"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::CVarSliderFloat("Rainbow Speed", CVAR_COSMETIC("RainbowSpeed"), - UIWidgets::FloatSliderOptions() - .Format("%.2f") - .Min(0.01f) - .Max(1.0f) - .DefaultValue(0.6f) - .Step(0.01f) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR)); + UIWidgets::FloatSliderOptions() + .Format("%.2f") + .Min(0.01f) + .Max(1.0f) + .DefaultValue(0.6f) + .Step(0.01f) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Randomize All on New Scene", CVAR_COSMETIC("RandomizeAllOnNewScene"), - UIWidgets::CheckboxOptions() - .Color(THEME_COLOR) - .Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene.")); + UIWidgets::CheckboxOptions() + .Color(THEME_COLOR) + .Tooltip("Enables randomizing all unlocked cosmetics when you enter a new scene.")); UIWidgets::CVarCheckbox( "Advanced Mode", CVAR_COSMETIC("AdvancedMode"), UIWidgets::CheckboxOptions() @@ -2076,7 +2391,7 @@ void CosmeticsEditorWindow::DrawElement() { "apply.")); if (CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { if (UIWidgets::Button("Lock All Advanced", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.advancedOption) { CVarSetInteger(cosmeticOption.lockedCvar, 1); @@ -2085,7 +2400,7 @@ void CosmeticsEditorWindow::DrawElement() { } ImGui::SameLine(); if (UIWidgets::Button("Unlock All Advanced", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (cosmeticOption.advancedOption) { CVarSetInteger(cosmeticOption.lockedCvar, 0); @@ -2093,18 +2408,15 @@ void CosmeticsEditorWindow::DrawElement() { } } } - if (UIWidgets::Button("Randomize All", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + if (UIWidgets::Button("Randomize All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { CosmeticsEditor_RandomizeAll(); } ImGui::SameLine(); - if (UIWidgets::Button("Reset All", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + if (UIWidgets::Button("Reset All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { CVarClearBlock("gCosmetics"); ApplyOrResetCustomGfxPatches(); } - if (UIWidgets::Button("Lock All", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + if (UIWidgets::Button("Lock All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { CVarSetInteger(cosmeticOption.lockedCvar, 1); @@ -2112,8 +2424,7 @@ void CosmeticsEditorWindow::DrawElement() { } } ImGui::SameLine(); - if (UIWidgets::Button("Unlock All", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + if (UIWidgets::Button("Unlock All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0)) { CVarSetInteger(cosmeticOption.lockedCvar, 0); @@ -2121,8 +2432,7 @@ void CosmeticsEditorWindow::DrawElement() { } } - if (UIWidgets::Button("Rainbow All", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + if (UIWidgets::Button("Rainbow All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { @@ -2132,8 +2442,7 @@ void CosmeticsEditorWindow::DrawElement() { } } ImGui::SameLine(); - if (UIWidgets::Button("Un-Rainbow All", - UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { + if (UIWidgets::Button("Un-Rainbow All", UIWidgets::ButtonOptions().Size(ImVec2(250.0f, 0.0f)).Color(THEME_COLOR))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { if (!CVarGetInteger(cosmeticOption.lockedCvar, 0) && (!cosmeticOption.advancedOption || CVarGetInteger(CVAR_COSMETIC("AdvancedMode"), 0))) { @@ -2163,9 +2472,8 @@ void CosmeticsEditorWindow::DrawElement() { UIWidgets::Separator(true, true, 2.0f, 2.0f); - if (UIWidgets::Button( - "Give all keys dungeon-specific colors", - UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Give all keys dungeon-specific colors", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { ApplyDungeonKeyColors(); } @@ -2187,19 +2495,18 @@ void CosmeticsEditorWindow::DrawElement() { DrawCosmeticGroup(COSMETICS_GROUP_SPIN_ATTACK); DrawCosmeticGroup(COSMETICS_GROUP_TRAILS); if (UIWidgets::CVarSliderInt("Trails Duration: %d", CVAR_COSMETIC("Trails.Duration.Value"), - UIWidgets::IntSliderOptions() - .Min(2) - .Max(20) - .DefaultValue(4) - .Size(ImVec2(300.0f, 0.0f)) - .Color(THEME_COLOR))) { + UIWidgets::IntSliderOptions() + .Min(2) + .Max(20) + .DefaultValue(4) + .Size(ImVec2(300.0f, 0.0f)) + .Color(THEME_COLOR))) { CVarSetInteger(CVAR_COSMETIC("Trails.Duration.Changed"), 1); } ImGui::SameLine(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (ImGui::CalcTextSize("g").y * 2)); - if (UIWidgets::Button("Reset##Trails_Duration", UIWidgets::ButtonOptions() - .Size(ImVec2(80, 36)) - .Padding(ImVec2(5.0f, 0.0f)))) { + if (UIWidgets::Button("Reset##Trails_Duration", + UIWidgets::ButtonOptions().Size(ImVec2(80, 36)).Padding(ImVec2(5.0f, 0.0f)))) { CVarClear(CVAR_COSMETIC("Trails.Duration.Value")); CVarClear(CVAR_COSMETIC("Trails.Duration.Changed")); } @@ -2257,15 +2564,12 @@ void CosmeticsEditorWindow::DrawElement() { } void RegisterOnLoadGameHook() { - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - ApplyOrResetCustomGfxPatches(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { ApplyOrResetCustomGfxPatches(); }); } void RegisterOnGameFrameUpdateHook() { - GameInteractor::Instance->RegisterGameHook([]() { - CosmeticsUpdateTick(); - }); + GameInteractor::Instance->RegisterGameHook([]() { CosmeticsUpdateTick(); }); } void Cosmetics_RegisterOnSceneInitHook() { @@ -2279,7 +2583,8 @@ void Cosmetics_RegisterOnSceneInitHook() { void CosmeticsEditorWindow::InitElement() { // Convert the `current color` into the format that the ImGui color picker expects for (auto& [id, cosmeticOption] : cosmeticOptions) { - Color_RGBA8 defaultColor = {cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a}; + Color_RGBA8 defaultColor = { cosmeticOption.defaultColor.r, cosmeticOption.defaultColor.g, + cosmeticOption.defaultColor.b, cosmeticOption.defaultColor.a }; Color_RGBA8 cvarColor = CVarGetColor(cosmeticOption.valuesCvar, defaultColor); cosmeticOption.currentColor.x = cvarColor.r / 255.0f; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h index a0a836ce3..6a2b1efd1 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.h @@ -1,8 +1,9 @@ #pragma once #include -// Not to be confused with tabs, groups are 1:1 with the boxes shown in the UI, grouping them allows us to reset/randomize -// every item in a group at once. If you are looking for tabs they are rendered manually in ImGui in `DrawCosmeticsEditor` +// Not to be confused with tabs, groups are 1:1 with the boxes shown in the UI, grouping them allows us to +// reset/randomize every item in a group at once. If you are looking for tabs they are rendered manually in ImGui in +// `DrawCosmeticsEditor` typedef enum { COSMETICS_GROUP_LINK, COSMETICS_GROUP_MIRRORSHIELD, @@ -32,7 +33,7 @@ typedef enum { extern "C" { #endif //__cplusplus - Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id); +Color_RGBA8 CosmeticsEditor_GetDefaultValue(const char* id); #ifdef __cplusplus } @@ -50,7 +51,8 @@ typedef struct { static float TablesCellsWidth = 300.0f; static ImGuiTableColumnFlags FlagsTable = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; -static ImGuiTableColumnFlags FlagsCell = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; +static ImGuiTableColumnFlags FlagsCell = + ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort; void CosmeticsEditor_RandomizeAll(); void CosmeticsEditor_RandomizeGroup(CosmeticGroup group); @@ -65,6 +67,6 @@ class CosmeticsEditorWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; void ApplyDungeonKeyColors(); - void UpdateElement() override {}; + 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 index 7ecdc1f4b..029284fa4 100644 --- a/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp +++ b/soh/soh/Enhancements/cosmetics/CustomLogoTitle.cpp @@ -68,9 +68,10 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD 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); + 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}); + 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 { @@ -79,16 +80,16 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD } 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); + 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); + 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); @@ -99,13 +100,13 @@ extern "C" void CustomLogoTitle_Draw(TitleContext* titleContext, uint8_t logoToD 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)); + (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); + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetEnvColor(POLY_OPA_DISP++, 0, 50, 100, 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gEffIceFragment3DL); } @@ -150,7 +151,7 @@ extern "C" void CustomLogoTitle_Main(TitleContext* titleContext) { gSaveContext.natureAmbienceId = 0xFF; gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN; titleContext->state.running = false; - + logosSeen++; if (CVAR_BOOTSEQUENCE_VALUE == BOOTSEQUENCE_DEFAULT && logosSeen == 1) { @@ -171,7 +172,7 @@ extern "C" void CustomLogoTitle_Main(TitleContext* titleContext) { // // // // // Always -// +// void OnZTitleInitReplaceTitleMainWithCustom(void* gameState) { TitleContext* titleContext = (TitleContext*)gameState; @@ -198,7 +199,7 @@ static RegisterShipInitFunc initFuncAlways(RegisterCustomLogoTitle); // // // // // // // Bootsequence -// +// void OnZTitleUpdateSkipToFileSelect(void* gameState) { TitleContext* titleContext = (TitleContext*)gameState; @@ -219,7 +220,7 @@ static RegisterShipInitFunc initFuncBootsequence(RegisterCustomLogoTitleBootsequ // // // // // // // Let it Snow -// +// #define CVAR_LETITSNOW_NAME CVAR_GENERAL("LetItSnow") #define CVAR_LETITSNOW_DEFAULT 0 diff --git a/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp b/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp index 4d4b26715..be011c675 100644 --- a/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp +++ b/soh/soh/Enhancements/cosmetics/NoMasterSword.cpp @@ -19,10 +19,10 @@ void UpdateNoMSPatch() { bool shouldPatch = (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER && gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS && gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE && - (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE || - (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && - !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) && - !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)))); + (gSaveContext.equips.buttonItems[0] != ITEM_FISHING_POLE || + (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)))); if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) && shouldPatch) { // Patching if conditions are met @@ -38,9 +38,12 @@ void UpdateNoMSPatch() { std::string patchName = "adultNoMS." + std::to_string(3) + "." + std::to_string(i); ResourceMgr_PatchGfxByName(gLinkAdultMirrorShieldSwordAndSheathFarDL, patchName.c_str(), i, gsDPNoOp()); } - ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathNearDL, "adultNoMSHylianShield1", 75, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, "adultNoMSHylianShield2", 71, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathNearDL, "adultNoMasterSword1", 2, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathNearDL, "adultNoMSHylianShield1", 75, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHylianShieldSwordAndSheathFarDL, "adultNoMSHylianShield2", 71, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathNearDL, "adultNoMasterSword1", 2, + gsSPEndDisplayList()); ResourceMgr_PatchGfxByName(gLinkAdultMasterSwordAndSheathFarDL, "adultNoMasterSword2", 2, gsSPEndDisplayList()); } else { // Unpatching if conditions are not met @@ -80,26 +83,27 @@ void RegisterNoMasterSword() { *should = false; } }); - + // skip post pedestal animation when we don't have a master sword COND_VB_SHOULD(VB_EXECUTE_PLAYER_STARTMODE_FUNC, IS_RANDO && MASTER_SWORD_SHUFFLED, { int32_t startMode = va_arg(args, int32_t); Player* player = GET_PLAYER(gPlayState); - if (startMode == PLAYER_START_MODE_TIME_TRAVEL && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { + if (startMode == PLAYER_START_MODE_TIME_TRAVEL && + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { // don't run the vanilla startMode func *should = false; - + // position link correctly Math_Vec3f_Copy(&player->actor.world.pos, &D_808546F4); player->yaw = player->actor.shape.rot.y = -0x8000; - + // execute the idle startMode func Player_StartMode_Idle(gPlayState, player); } }); - COND_HOOK(OnPlayerUpdate, IS_RANDO, []{ + COND_HOOK(OnPlayerUpdate, IS_RANDO, [] { static uint16_t lastItemOnB = gSaveContext.equips.buttonItems[0]; if (lastItemOnB != gSaveContext.equips.buttonItems[0]) { UpdateNoMSPatch(); diff --git a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp index 85e569b33..477fe6f0a 100644 --- a/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp +++ b/soh/soh/Enhancements/cosmetics/authenticGfxPatches.cpp @@ -19,10 +19,8 @@ typedef struct { } DListPatchInfo; static DListPatchInfo freezardBodyDListPatchInfos[] = { - { gFreezardIntactDL, 5 }, - { gFreezardTopRightHornChippedDL, 5 }, - { gFreezardHeadChippedDL, 5 }, - { gFreezardIceTriangleDL, 5 }, + { gFreezardIntactDL, 5 }, { gFreezardTopRightHornChippedDL, 5 }, + { gFreezardHeadChippedDL, 5 }, { gFreezardIceTriangleDL, 5 }, { gFreezardIceRockDL, 5 }, }; @@ -339,7 +337,8 @@ void PatchMirroredSoldOutGI() { void PatchMirroredSunSongEtching() { // Only using these strings for graphics patching lookup, we don't need aligned assets here static const char gRoyalGraveBackRoomDL[] = "__OTR__scenes/shared/hakaana_ouke_scene/hakaana_ouke_room_2DL_005040"; - static const char gRoyalGraveBackRoomSongVtx[] = "__OTR__scenes/shared/hakaana_ouke_scene/hakaana_ouke_room_2Vtx_004F80"; + static const char gRoyalGraveBackRoomSongVtx[] = + "__OTR__scenes/shared/hakaana_ouke_scene/hakaana_ouke_room_2Vtx_004F80"; static Vtx* mirroredSunSongVtx; @@ -365,7 +364,8 @@ void PatchMirroredSunSongEtching() { ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTexture_1", 13, mirroredSunSongTex[1]); ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTexture_2", 17, mirroredSunSongTex[5]); - ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTextureCords_1", 24, gsSPVertex(mirroredSunSongVtx, 4, 0)); + ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTextureCords_1", 24, + gsSPVertex(mirroredSunSongVtx, 4, 0)); // noop as the original vertex command is 128 bit wide ResourceMgr_PatchGfxByName(gRoyalGraveBackRoomDL, "RoyalGraveSunSongTextureCords_2", 25, gsSPNoOp()); } else { diff --git a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h index 0b7eed3e8..fec112c42 100644 --- a/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h +++ b/soh/soh/Enhancements/cosmetics/cosmeticsTypes.h @@ -9,11 +9,11 @@ typedef enum { ENEMYHEALTH_ANCHOR_BOTTOM, } EnemyHealthBarAnchorType; -typedef enum { - ORIGINAL_LOCATION, - ANCHOR_LEFT, - ANCHOR_RIGHT, - ANCHOR_NONE, - HIDDEN, +typedef enum { + ORIGINAL_LOCATION, + ANCHOR_LEFT, + ANCHOR_RIGHT, + ANCHOR_NONE, + HIDDEN, ANCHOR_TO_LIFE_METER, } PosType; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 9d4aec45b..d4c478657 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -16,35 +16,24 @@ static const std::unordered_map textBoxSpecialCharacters = { { "è", 0x95 }, { "é", 0x96 }, { "ê", 0x97 }, { "ë", 0x98 }, { "ï", 0x99 }, { "ô", 0x9A }, { "ö", 0x9B }, { "ù", 0x9C }, { "û", 0x9D }, { "ü", 0x9E } }; -static const std::unordered_map percentColors = { { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, - { "b", QM_BLUE }, { "c", QM_LBLUE }, { "p", QM_PINK }, - { "y", QM_YELLOW }, { "B", QM_BLACK }, }; +static const std::unordered_map percentColors = { + { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, { "b", QM_BLUE }, + { "c", QM_LBLUE }, { "p", QM_PINK }, { "y", QM_YELLOW }, { "B", QM_BLACK }, +}; -static const std::unordered_map colorToPercent = { { QM_WHITE, "%w" }, { QM_RED, "%r"}, { QM_GREEN, "%g" }, - { QM_BLUE, "%b" }, { QM_LBLUE, "%c"}, { QM_PINK, "%p" }, - { QM_YELLOW, "%y" }, { QM_BLACK, "%B" }, }; +static const std::unordered_map colorToPercent = { + { QM_WHITE, "%w" }, { QM_RED, "%r" }, { QM_GREEN, "%g" }, { QM_BLUE, "%b" }, + { QM_LBLUE, "%c" }, { QM_PINK, "%p" }, { QM_YELLOW, "%y" }, { QM_BLACK, "%B" }, +}; static const std::unordered_map altarIcons = { - { "0", ITEM_KOKIRI_EMERALD }, - { "1", ITEM_GORON_RUBY }, - { "2", ITEM_ZORA_SAPPHIRE }, - { "8", ITEM_MEDALLION_LIGHT }, - { "3", ITEM_MEDALLION_FOREST }, - { "4", ITEM_MEDALLION_FIRE }, - { "5", ITEM_MEDALLION_WATER }, - { "6", ITEM_MEDALLION_SPIRIT }, - { "7", ITEM_MEDALLION_SHADOW }, - { "l", ITEM_ARROW_LIGHT }, - { "b", ITEM_KEY_BOSS }, - { "o", ITEM_SWORD_MASTER }, - { "c", ITEM_OCARINA_FAIRY }, - { "i", ITEM_OCARINA_TIME }, - { "L", ITEM_BOW_ARROW_LIGHT }, - { "k", ITEM_TUNIC_KOKIRI }, - { "m", ITEM_DUNGEON_MAP }, - { "C", ITEM_COMPASS }, - { "s", ITEM_SKULL_TOKEN }, - { "g", ITEM_MASK_GORON }, + { "0", ITEM_KOKIRI_EMERALD }, { "1", ITEM_GORON_RUBY }, { "2", ITEM_ZORA_SAPPHIRE }, + { "8", ITEM_MEDALLION_LIGHT }, { "3", ITEM_MEDALLION_FOREST }, { "4", ITEM_MEDALLION_FIRE }, + { "5", ITEM_MEDALLION_WATER }, { "6", ITEM_MEDALLION_SPIRIT }, { "7", ITEM_MEDALLION_SHADOW }, + { "l", ITEM_ARROW_LIGHT }, { "b", ITEM_KEY_BOSS }, { "o", ITEM_SWORD_MASTER }, + { "c", ITEM_OCARINA_FAIRY }, { "i", ITEM_OCARINA_TIME }, { "L", ITEM_BOW_ARROW_LIGHT }, + { "k", ITEM_TUNIC_KOKIRI }, { "m", ITEM_DUNGEON_MAP }, { "C", ITEM_COMPASS }, + { "s", ITEM_SKULL_TOKEN }, { "g", ITEM_MASK_GORON }, }; static std::map pixelWidthTable = { @@ -77,14 +66,15 @@ static std::map pixelWidthTable = { CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_, TextBoxPosition position_) - : type(type_), position(position_){ + : type(type_), position(position_) { messages[LANGUAGE_ENG] = std::move(english_); messages[LANGUAGE_GER] = std::move(german_); messages[LANGUAGE_FRA] = std::move(french_); } -CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, - std::vector capital_, TextBoxType type_, TextBoxPosition position_) { +CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, + std::vector colors_, std::vector capital_, TextBoxType type_, + TextBoxPosition position_) { messages[LANGUAGE_ENG] = std::move(english_); messages[LANGUAGE_GER] = std::move(german_); messages[LANGUAGE_FRA] = std::move(french_); @@ -99,7 +89,8 @@ CustomMessage::CustomMessage(std::string english_, TextBoxType type_, TextBoxPos messages[LANGUAGE_ENG] = std::move(english_); } -CustomMessage::CustomMessage(std::string english_, std::vector colors_, std::vector capital_, TextBoxType type_, TextBoxPosition position_){ +CustomMessage::CustomMessage(std::string english_, std::vector colors_, std::vector capital_, + TextBoxType type_, TextBoxPosition position_) { messages[LANGUAGE_ENG] = std::move(english_); colors = colors_; capital = capital_; @@ -107,7 +98,7 @@ CustomMessage::CustomMessage(std::string english_, std::vector colo position = position_; } -CustomMessage::CustomMessage(Text text, TextBoxType type_,TextBoxPosition position_) +CustomMessage::CustomMessage(Text text, TextBoxType type_, TextBoxPosition position_) : type(type_), position(position_) { messages[LANGUAGE_ENG] = text.GetEnglish(); messages[LANGUAGE_GER] = text.GetGerman(); @@ -141,7 +132,7 @@ CustomMessage CustomMessage::LoadVanillaMessageTableEntry(uint16_t textId) { TextBoxPosition position = static_cast(msgEntry->typePos & 0xF); TextBoxType type = static_cast(msgEntry->typePos >> 4); // uint8_t icon = msgEntry->segment[1]; - std::string message = std::string(msgEntry->segment , msgEntry->msgSize); + std::string message = std::string(msgEntry->segment, msgEntry->msgSize); msg = CustomMessage(message, type, position); // msg.Format(static_cast(icon)); return msg; @@ -151,7 +142,6 @@ CustomMessage CustomMessage::LoadVanillaMessageTableEntry(uint16_t textId) { return CustomMessage(); } - const std::string CustomMessage::GetEnglish(MessageFormat format) const { return GetForLanguage(LANGUAGE_ENG, format); } @@ -174,22 +164,22 @@ const std::string CustomMessage::GetForLanguage(uint8_t language, MessageFormat return output; } -const std::vector CustomMessage::GetAllMessages(MessageFormat format) const{ +const std::vector CustomMessage::GetAllMessages(MessageFormat format) const { std::vector output = messages; - for (auto str : output){ + for (auto str : output) { ProcessMessageFormat(str, format); } return output; } void CustomMessage::ProcessMessageFormat(std::string& str, MessageFormat format) const { - if (format == MF_FORMATTED){ + if (format == MF_FORMATTED) { FormatString(str); - } else if (format == MF_CLEAN){ + } else if (format == MF_CLEAN) { CleanString(str); - } else if (format == MF_AUTO_FORMAT){ + } else if (format == MF_AUTO_FORMAT) { AutoFormatString(str); - }else if (format == MF_ENCODE){ + } else if (format == MF_ENCODE) { EncodeColors(str); } } @@ -198,14 +188,14 @@ const std::vector& CustomMessage::GetCapital() const { return capital; } -void CustomMessage::SetCapital(std::vector capital_){ +void CustomMessage::SetCapital(std::vector capital_) { capital = capital_; } const std::vector& CustomMessage::GetColors() const { return colors; } -void CustomMessage::SetColors(std::vector colors_){ +void CustomMessage::SetColors(std::vector colors_) { colors = colors_; } @@ -213,7 +203,7 @@ const TextBoxType& CustomMessage::GetTextBoxType() const { return type; } -void CustomMessage::SetTextBoxType(TextBoxType boxType){ +void CustomMessage::SetTextBoxType(TextBoxType boxType) { type = boxType; } @@ -224,19 +214,19 @@ const TextBoxPosition& CustomMessage::GetTextBoxPosition() const { CustomMessage CustomMessage::operator+(const CustomMessage& right) const { std::vector newColors = colors; std::vector rColors = right.GetColors(); - for (auto color: rColors){ + for (auto color : rColors) { newColors.push_back(color); } std::vector newCapital = capital; newCapital.insert(newCapital.end(), right.GetCapital().begin(), right.GetCapital().end()); return CustomMessage(messages[LANGUAGE_ENG] + right.GetEnglish(MF_RAW), messages[LANGUAGE_GER] + right.GetGerman(MF_RAW), - messages[LANGUAGE_FRA] + right.GetFrench(MF_RAW), - newColors, newCapital, type, position); + messages[LANGUAGE_FRA] + right.GetFrench(MF_RAW), newColors, newCapital, type, position); } CustomMessage CustomMessage::operator+(const std::string& right) const { - return CustomMessage(messages[LANGUAGE_ENG] + right, messages[LANGUAGE_GER] + right, messages[LANGUAGE_FRA] + right); + return CustomMessage(messages[LANGUAGE_ENG] + right, messages[LANGUAGE_GER] + right, + messages[LANGUAGE_FRA] + right); } void CustomMessage::operator+=(const CustomMessage& right) { @@ -258,8 +248,8 @@ bool CustomMessage::operator==(const CustomMessage& operand) const { } bool CustomMessage::operator==(const std::string& operand) const { - for (auto str: messages){ - if (str == operand){ + for (auto str : messages) { + if (str == operand) { return true; } } @@ -291,7 +281,7 @@ void CustomMessage::Replace(std::string&& oldStr, CustomMessage newMessage) { } void CustomMessage::Format(ItemID iid) { - for (std::string &str : messages) { + for (std::string& str : messages) { str.insert(0, ITEM_OBTAINED(iid)); size_t start_pos = 0; std::replace(str.begin(), str.end(), '&', NEWLINE()[0]); @@ -341,7 +331,7 @@ void CustomMessage::FormatString(std::string& str) const { str += MESSAGE_END(); } -void DeleteControlCode(std::string& str, std::string code){ +void DeleteControlCode(std::string& str, std::string code) { size_t start_pos = 0; while ((start_pos = str.find(code, start_pos)) != std::string::npos) { str.replace(start_pos, code.length(), ""); @@ -362,56 +352,57 @@ void CustomMessage::CleanString(std::string& str) const { } static size_t NextLineLength(const std::string* textStr, const size_t lastNewline, bool hasIcon = false) { - const size_t maxLinePixelWidth = hasIcon ? 200 : 216; + const size_t maxLinePixelWidth = hasIcon ? 200 : 216; - size_t totalPixelWidth = 0; - size_t currentPos = lastNewline; + size_t totalPixelWidth = 0; + size_t currentPos = lastNewline; - // Looping through the string from the lastNewline until the total - // width of counted characters exceeds the maximum pixels in a line. - size_t nextPosJump = 0; - while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { - // Skip over control codes - if (textStr->at(currentPos) == '%') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '$') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '@') { - nextPosJump = 1; - // Assume worst case for player name 12 * 8 (widest character * longest name length) - totalPixelWidth += 96; - } else if (textStr->at(currentPos) == '\x05') { - // Skip colour control characters. - nextPosJump = 2; - } else if (textStr->at(currentPos) == '\x1E') { - //For the high score char, we have to take the next Char, then use that to get a worst case scenario. - if (textStr->at(currentPos+1) == '\x01'){ - totalPixelWidth += 28; - } - nextPosJump = 2; - } else { - // Some characters only one byte while others are two bytes - // So check both possibilities when checking for a character - if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; - nextPosJump = 1; - } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 2)]; - nextPosJump = 2; - } else { - SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" + textStr->substr(currentPos, 2)); - SPDLOG_DEBUG("Full string: " + *textStr); - nextPosJump = 1; - } + // Looping through the string from the lastNewline until the total + // width of counted characters exceeds the maximum pixels in a line. + size_t nextPosJump = 0; + while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { + // Skip over control codes + if (textStr->at(currentPos) == '%') { + nextPosJump = 2; + } else if (textStr->at(currentPos) == '$') { + nextPosJump = 2; + } else if (textStr->at(currentPos) == '@') { + nextPosJump = 1; + // Assume worst case for player name 12 * 8 (widest character * longest name length) + totalPixelWidth += 96; + } else if (textStr->at(currentPos) == '\x05') { + // Skip colour control characters. + nextPosJump = 2; + } else if (textStr->at(currentPos) == '\x1E') { + // For the high score char, we have to take the next Char, then use that to get a worst case scenario. + if (textStr->at(currentPos + 1) == '\x01') { + totalPixelWidth += 28; + } + nextPosJump = 2; + } else { + // Some characters only one byte while others are two bytes + // So check both possibilities when checking for a character + if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { + totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; + nextPosJump = 1; + } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { + totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 2)]; + nextPosJump = 2; + } else { + SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" + + textStr->substr(currentPos, 2)); + SPDLOG_DEBUG("Full string: " + *textStr); + nextPosJump = 1; + } + } + currentPos += nextPosJump; + } + // return the total number of characters we looped through + if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { + return currentPos - lastNewline - nextPosJump; + } else { + return currentPos - lastNewline; } - currentPos += nextPosJump; - } - // return the total number of characters we looped through - if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { - return currentPos - lastNewline - nextPosJump; - } else { - return currentPos - lastNewline; - } } size_t CustomMessage::FindNEWLINE(std::string& str, size_t lastNewline) const { @@ -488,19 +479,19 @@ void CustomMessage::AutoFormatString(std::string& str) const { const size_t lastSpace = str.rfind(' ', lastNewline + lineLength); size_t waitForInput = str.find(WAIT_FOR_INPUT()[0], lastNewline); size_t newLine = FindNEWLINE(str, lastNewline); - if (carrot < waitForInput){ + if (carrot < waitForInput) { waitForInput = carrot; } - if (ampersand < newLine){ + if (ampersand < newLine) { newLine = ampersand; } - if (lineCount != 3 && yesNo < lastNewline + lineLength && yesNo < waitForInput && yesNo < newLine){ - if (lineCount >= 4){ + if (lineCount != 3 && yesNo < lastNewline + lineLength && yesNo < waitForInput && yesNo < newLine) { + if (lineCount >= 4) { str.replace(yesNo, 1, "^&&\x1B"); lineCount = 3; lastNewline = yesNo + 3; } else { - while(lineCount < 3){ + while (lineCount < 3) { str.replace(yesNo, 1, "&\x1B"); yesNo++; lineCount++; @@ -508,7 +499,7 @@ void CustomMessage::AutoFormatString(std::string& str) const { lastNewline = yesNo; } } else { - if (lineCount < 4){ + if (lineCount < 4) { // replace '&' first if it's within the newline range if (newLine < lastNewline + lineLength) { lastNewline = newLine + 1; @@ -526,12 +517,12 @@ void CustomMessage::AutoFormatString(std::string& str) const { lastNewline = lastSpace + 1; } lineCount += 1; - } else { + } else { const size_t lastColor = str.rfind("\x05"s, lastNewline + lineLength); std::string colorText = ""; - //check if we are on a non default colour, as ^ resets it, and readd if needed - if (lastColor != std::string::npos && str[lastColor+1] != 0){ - colorText = "\x05"s + str[lastColor+1]; + // check if we are on a non default colour, as ^ resets it, and readd if needed + if (lastColor != std::string::npos && str[lastColor + 1] != 0) { + colorText = "\x05"s + str[lastColor + 1]; } // replace '&' first if it's within the newline range if (ampersand < lastNewline + lineLength) { @@ -564,7 +555,7 @@ void CustomMessage::AutoFormatString(std::string& str) const { str += MESSAGE_END(); } -void CustomMessage::InsertNumber(uint8_t num){ +void CustomMessage::InsertNumber(uint8_t num) { for (std::string& str : messages) { size_t firstBar = str.find('|'); if (firstBar != std::string::npos) { @@ -581,12 +572,11 @@ void CustomMessage::InsertNumber(uint8_t num){ } } } - //remove the remaining bar + // remove the remaining bar this->Replace("|", ""); Replace("[[d]]", std::to_string(num)); } - void CustomMessage::Capitalize() { for (std::string str : messages) { (str)[0] = std::toupper((str)[0]); @@ -625,7 +615,7 @@ const char* Interface_ReplaceSpecialCharacters(char text[]) { } void CustomMessage::EncodeColors(std::string& str) const { - for (std::string color: colors) { + for (std::string color : colors) { if (const size_t firstHashtag = str.find('#'); firstHashtag != std::string::npos) { str.replace(firstHashtag, 1, colorToPercent.at(color)); if (const size_t secondHashtag = str.find('#', firstHashtag + 1); secondHashtag != std::string::npos) { @@ -664,13 +654,13 @@ void CustomMessage::ReplaceAltarIcons(std::string& str) const { } } -void CustomMessage::InsertNames(std::vector toInsert){ - for(uint8_t a = 0; a < toInsert.size(); a++){ +void CustomMessage::InsertNames(std::vector toInsert) { + for (uint8_t a = 0; a < toInsert.size(); a++) { CustomMessage temp = toInsert[a]; - if ((capital.size() > a) && (capital[a] = true)){ + if ((capital.size() > a) && (capital[a] = true)) { temp.Capitalize(); - } - Replace("[[" + std::to_string(a+1) + "]]", temp); + } + Replace("[[" + std::to_string(a + 1) + "]]", temp); } } @@ -735,16 +725,16 @@ CustomMessage CustomMessageManager::RetrieveMessage(std::string tableID, uint16_ } CustomMessage message = foundMessage->second; - if (format == MF_FORMATTED){ + if (format == MF_FORMATTED) { message.Format(); - } else if (format == MF_AUTO_FORMAT){ + } else if (format == MF_AUTO_FORMAT) { message.AutoFormat(); - } else if (format == MF_CLEAN){ + } else if (format == MF_CLEAN) { message.Clean(); - } else if (format == MF_ENCODE){ + } else if (format == MF_ENCODE) { message.Encode(); } - + return message; } @@ -758,7 +748,7 @@ bool CustomMessageManager::ClearMessageTable(std::string tableID) { return true; } -bool CustomMessageManager::AddCustomMessageTable(std::string tableID) { +bool CustomMessageManager::AddCustomMessageTable(std::string tableID) { CustomMessageTable newMessageTable; return messageTables.emplace(tableID, newMessageTable).second; } diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 0720d8ac4..71ae423b5 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -20,7 +20,7 @@ #define QM_YELLOW "\x46" #define QM_BLACK "\x47" -#define HS_HORSE_ARCHERY "\x00"s //HS_HBA is an enum already +#define HS_HORSE_ARCHERY "\x00"s // HS_HBA is an enum already typedef enum { MF_FORMATTED, @@ -41,21 +41,24 @@ class CustomMessage { CustomMessage() = default; CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, std::vector capital_ = {}, - TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - CustomMessage(std::string english_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); - CustomMessage(std::string english_, std::vector colors_, std::vector capital_ = {}, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, + std::vector capital_ = {}, TextBoxType type_ = TEXTBOX_TYPE_BLACK, + TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, + TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, std::vector colors_, std::vector capital_ = {}, + TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); CustomMessage(Text text, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); static CustomMessage LoadVanillaMessageTableEntry(uint16_t textId); - static std::string MESSAGE_END() ; - static std::string ITEM_OBTAINED(uint8_t x) ; - static std::string NEWLINE() ; - static std::string COLOR(std::string x) ; - static std::string POINTS(std::string x) ;//HIGH_SCORE is also a macro - static std::string WAIT_FOR_INPUT() ; - static std::string PLAYER_NAME() ; + static std::string MESSAGE_END(); + static std::string ITEM_OBTAINED(uint8_t x); + static std::string NEWLINE(); + static std::string COLOR(std::string x); + static std::string POINTS(std::string x); // HIGH_SCORE is also a macro + static std::string WAIT_FOR_INPUT(); + static std::string PLAYER_NAME(); const std::string GetEnglish(MessageFormat format = MF_FORMATTED) const; const std::string GetFrench(MessageFormat format = MF_FORMATTED) const; @@ -157,13 +160,13 @@ class CustomMessage { void Format(); /** - * @brief formats the message specifically to fit in OoT's + * @brief formats the message specifically to fit in OoT's * textboxes, and use it's formatting. */ void AutoFormat(); /** - * @brief Removes all OoT formatting from the message, + * @brief Removes all OoT formatting from the message, * making it a good form for writing into spoiler logs. */ void Clean(); @@ -179,15 +182,15 @@ class CustomMessage { * . i.e. special characters, colors, newlines, wait for input, etc. */ void FormatString(std::string& str) const; - + /** * @brief finds NEWLINEs in a string, while filtering * /x01's that are used as opperands */ size_t FindNEWLINE(std::string& str, size_t lastNewline) const; - + /** - * @brief formats the string specifically to fit in OoT's + * @brief formats the string specifically to fit in OoT's * textboxes, and use it's formatting. * RANDOTODO whoever knows exactly what this does check my adaption */ @@ -200,7 +203,7 @@ class CustomMessage { void CleanString(std::string& str) const; private: - std::vector messages = {"","",""}; + std::vector messages = { "", "", "" }; TextBoxType type = TEXTBOX_TYPE_BLACK; TextBoxPosition position = TEXTBOX_POS_BOTTOM; std::vector colors = {}; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 4a039987e..e7c559857 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -11,7 +11,7 @@ typedef enum { TEXT_SKULLTULA_PEOPLE_STARTING_TO_WEAKEN = 0x0024, TEXT_SKULLTULA_PEOPLE_WE_LOOK_LIKE_THIS = 0x0025, TEXT_SKULLTULA_PEOPLE_GS_TUTORIAL = 0x0026, - TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH = 0x0027, + TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH = 0x0027, TEXT_SKULLTULA_PEOPLE_CURSE_HAS_BEEN_BROKEN = 0x0028, TEXT_SKULLTULA_PEOPLE_SAVING_MY_KIDS = 0x0029, TEXT_ITEM_KEY_SMALL = 0x0060, @@ -96,7 +96,7 @@ typedef enum { TEXT_MALON_HOW_IS_EPONA_DOING = 0x2001, TEXT_MALON_EPONA_LOOKS_GREAT = 0x2002, TEXT_MALON_OBSTICLE_COURSE = 0x2003, - TEXT_MALON_EVERYONE_TURNING_EVIL = 0x204C, + TEXT_MALON_EVERYONE_TURNING_EVIL = 0x204C, TEXT_MALON_I_SING_THIS_SONG = 0x2050, TEXT_MALON_EVERYONE_LIKED_SONG = 0x2051, TEXT_MALON_EPONA_LIKED_SONG = 0x2052, @@ -211,6 +211,6 @@ typedef struct { { giid, iid, message, message, message } #define GIMESSAGE_NO_GERMAN(giid, iid, english, french) \ - { giid, iid, english, english, french } + { giid, iid, english, english, french } #endif diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 1420ad287..db5cc824f 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -36,10 +36,17 @@ extern PlayState* gPlayState; #define CMD_REGISTER Ship::Context::GetInstance()->GetConsole()->AddCommand // TODO: Commands should be using the output passed in. -#define ERROR_MESSAGE std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->SendErrorMessage -#define INFO_MESSAGE std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->SendInfoMessage +#define ERROR_MESSAGE \ + std::reinterpret_pointer_cast( \ + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) \ + ->SendErrorMessage +#define INFO_MESSAGE \ + std::reinterpret_pointer_cast( \ + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) \ + ->SendInfoMessage -static bool ActorSpawnHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ActorSpawnHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if ((args.size() != 9) && (args.size() != 3) && (args.size() != 6)) { ERROR_MESSAGE("Not enough arguments passed to actorspawn"); return 1; @@ -100,7 +107,8 @@ static bool ActorSpawnHandler(std::shared_ptr Console, const std: return 0; } -static bool KillPlayerHandler(std::shared_ptr Console, const std::vector&, std::string* output) { +static bool KillPlayerHandler(std::shared_ptr Console, const std::vector&, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::SetPlayerHealth(); dynamic_cast(effect)->parameters[0] = 0; GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -113,7 +121,8 @@ static bool KillPlayerHandler(std::shared_ptr Console, const std: } } -static bool SetPlayerHealthHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SetPlayerHealthHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -144,7 +153,8 @@ static bool SetPlayerHealthHandler(std::shared_ptr Console, const } } -static bool LoadSceneHandler(std::shared_ptr Console, const std::vector&, std::string* output) { +static bool LoadSceneHandler(std::shared_ptr Console, const std::vector&, + std::string* output) { gSaveContext.respawnFlag = 0; gSaveContext.seqId = 0xFF; gSaveContext.gameMode = GAMEMODE_NORMAL; @@ -152,7 +162,8 @@ static bool LoadSceneHandler(std::shared_ptr Console, const std:: return 0; } -static bool RupeeHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool RupeeHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { return 1; } @@ -160,8 +171,7 @@ static bool RupeeHandler(std::shared_ptr Console, const std::vect int rupeeAmount; try { rupeeAmount = std::stoi(args[1]); - } - catch (std::invalid_argument const& ex) { + } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Rupee count must be an integer."); return 1; } @@ -171,13 +181,14 @@ static bool RupeeHandler(std::shared_ptr Console, const std::vect return 1; } - gSaveContext.rupees = rupeeAmount; + gSaveContext.rupees = rupeeAmount; INFO_MESSAGE("Set rupee count to %u", rupeeAmount); return 0; } -static bool SetPosHandler(std::shared_ptr Console, const std::vector args, std::string* output) { +static bool SetPosHandler(std::shared_ptr Console, const std::vector args, + std::string* output) { if (gPlayState == nullptr) { ERROR_MESSAGE("PlayState == nullptr"); return 1; @@ -186,9 +197,8 @@ static bool SetPosHandler(std::shared_ptr Console, const std::vec Player* player = GET_PLAYER(gPlayState); if (args.size() == 1) { - INFO_MESSAGE("Player position is [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, - player->actor.world.pos.y, - player->actor.world.pos.z); + INFO_MESSAGE("Player position is [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, player->actor.world.pos.y, + player->actor.world.pos.z); return 0; } if (args.size() < 4) @@ -198,9 +208,8 @@ static bool SetPosHandler(std::shared_ptr Console, const std::vec player->actor.world.pos.y = std::stof(args[2]); player->actor.world.pos.z = std::stof(args[3]); - INFO_MESSAGE("Set player position to [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, - player->actor.world.pos.y, - player->actor.world.pos.z); + INFO_MESSAGE("Set player position to [ %.2f, %.2f, %.2f ]", player->actor.world.pos.x, player->actor.world.pos.y, + player->actor.world.pos.z); return 0; } @@ -215,14 +224,13 @@ static bool ResetHandler(std::shared_ptr Console, std::vector ammoItems{ - { "sticks", ITEM_STICK }, { "nuts", ITEM_NUT }, - { "bombs", ITEM_BOMB }, { "seeds", ITEM_SLINGSHOT }, - { "arrows", ITEM_BOW }, { "bombchus", ITEM_BOMBCHU }, - { "beans", ITEM_BEAN }, +const static std::map ammoItems{ + { "sticks", ITEM_STICK }, { "nuts", ITEM_NUT }, { "bombs", ITEM_BOMB }, { "seeds", ITEM_SLINGSHOT }, + { "arrows", ITEM_BOW }, { "bombchus", ITEM_BOMBCHU }, { "beans", ITEM_BEAN }, }; -static bool AddAmmoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool AddAmmoHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -243,7 +251,8 @@ static bool AddAmmoHandler(std::shared_ptr Console, const std::ve const auto& it = ammoItems.find(args[1]); if (it == ammoItems.end()) { - ERROR_MESSAGE("Invalid ammo type. Options are 'sticks', 'nuts', 'bombs', 'seeds', 'arrows', 'bombchus' and 'beans'"); + ERROR_MESSAGE( + "Invalid ammo type. Options are 'sticks', 'nuts', 'bombs', 'seeds', 'arrows', 'bombchus' and 'beans'"); return 1; } @@ -261,7 +270,8 @@ static bool AddAmmoHandler(std::shared_ptr Console, const std::ve } } -static bool TakeAmmoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool TakeAmmoHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -302,13 +312,22 @@ static bool TakeAmmoHandler(std::shared_ptr Console, const std::v } const static std::map bottleItems{ - { "green_potion", ITEM_POTION_GREEN }, { "red_potion", ITEM_POTION_RED }, { "blue_potion", ITEM_POTION_BLUE }, - { "milk", ITEM_MILK }, { "half_milk", ITEM_MILK_HALF }, { "fairy", ITEM_FAIRY }, - { "bugs", ITEM_BUG }, { "fish", ITEM_FISH }, { "poe", ITEM_POE }, - { "big_poe", ITEM_BIG_POE }, { "blue_fire", ITEM_BLUE_FIRE }, { "rutos_letter", ITEM_LETTER_RUTO }, + { "green_potion", ITEM_POTION_GREEN }, + { "red_potion", ITEM_POTION_RED }, + { "blue_potion", ITEM_POTION_BLUE }, + { "milk", ITEM_MILK }, + { "half_milk", ITEM_MILK_HALF }, + { "fairy", ITEM_FAIRY }, + { "bugs", ITEM_BUG }, + { "fish", ITEM_FISH }, + { "poe", ITEM_POE }, + { "big_poe", ITEM_BIG_POE }, + { "blue_fire", ITEM_BLUE_FIRE }, + { "rutos_letter", ITEM_LETTER_RUTO }, }; -static bool BottleHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BottleHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -329,7 +348,7 @@ static bool BottleHandler(std::shared_ptr Console, const std::vec const auto& it = bottleItems.find(args[1]); - if (it == bottleItems.end()) { + if (it == bottleItems.end()) { ERROR_MESSAGE("Invalid item passed"); return 1; } @@ -340,7 +359,8 @@ static bool BottleHandler(std::shared_ptr Console, const std::vec return 0; } -static bool BHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -350,7 +370,8 @@ static bool BHandler(std::shared_ptr Console, const std::vector Console, const std::vector& args, std::string* output) { +static bool ItemHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -361,7 +382,8 @@ static bool ItemHandler(std::shared_ptr Console, const std::vecto return 0; } -static bool GiveItemHandler(std::shared_ptr Console, const std::vector args, std::string* output) { +static bool GiveItemHandler(std::shared_ptr Console, const std::vector args, + std::string* output) { if (args.size() < 3) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -382,7 +404,8 @@ static bool GiveItemHandler(std::shared_ptr Console, const std::v return 0; } -static bool EntranceHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool EntranceHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -404,15 +427,16 @@ static bool EntranceHandler(std::shared_ptr Console, const std::v return 0; } -static bool VoidHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool VoidHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (gPlayState != nullptr) { - gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; - gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; - gSaveContext.respawnFlag = 1; - gPlayState->transitionTrigger = TRANS_TRIGGER_START; - gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; - gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; - gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; + gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; + gSaveContext.respawnFlag = 1; + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex; + gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; } else { ERROR_MESSAGE("gPlayState == nullptr"); return 1; @@ -420,7 +444,8 @@ static bool VoidHandler(std::shared_ptr Console, const std::vecto return 0; } -static bool ReloadHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ReloadHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (gPlayState != nullptr) { gPlayState->nextEntranceIndex = gSaveContext.entranceIndex; gPlayState->transitionTrigger = TRANS_TRIGGER_START; @@ -433,11 +458,10 @@ static bool ReloadHandler(std::shared_ptr Console, const std::vec return 0; } -const static std::map fw_options { - { "clear", 0}, {"warp", 1}, {"backup", 2} -}; +const static std::map fw_options{ { "clear", 0 }, { "warp", 1 }, { "backup", 2 } }; -static bool FWHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FWHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -448,16 +472,16 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< ERROR_MESSAGE("[SOH] Invalid option. Options are 'clear', 'warp', 'backup'"); return 1; } - + if (gPlayState != nullptr) { FaroresWindData clear = {}; - switch(it->second) { - case 0: //clear + switch (it->second) { + case 0: // clear gSaveContext.fw = clear; INFO_MESSAGE("[SOH] Farore's wind point cleared! Reload scene to take effect."); return 0; break; - case 1: //warp + case 1: // warp if (gSaveContext.respawn[RESPAWN_MODE_TOP].data > 0) { gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex; @@ -468,7 +492,7 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< } return 0; break; - case 2: //backup + case 2: // backup if (CVarGetInteger(CVAR_ENHANCEMENT("BetterFarore"), 0)) { gSaveContext.fw = gSaveContext.ship.backupFW; gSaveContext.fw.set = 1; @@ -480,16 +504,16 @@ static bool FWHandler(std::shared_ptr Console, const std::vector< } break; } - } - else { + } else { ERROR_MESSAGE("gPlayState == nullptr"); return 1; } - + return 0; } -static bool FileSelectHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FileSelectHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (gGameState == nullptr) { ERROR_MESSAGE("gGameState == nullptr"); return 1; @@ -501,12 +525,14 @@ static bool FileSelectHandler(std::shared_ptr Console, const std: return 0; } -static bool QuitHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool QuitHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { Ship::Context::GetInstance()->GetWindow()->Close(); return 0; } -static bool SaveStateHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SaveStateHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot(); const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE }); @@ -522,7 +548,8 @@ static bool SaveStateHandler(std::shared_ptr Console, const std:: } } -static bool LoadStateHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool LoadStateHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot(); const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::LOAD }); @@ -542,10 +569,10 @@ static bool LoadStateHandler(std::shared_ptr Console, const std:: default: return 1; } - } -static bool StateSlotSelectHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool StateSlotSelectHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -565,12 +592,12 @@ static bool StateSlotSelectHandler(std::shared_ptr Console, const } OTRGlobals::Instance->gSaveStateMgr->SetCurrentSlot(slot); - INFO_MESSAGE("[SOH] Slot %u selected", - OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot()); + INFO_MESSAGE("[SOH] Slot %u selected", OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot()); return 0; } -static bool InvisibleHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool InvisibleHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -585,19 +612,19 @@ static bool InvisibleHandler(std::shared_ptr Console, const std:: } RemovableGameInteractionEffect* effect = new GameInteractionEffect::InvisibleLink(); - GameInteractionEffectQueryResult result = + GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Invisible Link %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s Invisible Link.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s Invisible Link.", state ? "enable" : "disable"); return 1; } } -static bool GiantLinkHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GiantLinkHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -619,13 +646,13 @@ static bool GiantLinkHandler(std::shared_ptr Console, const std:: INFO_MESSAGE("[SOH] Giant Link %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s Giant Link.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s Giant Link.", state ? "enable" : "disable"); return 1; } } -static bool MinishLinkHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool MinishLinkHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -647,13 +674,13 @@ static bool MinishLinkHandler(std::shared_ptr Console, const std: INFO_MESSAGE("[SOH] Minish Link %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s Minish Link.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s Minish Link.", state ? "enable" : "disable"); return 1; } } -static bool AddHeartContainerHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool AddHeartContainerHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -684,7 +711,8 @@ static bool AddHeartContainerHandler(std::shared_ptr Console, con } } -static bool RemoveHeartContainerHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool RemoveHeartContainerHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -715,7 +743,8 @@ static bool RemoveHeartContainerHandler(std::shared_ptr Console, } } -static bool GravityHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GravityHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -724,12 +753,13 @@ static bool GravityHandler(std::shared_ptr Console, const std::ve GameInteractionEffectBase* effect = new GameInteractionEffect::ModifyGravity(); try { - dynamic_cast(effect)->parameters[0] = Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); + dynamic_cast(effect)->parameters[0] = + Ship::Math::clamp(std::stoi(args[1], nullptr, 10), GI_GRAVITY_LEVEL_LIGHT, GI_GRAVITY_LEVEL_HEAVY); } catch (std::invalid_argument const& ex) { ERROR_MESSAGE("[SOH] Gravity value must be a number."); return 1; } - + GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { INFO_MESSAGE("[SOH] Updated gravity."); @@ -740,7 +770,8 @@ static bool GravityHandler(std::shared_ptr Console, const std::ve } } -static bool NoUIHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool NoUIHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -753,7 +784,7 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vecto ERROR_MESSAGE("[SOH] No UI value must be a number."); return 1; } - + RemovableGameInteractionEffect* effect = new GameInteractionEffect::NoUI(); GameInteractionEffectQueryResult result = state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); @@ -762,13 +793,13 @@ static bool NoUIHandler(std::shared_ptr Console, const std::vecto INFO_MESSAGE("[SOH] No UI %s", state ? "enabled" : "disabled"); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not %s No UI.", - state ? "enable" : "disable"); + INFO_MESSAGE("[SOH] Command failed: Could not %s No UI.", state ? "enable" : "disable"); return 1; } } -static bool FreezeHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FreezeHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::FreezePlayer(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -781,7 +812,8 @@ static bool FreezeHandler(std::shared_ptr Console, const std::vec } } -static bool DefenseModifierHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool DefenseModifierHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -797,7 +829,8 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { - INFO_MESSAGE("[SOH] Defense modifier set to %d", dynamic_cast(effect)->parameters[0]); + INFO_MESSAGE("[SOH] Defense modifier set to %d", + dynamic_cast(effect)->parameters[0]); return 0; } else { INFO_MESSAGE("[SOH] Command failed: Could not set defense modifier."); @@ -805,7 +838,8 @@ static bool DefenseModifierHandler(std::shared_ptr Console, const } } -static bool DamageHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool DamageHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -835,7 +869,8 @@ static bool DamageHandler(std::shared_ptr Console, const std::vec } } -static bool HealHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool HealHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -865,7 +900,8 @@ static bool HealHandler(std::shared_ptr Console, const std::vecto } } -static bool FillMagicHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool FillMagicHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::FillMagic(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -878,7 +914,8 @@ static bool FillMagicHandler(std::shared_ptr Console, const std:: } } -static bool EmptyMagicHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool EmptyMagicHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::EmptyMagic(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -891,12 +928,13 @@ static bool EmptyMagicHandler(std::shared_ptr Console, const std: } } -static bool NoZHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { - if (args.size() < 2) { +static bool NoZHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { + if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; } - uint8_t state; + uint8_t state; try { state = std::stoi(args[1], nullptr, 10) == 0 ? 0 : 1; @@ -913,13 +951,13 @@ static bool NoZHandler(std::shared_ptr Console, const std::vector INFO_MESSAGE("[SOH] NoZ " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " NoZ."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " NoZ."); return 1; } } -static bool OneHitKOHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool OneHitKOHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -941,13 +979,13 @@ static bool OneHitKOHandler(std::shared_ptr Console, const std::v INFO_MESSAGE("[SOH] One-hit KO " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " One-hit KO."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " One-hit KO."); return 1; } } -static bool PacifistHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool PacifistHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -969,13 +1007,13 @@ static bool PacifistHandler(std::shared_ptr Console, const std::v INFO_MESSAGE("[SOH] Pacifist " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Pacifist."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " Pacifist."); return 1; } } -static bool PaperLinkHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool PaperLinkHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -998,13 +1036,13 @@ static bool PaperLinkHandler(std::shared_ptr Console, const std:: INFO_MESSAGE("[SOH] Paper Link " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Paper Link."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " Paper Link."); return 1; } } -static bool RainstormHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool RainstormHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1026,13 +1064,13 @@ static bool RainstormHandler(std::shared_ptr Console, const std:: INFO_MESSAGE("[SOH] Rainstorm " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Rainstorm."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + " Rainstorm."); return 1; } } -static bool ReverseControlsHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ReverseControlsHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1051,17 +1089,17 @@ static bool ReverseControlsHandler(std::shared_ptr Console, const state ? GameInteractor::ApplyEffect(effect) : GameInteractor::RemoveEffect(effect); if (result == GameInteractionEffectQueryResult::Possible) { - INFO_MESSAGE("[SOH] Reverse controls " + - std::string(state ? "enabled" : "disabled")); + INFO_MESSAGE("[SOH] Reverse controls " + std::string(state ? "enabled" : "disabled")); return 0; } else { - INFO_MESSAGE("[SOH] Command failed: Could not " + - std::string(state ? "enable" : "disable") + " Reverse controls."); + INFO_MESSAGE("[SOH] Command failed: Could not " + std::string(state ? "enable" : "disable") + + " Reverse controls."); return 1; } } -static bool UpdateRupeesHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool UpdateRupeesHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1085,7 +1123,8 @@ static bool UpdateRupeesHandler(std::shared_ptr Console, const st } } -static bool SpeedModifierHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SpeedModifierHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1109,13 +1148,14 @@ static bool SpeedModifierHandler(std::shared_ptr Console, const s } } -const static std::map boots { +const static std::map boots{ { "kokiri", EQUIP_VALUE_BOOTS_KOKIRI }, { "iron", EQUIP_VALUE_BOOTS_IRON }, { "hover", EQUIP_VALUE_BOOTS_HOVER }, }; -static bool BootsHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BootsHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1140,13 +1180,14 @@ static bool BootsHandler(std::shared_ptr Console, const std::vect } } -const static std::map shields { +const static std::map shields{ { "deku", ITEM_SHIELD_DEKU }, { "hylian", ITEM_SHIELD_HYLIAN }, { "mirror", ITEM_SHIELD_MIRROR }, }; -static bool GiveShieldHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GiveShieldHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1171,7 +1212,8 @@ static bool GiveShieldHandler(std::shared_ptr Console, const std: } } -static bool TakeShieldHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool TakeShieldHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1196,7 +1238,8 @@ static bool TakeShieldHandler(std::shared_ptr Console, const std: } } -static bool KnockbackHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool KnockbackHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1226,7 +1269,8 @@ static bool KnockbackHandler(std::shared_ptr Console, const std:: } } -static bool ElectrocuteHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool ElectrocuteHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::ElectrocutePlayer(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -1239,7 +1283,8 @@ static bool ElectrocuteHandler(std::shared_ptr Console, const std } } -static bool BurnHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool BurnHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectBase* effect = new GameInteractionEffect::BurnPlayer(); GameInteractionEffectQueryResult result = GameInteractor::ApplyEffect(effect); @@ -1252,7 +1297,8 @@ static bool BurnHandler(std::shared_ptr Console, const std::vecto } } -static bool CuccoStormHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool CuccoStormHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { GameInteractionEffectQueryResult result = GameInteractor::RawAction::SpawnActor(ACTOR_EN_NIW, 0); if (result == GameInteractionEffectQueryResult::Possible) { @@ -1264,7 +1310,8 @@ static bool CuccoStormHandler(std::shared_ptr Console, const std: } } -static bool GenerateRandoHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool GenerateRandoHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() == 1) { if (GenerateRandomizer()) { return 0; @@ -1279,7 +1326,7 @@ static bool GenerateRandoHandler(std::shared_ptr Console, const s seed = "seed_testing_count"; } - if (GenerateRandomizer(seed + std::to_string(value))){ + if (GenerateRandomizer(seed + std::to_string(value))) { return 0; } } catch (std::invalid_argument const& ex) { @@ -1287,36 +1334,36 @@ static bool GenerateRandoHandler(std::shared_ptr Console, const s return 1; } - ERROR_MESSAGE("[SOH] Rando generation already in progress"); return 1; } -static constexpr std::array, COSMETICS_GROUP_MAX> cosmetic_groups = {{ - {"link", COSMETICS_GROUP_LINK}, - {"mirror_shield", COSMETICS_GROUP_MIRRORSHIELD}, - {"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}, - {"title", COSMETICS_GROUP_TITLE}, - {"npc", COSMETICS_GROUP_NPC}, - {"world", COSMETICS_GROUP_WORLD}, - {"magic", COSMETICS_GROUP_MAGIC}, - {"arrows", COSMETICS_GROUP_ARROWS}, - {"spin_attack", COSMETICS_GROUP_SPIN_ATTACK}, - {"trials", COSMETICS_GROUP_TRAILS}, - {"navi", COSMETICS_GROUP_NAVI}, - {"ivan", COSMETICS_GROUP_IVAN}, - {"message", COSMETICS_GROUP_MESSAGE}, -}}; +static constexpr std::array, COSMETICS_GROUP_MAX> cosmetic_groups = { { + { "link", COSMETICS_GROUP_LINK }, + { "mirror_shield", COSMETICS_GROUP_MIRRORSHIELD }, + { "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 }, + { "title", COSMETICS_GROUP_TITLE }, + { "npc", COSMETICS_GROUP_NPC }, + { "world", COSMETICS_GROUP_WORLD }, + { "magic", COSMETICS_GROUP_MAGIC }, + { "arrows", COSMETICS_GROUP_ARROWS }, + { "spin_attack", COSMETICS_GROUP_SPIN_ATTACK }, + { "trials", COSMETICS_GROUP_TRAILS }, + { "navi", COSMETICS_GROUP_NAVI }, + { "ivan", COSMETICS_GROUP_IVAN }, + { "message", COSMETICS_GROUP_MESSAGE }, +} }; -static bool CosmeticsHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool CosmeticsHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1357,18 +1404,13 @@ static bool CosmeticsHandler(std::shared_ptr Console, const std:: } static std::map sfx_groups = { - {"bgm", SEQ_BGM_WORLD}, - {"fanfares", SEQ_FANFARE}, - {"events", SEQ_BGM_EVENT}, - {"battle", SEQ_BGM_BATTLE}, - {"ocarina", SEQ_OCARINA}, - {"instruments", SEQ_INSTRUMENT}, - {"sfx", SEQ_SFX}, - {"voices", SEQ_VOICE}, - {"custom", SEQ_BGM_CUSTOM}, + { "bgm", SEQ_BGM_WORLD }, { "fanfares", SEQ_FANFARE }, { "events", SEQ_BGM_EVENT }, + { "battle", SEQ_BGM_BATTLE }, { "ocarina", SEQ_OCARINA }, { "instruments", SEQ_INSTRUMENT }, + { "sfx", SEQ_SFX }, { "voices", SEQ_VOICE }, { "custom", SEQ_BGM_CUSTOM }, }; -static bool SfxHandler(std::shared_ptr Console, const std::vector& args, std::string* output) { +static bool SfxHandler(std::shared_ptr Console, const std::vector& args, + std::string* output) { if (args.size() < 2) { ERROR_MESSAGE("[SOH] Unexpected arguments passed"); return 1; @@ -1410,192 +1452,261 @@ static bool SfxHandler(std::shared_ptr Console, const std::vector void DebugConsole_Init(void) { // Console - CMD_REGISTER("file_select", {FileSelectHandler, "Returns to the file select."}); - CMD_REGISTER("reset", {ResetHandler, "Resets the game."}); - CMD_REGISTER("quit", {QuitHandler, "Quits the game."}); + CMD_REGISTER("file_select", { FileSelectHandler, "Returns to the file select." }); + CMD_REGISTER("reset", { ResetHandler, "Resets the game." }); + CMD_REGISTER("quit", { QuitHandler, "Quits the game." }); // Save States - CMD_REGISTER("save_state", {SaveStateHandler, "Save a state."}); - CMD_REGISTER("load_state", {LoadStateHandler, "Load a state."}); - CMD_REGISTER("set_slot", {StateSlotSelectHandler, "Selects a SaveState slot", { - {"Slot number", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("save_state", { SaveStateHandler, "Save a state." }); + CMD_REGISTER("load_state", { LoadStateHandler, "Load a state." }); + CMD_REGISTER("set_slot", { StateSlotSelectHandler, + "Selects a SaveState slot", + { + { "Slot number", Ship::ArgumentType::NUMBER }, + } }); // Map & Location - CMD_REGISTER("void", {VoidHandler, "Voids out of the current map."}); - CMD_REGISTER("reload", {ReloadHandler, "Reloads the current map."}); - CMD_REGISTER("fw", {FWHandler, "Spawns the player where Farore's Wind is set.", { - {"clear|warp|backup", Ship::ArgumentType::TEXT}, - }}); - CMD_REGISTER("entrance", {EntranceHandler, "Sends player to the entered entrance (hex)", { - {"entrance", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("void", { VoidHandler, "Voids out of the current map." }); + CMD_REGISTER("reload", { ReloadHandler, "Reloads the current map." }); + CMD_REGISTER("fw", { FWHandler, + "Spawns the player where Farore's Wind is set.", + { + { "clear|warp|backup", Ship::ArgumentType::TEXT }, + } }); + CMD_REGISTER("entrance", { EntranceHandler, + "Sends player to the entered entrance (hex)", + { + { "entrance", Ship::ArgumentType::NUMBER }, + } }); // Gameplay - CMD_REGISTER("kill", {KillPlayerHandler, "Commit suicide."}); + CMD_REGISTER("kill", { KillPlayerHandler, "Commit suicide." }); - CMD_REGISTER("map", {LoadSceneHandler, "Load up kak?"}); + CMD_REGISTER("map", { LoadSceneHandler, "Load up kak?" }); - CMD_REGISTER("rupee", {RupeeHandler, "Set your rupee counter.", { - {"amount", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("rupee", { RupeeHandler, + "Set your rupee counter.", + { + { "amount", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("bItem", {BHandler, "Set an item to the B button.", { - {"Item ID", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("bItem", { BHandler, + "Set an item to the B button.", + { + { "Item ID", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("spawn", { ActorSpawnHandler, "Spawn an actor.", { { "actor name/id", Ship::ArgumentType::NUMBER }, // TODO there should be an actor_id arg type - {"data", Ship::ArgumentType::NUMBER}, - {"x", Ship::ArgumentType::NUMBER, true}, - {"y", Ship::ArgumentType::NUMBER, true}, - {"z", Ship::ArgumentType::NUMBER, true}, - {"rx", Ship::ArgumentType::NUMBER, true}, - {"ry", Ship::ArgumentType::NUMBER, true}, - {"rz", Ship::ArgumentType::NUMBER, true}, - }}); + CMD_REGISTER("spawn", + { ActorSpawnHandler, + "Spawn an actor.", + { + { "actor name/id", Ship::ArgumentType::NUMBER }, // TODO there should be an actor_id arg type + { "data", Ship::ArgumentType::NUMBER }, + { "x", Ship::ArgumentType::NUMBER, true }, + { "y", Ship::ArgumentType::NUMBER, true }, + { "z", Ship::ArgumentType::NUMBER, true }, + { "rx", Ship::ArgumentType::NUMBER, true }, + { "ry", Ship::ArgumentType::NUMBER, true }, + { "rz", Ship::ArgumentType::NUMBER, true }, + } }); - CMD_REGISTER("pos", {SetPosHandler, "Sets the position of the player.", { - {"x", Ship::ArgumentType::NUMBER, true}, - {"y", Ship::ArgumentType::NUMBER, true}, - {"z", Ship::ArgumentType::NUMBER, true}, - }}); + CMD_REGISTER("pos", { SetPosHandler, + "Sets the position of the player.", + { + { "x", Ship::ArgumentType::NUMBER, true }, + { "y", Ship::ArgumentType::NUMBER, true }, + { "z", Ship::ArgumentType::NUMBER, true }, + } }); - CMD_REGISTER("addammo", {AddAmmoHandler, "Adds ammo of an item.", { - {"sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT}, - {"count", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("addammo", { AddAmmoHandler, + "Adds ammo of an item.", + { + { "sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT }, + { "count", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("takeammo", {TakeAmmoHandler, "Removes ammo of an item.", { - {"sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT}, - {"count", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("takeammo", { TakeAmmoHandler, + "Removes ammo of an item.", + { + { "sticks|nuts|bombs|seeds|arrows|bombchus|beans", Ship::ArgumentType::TEXT }, + { "count", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("bottle", {BottleHandler, "Changes item in a bottle slot.", { - {"item", Ship::ArgumentType::TEXT}, - {"slot", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("bottle", { BottleHandler, + "Changes item in a bottle slot.", + { + { "item", Ship::ArgumentType::TEXT }, + { "slot", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("give_item", {GiveItemHandler, "Gives an item to the player as if it was given from an actor", { - {"vanilla|randomizer", Ship::ArgumentType::TEXT}, - {"giveItemID", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("give_item", { GiveItemHandler, + "Gives an item to the player as if it was given from an actor", + { + { "vanilla|randomizer", Ship::ArgumentType::TEXT }, + { "giveItemID", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("item", {ItemHandler, "Sets item ID in arg 1 into slot arg 2. No boundary checks. Use with caution.", { - {"slot", Ship::ArgumentType::NUMBER}, - {"item id", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("item", { ItemHandler, + "Sets item ID in arg 1 into slot arg 2. No boundary checks. Use with caution.", + { + { "slot", Ship::ArgumentType::NUMBER }, + { "item id", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("invisible", {InvisibleHandler, "Activate Link's Elvish cloak, making him appear invisible.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("invisible", { InvisibleHandler, + "Activate Link's Elvish cloak, making him appear invisible.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("giant_link", {GiantLinkHandler, "Turn Link into a giant Lonky boi.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("giant_link", { GiantLinkHandler, + "Turn Link into a giant Lonky boi.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("minish_link", {MinishLinkHandler, "Turn Link into a minish boi.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("minish_link", { MinishLinkHandler, + "Turn Link into a minish boi.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); CMD_REGISTER("add_heart_container", - {AddHeartContainerHandler, "Give Link a heart! The maximum amount of hearts is 20!"}); + { AddHeartContainerHandler, "Give Link a heart! The maximum amount of hearts is 20!" }); CMD_REGISTER("remove_heart_container", - {RemoveHeartContainerHandler, "Remove a heart from Link. The minimal amount of hearts is 3."}); + { RemoveHeartContainerHandler, "Remove a heart from Link. The minimal amount of hearts is 3." }); - CMD_REGISTER("gravity", {GravityHandler, "Set gravity level.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("gravity", { GravityHandler, + "Set gravity level.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("no_ui", {NoUIHandler, "Disables the UI.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("no_ui", { NoUIHandler, + "Disables the UI.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("freeze", {FreezeHandler, "Freezes Link in place"}); + CMD_REGISTER("freeze", { FreezeHandler, "Freezes Link in place" }); - CMD_REGISTER("defense_modifier", {DefenseModifierHandler, "Sets the defense modifier.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("defense_modifier", { DefenseModifierHandler, + "Sets the defense modifier.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("damage", {DamageHandler, "Deal damage to Link.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("damage", { DamageHandler, + "Deal damage to Link.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("heal", {HealHandler, "Heals Link.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("heal", { HealHandler, + "Heals Link.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("fill_magic", {FillMagicHandler, "Fills magic."}); + CMD_REGISTER("fill_magic", { FillMagicHandler, "Fills magic." }); - CMD_REGISTER("empty_magic", {EmptyMagicHandler, "Empties magic."}); + CMD_REGISTER("empty_magic", { EmptyMagicHandler, "Empties magic." }); - CMD_REGISTER("no_z", {NoZHandler, "Disables Z-button presses.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("no_z", { NoZHandler, + "Disables Z-button presses.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("ohko", {OneHitKOHandler, - "Activates one hit KO. Any damage kills Link and he cannot gain health in this mode.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("ohko", { OneHitKOHandler, + "Activates one hit KO. Any damage kills Link and he cannot gain health in this mode.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("pacifist", {PacifistHandler, "Activates pacifist mode. Prevents Link from using his weapon.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("pacifist", { PacifistHandler, + "Activates pacifist mode. Prevents Link from using his weapon.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("paper_link", {PaperLinkHandler, "Link but made out of paper.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("paper_link", { PaperLinkHandler, + "Link but made out of paper.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("rainstorm", {RainstormHandler, "Activates rainstorm."}); + CMD_REGISTER("rainstorm", { RainstormHandler, "Activates rainstorm." }); - CMD_REGISTER("reverse_controls", {ReverseControlsHandler, "Reverses the controls.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("reverse_controls", { ReverseControlsHandler, + "Reverses the controls.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("update_rupees", {UpdateRupeesHandler, "Adds rupees.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("update_rupees", { UpdateRupeesHandler, + "Adds rupees.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("speed_modifier", {SpeedModifierHandler, "Sets the speed modifier.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("speed_modifier", { SpeedModifierHandler, + "Sets the speed modifier.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("boots", {BootsHandler, "Activates boots.", { - {"kokiri|iron|hover", Ship::ArgumentType::TEXT}, - }}); + CMD_REGISTER("boots", { BootsHandler, + "Activates boots.", + { + { "kokiri|iron|hover", Ship::ArgumentType::TEXT }, + } }); - CMD_REGISTER("giveshield", {GiveShieldHandler, "Gives a shield and equips it when Link is the right age for it.", { - {"deku|hylian|mirror", Ship::ArgumentType::TEXT}, - }}); + CMD_REGISTER("giveshield", { GiveShieldHandler, + "Gives a shield and equips it when Link is the right age for it.", + { + { "deku|hylian|mirror", Ship::ArgumentType::TEXT }, + } }); - CMD_REGISTER("takeshield", {TakeShieldHandler, "Takes a shield and unequips it if Link is wearing it.", { - {"deku|hylian|mirror", Ship::ArgumentType::TEXT}, - }}); + CMD_REGISTER("takeshield", { TakeShieldHandler, + "Takes a shield and unequips it if Link is wearing it.", + { + { "deku|hylian|mirror", Ship::ArgumentType::TEXT }, + } }); - CMD_REGISTER("knockback", {KnockbackHandler, "Knocks Link back.", { - {"value", Ship::ArgumentType::NUMBER}, - }}); + CMD_REGISTER("knockback", { KnockbackHandler, + "Knocks Link back.", + { + { "value", Ship::ArgumentType::NUMBER }, + } }); - CMD_REGISTER("electrocute", {ElectrocuteHandler, "Electrocutes Link."}); + CMD_REGISTER("electrocute", { ElectrocuteHandler, "Electrocutes Link." }); - CMD_REGISTER("burn", {BurnHandler, "Burns Link."}); + CMD_REGISTER("burn", { BurnHandler, "Burns Link." }); - CMD_REGISTER("cucco_storm", {CuccoStormHandler, "Cucco Storm"}); + CMD_REGISTER("cucco_storm", { CuccoStormHandler, "Cucco Storm" }); - CMD_REGISTER("gen_rando", {GenerateRandoHandler, "Generate a randomizer seed", { - {"seed|count", Ship::ArgumentType::NUMBER, true}, - {"testing", Ship::ArgumentType::NUMBER, true}, - }}); + CMD_REGISTER("gen_rando", { GenerateRandoHandler, + "Generate a randomizer seed", + { + { "seed|count", Ship::ArgumentType::NUMBER, true }, + { "testing", Ship::ArgumentType::NUMBER, true }, + } }); - CMD_REGISTER("cosmetics", {CosmeticsHandler, "Change cosmetics.", { - {"reset|randomize", Ship::ArgumentType::TEXT}, - {"group name", Ship::ArgumentType::TEXT, true}, - }}); + CMD_REGISTER("cosmetics", { CosmeticsHandler, + "Change cosmetics.", + { + { "reset|randomize", Ship::ArgumentType::TEXT }, + { "group name", Ship::ArgumentType::TEXT, true }, + } }); - CMD_REGISTER("sfx", {SfxHandler, "Change SFX.", { - {"reset|randomize", Ship::ArgumentType::TEXT}, - {"group_name", Ship::ArgumentType::TEXT, true}, - }}); + CMD_REGISTER("sfx", { SfxHandler, + "Change SFX.", + { + { "reset|randomize", Ship::ArgumentType::TEXT }, + { "group_name", Ship::ArgumentType::TEXT, true }, + } }); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index c7d83e6ea..fef875e94 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -29,7 +29,8 @@ void MessageViewer::DrawElement() { ImGui::Text("Table ID"); ImGui::SameLine(); PushStyleInput(THEME_COLOR); - ImGui::InputText("##TableID", mTableIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); + ImGui::InputText("##TableID", mTableIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, + UIWidgets::TextFilters::FilterAlphaNum); UIWidgets::InsertHelpHoverText("Leave blank for vanilla table"); ImGui::Text("Text ID"); ImGui::SameLine(); @@ -41,7 +42,8 @@ void MessageViewer::DrawElement() { case HEXADECIMAL: default: ImGui::InputText("##TextID", mTextIdBuf, MAX_STRING_SIZE, ImGuiInputTextFlags_CharsHexadecimal); - UIWidgets::InsertHelpHoverText("Hexadecimal Text ID of the message to load. Hexadecimal digits only (0-9/A-F)."); + UIWidgets::InsertHelpHoverText( + "Hexadecimal Text ID of the message to load. Hexadecimal digits only (0-9/A-F)."); break; } PopStyleInput(); @@ -169,8 +171,7 @@ void FindMessage(PlayState* play, const uint16_t textId, const uint8_t language) font->msgLength = nextSeg - foundSeg; } -static const char* msgStaticTbl[] = -{ +static const char* msgStaticTbl[] = { gDefaultMessageBackgroundTex, gSignMessageBackgroundTex, gNoteStaffMessageBackgroundTex, @@ -201,13 +202,14 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan FindMessage(play, textId, language); msgCtx->msgLength = static_cast(font->msgLength); const uintptr_t src = font->msgOffset; - memcpy(font->msgBuf, reinterpret_cast(src), font->msgLength); + memcpy(font->msgBuf, reinterpret_cast(src), font->msgLength); } else { constexpr int maxBufferSize = sizeof(font->msgBuf); const CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(tableId, textId); font->charTexBuf[0] = (messageEntry.GetTextBoxType() << 4) | messageEntry.GetTextBoxPosition(); switch (language) { - font->msgLength = SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); + font->msgLength = + SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); } msgCtx->msgLength = static_cast(font->msgLength); } @@ -258,8 +260,6 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan void MessageDebug_DisplayCustomMessage(const char* customMessage) { CustomMessageManager::Instance->ClearMessageTable(MessageViewer::TABLE_ID); CustomMessageManager::Instance->CreateMessage(MessageViewer::TABLE_ID, 0, - CustomMessage(customMessage, customMessage, customMessage)); + CustomMessage(customMessage, customMessage, customMessage)); MessageDebug_StartTextBox(MessageViewer::TABLE_ID, 0, 0); } - - diff --git a/soh/soh/Enhancements/debugger/MessageViewer.h b/soh/soh/Enhancements/debugger/MessageViewer.h index 43ae55aa7..20924a0b6 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.h +++ b/soh/soh/Enhancements/debugger/MessageViewer.h @@ -25,9 +25,8 @@ void MessageDebug_DisplayCustomMessage(const char* customMessage); #ifdef __cplusplus } - class MessageViewer : public Ship::GuiWindow { -public: + public: static inline const char* TABLE_ID = "MessageViewer"; using GuiWindow::GuiWindow; @@ -37,12 +36,12 @@ public: virtual ~MessageViewer() = default; -private: + private: void DisplayExistingMessage() const; void DisplayCustomMessage() const; static constexpr uint16_t MAX_STRING_SIZE = 1024; - static constexpr std::array mLanguages = {"English", "German", "French"}; + static constexpr std::array mLanguages = { "English", "German", "French" }; static constexpr int HEXADECIMAL = 0; static constexpr int DECIMAL = 1; char* mTableIdBuf; @@ -57,6 +56,5 @@ private: bool mDisplayCustomMessageClicked = false; }; - #endif //__cplusplus -#endif //CUSTOMMESSAGEDEBUGGER_H +#endif // CUSTOMMESSAGEDEBUGGER_H diff --git a/soh/soh/Enhancements/debugger/SohStatsWindow.h b/soh/soh/Enhancements/debugger/SohStatsWindow.h index d68953573..227ca5500 100644 --- a/soh/soh/Enhancements/debugger/SohStatsWindow.h +++ b/soh/soh/Enhancements/debugger/SohStatsWindow.h @@ -6,12 +6,12 @@ class SohStatsWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; - ~SohStatsWindow() {}; + ~SohStatsWindow(){}; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; #endif // SOH_STATS_H diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index 8be4fcc4d..8ae940ffb 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -45,19 +45,13 @@ typedef enum { INTERACT, } RetrievalMethod; -std::array acMapping = { - "Switch", - "Background (Prop type 1)", - "Player", - "Bomb", - "NPC", - "Enemy", - "Prop type 2", - "Item/Action", - "Misc.", - "Boss", - "Door", - "Chest", +std::array acMapping = { + "Switch", "Background (Prop type 1)", + "Player", "Bomb", + "NPC", "Enemy", + "Prop type 2", "Item/Action", + "Misc.", "Boss", + "Door", "Chest", }; using namespace UIWidgets; @@ -76,7 +70,8 @@ const std::string GetActorDescription(u16 id) { template void DrawGroupWithBorder(T&& drawFunc, std::string section) { // First group encapsulates the inner portion and border ImGui::BeginChild(std::string("##" + section).c_str(), ImVec2(0, 0), - ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY); + ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | + ImGuiChildFlags_AutoResizeY); // Second group encapsulates just the inner portion ImGui::BeginGroup(); @@ -103,7 +98,7 @@ void PopulateActorDropdown(int i, std::vector& data) { } } -//actors that don't use params at all +// actors that don't use params at all static std::vector noParamsActors = { ACTOR_ARMS_HOOK, ACTOR_ARROW_FIRE, @@ -250,7 +245,7 @@ void CreateActorSpecificData() { if (!isFlower) { ImGui::InputScalar("Shots Per Round", ImGuiDataType_S16, &shotsPerRound); } - + return isFlower ? DEKUNUTS_FLOWER : (shotsPerRound << 8); }; @@ -259,12 +254,12 @@ void CreateActorSpecificData() { if (params == 0) { params = -2; } - //the + 2 is because the params are -2 & -1 instead of 0 & 1 + // the + 2 is because the params are -2 & -1 instead of 0 & 1 int selectedItem = params + 2; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem - 2; } - + return params; }; @@ -274,7 +269,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -284,7 +279,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -294,7 +289,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -304,7 +299,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -314,7 +309,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -324,7 +319,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -333,12 +328,12 @@ void CreateActorSpecificData() { if (params == 0) { params = 0x40; } - //the - 0x40 is because the params are 0x40 & 0x41 instead of 0 & 1 + // the - 0x40 is because the params are 0x40 & 0x41 instead of 0 & 1 int selectedItem = params - 0x40; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem + 0x40; } - + return params; }; @@ -348,21 +343,21 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_REEBA] = [](s16 params) -> s16 { bool isBig = params != 0; ImGui::Checkbox("Big", &isBig); - + return isBig; }; actorSpecificData[ACTOR_EN_TK] = [](s16 params) -> s16 { bool canTurn = params >= 0; ImGui::Checkbox("Can Turn", &canTurn); - + return canTurn ? 0 : -1; }; @@ -374,35 +369,13 @@ void CreateActorSpecificData() { if (collectibleFlag > 0x3F) { collectibleFlag = 0x3F; } - + static const char* items[] = { - "Green Rupee", - "Blue Rupee", - "Red Rupee", - "Recovery Heart", - "Bombs (A)", - "Arrow", - "Heart Piece", - "Heart Container", - "Arrows (5)", - "Arrows (10)", - "Arrows (30)", - "Bombs (B)", - "Deku Nuts (5)", - "Deku Stick", - "Magic (Large)", - "Magic (Small)", - "Deku Seeds (5)", - "Small Key", - "Flexible", - "Gold Rupee", - "Purple Rupee", - "Deku Shield", - "Hylian Shield", - "Zora Tunic", - "Goron Tunic", - "Bombs (Special)", - "Bombchus", + "Green Rupee", "Blue Rupee", "Red Rupee", "Recovery Heart", "Bombs (A)", "Arrow", + "Heart Piece", "Heart Container", "Arrows (5)", "Arrows (10)", "Arrows (30)", "Bombs (B)", + "Deku Nuts (5)", "Deku Stick", "Magic (Large)", "Magic (Small)", "Deku Seeds (5)", "Small Key", + "Flexible", "Gold Rupee", "Purple Rupee", "Deku Shield", "Hylian Shield", "Zora Tunic", + "Goron Tunic", "Bombs (Special)", "Bombchus", }; int selectedItem = params & 0xFF; @@ -413,33 +386,11 @@ void CreateActorSpecificData() { actorSpecificData[ACTOR_OBJ_COMB] = [](s16 params) -> s16 { static const char* items[] = { - "Green Rupee", - "Blue Rupee", - "Red Rupee", - "Recovery Heart", - "Bombs (A)", - "Arrow", - "Heart Piece", - "Heart Container", - "Arrows (5)", - "Arrows (10)", - "Arrows (30)", - "Bombs (B)", - "Deku Nuts (5)", - "Deku Stick", - "Magic (Large)", - "Magic (Small)", - "Deku Seeds (5)", - "Small Key", - "Flexible", - "Gold Rupee", - "Purple Rupee", - "Deku Shield", - "Hylian Shield", - "Zora Tunic", - "Goron Tunic", - "Bombs (Special)", - "Bombchus", + "Green Rupee", "Blue Rupee", "Red Rupee", "Recovery Heart", "Bombs (A)", "Arrow", + "Heart Piece", "Heart Container", "Arrows (5)", "Arrows (10)", "Arrows (30)", "Bombs (B)", + "Deku Nuts (5)", "Deku Stick", "Magic (Large)", "Magic (Small)", "Deku Seeds (5)", "Small Key", + "Flexible", "Gold Rupee", "Purple Rupee", "Deku Shield", "Hylian Shield", "Zora Tunic", + "Goron Tunic", "Bombs (Special)", "Bombchus", }; int selectedItem = params & 0xFF; @@ -452,18 +403,18 @@ void CreateActorSpecificData() { collectibleFlag = 0x3F; } } - + return (collectibleFlag << 8) + selectedItem; }; actorSpecificData[ACTOR_EN_GM] = [](s16 params) -> s16 { u8 switchFlag = (params & 0x3F00) >> 8; - + ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &switchFlag); if (switchFlag > 0x3F) { switchFlag = 0x3F; } - + return switchFlag << 8; }; @@ -525,7 +476,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; @@ -543,7 +494,7 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem > 3 ? selectedItem + 1 : selectedItem; } - + return params; }; @@ -574,113 +525,102 @@ void CreateActorSpecificData() { if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_ELF] = [](s16 params) -> s16 { static const char* items[] = { - "Navi", - "Revive Bottle", - "Heal Timed", - "Kokiri", - "Spawner", - "Revive Death", - "Heal", - "Heal Big", + "Navi", "Revive Bottle", "Heal Timed", "Kokiri", "Spawner", "Revive Death", "Heal", "Heal Big", }; int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_CLEAR_TAG] = [](s16 params) -> s16 { static const char* items[] = { - "Cutscene", //0 - "Normal", //1 - "Laser", //100 + "Cutscene", // 0 + "Normal", // 1 + "Laser", // 100 }; int selectedItem = params == 100 ? 2 : params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem == 2 ? 100 : selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_BOMBF] = [](s16 params) -> s16 { static const char* items[] = { "Flower", "Body", "Explosion" }; - //the + 1 is because the params are -1, 0 & 1 instead of 0, 1 & 2 + // the + 1 is because the params are -1, 0 & 1 instead of 0, 1 & 2 int selectedItem = params + 1; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem - 1; } - + return params; }; actorSpecificData[ACTOR_EN_BOM] = [](s16 params) -> s16 { static const char* items[] = { "Body", "Explosion" }; - + int selectedItem = params; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_DOOR_WARP1] = [](s16 params) -> s16 { static const char* items[] = { - "Blue Crystal", // -2 - "Dungeon Adult", - "Dungeon Child", - "Clear Flag", // Activate on temp clear flag - "Sages", // Used by sages warping into chamber of sages during their cutscene + "Blue Crystal", // -2 + "Dungeon Adult", "Dungeon Child", + "Clear Flag", // Activate on temp clear flag + "Sages", // Used by sages warping into chamber of sages during their cutscene "Purple Crystal", - "Yellow", // The colored variants don't warp, they are cutscene setpieces + "Yellow", // The colored variants don't warp, they are cutscene setpieces "Blue Ruto", - "Destination", // Spawning in after having taken a warp - "UNK 7", - "Orange", - "Green", - "Red", + "Destination", // Spawning in after having taken a warp + "UNK 7", "Orange", "Green", "Red", }; int selectedItem = params + 2; if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem - 2; } - + return params; }; actorSpecificData[ACTOR_EN_DY_EXTRA] = [](s16 params) -> s16 { static const char* items[] = { "Orange", "Green" }; - + int selectedItem = params; if (ImGui::Combo("Color", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; actorSpecificData[ACTOR_EN_SKB] = [](s16 params) -> s16 { u8 size = params; ImGui::InputScalar("Size", ImGuiDataType_U8, &size); - + return size; }; actorSpecificData[ACTOR_EN_WF] = [](s16 params) -> s16 { static const char* items[] = { "Normal", "White" }; - + int selectedItem = params; ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items)); - + u8 switchFlag = (params & 0x3F00) >> 8; ImGui::InputScalar("Switch Flag", ImGuiDataType_U8, &switchFlag); return (switchFlag << 8) + selectedItem; @@ -703,7 +643,7 @@ void CreateActorSpecificData() { if (itemId > 0x7F) { itemId = 0x7F; } - + static const char* items[] = { "Big (Default)", "Room Clear Big", @@ -751,7 +691,7 @@ void CreateActorSpecificData() { if (transitionIndex > 0x3F) { transitionIndex = 0x3F; } - + static const char* items[] = { "Room Load", // loads rooms "Locked", // small key locked door @@ -792,9 +732,9 @@ void CreateActorSpecificData() { actorSpecificData[ACTOR_EN_PO_DESERT] = [](s16 params) -> s16 { u8 switchFlag = params >> 8; - + ImGui::InputScalar("Path", ImGuiDataType_U8, &switchFlag); - + return switchFlag << 8; }; @@ -807,30 +747,26 @@ void CreateActorSpecificData() { if (ImGui::Checkbox("Fishing Sign", &fishingSign)) { piece = false; } - + u8 textId = params; if (!piece && !fishingSign) { if (ImGui::InputScalar("Text ID", ImGuiDataType_U8, &textId)) { textId |= 0x300; } } - + return piece ? (s16)0xFFDD : (fishingSign ? 0x300 : textId); }; actorSpecificData[ACTOR_EN_KUSA] = [](s16 params) -> s16 { - static const char* items[] = { - "0", - "1", - "2" - }; + static const char* items[] = { "0", "1", "2" }; int type = params & 3; ImGui::Combo("Type", &type, items, IM_ARRAYSIZE(items)); bool bugs = ((params >> 4) & 1) != 0; ImGui::Checkbox("Bugs", &bugs); - + u8 drop = (params >> 8) & 0xF; if (type == 2) { ImGui::InputScalar("Random Drop Params", ImGuiDataType_U8, &drop); @@ -845,17 +781,12 @@ void CreateActorSpecificData() { }; actorSpecificData[ActorDB::Instance->RetrieveId("En_Partner")] = [](s16 params) -> s16 { - static const char* items[] = { - "Port 1", - "Port 2", - "Port 3", - "Port 4" - }; + static const char* items[] = { "Port 1", "Port 2", "Port 3", "Port 4" }; int selectedItem = params; if (ImGui::Combo("Controller Port", &selectedItem, items, IM_ARRAYSIZE(items))) { return selectedItem; } - + return params; }; } @@ -921,7 +852,7 @@ void ActorViewerWindow::DrawElement() { static Actor* display; static Actor empty{}; static Actor* fetch = NULL; - static ActorInfo newActor = {0,0, {0, 0, 0}, {0, 0, 0}}; + static ActorInfo newActor = { 0, 0, { 0, 0, 0 }, { 0, 0, 0 } }; static bool needs_reset = false; static ImU16 one = 1; static int actor; @@ -948,7 +879,7 @@ void ActorViewerWindow::DrawElement() { actors.clear(); } lastSceneId = gPlayState->sceneNum; - + PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Actor Type", acMapping[category])) { for (int i = 0; i < acMapping.size(); i++) { @@ -986,37 +917,43 @@ void ActorViewerWindow::DrawElement() { PushStyleHeader(THEME_COLOR); if (ImGui::TreeNode("Selected Actor")) { - DrawGroupWithBorder([&]() { - ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); - ImGui::Text("Description: %s", GetActorDescription(display->id).c_str()); - ImGui::Text("Category: %s", acMapping[display->category]); - ImGui::Text("ID: %d", display->id); - ImGui::Text("Parameters: %d", display->params); - }, "Selected Actor"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); + ImGui::Text("Description: %s", GetActorDescription(display->id).c_str()); + ImGui::Text("Category: %s", acMapping[display->category]); + ImGui::Text("ID: %d", display->id); + ImGui::Text("Parameters: %d", display->params); + }, + "Selected Actor"); ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - DrawGroupWithBorder([&]() { - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - PushStyleInput(THEME_COLOR); - ImGui::Text("Actor Position"); - ImGui::InputScalar("X##CurPos", ImGuiDataType_Float, &display->world.pos.x); - ImGui::InputScalar("Y##CurPos", ImGuiDataType_Float, &display->world.pos.y); - ImGui::InputScalar("Z##CurPos", ImGuiDataType_Float, &display->world.pos.z); - ImGui::PopItemWidth(); - PopStyleInput(); - }, "Actor Position"); + DrawGroupWithBorder( + [&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Actor Position"); + ImGui::InputScalar("X##CurPos", ImGuiDataType_Float, &display->world.pos.x); + ImGui::InputScalar("Y##CurPos", ImGuiDataType_Float, &display->world.pos.y); + ImGui::InputScalar("Z##CurPos", ImGuiDataType_Float, &display->world.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "Actor Position"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - PushStyleInput(THEME_COLOR); - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - ImGui::Text("Actor Rotation"); - ImGui::InputScalar("X##CurRot", ImGuiDataType_S16, &display->world.rot.x); - ImGui::InputScalar("Y##CurRot", ImGuiDataType_S16, &display->world.rot.y); - ImGui::InputScalar("Z##CurRot", ImGuiDataType_S16, &display->world.rot.z); - ImGui::PopItemWidth(); - PopStyleInput(); - }, "Actor Rotation"); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::Text("Actor Rotation"); + ImGui::InputScalar("X##CurRot", ImGuiDataType_S16, &display->world.rot.x); + ImGui::InputScalar("Y##CurRot", ImGuiDataType_S16, &display->world.rot.y); + ImGui::InputScalar("Z##CurRot", ImGuiDataType_S16, &display->world.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "Actor Rotation"); if (display->category == ACTORCAT_BOSS || display->category == ACTORCAT_ENEMY) { PushStyleInput(THEME_COLOR); @@ -1025,17 +962,21 @@ void ActorViewerWindow::DrawElement() { UIWidgets::InsertHelpHoverText("Some actors might not use this!"); } - DrawGroupWithBorder([&]() { - ImGui::Text("flags"); - UIWidgets::DrawFlagArray32("flags", display->flags); - }, "flags"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("flags"); + UIWidgets::DrawFlagArray32("flags", display->flags); + }, + "flags"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("bgCheckFlags"); - UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); - }, "bgCheckFlags"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("bgCheckFlags"); + UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); + }, + "bgCheckFlags"); if (Button("Refresh", ButtonOptions().Color(THEME_COLOR))) { PopulateActorDropdown(category, list); @@ -1059,7 +1000,10 @@ void ActorViewerWindow::DrawElement() { Math_Vec3f_Copy(&player->actor.home.pos, &player->actor.world.pos); } - if (Button("Fetch from Target", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor with target arrow above it. You might need C-Up for enemies"))) { + if (Button("Fetch from Target", + ButtonOptions() + .Color(THEME_COLOR) + .Tooltip("Grabs actor with target arrow above it. You might need C-Up for enemies"))) { Player* player = GET_PLAYER(gPlayState); fetch = player->talkActor; if (fetch != NULL) { @@ -1069,7 +1013,8 @@ void ActorViewerWindow::DrawElement() { rm = TARGET; } } - if (Button("Fetch from Held", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor that Link is holding"))) { + if (Button("Fetch from Held", + ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor that Link is holding"))) { Player* player = GET_PLAYER(gPlayState); fetch = player->heldActor; if (fetch != NULL) { @@ -1079,7 +1024,8 @@ void ActorViewerWindow::DrawElement() { rm = HELD; } } - if (Button("Fetch from Interaction", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor from \"interaction range\""))) { + if (Button("Fetch from Interaction", + ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor from \"interaction range\""))) { Player* player = GET_PLAYER(gPlayState); fetch = player->interactRangeActor; if (fetch != NULL) { @@ -1094,7 +1040,7 @@ void ActorViewerWindow::DrawElement() { } if (ImGui::TreeNode("New...")) { - //ImGui::PushItemWidth(ImGui::GetFontSize() * 10); + // ImGui::PushItemWidth(ImGui::GetFontSize() * 10); if (InputString("Search Actor", &searchString, InputOptions().Color(THEME_COLOR))) { actors = GetActorsWithDescriptionContainingString(searchString); @@ -1102,14 +1048,14 @@ void ActorViewerWindow::DrawElement() { } if (!SohUtils::IsStringEmpty(searchString) && !actors.empty()) { - std::string preview = currentSelectedInDropdown == -1 ? "Please Select" : ActorDB::Instance->RetrieveEntry(actors[currentSelectedInDropdown]).desc; + std::string preview = currentSelectedInDropdown == -1 + ? "Please Select" + : ActorDB::Instance->RetrieveEntry(actors[currentSelectedInDropdown]).desc; PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Results", preview.c_str())) { for (u8 i = 0; i < actors.size(); i++) { - if (ImGui::Selectable( - ActorDB::Instance->RetrieveEntry(actors[i]).desc.c_str(), - i == currentSelectedInDropdown - )) { + if (ImGui::Selectable(ActorDB::Instance->RetrieveEntry(actors[i]).desc.c_str(), + i == currentSelectedInDropdown)) { currentSelectedInDropdown = i; newActor.id = actors[i]; } @@ -1124,7 +1070,8 @@ void ActorViewerWindow::DrawElement() { newActor.params = 0; } - CVarCheckbox("Advanced mode", CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), CheckboxOptions().Tooltip("Changes the actor specific param menus with a direct input")); + CVarCheckbox("Advanced mode", CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), + CheckboxOptions().Tooltip("Changes the actor specific param menus with a direct input")); if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("ActorViewer.AdvancedParams"), 0)) { PushStyleInput(THEME_COLOR); @@ -1137,36 +1084,42 @@ void ActorViewerWindow::DrawElement() { ImGui::InputScalar("params", ImGuiDataType_S16, &newActor.params, &one); PopStyleInput(); } else { - DrawGroupWithBorder([&]() { - ImGui::Text("Actor Specific Data"); - newActor.params = actorSpecificData[newActor.id](newActor.params); - }, "Actor Specific Data"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Actor Specific Data"); + newActor.params = actorSpecificData[newActor.id](newActor.params); + }, + "Actor Specific Data"); } } ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - DrawGroupWithBorder([&]() { - PushStyleInput(THEME_COLOR); - ImGui::Text("New Actor Position"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - ImGui::InputScalar("X##NewPos", ImGuiDataType_Float, &newActor.pos.x); - ImGui::InputScalar("Y##NewPos", ImGuiDataType_Float, &newActor.pos.y); - ImGui::InputScalar("Z##NewPos", ImGuiDataType_Float, &newActor.pos.z); - ImGui::PopItemWidth(); - PopStyleInput(); - }, "New Actor Position"); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::Text("New Actor Position"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::InputScalar("X##NewPos", ImGuiDataType_Float, &newActor.pos.x); + ImGui::InputScalar("Y##NewPos", ImGuiDataType_Float, &newActor.pos.y); + ImGui::InputScalar("Z##NewPos", ImGuiDataType_Float, &newActor.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "New Actor Position"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - PushStyleInput(THEME_COLOR); - ImGui::Text("New Actor Rotation"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - ImGui::InputScalar("X##NewRot", ImGuiDataType_S16, &newActor.rot.x); - ImGui::InputScalar("Y##NewRot", ImGuiDataType_S16, &newActor.rot.y); - ImGui::InputScalar("Z##NewRot", ImGuiDataType_S16, &newActor.rot.z); - ImGui::PopItemWidth(); - PopStyleInput(); - }, "New Actor Rotation"); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::Text("New Actor Rotation"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::InputScalar("X##NewRot", ImGuiDataType_S16, &newActor.rot.x); + ImGui::InputScalar("Y##NewRot", ImGuiDataType_S16, &newActor.rot.y); + ImGui::InputScalar("Z##NewRot", ImGuiDataType_S16, &newActor.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "New Actor Rotation"); if (Button("Fetch from Link", ButtonOptions().Color(THEME_COLOR))) { Player* player = GET_PLAYER(gPlayState); @@ -1214,8 +1167,9 @@ void ActorViewerWindow::DrawElement() { { 3, "Both" }, }; - if (CVarCombobox("Actor Name Tags", CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags"), nameTagOptions, - ComboboxOptions().Color(THEME_COLOR).Tooltip("Adds \"name tags\" above actors for identification"))) { + if (CVarCombobox( + "Actor Name Tags", CVAR_DEVELOPER_TOOLS("ActorViewer.NameTags"), nameTagOptions, + ComboboxOptions().Color(THEME_COLOR).Tooltip("Adds \"name tags\" above actors for identification"))) { NameTag_RemoveAllByTag(DEBUG_ACTOR_NAMETAG_TAG); ActorViewer_AddTagForAllActors(); } diff --git a/soh/soh/Enhancements/debugger/actorViewer.h b/soh/soh/Enhancements/debugger/actorViewer.h index 2f4ca680a..bab7d1646 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.h +++ b/soh/soh/Enhancements/debugger/actorViewer.h @@ -8,5 +8,5 @@ class ActorViewerWindow : public Ship::GuiWindow { void DrawElement() override; void InitElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/colViewer.cpp b/soh/soh/Enhancements/debugger/colViewer.cpp index de2272598..e3abba484 100644 --- a/soh/soh/Enhancements/debugger/colViewer.cpp +++ b/soh/soh/Enhancements/debugger/colViewer.cpp @@ -20,7 +20,7 @@ extern "C" { extern PlayState* gPlayState; } -typedef enum ColRenderSetting { ColRenderDisabled, ColRenderSolid, ColRenderTransparent } ColRenderSetting ; +typedef enum ColRenderSetting { ColRenderDisabled, ColRenderSolid, ColRenderTransparent } ColRenderSetting; static std::unordered_map ColRenderSettingNames = { { ColRenderDisabled, "Disabled" }, @@ -68,9 +68,11 @@ void ColViewerWindow::DrawElement() { CVarCombobox("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), ColRenderSettingNames, comboOpt); CVarCheckbox("Apply as decal", CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), - checkOpt.DefaultValue(true).Tooltip("Applies the collision as a decal display. This can be useful if there is z-fighting occuring " - "with the scene geometry, but can cause other artifacts.")); - CVarCheckbox("Shaded", CVAR_DEVELOPER_TOOLS("ColViewer.Shaded"), checkOpt.DefaultValue(false).Tooltip("Applies the scene's shading to the collision display.")); + checkOpt.DefaultValue(true).Tooltip( + "Applies the collision as a decal display. This can be useful if there is z-fighting occuring " + "with the scene geometry, but can cause other artifacts.")); + CVarCheckbox("Shaded", CVAR_DEVELOPER_TOOLS("ColViewer.Shaded"), + checkOpt.DefaultValue(false).Tooltip("Applies the scene's shading to the collision display.")); // This has to be duplicated in both code paths due to the nature of ImGui::IsItemHovered() const std::string colorHelpText = "View and change the colors used for collision display."; @@ -78,38 +80,58 @@ void ColViewerWindow::DrawElement() { if (ImGui::TreeNode("Colors")) { UIWidgets::Tooltip(colorHelpText.c_str()); - if (CVarColorPicker("Normal", CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - scene_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 })); + if (CVarColorPicker("Normal", CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + scene_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorNormal"), { 255, 255, 255, 255 })); } - if (CVarColorPicker("Hookshot", CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - hookshot_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 })); + if (CVarColorPicker("Hookshot", CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + hookshot_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot"), { 128, 128, 255, 255 })); } - if (CVarColorPicker("Entrance", CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - entrance_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 })); + if (CVarColorPicker("Entrance", CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + entrance_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorEntrance"), { 0, 255, 0, 255 })); } - if (CVarColorPicker("Special Surface (Grass/Sand/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - specialSurface_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 })); + if (CVarColorPicker("Special Surface (Grass/Sand/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), + { 192, 255, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, + THEME_COLOR)) { + specialSurface_col = VecFromRGBA8( + CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSpecialSurface"), { 192, 255, 192, 255 })); } - if (CVarColorPicker("Interactable (Vines/Crawlspace/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), { 192, 0, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - interactable_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), { 192, 0, 192, 255 })); + if (CVarColorPicker("Interactable (Vines/Crawlspace/Etc)", CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), + { 192, 0, 192, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, + THEME_COLOR)) { + interactable_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable"), { 192, 0, 192, 255 })); } - if (CVarColorPicker("Slope", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - slope_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 })); + if (CVarColorPicker("Slope", CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + slope_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorSlope"), { 255, 255, 128, 255 })); } - if (CVarColorPicker("Void", CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + if (CVarColorPicker("Void", CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { void_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid"), { 255, 0, 0, 255 })); } - if (CVarColorPicker("OC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + if (CVarColorPicker("OC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { oc_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorOC"), { 255, 255, 255, 255 })); } - if (CVarColorPicker("AC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + if (CVarColorPicker("AC", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { ac_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAC"), { 0, 0, 255, 255 })); } - if (CVarColorPicker("AT", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + if (CVarColorPicker("AT", CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { at_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorAT"), { 255, 0, 0, 255 })); } - if (CVarColorPicker("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 }, false, ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { - waterbox_col = VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 })); + if (CVarColorPicker("Waterbox", CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 }, false, + ColorPickerResetButton | ColorPickerRandomButton, THEME_COLOR)) { + waterbox_col = + VecFromRGBA8(CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorWaterbox"), { 0, 0, 255, 255 })); } ImGui::TreePop(); @@ -210,9 +232,9 @@ void CreateSphereFace(std::vector>& faces, in // Create 3 new verticies at the midpoints Vec3f vs[3] = { - Vec3f{(v0.n.ob[0] + v1.n.ob[0]) / 2.0f, (v0.n.ob[1] + v1.n.ob[1]) / 2.0f, (v0.n.ob[2] + v1.n.ob[2]) / 2.0f}, - Vec3f{(v1.n.ob[0] + v2.n.ob[0]) / 2.0f, (v1.n.ob[1] + v2.n.ob[1]) / 2.0f, (v1.n.ob[2] + v2.n.ob[2]) / 2.0f}, - Vec3f{(v2.n.ob[0] + v0.n.ob[0]) / 2.0f, (v2.n.ob[1] + v0.n.ob[1]) / 2.0f, (v2.n.ob[2] + v0.n.ob[2]) / 2.0f} + Vec3f{ (v0.n.ob[0] + v1.n.ob[0]) / 2.0f, (v0.n.ob[1] + v1.n.ob[1]) / 2.0f, (v0.n.ob[2] + v1.n.ob[2]) / 2.0f }, + Vec3f{ (v1.n.ob[0] + v2.n.ob[0]) / 2.0f, (v1.n.ob[1] + v2.n.ob[1]) / 2.0f, (v1.n.ob[2] + v2.n.ob[2]) / 2.0f }, + Vec3f{ (v2.n.ob[0] + v0.n.ob[0]) / 2.0f, (v2.n.ob[1] + v0.n.ob[1]) / 2.0f, (v2.n.ob[2] + v0.n.ob[2]) / 2.0f } }; // Normalize vertex positions so they are on the sphere @@ -237,20 +259,20 @@ void CreateSphereData() { float d = (1.0f + sqrtf(5.0f)) / 2.0f; // Create the 12 starting verticies, 4 on each rectangle - base.emplace_back(Vec3f({-1, d, 0})); - base.emplace_back(Vec3f({1, d, 0})); - base.emplace_back(Vec3f({-1, -d, 0})); - base.emplace_back(Vec3f({1, -d, 0})); + base.emplace_back(Vec3f({ -1, d, 0 })); + base.emplace_back(Vec3f({ 1, d, 0 })); + base.emplace_back(Vec3f({ -1, -d, 0 })); + base.emplace_back(Vec3f({ 1, -d, 0 })); - base.emplace_back(Vec3f({0, -1, d})); - base.emplace_back(Vec3f({0, 1, d})); - base.emplace_back(Vec3f({0, -1, -d})); - base.emplace_back(Vec3f({0, 1, -d})); + base.emplace_back(Vec3f({ 0, -1, d })); + base.emplace_back(Vec3f({ 0, 1, d })); + base.emplace_back(Vec3f({ 0, -1, -d })); + base.emplace_back(Vec3f({ 0, 1, -d })); - base.emplace_back(Vec3f({d, 0, -1})); - base.emplace_back(Vec3f({d, 0, 1})); - base.emplace_back(Vec3f({-d, 0, -1})); - base.emplace_back(Vec3f({-d, 0, 1})); + base.emplace_back(Vec3f({ d, 0, -1 })); + base.emplace_back(Vec3f({ d, 0, 1 })); + base.emplace_back(Vec3f({ -d, 0, -1 })); + base.emplace_back(Vec3f({ -d, 0, 1 })); // Normalize verticies so they are on the unit sphere for (Vec3f& v : base) { @@ -349,7 +371,7 @@ void InitGfx(std::vector& gfx, ColRenderSetting setting) { // Draws a dynapoly structure (scenes or Bg Actors) void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { - Color_RGBA8 color = {255, 255, 255, 255}; + Color_RGBA8 color = { 255, 255, 255, 255 }; uint32_t lastColorR = color.r; uint32_t lastColorG = color.g; @@ -367,7 +389,7 @@ void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { if (SurfaceType_IsHookshotSurface(&gPlayState->colCtx, poly, bgId)) { color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorHookshot.Value"), { 128, 128, 255, 255 }); } else if (func_80041D94(&gPlayState->colCtx, poly, bgId) > 0x01) { - color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable.Value"), {192, 0, 192, 255}); + color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorInteractable.Value"), { 192, 0, 192, 255 }); } else if (func_80041E80(&gPlayState->colCtx, poly, bgId) == 0x0C) { color = CVarGetColor(CVAR_DEVELOPER_TOOLS("ColViewer.ColorVoid.Value"), { 255, 0, 0, 255 }); } else if (SurfaceType_GetSceneExitIndex(&gPlayState->colCtx, poly, bgId) || @@ -427,7 +449,8 @@ void DrawDynapoly(std::vector& dl, CollisionHeader* col, int32_t bgId) { // Draws the scene void DrawSceneCollision() { - ColRenderSetting showSceneColSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_DISABLED); + ColRenderSetting showSceneColSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_DISABLED); if (showSceneColSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; @@ -442,7 +465,8 @@ void DrawSceneCollision() { // Draws all Bg Actors void DrawBgActorCollision() { - ColRenderSetting showBgActorSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_DISABLED); + ColRenderSetting showBgActorSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_DISABLED); if (showBgActorSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } @@ -567,7 +591,8 @@ void DrawColCheckList(std::vector& dl, Collider** objects, int32_t count) { // Draws all Col Check objects void DrawColCheckCollision() { - ColRenderSetting showColCheckSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), COLVIEW_DISABLED); + ColRenderSetting showColCheckSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.ColCheck"), COLVIEW_DISABLED); if (showColCheckSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } @@ -619,7 +644,8 @@ extern "C" f32 zdWaterBoxMinY; // Draws all waterboxes void DrawWaterboxList() { - ColRenderSetting showWaterboxSetting = (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), COLVIEW_DISABLED); + ColRenderSetting showWaterboxSetting = + (ColRenderSetting)CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Waterbox"), COLVIEW_DISABLED); if (showWaterboxSetting == ColRenderDisabled || !CVarGetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), 0)) { return; } diff --git a/soh/soh/Enhancements/debugger/colViewer.h b/soh/soh/Enhancements/debugger/colViewer.h index b4807e873..eeaca7e43 100644 --- a/soh/soh/Enhancements/debugger/colViewer.h +++ b/soh/soh/Enhancements/debugger/colViewer.h @@ -2,11 +2,7 @@ #include -typedef enum { - COLVIEW_DISABLED, - COLVIEW_SOLID, - COLVIEW_TRANSPARENT -} ColViewerRenderSetting; +typedef enum { COLVIEW_DISABLED, COLVIEW_SOLID, COLVIEW_TRANSPARENT } ColViewerRenderSetting; #ifdef __cplusplus class ColViewerWindow : public Ship::GuiWindow { @@ -15,7 +11,7 @@ class ColViewerWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; #endif diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 1d5d08bee..534201f8e 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -74,11 +74,11 @@ u8 gAllAmmoItems[] = { }; // Encapsulates what is drawn by the passed-in function within a border -template -void DrawGroupWithBorder(T&& drawFunc, std::string section) { +template void DrawGroupWithBorder(T&& drawFunc, std::string section) { // First group encapsulates the inner portion and border ImGui::BeginChild(std::string("##" + section).c_str(), ImVec2(0, 0), - ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY); + ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeX | + ImGuiChildFlags_AutoResizeY); ImGui::BeginGroup(); ImGui::AlignTextToFramePadding(); @@ -90,13 +90,13 @@ void DrawGroupWithBorder(T&& drawFunc, std::string section) { char z2ASCII(int code) { int ret; - if (code < 10) { //Digits + if (code < 10) { // Digits ret = code + 0x30; - } else if (code >= 10 && code < 36) { //Uppercase letters + } else if (code >= 10 && code < 36) { // Uppercase letters ret = code + 0x37; - } else if (code >= 36 && code < 62) { //Lowercase letters + } else if (code >= 36 && code < 62) { // Lowercase letters ret = code + 0x3D; - } else if (code == 62) { //Space + } else if (code == 62) { // Space ret = code - 0x1E; } else if (code == 63 || code == 64) { // _ and . ret = code - 0x12; @@ -104,17 +104,12 @@ char z2ASCII(int code) { ret = code; } return char(ret); - } -typedef enum MagicLevel { - MAGIC_LEVEL_NONE, - MAGIC_LEVEL_SINGLE, - MAGIC_LEVEL_DOUBLE -}; +typedef enum MagicLevel { MAGIC_LEVEL_NONE, MAGIC_LEVEL_SINGLE, MAGIC_LEVEL_DOUBLE }; std::unordered_map magicLevelMap = { - { MAGIC_LEVEL_NONE, "None" }, + { MAGIC_LEVEL_NONE, "None" }, { MAGIC_LEVEL_SINGLE, "Single" }, { MAGIC_LEVEL_DOUBLE, "Double" }, }; @@ -182,18 +177,22 @@ void DrawInfoTab() { gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max } int32_t health = (int32_t)gSaveContext.health; - if (SliderInt("Health", &health, intSliderOptionsBase.Tooltip("Current health. 16 units per full heart") - .Min(0).Max(gSaveContext.healthCapacity))) { + if (SliderInt("Health", &health, + intSliderOptionsBase.Tooltip("Current health. 16 units per full heart") + .Min(0) + .Max(gSaveContext.healthCapacity))) { gSaveContext.health = (int16_t)health; } bool isDoubleDefenseAcquired = gSaveContext.isDoubleDefenseAcquired != 0; - if (Checkbox("Double Defense", &isDoubleDefenseAcquired, checkboxOptionsBase.Tooltip("Is double defense unlocked?"))) { + if (Checkbox("Double Defense", &isDoubleDefenseAcquired, + checkboxOptionsBase.Tooltip("Is double defense unlocked?"))) { gSaveContext.isDoubleDefenseAcquired = isDoubleDefenseAcquired; gSaveContext.inventory.defenseHearts = gSaveContext.isDoubleDefenseAcquired ? 20 : 0; // Set to get the border drawn in the UI } - if (Combobox("Magic Level", &gSaveContext.magicLevel, magicLevelMap, comboboxOptionsBase.Tooltip("Current magic level"))) { + if (Combobox("Magic Level", &gSaveContext.magicLevel, magicLevelMap, + comboboxOptionsBase.Tooltip("Current magic level"))) { gSaveContext.isMagicAcquired = gSaveContext.magicLevel > 0; gSaveContext.isDoubleMagicAcquired = gSaveContext.magicLevel == 2; } @@ -203,7 +202,10 @@ void DrawInfoTab() { } int32_t magic = (int32_t)gSaveContext.magic; - if (SliderInt("Magic", &magic, intSliderOptionsBase.Min(0).Max(gSaveContext.magicCapacity).Tooltip("Current magic. 48 units per magic level"))) { + if (SliderInt("Magic", &magic, + intSliderOptionsBase.Min(0) + .Max(gSaveContext.magicCapacity) + .Tooltip("Current magic. 48 units per magic level"))) { gSaveContext.magic = (int8_t)magic; } @@ -212,7 +214,7 @@ void DrawInfoTab() { Tooltip("Current rupees"); PopStyleInput(); - SliderInt("Time", (int32_t*) &gSaveContext.dayTime, intSliderOptionsBase.Min(0).Max(0xFFFF).Tooltip("Time of day")); + SliderInt("Time", (int32_t*)&gSaveContext.dayTime, intSliderOptionsBase.Min(0).Max(0xFFFF).Tooltip("Time of day")); if (Button("Dawn", buttonOptionsBase)) { gSaveContext.dayTime = 0x4000; } @@ -239,7 +241,8 @@ void DrawInfoTab() { Tooltip("Total number of deaths"); PopStyleInput(); - Checkbox("Has BGS", (bool*) &gSaveContext.bgsFlag, checkboxOptionsBase.Tooltip("Is Biggoron sword unlocked? Replaces Giant's knife")); + Checkbox("Has BGS", (bool*)&gSaveContext.bgsFlag, + checkboxOptionsBase.Tooltip("Is Biggoron sword unlocked? Replaces Giant's knife")); PushStyleInput(THEME_COLOR); ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth); @@ -287,98 +290,108 @@ void DrawInfoTab() { PopStyleInput(); Combobox("Audio", &gSaveContext.audioSetting, audioMap, comboboxOptionsBase.Tooltip("Sound setting")); - - Checkbox("64 DD file?", (bool*) &gSaveContext.n64ddFlag, checkboxOptionsBase.Tooltip("WARNING! If you save, your file may be locked! Use caution!")); - - Combobox("Z Target Mode", &gSaveContext.zTargetSetting, zTargetMap, comboboxOptionsBase.Tooltip("Z-Targeting behavior")); + + Checkbox("64 DD file?", (bool*)&gSaveContext.n64ddFlag, + checkboxOptionsBase.Tooltip("WARNING! If you save, your file may be locked! Use caution!")); + + Combobox("Z Target Mode", &gSaveContext.zTargetSetting, zTargetMap, + comboboxOptionsBase.Tooltip("Z-Targeting behavior")); if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT)) { PushStyleInput(THEME_COLOR); - ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, &gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); + ImGui::InputScalar("Triforce Pieces", ImGuiDataType_U8, + &gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); Tooltip("Currently obtained Triforce Pieces. For Triforce Hunt."); PopStyleInput(); } ImGui::PushItemWidth(ImGui::GetFontSize() * 10); - static std::array minigameHS = { "Horseback Archery", - "Big Poe Points", - "Fishing", - "Malon's Obstacle Course", - "Running Man Race", - "?", - "Dampe's Race" }; - + static std::array minigameHS = { "Horseback Archery", "Big Poe Points", + "Fishing", "Malon's Obstacle Course", + "Running Man Race", "?", + "Dampe's Race" }; + if (ImGui::TreeNode("Minigames")) { for (int i = 0; i < 7; i++) { - if(i == 2 && ImGui::TreeNode("Fishing") ){ //fishing has a few more flags to it + if (i == 2 && ImGui::TreeNode("Fishing")) { // fishing has a few more flags to it u8 fishSize = gSaveContext.highScores[i] & 0x7F; PushStyleInput(THEME_COLOR); - if(ImGui::InputScalar("Child Size Record",ImGuiDataType_U8,&fishSize)){ - gSaveContext.highScores[i]&=~0x7F; - gSaveContext.highScores[i]|=fishSize & 0x7F; + if (ImGui::InputScalar("Child Size Record", ImGuiDataType_U8, &fishSize)) { + gSaveContext.highScores[i] &= ~0x7F; + gSaveContext.highScores[i] |= fishSize & 0x7F; } char fishMsg[64]; - std::sprintf(fishMsg,"Weight: %2.0f lbs",((SQ(fishSize)*.0036)+.5)); + std::sprintf(fishMsg, "Weight: %2.0f lbs", ((SQ(fishSize) * .0036) + .5)); Tooltip(fishMsg); PopStyleInput(); - bool FishBool = gSaveContext.highScores[i]&0x80; - if (Checkbox("Cheated as Child", &FishBool, checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { - gSaveContext.highScores[i] &= ~0x80; - gSaveContext.highScores[i] |= (0x80 * FishBool); + bool FishBool = gSaveContext.highScores[i] & 0x80; + if (Checkbox("Cheated as Child", &FishBool, + checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { + gSaveContext.highScores[i] &= ~0x80; + gSaveContext.highScores[i] |= (0x80 * FishBool); } - fishSize=(gSaveContext.highScores[i] & 0x7F000000)>>0x18; + fishSize = (gSaveContext.highScores[i] & 0x7F000000) >> 0x18; PushStyleInput(THEME_COLOR); - if(ImGui::InputScalar("Adult Size Record",ImGuiDataType_U8,&fishSize)){ - gSaveContext.highScores[i]&=~0x7F000000; - gSaveContext.highScores[i]|=(fishSize & 0x7F) << 0x18; + if (ImGui::InputScalar("Adult Size Record", ImGuiDataType_U8, &fishSize)) { + gSaveContext.highScores[i] &= ~0x7F000000; + gSaveContext.highScores[i] |= (fishSize & 0x7F) << 0x18; } - std::sprintf(fishMsg,"Weight: %2.0f lbs",((SQ(fishSize)*.0036)+.5)); + std::sprintf(fishMsg, "Weight: %2.0f lbs", ((SQ(fishSize) * .0036) + .5)); Tooltip(fishMsg); PopStyleInput(); FishBool = gSaveContext.highScores[i] & 0x80000000; - if (Checkbox("Cheated as Adult", &FishBool, checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { - gSaveContext.highScores[i] &= ~0x80000000; - gSaveContext.highScores[i] |= (0x80000000 * FishBool); + if (Checkbox("Cheated as Adult", &FishBool, + checkboxOptionsBase.Tooltip("Used the Sinking lure to catch it."))) { + gSaveContext.highScores[i] &= ~0x80000000; + gSaveContext.highScores[i] |= (0x80000000 * FishBool); } - FishBool = gSaveContext.highScores[i]&0x100; - if (Checkbox("Played as Child", &FishBool, checkboxOptionsBase.Tooltip("Played at least one game as a child"))) { - gSaveContext.highScores[i] &= ~0x100; - gSaveContext.highScores[i] |= (0x100 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x100; + if (Checkbox("Played as Child", &FishBool, + checkboxOptionsBase.Tooltip("Played at least one game as a child"))) { + gSaveContext.highScores[i] &= ~0x100; + gSaveContext.highScores[i] |= (0x100 * FishBool); } - FishBool = gSaveContext.highScores[i]&0x200; - if (Checkbox("Played as Adult", &FishBool, checkboxOptionsBase.Tooltip("Played at least one game as an adult"))) { - gSaveContext.highScores[i] &= ~0x200; - gSaveContext.highScores[i] |= (0x200 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x200; + if (Checkbox("Played as Adult", &FishBool, + checkboxOptionsBase.Tooltip("Played at least one game as an adult"))) { + gSaveContext.highScores[i] &= ~0x200; + gSaveContext.highScores[i] |= (0x200 * FishBool); } - FishBool = gSaveContext.highScores[i]&0x400; - if (Checkbox("Got Prize as Child", &FishBool, checkboxOptionsBase.Tooltip("Got the prize item (Heart Piece, unless rando.)\nunlocks Sinking Lure for Child Link."))) { - gSaveContext.highScores[i] &= ~0x400; - gSaveContext.highScores[i] |= (0x400 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x400; + if (Checkbox( + "Got Prize as Child", &FishBool, + checkboxOptionsBase.Tooltip( + "Got the prize item (Heart Piece, unless rando.)\nunlocks Sinking Lure for Child Link."))) { + gSaveContext.highScores[i] &= ~0x400; + gSaveContext.highScores[i] |= (0x400 * FishBool); } - FishBool = gSaveContext.highScores[i]&0x800; - if (Checkbox("Got Prize as Adult", &FishBool, checkboxOptionsBase.Tooltip("Got the prize item (Golden Scale, unless rando.)\nUnlocks Sinking Lure for Adult Link."))) { - gSaveContext.highScores[i] &= ~0x800; - gSaveContext.highScores[i] |= (0x800 * FishBool); + FishBool = gSaveContext.highScores[i] & 0x800; + if (Checkbox("Got Prize as Adult", &FishBool, + checkboxOptionsBase.Tooltip("Got the prize item (Golden Scale, unless rando.)\nUnlocks " + "Sinking Lure for Adult Link."))) { + gSaveContext.highScores[i] &= ~0x800; + gSaveContext.highScores[i] |= (0x800 * FishBool); } FishBool = gSaveContext.highScores[i] & 0x1000; - if (Checkbox("Stole Owner's Hat", &FishBool, checkboxOptionsBase.Tooltip("The owner's now visibly bald when Adult Link."))) { - gSaveContext.highScores[i] &= ~0x1000; - gSaveContext.highScores[i] |= (0x1000 * FishBool); + if (Checkbox("Stole Owner's Hat", &FishBool, + checkboxOptionsBase.Tooltip("The owner's now visibly bald when Adult Link."))) { + gSaveContext.highScores[i] &= ~0x1000; + gSaveContext.highScores[i] |= (0x1000 * FishBool); } - fishSize=(gSaveContext.highScores[i] & 0xFF0000)>>16; + fishSize = (gSaveContext.highScores[i] & 0xFF0000) >> 16; PushStyleInput(THEME_COLOR); - if(ImGui::InputScalar("Times Played",ImGuiDataType_U8,&fishSize)){ - gSaveContext.highScores[i]&=~0xFF0000; - gSaveContext.highScores[i]|=(fishSize) << 16; + if (ImGui::InputScalar("Times Played", ImGuiDataType_U8, &fishSize)) { + gSaveContext.highScores[i] &= ~0xFF0000; + gSaveContext.highScores[i] |= (fishSize) << 16; } Tooltip("Determines weather and school size during dawn/dusk."); PopStyleInput(); - + ImGui::TreePop(); continue; } - - if (i == 5 || i == 2) { //HS_UNK_05 is unused + + if (i == 5 || i == 2) { // HS_UNK_05 is unused continue; } std::string minigameLbl = minigameHS[i]; @@ -386,10 +399,10 @@ void DrawInfoTab() { ImGui::InputScalar(minigameLbl.c_str(), ImGuiDataType_S32, &gSaveContext.highScores[i], &one, NULL); PopStyleInput(); } - + ImGui::TreePop(); } - + ImGui::PopItemWidth(); } @@ -402,7 +415,9 @@ void DrawBGSItemFlag(uint8_t itemID) { void DrawInventoryTab() { static bool restrictToValid = true; - Checkbox("Restrict to valid items", &restrictToValid, checkboxOptionsBase.Tooltip("Restricts items and ammo to only what is possible to legally acquire in-game")); + Checkbox( + "Restrict to valid items", &restrictToValid, + checkboxOptionsBase.Tooltip("Restricts items and ammo to only what is possible to legally acquire in-game")); for (int32_t y = 0; y < 4; y++) { for (int32_t x = 0; x < 6; x++) { @@ -420,8 +435,10 @@ void DrawInventoryTab() { PushStyleButton(Colors::DarkGray); if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping.find(item)->second; - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(48.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); + auto ret = ImGui::ImageButton( + slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(48.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { selectedIndex = index; ImGui::OpenPopup(itemPopupPicker); @@ -437,7 +454,8 @@ void DrawInventoryTab() { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); if (ImGui::BeginPopup(itemPopupPicker)) { PushStyleButton(Colors::DarkGray); - if (ImGui::Button("##itemNonePicker", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { + if (ImGui::Button("##itemNonePicker", + ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { gSaveContext.inventory.items[selectedIndex] = ITEM_NONE; ImGui::CloseCurrentPopup(); } @@ -468,8 +486,10 @@ void DrawInventoryTab() { } const ItemMapEntry& slotEntry = possibleItems[pickerIndex]; PushStyleButton(Colors::DarkGray); - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); + auto ret = ImGui::ImageButton( + slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); PopStyleButton(); if (ret) { gSaveContext.inventory.items[selectedIndex] = slotEntry.id; @@ -501,7 +521,8 @@ void DrawInventoryTab() { ImGui::PushItemWidth(IMAGE_SIZE); ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[item].name), ImVec2(IMAGE_SIZE, IMAGE_SIZE)); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[item].name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE)); PushStyleInput(THEME_COLOR); ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item)); PopStyleInput(); @@ -511,11 +532,11 @@ void DrawInventoryTab() { ImGui::PopID(); } } - + // Trade quest flags are only used when shuffling the trade sequence, so // don't show this if it isn't needed. - if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) - && ImGui::TreeNode("Adult trade quest items")) { + if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) && + ImGui::TreeNode("Adult trade quest items")) { for (int i = ITEM_POCKET_EGG; i <= ITEM_CLAIM_CHECK; i++) { DrawBGSItemFlag(i); } @@ -532,7 +553,7 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl bool hasDescription = !!flagTable.flagDescriptions.contains(row * 16 + flagIndex); uint32_t bitMask = 1 << flagIndex; ImVec4 themeColor = ColorValues.at(THEME_COLOR); - ImVec4 colorDark = { themeColor.x * 0.4f, themeColor.y * 0.4f, themeColor.z * 0.4f , themeColor.z }; + ImVec4 colorDark = { themeColor.x * 0.4f, themeColor.y * 0.4f, themeColor.z * 0.4f, themeColor.z }; PushStyleCheckbox(hasDescription ? themeColor : colorDark); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); bool flag = (flags & bitMask) != 0; @@ -560,158 +581,182 @@ void DrawFlagsTab() { if (gPlayState != nullptr) { Player* player = GET_PLAYER(gPlayState); - DrawGroupWithBorder([&]() { - ImGui::Text("stateFlags1"); - DrawFlagArray32("stateFlags1", player->stateFlags1, THEME_COLOR); - }, "stateFlags1"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("stateFlags1"); + DrawFlagArray32("stateFlags1", player->stateFlags1, THEME_COLOR); + }, + "stateFlags1"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("stateFlags2"); - DrawFlagArray32("stateFlags2", player->stateFlags2, THEME_COLOR); - }, "stateFlags2"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("stateFlags2"); + DrawFlagArray32("stateFlags2", player->stateFlags2, THEME_COLOR); + }, + "stateFlags2"); + + DrawGroupWithBorder( + [&]() { + ImGui::Text("stateFlags3"); + DrawFlagArray8("stateFlags3", player->stateFlags3, THEME_COLOR); + }, + "stateFlags3"); - DrawGroupWithBorder([&]() { - ImGui::Text("stateFlags3"); - DrawFlagArray8("stateFlags3", player->stateFlags3, THEME_COLOR); - }, "stateFlags3"); - ImGui::SameLine(); - - DrawGroupWithBorder([&]() { - ImGui::Text("unk_6AE_rotFlags"); - DrawFlagArray16("unk_6AE_rotFlags", player->unk_6AE_rotFlags, THEME_COLOR); - }, "unk_6AE_rotFlags"); + + DrawGroupWithBorder( + [&]() { + ImGui::Text("unk_6AE_rotFlags"); + DrawFlagArray16("unk_6AE_rotFlags", player->unk_6AE_rotFlags, THEME_COLOR); + }, + "unk_6AE_rotFlags"); } ImGui::TreePop(); } if (ImGui::TreeNode("Current Scene")) { if (gPlayState != nullptr) { ActorContext* act = &gPlayState->actorCtx; - DrawGroupWithBorder([&]() { - ImGui::Text("Switch"); - InsertHelpHoverText("Permanently-saved switch flags"); - if (Button("Set All##Switch", buttonOptionsBase.Tooltip(""))) { - act->flags.swch = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Switch", buttonOptionsBase.Tooltip(""))) { - act->flags.swch = 0; - } - DrawFlagArray32("Switch", act->flags.swch, THEME_COLOR); - }, "Switch"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Switch"); + InsertHelpHoverText("Permanently-saved switch flags"); + if (Button("Set All##Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.swch = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.swch = 0; + } + DrawFlagArray32("Switch", act->flags.swch, THEME_COLOR); + }, + "Switch"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Temp Switch"); - InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); - if (Button("Set All##Temp Switch", buttonOptionsBase.Tooltip(""))) { - act->flags.tempSwch = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Temp Switch", buttonOptionsBase.Tooltip(""))) { - act->flags.tempSwch = 0; - } - DrawFlagArray32("Temp Switch", act->flags.tempSwch, THEME_COLOR); - }, "Temp Switch"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Temp Switch"); + InsertHelpHoverText("Temporary switch flags. Unset on scene transitions"); + if (Button("Set All##Temp Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.tempSwch = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Temp Switch", buttonOptionsBase.Tooltip(""))) { + act->flags.tempSwch = 0; + } + DrawFlagArray32("Temp Switch", act->flags.tempSwch, THEME_COLOR); + }, + "Temp Switch"); - DrawGroupWithBorder([&]() { - ImGui::Text("Clear"); - InsertHelpHoverText("Permanently-saved room-clear flags"); - if (Button("Set All##Clear", buttonOptionsBase.Tooltip(""))) { - act->flags.clear = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Clear", buttonOptionsBase.Tooltip(""))) { - act->flags.clear = 0; - } - DrawFlagArray32("Clear", act->flags.clear, THEME_COLOR); - }, "Clear"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Clear"); + InsertHelpHoverText("Permanently-saved room-clear flags"); + if (Button("Set All##Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.clear = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.clear = 0; + } + DrawFlagArray32("Clear", act->flags.clear, THEME_COLOR); + }, + "Clear"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Temp Clear"); - InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); - if (Button("Set All##Temp Clear", buttonOptionsBase.Tooltip(""))) { - act->flags.tempClear = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Temp Clear", buttonOptionsBase.Tooltip(""))) { - act->flags.tempClear = 0; - } - DrawFlagArray32("Temp Clear", act->flags.tempClear, THEME_COLOR); - }, "Temp Clear"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Temp Clear"); + InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions"); + if (Button("Set All##Temp Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.tempClear = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Temp Clear", buttonOptionsBase.Tooltip(""))) { + act->flags.tempClear = 0; + } + DrawFlagArray32("Temp Clear", act->flags.tempClear, THEME_COLOR); + }, + "Temp Clear"); - DrawGroupWithBorder([&]() { - ImGui::Text("Collect"); - InsertHelpHoverText("Permanently-saved collect flags"); - if (Button("Set All##Collect", buttonOptionsBase.Tooltip(""))) { - act->flags.collect = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Collect", buttonOptionsBase.Tooltip(""))) { - act->flags.collect = 0; - } - DrawFlagArray32("Collect", act->flags.collect, THEME_COLOR); - }, "Collect"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Collect"); + InsertHelpHoverText("Permanently-saved collect flags"); + if (Button("Set All##Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.collect = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.collect = 0; + } + DrawFlagArray32("Collect", act->flags.collect, THEME_COLOR); + }, + "Collect"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Temp Collect"); - InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); - if (Button("Set All##Temp Collect", buttonOptionsBase.Tooltip(""))) { - act->flags.tempCollect = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Temp Collect", buttonOptionsBase.Tooltip(""))) { - act->flags.tempCollect = 0; - } - DrawFlagArray32("Temp Collect", act->flags.tempCollect, THEME_COLOR); - }, "Temp Collect"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Temp Collect"); + InsertHelpHoverText("Temporary collect flags. Unset on scene transitions"); + if (Button("Set All##Temp Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.tempCollect = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Temp Collect", buttonOptionsBase.Tooltip(""))) { + act->flags.tempCollect = 0; + } + DrawFlagArray32("Temp Collect", act->flags.tempCollect, THEME_COLOR); + }, + "Temp Collect"); - DrawGroupWithBorder([&]() { - ImGui::Text("Chest"); - InsertHelpHoverText("Permanently-saved chest flags"); - if (Button("Set All##Chest", buttonOptionsBase.Tooltip(""))) { - act->flags.chest = UINT32_MAX; - } - ImGui::SameLine(); - if (Button("Clear All##Chest", buttonOptionsBase.Tooltip(""))) { - act->flags.chest = 0; - } - DrawFlagArray32("Chest", act->flags.chest, THEME_COLOR); - }, "Chest"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Chest"); + InsertHelpHoverText("Permanently-saved chest flags"); + if (Button("Set All##Chest", buttonOptionsBase.Tooltip(""))) { + act->flags.chest = UINT32_MAX; + } + ImGui::SameLine(); + if (Button("Clear All##Chest", buttonOptionsBase.Tooltip(""))) { + act->flags.chest = 0; + } + DrawFlagArray32("Chest", act->flags.chest, THEME_COLOR); + }, + "Chest"); ImGui::SameLine(); ImGui::BeginGroup(); - if (Button("Reload Flags", buttonOptionsBase.Tooltip("Load flags from saved scene flags. Normally happens on scene load"))) { + if (Button("Reload Flags", buttonOptionsBase.Tooltip( + "Load flags from saved scene flags. Normally happens on scene load"))) { act->flags.swch = gSaveContext.sceneFlags[gPlayState->sceneNum].swch; act->flags.clear = gSaveContext.sceneFlags[gPlayState->sceneNum].clear; act->flags.collect = gSaveContext.sceneFlags[gPlayState->sceneNum].collect; act->flags.chest = gSaveContext.sceneFlags[gPlayState->sceneNum].chest; } - if (Button("Save Flags", buttonOptionsBase.Tooltip("Save current scene flags. Normally happens on scene exit"))) { + if (Button("Save Flags", + buttonOptionsBase.Tooltip("Save current scene flags. Normally happens on scene exit"))) { gSaveContext.sceneFlags[gPlayState->sceneNum].swch = act->flags.swch; gSaveContext.sceneFlags[gPlayState->sceneNum].clear = act->flags.clear; gSaveContext.sceneFlags[gPlayState->sceneNum].collect = act->flags.collect; gSaveContext.sceneFlags[gPlayState->sceneNum].chest = act->flags.chest; } - - if (Button("Clear Flags", buttonOptionsBase.Tooltip("Clear current scene flags. Reload scene to see changes"))) { + + if (Button("Clear Flags", + buttonOptionsBase.Tooltip("Clear current scene flags. Reload scene to see changes"))) { act->flags.swch = 0; act->flags.clear = 0; act->flags.collect = 0; act->flags.chest = 0; } - ImGui::EndGroup(); } else { ImGui::Text("Current game state does not have an active scene"); @@ -745,105 +790,121 @@ void DrawFlagsTab() { } } - DrawGroupWithBorder([&]() { - ImGui::Text("Switch"); - InsertHelpHoverText("Switch flags"); - DrawFlagArray32("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch, THEME_COLOR); - }, "Saved Switch"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Switch"); + InsertHelpHoverText("Switch flags"); + DrawFlagArray32("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch, THEME_COLOR); + }, + "Saved Switch"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Clear"); - InsertHelpHoverText("Room-clear flags"); - DrawFlagArray32("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear, THEME_COLOR); - }, "Saved Clear"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Clear"); + InsertHelpHoverText("Room-clear flags"); + DrawFlagArray32("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear, THEME_COLOR); + }, + "Saved Clear"); - DrawGroupWithBorder([&]() { - ImGui::Text("Collect"); - InsertHelpHoverText("Collect flags"); - DrawFlagArray32("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect, THEME_COLOR); - }, "Saved Collect"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Collect"); + InsertHelpHoverText("Collect flags"); + DrawFlagArray32("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect, THEME_COLOR); + }, + "Saved Collect"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Chest"); - InsertHelpHoverText("Chest flags"); - DrawFlagArray32("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest, THEME_COLOR); - }, "Saved Chest"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Chest"); + InsertHelpHoverText("Chest flags"); + DrawFlagArray32("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest, THEME_COLOR); + }, + "Saved Chest"); - DrawGroupWithBorder([&]() { - ImGui::Text("Rooms"); - InsertHelpHoverText("Flags for visted rooms"); - DrawFlagArray32("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms, THEME_COLOR); - }, "Saved Rooms"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Rooms"); + InsertHelpHoverText("Flags for visted rooms"); + DrawFlagArray32("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms, THEME_COLOR); + }, + "Saved Rooms"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Floors"); - InsertHelpHoverText("Flags for visted floors"); - DrawFlagArray32("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors, THEME_COLOR); - }, "Saved Floors"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Floors"); + InsertHelpHoverText("Flags for visted floors"); + DrawFlagArray32("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors, THEME_COLOR); + }, + "Saved Floors"); ImGui::TreePop(); } - DrawGroupWithBorder([&]() { - size_t selectedGsMap = 0; - ImGui::Text("Gold Skulltulas"); - Combobox("Map##Gold Skulltulas", &selectedGsMap, gsMapping, comboboxOptionsBase.Tooltip("")); + DrawGroupWithBorder( + [&]() { + size_t selectedGsMap = 0; + ImGui::Text("Gold Skulltulas"); + Combobox("Map##Gold Skulltulas", &selectedGsMap, gsMapping, comboboxOptionsBase.Tooltip("")); - // TODO We should write out descriptions for each one... ugh - ImGui::AlignTextToFramePadding(); - ImGui::Text("Flags"); - uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); - uint32_t allFlags = gAreaGsFlags[selectedGsMap]; - uint32_t setMask = 1; - // Iterate over bitfield and create a checkbox for each skulltula - while (allFlags != 0) { - bool isThisSet = (currentFlags & 0x1) == 0x1; + // TODO We should write out descriptions for each one... ugh + ImGui::AlignTextToFramePadding(); + ImGui::Text("Flags"); + uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap); + uint32_t allFlags = gAreaGsFlags[selectedGsMap]; + uint32_t setMask = 1; + // Iterate over bitfield and create a checkbox for each skulltula + while (allFlags != 0) { + bool isThisSet = (currentFlags & 0x1) == 0x1; - ImGui::SameLine(); - ImGui::PushID(allFlags); - PushStyleCheckbox(THEME_COLOR); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); - if (ImGui::Checkbox("##gs", &isThisSet)) { - if (isThisSet) { - SET_GS_FLAGS(selectedGsMap, setMask); - } else { - // Have to do this roundabout method as the macro does not support clearing flags - uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); - gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; - SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); + ImGui::SameLine(); + ImGui::PushID(allFlags); + PushStyleCheckbox(THEME_COLOR); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); + if (ImGui::Checkbox("##gs", &isThisSet)) { + if (isThisSet) { + SET_GS_FLAGS(selectedGsMap, setMask); + } else { + // Have to do this roundabout method as the macro does not support clearing flags + uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap); + gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3]; + SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask); + } + } + ImGui::PopStyleVar(); + PopStyleCheckbox(); + + ImGui::PopID(); + + allFlags >>= 1; + currentFlags >>= 1; + setMask <<= 1; + } + + // If playing a Randomizer Save with Shuffle Skull Tokens on anything other than "Off" we don't want to keep + // GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected. + if (!(IS_RANDO && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS) != RO_TOKENSANITY_OFF)) { + static bool keepGsCountUpdated = true; + Checkbox("Keep GS Count Updated", &keepGsCountUpdated, + checkboxOptionsBase.Tooltip( + "Automatically adjust the number of gold skulltula tokens acquired based on set flags.")); + int32_t gsCount = 0; + if (keepGsCountUpdated) { + for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { + gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); + } + gSaveContext.inventory.gsTokens = gsCount; } } - ImGui::PopStyleVar(); - PopStyleCheckbox(); - - ImGui::PopID(); - - allFlags >>= 1; - currentFlags >>= 1; - setMask <<= 1; - } - - // If playing a Randomizer Save with Shuffle Skull Tokens on anything other than "Off" we don't want to keep - // GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected. - if (!(IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS) != RO_TOKENSANITY_OFF)) { - static bool keepGsCountUpdated = true; - Checkbox("Keep GS Count Updated", &keepGsCountUpdated, - checkboxOptionsBase.Tooltip("Automatically adjust the number of gold skulltula tokens acquired based on set flags.")); - int32_t gsCount = 0; - if (keepGsCountUpdated) { - for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { - gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex])); - } - gSaveContext.inventory.gsTokens = gsCount; - } - } - }, "Gold Skulltulas"); + }, + "Gold Skulltulas"); for (int i = 0; i < flagTables.size(); i++) { const FlagTable& flagTable = flagTables[i]; @@ -853,32 +914,34 @@ void DrawFlagsTab() { if (ImGui::TreeNode(flagTable.name)) { for (int j = 0; j < flagTable.size + 1; j++) { - DrawGroupWithBorder([&]() { - ImGui::Text("%s", fmt::format("{:<2x}", j).c_str()); - switch (flagTable.flagTableType) { - case EVENT_CHECK_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.eventChkInf[j]); - break; - case ITEM_GET_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.itemGetInf[j]); - break; - case INF_TABLE: - DrawFlagTableArray16(flagTable, j, gSaveContext.infTable[j]); - break; - case EVENT_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.eventInf[j]); - break; - case RANDOMIZER_INF: - DrawFlagTableArray16(flagTable, j, gSaveContext.ship.randomizerInf[j]); - break; - } - }, flagTable.name); + DrawGroupWithBorder( + [&]() { + ImGui::Text("%s", fmt::format("{:<2x}", j).c_str()); + switch (flagTable.flagTableType) { + case EVENT_CHECK_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.eventChkInf[j]); + break; + case ITEM_GET_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.itemGetInf[j]); + break; + case INF_TABLE: + DrawFlagTableArray16(flagTable, j, gSaveContext.infTable[j]); + break; + case EVENT_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.eventInf[j]); + break; + case RANDOMIZER_INF: + DrawFlagTableArray16(flagTable, j, gSaveContext.ship.randomizerInf[j]); + break; + } + }, + flagTable.name); } // make some buttons to help with fishsanity debugging uint8_t fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - if (flagTable.flagTableType == RANDOMIZER_INF && - fsMode != RO_FISHSANITY_OFF && fsMode != RO_FISHSANITY_OVERWORLD) { + if (flagTable.flagTableType == RANDOMIZER_INF && fsMode != RO_FISHSANITY_OFF && + fsMode != RO_FISHSANITY_OVERWORLD) { if (ImGui::Button("Catch All (Child)")) { for (int k = RAND_INF_CHILD_FISH_1; k <= RAND_INF_CHILD_LOACH_2; k++) { Flags_SetRandomizerInf((RandomizerInf)k); @@ -935,13 +998,14 @@ void DrawUpgradeIcon(const std::string& categoryName, int32_t categoryId, const static const char* upgradePopupPicker = "upgradePopupPicker"; ImGui::PushID(categoryName.c_str()); - - PushStyleButton(Colors::DarkGray); + + PushStyleButton(Colors::DarkGray); uint8_t item = items[CUR_UPG_VALUE(categoryId)]; if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping[item]; - if (ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1))) { + if (ImGui::ImageButton(slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1))) { ImGui::OpenPopup(upgradePopupPicker); } } else { @@ -957,18 +1021,21 @@ void DrawUpgradeIcon(const std::string& categoryName, int32_t categoryId, const if ((pickerIndex % 8) != 0) { ImGui::SameLine(); } - + PushStyleButton(Colors::DarkGray); if (items[pickerIndex] == ITEM_NONE) { - if (ImGui::Button("##upgradePopupPicker", ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { + if (ImGui::Button("##upgradePopupPicker", + ImVec2(IMAGE_SIZE, IMAGE_SIZE) + ImGui::GetStyle().FramePadding * 2)) { Inventory_ChangeUpgrade(categoryId, pickerIndex); ImGui::CloseCurrentPopup(); } Tooltip("None"); } else { const ItemMapEntry& slotEntry = itemMapping[items[pickerIndex]]; - auto ret = ImGui::ImageButton(slotEntry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), - ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); + auto ret = ImGui::ImageButton( + slotEntry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { Inventory_ChangeUpgrade(categoryId, pickerIndex); ImGui::CloseCurrentPopup(); @@ -1003,7 +1070,9 @@ void DrawEquipmentTab() { bool hasEquip = (bitMask & gSaveContext.inventory.equipment) != 0; const ItemMapEntry& entry = itemMapping[equipmentValues[i]]; PushStyleButton(Colors::DarkGray); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasEquip ? entry.name : entry.nameFaded), + auto ret = ImGui::ImageButton(entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasEquip ? entry.name : entry.nameFaded), ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasEquip) { @@ -1103,8 +1172,10 @@ void DrawQuestItemButton(uint32_t item) { uint32_t bitMask = 1 << entry.id; bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; PushStyleButton(Colors::DarkGray); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), - ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); + auto ret = ImGui::ImageButton(entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasQuestItem ? entry.name : entry.nameFaded), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasQuestItem) { gSaveContext.inventory.questItems &= ~bitMask; @@ -1122,8 +1193,10 @@ void DrawDungeonItemButton(uint32_t item, uint32_t scene) { uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0; PushStyleButton(Colors::DarkGray); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem ? entry.name : entry.nameFaded), - ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); + auto ret = ImGui::ImageButton( + entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem ? entry.name : entry.nameFaded), + ImVec2(IMAGE_SIZE, IMAGE_SIZE), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasItem) { gSaveContext.inventory.dungeonItems[scene] &= ~bitMask; @@ -1168,7 +1241,9 @@ void DrawQuestStatusTab() { uint32_t bitMask = 1 << entry.id; bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0; PushStyleButton(Colors::DarkGray); - auto ret = ImGui::ImageButton(entry.name.c_str(), Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded), + auto ret = ImGui::ImageButton(entry.name.c_str(), + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasQuestItem ? entry.name : entry.nameFaded), ImVec2(32.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); if (ret) { if (hasQuestItem) { @@ -1211,44 +1286,50 @@ void DrawQuestStatusTab() { InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container"); PopStyleCombobox(); - DrawGroupWithBorder([&]() { - ImGui::Text("Dungeon Items"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Dungeon Items"); - static int32_t dungeonItemsScene = SCENE_DEKU_TREE; - PushStyleCombobox(THEME_COLOR); - if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) { - for (int32_t dungeonIndex = SCENE_DEKU_TREE; dungeonIndex < SCENE_JABU_JABU_BOSS + 1; dungeonIndex++) { - if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(), - dungeonIndex == dungeonItemsScene)) { - dungeonItemsScene = dungeonIndex; + static int32_t dungeonItemsScene = SCENE_DEKU_TREE; + PushStyleCombobox(THEME_COLOR); + if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) { + for (int32_t dungeonIndex = SCENE_DEKU_TREE; dungeonIndex < SCENE_JABU_JABU_BOSS + 1; dungeonIndex++) { + if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(), + dungeonIndex == dungeonItemsScene)) { + dungeonItemsScene = dungeonIndex; + } } + + ImGui::EndCombo(); } + PopStyleCombobox(); - ImGui::EndCombo(); - } - PopStyleCombobox(); - - DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene); - ImGui::SameLine(); - DrawDungeonItemButton(ITEM_COMPASS, dungeonItemsScene); - ImGui::SameLine(); - DrawDungeonItemButton(ITEM_DUNGEON_MAP, dungeonItemsScene); - - if (dungeonItemsScene != SCENE_JABU_JABU_BOSS) { - float lineHeight = ImGui::GetTextLineHeightWithSpacing(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[ITEM_KEY_SMALL].name), ImVec2(lineHeight, lineHeight)); + DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene); ImGui::SameLine(); - PushStyleInput(THEME_COLOR); - if (ImGui::InputScalar("##Keys", ImGuiDataType_S8, gSaveContext.inventory.dungeonKeys + dungeonItemsScene)) { - gSaveContext.ship.stats.dungeonKeys[dungeonItemsScene] = gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; - }; - PopStyleInput(); - } else { - // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene (Barinade's Lair) - ImGui::Text("Barinade's Lair does not have small keys"); - } - }, "Dungeon Items"); + DrawDungeonItemButton(ITEM_COMPASS, dungeonItemsScene); + ImGui::SameLine(); + DrawDungeonItemButton(ITEM_DUNGEON_MAP, dungeonItemsScene); + if (dungeonItemsScene != SCENE_JABU_JABU_BOSS) { + float lineHeight = ImGui::GetTextLineHeightWithSpacing(); + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + itemMapping[ITEM_KEY_SMALL].name), + ImVec2(lineHeight, lineHeight)); + ImGui::SameLine(); + PushStyleInput(THEME_COLOR); + if (ImGui::InputScalar("##Keys", ImGuiDataType_S8, + gSaveContext.inventory.dungeonKeys + dungeonItemsScene)) { + gSaveContext.ship.stats.dungeonKeys[dungeonItemsScene] = + gSaveContext.inventory.dungeonKeys[dungeonItemsScene]; + }; + PopStyleInput(); + } else { + // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene + // (Barinade's Lair) + ImGui::Text("Barinade's Lair does not have small keys"); + } + }, + "Dungeon Items"); } void DrawPlayerTab() { @@ -1261,7 +1342,7 @@ void DrawPlayerTab() { switch (player->currentSwordItemId) { case ITEM_SWORD_KOKIRI: - curSword = "Kokiri Sword"; + curSword = "Kokiri Sword"; break; case ITEM_SWORD_MASTER: curSword = "Master Sword"; @@ -1327,34 +1408,40 @@ void DrawPlayerTab() { ImGui::PushItemWidth(ImGui::GetFontSize() * 6); PushStyleInput(THEME_COLOR); - DrawGroupWithBorder([&]() { - ImGui::Text("Link's Position"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 12); - ImGui::InputScalar("X##Pos", ImGuiDataType_Float, &player->actor.world.pos.x); - ImGui::InputScalar("Y##Pos", ImGuiDataType_Float, &player->actor.world.pos.y); - ImGui::InputScalar("Z##Pos", ImGuiDataType_Float, &player->actor.world.pos.z); - ImGui::PopItemWidth(); - }, "Link's Position"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Link's Position"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##Pos", ImGuiDataType_Float, &player->actor.world.pos.x); + ImGui::InputScalar("Y##Pos", ImGuiDataType_Float, &player->actor.world.pos.y); + ImGui::InputScalar("Z##Pos", ImGuiDataType_Float, &player->actor.world.pos.z); + ImGui::PopItemWidth(); + }, + "Link's Position"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Link's Rotation"); - InsertHelpHoverText("For Link's rotation in relation to the world"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 12); - ImGui::InputScalar("X##Rot", ImGuiDataType_S16, &player->actor.world.rot.x); - ImGui::InputScalar("Y##Rot", ImGuiDataType_S16, &player->actor.world.rot.y); - ImGui::InputScalar("Z##Rot", ImGuiDataType_S16, &player->actor.world.rot.z); - ImGui::PopItemWidth(); - }, "Link's Rotation"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Link's Rotation"); + InsertHelpHoverText("For Link's rotation in relation to the world"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##Rot", ImGuiDataType_S16, &player->actor.world.rot.x); + ImGui::InputScalar("Y##Rot", ImGuiDataType_S16, &player->actor.world.rot.y); + ImGui::InputScalar("Z##Rot", ImGuiDataType_S16, &player->actor.world.rot.z); + ImGui::PopItemWidth(); + }, + "Link's Rotation"); ImGui::SameLine(); - DrawGroupWithBorder([&]() { - ImGui::Text("Link's Model Rotation"); - InsertHelpHoverText("For Link's actual model"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 12); - ImGui::InputScalar("X##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.x); - ImGui::InputScalar("Y##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.y); - ImGui::InputScalar("Z##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.z); - ImGui::PopItemWidth(); - }, "Link's Model Rotation"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Link's Model Rotation"); + InsertHelpHoverText("For Link's actual model"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + ImGui::InputScalar("X##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.x); + ImGui::InputScalar("Y##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.y); + ImGui::InputScalar("Z##ModRot", ImGuiDataType_S16, &player->actor.shape.rot.z); + ImGui::PopItemWidth(); + }, + "Link's Model Rotation"); ImGui::InputScalar("Linear Velocity", ImGuiDataType_Float, &player->linearVelocity); InsertHelpHoverText("Link's speed along the XZ plane"); @@ -1385,136 +1472,141 @@ void DrawPlayerTab() { InsertHelpHoverText("This will change Link's age when you load a map"); PopStyleCombobox(); ImGui::Separator(); - - DrawGroupWithBorder([&]() { - PushStyleCombobox(THEME_COLOR); - ImGui::Text("Link's Current Equipment"); - ImGui::PushItemWidth(ImGui::GetFontSize() * 12); - if (ImGui::BeginCombo("Sword", curSword)) { - if (ImGui::Selectable("None")) { - player->currentSwordItemId = ITEM_NONE; - gSaveContext.equips.buttonItems[0] = ITEM_NONE; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE); - } - if (ImGui::Selectable("Kokiri Sword")) { - player->currentSwordItemId = ITEM_SWORD_KOKIRI; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); - } - if (ImGui::Selectable("Master Sword")) { - player->currentSwordItemId = ITEM_SWORD_MASTER; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); - } - if (ImGui::Selectable("Biggoron's Sword")) { - if (gSaveContext.bgsFlag) { - if (gSaveContext.swordHealth < 8) { - gSaveContext.swordHealth = 8; - } - player->currentSwordItemId = ITEM_SWORD_BGS; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; + + DrawGroupWithBorder( + [&]() { + PushStyleCombobox(THEME_COLOR); + ImGui::Text("Link's Current Equipment"); + ImGui::PushItemWidth(ImGui::GetFontSize() * 12); + if (ImGui::BeginCombo("Sword", curSword)) { + if (ImGui::Selectable("None")) { + player->currentSwordItemId = ITEM_NONE; + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE); } - else { - if (gSaveContext.swordHealth < 8) { - gSaveContext.swordHealth = 8; - } - player->currentSwordItemId = ITEM_SWORD_BGS; - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; + if (ImGui::Selectable("Kokiri Sword")) { + player->currentSwordItemId = ITEM_SWORD_KOKIRI; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI); } + if (ImGui::Selectable("Master Sword")) { + player->currentSwordItemId = ITEM_SWORD_MASTER; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + } + if (ImGui::Selectable("Biggoron's Sword")) { + if (gSaveContext.bgsFlag) { + if (gSaveContext.swordHealth < 8) { + gSaveContext.swordHealth = 8; + } + player->currentSwordItemId = ITEM_SWORD_BGS; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; + } else { + if (gSaveContext.swordHealth < 8) { + gSaveContext.swordHealth = 8; + } + player->currentSwordItemId = ITEM_SWORD_BGS; + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; + } - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON); + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON); + } + if (ImGui::Selectable("Fishing Pole")) { + player->currentSwordItemId = ITEM_FISHING_POLE; + gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; + Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + } + ImGui::EndCombo(); } - if (ImGui::Selectable("Fishing Pole")) { - player->currentSwordItemId = ITEM_FISHING_POLE; - gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; - Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); + if (ImGui::BeginCombo("Shield", curShield)) { + if (ImGui::Selectable("None")) { + player->currentShield = PLAYER_SHIELD_NONE; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); + } + if (ImGui::Selectable("Deku Shield")) { + player->currentShield = PLAYER_SHIELD_DEKU; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); + } + if (ImGui::Selectable("Hylian Shield")) { + player->currentShield = PLAYER_SHIELD_HYLIAN; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN); + } + if (ImGui::Selectable("Mirror Shield")) { + player->currentShield = PLAYER_SHIELD_MIRROR; + Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR); + } + ImGui::EndCombo(); } - ImGui::EndCombo(); - } - if (ImGui::BeginCombo("Shield", curShield)) { - if (ImGui::Selectable("None")) { - player->currentShield = PLAYER_SHIELD_NONE; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); + if (ImGui::BeginCombo("Tunic", curTunic)) { + if (ImGui::Selectable("Kokiri Tunic")) { + player->currentTunic = PLAYER_TUNIC_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); + } + if (ImGui::Selectable("Goron Tunic")) { + player->currentTunic = PLAYER_TUNIC_GORON; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON); + } + if (ImGui::Selectable("Zora Tunic")) { + player->currentTunic = PLAYER_TUNIC_ZORA; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA); + } + ImGui::EndCombo(); } - if (ImGui::Selectable("Deku Shield")) { - player->currentShield = PLAYER_SHIELD_DEKU; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU); - } - if (ImGui::Selectable("Hylian Shield")) { - player->currentShield = PLAYER_SHIELD_HYLIAN; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN); - } - if (ImGui::Selectable("Mirror Shield")) { - player->currentShield = PLAYER_SHIELD_MIRROR; - Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR); - } - ImGui::EndCombo(); - } - if (ImGui::BeginCombo("Tunic", curTunic)) { - if (ImGui::Selectable("Kokiri Tunic")) { - player->currentTunic = PLAYER_TUNIC_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); + if (ImGui::BeginCombo("Boots", curBoots)) { + if (ImGui::Selectable("Kokiri Boots")) { + player->currentBoots = PLAYER_BOOTS_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); + } + if (ImGui::Selectable("Iron Boots")) { + player->currentBoots = PLAYER_BOOTS_IRON; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON); + } + if (ImGui::Selectable("Hover Boots")) { + player->currentBoots = PLAYER_BOOTS_HOVER; + Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER); + } + ImGui::EndCombo(); } - if (ImGui::Selectable("Goron Tunic")) { - player->currentTunic = PLAYER_TUNIC_GORON; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON); - } - if (ImGui::Selectable("Zora Tunic")) { - player->currentTunic = PLAYER_TUNIC_ZORA; - Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA); - } - ImGui::EndCombo(); - } - - if (ImGui::BeginCombo("Boots", curBoots)) { - if (ImGui::Selectable("Kokiri Boots")) { - player->currentBoots = PLAYER_BOOTS_KOKIRI; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); - } - if (ImGui::Selectable("Iron Boots")) { - player->currentBoots = PLAYER_BOOTS_IRON; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON); - } - if (ImGui::Selectable("Hover Boots")) { - player->currentBoots = PLAYER_BOOTS_HOVER; - Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER); - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - PopStyleCombobox(); - }, "Current Equipment"); + ImGui::PopItemWidth(); + PopStyleCombobox(); + }, + "Current Equipment"); ImGui::SameLine(); ImU16 one = 1; - DrawGroupWithBorder([&]() { - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - PushStyleInput(THEME_COLOR); - ImGui::Text("Current Items"); - ImGui::InputScalar("B Button", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[0], &one, NULL); - ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL); - ImGui::InputScalar("C Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[2], &one, NULL); - ImGui::InputScalar("C Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[3], &one, NULL); - PopStyleInput(); - ImGui::PopItemWidth(); - }, "Current Items"); - - if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0)) { - ImGui::SameLine(); - DrawGroupWithBorder([&]() { + DrawGroupWithBorder( + [&]() { ImGui::PushItemWidth(ImGui::GetFontSize() * 6); PushStyleInput(THEME_COLOR); - ImGui::Text("Current D-pad Items"); - // Two spaces at the end for aligning, not elegant but it's working - ImGui::InputScalar("D-pad Up ", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[4], &one, NULL); - ImGui::InputScalar("D-pad Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[5], &one, NULL); - ImGui::InputScalar("D-pad Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[6], &one, NULL); - ImGui::InputScalar("D-pad Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[7], &one, NULL); + ImGui::Text("Current Items"); + ImGui::InputScalar("B Button", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[0], &one, NULL); + ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL); + ImGui::InputScalar("C Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[2], &one, NULL); + ImGui::InputScalar("C Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[3], &one, NULL); PopStyleInput(); ImGui::PopItemWidth(); - }, "Current D-pad Items"); + }, + "Current Items"); + + if (CVarGetInteger(CVAR_ENHANCEMENT("DpadEquips"), 0)) { + ImGui::SameLine(); + DrawGroupWithBorder( + [&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Current D-pad Items"); + // Two spaces at the end for aligning, not elegant but it's working + ImGui::InputScalar("D-pad Up ", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[4], &one, NULL); + ImGui::InputScalar("D-pad Down", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[5], &one, NULL); + ImGui::InputScalar("D-pad Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[6], &one, NULL); + ImGui::InputScalar("D-pad Right", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[7], &one, + NULL); + PopStyleInput(); + ImGui::PopItemWidth(); + }, + "Current D-pad Items"); } ImGui::Text("Player State"); @@ -1524,22 +1616,26 @@ void DrawPlayerTab() { for (int j = 0; j <= 2; j++) { std::string label = fmt::format("State Flags {}", j + 1); - DrawGroupWithBorder([&]() { - ImGui::Text("%s", label.c_str()); - std::vector state = flag_strs[j]; - for (int i = 0; i <= 31; i++) { - bit[i] = ((flags[j] >> i) & 1); - if (bit[i] != 0) { - ImGui::Text("%s", state[i].c_str()); + DrawGroupWithBorder( + [&]() { + ImGui::Text("%s", label.c_str()); + std::vector state = flag_strs[j]; + for (int i = 0; i <= 31; i++) { + bit[i] = ((flags[j] >> i) & 1); + if (bit[i] != 0) { + ImGui::Text("%s", state[i].c_str()); + } } - } - }, label.c_str()); + }, + label.c_str()); ImGui::SameLine(); } - DrawGroupWithBorder([&]() { - ImGui::Text("Sword"); - ImGui::Text(" %d", player->meleeWeaponState); - }, "Sword"); + DrawGroupWithBorder( + [&]() { + ImGui::Text("Sword"); + ImGui::Text(" %d", player->meleeWeaponState); + }, + "Sword"); } else { ImGui::Text("Global Context needed for player info!"); @@ -1547,10 +1643,13 @@ void DrawPlayerTab() { } void ResetBaseOptions() { - intSliderOptionsBase.Color(THEME_COLOR).Size({320.0f, 0.0f}).Tooltip(""); + intSliderOptionsBase.Color(THEME_COLOR).Size({ 320.0f, 0.0f }).Tooltip(""); buttonOptionsBase.Color(THEME_COLOR).Size(Sizes::Inline).Tooltip(""); checkboxOptionsBase.Color(THEME_COLOR).Tooltip(""); - comboboxOptionsBase.Color(THEME_COLOR).ComponentAlignment(ComponentAlignments::Left).LabelPosition(LabelPositions::Near).Tooltip(""); + comboboxOptionsBase.Color(THEME_COLOR) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Near) + .Tooltip(""); } void SaveEditorWindow::DrawElement() { @@ -1601,4 +1700,5 @@ void SaveEditorWindow::DrawElement() { PopStyleTabs(); } -void SaveEditorWindow::InitElement() {} +void SaveEditorWindow::InitElement() { +} diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index 04e01917d..9c0819e19 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -26,1608 +26,1667 @@ typedef struct { // Reference https://tcrf.net/Proto:The_Legend_of_Zelda:_Ocarina_of_Time_Master_Quest/Event_Editor // The source was last referenced on 2022-09-03 and had a last updated value of 2020-05-02 const std::vector flagTables = { - { "Event Check Inf Flags", EVENT_CHECK_INF, 0x0D, { - { 0x02, "First Spoke to Mido" }, - { 0x03, "Complained About Mido to Saria" }, - { 0x04, "Showed Mido Sword & Shield" }, - { 0x05, "Deku Tree Opened Mouth" }, - { 0x06, "Spoke to Saria After Deku Tree's Death" }, - { 0x07, "Obtained Kokiri Emerald & Deku Tree Dead" }, - { 0x09, "Used Deku Tree Blue Warp" }, - { 0x0A, "Played Saria's Song for Mido as Adult" }, - { 0x0C, "Met Deku Tree" }, - { 0x0F, "Spoke to Mido about Saria's whereabouts" }, - { 0x10, "Spoke to Child Malon at Castle or Market" }, - { 0x11, "Spoke to Ingo at Ranch before Talon returns" }, - { 0x12, "Obtained Pocket Egg" }, - { 0x13, "Woke Talon" }, - { 0x14, "Talon Fled Hyrule Castle" }, - { 0x15, "Spoke to Child Malon at Ranch" }, - { 0x16, "Invited to Sing With Child Malon" }, - { 0x17, "Great Deku Tree is Dead" }, - { 0x18, "Obtained Epona" }, - { 0x19, "Obtained Kokiri's Emerald" }, - { 0x1B, "Rented Horse From Ingo" }, - { 0x1C, "Spoke to Mido After Deku Tree's Death" }, - { 0x1D, "Destroyed the Royal Family's Tomb" }, - { 0x1E, "Won the Cow in Malon's Race" }, - { 0x23, "Bombed Dodongo's Cavern Entrance" }, - { 0x25, "Used Dodongo's Cavern Blue Warp" }, - { 0x2F, "Death Mountain Erupted" }, - { 0x30, "Spoke to a Zora" }, - { 0x31, "Obtained Ruto's Letter" }, - { 0x33, "King Zora Moved Aside" }, - { 0x37, "Used Jabu-Jabu Blue Warp" }, - { 0x38, "Obtained Silver Scale" }, - { 0x39, "Opened Entrance to Zora's Domain" }, - { 0x3A, "Offered Fish to Jabu-Jabu" }, - { 0x3B, "Began Nabooru Battle" }, - { 0x3C, "Finished Nabooru Battle" }, - { 0x40, "Obtained Zelda's Letter" }, - { 0x43, "Obtained Ocarina of Time" }, - { 0x45, "Pulled Master Sword from Pedestal" }, - { 0x48, "Used Forest Temple Blue Warp" }, - { 0x49, "Used Fire Temple Blue Warp" }, - { 0x4A, "Used Water Temple Blue Warp" }, - { 0x4B, "Opened the Door of Time" }, - { 0x4D, "Rainbow Bridge Built by Sages" }, - { 0x4E, "Caught by Hyrule Castle Guards" }, - { 0x4F, "Entered the Master Sword Chamber" }, - { 0x50, "Learned Minuet of Forest" }, - { 0x51, "Learned Bolero of Fire" }, - { 0x52, "Learned Serenade of Water" }, - { 0x54, "Learned Nocturne of Shadow" }, - { 0x55, "Sheik Moved From Sword Pedestal" }, - { 0x57, "Learned Saria's Song" }, - { 0x59, "Learned Zelda's Lullaby" }, - { 0x5A, "Learned Sun's Song" }, - { 0x5B, "Learned Song of Storms" }, - { 0x65, "Played Song of Storms in Windmill" }, - { 0x67, "Drained Well in Kakariko Village" }, - { 0x68, "Played Gerudo Archery Minigame" }, - { 0x69, "Restored Lake Hylia's Water" }, - { 0x6A, "Woke Talon in Kakariko" }, - { 0x6B, "Spoke to Talon After Saving Ranch" }, - { 0x6F, "Spoke to Kaepora Gaebora by Lost Woods" }, - { 0x70, "Began Gohma Battle" }, - { 0x71, "Began King Dodongo Battle" }, - { 0x72, "Began Phantom Ganon Battle" }, - { 0x73, "Began Volvagia Battle" }, - { 0x74, "Began Morpha Battle" }, - { 0x75, "Began Twinrova Battle" }, - { 0x76, "Began Barinade Battle" }, - { 0x77, "Began Bongo Bongo Battle" }, - { 0x78, "Began Ganondorf Battle" }, - { 0x80, "Zelda Fled Hyrule Castle" }, - { 0x82, "Bridge Unlocked (After Zelda Escape Cutscene)" }, - { 0x8C, "Paid Back Keaton Mask Fee" }, - { 0x8D, "Paid Back Skull Mask Fee" }, - { 0x8E, "Paid Back Spooky Mask Fee" }, - { 0x8F, "Paid Back Bunny Hood Fee" }, - { 0x90, "Rescued Red Carpenter" }, - { 0x91, "Rescued Yellow Carpenter" }, - { 0x92, "Rescued Blue Carpenter" }, - { 0x93, "Rescued Green Carpenter" }, - { 0x94, "Spoke to Nabooru in Spirit Temple" }, - { 0x95, "Nabooru Captured by Twinrova" }, - { 0x96, "Spoke to Cursed Man in Skulltula House" }, - { 0x9C, "Played Song for Scarecrow as Adult" }, - { 0xA0, "Entered Hyrule Field" }, - { 0xA1, "Entered Death Mountain Trail" }, - { 0xA3, "Entered Kakariko Village" }, - { 0xA4, "Entered Zora's Domain" }, - { 0xA5, "Entered Hyrule Castle" }, - { 0xA6, "Entered Goron City" }, - { 0xA7, "Entered Temple of Time" }, - { 0xA8, "Entered Deku Tree" }, - { 0xA9, "Learned Song of Time" }, - { 0xAA, "Bongo Bongo Escaped Well" }, - { 0xAC, "Learned Requiem of Spirit" }, - { 0xAD, "Completed Spirit Trial" }, - { 0xB0, "Entered Dodongo's Cavern" }, - { 0xB1, "Entered Lake Hylia" }, - { 0xB2, "Entered Gerudo Valley" }, - { 0xB3, "Entered Gerudo's Fortress" }, - { 0xB4, "Entered Lon Lon Ranch" }, - { 0xB5, "Entered Jabu-Jabu's Belly" }, - { 0xB6, "Entered Graveyard" }, - { 0xB7, "Entered Zora's Fountain" }, - { 0xB8, "Entered Desert Colossus" }, - { 0xB9, "Entered Death Mountain Crater" }, - { 0xBA, "Entered Ganon's Castle (Exterior)" }, - { 0xBB, "Completed Forest Trial" }, - { 0xBC, "Completed Water Trial" }, - { 0xBD, "Completed Shadow Trial" }, - { 0xBE, "Completed Fire Trial" }, - { 0xBF, "Completed Light Trial" }, - { 0xC0, "Nabooru Ordered to Fight by Twinrova" }, - { 0xC1, "Spoke to Saria on Lost Woods Bridge" }, - { 0xC3, "Dispelled Ganon's Tower Barrier" }, - { 0xC4, "Returned to Temple of Time With All Medallions" }, - { 0xC5, "Sheik, Spawned at Master Sword Pedestal as Adult" }, - { 0xC6, "Spoke to Deku Tree Sprout" }, - { 0xC7, "Watched Ganon's Tower Collapse / Caught by Gerudo" }, - { 0xC8, "Obtained Spirit Medallion" }, - { 0xC9, "Demo_Effect, Temple of Time Warp in blue aura + sfx the first time you spawn as Adult" }, - { 0xD0, "Obtained Frogs' Piece of Heart" }, - { 0xD1, "Played Zelda's Lullaby for Frogs" }, - { 0xD2, "Played Epona's Song for Frogs" }, - { 0xD3, "Played Sun's Song for Frogs" }, - { 0xD4, "Played Saria's Song for Frogs" }, - { 0xD5, "Played Song of Time for Frogs" }, - { 0xD6, "Played Song of Storms for Frogs" }, - { 0xDA, "Obtained Adult's Wallet" }, - { 0xDB, "Obtained Stone of Agony" }, - { 0xDC, "Obtained Giant's Wallet" }, - { 0xDD, "Obtained Skulltula House's Bombchu" }, - { 0xDE, "Obtained Skulltula House's Piece of Heart" }, - } }, - { "Item Get Inf Flags", ITEM_GET_INF, 0x03, { - { 0x02, "Obtained Super Cucco Bottle" }, - { 0x03, "Bought Bombchu (Shelf 2: Top Right)" }, - { 0x04, "Bought Bombchu (Shelf 1: Bot. Right)" }, - { 0x05, "Bought Bombchu (Shelf 1: Top Left)" }, - { 0x06, "Bought Bombchu (Shelf 2: Bot. Left)" }, - { 0x07, "Bought Bombchu (Shelf 2: Bot. Right)" }, - { 0x08, "Bought Bombchu (Shelf 1: Top Right)" }, - { 0x09, "Bought Bombchu (Shelf 1: Bot. Left)" }, - { 0x0A, "Bought Bombchu (Shelf 2: Top Left)" }, - { 0x0B, "Obtained Scrub's Heart Piece" }, - { 0x0C, "Obtained Cucco Lady's Bottle" }, - { 0x0D, "Obtained Bullet Bag Upgrade (Market)" }, - { 0x0E, "Obtained Big Quiver" }, - { 0x0F, "Obtained Biggest Quiver" }, - { 0x10, "Obtained Scientist's Heart Piece" }, - { 0x11, "Obtained Bowling Bomb Bag Upgrade" }, - { 0x12, "Obtained Bowling Heart Piece" }, - { 0x13, "Obtained Deku Seeds" }, - { 0x15, "Obtained Roof Guy's Heart Piece" }, - { 0x16, "Obtained Skullkid's Heart Piece" }, - { 0x17, "Obtained Skullkids' Heart Piece" }, - { 0x18, "Obtained Farore's Wind" }, - { 0x19, "Obtained Din's Fire" }, - { 0x1A, "Obtained Nayru's Love" }, - { 0x1B, "Obtained Treasure Chest Game Reward" }, - { 0x1C, "Obtained Grave-Dig Heart Piece" }, - { 0x1D, "Obtained Bullet Bag Upgrade (Woods)" }, - { 0x1E, "Obtained Deku Stick Upgrade (Stage)" }, - { 0x1F, "Obtained Deku Nut Upgrade (Stage)" }, - { 0x23, "Obtained Keaton Mask" }, - { 0x24, "Obtained Skull Mask" }, - { 0x25, "Obtained Spooky Mask" }, - { 0x26, "Obtained Bunny Hood" }, - { 0x2A, "Obtained Mask of Truth" }, - { 0x2C, "Obtained Pocket Egg" }, - { 0x2E, "Obtained Cojiro" }, - { 0x30, "Obtained Odd Potion" }, - { 0x31, "Obtained Poacher's Saw" }, - { 0x38, "Sold Keaton Mask" }, - { 0x39, "Sold Skull Mask" }, - { 0x3A, "Sold Spooky Mask" }, - { 0x3B, "Sold Bunny Hood" }, - { 0x3F, "Obtained Mask of Truth" }, - } }, - { "Inf Flags", INF_TABLE, 0x1D, { - { 0x00, "Greeted by Saria" }, - { 0x01, "Spoke to Saria About Obtaining Fairy" }, - { 0x03, "Complained About Mido to Saria" }, - { 0x05, "Spoke to Saria in Saria's House" }, - { 0x0C, "Mido Asked to See Sword & Shield" }, - { 0x15, "Spoke to Mido in Lost Woods as Adult" }, - { 0x19, "Told Mido Saria Won't Return" }, - { 0x1E, "Spoke to Kokiri Girl by Jumping Stones" }, - { 0x22, "Spoke to Kokiri Boy Guarding Forest Exit" }, - { 0x24, "Spoke to Kokiri Boy Cutting Grass" }, - { 0x26, "Spoke to Kokiri Girl on Shop Awning" }, - { 0x28, "Spoke to Kokiri Girl About Training Center" }, - { 0x41, "Spoke to Kokiri Boy on Bed in Mido's House" }, - { 0x51, "Spoke to Kokiri Girl in Saria's House" }, - { 0x59, "Spoke to Know-It-All Bro. About Temple" }, - { 0x61, "Spoke to Know-It-All Bro. About Saria" }, - { 0x66, "Spoke to Deku Tree Sprout After Cutscene" }, - { 0x6C, "Spoke to Dying Knight" }, - { 0x76, "Showed Zelda's Letter to Gate Guard" }, - { 0x77, "Gate Guard Put On Keaton Mask" }, - { 0x7E, "Spoke to Talon in Lon Lon Ranch House" }, - { 0x84, "Spoke to Child Malon at Castle or Market" }, - { 0x85, "Child Malon Said Epona Was Afraid of You" }, - { 0x8B, "Entered Hyrule Castle" }, - { 0x94, "Spoke to Ingo at Ranch Before Talon's Return" }, - { 0x97, "Spoke to Ingo at Ranch" }, - { 0x9A, "Spoke to Ingo as Adult" }, - { 0xA2, "Refused Ingo's 50 Rupee Rental Request" }, - { 0xAB, "Rode a Horse at Ingo's Ranch" }, - { 0xB0, "Spoke to Medigoron as Child" }, - { 0xB1, "Spoke to Medigoron as Adult" }, - { 0xB6, "Spoke to Poe Collector in Ruined Market" }, - { 0xB7, "Spoke to Fado in Kokiri Forest as Child" }, - { 0xB8, "Spoke to Malon After Saving Ranch" }, - { 0xB9, "Spoke to Malon on Horseback" }, - { 0xBC, "Fado requested Odd Potion" }, - { 0xC0, "Spoke to Fat Woman by Market Potion Shop" }, - { 0xC1, "Spoke to Fat Woman After Zelda's Escape" }, - { 0xC2, "Spoke to Burly Man About Talon Search" }, - { 0xC3, "Spoke to Burly Man After Zelda's Escape" }, - { 0xC4, "Spoke to Thief After Zelda's Escape" }, - { 0xC5, "Spoke to Thin Man by Market Target Shop" }, - { 0xC6, "Spoke to Old Woman by Market Fountain" }, - { 0xC7, "Spoke to Old Man by Bombchu Bowling" }, - { 0xC8, "Spoke to Thin Lady by Bombchu Bowling" }, - { 0xC9, "Spoke to Thin Lady After Zelda's Escape (1.0)" }, - { 0xCA, "Spoke to Red Joker in Market" }, - { 0xCB, "Spoke to Blue Joker in Market (1.0) / Dog Lady as Adult (DBG)" }, - { 0xCC, "Spoke to Itchy Lady After Malon Left Town" }, - { 0xCD, "Spoke to Blue Jokester in Market (DBG)" }, - { 0xCE, "Spoke to Thin Lady After Zelda's Escape (DBG)" }, - { 0xD9, "Spoke to Dampé as Child" }, - { 0xE0, "Spoke to Goron by Cavern" }, - { 0xE3, "Spoke to Goron Hiding Stick" }, - { 0xE6, "Spoke to Goron by Woods Exit" }, - { 0xEB, "Spoke to Goron by Bomb Flowers" }, - { 0xF0, "Spoke to Goron at City? Entrance" }, - { 0xF4, "Spoke to Ruby-Crazed Goron" }, - { 0xFC, "Spoke to Goron Shop Owner" }, - { 0x109, "Goron City Doors Unlocked" }, - { 0x10B, "Spoke to Goron Link About Volvagia" }, - { 0x10C, "Stopped Goron Link's Rolling" }, - { 0x10E, "Spoke to Goron Link" }, - { 0x113, "Spoke to Darunia in Goron City" }, - { 0x11A, "Spoke to Darunia in Fire Temple" }, - { 0x11E, "Obtained Bomb Bag Upgrade (Goron City)" }, - { 0x124, "Spoke to Zora Near Zora Shop?" }, - { 0x128, "Spoke to Zora Beside Zora Shop?" }, - { 0x129, "Spoke to Zora Swimming Behind Zora Shop" }, - { 0x138, "Thawed King Zora" }, - { 0x139, "Obtained Zora Tunic" }, - { 0x140, "Ruto in JJ (M7) on Blue Switch" }, - { 0x141, "Ruto in JJ (M2) Meet Ruto" }, - { 0x142, "Ruto in JJ (M3) Talk First Time" }, - { 0x143, "Ruto in JJ (M10) Can Be Escorted" }, - { 0x144, "Ruto in JJ (?) Wants to be Tossed to Sapphire" }, - { 0x145, "Ruto in JJ (M6) on Sapphire platform" }, - { 0x146, "Ruto in JJ (M6) Kidnapped" }, - { 0x147, "Ruto in JJ, Spawns on F1 Instead of B1" }, - { 0x160, "Spoke to Man in Impa's House During Day" }, - { 0x161, "Spoke to Man in Impa's House at Night" }, - { 0x162, "Spoke to Man in Impa's House as Adult" }, - { 0x163, "Spoke to Carpenter Boss's Wife as Child" }, - { 0x164, "Spoke to Carpenter Boss's Wife as Adult" }, - { 0x16C, "Refused Nabooru's Request" }, - { 0x170, "Spoke to Carpenter Boss in Valley" }, - { 0x172, "Spoke to Carpenter Boss in Kakariko" }, - { 0x176, "Spoke to Blue Carpenter in Tent" }, - { 0x178, "Spoke to Green Carpenter in Tent" }, - { 0x17F, "Running Man Suggested a Race" }, - { 0x190, "Obtained Gerudo Archery Piece of Heart" }, - { 0x191, "Obtained Dog Lady's Piece of Heart" }, - { 0x192, "Obtained Deku Stick Upgrade (Lost Woods)" }, - { 0x193, "Obtained Deku Nut Upgrade (Grotto)" }, - { 0x195, "Spoke to Kaepora in Lake Hylia" }, - { 0x196, "Spoke to Cursed Man With <10 Tokens" }, - { 0x197, "Spoke to Cursed Man With 10 Tokens" }, - { 0x198, "Obtained Small Magic Jar" }, - { 0x199, "Caught Cucco by Field Entrance" }, - { 0x19A, "Caught Cucco by Bazaar" }, - { 0x19B, "Caught Cucco by Cucco Pen" }, - { 0x19C, "Caught Cucco Behind Windmill" }, - { 0x19D, "Caught Cucco in Crate" }, - { 0x19E, "Caught Cucco by Skulltula House" }, - { 0x19F, "Caught Cucco Behind Potion Shop" }, - { 0x1A0, "Entered Deku Tree" }, - { 0x1A1, "Entered Dodongo's Cavern" }, - { 0x1A2, "Entered Jabu-Jabu's Belly" }, - { 0x1A3, "Entered Forest Temple" }, - { 0x1A4, "Entered Fire Temple" }, - { 0x1A5, "Entered Water Temple" }, - { 0x1A6, "Entered Spirit Temple" }, - { 0x1A7, "Entered Shadow Temple" }, - { 0x1A8, "Entered Bottom of the Well" }, - { 0x1A9, "Entered Ice Cavern" }, - { 0x1AA, "Entered Ganon's Tower" }, - { 0x1AB, "Entered Gerudo Training Ground" }, - { 0x1AC, "Entered Thieves' Hideout" }, - { 0x1AD, "Entered Ganon's Castle" }, - { 0x1AE, "Entered Ganon's Tower (Collapsing)" }, - { 0x1AF, "Entered Ganon's Castle (Collapsing)" }, - { 0x1D0, "No Sword on B" }, - } }, - { "Event Inf Flags", EVENT_INF, 0x03, { - { 0x00, "Rented Horse From Ingo" }, - { 0x01, "Racing Ingo" }, - { 0x02, "Won First Race With Ingo?" }, - { 0x05, "Lost Race With Ingo?" }, - { 0x06, "Racing Ingo For the Second Time" }, - { 0x08, "Finished Special Cucco Minigame / Began Gerudo Archery" }, - { 0x0A, "Won Special Cucco Minigame?" }, - { 0x0F, "Rented Horse From Ingo" }, - { 0x10, "Racing Running Man" }, - { 0x20, "Market Crowd Text Randomizer" }, - { 0x21, "Market Crowd Text Randomizer" }, - { 0x22, "Market Crowd Text Randomizer" }, - { 0x23, "Market Crowd Text Randomizer" }, - { 0x24, "Market Crowd Text Randomizer" }, - { 0x30, "Entered the Market" }, - } }, - { "Randomizer Inf Flags", RANDOMIZER_INF, (RAND_INF_MAX + 15) / 16, { - { RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, "DUNGEONS_DONE_SPIRIT_TEMPLE" }, - { RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, "DUNGEONS_DONE_SHADOW_TEMPLE" }, + { "Event Check Inf Flags", + EVENT_CHECK_INF, + 0x0D, + { + { 0x02, "First Spoke to Mido" }, + { 0x03, "Complained About Mido to Saria" }, + { 0x04, "Showed Mido Sword & Shield" }, + { 0x05, "Deku Tree Opened Mouth" }, + { 0x06, "Spoke to Saria After Deku Tree's Death" }, + { 0x07, "Obtained Kokiri Emerald & Deku Tree Dead" }, + { 0x09, "Used Deku Tree Blue Warp" }, + { 0x0A, "Played Saria's Song for Mido as Adult" }, + { 0x0C, "Met Deku Tree" }, + { 0x0F, "Spoke to Mido about Saria's whereabouts" }, + { 0x10, "Spoke to Child Malon at Castle or Market" }, + { 0x11, "Spoke to Ingo at Ranch before Talon returns" }, + { 0x12, "Obtained Pocket Egg" }, + { 0x13, "Woke Talon" }, + { 0x14, "Talon Fled Hyrule Castle" }, + { 0x15, "Spoke to Child Malon at Ranch" }, + { 0x16, "Invited to Sing With Child Malon" }, + { 0x17, "Great Deku Tree is Dead" }, + { 0x18, "Obtained Epona" }, + { 0x19, "Obtained Kokiri's Emerald" }, + { 0x1B, "Rented Horse From Ingo" }, + { 0x1C, "Spoke to Mido After Deku Tree's Death" }, + { 0x1D, "Destroyed the Royal Family's Tomb" }, + { 0x1E, "Won the Cow in Malon's Race" }, + { 0x23, "Bombed Dodongo's Cavern Entrance" }, + { 0x25, "Used Dodongo's Cavern Blue Warp" }, + { 0x2F, "Death Mountain Erupted" }, + { 0x30, "Spoke to a Zora" }, + { 0x31, "Obtained Ruto's Letter" }, + { 0x33, "King Zora Moved Aside" }, + { 0x37, "Used Jabu-Jabu Blue Warp" }, + { 0x38, "Obtained Silver Scale" }, + { 0x39, "Opened Entrance to Zora's Domain" }, + { 0x3A, "Offered Fish to Jabu-Jabu" }, + { 0x3B, "Began Nabooru Battle" }, + { 0x3C, "Finished Nabooru Battle" }, + { 0x40, "Obtained Zelda's Letter" }, + { 0x43, "Obtained Ocarina of Time" }, + { 0x45, "Pulled Master Sword from Pedestal" }, + { 0x48, "Used Forest Temple Blue Warp" }, + { 0x49, "Used Fire Temple Blue Warp" }, + { 0x4A, "Used Water Temple Blue Warp" }, + { 0x4B, "Opened the Door of Time" }, + { 0x4D, "Rainbow Bridge Built by Sages" }, + { 0x4E, "Caught by Hyrule Castle Guards" }, + { 0x4F, "Entered the Master Sword Chamber" }, + { 0x50, "Learned Minuet of Forest" }, + { 0x51, "Learned Bolero of Fire" }, + { 0x52, "Learned Serenade of Water" }, + { 0x54, "Learned Nocturne of Shadow" }, + { 0x55, "Sheik Moved From Sword Pedestal" }, + { 0x57, "Learned Saria's Song" }, + { 0x59, "Learned Zelda's Lullaby" }, + { 0x5A, "Learned Sun's Song" }, + { 0x5B, "Learned Song of Storms" }, + { 0x65, "Played Song of Storms in Windmill" }, + { 0x67, "Drained Well in Kakariko Village" }, + { 0x68, "Played Gerudo Archery Minigame" }, + { 0x69, "Restored Lake Hylia's Water" }, + { 0x6A, "Woke Talon in Kakariko" }, + { 0x6B, "Spoke to Talon After Saving Ranch" }, + { 0x6F, "Spoke to Kaepora Gaebora by Lost Woods" }, + { 0x70, "Began Gohma Battle" }, + { 0x71, "Began King Dodongo Battle" }, + { 0x72, "Began Phantom Ganon Battle" }, + { 0x73, "Began Volvagia Battle" }, + { 0x74, "Began Morpha Battle" }, + { 0x75, "Began Twinrova Battle" }, + { 0x76, "Began Barinade Battle" }, + { 0x77, "Began Bongo Bongo Battle" }, + { 0x78, "Began Ganondorf Battle" }, + { 0x80, "Zelda Fled Hyrule Castle" }, + { 0x82, "Bridge Unlocked (After Zelda Escape Cutscene)" }, + { 0x8C, "Paid Back Keaton Mask Fee" }, + { 0x8D, "Paid Back Skull Mask Fee" }, + { 0x8E, "Paid Back Spooky Mask Fee" }, + { 0x8F, "Paid Back Bunny Hood Fee" }, + { 0x90, "Rescued Red Carpenter" }, + { 0x91, "Rescued Yellow Carpenter" }, + { 0x92, "Rescued Blue Carpenter" }, + { 0x93, "Rescued Green Carpenter" }, + { 0x94, "Spoke to Nabooru in Spirit Temple" }, + { 0x95, "Nabooru Captured by Twinrova" }, + { 0x96, "Spoke to Cursed Man in Skulltula House" }, + { 0x9C, "Played Song for Scarecrow as Adult" }, + { 0xA0, "Entered Hyrule Field" }, + { 0xA1, "Entered Death Mountain Trail" }, + { 0xA3, "Entered Kakariko Village" }, + { 0xA4, "Entered Zora's Domain" }, + { 0xA5, "Entered Hyrule Castle" }, + { 0xA6, "Entered Goron City" }, + { 0xA7, "Entered Temple of Time" }, + { 0xA8, "Entered Deku Tree" }, + { 0xA9, "Learned Song of Time" }, + { 0xAA, "Bongo Bongo Escaped Well" }, + { 0xAC, "Learned Requiem of Spirit" }, + { 0xAD, "Completed Spirit Trial" }, + { 0xB0, "Entered Dodongo's Cavern" }, + { 0xB1, "Entered Lake Hylia" }, + { 0xB2, "Entered Gerudo Valley" }, + { 0xB3, "Entered Gerudo's Fortress" }, + { 0xB4, "Entered Lon Lon Ranch" }, + { 0xB5, "Entered Jabu-Jabu's Belly" }, + { 0xB6, "Entered Graveyard" }, + { 0xB7, "Entered Zora's Fountain" }, + { 0xB8, "Entered Desert Colossus" }, + { 0xB9, "Entered Death Mountain Crater" }, + { 0xBA, "Entered Ganon's Castle (Exterior)" }, + { 0xBB, "Completed Forest Trial" }, + { 0xBC, "Completed Water Trial" }, + { 0xBD, "Completed Shadow Trial" }, + { 0xBE, "Completed Fire Trial" }, + { 0xBF, "Completed Light Trial" }, + { 0xC0, "Nabooru Ordered to Fight by Twinrova" }, + { 0xC1, "Spoke to Saria on Lost Woods Bridge" }, + { 0xC3, "Dispelled Ganon's Tower Barrier" }, + { 0xC4, "Returned to Temple of Time With All Medallions" }, + { 0xC5, "Sheik, Spawned at Master Sword Pedestal as Adult" }, + { 0xC6, "Spoke to Deku Tree Sprout" }, + { 0xC7, "Watched Ganon's Tower Collapse / Caught by Gerudo" }, + { 0xC8, "Obtained Spirit Medallion" }, + { 0xC9, "Demo_Effect, Temple of Time Warp in blue aura + sfx the first time you spawn as Adult" }, + { 0xD0, "Obtained Frogs' Piece of Heart" }, + { 0xD1, "Played Zelda's Lullaby for Frogs" }, + { 0xD2, "Played Epona's Song for Frogs" }, + { 0xD3, "Played Sun's Song for Frogs" }, + { 0xD4, "Played Saria's Song for Frogs" }, + { 0xD5, "Played Song of Time for Frogs" }, + { 0xD6, "Played Song of Storms for Frogs" }, + { 0xDA, "Obtained Adult's Wallet" }, + { 0xDB, "Obtained Stone of Agony" }, + { 0xDC, "Obtained Giant's Wallet" }, + { 0xDD, "Obtained Skulltula House's Bombchu" }, + { 0xDE, "Obtained Skulltula House's Piece of Heart" }, + } }, + { "Item Get Inf Flags", + ITEM_GET_INF, + 0x03, + { + { 0x02, "Obtained Super Cucco Bottle" }, + { 0x03, "Bought Bombchu (Shelf 2: Top Right)" }, + { 0x04, "Bought Bombchu (Shelf 1: Bot. Right)" }, + { 0x05, "Bought Bombchu (Shelf 1: Top Left)" }, + { 0x06, "Bought Bombchu (Shelf 2: Bot. Left)" }, + { 0x07, "Bought Bombchu (Shelf 2: Bot. Right)" }, + { 0x08, "Bought Bombchu (Shelf 1: Top Right)" }, + { 0x09, "Bought Bombchu (Shelf 1: Bot. Left)" }, + { 0x0A, "Bought Bombchu (Shelf 2: Top Left)" }, + { 0x0B, "Obtained Scrub's Heart Piece" }, + { 0x0C, "Obtained Cucco Lady's Bottle" }, + { 0x0D, "Obtained Bullet Bag Upgrade (Market)" }, + { 0x0E, "Obtained Big Quiver" }, + { 0x0F, "Obtained Biggest Quiver" }, + { 0x10, "Obtained Scientist's Heart Piece" }, + { 0x11, "Obtained Bowling Bomb Bag Upgrade" }, + { 0x12, "Obtained Bowling Heart Piece" }, + { 0x13, "Obtained Deku Seeds" }, + { 0x15, "Obtained Roof Guy's Heart Piece" }, + { 0x16, "Obtained Skullkid's Heart Piece" }, + { 0x17, "Obtained Skullkids' Heart Piece" }, + { 0x18, "Obtained Farore's Wind" }, + { 0x19, "Obtained Din's Fire" }, + { 0x1A, "Obtained Nayru's Love" }, + { 0x1B, "Obtained Treasure Chest Game Reward" }, + { 0x1C, "Obtained Grave-Dig Heart Piece" }, + { 0x1D, "Obtained Bullet Bag Upgrade (Woods)" }, + { 0x1E, "Obtained Deku Stick Upgrade (Stage)" }, + { 0x1F, "Obtained Deku Nut Upgrade (Stage)" }, + { 0x23, "Obtained Keaton Mask" }, + { 0x24, "Obtained Skull Mask" }, + { 0x25, "Obtained Spooky Mask" }, + { 0x26, "Obtained Bunny Hood" }, + { 0x2A, "Obtained Mask of Truth" }, + { 0x2C, "Obtained Pocket Egg" }, + { 0x2E, "Obtained Cojiro" }, + { 0x30, "Obtained Odd Potion" }, + { 0x31, "Obtained Poacher's Saw" }, + { 0x38, "Sold Keaton Mask" }, + { 0x39, "Sold Skull Mask" }, + { 0x3A, "Sold Spooky Mask" }, + { 0x3B, "Sold Bunny Hood" }, + { 0x3F, "Obtained Mask of Truth" }, + } }, + { "Inf Flags", + INF_TABLE, + 0x1D, + { + { 0x00, "Greeted by Saria" }, + { 0x01, "Spoke to Saria About Obtaining Fairy" }, + { 0x03, "Complained About Mido to Saria" }, + { 0x05, "Spoke to Saria in Saria's House" }, + { 0x0C, "Mido Asked to See Sword & Shield" }, + { 0x15, "Spoke to Mido in Lost Woods as Adult" }, + { 0x19, "Told Mido Saria Won't Return" }, + { 0x1E, "Spoke to Kokiri Girl by Jumping Stones" }, + { 0x22, "Spoke to Kokiri Boy Guarding Forest Exit" }, + { 0x24, "Spoke to Kokiri Boy Cutting Grass" }, + { 0x26, "Spoke to Kokiri Girl on Shop Awning" }, + { 0x28, "Spoke to Kokiri Girl About Training Center" }, + { 0x41, "Spoke to Kokiri Boy on Bed in Mido's House" }, + { 0x51, "Spoke to Kokiri Girl in Saria's House" }, + { 0x59, "Spoke to Know-It-All Bro. About Temple" }, + { 0x61, "Spoke to Know-It-All Bro. About Saria" }, + { 0x66, "Spoke to Deku Tree Sprout After Cutscene" }, + { 0x6C, "Spoke to Dying Knight" }, + { 0x76, "Showed Zelda's Letter to Gate Guard" }, + { 0x77, "Gate Guard Put On Keaton Mask" }, + { 0x7E, "Spoke to Talon in Lon Lon Ranch House" }, + { 0x84, "Spoke to Child Malon at Castle or Market" }, + { 0x85, "Child Malon Said Epona Was Afraid of You" }, + { 0x8B, "Entered Hyrule Castle" }, + { 0x94, "Spoke to Ingo at Ranch Before Talon's Return" }, + { 0x97, "Spoke to Ingo at Ranch" }, + { 0x9A, "Spoke to Ingo as Adult" }, + { 0xA2, "Refused Ingo's 50 Rupee Rental Request" }, + { 0xAB, "Rode a Horse at Ingo's Ranch" }, + { 0xB0, "Spoke to Medigoron as Child" }, + { 0xB1, "Spoke to Medigoron as Adult" }, + { 0xB6, "Spoke to Poe Collector in Ruined Market" }, + { 0xB7, "Spoke to Fado in Kokiri Forest as Child" }, + { 0xB8, "Spoke to Malon After Saving Ranch" }, + { 0xB9, "Spoke to Malon on Horseback" }, + { 0xBC, "Fado requested Odd Potion" }, + { 0xC0, "Spoke to Fat Woman by Market Potion Shop" }, + { 0xC1, "Spoke to Fat Woman After Zelda's Escape" }, + { 0xC2, "Spoke to Burly Man About Talon Search" }, + { 0xC3, "Spoke to Burly Man After Zelda's Escape" }, + { 0xC4, "Spoke to Thief After Zelda's Escape" }, + { 0xC5, "Spoke to Thin Man by Market Target Shop" }, + { 0xC6, "Spoke to Old Woman by Market Fountain" }, + { 0xC7, "Spoke to Old Man by Bombchu Bowling" }, + { 0xC8, "Spoke to Thin Lady by Bombchu Bowling" }, + { 0xC9, "Spoke to Thin Lady After Zelda's Escape (1.0)" }, + { 0xCA, "Spoke to Red Joker in Market" }, + { 0xCB, "Spoke to Blue Joker in Market (1.0) / Dog Lady as Adult (DBG)" }, + { 0xCC, "Spoke to Itchy Lady After Malon Left Town" }, + { 0xCD, "Spoke to Blue Jokester in Market (DBG)" }, + { 0xCE, "Spoke to Thin Lady After Zelda's Escape (DBG)" }, + { 0xD9, "Spoke to Dampé as Child" }, + { 0xE0, "Spoke to Goron by Cavern" }, + { 0xE3, "Spoke to Goron Hiding Stick" }, + { 0xE6, "Spoke to Goron by Woods Exit" }, + { 0xEB, "Spoke to Goron by Bomb Flowers" }, + { 0xF0, "Spoke to Goron at City? Entrance" }, + { 0xF4, "Spoke to Ruby-Crazed Goron" }, + { 0xFC, "Spoke to Goron Shop Owner" }, + { 0x109, "Goron City Doors Unlocked" }, + { 0x10B, "Spoke to Goron Link About Volvagia" }, + { 0x10C, "Stopped Goron Link's Rolling" }, + { 0x10E, "Spoke to Goron Link" }, + { 0x113, "Spoke to Darunia in Goron City" }, + { 0x11A, "Spoke to Darunia in Fire Temple" }, + { 0x11E, "Obtained Bomb Bag Upgrade (Goron City)" }, + { 0x124, "Spoke to Zora Near Zora Shop?" }, + { 0x128, "Spoke to Zora Beside Zora Shop?" }, + { 0x129, "Spoke to Zora Swimming Behind Zora Shop" }, + { 0x138, "Thawed King Zora" }, + { 0x139, "Obtained Zora Tunic" }, + { 0x140, "Ruto in JJ (M7) on Blue Switch" }, + { 0x141, "Ruto in JJ (M2) Meet Ruto" }, + { 0x142, "Ruto in JJ (M3) Talk First Time" }, + { 0x143, "Ruto in JJ (M10) Can Be Escorted" }, + { 0x144, "Ruto in JJ (?) Wants to be Tossed to Sapphire" }, + { 0x145, "Ruto in JJ (M6) on Sapphire platform" }, + { 0x146, "Ruto in JJ (M6) Kidnapped" }, + { 0x147, "Ruto in JJ, Spawns on F1 Instead of B1" }, + { 0x160, "Spoke to Man in Impa's House During Day" }, + { 0x161, "Spoke to Man in Impa's House at Night" }, + { 0x162, "Spoke to Man in Impa's House as Adult" }, + { 0x163, "Spoke to Carpenter Boss's Wife as Child" }, + { 0x164, "Spoke to Carpenter Boss's Wife as Adult" }, + { 0x16C, "Refused Nabooru's Request" }, + { 0x170, "Spoke to Carpenter Boss in Valley" }, + { 0x172, "Spoke to Carpenter Boss in Kakariko" }, + { 0x176, "Spoke to Blue Carpenter in Tent" }, + { 0x178, "Spoke to Green Carpenter in Tent" }, + { 0x17F, "Running Man Suggested a Race" }, + { 0x190, "Obtained Gerudo Archery Piece of Heart" }, + { 0x191, "Obtained Dog Lady's Piece of Heart" }, + { 0x192, "Obtained Deku Stick Upgrade (Lost Woods)" }, + { 0x193, "Obtained Deku Nut Upgrade (Grotto)" }, + { 0x195, "Spoke to Kaepora in Lake Hylia" }, + { 0x196, "Spoke to Cursed Man With <10 Tokens" }, + { 0x197, "Spoke to Cursed Man With 10 Tokens" }, + { 0x198, "Obtained Small Magic Jar" }, + { 0x199, "Caught Cucco by Field Entrance" }, + { 0x19A, "Caught Cucco by Bazaar" }, + { 0x19B, "Caught Cucco by Cucco Pen" }, + { 0x19C, "Caught Cucco Behind Windmill" }, + { 0x19D, "Caught Cucco in Crate" }, + { 0x19E, "Caught Cucco by Skulltula House" }, + { 0x19F, "Caught Cucco Behind Potion Shop" }, + { 0x1A0, "Entered Deku Tree" }, + { 0x1A1, "Entered Dodongo's Cavern" }, + { 0x1A2, "Entered Jabu-Jabu's Belly" }, + { 0x1A3, "Entered Forest Temple" }, + { 0x1A4, "Entered Fire Temple" }, + { 0x1A5, "Entered Water Temple" }, + { 0x1A6, "Entered Spirit Temple" }, + { 0x1A7, "Entered Shadow Temple" }, + { 0x1A8, "Entered Bottom of the Well" }, + { 0x1A9, "Entered Ice Cavern" }, + { 0x1AA, "Entered Ganon's Tower" }, + { 0x1AB, "Entered Gerudo Training Ground" }, + { 0x1AC, "Entered Thieves' Hideout" }, + { 0x1AD, "Entered Ganon's Castle" }, + { 0x1AE, "Entered Ganon's Tower (Collapsing)" }, + { 0x1AF, "Entered Ganon's Castle (Collapsing)" }, + { 0x1D0, "No Sword on B" }, + } }, + { "Event Inf Flags", + EVENT_INF, + 0x03, + { + { 0x00, "Rented Horse From Ingo" }, + { 0x01, "Racing Ingo" }, + { 0x02, "Won First Race With Ingo?" }, + { 0x05, "Lost Race With Ingo?" }, + { 0x06, "Racing Ingo For the Second Time" }, + { 0x08, "Finished Special Cucco Minigame / Began Gerudo Archery" }, + { 0x0A, "Won Special Cucco Minigame?" }, + { 0x0F, "Rented Horse From Ingo" }, + { 0x10, "Racing Running Man" }, + { 0x20, "Market Crowd Text Randomizer" }, + { 0x21, "Market Crowd Text Randomizer" }, + { 0x22, "Market Crowd Text Randomizer" }, + { 0x23, "Market Crowd Text Randomizer" }, + { 0x24, "Market Crowd Text Randomizer" }, + { 0x30, "Entered the Market" }, + } }, + { "Randomizer Inf Flags", + RANDOMIZER_INF, + (RAND_INF_MAX + 15) / 16, + { + { RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, "DUNGEONS_DONE_SPIRIT_TEMPLE" }, + { RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, "DUNGEONS_DONE_SHADOW_TEMPLE" }, - { RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW, "COWS_MILKED_KF_LINKS_HOUSE_COW" }, - { RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, "COWS_MILKED_HF_COW_GROTTO_COW" }, - { RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, "COWS_MILKED_LLR_STABLES_LEFT_COW" }, - { RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, "COWS_MILKED_LLR_STABLES_RIGHT_COW" }, - { RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, "COWS_MILKED_LLR_TOWER_LEFT_COW" }, - { RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, "COWS_MILKED_LLR_TOWER_RIGHT_COW" }, - { RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, "COWS_MILKED_KAK_IMPAS_HOUSE_COW" }, - { RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, "COWS_MILKED_DMT_COW_GROTTO_COW" }, - { RAND_INF_COWS_MILKED_GV_COW, "COWS_MILKED_GV_COW" }, - { RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, "COWS_MILKED_JABU_JABUS_BELLY_MQ_COW" }, + { RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW, "COWS_MILKED_KF_LINKS_HOUSE_COW" }, + { RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, "COWS_MILKED_HF_COW_GROTTO_COW" }, + { RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, "COWS_MILKED_LLR_STABLES_LEFT_COW" }, + { RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, "COWS_MILKED_LLR_STABLES_RIGHT_COW" }, + { RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, "COWS_MILKED_LLR_TOWER_LEFT_COW" }, + { RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, "COWS_MILKED_LLR_TOWER_RIGHT_COW" }, + { RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, "COWS_MILKED_KAK_IMPAS_HOUSE_COW" }, + { RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, "COWS_MILKED_DMT_COW_GROTTO_COW" }, + { RAND_INF_COWS_MILKED_GV_COW, "COWS_MILKED_GV_COW" }, + { RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, "COWS_MILKED_JABU_JABUS_BELLY_MQ_COW" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY" }, - { RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB, "SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO, "SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO" }, - { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB, "SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY" }, + { RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB, "SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, + "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, + "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO, "SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO" }, + { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR" }, + { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT" }, + { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR" }, + { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT" }, + { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER" }, + { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR" }, + { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT" }, + { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR" }, + { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT" }, + { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER" }, + { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER" }, + { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER" }, + { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, + "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR" }, + { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, + "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT" }, + { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, + "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, + "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE" }, + { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB" }, + { RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB, "SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE" }, + { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, + "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, + "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, + "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, + "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT" }, + { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1, "SHOP_ITEMS_KF_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2, "SHOP_ITEMS_KF_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3, "SHOP_ITEMS_KF_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4, "SHOP_ITEMS_KF_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5, "SHOP_ITEMS_KF_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6, "SHOP_ITEMS_KF_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7, "SHOP_ITEMS_KF_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8, "SHOP_ITEMS_KF_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1, "SHOP_ITEMS_GC_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2, "SHOP_ITEMS_GC_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3, "SHOP_ITEMS_GC_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4, "SHOP_ITEMS_GC_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5, "SHOP_ITEMS_GC_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6, "SHOP_ITEMS_GC_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7, "SHOP_ITEMS_GC_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8, "SHOP_ITEMS_GC_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1, "SHOP_ITEMS_ZD_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2, "SHOP_ITEMS_ZD_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3, "SHOP_ITEMS_ZD_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4, "SHOP_ITEMS_ZD_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5, "SHOP_ITEMS_ZD_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6, "SHOP_ITEMS_ZD_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7, "SHOP_ITEMS_ZD_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8, "SHOP_ITEMS_ZD_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1, "SHOP_ITEMS_KAK_BAZAAR_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2, "SHOP_ITEMS_KAK_BAZAAR_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3, "SHOP_ITEMS_KAK_BAZAAR_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4, "SHOP_ITEMS_KAK_BAZAAR_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5, "SHOP_ITEMS_KAK_BAZAAR_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6, "SHOP_ITEMS_KAK_BAZAAR_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7, "SHOP_ITEMS_KAK_BAZAAR_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8, "SHOP_ITEMS_KAK_BAZAAR_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1, "SHOP_ITEMS_KF_SHOP_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2, "SHOP_ITEMS_KF_SHOP_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3, "SHOP_ITEMS_KF_SHOP_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4, "SHOP_ITEMS_KF_SHOP_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5, "SHOP_ITEMS_KF_SHOP_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6, "SHOP_ITEMS_KF_SHOP_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7, "SHOP_ITEMS_KF_SHOP_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8, "SHOP_ITEMS_KF_SHOP_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1, "SHOP_ITEMS_GC_SHOP_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2, "SHOP_ITEMS_GC_SHOP_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3, "SHOP_ITEMS_GC_SHOP_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4, "SHOP_ITEMS_GC_SHOP_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5, "SHOP_ITEMS_GC_SHOP_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6, "SHOP_ITEMS_GC_SHOP_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7, "SHOP_ITEMS_GC_SHOP_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8, "SHOP_ITEMS_GC_SHOP_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1, "SHOP_ITEMS_ZD_SHOP_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2, "SHOP_ITEMS_ZD_SHOP_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3, "SHOP_ITEMS_ZD_SHOP_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4, "SHOP_ITEMS_ZD_SHOP_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5, "SHOP_ITEMS_ZD_SHOP_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6, "SHOP_ITEMS_ZD_SHOP_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7, "SHOP_ITEMS_ZD_SHOP_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8, "SHOP_ITEMS_ZD_SHOP_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1, "SHOP_ITEMS_KAK_BAZAAR_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2, "SHOP_ITEMS_KAK_BAZAAR_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3, "SHOP_ITEMS_KAK_BAZAAR_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4, "SHOP_ITEMS_KAK_BAZAAR_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5, "SHOP_ITEMS_KAK_BAZAAR_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6, "SHOP_ITEMS_KAK_BAZAAR_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7, "SHOP_ITEMS_KAK_BAZAAR_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8, "SHOP_ITEMS_KAK_BAZAAR_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7" }, + { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8" }, - { RAND_INF_MERCHANTS_CARPET_SALESMAN, "RAND_INF_MERCHANTS_CARPET_SALESMAN" }, - { RAND_INF_MERCHANTS_MEDIGORON, "RAND_INF_MERCHANTS_MEDIGORON" }, - { RAND_INF_MERCHANTS_GRANNYS_SHOP, "RAND_INF_MERCHANTS_GRANNY_SHOP"}, - { RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN, "RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN"}, + { RAND_INF_MERCHANTS_CARPET_SALESMAN, "RAND_INF_MERCHANTS_CARPET_SALESMAN" }, + { RAND_INF_MERCHANTS_MEDIGORON, "RAND_INF_MERCHANTS_MEDIGORON" }, + { RAND_INF_MERCHANTS_GRANNYS_SHOP, "RAND_INF_MERCHANTS_GRANNY_SHOP" }, + { RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN, "RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN" }, - { RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO, "ADULT_TRADES_LW_TRADE_COJIRO" }, - { RAND_INF_ADULT_TRADES_GV_TRADE_SAW, "ADULT_TRADES_GV_TRADE_SAW" }, - { RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD, "ADULT_TRADES_DMT_TRADE_BROKEN_SWORD" }, - { RAND_INF_ADULT_TRADES_LH_TRADE_FROG, "ADULT_TRADES_LH_TRADE_FROG" }, - { RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS, "ADULT_TRADES_DMT_TRADE_EYEDROPS" }, + { RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO, "ADULT_TRADES_LW_TRADE_COJIRO" }, + { RAND_INF_ADULT_TRADES_GV_TRADE_SAW, "ADULT_TRADES_GV_TRADE_SAW" }, + { RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD, "ADULT_TRADES_DMT_TRADE_BROKEN_SWORD" }, + { RAND_INF_ADULT_TRADES_LH_TRADE_FROG, "ADULT_TRADES_LH_TRADE_FROG" }, + { RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS, "ADULT_TRADES_DMT_TRADE_EYEDROPS" }, - { RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, "KAK_100_GOLD_SKULLTULA_REWARD" }, - { RAND_INF_GREG_FOUND, "RAND_INF_GREG_FOUND" }, + { RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, "KAK_100_GOLD_SKULLTULA_REWARD" }, + { RAND_INF_GREG_FOUND, "RAND_INF_GREG_FOUND" }, - { RAND_INF_TOT_MASTER_SWORD, "RAND_INF_TOT_MASTER_SWORD"}, - { RAND_INF_CHILD_FISHING, "RAND_INF_CHILD_FISHING" }, - { RAND_INF_ADULT_FISHING, "RAND_INF_ADULT_FISHING" }, - { RAND_INF_10_BIG_POES, "RAND_INF_10_BIG_POES" }, - { RAND_INF_GRANT_GANONS_BOSSKEY, "RAND_INF_GRANT_GANONS_BOSSKEY" }, + { RAND_INF_TOT_MASTER_SWORD, "RAND_INF_TOT_MASTER_SWORD" }, + { RAND_INF_CHILD_FISHING, "RAND_INF_CHILD_FISHING" }, + { RAND_INF_ADULT_FISHING, "RAND_INF_ADULT_FISHING" }, + { RAND_INF_10_BIG_POES, "RAND_INF_10_BIG_POES" }, + { RAND_INF_GRANT_GANONS_BOSSKEY, "RAND_INF_GRANT_GANONS_BOSSKEY" }, - { RAND_INF_GOHMA_SOUL, "RAND_INF_GOHMA_SOUL" }, - { RAND_INF_KING_DODONGO_SOUL, "RAND_INF_KING_DODONGO_SOUL" }, - { RAND_INF_BARINADE_SOUL, "RAND_INF_BARINADE_SOUL" }, - { RAND_INF_PHANTOM_GANON_SOUL, "RAND_INF_PHANTOM_GANON_SOUL" }, - { RAND_INF_VOLVAGIA_SOUL, "RAND_INF_VOLVAGIA_SOUL" }, - { RAND_INF_MORPHA_SOUL, "RAND_INF_MORPHA_SOUL" }, - { RAND_INF_BONGO_BONGO_SOUL, "RAND_INF_BONGO_BONGO_SOUL" }, - { RAND_INF_TWINROVA_SOUL, "RAND_INF_TWINROVA_SOUL" }, - { RAND_INF_GANON_SOUL, "RAND_INF_GANON_SOUL" }, + { RAND_INF_GOHMA_SOUL, "RAND_INF_GOHMA_SOUL" }, + { RAND_INF_KING_DODONGO_SOUL, "RAND_INF_KING_DODONGO_SOUL" }, + { RAND_INF_BARINADE_SOUL, "RAND_INF_BARINADE_SOUL" }, + { RAND_INF_PHANTOM_GANON_SOUL, "RAND_INF_PHANTOM_GANON_SOUL" }, + { RAND_INF_VOLVAGIA_SOUL, "RAND_INF_VOLVAGIA_SOUL" }, + { RAND_INF_MORPHA_SOUL, "RAND_INF_MORPHA_SOUL" }, + { RAND_INF_BONGO_BONGO_SOUL, "RAND_INF_BONGO_BONGO_SOUL" }, + { RAND_INF_TWINROVA_SOUL, "RAND_INF_TWINROVA_SOUL" }, + { RAND_INF_GANON_SOUL, "RAND_INF_GANON_SOUL" }, - { RAND_INF_HAS_OCARINA_A, "RAND_INF_HAS_OCARINA_A"}, - { RAND_INF_HAS_OCARINA_C_UP, "RAND_INF_HAS_OCARINA_C_UP" }, - { RAND_INF_HAS_OCARINA_C_DOWN, "RAND_INF_HAS_OCARINA_C_DOWN" }, - { RAND_INF_HAS_OCARINA_C_LEFT, "RAND_INF_HAS_OCARINA_C_LEFT"}, - { RAND_INF_HAS_OCARINA_C_RIGHT, "RAND_INF_HAS_OCARINA_C_RIGHT"}, + { RAND_INF_HAS_OCARINA_A, "RAND_INF_HAS_OCARINA_A" }, + { RAND_INF_HAS_OCARINA_C_UP, "RAND_INF_HAS_OCARINA_C_UP" }, + { RAND_INF_HAS_OCARINA_C_DOWN, "RAND_INF_HAS_OCARINA_C_DOWN" }, + { RAND_INF_HAS_OCARINA_C_LEFT, "RAND_INF_HAS_OCARINA_C_LEFT" }, + { RAND_INF_HAS_OCARINA_C_RIGHT, "RAND_INF_HAS_OCARINA_C_RIGHT" }, - { RAND_INF_KF_LINKS_HOUSE_POT, "RAND_INF_KF_LINKS_HOUSE_POT" }, - { RAND_INF_KF_TWINS_HOUSE_POT_1, "RAND_INF_KF_TWINS_HOUSE_POT_1" }, - { RAND_INF_KF_TWINS_HOUSE_POT_2, "RAND_INF_KF_TWINS_HOUSE_POT_2" }, - { RAND_INF_KF_BROTHERS_HOUSE_POT_1, "RAND_INF_KF_BROTHERS_HOUSE_POT_1" }, - { RAND_INF_KF_BROTHERS_HOUSE_POT_2, "RAND_INF_KF_BROTHERS_HOUSE_POT_2" }, - { RAND_INF_GF_BREAK_ROOM_POT_1, "RAND_INF_GF_BREAK_ROOM_POT_1" }, - { RAND_INF_GF_BREAK_ROOM_POT_2, "RAND_INF_GF_BREAK_ROOM_POT_2" }, - { RAND_INF_GF_KITCHEN_POT_1, "RAND_INF_GF_KITCHEN_POT_1" }, - { RAND_INF_GF_KITCHEN_POT_2, "RAND_INF_GF_KITCHEN_POT_2" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_1" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_2" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_3, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_3" }, - { RAND_INF_GF_NORTH_F2_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_1" }, - { RAND_INF_GF_NORTH_F2_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_1, "RAND_INF_WASTELAND_NEAR_GS_POT_1" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_2, "RAND_INF_WASTELAND_NEAR_GS_POT_2" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_3, "RAND_INF_WASTELAND_NEAR_GS_POT_3" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_4, "RAND_INF_WASTELAND_NEAR_GS_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_1, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_1" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_2, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_2" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_3, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_3" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1" }, - { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_1, "RAND_INF_GY_DAMPES_GRAVE_POT_1" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_2, "RAND_INF_GY_DAMPES_GRAVE_POT_2" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_3, "RAND_INF_GY_DAMPES_GRAVE_POT_3" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_4, "RAND_INF_GY_DAMPES_GRAVE_POT_4" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_5, "RAND_INF_GY_DAMPES_GRAVE_POT_5" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_6, "RAND_INF_GY_DAMPES_GRAVE_POT_6" }, - { RAND_INF_GC_LOWER_STAIRCASE_POT_1, "RAND_INF_GC_LOWER_STAIRCASE_POT_1" }, - { RAND_INF_GC_LOWER_STAIRCASE_POT_2, "RAND_INF_GC_LOWER_STAIRCASE_POT_2" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_1, "RAND_INF_GC_UPPER_STAIRCASE_POT_1" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_2, "RAND_INF_GC_UPPER_STAIRCASE_POT_2" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_3, "RAND_INF_GC_UPPER_STAIRCASE_POT_3" }, - { RAND_INF_GC_MEDIGORON_POT_1, "RAND_INF_GC_MEDIGORON_POT_1" }, - { RAND_INF_GC_DARUNIA_POT_1, "RAND_INF_GC_DARUNIA_POT_1" }, - { RAND_INF_GC_DARUNIA_POT_2, "RAND_INF_GC_DARUNIA_POT_2" }, - { RAND_INF_GC_DARUNIA_POT_3, "RAND_INF_GC_DARUNIA_POT_3" }, - { RAND_INF_DMC_NEAR_GC_POT_1, "RAND_INF_DMC_NEAR_GC_POT_1" }, - { RAND_INF_DMC_NEAR_GC_POT_2, "RAND_INF_DMC_NEAR_GC_POT_2" }, - { RAND_INF_DMC_NEAR_GC_POT_3, "RAND_INF_DMC_NEAR_GC_POT_3" }, - { RAND_INF_DMC_NEAR_GC_POT_4, "RAND_INF_DMC_NEAR_GC_POT_4" }, - { RAND_INF_ZD_NEAR_SHOP_POT_1, "RAND_INF_ZD_NEAR_SHOP_POT_1" }, - { RAND_INF_ZD_NEAR_SHOP_POT_2, "RAND_INF_ZD_NEAR_SHOP_POT_2" }, - { RAND_INF_ZD_NEAR_SHOP_POT_3, "RAND_INF_ZD_NEAR_SHOP_POT_3" }, - { RAND_INF_ZD_NEAR_SHOP_POT_4, "RAND_INF_ZD_NEAR_SHOP_POT_4" }, - { RAND_INF_ZD_NEAR_SHOP_POT_5, "RAND_INF_ZD_NEAR_SHOP_POT_5" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_1, "RAND_INF_ZF_HIDDEN_CAVE_POT_1" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_2, "RAND_INF_ZF_HIDDEN_CAVE_POT_2" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_3, "RAND_INF_ZF_HIDDEN_CAVE_POT_3" }, - { RAND_INF_ZF_NEAR_JABU_POT_1, "RAND_INF_ZF_NEAR_JABU_POT_1" }, - { RAND_INF_ZF_NEAR_JABU_POT_2, "RAND_INF_ZF_NEAR_JABU_POT_2" }, - { RAND_INF_ZF_NEAR_JABU_POT_3, "RAND_INF_ZF_NEAR_JABU_POT_3" }, - { RAND_INF_ZF_NEAR_JABU_POT_4, "RAND_INF_ZF_NEAR_JABU_POT_4" }, - { RAND_INF_LLR_FRONT_POT_1, "RAND_INF_LLR_FRONT_POT_1" }, - { RAND_INF_LLR_FRONT_POT_2, "RAND_INF_LLR_FRONT_POT_2" }, - { RAND_INF_LLR_FRONT_POT_3, "RAND_INF_LLR_FRONT_POT_3" }, - { RAND_INF_LLR_FRONT_POT_4, "RAND_INF_LLR_FRONT_POT_4" }, - { RAND_INF_LLR_RAIN_SHED_POT_1, "RAND_INF_LLR_RAIN_SHED_POT_1" }, - { RAND_INF_LLR_RAIN_SHED_POT_2, "RAND_INF_LLR_RAIN_SHED_POT_2" }, - { RAND_INF_LLR_RAIN_SHED_POT_3, "RAND_INF_LLR_RAIN_SHED_POT_3" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_1, "RAND_INF_LLR_TALONS_HOUSE_POT_1" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_2, "RAND_INF_LLR_TALONS_HOUSE_POT_2" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_3, "RAND_INF_LLR_TALONS_HOUSE_POT_3" }, - { RAND_INF_HF_COW_GROTTO_POT_1, "RAND_INF_HF_COW_GROTTO_POT_1" }, - { RAND_INF_HF_COW_GROTTO_POT_2, "RAND_INF_HF_COW_GROTTO_POT_2" }, - { RAND_INF_HC_STORMS_GROTTO_POT_1, "RAND_INF_HC_STORMS_GROTTO_POT_1" }, - { RAND_INF_HC_STORMS_GROTTO_POT_2, "RAND_INF_HC_STORMS_GROTTO_POT_2" }, - { RAND_INF_HC_STORMS_GROTTO_POT_3, "RAND_INF_HC_STORMS_GROTTO_POT_3" }, - { RAND_INF_HC_STORMS_GROTTO_POT_4, "RAND_INF_HC_STORMS_GROTTO_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_POT_1, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_POT_2, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_1" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_2" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_3" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_4" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_5" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_6" }, - { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3" }, - { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2" }, - { RAND_INF_WATER_TEMPLE_TORCH_POT_1, "RAND_INF_WATER_TEMPLE_TORCH_POT_1" }, - { RAND_INF_WATER_TEMPLE_TORCH_POT_2, "RAND_INF_WATER_TEMPLE_TORCH_POT_2" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3" }, - { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1" }, - { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4" }, - { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1" }, - { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2" }, - { RAND_INF_WATER_TEMPLE_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_RIVER_POT_1" }, - { RAND_INF_WATER_TEMPLE_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_RIVER_POT_2" }, - { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1" }, - { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2" }, - { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1" }, - { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5" }, - { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6" }, - { RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, "RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT, "RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT" }, - { RAND_INF_ICE_CAVERN_HALL_POT_1, "RAND_INF_ICE_CAVERN_HALL_POT_1" }, - { RAND_INF_ICE_CAVERN_HALL_POT_2, "RAND_INF_ICE_CAVERN_HALL_POT_2" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3" }, - { RAND_INF_ICE_CAVERN_NEAR_END_POT_1, "RAND_INF_ICE_CAVERN_NEAR_END_POT_1" }, - { RAND_INF_ICE_CAVERN_NEAR_END_POT_2, "RAND_INF_ICE_CAVERN_NEAR_END_POT_2" }, - { RAND_INF_ICE_CAVERN_FROZEN_POT_1, "RAND_INF_ICE_CAVERN_FROZEN_POT_1" }, + { RAND_INF_KF_LINKS_HOUSE_POT, "RAND_INF_KF_LINKS_HOUSE_POT" }, + { RAND_INF_KF_TWINS_HOUSE_POT_1, "RAND_INF_KF_TWINS_HOUSE_POT_1" }, + { RAND_INF_KF_TWINS_HOUSE_POT_2, "RAND_INF_KF_TWINS_HOUSE_POT_2" }, + { RAND_INF_KF_BROTHERS_HOUSE_POT_1, "RAND_INF_KF_BROTHERS_HOUSE_POT_1" }, + { RAND_INF_KF_BROTHERS_HOUSE_POT_2, "RAND_INF_KF_BROTHERS_HOUSE_POT_2" }, + { RAND_INF_GF_BREAK_ROOM_POT_1, "RAND_INF_GF_BREAK_ROOM_POT_1" }, + { RAND_INF_GF_BREAK_ROOM_POT_2, "RAND_INF_GF_BREAK_ROOM_POT_2" }, + { RAND_INF_GF_KITCHEN_POT_1, "RAND_INF_GF_KITCHEN_POT_1" }, + { RAND_INF_GF_KITCHEN_POT_2, "RAND_INF_GF_KITCHEN_POT_2" }, + { RAND_INF_GF_NORTH_F1_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_1" }, + { RAND_INF_GF_NORTH_F1_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_2" }, + { RAND_INF_GF_NORTH_F1_CARPENTER_POT_3, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_3" }, + { RAND_INF_GF_NORTH_F2_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_1" }, + { RAND_INF_GF_NORTH_F2_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_2" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3" }, + { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4" }, + { RAND_INF_WASTELAND_NEAR_GS_POT_1, "RAND_INF_WASTELAND_NEAR_GS_POT_1" }, + { RAND_INF_WASTELAND_NEAR_GS_POT_2, "RAND_INF_WASTELAND_NEAR_GS_POT_2" }, + { RAND_INF_WASTELAND_NEAR_GS_POT_3, "RAND_INF_WASTELAND_NEAR_GS_POT_3" }, + { RAND_INF_WASTELAND_NEAR_GS_POT_4, "RAND_INF_WASTELAND_NEAR_GS_POT_4" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43" }, + { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10" }, + { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11" }, + { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1" }, + { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2" }, + { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3" }, + { RAND_INF_KAK_NEAR_POTION_SHOP_POT_1, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_1" }, + { RAND_INF_KAK_NEAR_POTION_SHOP_POT_2, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_2" }, + { RAND_INF_KAK_NEAR_POTION_SHOP_POT_3, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_3" }, + { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1" }, + { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2" }, + { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3" }, + { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1" }, + { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2" }, + { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3" }, + { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1" }, + { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2" }, + { RAND_INF_GY_DAMPES_GRAVE_POT_1, "RAND_INF_GY_DAMPES_GRAVE_POT_1" }, + { RAND_INF_GY_DAMPES_GRAVE_POT_2, "RAND_INF_GY_DAMPES_GRAVE_POT_2" }, + { RAND_INF_GY_DAMPES_GRAVE_POT_3, "RAND_INF_GY_DAMPES_GRAVE_POT_3" }, + { RAND_INF_GY_DAMPES_GRAVE_POT_4, "RAND_INF_GY_DAMPES_GRAVE_POT_4" }, + { RAND_INF_GY_DAMPES_GRAVE_POT_5, "RAND_INF_GY_DAMPES_GRAVE_POT_5" }, + { RAND_INF_GY_DAMPES_GRAVE_POT_6, "RAND_INF_GY_DAMPES_GRAVE_POT_6" }, + { RAND_INF_GC_LOWER_STAIRCASE_POT_1, "RAND_INF_GC_LOWER_STAIRCASE_POT_1" }, + { RAND_INF_GC_LOWER_STAIRCASE_POT_2, "RAND_INF_GC_LOWER_STAIRCASE_POT_2" }, + { RAND_INF_GC_UPPER_STAIRCASE_POT_1, "RAND_INF_GC_UPPER_STAIRCASE_POT_1" }, + { RAND_INF_GC_UPPER_STAIRCASE_POT_2, "RAND_INF_GC_UPPER_STAIRCASE_POT_2" }, + { RAND_INF_GC_UPPER_STAIRCASE_POT_3, "RAND_INF_GC_UPPER_STAIRCASE_POT_3" }, + { RAND_INF_GC_MEDIGORON_POT_1, "RAND_INF_GC_MEDIGORON_POT_1" }, + { RAND_INF_GC_DARUNIA_POT_1, "RAND_INF_GC_DARUNIA_POT_1" }, + { RAND_INF_GC_DARUNIA_POT_2, "RAND_INF_GC_DARUNIA_POT_2" }, + { RAND_INF_GC_DARUNIA_POT_3, "RAND_INF_GC_DARUNIA_POT_3" }, + { RAND_INF_DMC_NEAR_GC_POT_1, "RAND_INF_DMC_NEAR_GC_POT_1" }, + { RAND_INF_DMC_NEAR_GC_POT_2, "RAND_INF_DMC_NEAR_GC_POT_2" }, + { RAND_INF_DMC_NEAR_GC_POT_3, "RAND_INF_DMC_NEAR_GC_POT_3" }, + { RAND_INF_DMC_NEAR_GC_POT_4, "RAND_INF_DMC_NEAR_GC_POT_4" }, + { RAND_INF_ZD_NEAR_SHOP_POT_1, "RAND_INF_ZD_NEAR_SHOP_POT_1" }, + { RAND_INF_ZD_NEAR_SHOP_POT_2, "RAND_INF_ZD_NEAR_SHOP_POT_2" }, + { RAND_INF_ZD_NEAR_SHOP_POT_3, "RAND_INF_ZD_NEAR_SHOP_POT_3" }, + { RAND_INF_ZD_NEAR_SHOP_POT_4, "RAND_INF_ZD_NEAR_SHOP_POT_4" }, + { RAND_INF_ZD_NEAR_SHOP_POT_5, "RAND_INF_ZD_NEAR_SHOP_POT_5" }, + { RAND_INF_ZF_HIDDEN_CAVE_POT_1, "RAND_INF_ZF_HIDDEN_CAVE_POT_1" }, + { RAND_INF_ZF_HIDDEN_CAVE_POT_2, "RAND_INF_ZF_HIDDEN_CAVE_POT_2" }, + { RAND_INF_ZF_HIDDEN_CAVE_POT_3, "RAND_INF_ZF_HIDDEN_CAVE_POT_3" }, + { RAND_INF_ZF_NEAR_JABU_POT_1, "RAND_INF_ZF_NEAR_JABU_POT_1" }, + { RAND_INF_ZF_NEAR_JABU_POT_2, "RAND_INF_ZF_NEAR_JABU_POT_2" }, + { RAND_INF_ZF_NEAR_JABU_POT_3, "RAND_INF_ZF_NEAR_JABU_POT_3" }, + { RAND_INF_ZF_NEAR_JABU_POT_4, "RAND_INF_ZF_NEAR_JABU_POT_4" }, + { RAND_INF_LLR_FRONT_POT_1, "RAND_INF_LLR_FRONT_POT_1" }, + { RAND_INF_LLR_FRONT_POT_2, "RAND_INF_LLR_FRONT_POT_2" }, + { RAND_INF_LLR_FRONT_POT_3, "RAND_INF_LLR_FRONT_POT_3" }, + { RAND_INF_LLR_FRONT_POT_4, "RAND_INF_LLR_FRONT_POT_4" }, + { RAND_INF_LLR_RAIN_SHED_POT_1, "RAND_INF_LLR_RAIN_SHED_POT_1" }, + { RAND_INF_LLR_RAIN_SHED_POT_2, "RAND_INF_LLR_RAIN_SHED_POT_2" }, + { RAND_INF_LLR_RAIN_SHED_POT_3, "RAND_INF_LLR_RAIN_SHED_POT_3" }, + { RAND_INF_LLR_TALONS_HOUSE_POT_1, "RAND_INF_LLR_TALONS_HOUSE_POT_1" }, + { RAND_INF_LLR_TALONS_HOUSE_POT_2, "RAND_INF_LLR_TALONS_HOUSE_POT_2" }, + { RAND_INF_LLR_TALONS_HOUSE_POT_3, "RAND_INF_LLR_TALONS_HOUSE_POT_3" }, + { RAND_INF_HF_COW_GROTTO_POT_1, "RAND_INF_HF_COW_GROTTO_POT_1" }, + { RAND_INF_HF_COW_GROTTO_POT_2, "RAND_INF_HF_COW_GROTTO_POT_2" }, + { RAND_INF_HC_STORMS_GROTTO_POT_1, "RAND_INF_HC_STORMS_GROTTO_POT_1" }, + { RAND_INF_HC_STORMS_GROTTO_POT_2, "RAND_INF_HC_STORMS_GROTTO_POT_2" }, + { RAND_INF_HC_STORMS_GROTTO_POT_3, "RAND_INF_HC_STORMS_GROTTO_POT_3" }, + { RAND_INF_HC_STORMS_GROTTO_POT_4, "RAND_INF_HC_STORMS_GROTTO_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5" }, + { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6" }, + { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_BLADE_POT_1, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_BLADE_POT_2, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4" }, + { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3" }, + { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3" }, + { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4" }, + { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5" }, + { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6" }, + { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3" }, + { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3" }, + { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4" }, + { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5" }, + { RAND_INF_FOREST_TEMPLE_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_1" }, + { RAND_INF_FOREST_TEMPLE_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_2" }, + { RAND_INF_FOREST_TEMPLE_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_3" }, + { RAND_INF_FOREST_TEMPLE_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_4" }, + { RAND_INF_FOREST_TEMPLE_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_5" }, + { RAND_INF_FOREST_TEMPLE_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_6" }, + { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1" }, + { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2" }, + { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1" }, + { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2" }, + { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1" }, + { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2" }, + { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3" }, + { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4" }, + { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1" }, + { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2" }, + { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3" }, + { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1" }, + { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2" }, + { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1" }, + { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2" }, + { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3" }, + { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4" }, + { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1" }, + { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2" }, + { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3" }, + { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4" }, + { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1" }, + { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2" }, + { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1" }, + { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2" }, + { RAND_INF_WATER_TEMPLE_TORCH_POT_1, "RAND_INF_WATER_TEMPLE_TORCH_POT_1" }, + { RAND_INF_WATER_TEMPLE_TORCH_POT_2, "RAND_INF_WATER_TEMPLE_TORCH_POT_2" }, + { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1" }, + { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2" }, + { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3" }, + { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1" }, + { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2" }, + { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1" }, + { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2" }, + { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3" }, + { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4" }, + { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1" }, + { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2" }, + { RAND_INF_WATER_TEMPLE_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_RIVER_POT_1" }, + { RAND_INF_WATER_TEMPLE_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_RIVER_POT_2" }, + { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1" }, + { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2" }, + { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1" }, + { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3" }, + { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4" }, + { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5" }, + { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3" }, + { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3" }, + { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3" }, + { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5" }, + { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6" }, + { RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, "RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1" }, + { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4" }, + { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1" }, + { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17" }, + { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12" }, + { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3" }, + { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT, "RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT" }, + { RAND_INF_ICE_CAVERN_HALL_POT_1, "RAND_INF_ICE_CAVERN_HALL_POT_1" }, + { RAND_INF_ICE_CAVERN_HALL_POT_2, "RAND_INF_ICE_CAVERN_HALL_POT_2" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2" }, + { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3" }, + { RAND_INF_ICE_CAVERN_NEAR_END_POT_1, "RAND_INF_ICE_CAVERN_NEAR_END_POT_1" }, + { RAND_INF_ICE_CAVERN_NEAR_END_POT_2, "RAND_INF_ICE_CAVERN_NEAR_END_POT_2" }, + { RAND_INF_ICE_CAVERN_FROZEN_POT_1, "RAND_INF_ICE_CAVERN_FROZEN_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, "RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT" }, - { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8" }, - { RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT, "RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT" }, - { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4" }, - { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5" }, - { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT, "RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2" }, - - { RAND_INF_CAUGHT_LOACH, "RAND_INF_CAUGHT_LOACH" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3" }, + { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4" }, + { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3" }, + { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1" }, + { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3" }, + { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3" }, + { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4" }, + { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2" }, + { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1" }, + { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2" }, + { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2" }, + { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1" }, + { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3" }, + { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4" }, + { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4" }, + { RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, "RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT" }, + { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1" }, + { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3" }, + { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3" }, + { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3" }, + { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7" }, + { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8" }, + { RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT, "RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT" }, + { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1" }, + { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2" }, + { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1" }, + { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2" }, + { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3" }, + { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4" }, + { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1" }, + { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2" }, + { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1" }, + { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3" }, + { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4" }, + { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5" }, + { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3" }, + { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3" }, + { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4" }, + { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5" }, + { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3" }, + { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1" }, + { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2" }, + { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3" }, + { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4" }, + { RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT, "RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT" }, + { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, + "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1" }, + { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, + "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2" }, + { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, + "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1" }, + { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, + "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2" }, - { RAND_INF_CAN_SWIM, "RAND_INF_CAN_SWIM" }, + { RAND_INF_CAUGHT_LOACH, "RAND_INF_CAUGHT_LOACH" }, - { RAND_INF_HAS_WALLET, "RAND_INF_HAS_WALLET" }, + { RAND_INF_CAN_SWIM, "RAND_INF_CAN_SWIM" }, - { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO" }, - { RAND_INF_BEEHIVE_SFM_STORMS_GROTTO, "RAND_INF_BEEHIVE_SFM_STORMS_GROTTO" }, - { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO, "RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO" }, - { RAND_INF_BEEHIVE_LLR_GROTTO, "RAND_INF_BEEHIVE_LLR_GROTTO" }, - { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_DMT_COW_GROTTO, "RAND_INF_BEEHIVE_DMT_COW_GROTTO" }, - { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_GC_GROTTO, "RAND_INF_BEEHIVE_GC_GROTTO" }, - { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO, "RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO" }, - { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_ZR_STORMS_GROTTO, "RAND_INF_BEEHIVE_ZR_STORMS_GROTTO" }, - { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT" }, - { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT" }, - { RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA, "RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA" }, - { RAND_INF_BEEHIVE_LH_GROTTO, "RAND_INF_BEEHIVE_LH_GROTTO" }, - { RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO" }, - { RAND_INF_BEEHIVE_COLOSSUS_GROTTO, "RAND_INF_BEEHIVE_COLOSSUS_GROTTO" }, + { RAND_INF_HAS_WALLET, "RAND_INF_HAS_WALLET" }, - { RAND_INF_CHILD_FISH_1, "RAND_INF_CHILD_FISH_1" }, - { RAND_INF_CHILD_FISH_2, "RAND_INF_CHILD_FISH_2" }, - { RAND_INF_CHILD_FISH_3, "RAND_INF_CHILD_FISH_3" }, - { RAND_INF_CHILD_FISH_4, "RAND_INF_CHILD_FISH_4" }, - { RAND_INF_CHILD_FISH_5, "RAND_INF_CHILD_FISH_5" }, - { RAND_INF_CHILD_FISH_6, "RAND_INF_CHILD_FISH_6" }, - { RAND_INF_CHILD_FISH_7, "RAND_INF_CHILD_FISH_7" }, - { RAND_INF_CHILD_FISH_8, "RAND_INF_CHILD_FISH_8" }, - { RAND_INF_CHILD_FISH_9, "RAND_INF_CHILD_FISH_9" }, - { RAND_INF_CHILD_FISH_10, "RAND_INF_CHILD_FISH_10" }, - { RAND_INF_CHILD_FISH_11, "RAND_INF_CHILD_FISH_11" }, - { RAND_INF_CHILD_FISH_12, "RAND_INF_CHILD_FISH_12" }, - { RAND_INF_CHILD_FISH_13, "RAND_INF_CHILD_FISH_13" }, - { RAND_INF_CHILD_FISH_14, "RAND_INF_CHILD_FISH_14" }, - { RAND_INF_CHILD_FISH_15, "RAND_INF_CHILD_FISH_15" }, - { RAND_INF_CHILD_LOACH_1, "RAND_INF_CHILD_LOACH_1" }, - { RAND_INF_CHILD_LOACH_2, "RAND_INF_CHILD_LOACH_2" }, - { RAND_INF_ADULT_FISH_1, "RAND_INF_ADULT_FISH_1" }, - { RAND_INF_ADULT_FISH_2, "RAND_INF_ADULT_FISH_2" }, - { RAND_INF_ADULT_FISH_3, "RAND_INF_ADULT_FISH_3" }, - { RAND_INF_ADULT_FISH_4, "RAND_INF_ADULT_FISH_4" }, - { RAND_INF_ADULT_FISH_5, "RAND_INF_ADULT_FISH_5" }, - { RAND_INF_ADULT_FISH_6, "RAND_INF_ADULT_FISH_6" }, - { RAND_INF_ADULT_FISH_7, "RAND_INF_ADULT_FISH_7" }, - { RAND_INF_ADULT_FISH_8, "RAND_INF_ADULT_FISH_8" }, - { RAND_INF_ADULT_FISH_9, "RAND_INF_ADULT_FISH_9" }, - { RAND_INF_ADULT_FISH_10, "RAND_INF_ADULT_FISH_10" }, - { RAND_INF_ADULT_FISH_11, "RAND_INF_ADULT_FISH_11" }, - { RAND_INF_ADULT_FISH_12, "RAND_INF_ADULT_FISH_12" }, - { RAND_INF_ADULT_FISH_13, "RAND_INF_ADULT_FISH_13" }, - { RAND_INF_ADULT_FISH_14, "RAND_INF_ADULT_FISH_14" }, - { RAND_INF_ADULT_FISH_15, "RAND_INF_ADULT_FISH_15" }, - { RAND_INF_ADULT_LOACH, "RAND_INF_ADULT_LOACH" }, - { RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, "RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO" }, - { RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO" }, - { RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, "RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, "RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO" }, - { RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, "RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO" }, - { RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO" }, - { RAND_INF_FISHING_POLE_FOUND, "RAND_INF_FISHING_POLE_FOUND" }, - { RAND_INF_ZD_FISH_1, "RAND_INF_ZD_FISH_1" }, - { RAND_INF_ZD_FISH_2, "RAND_INF_ZD_FISH_2" }, - { RAND_INF_ZD_FISH_3, "RAND_INF_ZD_FISH_3" }, - { RAND_INF_ZD_FISH_4, "RAND_INF_ZD_FISH_4" }, - { RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" }, + { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO" }, + { RAND_INF_BEEHIVE_SFM_STORMS_GROTTO, "RAND_INF_BEEHIVE_SFM_STORMS_GROTTO" }, + { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO, "RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO" }, + { RAND_INF_BEEHIVE_LLR_GROTTO, "RAND_INF_BEEHIVE_LLR_GROTTO" }, + { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_DMT_COW_GROTTO, "RAND_INF_BEEHIVE_DMT_COW_GROTTO" }, + { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_GC_GROTTO, "RAND_INF_BEEHIVE_GC_GROTTO" }, + { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO, "RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO" }, + { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT" }, + { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT" }, + { RAND_INF_BEEHIVE_ZR_STORMS_GROTTO, "RAND_INF_BEEHIVE_ZR_STORMS_GROTTO" }, + { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT" }, + { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT" }, + { RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA, "RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA" }, + { RAND_INF_BEEHIVE_LH_GROTTO, "RAND_INF_BEEHIVE_LH_GROTTO" }, + { RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO" }, + { RAND_INF_BEEHIVE_COLOSSUS_GROTTO, "RAND_INF_BEEHIVE_COLOSSUS_GROTTO" }, - { RAND_INF_HAS_INFINITE_QUIVER, "RAND_INF_HAS_INFINITE_QUIVER" }, - { RAND_INF_HAS_INFINITE_BOMB_BAG, "RAND_INF_HAS_INFINITE_BOMB_BAG" }, - { RAND_INF_HAS_INFINITE_BULLET_BAG, "RAND_INF_HAS_INFINITE_BULLET_BAG" }, - { RAND_INF_HAS_INFINITE_STICK_UPGRADE, "RAND_INF_HAS_INFINITE_STICK_UPGRADE" }, - { RAND_INF_HAS_INFINITE_NUT_UPGRADE, "RAND_INF_HAS_INFINITE_NUT_UPGRADE" }, - { RAND_INF_HAS_INFINITE_MAGIC_METER, "RAND_INF_HAS_INFINITE_MAGIC_METER" }, - { RAND_INF_HAS_INFINITE_BOMBCHUS, "RAND_INF_HAS_INFINITE_BOMBCHUS" }, - { RAND_INF_HAS_INFINITE_MONEY, "RAND_INF_HAS_INFINITE_MONEY" }, + { RAND_INF_CHILD_FISH_1, "RAND_INF_CHILD_FISH_1" }, + { RAND_INF_CHILD_FISH_2, "RAND_INF_CHILD_FISH_2" }, + { RAND_INF_CHILD_FISH_3, "RAND_INF_CHILD_FISH_3" }, + { RAND_INF_CHILD_FISH_4, "RAND_INF_CHILD_FISH_4" }, + { RAND_INF_CHILD_FISH_5, "RAND_INF_CHILD_FISH_5" }, + { RAND_INF_CHILD_FISH_6, "RAND_INF_CHILD_FISH_6" }, + { RAND_INF_CHILD_FISH_7, "RAND_INF_CHILD_FISH_7" }, + { RAND_INF_CHILD_FISH_8, "RAND_INF_CHILD_FISH_8" }, + { RAND_INF_CHILD_FISH_9, "RAND_INF_CHILD_FISH_9" }, + { RAND_INF_CHILD_FISH_10, "RAND_INF_CHILD_FISH_10" }, + { RAND_INF_CHILD_FISH_11, "RAND_INF_CHILD_FISH_11" }, + { RAND_INF_CHILD_FISH_12, "RAND_INF_CHILD_FISH_12" }, + { RAND_INF_CHILD_FISH_13, "RAND_INF_CHILD_FISH_13" }, + { RAND_INF_CHILD_FISH_14, "RAND_INF_CHILD_FISH_14" }, + { RAND_INF_CHILD_FISH_15, "RAND_INF_CHILD_FISH_15" }, + { RAND_INF_CHILD_LOACH_1, "RAND_INF_CHILD_LOACH_1" }, + { RAND_INF_CHILD_LOACH_2, "RAND_INF_CHILD_LOACH_2" }, + { RAND_INF_ADULT_FISH_1, "RAND_INF_ADULT_FISH_1" }, + { RAND_INF_ADULT_FISH_2, "RAND_INF_ADULT_FISH_2" }, + { RAND_INF_ADULT_FISH_3, "RAND_INF_ADULT_FISH_3" }, + { RAND_INF_ADULT_FISH_4, "RAND_INF_ADULT_FISH_4" }, + { RAND_INF_ADULT_FISH_5, "RAND_INF_ADULT_FISH_5" }, + { RAND_INF_ADULT_FISH_6, "RAND_INF_ADULT_FISH_6" }, + { RAND_INF_ADULT_FISH_7, "RAND_INF_ADULT_FISH_7" }, + { RAND_INF_ADULT_FISH_8, "RAND_INF_ADULT_FISH_8" }, + { RAND_INF_ADULT_FISH_9, "RAND_INF_ADULT_FISH_9" }, + { RAND_INF_ADULT_FISH_10, "RAND_INF_ADULT_FISH_10" }, + { RAND_INF_ADULT_FISH_11, "RAND_INF_ADULT_FISH_11" }, + { RAND_INF_ADULT_FISH_12, "RAND_INF_ADULT_FISH_12" }, + { RAND_INF_ADULT_FISH_13, "RAND_INF_ADULT_FISH_13" }, + { RAND_INF_ADULT_FISH_14, "RAND_INF_ADULT_FISH_14" }, + { RAND_INF_ADULT_FISH_15, "RAND_INF_ADULT_FISH_15" }, + { RAND_INF_ADULT_LOACH, "RAND_INF_ADULT_LOACH" }, + { RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO" }, + { RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, "RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO" }, + { RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO" }, + { RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO" }, + { RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, "RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO" }, + { RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO" }, + { RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, "RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO" }, + { RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, "RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO" }, + { RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO" }, + { RAND_INF_FISHING_POLE_FOUND, "RAND_INF_FISHING_POLE_FOUND" }, + { RAND_INF_ZD_FISH_1, "RAND_INF_ZD_FISH_1" }, + { RAND_INF_ZD_FISH_2, "RAND_INF_ZD_FISH_2" }, + { RAND_INF_ZD_FISH_3, "RAND_INF_ZD_FISH_3" }, + { RAND_INF_ZD_FISH_4, "RAND_INF_ZD_FISH_4" }, + { RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" }, - { RAND_INF_HAS_SKELETON_KEY, "RAND_INF_HAS_SKELETON_KEY" }, + { RAND_INF_HAS_INFINITE_QUIVER, "RAND_INF_HAS_INFINITE_QUIVER" }, + { RAND_INF_HAS_INFINITE_BOMB_BAG, "RAND_INF_HAS_INFINITE_BOMB_BAG" }, + { RAND_INF_HAS_INFINITE_BULLET_BAG, "RAND_INF_HAS_INFINITE_BULLET_BAG" }, + { RAND_INF_HAS_INFINITE_STICK_UPGRADE, "RAND_INF_HAS_INFINITE_STICK_UPGRADE" }, + { RAND_INF_HAS_INFINITE_NUT_UPGRADE, "RAND_INF_HAS_INFINITE_NUT_UPGRADE" }, + { RAND_INF_HAS_INFINITE_MAGIC_METER, "RAND_INF_HAS_INFINITE_MAGIC_METER" }, + { RAND_INF_HAS_INFINITE_BOMBCHUS, "RAND_INF_HAS_INFINITE_BOMBCHUS" }, + { RAND_INF_HAS_INFINITE_MONEY, "RAND_INF_HAS_INFINITE_MONEY" }, - { RAND_INF_LINKS_POCKET, "RAND_INF_LINKS_POCKET" }, - { RAND_INF_LEARNED_EPONA_SONG, "RAND_INF_LEARNED_EPONA_SONG" }, - { RAND_INF_DARUNIAS_JOY, "RAND_INF_DARUNIAS_JOY" }, - { RAND_INF_KING_ZORA_THAWED, "RAND_INF_KING_ZORA_THAWED" }, + { RAND_INF_HAS_SKELETON_KEY, "RAND_INF_HAS_SKELETON_KEY" }, - { RAND_INF_HC_GREAT_FAIRY_REWARD, "RAND_INF_HC_GREAT_FAIRY_REWARD" }, - { RAND_INF_DMT_GREAT_FAIRY_REWARD, "RAND_INF_DMT_GREAT_FAIRY_REWARD" }, - { RAND_INF_DMC_GREAT_FAIRY_REWARD, "RAND_INF_DMC_GREAT_FAIRY_REWARD" }, - { RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" }, - { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, - { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, + { RAND_INF_LINKS_POCKET, "RAND_INF_LINKS_POCKET" }, + { RAND_INF_LEARNED_EPONA_SONG, "RAND_INF_LEARNED_EPONA_SONG" }, + { RAND_INF_DARUNIAS_JOY, "RAND_INF_DARUNIAS_JOY" }, + { RAND_INF_KING_ZORA_THAWED, "RAND_INF_KING_ZORA_THAWED" }, - { RAND_INF_ZELDAS_LETTER, "RAND_INF_ZELDAS_LETTER" }, - { RAND_INF_WEIRD_EGG, "RAND_INF_WEIRD_EGG" }, + { RAND_INF_HC_GREAT_FAIRY_REWARD, "RAND_INF_HC_GREAT_FAIRY_REWARD" }, + { RAND_INF_DMT_GREAT_FAIRY_REWARD, "RAND_INF_DMT_GREAT_FAIRY_REWARD" }, + { RAND_INF_DMC_GREAT_FAIRY_REWARD, "RAND_INF_DMC_GREAT_FAIRY_REWARD" }, + { RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" }, + { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, + { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, - { RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE" }, - { RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, "RAND_INF_KF_NORTH_GRASS_WEST_RUPEE" }, - { RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, "RAND_INF_KF_NORTH_GRASS_EAST_RUPEE" }, - { RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE" }, - { RAND_INF_KF_SARIAS_TOP_LEFT_HEART, "RAND_INF_KF_SARIAS_TOP_LEFT_HEART" }, - { RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, "RAND_INF_KF_SARIAS_TOP_RIGHT_HEART" }, - { RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART" }, - { RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART" }, - { RAND_INF_KF_BEAN_RUPEE_1, "RAND_INF_KF_BEAN_RUPEE_1" }, - { RAND_INF_KF_BEAN_RUPEE_2, "RAND_INF_KF_BEAN_RUPEE_2" }, - { RAND_INF_KF_BEAN_RUPEE_3, "RAND_INF_KF_BEAN_RUPEE_3" }, - { RAND_INF_KF_BEAN_RUPEE_4, "RAND_INF_KF_BEAN_RUPEE_4" }, - { RAND_INF_KF_BEAN_RUPEE_5, "RAND_INF_KF_BEAN_RUPEE_5" }, - { RAND_INF_KF_BEAN_RUPEE_6, "RAND_INF_KF_BEAN_RUPEE_6" }, - { RAND_INF_KF_BEAN_RED_RUPEE, "RAND_INF_KF_BEAN_RED_RUPEE" }, - { RAND_INF_LW_SHORTCUT_RUPEE_1, "RAND_INF_LW_SHORTCUT_RUPEE_1" }, - { RAND_INF_LW_SHORTCUT_RUPEE_2, "RAND_INF_LW_SHORTCUT_RUPEE_2" }, - { RAND_INF_LW_SHORTCUT_RUPEE_3, "RAND_INF_LW_SHORTCUT_RUPEE_3" }, - { RAND_INF_LW_SHORTCUT_RUPEE_4, "RAND_INF_LW_SHORTCUT_RUPEE_4" }, - { RAND_INF_LW_SHORTCUT_RUPEE_5, "RAND_INF_LW_SHORTCUT_RUPEE_5" }, - { RAND_INF_LW_SHORTCUT_RUPEE_6, "RAND_INF_LW_SHORTCUT_RUPEE_6" }, - { RAND_INF_LW_SHORTCUT_RUPEE_7, "RAND_INF_LW_SHORTCUT_RUPEE_7" }, - { RAND_INF_LW_SHORTCUT_RUPEE_8, "RAND_INF_LW_SHORTCUT_RUPEE_8" }, - { RAND_INF_LH_FRONT_RUPEE, "RAND_INF_LH_FRONT_RUPEE" }, - { RAND_INF_LH_MIDDLE_RUPEE, "RAND_INF_LH_MIDDLE_RUPEE" }, - { RAND_INF_LH_BACK_RUPEE, "RAND_INF_LH_BACK_RUPEE" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE" }, - { RAND_INF_DMT_BLUE_RUPEE, "RAND_INF_DMT_BLUE_RUPEE" }, - { RAND_INF_DMT_COW_GROTTO_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_LEFT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_RIGHT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_1, "RAND_INF_DMT_COW_GROTTO_RUPEE_1" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_2, "RAND_INF_DMT_COW_GROTTO_RUPEE_2" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_3, "RAND_INF_DMT_COW_GROTTO_RUPEE_3" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_4, "RAND_INF_DMT_COW_GROTTO_RUPEE_4" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_5, "RAND_INF_DMT_COW_GROTTO_RUPEE_5" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_6, "RAND_INF_DMT_COW_GROTTO_RUPEE_6" }, - { RAND_INF_DMT_COW_GROTTO_RED_RUPEE, "RAND_INF_DMT_COW_GROTTO_RED_RUPEE" }, - { RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, "RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, "RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, "RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE" }, - { RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, "RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART" }, - { RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, "RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART" }, - { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_1, "RAND_INF_WATER_TEMPLE_RIVER_HEART_1" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_2, "RAND_INF_WATER_TEMPLE_RIVER_HEART_2" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_3, "RAND_INF_WATER_TEMPLE_RIVER_HEART_3" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_4, "RAND_INF_WATER_TEMPLE_RIVER_HEART_4" }, - { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART" }, - { RAND_INF_ICE_CAVERN_LOBBY_RUPEE, "RAND_INF_ICE_CAVERN_LOBBY_RUPEE" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART" }, - { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART" }, - { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART" }, - { RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART" }, - { RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, "RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART" }, - { RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, "RAND_INF_DEKU_TREE_MQ_LOBBY_HEART" }, - { RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART" }, + { RAND_INF_ZELDAS_LETTER, "RAND_INF_ZELDAS_LETTER" }, + { RAND_INF_WEIRD_EGG, "RAND_INF_WEIRD_EGG" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_1, "RAND_INF_COLOSSUS_OASIS_FAIRY_1" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_2, "RAND_INF_COLOSSUS_OASIS_FAIRY_2" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_3, "RAND_INF_COLOSSUS_OASIS_FAIRY_3" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_4, "RAND_INF_COLOSSUS_OASIS_FAIRY_4" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_5, "RAND_INF_COLOSSUS_OASIS_FAIRY_5" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_6, "RAND_INF_COLOSSUS_OASIS_FAIRY_6" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_7, "RAND_INF_COLOSSUS_OASIS_FAIRY_7" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_8, "RAND_INF_COLOSSUS_OASIS_FAIRY_8" }, + { RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE" }, + { RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, "RAND_INF_KF_NORTH_GRASS_WEST_RUPEE" }, + { RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, "RAND_INF_KF_NORTH_GRASS_EAST_RUPEE" }, + { RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE" }, + { RAND_INF_KF_SARIAS_TOP_LEFT_HEART, "RAND_INF_KF_SARIAS_TOP_LEFT_HEART" }, + { RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, "RAND_INF_KF_SARIAS_TOP_RIGHT_HEART" }, + { RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART" }, + { RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART" }, + { RAND_INF_KF_BEAN_RUPEE_1, "RAND_INF_KF_BEAN_RUPEE_1" }, + { RAND_INF_KF_BEAN_RUPEE_2, "RAND_INF_KF_BEAN_RUPEE_2" }, + { RAND_INF_KF_BEAN_RUPEE_3, "RAND_INF_KF_BEAN_RUPEE_3" }, + { RAND_INF_KF_BEAN_RUPEE_4, "RAND_INF_KF_BEAN_RUPEE_4" }, + { RAND_INF_KF_BEAN_RUPEE_5, "RAND_INF_KF_BEAN_RUPEE_5" }, + { RAND_INF_KF_BEAN_RUPEE_6, "RAND_INF_KF_BEAN_RUPEE_6" }, + { RAND_INF_KF_BEAN_RED_RUPEE, "RAND_INF_KF_BEAN_RED_RUPEE" }, + { RAND_INF_LW_SHORTCUT_RUPEE_1, "RAND_INF_LW_SHORTCUT_RUPEE_1" }, + { RAND_INF_LW_SHORTCUT_RUPEE_2, "RAND_INF_LW_SHORTCUT_RUPEE_2" }, + { RAND_INF_LW_SHORTCUT_RUPEE_3, "RAND_INF_LW_SHORTCUT_RUPEE_3" }, + { RAND_INF_LW_SHORTCUT_RUPEE_4, "RAND_INF_LW_SHORTCUT_RUPEE_4" }, + { RAND_INF_LW_SHORTCUT_RUPEE_5, "RAND_INF_LW_SHORTCUT_RUPEE_5" }, + { RAND_INF_LW_SHORTCUT_RUPEE_6, "RAND_INF_LW_SHORTCUT_RUPEE_6" }, + { RAND_INF_LW_SHORTCUT_RUPEE_7, "RAND_INF_LW_SHORTCUT_RUPEE_7" }, + { RAND_INF_LW_SHORTCUT_RUPEE_8, "RAND_INF_LW_SHORTCUT_RUPEE_8" }, + { RAND_INF_LH_FRONT_RUPEE, "RAND_INF_LH_FRONT_RUPEE" }, + { RAND_INF_LH_MIDDLE_RUPEE, "RAND_INF_LH_MIDDLE_RUPEE" }, + { RAND_INF_LH_BACK_RUPEE, "RAND_INF_LH_BACK_RUPEE" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7" }, + { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE" }, + { RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE" }, + { RAND_INF_DMT_BLUE_RUPEE, "RAND_INF_DMT_BLUE_RUPEE" }, + { RAND_INF_DMT_COW_GROTTO_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_LEFT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_RIGHT_HEART" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_1, "RAND_INF_DMT_COW_GROTTO_RUPEE_1" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_2, "RAND_INF_DMT_COW_GROTTO_RUPEE_2" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_3, "RAND_INF_DMT_COW_GROTTO_RUPEE_3" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_4, "RAND_INF_DMT_COW_GROTTO_RUPEE_4" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_5, "RAND_INF_DMT_COW_GROTTO_RUPEE_5" }, + { RAND_INF_DMT_COW_GROTTO_RUPEE_6, "RAND_INF_DMT_COW_GROTTO_RUPEE_6" }, + { RAND_INF_DMT_COW_GROTTO_RED_RUPEE, "RAND_INF_DMT_COW_GROTTO_RED_RUPEE" }, + { RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, "RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, "RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5" }, + { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6" }, + { RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, "RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE" }, + { RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE" }, + { RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE" }, + { RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, "RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART" }, + { RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, "RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART" }, + { RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART" }, + { RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART" }, + { RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART" }, + { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART" }, + { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART" }, + { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART" }, + { RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART" }, + { RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART" }, + { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART" }, + { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART" }, + { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART" }, + { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_1, "RAND_INF_WATER_TEMPLE_RIVER_HEART_1" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_2, "RAND_INF_WATER_TEMPLE_RIVER_HEART_2" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_3, "RAND_INF_WATER_TEMPLE_RIVER_HEART_3" }, + { RAND_INF_WATER_TEMPLE_RIVER_HEART_4, "RAND_INF_WATER_TEMPLE_RIVER_HEART_4" }, + { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, + "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, + "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART" }, + { RAND_INF_ICE_CAVERN_LOBBY_RUPEE, "RAND_INF_ICE_CAVERN_LOBBY_RUPEE" }, + { RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART" }, + { RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART" }, + { RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART" }, + { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1" }, + { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2" }, + { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3" }, + { RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, + "RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART" }, + { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART" }, + { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2" }, + { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3" }, + { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART" }, + { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART" }, + { RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART" }, + { RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, "RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART" }, + { RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, "RAND_INF_DEKU_TREE_MQ_LOBBY_HEART" }, + { RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART" }, + { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART" }, + { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART" }, + { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART" }, + { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, + "RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1" }, + { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2" }, + { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART" }, + { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART" }, + { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART" }, + { RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART" }, + { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, + "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, + "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, + "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, + "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART" }, + { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, + "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, + "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, + "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, + "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART" }, + { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, + "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART" }, + { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART" }, + { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART" }, + { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "RAND_INF_KF_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "RAND_INF_KF_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "RAND_INF_KF_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "RAND_INF_LH_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "RAND_INF_LH_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "RAND_INF_LH_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "RAND_INF_GV_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "RAND_INF_GV_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "RAND_INF_GV_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_1" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_2" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_3" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_4" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_5" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_6" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_7" }, + { RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_8" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7" }, + { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7" }, + { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7" }, + { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_1, "RAND_INF_COLOSSUS_OASIS_FAIRY_1" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_2, "RAND_INF_COLOSSUS_OASIS_FAIRY_2" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_3, "RAND_INF_COLOSSUS_OASIS_FAIRY_3" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_4, "RAND_INF_COLOSSUS_OASIS_FAIRY_4" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_5, "RAND_INF_COLOSSUS_OASIS_FAIRY_5" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_6, "RAND_INF_COLOSSUS_OASIS_FAIRY_6" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_7, "RAND_INF_COLOSSUS_OASIS_FAIRY_7" }, + { RAND_INF_COLOSSUS_OASIS_FAIRY_8, "RAND_INF_COLOSSUS_OASIS_FAIRY_8" }, - { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMC_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMT_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY" }, - { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GV_GOSSIP_STONE_FAIRY, "RAND_INF_GV_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_GOSSIP_STONE_FAIRY, "RAND_INF_KF_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LW_GOSSIP_STONE_FAIRY, "RAND_INF_LW_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZD_GOSSIP_STONE_FAIRY, "RAND_INF_ZD_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - - { RAND_INF_LH_ISLAND_SUN_FAIRY, "RAND_INF_LH_ISLAND_SUN_FAIRY" }, - { RAND_INF_HF_POND_STORMS_FAIRY, "RAND_INF_HF_POND_STORMS_FAIRY" }, - { RAND_INF_DMT_FLAG_SUN_FAIRY, "RAND_INF_DMT_FLAG_SUN_FAIRY" }, - { RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "RAND_INF_LW_SHORTCUT_STORMS_FAIRY" }, - { RAND_INF_GF_KITCHEN_SUN_FAIRY, "RAND_INF_GF_KITCHEN_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY" }, - { RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY" }, - { RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY" }, - { RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY" }, - { RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY" }, - { 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_ZR_BEAN_SPROUT_FAIRY_1, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "RAND_INF_KF_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "RAND_INF_KF_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "RAND_INF_KF_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2" }, + { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3" }, + { RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "RAND_INF_LH_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "RAND_INF_LH_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "RAND_INF_LH_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "RAND_INF_GV_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "RAND_INF_GV_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "RAND_INF_GV_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_3" }, + { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_1" }, + { RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_2" }, + { RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_3" }, - { 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" }, + { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMC_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMT_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY" }, + { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GV_GOSSIP_STONE_FAIRY, "RAND_INF_GV_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY" }, + { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_GOSSIP_STONE_FAIRY, "RAND_INF_KF_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LW_GOSSIP_STONE_FAIRY, "RAND_INF_LW_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY" }, + { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY" }, + { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZD_GOSSIP_STONE_FAIRY, "RAND_INF_ZD_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, + { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY" }, + { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, "RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG" }, - { RAND_INF_CHILD_TRADES_HAS_CHICKEN, "RAND_INF_CHILD_TRADES_HAS_CHICKEN" }, - { RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, "RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, "RAND_INF_CHILD_TRADES_HAS_MASK_KEATON" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, "RAND_INF_CHILD_TRADES_HAS_MASK_SKULL" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, "RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, "RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_GORON, "RAND_INF_CHILD_TRADES_HAS_MASK_GORON" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, "RAND_INF_CHILD_TRADES_HAS_MASK_ZORA" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, "RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, "RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH" }, + { RAND_INF_LH_ISLAND_SUN_FAIRY, "RAND_INF_LH_ISLAND_SUN_FAIRY" }, + { RAND_INF_HF_POND_STORMS_FAIRY, "RAND_INF_HF_POND_STORMS_FAIRY" }, + { RAND_INF_DMT_FLAG_SUN_FAIRY, "RAND_INF_DMT_FLAG_SUN_FAIRY" }, + { RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "RAND_INF_LW_SHORTCUT_STORMS_FAIRY" }, + { RAND_INF_GF_KITCHEN_SUN_FAIRY, "RAND_INF_GF_KITCHEN_SUN_FAIRY" }, + { RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY" }, + { RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY" }, + { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY" }, + { RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY" }, + { RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + "RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY" }, + { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY" }, + { RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY" }, + { RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY" }, + { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY" }, + { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY" }, + { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY" }, + { RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY" }, + { RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY" }, + { 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_ADULT_TRADES_HAS_POCKET_EGG, "RAND_INF_ADULT_TRADES_HAS_POCKET_EGG" }, - { RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, "RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO" }, - { RAND_INF_ADULT_TRADES_HAS_COJIRO, "RAND_INF_ADULT_TRADES_HAS_COJIRO" }, - { RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, "RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM" }, - { RAND_INF_ADULT_TRADES_HAS_ODD_POTION, "RAND_INF_ADULT_TRADES_HAS_ODD_POTION" }, - { RAND_INF_ADULT_TRADES_HAS_SAW, "RAND_INF_ADULT_TRADES_HAS_SAW" }, - { RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, "RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN" }, - { RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, "RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION" }, - { RAND_INF_ADULT_TRADES_HAS_FROG, "RAND_INF_ADULT_TRADES_HAS_FROG" }, - { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, "RAND_INF_ADULT_TRADES_HAS_EYEDROPS" }, - { RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, "RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK" }, - } }, + { 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" }, + + { RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, "RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG" }, + { RAND_INF_CHILD_TRADES_HAS_CHICKEN, "RAND_INF_CHILD_TRADES_HAS_CHICKEN" }, + { RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, "RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, "RAND_INF_CHILD_TRADES_HAS_MASK_KEATON" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, "RAND_INF_CHILD_TRADES_HAS_MASK_SKULL" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, "RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, "RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_GORON, "RAND_INF_CHILD_TRADES_HAS_MASK_GORON" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, "RAND_INF_CHILD_TRADES_HAS_MASK_ZORA" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, "RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO" }, + { RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, "RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH" }, + + { RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, "RAND_INF_ADULT_TRADES_HAS_POCKET_EGG" }, + { RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, "RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO" }, + { RAND_INF_ADULT_TRADES_HAS_COJIRO, "RAND_INF_ADULT_TRADES_HAS_COJIRO" }, + { RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, "RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM" }, + { RAND_INF_ADULT_TRADES_HAS_ODD_POTION, "RAND_INF_ADULT_TRADES_HAS_ODD_POTION" }, + { RAND_INF_ADULT_TRADES_HAS_SAW, "RAND_INF_ADULT_TRADES_HAS_SAW" }, + { RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, "RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN" }, + { RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, "RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION" }, + { RAND_INF_ADULT_TRADES_HAS_FROG, "RAND_INF_ADULT_TRADES_HAS_FROG" }, + { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, "RAND_INF_ADULT_TRADES_HAS_EYEDROPS" }, + { RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, "RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK" }, + } }, }; const std::vector state1 = { @@ -1661,7 +1720,7 @@ const std::vector state1 = { "In Water", "In Item Cutscene", "In Cutscene", - "30", //Unknown + "30", // Unknown "Floor collision disabled", }; @@ -1717,5 +1776,5 @@ class SaveEditorWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/dlViewer.cpp b/soh/soh/Enhancements/debugger/dlViewer.cpp index 27833058a..7cedcdf26 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.cpp +++ b/soh/soh/Enhancements/debugger/dlViewer.cpp @@ -66,7 +66,8 @@ std::map cmdMap = { }; void PerformDisplayListSearch() { - auto result = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles("*" + std::string(searchString) + "*DL*"); + auto result = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles( + "*" + std::string(searchString) + "*DL*"); displayListSearchResults.clear(); @@ -79,15 +80,12 @@ void PerformDisplayListSearch() { } // Sort the final list - std::sort(displayListSearchResults.begin(), displayListSearchResults.end(), [](const std::string& a, const std::string& b) { - return std::lexicographical_compare( - a.begin(), a.end(), - b.begin(), b.end(), - [](char c1, char c2) { - return std::tolower(c1) < std::tolower(c2); - } - ); - }); + std::sort(displayListSearchResults.begin(), displayListSearchResults.end(), + [](const std::string& a, const std::string& b) { + return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](char c1, char c2) { + return std::tolower(c1) < std::tolower(c2); + }); + }); } void DLViewerWindow::DrawElement() { @@ -128,7 +126,8 @@ void DLViewerWindow::DrawElement() { } try { - auto res = std::static_pointer_cast(Ship::Context::GetInstance()->GetResourceManager()->LoadResource(activeDisplayList)); + auto res = std::static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(activeDisplayList)); if (res->GetInitData()->Type != static_cast(Fast::ResourceType::DisplayList)) { ImGui::Text("Resource type is not a Display List. Please choose another."); @@ -141,7 +140,8 @@ void DLViewerWindow::DrawElement() { std::string id = "##CMD" + std::to_string(i); Gfx* gfx = (Gfx*)&res->Instructions[i]; int cmd = gfx->words.w0 >> 24; - if (cmdMap.find(cmd) == cmdMap.end()) continue; + if (cmdMap.find(cmd) == cmdMap.end()) + continue; std::string cmdLabel = cmdMap.at(cmd); @@ -199,14 +199,13 @@ void DLViewerWindow::DrawElement() { } ImGui::PopItemWidth(); } - if (cmd == G_RDPPIPESYNC) { - } + if (cmd == G_RDPPIPESYNC) {} if (cmd == G_SETGRAYSCALE) { bool* state = (bool*)&gfx->words.w1; ImGui::SameLine(); UIWidgets::PushStyleCheckbox(THEME_COLOR); if (ImGui::Checkbox(("state" + id).c_str(), state)) { - // + // } UIWidgets::PopStyleCheckbox(); } @@ -304,8 +303,7 @@ void DLViewerWindow::DrawElement() { ImGui::SameLine(); ImGui::Text("Vertex Name: %s", fileName); } - if (cmd == G_DL) { - } + if (cmd == G_DL) {} if (cmd == G_DL_OTR_HASH) { gfx++; uint64_t hash = ((uint64_t)gfx->words.w0 << 32) + (uint64_t)gfx->words.w1; @@ -320,8 +318,8 @@ void DLViewerWindow::DrawElement() { } // Skip second half of instructions that are over 128-bit wide - if (cmd == G_SETTIMG_OTR_HASH || cmd == G_DL_OTR_HASH || cmd == G_VTX_OTR_HASH || - cmd == G_BRANCH_Z_OTR || cmd == G_MARKER || cmd == G_MTX_OTR) { + if (cmd == G_SETTIMG_OTR_HASH || cmd == G_DL_OTR_HASH || cmd == G_VTX_OTR_HASH || cmd == G_BRANCH_Z_OTR || + cmd == G_MARKER || cmd == G_MTX_OTR) { i++; ImGui::Text("%lu - Reserved - Second half of %s", i, cmdLabel.c_str()); } diff --git a/soh/soh/Enhancements/debugger/dlViewer.h b/soh/soh/Enhancements/debugger/dlViewer.h index 9d2785456..3655c8964 100644 --- a/soh/soh/Enhancements/debugger/dlViewer.h +++ b/soh/soh/Enhancements/debugger/dlViewer.h @@ -8,5 +8,5 @@ class DLViewerWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/hookDebugger.h b/soh/soh/Enhancements/debugger/hookDebugger.h index ae6f5113f..4d5c776db 100644 --- a/soh/soh/Enhancements/debugger/hookDebugger.h +++ b/soh/soh/Enhancements/debugger/hookDebugger.h @@ -6,5 +6,5 @@ class HookDebuggerWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/debugger/performanceTimer.cpp b/soh/soh/Enhancements/debugger/performanceTimer.cpp index 54e1cb983..43999e7bc 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.cpp +++ b/soh/soh/Enhancements/debugger/performanceTimer.cpp @@ -1,14 +1,14 @@ #include "performanceTimer.h" -void StartPerformanceTimer(TimerID timer){ +void StartPerformanceTimer(TimerID timer) { timeStarted[timer] = std::chrono::high_resolution_clock::now(); } -void StopPerformanceTimer(TimerID timer){ +void StopPerformanceTimer(TimerID timer) { totalTimes[timer] += (std::chrono::high_resolution_clock::now() - timeStarted[timer]); } -std::chrono::duration GetPerformanceTimer(TimerID timer){ +std::chrono::duration GetPerformanceTimer(TimerID timer) { return totalTimes[timer]; } @@ -16,6 +16,6 @@ void ResetPerformanceTimer(TimerID timer) { totalTimes[timer] = {}; } -void ResetPerformanceTimers(){ +void ResetPerformanceTimers() { totalTimes = {}; } \ No newline at end of file diff --git a/soh/soh/Enhancements/debugger/performanceTimer.h b/soh/soh/Enhancements/debugger/performanceTimer.h index b94ab5f6d..6bff229a3 100644 --- a/soh/soh/Enhancements/debugger/performanceTimer.h +++ b/soh/soh/Enhancements/debugger/performanceTimer.h @@ -5,28 +5,28 @@ #include typedef enum { - PT_WHOLE_SEED, - PT_LOGIC_RESET, - PT_REGION_RESET, - PT_SPOILER_LOG, - PT_ENTRANCE_SHUFFLE, - PT_SHOPSANITY, - PT_OWN_DUNGEON, - PT_LIMITED_CHECKS, - PT_ADVANCEMENT_ITEMS, - PT_REMAINING_ITEMS, - PT_PLAYTHROUGH_GENERATION, - PT_PARE_DOWN_PLAYTHROUGH, - PT_WOTH, - PT_FOOLISH, - PT_OVERRIDES, - PT_HINTS, - PT_EVENT_ACCESS, - PT_TOD_ACCESS, - PT_ENTRANCE_LOGIC, - PT_LOCATION_LOGIC, - PT_RECALCULATE_AVAILABLE_CHECKS, - PT_MAX + PT_WHOLE_SEED, + PT_LOGIC_RESET, + PT_REGION_RESET, + PT_SPOILER_LOG, + PT_ENTRANCE_SHUFFLE, + PT_SHOPSANITY, + PT_OWN_DUNGEON, + PT_LIMITED_CHECKS, + PT_ADVANCEMENT_ITEMS, + PT_REMAINING_ITEMS, + PT_PLAYTHROUGH_GENERATION, + PT_PARE_DOWN_PLAYTHROUGH, + PT_WOTH, + PT_FOOLISH, + PT_OVERRIDES, + PT_HINTS, + PT_EVENT_ACCESS, + PT_TOD_ACCESS, + PT_ENTRANCE_LOGIC, + PT_LOCATION_LOGIC, + PT_RECALCULATE_AVAILABLE_CHECKS, + PT_MAX } TimerID; void StartPerformanceTimer(TimerID timer); @@ -36,4 +36,3 @@ void ResetPerformanceTimer(TimerID timer); void ResetPerformanceTimers(); static std::array, PT_MAX> totalTimes = {}; static std::array timeStarted = {}; - diff --git a/soh/soh/Enhancements/debugger/valueViewer.cpp b/soh/soh/Enhancements/debugger/valueViewer.cpp index c0ac04739..1ea117444 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.cpp +++ b/soh/soh/Enhancements/debugger/valueViewer.cpp @@ -77,27 +77,35 @@ std::vector valueTable = { extern "C" void ValueViewer_Draw(GfxPrint* printer) { for (int i = 0; i < valueTable.size(); i++) { ValueTableElement& element = valueTable[i]; - if (!element.isActive || !element.isPrinted || (gPlayState == NULL && element.requiresPlayState)) continue; - GfxPrint_SetColor(printer, element.color.x * 255, element.color.y * 255, element.color.z * 255, element.color.w * 255); + if (!element.isActive || !element.isPrinted || (gPlayState == NULL && element.requiresPlayState)) + continue; + GfxPrint_SetColor(printer, element.color.x * 255, element.color.y * 255, element.color.z * 255, + element.color.w * 255); GfxPrint_SetPos(printer, element.x, element.y); switch (element.type) { case TYPE_S8: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s8*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), + *(s8*)element.valueFn()); break; case TYPE_U8: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u8*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), + *(u8*)element.valueFn()); break; case TYPE_S16: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s16*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), + *(s16*)element.valueFn()); break; case TYPE_U16: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u16*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), + *(u16*)element.valueFn()); break; case TYPE_S32: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), *(s32*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%d"), element.prefix.c_str(), + *(s32*)element.valueFn()); break; case TYPE_U32: - GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), *(u32*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s0x%x" : "%s%u"), element.prefix.c_str(), + *(u32*)element.valueFn()); break; case TYPE_CHAR: GfxPrint_Printf(printer, "%s%c", element.prefix.c_str(), *(char*)element.valueFn()); @@ -106,7 +114,8 @@ extern "C" void ValueViewer_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "%s%s", element.prefix.c_str(), (char*)element.valueFn()); break; case TYPE_FLOAT: - GfxPrint_Printf(printer, (element.typeFormat ? "%s%4.1f" : "%s%f"), element.prefix.c_str(), *(float*)element.valueFn()); + GfxPrint_Printf(printer, (element.typeFormat ? "%s%4.1f" : "%s%f"), element.prefix.c_str(), + *(float*)element.valueFn()); break; } } @@ -149,17 +158,16 @@ void ValueViewerWindow::DrawElement() { ImGui::BeginGroup(); static int selectedElement = -1; - std::string selectedElementText = (selectedElement == -1) ? "Select a value" : ( - std::string(valueTable[selectedElement].name) + " (" + std::string(valueTable[selectedElement].path) + ")" - ); + std::string selectedElementText = (selectedElement == -1) ? "Select a value" + : (std::string(valueTable[selectedElement].name) + " (" + + std::string(valueTable[selectedElement].path) + ")"); UIWidgets::PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("##valueViewerElement", selectedElementText.c_str())) { for (int i = 0; i < valueTable.size(); i++) { - if (valueTable[i].isActive) continue; + if (valueTable[i].isActive) + continue; bool isSelected = (selectedElement == i); - std::string elementText = ( - std::string(valueTable[i].name) + " (" + std::string(valueTable[i].path) + ")" - ); + std::string elementText = (std::string(valueTable[i].name) + " (" + std::string(valueTable[i].path) + ")"); if (ImGui::Selectable(elementText.c_str(), isSelected)) { selectedElement = i; } @@ -181,7 +189,8 @@ void ValueViewerWindow::DrawElement() { for (int i = 0; i < valueTable.size(); i++) { ValueTableElement& element = valueTable[i]; - if (!element.isActive || (gPlayState == NULL && element.requiresPlayState)) continue; + if (!element.isActive || (gPlayState == NULL && element.requiresPlayState)) + continue; UIWidgets::PushStyleButton(THEME_COLOR); UIWidgets::PushStyleCheckbox(THEME_COLOR); ImGui::AlignTextToFramePadding(); @@ -249,7 +258,8 @@ void ValueViewerWindow::DrawElement() { } UIWidgets::PopStyleInput(); ImGui::SameLine(); - ImGui::ColorEdit3(("##color" + std::string(element.name)).c_str(), (float*)&element.color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); + ImGui::ColorEdit3(("##color" + std::string(element.name)).c_str(), (float*)&element.color, + ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel); ImGui::SameLine(); UIWidgets::PushStyleCheckbox(THEME_COLOR); if (ImGui::Button(("Position##" + std::string(element.name)).c_str())) { diff --git a/soh/soh/Enhancements/debugger/valueViewer.h b/soh/soh/Enhancements/debugger/valueViewer.h index e93491fa5..c5e51a126 100644 --- a/soh/soh/Enhancements/debugger/valueViewer.h +++ b/soh/soh/Enhancements/debugger/valueViewer.h @@ -39,7 +39,7 @@ class ValueViewerWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; #endif diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 42bd8d042..611131584 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -42,18 +42,54 @@ const char* enemyCVarList[] = { }; const char* enemyNameList[] = { - "Armos", "Arwing", "Baby Dodongo", "Bari", - "Beamos", "Big Skulltula", "Stalchild (Big)", "Biri", - "Iron Knuckle (Black)", "Blue Tektite", "Bubble", "Club Moblin", - "Dark Link", "Dinolfos", "Dodongo", "Fire Keese", - "Floor Tile", "Floormaster", "Flying Peahat", "Flying Pot", - "Freezard", "Gibdo", "Gohma Larva", "Guay", - "Ice Keese", "Invisible Skulltula", "Keese", "Large Deku Baba", - "Like-Like", "Lizalfos", "Mad Scrub", "Wolfos (Normal)", - "Peahat Larva", "Redead", "Red Tektite", "Shabom", - "Shell Blade", "Skulltula", "Small Deku Baba", "Stalchild (Small)", - "Spike", "Stalfos", "Stinger", "Tailpasaran", - "Torch Slug", "Wallmaster", "Iron Knuckle (White)", "Wolfos (White)", + "Armos", + "Arwing", + "Baby Dodongo", + "Bari", + "Beamos", + "Big Skulltula", + "Stalchild (Big)", + "Biri", + "Iron Knuckle (Black)", + "Blue Tektite", + "Bubble", + "Club Moblin", + "Dark Link", + "Dinolfos", + "Dodongo", + "Fire Keese", + "Floor Tile", + "Floormaster", + "Flying Peahat", + "Flying Pot", + "Freezard", + "Gibdo", + "Gohma Larva", + "Guay", + "Ice Keese", + "Invisible Skulltula", + "Keese", + "Large Deku Baba", + "Like-Like", + "Lizalfos", + "Mad Scrub", + "Wolfos (Normal)", + "Peahat Larva", + "Redead", + "Red Tektite", + "Shabom", + "Shell Blade", + "Skulltula", + "Small Deku Baba", + "Stalchild (Small)", + "Spike", + "Stalfos", + "Stinger", + "Tailpasaran", + "Torch Slug", + "Wallmaster", + "Iron Knuckle (White)", + "Wolfos (White)", "Withered Deku Baba", }; @@ -111,43 +147,45 @@ static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = // Doesn't work {ACTOR_EN_POH, 0}, // Poe (Seems to rely on other objects?) // Doesn't work {ACTOR_EN_POH, 2}, // Poe (composer Sharp) (Seems to rely on other objects?) // Doesn't work {ACTOR_EN_POH, 3}, // Poe (composer Flat) (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_OKUTA, 0}, // Octorok (actor directly uses water box collision to handle hiding/popping up) - // Doesn't work {ACTOR_EN_REEBA, 0}, // Leever (reliant on surface and also normally used in tandem with a leever spawner, kills itself too quickly otherwise) - // Kinda doesn't work { ACTOR_EN_FD, 0 }, // Flare Dancer (jumps out of bounds a lot, and possible cause of crashes because of spawning a ton of flame actors) + // Doesn't work {ACTOR_EN_OKUTA, 0}, // Octorok (actor directly uses water box collision to handle hiding/popping + // up) Doesn't work {ACTOR_EN_REEBA, 0}, // Leever (reliant on surface and also normally used in tandem with a + // leever spawner, kills itself too quickly otherwise) Kinda doesn't work { ACTOR_EN_FD, 0 }, // Flare Dancer (jumps + // out of bounds a lot, and possible cause of crashes because of spawning a ton of flame actors) }; static int enemiesToRandomize[] = { - ACTOR_EN_FIREFLY, // Keese (including fire/ice) - ACTOR_EN_TEST, // Stalfos - ACTOR_EN_TITE, // Tektite - ACTOR_EN_POH, // Poe (normal, blue rupee, composers) - ACTOR_EN_OKUTA, // Octorok - ACTOR_EN_WALLMAS, // Wallmaster - ACTOR_EN_DODONGO, // Dodongo + ACTOR_EN_FIREFLY, // Keese (including fire/ice) + ACTOR_EN_TEST, // Stalfos + ACTOR_EN_TITE, // Tektite + ACTOR_EN_POH, // Poe (normal, blue rupee, composers) + ACTOR_EN_OKUTA, // Octorok + ACTOR_EN_WALLMAS, // Wallmaster + ACTOR_EN_DODONGO, // Dodongo // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_e_encount1.c) - ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva - ACTOR_EN_ZF, // Lizalfos, Dinolfos - ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) - ACTOR_EN_BUBBLE, // Shabom (bubble) - ACTOR_EN_DODOJR, // Baby Dodongo - ACTOR_EN_TORCH2, // Dark Link - ACTOR_EN_BILI, // Biri (small jellyfish) - ACTOR_EN_TP, // Electric Tailpasaran - ACTOR_EN_ST, // Skulltula (normal, big, invisible) - ACTOR_EN_BW, // Torch Slug - ACTOR_EN_EIYER, // Stinger (land) - ACTOR_EN_MB, // Moblins (Club, spear) - ACTOR_EN_DEKUBABA, // Deku Baba (small, large) - ACTOR_EN_AM, // Armos (enemy variant) - ACTOR_EN_DEKUNUTS, // Mad Scrub (single attack, triple attack) - ACTOR_EN_VALI, // Bari (big jellyfish) (spawns very high up) - ACTOR_EN_BB, // Bubble (flying skull enemy) (all colors) - ACTOR_EN_YUKABYUN, // Flying Floor Tile - ACTOR_EN_VM, // Beamos - ACTOR_EN_FLOORMAS, // Floormaster - ACTOR_EN_RD, // Redead, Gibdo - ACTOR_EN_SW, // Skullwalltula - // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations means it at least shows up in the game) + ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva + ACTOR_EN_ZF, // Lizalfos, Dinolfos + ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) + ACTOR_EN_BUBBLE, // Shabom (bubble) + ACTOR_EN_DODOJR, // Baby Dodongo + ACTOR_EN_TORCH2, // Dark Link + ACTOR_EN_BILI, // Biri (small jellyfish) + ACTOR_EN_TP, // Electric Tailpasaran + ACTOR_EN_ST, // Skulltula (normal, big, invisible) + ACTOR_EN_BW, // Torch Slug + ACTOR_EN_EIYER, // Stinger (land) + ACTOR_EN_MB, // Moblins (Club, spear) + ACTOR_EN_DEKUBABA, // Deku Baba (small, large) + ACTOR_EN_AM, // Armos (enemy variant) + ACTOR_EN_DEKUNUTS, // Mad Scrub (single attack, triple attack) + ACTOR_EN_VALI, // Bari (big jellyfish) (spawns very high up) + ACTOR_EN_BB, // Bubble (flying skull enemy) (all colors) + ACTOR_EN_YUKABYUN, // Flying Floor Tile + ACTOR_EN_VM, // Beamos + ACTOR_EN_FLOORMAS, // Floormaster + ACTOR_EN_RD, // Redead, Gibdo + ACTOR_EN_SW, // Skullwalltula + // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations + // means it at least shows up in the game) ACTOR_EN_SB, // Shell Blade ACTOR_EN_KAREBABA, // Withered Deku Baba ACTOR_EN_RR, // Like-Like @@ -162,8 +200,8 @@ static int enemiesToRandomize[] = { ACTOR_EN_CROW, // Guay }; -extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *posX, f32 *posY, f32 *posZ, int16_t *rotX, - int16_t *rotY, int16_t *rotZ, int16_t *params) { +extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, + int16_t* rotY, int16_t* rotZ, int16_t* params) { uint32_t isMQ = ResourceMgr_IsSceneMasterQuest(play->sceneNum); @@ -171,7 +209,8 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po // This should probably be handled on OTR generation in the future when object dependency is fully removed. // Remove bats and Skulltulas from graveyard. // Remove Octorok in Lost Woods. - if (((*actorId == ACTOR_EN_FIREFLY || (*actorId == ACTOR_EN_SW && *params == 0)) && play->sceneNum == SCENE_GRAVEYARD) || + if (((*actorId == ACTOR_EN_FIREFLY || (*actorId == ACTOR_EN_SW && *params == 0)) && + play->sceneNum == SCENE_GRAVEYARD) || (*actorId == ACTOR_EN_OKUTA && play->sceneNum == SCENE_LOST_WOODS)) { return 0; } @@ -229,7 +268,8 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *po } // Get randomized enemy ID and parameter. - uint32_t seed = play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params; + uint32_t seed = + play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params; EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed); int8_t timesRandomized = 1; @@ -305,7 +345,8 @@ 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()->GetSeed() : gSaveContext.ship.stats.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]; @@ -357,17 +398,19 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, // Don't randomize the Wolfos in SFM because it's needed to open the gate. case ACTOR_EN_WF: return (params != 7936); - // Don't randomize the Stalfos in Forest Temple because other enemies fall through the hole and don't trigger the platform. - // Don't randomize the Stalfos spawning on the boat in Shadow Temple, as randomizing them places the new enemies - // down in the river. + // Don't randomize the Stalfos in Forest Temple because other enemies fall through the hole and don't + // trigger the platform. Don't randomize the Stalfos spawning on the boat in Shadow Temple, as + // randomizing them places the new enemies down in the river. case ACTOR_EN_TEST: return (params != 1 && !(sceneNum == SCENE_SHADOW_TEMPLE && roomNum == 21)); // Only randomize the enemy variant of Armos Statue. - // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a button. + // Leave one Armos unrandomized in the Spirit Temple room where an armos is needed to push down a + // button. case ACTOR_EN_AM: return ((params == -1 || params == 255) && !(sceneNum == SCENE_SPIRIT_TEMPLE && posX == 2141)); - // Don't randomize Shell Blades and Spikes in the underwater portion in Water Temple as it's impossible to kill - // most other enemies underwater with just hookshot and they're required to be killed for a grate to open. + // Don't randomize Shell Blades and Spikes in the underwater portion in Water Temple as it's impossible + // to kill most other enemies underwater with just hookshot and they're required to be killed for a + // grate to open. case ACTOR_EN_SB: case ACTOR_EN_NY: return (!(!isMQ && sceneNum == SCENE_WATER_TEMPLE && roomNum == 2)); @@ -403,7 +446,8 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { // Deku Tree case SCENE_DEKU_TREE: return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 9)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 4 || roomNum == 6 || roomNum == 9 || roomNum == 10))); + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 4 || roomNum == 6 || roomNum == 9 || roomNum == 10))); // Dodongo's Cavern case SCENE_DODONGOS_CAVERN: return (!(!isMQ && enemiesToExcludeClearRooms && roomNum == 15) && @@ -415,8 +459,10 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { !(isMQ && enemiesToExcludeClearRooms && (roomNum == 11 || roomNum == 14))); // Forest Temple case SCENE_FOREST_TEMPLE: - return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 6 || roomNum == 10 || roomNum == 18 || roomNum == 21)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 5 || roomNum == 6 || roomNum == 18 || roomNum == 21))); + return (!(!isMQ && enemiesToExcludeClearRooms && + (roomNum == 6 || roomNum == 10 || roomNum == 18 || roomNum == 21)) && + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 5 || roomNum == 6 || roomNum == 18 || roomNum == 21))); // Fire Temple case SCENE_FIRE_TEMPLE: return (!(!isMQ && enemiesToExcludeClearRooms && roomNum == 15) && @@ -427,23 +473,31 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { !(isMQ && enemiesToExcludeClearRooms && (roomNum == 13 || roomNum == 18))); // Spirit Temple case SCENE_SPIRIT_TEMPLE: - return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 10 || roomNum == 17 || roomNum == 20)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 2 || roomNum == 4 || roomNum == 10 || roomNum == 15 || roomNum == 19 || roomNum == 20))); + return (!(!isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 10 || roomNum == 17 || roomNum == 20)) && + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 2 || roomNum == 4 || roomNum == 10 || roomNum == 15 || + roomNum == 19 || roomNum == 20))); // Shadow Temple case SCENE_SHADOW_TEMPLE: - return (!(!isMQ && enemiesToExcludeClearRooms && - (roomNum == 1 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 16 || roomNum == 17 || roomNum == 19 || roomNum == 20)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 6 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 20))); + return ( + !(!isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 16 || roomNum == 17 || + roomNum == 19 || roomNum == 20)) && + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 1 || roomNum == 6 || roomNum == 7 || roomNum == 11 || roomNum == 14 || roomNum == 20))); // Ganon's Castle Trials case SCENE_INSIDE_GANONS_CASTLE: return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 2 || roomNum == 5 || roomNum == 9)) && - !(isMQ && enemiesToExcludeClearRooms && (roomNum == 0 || roomNum == 2 || roomNum == 5 || roomNum == 9))); + !(isMQ && enemiesToExcludeClearRooms && + (roomNum == 0 || roomNum == 2 || roomNum == 5 || roomNum == 9))); // Ice Caverns case SCENE_ICE_CAVERN: return (!(!isMQ && enemiesToExcludeClearRooms && (roomNum == 1 || roomNum == 7)) && !(isMQ && enemiesToExcludeClearRooms && (roomNum == 3 || roomNum == 7))); // Bottom of the Well - // Exclude Dark Link from room with holes in the floor because it can pull you in a like-like making the player fall down. + // Exclude Dark Link from room with holes in the floor because it can pull you in a like-like making the player + // fall down. case SCENE_BOTTOM_OF_THE_WELL: return (!(!isMQ && enemy.id == ACTOR_EN_TORCH2 && roomNum == 3)); // Don't allow Dark Link in areas with lava void out zones as it voids out the player as well. @@ -452,18 +506,21 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { return (!(enemy.id == ACTOR_EN_TORCH2 && roomNum == 6) && !(!isMQ && enemiesToExcludeTimedRooms && (roomNum == 1 || roomNum == 7)) && !(!isMQ && enemiesToExcludeClearRooms && (roomNum == 3 || roomNum == 5 || roomNum == 10)) && - !(isMQ && enemiesToExcludeTimedRooms && (roomNum == 1 || roomNum == 3 || roomNum == 5 || roomNum == 7)) && + !(isMQ && enemiesToExcludeTimedRooms && + (roomNum == 1 || roomNum == 3 || roomNum == 5 || roomNum == 7)) && !(isMQ && enemiesToExcludeClearRooms && roomNum == 10)); // Don't allow certain enemies in Ganon's Tower because they would spawn up on the ceiling, // becoming impossible to kill. // Ganon's Tower. case SCENE_GANONS_TOWER: - return (!(enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI || (enemy.id == ACTOR_EN_ZF && enemy.params == -1))); + return (!(enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI || + (enemy.id == ACTOR_EN_ZF && enemy.params == -1))); // Ganon's Tower Escape. case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: return (!((enemiesToExcludeTimedRooms || (enemy.id == ACTOR_EN_ZF && enemy.params == -1)) && roomNum == 1)); - // Don't allow big Stalchildren, big Peahats and the large Bari (jellyfish) during the Gohma fight because they can clip into Gohma - // and it crashes the game. Likely because Gohma on the ceiling can't handle collision with other enemies. + // Don't allow big Stalchildren, big Peahats and the large Bari (jellyfish) during the Gohma fight because they + // can clip into Gohma and it crashes the game. Likely because Gohma on the ceiling can't handle collision with + // other enemies. case SCENE_DEKU_TREE_BOSS: return (!enemiesToExcludeTimedRooms && !(enemy.id == ACTOR_EN_SKB && enemy.params == 20) && !(enemy.id == ACTOR_EN_PEEHAT && enemy.params == -1)); diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h index f819de9bf..4c4fd5576 100644 --- a/soh/soh/Enhancements/enemyrandomizer.h +++ b/soh/soh/Enhancements/enemyrandomizer.h @@ -18,5 +18,6 @@ extern const char* enemyNameList[]; extern void GetSelectedEnemies(); #ifndef __cplusplus -uint8_t GetRandomizedEnemy(PlayState* play, int16_t *actorId, f32 *posX, f32 *posY, f32 *posZ, int16_t *rotX, int16_t *rotY, int16_t *rotZ, int16_t *params); +uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, + int16_t* rotY, int16_t* rotZ, int16_t* params); #endif diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp index 913496159..95455926b 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp @@ -47,621 +47,617 @@ GameInteractionEffectQueryResult RemovableGameInteractionEffect::Remove() { namespace GameInteractionEffect { - // MARK: - Flags - GameInteractionEffectQueryResult SetSceneFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } +// MARK: - Flags +GameInteractionEffectQueryResult SetSceneFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractionEffectQueryResult::Possible; +} + +void SetSceneFlag::_Apply() { + GameInteractor::RawAction::SetSceneFlag(parameters[0], parameters[1], parameters[2]); +} + +GameInteractionEffectQueryResult UnsetSceneFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void UnsetSceneFlag::_Apply() { + GameInteractor::RawAction::UnsetSceneFlag(parameters[0], parameters[1], parameters[2]); +} + +GameInteractionEffectQueryResult SetFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void SetFlag::_Apply() { + GameInteractor::RawAction::SetFlag(parameters[0], parameters[1]); +} + +GameInteractionEffectQueryResult UnsetFlag::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void UnsetFlag::_Apply() { + GameInteractor::RawAction::UnsetFlag(parameters[0], parameters[1]); +} + +// MARK: - ModifyHeartContainers +GameInteractionEffectQueryResult ModifyHeartContainers::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] > 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) > 0x140)) || + (parameters[0] < 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) < 0x10))) { + return GameInteractionEffectQueryResult::NotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} + +void ModifyHeartContainers::_Apply() { + GameInteractor::RawAction::AddOrRemoveHealthContainers(parameters[0]); +} + +// MARK: - FillMagic +GameInteractionEffectQueryResult FillMagic::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic >= ((gSaveContext.isDoubleMagicAcquired + 1) * 48)) { + return GameInteractionEffectQueryResult::NotPossible; + } else { return GameInteractionEffectQueryResult::Possible; } - - void SetSceneFlag::_Apply() { - GameInteractor::RawAction::SetSceneFlag(parameters[0], parameters[1], parameters[2]); - } - - GameInteractionEffectQueryResult UnsetSceneFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - - return GameInteractionEffectQueryResult::Possible; - } - - void UnsetSceneFlag::_Apply() { - GameInteractor::RawAction::UnsetSceneFlag(parameters[0], parameters[1], parameters[2]); - } - - GameInteractionEffectQueryResult SetFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - - return GameInteractionEffectQueryResult::Possible; - } - - void SetFlag::_Apply() { - GameInteractor::RawAction::SetFlag(parameters[0], parameters[1]); - } - - GameInteractionEffectQueryResult UnsetFlag::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - - return GameInteractionEffectQueryResult::Possible; - } - - void UnsetFlag::_Apply() { - GameInteractor::RawAction::UnsetFlag(parameters[0], parameters[1]); - } - - // MARK: - ModifyHeartContainers - GameInteractionEffectQueryResult ModifyHeartContainers::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ( - (parameters[0] > 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) > 0x140)) || - (parameters[0] < 0 && (gSaveContext.healthCapacity + (parameters[0] * 0x10) < 0x10)) - ) { - return GameInteractionEffectQueryResult::NotPossible; - } - - return GameInteractionEffectQueryResult::Possible; - } - - void ModifyHeartContainers::_Apply() { - GameInteractor::RawAction::AddOrRemoveHealthContainers(parameters[0]); - } - - // MARK: - FillMagic - GameInteractionEffectQueryResult FillMagic::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic >= ((gSaveContext.isDoubleMagicAcquired + 1) * 48)) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void FillMagic::_Apply() { - GameInteractor::RawAction::AddOrRemoveMagic(96); - } - - // MARK: - EmptyMagic - GameInteractionEffectQueryResult EmptyMagic::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic <= 0) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void EmptyMagic::_Apply() { - GameInteractor::RawAction::AddOrRemoveMagic(-96); - } - - // MARK: - ModifyRupees - GameInteractionEffectQueryResult ModifyRupees::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ( - (parameters[0] < 0 && gSaveContext.rupees <= 0) || - (parameters[0] > 0 && gSaveContext.rupees >= CUR_CAPACITY(UPG_WALLET)) - ) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyRupees::_Apply() { - Rupees_ChangeBy(parameters[0]); - } - - // MARK: - NoUI - GameInteractionEffectQueryResult NoUI::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void NoUI::_Apply() { - GameInteractor::State::NoUIActive = 1; - } - void NoUI::_Remove() { - GameInteractor::State::NoUIActive = 0; - } - - // MARK: - ModifyGravity - GameInteractionEffectQueryResult ModifyGravity::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyGravity::_Apply() { - GameInteractor::State::GravityLevel = (GIGravityLevel)parameters[0]; - } - void ModifyGravity::_Remove() { - GameInteractor::State::GravityLevel = GI_GRAVITY_LEVEL_NORMAL; - } - - // MARK: - ModifyHealth - GameInteractionEffectQueryResult ModifyHealth::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ( - (parameters[0] > 0 && gSaveContext.health == gSaveContext.healthCapacity) - || (parameters[0] < 0 && (gSaveContext.health + (16 * parameters[0]) <= 0)) - ) { - return GameInteractionEffectQueryResult::NotPossible; - } - - return GameInteractionEffectQueryResult::Possible; - } - void ModifyHealth::_Apply() { - GameInteractor::RawAction::HealOrDamagePlayer(parameters[0]); - } - - // MARK: - SetPlayerHealth - GameInteractionEffectQueryResult SetPlayerHealth::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetPlayerHealth::_Apply() { - GameInteractor::RawAction::SetPlayerHealth(parameters[0]); - } - - // MARK: - FreezePlayer - GameInteractionEffectQueryResult FreezePlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void FreezePlayer::_Apply() { - GameInteractor::RawAction::FreezePlayer(); - } - - // MARK: - BurnPlayer - GameInteractionEffectQueryResult BurnPlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void BurnPlayer::_Apply() { - GameInteractor::RawAction::BurnPlayer(); - } - - // MARK: - ElectrocutePlayer - GameInteractionEffectQueryResult ElectrocutePlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ElectrocutePlayer::_Apply() { - GameInteractor::RawAction::ElectrocutePlayer(); - } - - // MARK: - KnockbackPlayer - GameInteractionEffectQueryResult KnockbackPlayer::CanBeApplied() { - Player* player = GET_PLAYER(gPlayState); - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || player->stateFlags2 & PLAYER_STATE2_CRAWLING) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void KnockbackPlayer::_Apply() { - GameInteractor::RawAction::KnockbackPlayer(parameters[0]); - } - - // MARK: - ModifyLinkSize - GameInteractionEffectQueryResult ModifyLinkSize::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyLinkSize::_Apply() { - GameInteractor::State::LinkSize = (GILinkSize)parameters[0]; - } - void ModifyLinkSize::_Remove() { - GameInteractor::State::LinkSize = GI_LINK_SIZE_RESET; - } - - // MARK: - InvisibleLink - GameInteractionEffectQueryResult InvisibleLink::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void InvisibleLink::_Apply() { - GameInteractor::RawAction::SetLinkInvisibility(true); - } - void InvisibleLink::_Remove() { - GameInteractor::RawAction::SetLinkInvisibility(false); - } - - // MARK: - PacifistMode - GameInteractionEffectQueryResult PacifistMode::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PacifistMode::_Apply() { - GameInteractor::State::SetPacifistMode(true); - } - void PacifistMode::_Remove() { - GameInteractor::State::SetPacifistMode(false); - } - - // MARK: - DisableZTargeting - GameInteractionEffectQueryResult DisableZTargeting::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void DisableZTargeting::_Apply() { - GameInteractor::State::DisableZTargetingActive = 1; - } - void DisableZTargeting::_Remove() { - GameInteractor::State::DisableZTargetingActive = 0; - } - - // MARK: - WeatherRainstorm - GameInteractionEffectQueryResult WeatherRainstorm::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void WeatherRainstorm::_Apply() { - GameInteractor::RawAction::SetWeatherStorm(true); - } - void WeatherRainstorm::_Remove() { - GameInteractor::RawAction::SetWeatherStorm(false); - } - - // MARK: - ReverseControls - GameInteractionEffectQueryResult ReverseControls::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ReverseControls::_Apply() { - GameInteractor::State::ReverseControlsActive = 1; - } - void ReverseControls::_Remove() { - GameInteractor::State::ReverseControlsActive = 0; - } - - // MARK: - ForceEquipBoots - GameInteractionEffectQueryResult ForceEquipBoots::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ForceEquipBoots::_Apply() { - GameInteractor::RawAction::ForceEquipBoots(parameters[0]); - } - void ForceEquipBoots::_Remove() { - GameInteractor::RawAction::ForceEquipBoots(EQUIP_VALUE_BOOTS_KOKIRI); - } - - // MARK: - ModifyRunSpeedModifier - GameInteractionEffectQueryResult ModifyRunSpeedModifier::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyRunSpeedModifier::_Apply() { - GameInteractor::State::RunSpeedModifier = parameters[0]; - } - void ModifyRunSpeedModifier::_Remove() { - GameInteractor::State::RunSpeedModifier = 0; - } - - // MARK: - OneHitKO - GameInteractionEffectQueryResult OneHitKO::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void OneHitKO::_Apply() { - GameInteractor::State::OneHitKOActive = 1; - } - void OneHitKO::_Remove() { - GameInteractor::State::OneHitKOActive = 0; - } - - // MARK: - ModifyDefenseModifier - GameInteractionEffectQueryResult ModifyDefenseModifier::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ModifyDefenseModifier::_Apply() { - GameInteractor::State::DefenseModifier = parameters[0]; - } - void ModifyDefenseModifier::_Remove() { - GameInteractor::State::DefenseModifier = 0; - } - - // MARK: - GiveOrTakeShield - GameInteractionEffectQueryResult GiveOrTakeShield::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if ((parameters[0] > 0 && ((gBitFlags[parameters[0] - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & - gSaveContext.inventory.equipment)) || - (parameters[0] < 0 && !((gBitFlags[(parameters[0] * -1) - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & - gSaveContext.inventory.equipment))) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void GiveOrTakeShield::_Apply() { - GameInteractor::RawAction::GiveOrTakeShield(parameters[0]); - } - - // MARK: - TeleportPlayer - GameInteractionEffectQueryResult TeleportPlayer::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void TeleportPlayer::_Apply() { - GameInteractor::RawAction::TeleportPlayer(parameters[0]); - } - - // MARK: - ClearAssignedButtons - GameInteractionEffectQueryResult ClearAssignedButtons::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void ClearAssignedButtons::_Apply() { - GameInteractor::RawAction::ClearAssignedButtons(parameters[0]); - } - - // MARK: - SetTimeOfDay - GameInteractionEffectQueryResult SetTimeOfDay::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetTimeOfDay::_Apply() { - GameInteractor::RawAction::SetTimeOfDay(parameters[0]); - } - - // MARK: - SetCollisionViewer - GameInteractionEffectQueryResult SetCollisionViewer::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetCollisionViewer::_Apply() { - GameInteractor::RawAction::SetCollisionViewer(true); - } - void SetCollisionViewer::_Remove() { - GameInteractor::RawAction::SetCollisionViewer(false); - } - - // MARK: - SetCosmeticsColor - GameInteractionEffectQueryResult SetCosmeticsColor::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SetCosmeticsColor::_Apply() { - GameInteractor::RawAction::SetCosmeticsColor(parameters[0], parameters[1]); - } - - // MARK: - RandomizeCosmetics - GameInteractionEffectQueryResult RandomizeCosmetics::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomizeCosmetics::_Apply() { - GameInteractor::RawAction::RandomizeCosmeticsColors(true); - } - - // MARK: - PressButton - GameInteractionEffectQueryResult PressButton::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PressButton::_Apply() { - GameInteractor::RawAction::EmulateButtonPress(parameters[0]); - } - - // MARK: - PressRandomButton - GameInteractionEffectQueryResult PressRandomButton::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PressRandomButton::_Apply() { - GameInteractor::RawAction::EmulateRandomButtonPress(parameters[0]); - } - - // MARK: - AddOrTakeAmmo - GameInteractionEffectQueryResult AddOrTakeAmmo::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else if (!GameInteractor::CanAddOrTakeAmmo(parameters[0], parameters[1])) { - return GameInteractionEffectQueryResult::NotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void AddOrTakeAmmo::_Apply() { - GameInteractor::RawAction::AddOrTakeAmmo(parameters[0], parameters[1]); - } - - // MARK: - RandomBombFuseTimer - GameInteractionEffectQueryResult RandomBombFuseTimer::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomBombFuseTimer::_Apply() { - GameInteractor::State::RandomBombFuseTimerActive = 1; - } - void RandomBombFuseTimer::_Remove() { - GameInteractor::State::RandomBombFuseTimerActive = 0; - } - - // MARK: - DisableLedgeGrabs - GameInteractionEffectQueryResult DisableLedgeGrabs::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void DisableLedgeGrabs::_Apply() { - GameInteractor::State::DisableLedgeGrabsActive = 1; - } - void DisableLedgeGrabs::_Remove() { - GameInteractor::State::DisableLedgeGrabsActive = 0; - } - - // MARK: - RandomWind - GameInteractionEffectQueryResult RandomWind::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomWind::_Apply() { - GameInteractor::RawAction::SetRandomWind(true); - } - void RandomWind::_Remove() { - GameInteractor::RawAction::SetRandomWind(false); - } - - // MARK: - RandomBonks - GameInteractionEffectQueryResult RandomBonks::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void RandomBonks::_Apply() { - GameInteractor::State::RandomBonksActive = 1; - } - void RandomBonks::_Remove() { - GameInteractor::State::RandomBonksActive = 0; - } - - // MARK: - PlayerInvincibility - GameInteractionEffectQueryResult PlayerInvincibility::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void PlayerInvincibility::_Apply() { - GameInteractor::RawAction::SetPlayerInvincibility(true); - } - void PlayerInvincibility::_Remove() { - GameInteractor::RawAction::SetPlayerInvincibility(false); - } - - // MARK: - SlipperyFloor - GameInteractionEffectQueryResult SlipperyFloor::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } else { - return GameInteractionEffectQueryResult::Possible; - } - } - void SlipperyFloor::_Apply() { - GameInteractor::State::SlipperyFloorActive = 1; - } - void SlipperyFloor::_Remove() { - GameInteractor::State::SlipperyFloorActive = 0; - } - - // MARK: - SpawnEnemyWithOffset - GameInteractionEffectQueryResult SpawnEnemyWithOffset::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - return GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); - } - - void SpawnEnemyWithOffset::_Apply() { - GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); - } - - // MARK: - SpawnActor - GameInteractionEffectQueryResult SpawnActor::CanBeApplied() { - if (!GameInteractor::IsSaveLoaded()) { - return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } - return GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); - } - - void SpawnActor::_Apply() { - GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); - } } +void FillMagic::_Apply() { + GameInteractor::RawAction::AddOrRemoveMagic(96); +} + +// MARK: - EmptyMagic +GameInteractionEffectQueryResult EmptyMagic::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if (!gSaveContext.isMagicAcquired || gSaveContext.magic <= 0) { + return GameInteractionEffectQueryResult::NotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void EmptyMagic::_Apply() { + GameInteractor::RawAction::AddOrRemoveMagic(-96); +} + +// MARK: - ModifyRupees +GameInteractionEffectQueryResult ModifyRupees::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] < 0 && gSaveContext.rupees <= 0) || + (parameters[0] > 0 && gSaveContext.rupees >= CUR_CAPACITY(UPG_WALLET))) { + return GameInteractionEffectQueryResult::NotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ModifyRupees::_Apply() { + Rupees_ChangeBy(parameters[0]); +} + +// MARK: - NoUI +GameInteractionEffectQueryResult NoUI::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void NoUI::_Apply() { + GameInteractor::State::NoUIActive = 1; +} +void NoUI::_Remove() { + GameInteractor::State::NoUIActive = 0; +} + +// MARK: - ModifyGravity +GameInteractionEffectQueryResult ModifyGravity::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ModifyGravity::_Apply() { + GameInteractor::State::GravityLevel = (GIGravityLevel)parameters[0]; +} +void ModifyGravity::_Remove() { + GameInteractor::State::GravityLevel = GI_GRAVITY_LEVEL_NORMAL; +} + +// MARK: - ModifyHealth +GameInteractionEffectQueryResult ModifyHealth::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] > 0 && gSaveContext.health == gSaveContext.healthCapacity) || + (parameters[0] < 0 && (gSaveContext.health + (16 * parameters[0]) <= 0))) { + return GameInteractionEffectQueryResult::NotPossible; + } + + return GameInteractionEffectQueryResult::Possible; +} +void ModifyHealth::_Apply() { + GameInteractor::RawAction::HealOrDamagePlayer(parameters[0]); +} + +// MARK: - SetPlayerHealth +GameInteractionEffectQueryResult SetPlayerHealth::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SetPlayerHealth::_Apply() { + GameInteractor::RawAction::SetPlayerHealth(parameters[0]); +} + +// MARK: - FreezePlayer +GameInteractionEffectQueryResult FreezePlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void FreezePlayer::_Apply() { + GameInteractor::RawAction::FreezePlayer(); +} + +// MARK: - BurnPlayer +GameInteractionEffectQueryResult BurnPlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void BurnPlayer::_Apply() { + GameInteractor::RawAction::BurnPlayer(); +} + +// MARK: - ElectrocutePlayer +GameInteractionEffectQueryResult ElectrocutePlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || !PlayerGrounded(player)) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ElectrocutePlayer::_Apply() { + GameInteractor::RawAction::ElectrocutePlayer(); +} + +// MARK: - KnockbackPlayer +GameInteractionEffectQueryResult KnockbackPlayer::CanBeApplied() { + Player* player = GET_PLAYER(gPlayState); + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused() || + player->stateFlags2 & PLAYER_STATE2_CRAWLING) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void KnockbackPlayer::_Apply() { + GameInteractor::RawAction::KnockbackPlayer(parameters[0]); +} + +// MARK: - ModifyLinkSize +GameInteractionEffectQueryResult ModifyLinkSize::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ModifyLinkSize::_Apply() { + GameInteractor::State::LinkSize = (GILinkSize)parameters[0]; +} +void ModifyLinkSize::_Remove() { + GameInteractor::State::LinkSize = GI_LINK_SIZE_RESET; +} + +// MARK: - InvisibleLink +GameInteractionEffectQueryResult InvisibleLink::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void InvisibleLink::_Apply() { + GameInteractor::RawAction::SetLinkInvisibility(true); +} +void InvisibleLink::_Remove() { + GameInteractor::RawAction::SetLinkInvisibility(false); +} + +// MARK: - PacifistMode +GameInteractionEffectQueryResult PacifistMode::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PacifistMode::_Apply() { + GameInteractor::State::SetPacifistMode(true); +} +void PacifistMode::_Remove() { + GameInteractor::State::SetPacifistMode(false); +} + +// MARK: - DisableZTargeting +GameInteractionEffectQueryResult DisableZTargeting::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void DisableZTargeting::_Apply() { + GameInteractor::State::DisableZTargetingActive = 1; +} +void DisableZTargeting::_Remove() { + GameInteractor::State::DisableZTargetingActive = 0; +} + +// MARK: - WeatherRainstorm +GameInteractionEffectQueryResult WeatherRainstorm::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void WeatherRainstorm::_Apply() { + GameInteractor::RawAction::SetWeatherStorm(true); +} +void WeatherRainstorm::_Remove() { + GameInteractor::RawAction::SetWeatherStorm(false); +} + +// MARK: - ReverseControls +GameInteractionEffectQueryResult ReverseControls::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ReverseControls::_Apply() { + GameInteractor::State::ReverseControlsActive = 1; +} +void ReverseControls::_Remove() { + GameInteractor::State::ReverseControlsActive = 0; +} + +// MARK: - ForceEquipBoots +GameInteractionEffectQueryResult ForceEquipBoots::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ForceEquipBoots::_Apply() { + GameInteractor::RawAction::ForceEquipBoots(parameters[0]); +} +void ForceEquipBoots::_Remove() { + GameInteractor::RawAction::ForceEquipBoots(EQUIP_VALUE_BOOTS_KOKIRI); +} + +// MARK: - ModifyRunSpeedModifier +GameInteractionEffectQueryResult ModifyRunSpeedModifier::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ModifyRunSpeedModifier::_Apply() { + GameInteractor::State::RunSpeedModifier = parameters[0]; +} +void ModifyRunSpeedModifier::_Remove() { + GameInteractor::State::RunSpeedModifier = 0; +} + +// MARK: - OneHitKO +GameInteractionEffectQueryResult OneHitKO::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void OneHitKO::_Apply() { + GameInteractor::State::OneHitKOActive = 1; +} +void OneHitKO::_Remove() { + GameInteractor::State::OneHitKOActive = 0; +} + +// MARK: - ModifyDefenseModifier +GameInteractionEffectQueryResult ModifyDefenseModifier::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ModifyDefenseModifier::_Apply() { + GameInteractor::State::DefenseModifier = parameters[0]; +} +void ModifyDefenseModifier::_Remove() { + GameInteractor::State::DefenseModifier = 0; +} + +// MARK: - GiveOrTakeShield +GameInteractionEffectQueryResult GiveOrTakeShield::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if ((parameters[0] > 0 && ((gBitFlags[parameters[0] - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & + gSaveContext.inventory.equipment)) || + (parameters[0] < 0 && + !((gBitFlags[(parameters[0] * -1) - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) & + gSaveContext.inventory.equipment))) { + return GameInteractionEffectQueryResult::NotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void GiveOrTakeShield::_Apply() { + GameInteractor::RawAction::GiveOrTakeShield(parameters[0]); +} + +// MARK: - TeleportPlayer +GameInteractionEffectQueryResult TeleportPlayer::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void TeleportPlayer::_Apply() { + GameInteractor::RawAction::TeleportPlayer(parameters[0]); +} + +// MARK: - ClearAssignedButtons +GameInteractionEffectQueryResult ClearAssignedButtons::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void ClearAssignedButtons::_Apply() { + GameInteractor::RawAction::ClearAssignedButtons(parameters[0]); +} + +// MARK: - SetTimeOfDay +GameInteractionEffectQueryResult SetTimeOfDay::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SetTimeOfDay::_Apply() { + GameInteractor::RawAction::SetTimeOfDay(parameters[0]); +} + +// MARK: - SetCollisionViewer +GameInteractionEffectQueryResult SetCollisionViewer::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SetCollisionViewer::_Apply() { + GameInteractor::RawAction::SetCollisionViewer(true); +} +void SetCollisionViewer::_Remove() { + GameInteractor::RawAction::SetCollisionViewer(false); +} + +// MARK: - SetCosmeticsColor +GameInteractionEffectQueryResult SetCosmeticsColor::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SetCosmeticsColor::_Apply() { + GameInteractor::RawAction::SetCosmeticsColor(parameters[0], parameters[1]); +} + +// MARK: - RandomizeCosmetics +GameInteractionEffectQueryResult RandomizeCosmetics::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomizeCosmetics::_Apply() { + GameInteractor::RawAction::RandomizeCosmeticsColors(true); +} + +// MARK: - PressButton +GameInteractionEffectQueryResult PressButton::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PressButton::_Apply() { + GameInteractor::RawAction::EmulateButtonPress(parameters[0]); +} + +// MARK: - PressRandomButton +GameInteractionEffectQueryResult PressRandomButton::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PressRandomButton::_Apply() { + GameInteractor::RawAction::EmulateRandomButtonPress(parameters[0]); +} + +// MARK: - AddOrTakeAmmo +GameInteractionEffectQueryResult AddOrTakeAmmo::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else if (!GameInteractor::CanAddOrTakeAmmo(parameters[0], parameters[1])) { + return GameInteractionEffectQueryResult::NotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void AddOrTakeAmmo::_Apply() { + GameInteractor::RawAction::AddOrTakeAmmo(parameters[0], parameters[1]); +} + +// MARK: - RandomBombFuseTimer +GameInteractionEffectQueryResult RandomBombFuseTimer::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomBombFuseTimer::_Apply() { + GameInteractor::State::RandomBombFuseTimerActive = 1; +} +void RandomBombFuseTimer::_Remove() { + GameInteractor::State::RandomBombFuseTimerActive = 0; +} + +// MARK: - DisableLedgeGrabs +GameInteractionEffectQueryResult DisableLedgeGrabs::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void DisableLedgeGrabs::_Apply() { + GameInteractor::State::DisableLedgeGrabsActive = 1; +} +void DisableLedgeGrabs::_Remove() { + GameInteractor::State::DisableLedgeGrabsActive = 0; +} + +// MARK: - RandomWind +GameInteractionEffectQueryResult RandomWind::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomWind::_Apply() { + GameInteractor::RawAction::SetRandomWind(true); +} +void RandomWind::_Remove() { + GameInteractor::RawAction::SetRandomWind(false); +} + +// MARK: - RandomBonks +GameInteractionEffectQueryResult RandomBonks::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void RandomBonks::_Apply() { + GameInteractor::State::RandomBonksActive = 1; +} +void RandomBonks::_Remove() { + GameInteractor::State::RandomBonksActive = 0; +} + +// MARK: - PlayerInvincibility +GameInteractionEffectQueryResult PlayerInvincibility::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void PlayerInvincibility::_Apply() { + GameInteractor::RawAction::SetPlayerInvincibility(true); +} +void PlayerInvincibility::_Remove() { + GameInteractor::RawAction::SetPlayerInvincibility(false); +} + +// MARK: - SlipperyFloor +GameInteractionEffectQueryResult SlipperyFloor::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } else { + return GameInteractionEffectQueryResult::Possible; + } +} +void SlipperyFloor::_Apply() { + GameInteractor::State::SlipperyFloorActive = 1; +} +void SlipperyFloor::_Remove() { + GameInteractor::State::SlipperyFloorActive = 0; +} + +// MARK: - SpawnEnemyWithOffset +GameInteractionEffectQueryResult SpawnEnemyWithOffset::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); +} + +void SpawnEnemyWithOffset::_Apply() { + GameInteractor::RawAction::SpawnEnemyWithOffset(parameters[0], parameters[1]); +} + +// MARK: - SpawnActor +GameInteractionEffectQueryResult SpawnActor::CanBeApplied() { + if (!GameInteractor::IsSaveLoaded()) { + return GameInteractionEffectQueryResult::TemporarilyNotPossible; + } + return GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); +} + +void SpawnActor::_Apply() { + GameInteractor::RawAction::SpawnActor(parameters[0], parameters[1]); +} +} // namespace GameInteractionEffect diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h index 2a29022d5..72eb101b0 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.h @@ -6,271 +6,269 @@ #include #ifdef __cplusplus -enum GameInteractionEffectQueryResult { - Possible = 0x00, - TemporarilyNotPossible = 0x01, - NotPossible = 0xFF -}; +enum GameInteractionEffectQueryResult { Possible = 0x00, TemporarilyNotPossible = 0x01, NotPossible = 0xFF }; class GameInteractionEffectBase { -public: + public: virtual GameInteractionEffectQueryResult CanBeApplied() = 0; GameInteractionEffectQueryResult Apply(); -protected: + + protected: virtual void _Apply() = 0; }; -class RemovableGameInteractionEffect: public GameInteractionEffectBase { -public: +class RemovableGameInteractionEffect : public GameInteractionEffectBase { + public: virtual GameInteractionEffectQueryResult CanBeRemoved(); GameInteractionEffectQueryResult Remove(); -protected: - virtual void _Remove() {}; + + protected: + virtual void _Remove(){}; }; class ParameterizedGameInteractionEffect { -public: + public: int32_t parameters[3]; }; namespace GameInteractionEffect { - class SetSceneFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetSceneFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class UnsetSceneFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class UnsetSceneFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class UnsetFlag: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class UnsetFlag : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ModifyHeartContainers: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ModifyHeartContainers : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class FillMagic: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class FillMagic : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class EmptyMagic: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class EmptyMagic : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ModifyRupees: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ModifyRupees : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class NoUI: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class NoUI : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyGravity: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyGravity : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyHealth: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ModifyHealth : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetPlayerHealth: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetPlayerHealth : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class FreezePlayer: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class FreezePlayer : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class BurnPlayer: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class BurnPlayer : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ElectrocutePlayer: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ElectrocutePlayer : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class KnockbackPlayer: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class KnockbackPlayer : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ModifyLinkSize: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyLinkSize : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class InvisibleLink : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class InvisibleLink : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class PacifistMode : public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class PacifistMode : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class DisableZTargeting: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class DisableZTargeting : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class WeatherRainstorm: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class WeatherRainstorm : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ReverseControls: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ReverseControls : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ForceEquipBoots: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ForceEquipBoots : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyRunSpeedModifier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyRunSpeedModifier : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class OneHitKO : public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class OneHitKO : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class ModifyDefenseModifier: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class ModifyDefenseModifier : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class GiveOrTakeShield: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class GiveOrTakeShield : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class TeleportPlayer: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class TeleportPlayer : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class ClearAssignedButtons: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class ClearAssignedButtons : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetTimeOfDay: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetTimeOfDay : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class SetCollisionViewer: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class SetCollisionViewer : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class SetCosmeticsColor: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class SetCosmeticsColor : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class RandomizeCosmetics: public GameInteractionEffectBase { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class RandomizeCosmetics : public GameInteractionEffectBase { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class PressButton: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class PressButton : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class PressRandomButton: public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class PressRandomButton : public RemovableGameInteractionEffect, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class AddOrTakeAmmo: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; +class AddOrTakeAmmo : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; - class RandomBombFuseTimer: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class RandomBombFuseTimer : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class DisableLedgeGrabs: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class DisableLedgeGrabs : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class RandomWind: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class RandomWind : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class RandomBonks: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class RandomBonks : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class PlayerInvincibility: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; +class PlayerInvincibility : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; - class SlipperyFloor: public RemovableGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - void _Remove() override; - }; - class SpawnEnemyWithOffset: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; - class SpawnActor: public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { - GameInteractionEffectQueryResult CanBeApplied() override; - void _Apply() override; - }; -} +class SlipperyFloor : public RemovableGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; + void _Remove() override; +}; +class SpawnEnemyWithOffset : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; +class SpawnActor : public GameInteractionEffectBase, public ParameterizedGameInteractionEffect { + GameInteractionEffectQueryResult CanBeApplied() override; + void _Apply() override; +}; +} // namespace GameInteractionEffect #endif /* __cplusplus */ #endif /* GameInteractionEffect_h */ diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp index dbb4782fd..fb3db74df 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.cpp @@ -1,4 +1,4 @@ -/* +/* GameInteractor is meant to be used for interacting with the game (yup...). It exposes functions that directly modify, add or remove game related elements. @@ -54,7 +54,10 @@ bool GameInteractor::IsSaveLoaded(bool allowDbgSave) { bool GameInteractor::IsGameplayPaused() { Player* player = GET_PLAYER(gPlayState); - return (Player_InBlockingCsMode(gPlayState, player) || gPlayState->pauseCtx.state != 0 || gPlayState->msgCtx.msgMode != 0) ? true : false; + return (Player_InBlockingCsMode(gPlayState, player) || gPlayState->pauseCtx.state != 0 || + gPlayState->msgCtx.msgMode != 0) + ? true + : false; } bool GameInteractor::CanSpawnActor() { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 59d511941..44d0e643a 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -34,9 +34,9 @@ DEFINE_HOOK(OnPlayerBonk, ()); DEFINE_HOOK(OnPlayerHealthChange, (int16_t amount)); DEFINE_HOOK(OnPlayerBottleUpdate, (int16_t contents)); DEFINE_HOOK(OnPlayerHoldUpShield, ()); -DEFINE_HOOK(OnPlayerFirstPersonControl, (Player* player)); +DEFINE_HOOK(OnPlayerFirstPersonControl, (Player * player)); DEFINE_HOOK(OnPlayerProcessStick, ()); -DEFINE_HOOK(OnPlayerShieldControl, (float_t* sp50, float_t* sp54)); +DEFINE_HOOK(OnPlayerShieldControl, (float_t * sp50, float_t* sp54)); DEFINE_HOOK(OnPlayDestroy, ()); DEFINE_HOOK(OnPlayDrawEnd, ()); DEFINE_HOOK(OnVanillaBehavior, (GIVanillaBehavior flag, bool* result, va_list originalArgs)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 40c47e9a9..9231da843 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -126,7 +126,7 @@ void GameInteractor_ExecuteOnBossDefeat(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } -void GameInteractor_ExecuteOnTimestamp (u8 item) { +void GameInteractor_ExecuteOnTimestamp(u8 item) { GameInteractor::Instance->ExecuteHooks(item); } @@ -266,7 +266,8 @@ void GameInteractor_ExecuteOnUpdateFileQuestSelection(uint8_t questIndex) { } void GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(uint8_t optionIndex, uint8_t optionValue) { - GameInteractor::Instance->ExecuteHooks(optionIndex, optionValue); + GameInteractor::Instance->ExecuteHooks(optionIndex, + optionValue); } void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode) { @@ -285,7 +286,7 @@ void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)) { GameInteractor::Instance->RegisterGameHook(fn); } -//MARK: Pause Menu +// MARK: Pause Menu void GameInteractor_ExecuteOnKaleidoUpdate() { GameInteractor::Instance->ExecuteHooks(); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 10ab3a877..33c8d2681 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -31,7 +31,7 @@ void GameInteractor_ExecuteOnActorUpdate(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); void GameInteractor_ExecuteOnEnemyDefeat(void* actor); void GameInteractor_ExecuteOnBossDefeat(void* actor); -void GameInteractor_ExecuteOnTimestamp (u8 item); +void GameInteractor_ExecuteOnTimestamp(u8 item); void GameInteractor_ExecuteOnPlayerBonk(); void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount); void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents); @@ -76,7 +76,7 @@ void GameInteractor_ExecuteOnSetGameLanguage(); // MARK: - System void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void)); -//Mark: - Pause Menu +// Mark: - Pause Menu void GameInteractor_ExecuteOnKaleidoUpdate(); #ifdef __cplusplus diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp index 1db2f1e33..ac99859b5 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_RawAction.cpp @@ -143,11 +143,13 @@ void GameInteractor::RawAction::SetSceneFlag(int16_t sceneNum, int16_t flagType, } break; case FlagType::FLAG_SCENE_CLEAR: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.clear |= (1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.clear |= (1 << flag); gSaveContext.sceneFlags[sceneNum].clear |= (1 << flag); break; case FlagType::FLAG_SCENE_TREASURE: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.chest |= (1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.chest |= (1 << flag); gSaveContext.sceneFlags[sceneNum].chest |= (1 << flag); break; case FlagType::FLAG_SCENE_COLLECTIBLE: @@ -182,11 +184,13 @@ void GameInteractor::RawAction::UnsetSceneFlag(int16_t sceneNum, int16_t flagTyp } break; case FlagType::FLAG_SCENE_CLEAR: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.clear &= ~(1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.clear &= ~(1 << flag); gSaveContext.sceneFlags[sceneNum].clear &= ~(1 << flag); break; case FlagType::FLAG_SCENE_TREASURE: - if (sceneNum == gPlayState->sceneNum) gPlayState->actorCtx.flags.chest &= ~(1 << flag); + if (sceneNum == gPlayState->sceneNum) + gPlayState->actorCtx.flags.chest &= ~(1 << flag); gSaveContext.sceneFlags[sceneNum].chest &= ~(1 << flag); break; case FlagType::FLAG_SCENE_COLLECTIBLE: @@ -337,7 +341,7 @@ void GameInteractor::RawAction::UpdateActor(void* refActor) { // Update actor again outside of their normal update cycle. Actor* actor = static_cast(refActor); - + // Sometimes the actor is destroyed in the previous Update, so check if the update function still exists. if (actor->update != NULL) { // Fix for enemies sometimes taking a "fake" hit, where their invincibility timer is @@ -355,7 +359,8 @@ void GameInteractor::RawAction::UpdateActor(void* refActor) { } void GameInteractor::RawAction::TeleportPlayer(int32_t nextEntrance) { - Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); gPlayState->nextEntranceIndex = nextEntrance; gPlayState->transitionTrigger = TRANS_TRIGGER_START; gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; @@ -386,7 +391,7 @@ void GameInteractor::RawAction::SetTimeOfDay(uint32_t time) { void GameInteractor::RawAction::SetCollisionViewer(bool active) { CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Enabled"), active); CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Decal"), active); - + if (active) { CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.Scene"), COLVIEW_TRANSPARENT); CVarSetInteger(CVAR_DEVELOPER_TOOLS("ColViewer.BGActors"), COLVIEW_TRANSPARENT); @@ -406,8 +411,8 @@ void GameInteractor::RawAction::SetCosmeticsColor(uint8_t cosmeticCategory, uint newColor.g = 255; newColor.b = 255; newColor.a = 255; - - switch (colorValue) { + + switch (colorValue) { case GI_COLOR_RED: newColor.r = 200; newColor.g = 30; @@ -457,7 +462,7 @@ void GameInteractor::RawAction::SetCosmeticsColor(uint8_t cosmeticCategory, uint break; } - switch (cosmeticCategory) { + switch (cosmeticCategory) { case GI_COSMETICS_TUNICS: CVarSetColor(CVAR_COSMETIC("Link.KokiriTunic.Value"), newColor); CVarSetInteger(CVAR_COSMETIC("Link.KokiriTunic.Changed"), 1); @@ -495,19 +500,13 @@ void GameInteractor::RawAction::SetCosmeticsColor(uint8_t cosmeticCategory, uint } void GameInteractor::RawAction::RandomizeCosmeticsColors(bool excludeBiddingWarColors) { - const char* cvarsToLock[12] = { - CVAR_COSMETIC("Link.KokiriTunic.Locked"), - CVAR_COSMETIC("Link.GoronTunic.Locked"), - CVAR_COSMETIC("Link.ZoraTunic.Locked"), - CVAR_COSMETIC("Navi.EnemyPrimary.Locked"), - CVAR_COSMETIC("Navi.EnemySecondary.Locked"), - CVAR_COSMETIC("Navi.IdlePrimary.Locked"), - CVAR_COSMETIC("Navi.IdleSecondary.Locked"), - CVAR_COSMETIC("Navi.NPCPrimary.Locked"), - CVAR_COSMETIC("Navi.NPCSecondary.Locked"), - CVAR_COSMETIC("Navi.PropsPrimary.Locked"), - CVAR_COSMETIC("Navi.PropsSecondary.Locked"), - CVAR_COSMETIC("Link.Hair.Locked") + const char* cvarsToLock[12] = { + CVAR_COSMETIC("Link.KokiriTunic.Locked"), CVAR_COSMETIC("Link.GoronTunic.Locked"), + CVAR_COSMETIC("Link.ZoraTunic.Locked"), CVAR_COSMETIC("Navi.EnemyPrimary.Locked"), + CVAR_COSMETIC("Navi.EnemySecondary.Locked"), CVAR_COSMETIC("Navi.IdlePrimary.Locked"), + CVAR_COSMETIC("Navi.IdleSecondary.Locked"), CVAR_COSMETIC("Navi.NPCPrimary.Locked"), + CVAR_COSMETIC("Navi.NPCSecondary.Locked"), CVAR_COSMETIC("Navi.PropsPrimary.Locked"), + CVAR_COSMETIC("Navi.PropsSecondary.Locked"), CVAR_COSMETIC("Link.Hair.Locked") }; if (excludeBiddingWarColors) { @@ -533,7 +532,7 @@ void GameInteractor::RawAction::EmulateRandomButtonPress(uint32_t chancePercenta uint32_t emulatedButton; uint32_t randomNumber = rand(); uint32_t possibleButtons[14] = { BTN_CRIGHT, BTN_CLEFT, BTN_CDOWN, BTN_CUP, BTN_R, BTN_L, BTN_DRIGHT, - BTN_DLEFT, BTN_DDOWN, BTN_DUP, BTN_START, BTN_Z, BTN_B, BTN_A }; + BTN_DLEFT, BTN_DDOWN, BTN_DUP, BTN_START, BTN_Z, BTN_B, BTN_A }; emulatedButton = possibleButtons[randomNumber % 14]; @@ -575,12 +574,14 @@ void GameInteractor::RawAction::SetPlayerInvincibility(bool active) { /// Clears the cutscene pointer to a value safe for wrong warps. void GameInteractor::RawAction::ClearCutscenePointer() { - if (!gPlayState) return; - static uint32_t null_cs[] = {0, 0}; + if (!gPlayState) + return; + static uint32_t null_cs[] = { 0, 0 }; gPlayState->csCtx.segment = &null_cs; } -GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnEnemyWithOffset(uint32_t enemyId, int32_t enemyParams) { +GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnEnemyWithOffset(uint32_t enemyId, + int32_t enemyParams) { if (!GameInteractor::CanSpawnActor()) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; @@ -608,8 +609,9 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnEnemyWithOffset // Don't allow Arwings in certain areas because they cause issues. // Locations: King dodongo room, Morpha room, Twinrova room, Ganondorf room, Fishing pond, Ganon's room // TODO: Swap this to disabling the option in CC options menu instead. - if (sceneNum == SCENE_DODONGOS_CAVERN_BOSS || sceneNum == SCENE_WATER_TEMPLE_BOSS || sceneNum == SCENE_SPIRIT_TEMPLE_BOSS || - sceneNum == SCENE_GANONDORF_BOSS || sceneNum == SCENE_FISHING_POND || sceneNum == SCENE_GANON_BOSS) { + if (sceneNum == SCENE_DODONGOS_CAVERN_BOSS || sceneNum == SCENE_WATER_TEMPLE_BOSS || + sceneNum == SCENE_SPIRIT_TEMPLE_BOSS || sceneNum == SCENE_GANONDORF_BOSS || + sceneNum == SCENE_FISHING_POND || sceneNum == SCENE_GANON_BOSS) { return GameInteractionEffectQueryResult::NotPossible; } } @@ -649,13 +651,15 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnEnemyWithOffset pos.x += 10; pos.y += 10; pos.z += 10; - if (Actor_Spawn(&gPlayState->actorCtx, gPlayState, enemyId, pos.x, pos.y, pos.z, 0, 0, 0, enemyParams, 0) == NULL) { + if (Actor_Spawn(&gPlayState->actorCtx, gPlayState, enemyId, pos.x, pos.y, pos.z, 0, 0, 0, enemyParams, 0) == + NULL) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; } } return GameInteractionEffectQueryResult::Possible; } else { - if (Actor_Spawn(&gPlayState->actorCtx, gPlayState, enemyId, pos.x, pos.y, pos.z, 0, 0, 0, enemyParams, 0) != NULL) { + if (Actor_Spawn(&gPlayState->actorCtx, gPlayState, enemyId, pos.x, pos.y, pos.z, 0, 0, 0, enemyParams, 0) != + NULL) { return GameInteractionEffectQueryResult::Possible; } } @@ -673,8 +677,9 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnActor(uint32_t if (actorId == ACTOR_EN_NIW) { // Spawn Cucco and make it angry - EnNiw* cucco = (EnNiw*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, actorId, player->actor.world.pos.x, - player->actor.world.pos.y + 2200, player->actor.world.pos.z, 0, 0, 0, actorParams, 0); + EnNiw* cucco = + (EnNiw*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, actorId, player->actor.world.pos.x, + player->actor.world.pos.y + 2200, player->actor.world.pos.z, 0, 0, 0, actorParams, 0); if (cucco == NULL) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; } @@ -683,8 +688,9 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnActor(uint32_t return GameInteractionEffectQueryResult::Possible; } else if (actorId == ACTOR_EN_BOM) { // Spawn a bomb, make it explode instantly when params is set to 1 to emulate spawning an explosion - EnBom* bomb = (EnBom*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_BOM, player->actor.world.pos.x, - player->actor.world.pos.y + 30, player->actor.world.pos.z, 0, 0, 0, BOMB_BODY, true); + EnBom* bomb = + (EnBom*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_BOM, player->actor.world.pos.x, + player->actor.world.pos.y + 30, player->actor.world.pos.z, 0, 0, 0, BOMB_BODY, true); if (bomb == NULL) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; @@ -704,5 +710,4 @@ GameInteractionEffectQueryResult GameInteractor::RawAction::SpawnActor(uint32_t } return GameInteractionEffectQueryResult::TemporarilyNotPossible; - } diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 078d645b5..1c516fc6e 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -136,7 +136,8 @@ typedef enum { // #### `result` // ```c - // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && + // Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) // ``` // #### `args` // - None @@ -163,7 +164,8 @@ typedef enum { // #### `result` // ```c - // CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) + // CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) // ``` // #### `args` // - None @@ -275,7 +277,7 @@ typedef enum { // #### `args` // - `*EnDoor` VB_CONSUME_SMALL_KEY, - + // #### `result` // ```c // itemDropped >= 0 && itemDropped < 0x1A @@ -302,7 +304,8 @@ typedef enum { // #### `result` // ```c - // gSaveContext.dayTime <= 0xC000 || gSaveContext.dayTime >= 0xE000 || LINK_IS_ADULT || play->sceneNum != SCENE_GRAVEYARD + // gSaveContext.dayTime <= 0xC000 || gSaveContext.dayTime >= 0xE000 || LINK_IS_ADULT || play->sceneNum != + // SCENE_GRAVEYARD // ``` // #### `args` // - `*EnTk` @@ -371,7 +374,8 @@ typedef enum { // #### `result` // ```c - // play->sceneNum == SCENE_LINKS_HOUSE && (!LINK_IS_ADULT || !Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) + // play->sceneNum == SCENE_LINKS_HOUSE && (!LINK_IS_ADULT || + // !Flags_GetEventChkInf(EVENTCHKINF_WON_COW_IN_MALONS_RACE) // ``` // #### `args` // - `*EnCow` @@ -1322,7 +1326,8 @@ typedef enum { // Close enough & various cutscene checks // ```c // (func_80AEC5FC(this, play)) && (!Play_InCsMode(play)) && - // (!(player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_CLIMBING_LADDER))) && + // (!(player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | + // PLAYER_STATE1_CLIMBING_LADDER))) && // (player->actor.bgCheckFlags & 1) // ``` // #### `args` @@ -1676,7 +1681,8 @@ typedef enum { // #### `result` // ```c - // (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT + // (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && + // !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT // ``` // #### `args` // - None diff --git a/soh/soh/Enhancements/gameconsole.c b/soh/soh/Enhancements/gameconsole.c index da0c7cf97..6992b7fb4 100644 --- a/soh/soh/Enhancements/gameconsole.c +++ b/soh/soh/Enhancements/gameconsole.c @@ -17,4 +17,5 @@ extern PlayState* gPlayState; -void GameConsole_Init() {} \ No newline at end of file +void GameConsole_Init() { +} \ No newline at end of file diff --git a/soh/soh/Enhancements/gameconsole.h b/soh/soh/Enhancements/gameconsole.h index e9a3634a1..0952baf08 100644 --- a/soh/soh/Enhancements/gameconsole.h +++ b/soh/soh/Enhancements/gameconsole.h @@ -8,22 +8,19 @@ #define MAX_CVARS 2048 #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -typedef enum -{ +typedef enum { CONSOLECOMMAND_RESULT_SUCCESS, CONSOLECOMMAND_RESULT_INVALIDARGS, CONSOLECOMMAND_RESULT_INVALIDCOMMAND, CONSOLECOMMAND_RESULT_FAILURE } ConsoleCommandResult; -typedef ConsoleCommandResult(*ConsoleCommandFunc)(char** argv, s32 argc); // Returns the number of arguments it read +typedef ConsoleCommandResult (*ConsoleCommandFunc)(char** argv, s32 argc); // Returns the number of arguments it read -typedef struct ConsoleCommand -{ +typedef struct ConsoleCommand { char* name; ConsoleCommandFunc func; char* description; diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp index 347bfe982..ca360543f 100644 --- a/soh/soh/Enhancements/gameplaystats.cpp +++ b/soh/soh/Enhancements/gameplaystats.cpp @@ -124,7 +124,7 @@ const char* const sceneMappings[] = { "Goron City", "Lon Lon Ranch", "Outside Ganon's Castle", - //Debug Rooms + // Debug Rooms "Test Map", "Test Room", "Depth Test", @@ -230,15 +230,15 @@ const char* const countMappings[] = { "Start:", }; -#define COLOR_WHITE ImVec4(1.00f, 1.00f, 1.00f, 1.00f) -#define COLOR_RED ImVec4(1.00f, 0.00f, 0.00f, 1.00f) -#define COLOR_GREEN ImVec4(0.10f, 1.00f, 0.10f, 1.00f) -#define COLOR_BLUE ImVec4(0.00f, 0.33f, 1.00f, 1.00f) -#define COLOR_PURPLE ImVec4(0.54f, 0.19f, 0.89f, 1.00f) -#define COLOR_YELLOW ImVec4(1.00f, 1.00f, 0.00f, 1.00f) -#define COLOR_ORANGE ImVec4(1.00f, 0.67f, 0.11f, 1.00f) +#define COLOR_WHITE ImVec4(1.00f, 1.00f, 1.00f, 1.00f) +#define COLOR_RED ImVec4(1.00f, 0.00f, 0.00f, 1.00f) +#define COLOR_GREEN ImVec4(0.10f, 1.00f, 0.10f, 1.00f) +#define COLOR_BLUE ImVec4(0.00f, 0.33f, 1.00f, 1.00f) +#define COLOR_PURPLE ImVec4(0.54f, 0.19f, 0.89f, 1.00f) +#define COLOR_YELLOW ImVec4(1.00f, 1.00f, 0.00f, 1.00f) +#define COLOR_ORANGE ImVec4(1.00f, 0.67f, 0.11f, 1.00f) #define COLOR_LIGHT_BLUE ImVec4(0.00f, 0.88f, 1.00f, 1.00f) -#define COLOR_GREY ImVec4(0.78f, 0.78f, 0.78f, 1.00f) +#define COLOR_GREY ImVec4(0.78f, 0.78f, 0.78f, 1.00f) char itemTimestampDisplayName[TIMESTAMP_MAX][21] = { "" }; ImVec4 itemTimestampDisplayColor[TIMESTAMP_MAX]; @@ -248,14 +248,14 @@ typedef struct { u32 time; ImVec4 color; bool isRoom; -}TimestampInfo; +} TimestampInfo; // 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.ship.stats.itemTimestamp. TimestampInfo itemTimestampDisplay[TIMESTAMP_MAX]; TimestampInfo sceneTimestampDisplay[8191]; -//std::vector sceneTimestampDisplay; +// std::vector sceneTimestampDisplay; std::string formatTimestampGameplayStat(uint32_t value) { uint32_t sec = value / 10; @@ -302,37 +302,38 @@ void LoadStatsVersion1() { 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.ship.stats.sceneTimestamps), [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - int scene, room, sceneTime, roomTime, isRoom; - SaveManager::Instance->LoadData("scene", scene); - SaveManager::Instance->LoadData("room", room); - SaveManager::Instance->LoadData("sceneTime", sceneTime); - SaveManager::Instance->LoadData("roomTime", roomTime); - SaveManager::Instance->LoadData("isRoom", isRoom); - if (scene == 0 && room == 0 && sceneTime == 0 && roomTime == 0 && isRoom == 0) { - return; - } - 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->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.ship.stats.sceneTimestamps), [&](size_t i) { + SaveManager::Instance->LoadStruct("", [&]() { + int scene, room, sceneTime, roomTime, isRoom; + SaveManager::Instance->LoadData("scene", scene); + SaveManager::Instance->LoadData("room", room); + SaveManager::Instance->LoadData("sceneTime", sceneTime); + SaveManager::Instance->LoadData("roomTime", roomTime); + SaveManager::Instance->LoadData("isRoom", isRoom); + if (scene == 0 && room == 0 && sceneTime == 0 && roomTime == 0 && isRoom == 0) { + return; + } + 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.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.ship.stats.scenesDiscovered), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.ship.stats.scenesDiscovered[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( + "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.ship.stats.entrancesDiscovered), + [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.ship.stats.entrancesDiscovered[i]); }); } void SaveStats(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -350,30 +351,32 @@ void SaveStats(SaveContext* saveContext, int sectionID, bool fullSave) { 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->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->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->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->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->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->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->ship.stats.scenesDiscovered), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->ship.stats.scenesDiscovered[i]); - }); - SaveManager::Instance->SaveArray("entrancesDiscovered", ARRAY_COUNT(saveContext->ship.stats.entrancesDiscovered), [&](size_t i) { - SaveManager::Instance->SaveData("", saveContext->ship.stats.entrancesDiscovered[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->ship.stats.entrancesDiscovered), + [&](size_t i) { SaveManager::Instance->SaveData("", saveContext->ship.stats.entrancesDiscovered[i]); }); } void GameplayStatsRow(const char* label, const std::string& value, ImVec4 color = COLOR_WHITE, @@ -394,7 +397,7 @@ bool compareTimestampInfoByTime(const TimestampInfo& a, const TimestampInfo& b) return CVarGetInteger(CVAR_GAMEPLAY_STATS("ReverseTimestamps"), 0) ? a.time > b.time : a.time < b.time; } -const char* ResolveSceneID(int sceneID, int roomID){ +const char* ResolveSceneID(int sceneID, int roomID) { if (sceneID == SCENE_GROTTOS) { switch (roomID) { case 0: @@ -427,7 +430,7 @@ const char* ResolveSceneID(int sceneID, int roomID){ return "Big Skulltula Grotto"; }; } else if (sceneID == SCENE_WINDMILL_AND_DAMPES_GRAVE) { - //Only the last room of Dampe's Grave (rm 6) is considered the windmill. + // Only the last room of Dampe's Grave (rm 6) is considered the windmill. return roomID == 6 ? "Windmill" : "Dampe's Grave"; } else if (sceneID < SCENE_ID_MAX) { return sceneMappings[sceneID]; @@ -440,7 +443,7 @@ void DrawGameplayStatsHeader() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 4.0f, 4.0f }); ImGui::BeginTable("gameplayStatsHeader", 1, ImGuiTableFlags_BordersOuter); ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); - //if tag is empty (not a release build) + // if tag is empty (not a release build) if (gGitCommitTag[0] == 0) { GameplayStatsRow("Git Branch:", (char*)gGitBranch); GameplayStatsRow("Git Commit Hash:", (char*)gGitCommitHash); @@ -448,21 +451,30 @@ void DrawGameplayStatsHeader() { GameplayStatsRow("Build Version:", (char*)gBuildVersion); } if (gSaveContext.ship.stats.rtaTiming) { - GameplayStatsRow("Total Time (RTA):", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); + 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.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); + GameplayStatsRow("Total Game Time:", formatTimestampGameplayStat(GAMEPLAYSTAT_TOTAL_TIME), + gSaveContext.ship.stats.gameComplete ? COLOR_GREEN : COLOR_WHITE); } if (CVarGetInteger(CVAR_GAMEPLAY_STATS("ShowAdditionalTimers"), 0)) { // !Only display total game time - 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); + 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_GAMEPLAY_STATS("ShowDebugInfo"), 0)) { // && display debug info GameplayStatsRow("play->sceneNum:", formatHexGameplayStat(gPlayState->sceneNum), COLOR_YELLOW); - GameplayStatsRow("gSaveContext.entranceIndex:", formatHexGameplayStat(gSaveContext.entranceIndex), COLOR_YELLOW); - GameplayStatsRow("gSaveContext.cutsceneIndex:", formatHexOnlyGameplayStat(gSaveContext.cutsceneIndex), COLOR_YELLOW); - GameplayStatsRow("play->roomCtx.curRoom.num:", formatIntGameplayStat(gPlayState->roomCtx.curRoom.num), COLOR_YELLOW); + GameplayStatsRow("gSaveContext.entranceIndex:", formatHexGameplayStat(gSaveContext.entranceIndex), + COLOR_YELLOW); + GameplayStatsRow("gSaveContext.cutsceneIndex:", formatHexOnlyGameplayStat(gSaveContext.cutsceneIndex), + COLOR_YELLOW); + GameplayStatsRow("play->roomCtx.curRoom.num:", formatIntGameplayStat(gPlayState->roomCtx.curRoom.num), + COLOR_YELLOW); } ImGui::EndTable(); ImGui::PopStyleVar(1); @@ -484,12 +496,12 @@ void DrawGameplayStatsTimestampsTab() { for (int i = 0; i < TIMESTAMP_MAX; i++) { // To be shown, the entry must have a non-zero time and a string for its display name if (itemTimestampDisplay[i].time > 0 && strnlen(itemTimestampDisplay[i].name, 21) > 1) { - GameplayStatsRow(itemTimestampDisplay[i].name, formatTimestampGameplayStat(itemTimestampDisplay[i].time), itemTimestampDisplay[i].color); + GameplayStatsRow(itemTimestampDisplay[i].name, formatTimestampGameplayStat(itemTimestampDisplay[i].time), + itemTimestampDisplay[i].color); } } ImGui::EndTable(); ImGui::PopStyleVar(1); - } void DrawGameplayStatsCountsTab() { @@ -520,7 +532,8 @@ void DrawGameplayStatsCountsTab() { ImGui::TableSetupColumn("stat", ImGuiTableColumnFlags_WidthStretch); GameplayStatsRow("Enemies Defeated:", formatIntGameplayStat(enemiesDefeated)); if (enemiesDefeated > 0) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); 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) { @@ -537,7 +550,8 @@ void DrawGameplayStatsCountsTab() { GameplayStatsRow("Chests Opened:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_CHESTS_OPENED])); GameplayStatsRow("Ammo Used:", formatIntGameplayStat(ammoUsed)); if (ammoUsed > 0) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); + 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.ship.stats.count[i])); @@ -548,8 +562,10 @@ void DrawGameplayStatsCountsTab() { 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.ship.stats.count[COUNT_TIME_BUNNY_HOOD] > 0) { - GameplayStatsRow("Bunny Hood Time:", formatTimestampGameplayStat(gSaveContext.ship.stats.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.ship.stats.count[COUNT_ROLLS])); GameplayStatsRow("Bonks:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BONKS])); @@ -561,7 +577,8 @@ void DrawGameplayStatsCountsTab() { GameplayStatsRow("Bushes Cut:", formatIntGameplayStat(gSaveContext.ship.stats.count[COUNT_BUSHES_CUT])); GameplayStatsRow("Buttons Pressed:", formatIntGameplayStat(buttonPresses)); if (buttonPresses > 0) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); + 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.ship.stats.count[i])); @@ -574,16 +591,19 @@ void DrawGameplayStatsCountsTab() { void DrawGameplayStatsBreakdownTab() { 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 sceneName = ResolveSceneID(gSaveContext.ship.stats.sceneTimestamps[i].scene, + gSaveContext.ship.stats.sceneTimestamps[i].room); std::string name; - if (CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) && gSaveContext.ship.stats.sceneTimestamps[i].scene != SCENE_GROTTOS) { + if (CVarGetInteger(CVAR_GAMEPLAY_STATS("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_GAMEPLAY_STATS("RoomBreakdown"), 0) ? - gSaveContext.ship.stats.sceneTimestamps[i].roomTime : gSaveContext.ship.stats.sceneTimestamps[i].sceneTime; + sceneTimestampDisplay[i].time = CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) + ? gSaveContext.ship.stats.sceneTimestamps[i].roomTime + : gSaveContext.ship.stats.sceneTimestamps[i].sceneTime; sceneTimestampDisplay[i].color = COLOR_GREY; sceneTimestampDisplay[i].isRoom = gSaveContext.ship.stats.sceneTimestamps[i].isRoom; } @@ -600,7 +620,9 @@ void DrawGameplayStatsBreakdownTab() { } std::string toPass; if (CVarGetInteger(CVAR_GAMEPLAY_STATS("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); + toPass = fmt::format("{:s} Room {:d}", + ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum), + gSaveContext.ship.stats.roomNum); } else { toPass = ResolveSceneID(gSaveContext.ship.stats.sceneNum, gSaveContext.ship.stats.roomNum); } @@ -611,27 +633,27 @@ void DrawGameplayStatsBreakdownTab() { void DrawGameplayStatsOptionsTab() { UIWidgets::CVarCheckbox("Show in-game total timer", CVAR_GAMEPLAY_STATS("ShowIngameTimer"), - UIWidgets::CheckboxOptions() - .Tooltip("Keep track of the timer as an in-game HUD element. The position of the " - "timer can be changed in the Cosmetics Editor.") - .Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("Keep track of the timer as an in-game HUD element. The position of the " + "timer can be changed in the Cosmetics Editor.") + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Show latest timestamps on top", CVAR_GAMEPLAY_STATS("ReverseTimestamps"), - UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Room Breakdown", CVAR_GAMEPLAY_STATS("RoomBreakdown"), - UIWidgets::CheckboxOptions() - .Tooltip("Allows a more in-depth perspective of time spent in a certain map.") - .Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("Allows a more in-depth perspective of time spent in a certain map.") + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("RTA Timing on new files", CVAR_GAMEPLAY_STATS("RTATiming"), - UIWidgets::CheckboxOptions() - .Tooltip("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") - .Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("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") + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Show additional detail timers", CVAR_GAMEPLAY_STATS("ShowAdditionalTimers"), - UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Show Debug Info", CVAR_GAMEPLAY_STATS("ShowDebugInfo"), - UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); } void GameplayStatsWindow::DrawElement() { @@ -693,7 +715,8 @@ void InitStats(bool isDebug) { 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.ship.stats.entrancesDiscovered); entrancesIdx++) { + for (int entrancesIdx = 0; entrancesIdx < ARRAY_COUNT(gSaveContext.ship.stats.entrancesDiscovered); + entrancesIdx++) { gSaveContext.ship.stats.entrancesDiscovered[entrancesIdx] = 0; } diff --git a/soh/soh/Enhancements/gameplaystats.h b/soh/soh/Enhancements/gameplaystats.h index b4d140f1f..1f89cb3a4 100644 --- a/soh/soh/Enhancements/gameplaystats.h +++ b/soh/soh/Enhancements/gameplaystats.h @@ -6,30 +6,32 @@ #ifdef __cplusplus extern "C" { #endif - uint64_t GetUnixTimestamp(void); - char* GameplayStats_GetCurrentTime(); +uint64_t GetUnixTimestamp(void); +char* GameplayStats_GetCurrentTime(); #ifdef __cplusplus }; #endif // When using RTA timing - // get the diff since the save was created, - // unless the game is complete in which we use the defeated ganon timestamp +// get the diff since the save was created, +// unless the game is complete in which we use the defeated ganon timestamp // When not using RTA timing - // 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.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] \ +// 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.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_GAMEPLAY_STATS("RoomBreakdown"), 0) ?\ - gSaveContext.ship.stats.roomTimer :\ - gSaveContext.ship.stats.sceneTimer) + : (gSaveContext.ship.stats.playTimer / 2 + gSaveContext.ship.stats.pauseTimer / 3)) +#define CURRENT_MODE_TIMER \ + (CVarGetInteger(CVAR_GAMEPLAY_STATS("RoomBreakdown"), 0) ? gSaveContext.ship.stats.roomTimer \ + : gSaveContext.ship.stats.sceneTimer) void InitStatTracker(); @@ -37,22 +39,22 @@ typedef enum { // 0x00 to 0x9B (0 to 155) used for getting items, // piggybacked off enum "ItemID" in z64item.h - /* 0xA0 */ TIMESTAMP_DEFEAT_GOHMA = 0xA0, // z_boss_goma.c - /* 0xA1 */ TIMESTAMP_DEFEAT_KING_DODONGO, // z_boss_dodongo.c - /* 0xA2 */ TIMESTAMP_DEFEAT_BARINADE, // z_boss_va.c - /* 0xA3 */ TIMESTAMP_DEFEAT_PHANTOM_GANON, // z_boss_ganondrof.c - /* 0xA4 */ TIMESTAMP_DEFEAT_VOLVAGIA, // z_boss_fd2.c - /* 0xA5 */ TIMESTAMP_DEFEAT_MORPHA, // z_boss_mo.c - /* 0xA6 */ TIMESTAMP_DEFEAT_BONGO_BONGO, // z_boss_sst.c - /* 0xA7 */ TIMESTAMP_DEFEAT_TWINROVA, // z_boss_tw.c - /* 0xA8 */ TIMESTAMP_DEFEAT_GANONDORF, // z_boss_ganon.c - /* 0xA9 */ TIMESTAMP_DEFEAT_GANON, // z_boss_ganon2.c - /* 0xA9 */ TIMESTAMP_BOSSRUSH_FINISH, // z_boss_ganon2.c - /* 0xAA */ TIMESTAMP_FOUND_GREG, // z_parameter.c - /* 0xAA */ TIMESTAMP_TRIFORCE_COMPLETED, // z_parameter.c + /* 0xA0 */ TIMESTAMP_DEFEAT_GOHMA = 0xA0, // z_boss_goma.c + /* 0xA1 */ TIMESTAMP_DEFEAT_KING_DODONGO, // z_boss_dodongo.c + /* 0xA2 */ TIMESTAMP_DEFEAT_BARINADE, // z_boss_va.c + /* 0xA3 */ TIMESTAMP_DEFEAT_PHANTOM_GANON, // z_boss_ganondrof.c + /* 0xA4 */ TIMESTAMP_DEFEAT_VOLVAGIA, // z_boss_fd2.c + /* 0xA5 */ TIMESTAMP_DEFEAT_MORPHA, // z_boss_mo.c + /* 0xA6 */ TIMESTAMP_DEFEAT_BONGO_BONGO, // z_boss_sst.c + /* 0xA7 */ TIMESTAMP_DEFEAT_TWINROVA, // z_boss_tw.c + /* 0xA8 */ TIMESTAMP_DEFEAT_GANONDORF, // z_boss_ganon.c + /* 0xA9 */ TIMESTAMP_DEFEAT_GANON, // z_boss_ganon2.c + /* 0xA9 */ TIMESTAMP_BOSSRUSH_FINISH, // z_boss_ganon2.c + /* 0xAA */ TIMESTAMP_FOUND_GREG, // z_parameter.c + /* 0xAA */ TIMESTAMP_TRIFORCE_COMPLETED, // z_parameter.c /* 0xAB */ TIMESTAMP_MAX -}GameplayStatTimestamp; +} GameplayStatTimestamp; typedef enum { // Enemies defeated diff --git a/soh/soh/Enhancements/gameplaystatswindow.h b/soh/soh/Enhancements/gameplaystatswindow.h index 446cc1ef4..16cf94e53 100644 --- a/soh/soh/Enhancements/gameplaystatswindow.h +++ b/soh/soh/Enhancements/gameplaystatswindow.h @@ -6,5 +6,5 @@ class GameplayStatsWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; \ No newline at end of file diff --git a/soh/soh/Enhancements/item-tables/ItemTableManager.h b/soh/soh/Enhancements/item-tables/ItemTableManager.h index e20632f38..8420e6897 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableManager.h +++ b/soh/soh/Enhancements/item-tables/ItemTableManager.h @@ -8,16 +8,16 @@ typedef std::unordered_map ItemTable; class ItemTableManager { public: - static ItemTableManager* Instance; - ItemTableManager(); - ~ItemTableManager(); - bool AddItemTable(uint16_t tableID); - bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); - GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t getItemID); - bool ClearItemTable(uint16_t tableID); + static ItemTableManager* Instance; + ItemTableManager(); + ~ItemTableManager(); + bool AddItemTable(uint16_t tableID); + bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry); + GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t getItemID); + bool ClearItemTable(uint16_t tableID); private: - std::unordered_map itemTables; + std::unordered_map itemTables; - ItemTable* RetrieveItemTable(uint16_t tableID); + ItemTable* RetrieveItemTable(uint16_t tableID); }; diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index d9d742717..df59d6770 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -29,11 +29,18 @@ typedef enum GetItemCategory { /* 0x05 */ ITEM_CATEGORY_MAJOR, } GetItemCategory; -#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ - { itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL } +#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ + { \ + itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, \ + modIndex, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL \ + } -#define GET_ITEM_CUSTOM_TABLE(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, tableId, getItemId) \ - { itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, tableId, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL } +#define GET_ITEM_CUSTOM_TABLE(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, tableId, \ + getItemId) \ + { \ + itemId, field, (int16_t)((chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1)), textId, objectId, modIndex, \ + tableId, getItemId, drawId, true, ITEM_FROM_NPC, itemCategory, itemId, modIndex, NULL \ + } #define GET_ITEM_NONE \ { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, ITEM_NONE, 0, NULL } @@ -50,13 +57,16 @@ typedef struct GetItemEntry { /* 0x03 */ uint16_t textId; /* 0x04 */ uint16_t objectId; /* 0x06 */ uint16_t modIndex; // Primarily used for determining whether to use Item_Give or Randomizer_Item_Give - /* 0x07 */ uint16_t tableId; // GetItemEntry table this entry is in (usually the same as modIndex, but not always) + /* 0x07 */ uint16_t tableId; // GetItemEntry table this entry is in (usually the same as modIndex, but not always) /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. - /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. + /* 0x0C */ uint16_t + collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. /* 0x0E */ GetItemFrom getItemFrom; /* 0x0F */ GetItemCategory getItemCategory; // Primarily made and used for chest size/texture matches contents - /* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to function on ice traps. - /* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles to function on ice traps. + /* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to + // function on ice traps. + /* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles + // to function on ice traps. CustomDrawFunc drawFunc; } GetItemEntry; // size = 0x11 diff --git a/soh/soh/Enhancements/kaleido.cpp b/soh/soh/Enhancements/kaleido.cpp index 449d1612d..eef19b495 100644 --- a/soh/soh/Enhancements/kaleido.cpp +++ b/soh/soh/Enhancements/kaleido.cpp @@ -27,429 +27,423 @@ void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, u16 specialPos); namespace Rando { - void KaleidoEntryIcon::LoadIconTex(std::vector* mEntryDl) { - if (mIconFormat == G_IM_FMT_IA) { - if (mIconSize == G_IM_SIZ_8b) { - Gfx iconTexture[] = { gsDPLoadTextureBlock(mIconResourceName, G_IM_FMT_IA, G_IM_SIZ_8b, mIconWidth, mIconHeight, 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) }; - mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); - } - } else if (mIconFormat == G_IM_FMT_RGBA) { - if (mIconSize == G_IM_SIZ_32b) { - Gfx iconTexture[] = { gsDPLoadTextureBlock(mIconResourceName, G_IM_FMT_RGBA, G_IM_SIZ_32b, mIconWidth, mIconHeight, 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) }; - mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); - } +void KaleidoEntryIcon::LoadIconTex(std::vector* mEntryDl) { + if (mIconFormat == G_IM_FMT_IA) { + if (mIconSize == G_IM_SIZ_8b) { + Gfx iconTexture[] = { gsDPLoadTextureBlock( + mIconResourceName, G_IM_FMT_IA, G_IM_SIZ_8b, mIconWidth, mIconHeight, 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) }; + mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); + } + } else if (mIconFormat == G_IM_FMT_RGBA) { + if (mIconSize == G_IM_SIZ_32b) { + Gfx iconTexture[] = { gsDPLoadTextureBlock( + mIconResourceName, G_IM_FMT_RGBA, G_IM_SIZ_32b, mIconWidth, mIconHeight, 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) }; + mEntryDl->insert(mEntryDl->end(), std::begin(iconTexture), std::end(iconTexture)); } } +} - KaleidoEntry::KaleidoEntry(int16_t x, int16_t y, std::string text) : mX(x), mY(y), mText(std::move(text)) { - mHeight = 0; - mWidth = 0; - vtx = nullptr; +KaleidoEntry::KaleidoEntry(int16_t x, int16_t y, std::string text) : mX(x), mY(y), mText(std::move(text)) { + mHeight = 0; + mWidth = 0; + vtx = nullptr; +} + +void KaleidoEntry::SetYOffset(int yOffset) { + mY = yOffset; +} + +void KaleidoEntryIcon::Draw(PlayState* play, std::vector* mEntryDl) { + if (vtx == nullptr) { + return; + } + size_t numChar = mText.length(); + if (numChar == 0) { + return; } - void KaleidoEntry::SetYOffset(int yOffset) { - mY = yOffset; + Color_RGBA8 textColor = { 255, 255, 255, 255 }; + if (mAchieved) { + textColor = { 0x98, 0xFF, 0x44, 255 }; } - void KaleidoEntryIcon::Draw(PlayState* play, std::vector* mEntryDl) { - if (vtx == nullptr) { - return; - } - size_t numChar = mText.length(); - if (numChar == 0) { - return; - } + Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); - Color_RGBA8 textColor = { 255, 255, 255, 255 }; - if (mAchieved) { - textColor = { 0x98, 0xFF, 0x44, 255 }; - } + mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); - Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); - - mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); - - // icon - if (!mAchieved) { - mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); - mEntryDl->push_back(gsSPGrayscale(true)); - } - mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); - mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); - LoadIconTex(mEntryDl); - mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); - mEntryDl->push_back(gsSPGrayscale(false)); - - // text - mEntryDl->push_back(gsDPSetPrimColor(0, 0, textColor.r, textColor.g, textColor.b, textColor.a)); - for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters - // handle loading groups of 16 chars at a time until there are no more left to load. - // By this point 4 vertices have already been loaded for the preceding icon. - if (i % 16 == 0) { - size_t numVtxToLoad = std::min(numChar - i, 16) * 4; - mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); - vtxGroup++; - } - - auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); - auto vertexStart = static_cast(4 * (i % 16)); - - Gfx charTexture[] = { gsDPLoadTextureBlock_4b( - texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; - mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); - mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } - mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); + // icon + if (!mAchieved) { + mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); + mEntryDl->push_back(gsSPGrayscale(true)); } + mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); + mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); + LoadIconTex(mEntryDl); + mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); + mEntryDl->push_back(gsSPGrayscale(false)); - Kaleido::Kaleido() { - const auto ctx = Rando::Context::GetInstance(); - int yOffset = 2; - mEntries.push_back(std::make_shared(gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, - Color_RGBA8{ 0xC8, 0xFF, 0x64, 255 }, FlagType::FLAG_RANDOMIZER_INF, - static_cast(RAND_INF_GREG_FOUND), 0, yOffset, "Greg")); + // text + mEntryDl->push_back(gsDPSetPrimColor(0, 0, textColor.r, textColor.g, textColor.b, textColor.a)); + for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { + // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters + // handle loading groups of 16 chars at a time until there are no more left to load. + // By this point 4 vertices have already been loaded for the preceding icon. + if (i % 16 == 0) { + size_t numVtxToLoad = std::min(numChar - i, 16) * 4; + mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); + vtxGroup++; + } + + auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); + auto vertexStart = static_cast(4 * (i % 16)); + + Gfx charTexture[] = { gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); + mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); + } + mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); +} + +Kaleido::Kaleido() { + const auto ctx = Rando::Context::GetInstance(); + int yOffset = 2; + mEntries.push_back(std::make_shared( + gRupeeCounterIconTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, Color_RGBA8{ 0xC8, 0xFF, 0x64, 255 }, + FlagType::FLAG_RANDOMIZER_INF, static_cast(RAND_INF_GREG_FOUND), 0, yOffset, "Greg")); + yOffset += 18; + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + 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.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_TRIFORCE_HUNT)) { - 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.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)) { - mEntries.push_back(std::make_shared(0, yOffset)); - yOffset += 18; - } - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).IsNot(RO_BOSS_SOULS_OFF)) { - static const char* bossSoulNames[] = { - "Gohma's Soul", - "King Dodongo's Soul", - "Barinade's Soul", - "Phantom Ganon's Soul", - "Volvagia's Soul", - "Morpha's Soul", - "Bongo Bongo's Soul", - "Twinrova's Soul", - }; - for (int i = RAND_INF_GOHMA_SOUL; i < RAND_INF_GANON_SOUL; i++) { - mEntries.push_back( - std::make_shared( - gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, - FlagType::FLAG_RANDOMIZER_INF, i, 0, yOffset, bossSoulNames[i - RAND_INF_GOHMA_SOUL] - ) - ); - yOffset += 18; - } - } - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { - mEntries.push_back( - std::make_shared( - gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, - FlagType::FLAG_RANDOMIZER_INF, RAND_INF_GANON_SOUL, 0, yOffset, "Ganon's Soul" - ) - ); + } + if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { + mEntries.push_back(std::make_shared(0, yOffset)); + yOffset += 18; + } + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).IsNot(RO_BOSS_SOULS_OFF)) { + static const char* bossSoulNames[] = { + "Gohma's Soul", "King Dodongo's Soul", "Barinade's Soul", "Phantom Ganon's Soul", + "Volvagia's Soul", "Morpha's Soul", "Bongo Bongo's Soul", "Twinrova's Soul", + }; + for (int i = RAND_INF_GOHMA_SOUL; i < RAND_INF_GANON_SOUL; i++) { + mEntries.push_back(std::make_shared( + gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, + FlagType::FLAG_RANDOMIZER_INF, i, 0, yOffset, bossSoulNames[i - RAND_INF_GOHMA_SOUL])); yOffset += 18; } } - - extern "C" { - void FrameInterpolation_RecordCloseChild(void); - void FrameInterpolation_RecordOpenChild(const void* a, int b); + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { + mEntries.push_back(std::make_shared( + gBossSoulTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, Color_RGBA8{ 255, 255, 255, 255 }, + FlagType::FLAG_RANDOMIZER_INF, RAND_INF_GANON_SOUL, 0, yOffset, "Ganon's Soul")); + yOffset += 18; } +} - void Kaleido::Draw(PlayState* play) { - if (play == nullptr || mEntries.empty()) { - return; - } - PauseContext* pauseCtx = &play->pauseCtx; - Input* input = &play->state.input[0]; - mEntryDl.clear(); - OPEN_DISPS(play->state.gfxCtx); - mEntryDl.push_back(gsDPPipeSync()); - Gfx_SetupDL_42Opa(play->state.gfxCtx); - mEntryDl.push_back(gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM)); +extern "C" { +void FrameInterpolation_RecordCloseChild(void); +void FrameInterpolation_RecordOpenChild(const void* a, int b); +} - // Move the matrix origin to the top-left corner of the kaleido page - Matrix_Translate(-108.f, 58.f, 0.0f, MTXMODE_APPLY); - // Invert the matrix to render vertices with positive going down - Matrix_Scale(1.0f, -1.0f, 1.0f, MTXMODE_APPLY); - // The scrolling logic is in here because the built in kaleido input throttling happens - // in its Draw functions, which get called after their update functions. I hate it but fixing - // it would be a much larger Kaleido change. - bool shouldScroll = false; - bool dpad = CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0); - if (((pauseCtx->unk_1E4 == 0) || (pauseCtx->unk_1E4 == 5) || (pauseCtx->unk_1E4 == 8)) && - (pauseCtx->pageIndex == PAUSE_QUEST)) { - if (!((pauseCtx->state != 6) || ((pauseCtx->stickRelX == 0) && (pauseCtx->stickRelY == 0)))) { - if (pauseCtx->cursorSpecialPos == 0) { - if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { - if (mTopIndex > 0) { - mTopIndex--; - shouldScroll = true; - } - } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { - if (mTopIndex + mNumVisible < mEntries.size()) { - mTopIndex++; - shouldScroll = true; - } +void Kaleido::Draw(PlayState* play) { + if (play == nullptr || mEntries.empty()) { + return; + } + PauseContext* pauseCtx = &play->pauseCtx; + Input* input = &play->state.input[0]; + mEntryDl.clear(); + OPEN_DISPS(play->state.gfxCtx); + mEntryDl.push_back(gsDPPipeSync()); + Gfx_SetupDL_42Opa(play->state.gfxCtx); + mEntryDl.push_back(gsDPSetCombineMode(G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM)); + + // Move the matrix origin to the top-left corner of the kaleido page + Matrix_Translate(-108.f, 58.f, 0.0f, MTXMODE_APPLY); + // Invert the matrix to render vertices with positive going down + Matrix_Scale(1.0f, -1.0f, 1.0f, MTXMODE_APPLY); + // The scrolling logic is in here because the built in kaleido input throttling happens + // in its Draw functions, which get called after their update functions. I hate it but fixing + // it would be a much larger Kaleido change. + bool shouldScroll = false; + bool dpad = CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0); + if (((pauseCtx->unk_1E4 == 0) || (pauseCtx->unk_1E4 == 5) || (pauseCtx->unk_1E4 == 8)) && + (pauseCtx->pageIndex == PAUSE_QUEST)) { + if (!((pauseCtx->state != 6) || ((pauseCtx->stickRelX == 0) && (pauseCtx->stickRelY == 0)))) { + if (pauseCtx->cursorSpecialPos == 0) { + if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) { + if (mTopIndex > 0) { + mTopIndex--; + shouldScroll = true; } - if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { - KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_LEFT); - pauseCtx->unk_1E4 = 0; - } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { - KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_RIGHT); - pauseCtx->unk_1E4 = 0; - } - } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { - if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { - pauseCtx->cursorSpecialPos = 0; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - } - } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) { - if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { - pauseCtx->cursorSpecialPos = 0; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) { + if (mTopIndex + mNumVisible < mEntries.size()) { + mTopIndex++; + shouldScroll = true; } } - } else if (pauseCtx->cursorSpecialPos != 0 && pauseCtx->state == 7) { - pauseCtx->cursorSpecialPos = 0; + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_LEFT); + pauseCtx->unk_1E4 = 0; + } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + KaleidoScope_MoveCursorToSpecialPos(play, PAUSE_CURSOR_PAGE_RIGHT); + pauseCtx->unk_1E4 = 0; + } + } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) { + if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) { + pauseCtx->cursorSpecialPos = 0; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } + } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) { + if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) { + pauseCtx->cursorSpecialPos = 0; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + } } - } - int yOffset = 2; - for (int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { - auto& entry = mEntries[i]; - if (shouldScroll) { - entry->SetYOffset(yOffset); - yOffset += 18; - Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - } - Matrix_Push(); - entry->Draw(play, &mEntryDl); - Matrix_Pop(); - } - - mEntryDl.push_back(gsSPEndDisplayList()); - gSPDisplayList(POLY_OPA_DISP++, mEntryDl.data()); - CLOSE_DISPS(play->state.gfxCtx); - } - - void Kaleido::Update(PlayState *play) { - for(int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { - const auto& entry = mEntries[i]; - entry->Update(play); + } else if (pauseCtx->cursorSpecialPos != 0 && pauseCtx->state == 7) { + pauseCtx->cursorSpecialPos = 0; } } - - extern "C" void RandoKaleido_DrawMiscCollectibles(PlayState* play) { - OTRGlobals::Instance->gRandoContext->GetKaleido()->Draw(play); - } - - extern "C" void RandoKaleido_UpdateMiscCollectibles(int16_t inDungeonScene) { - PauseContext* pauseCtx = &gPlayState->pauseCtx; - if (pauseCtx->randoQuestMode && pauseCtx->pageIndex == PAUSE_QUEST) { - OTRGlobals::Instance->gRandoContext->GetKaleido()->Update(gPlayState); + int yOffset = 2; + for (int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { + auto& entry = mEntries[i]; + if (shouldScroll) { + entry->SetYOffset(yOffset); + yOffset += 18; + Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } + Matrix_Push(); + entry->Draw(play, &mEntryDl); + Matrix_Pop(); } - KaleidoEntryIconFlag::KaleidoEntryIconFlag(const char *iconResourceName, int iconFormat, int iconSize, int iconWidth, - int iconHeight, Color_RGBA8 iconColor, FlagType flagType, int flag, - int16_t x, int16_t y, std::string name) : - mFlagType(flagType), mFlag(flag), - KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y, std::move(name)) { - BuildVertices(); - } + mEntryDl.push_back(gsSPEndDisplayList()); + gSPDisplayList(POLY_OPA_DISP++, mEntryDl.data()); + CLOSE_DISPS(play->state.gfxCtx); +} - void KaleidoEntryIconFlag::Update(PlayState* play) { - mAchieved = GameInteractor::RawAction::CheckFlag(mFlagType, static_cast(mFlag)); +void Kaleido::Update(PlayState* play) { + for (int i = mTopIndex; i < (mTopIndex + mNumVisible) && i < mEntries.size(); i++) { + const auto& entry = mEntries[i]; + entry->Update(play); } +} - KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char *iconResourceName, int iconFormat, - int iconSize, int iconWidth, int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch, - int required, int total) : mWatch(watch), mRequired(required), mTotal(total), - KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y) { +extern "C" void RandoKaleido_DrawMiscCollectibles(PlayState* play) { + OTRGlobals::Instance->gRandoContext->GetKaleido()->Draw(play); +} + +extern "C" void RandoKaleido_UpdateMiscCollectibles(int16_t inDungeonScene) { + PauseContext* pauseCtx = &gPlayState->pauseCtx; + if (pauseCtx->randoQuestMode && pauseCtx->pageIndex == PAUSE_QUEST) { + OTRGlobals::Instance->gRandoContext->GetKaleido()->Update(gPlayState); + } +} + +KaleidoEntryIconFlag::KaleidoEntryIconFlag(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, + int iconHeight, Color_RGBA8 iconColor, FlagType flagType, int flag, + int16_t x, int16_t y, std::string name) + : mFlagType(flagType), mFlag(flag), KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, + iconColor, x, y, std::move(name)) { + BuildVertices(); +} + +void KaleidoEntryIconFlag::Update(PlayState* play) { + mAchieved = GameInteractor::RawAction::CheckFlag(mFlagType, static_cast(mFlag)); +} + +KaleidoEntryIconCountRequired::KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, + int iconWidth, int iconHeight, Color_RGBA8 iconColor, + int16_t x, int16_t y, int* watch, int required, int total) + : mWatch(watch), mRequired(required), mTotal(total), + KaleidoEntryIcon(iconResourceName, iconFormat, iconSize, iconWidth, iconHeight, iconColor, x, y) { + mCount = *mWatch; + BuildText(); + BuildVertices(); +} + +void KaleidoEntryIconCountRequired::BuildText() { + std::ostringstream totals; + totals << mCount; + if (mRequired != 0 && mCount < mRequired) { + totals << '/' << mRequired; + } + if (mTotal >= mRequired && mCount >= mRequired) { + totals << '/' << mTotal; + } + mText = totals.str(); +} + +void KaleidoEntryIcon::BuildVertices() { + int offsetY = 0; + int offsetX = 0; + // 4 vertices per character, plus one for the preceding icon. + Vtx* vertices = (Vtx*)calloc(sizeof(Vtx[4]), mText.length() + 1); + // Vertex for the preceding icon. + Ship_CreateQuadVertexGroup(vertices, offsetX, offsetY, mIconWidth, mIconHeight, 0); + offsetX += 18; + for (size_t i = 0; i < mText.length(); i++) { + int charWidth = static_cast(Ship_GetCharFontWidth(mText[i])); + Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0); + offsetX += charWidth; + } + offsetY += FONT_CHAR_TEX_HEIGHT; + mWidth = static_cast(offsetX); + mHeight = static_cast(offsetY); + + vertices[1].v.ob[0] = 16; + vertices[2].v.ob[1] = 16; + vertices[3].v.ob[0] = 16; + vertices[3].v.ob[1] = 16; + vtx = vertices; +} + +KaleidoEntryIcon::KaleidoEntryIcon(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, + int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, std::string text) + : mIconResourceName(iconResourceName), mIconFormat(iconFormat), mIconSize(iconSize), mIconWidth(iconWidth), + mIconHeight(iconHeight), mIconColor(iconColor), KaleidoEntry(x, y, std::move(text)) { +} + +void KaleidoEntryIcon::RebuildVertices() { + free(vtx); + vtx = nullptr; + BuildVertices(); +} + +void KaleidoEntryIconCountRequired::Update(PlayState* play) { + if (mCount != *mWatch) { mCount = *mWatch; BuildText(); - BuildVertices(); + RebuildVertices(); + mAchieved = mCount >= mRequired; } +} - void KaleidoEntryIconCountRequired::BuildText() { - std::ostringstream totals; - totals << mCount; - if (mRequired != 0 && mCount < mRequired) { - totals << '/' << mRequired; - } - if (mTotal >= mRequired && mCount >= mRequired) { - totals << '/' << mTotal; - } - mText = totals.str(); +KaleidoEntryOcarinaButtons::KaleidoEntryOcarinaButtons(int16_t x, int16_t y) + : KaleidoEntryIcon(gItemIconOcarinaOfTimeTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, + Color_RGBA8{ 255, 255, 255, 255 }, x, y, "\x9F\xA5\xA6\xA7\xA8") { + CalculateColors(); + BuildVertices(); +} + +void KaleidoEntryOcarinaButtons::CalculateColors() { + Color_RGB8 aButtonColor = { 80, 150, 255 }; + if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) { + aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor); + } else if (CVarGetInteger(CVAR_COSMETIC("DefaultColorScheme"), COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) { + aButtonColor = { 80, 255, 150 }; } - - void KaleidoEntryIcon::BuildVertices() { - int offsetY = 0; - int offsetX = 0; - // 4 vertices per character, plus one for the preceding icon. - Vtx* vertices = (Vtx*)calloc(sizeof(Vtx[4]), mText.length() + 1); - // Vertex for the preceding icon. - Ship_CreateQuadVertexGroup(vertices, offsetX, offsetY, mIconWidth, mIconHeight, 0); - offsetX += 18; - for (size_t i = 0; i < mText.length(); i++) { - int charWidth = static_cast(Ship_GetCharFontWidth(mText[i])); - Ship_CreateQuadVertexGroup(&(vertices)[(i + 1) * 4], offsetX, offsetY, charWidth, 16, 0); - offsetX += charWidth; - } - offsetY += FONT_CHAR_TEX_HEIGHT; - mWidth = static_cast(offsetX); - mHeight = static_cast(offsetY); - - vertices[1].v.ob[0] = 16; - vertices[2].v.ob[1] = 16; - vertices[3].v.ob[0] = 16; - vertices[3].v.ob[1] = 16; - vtx = vertices; + mButtonColors[0] = { aButtonColor.r, aButtonColor.g, aButtonColor.b, 255 }; + Color_RGB8 cButtonsColor = { 255, 255, 50 }; + Color_RGB8 cUpButtonColor = cButtonsColor; + Color_RGB8 cDownButtonColor = cButtonsColor; + Color_RGB8 cLeftButtonColor = cButtonsColor; + Color_RGB8 cRightButtonColor = cButtonsColor; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CButtons.Changed"), 0)) { + cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); + cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); + cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); + cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); } - - KaleidoEntryIcon::KaleidoEntryIcon(const char *iconResourceName, int iconFormat, int iconSize, int iconWidth, - int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, std::string text) - : mIconResourceName(iconResourceName), mIconFormat(iconFormat), mIconSize(iconSize), - mIconWidth(iconWidth), mIconHeight(iconHeight), mIconColor(iconColor), - KaleidoEntry(x, y, std::move(text)) {} - - void KaleidoEntryIcon::RebuildVertices() { - free(vtx); - vtx = nullptr; - BuildVertices(); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.Changed"), 0)) { + cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CUpButton.Value"), cUpButtonColor); } - - void KaleidoEntryIconCountRequired::Update(PlayState *play) { - if (mCount != *mWatch) { - mCount = *mWatch; - BuildText(); - RebuildVertices(); - mAchieved = mCount >= mRequired; - } - + if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.Changed"), 0)) { + cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CDownButton.Value"), cDownButtonColor); } - - KaleidoEntryOcarinaButtons::KaleidoEntryOcarinaButtons(int16_t x, int16_t y) : - KaleidoEntryIcon(gItemIconOcarinaOfTimeTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, - Color_RGBA8{ 255, 255, 255, 255 }, x, y, "\x9F\xA5\xA6\xA7\xA8") { - CalculateColors(); - BuildVertices(); + if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.Changed"), 0)) { + cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CLeftButton.Value"), cLeftButtonColor); } - - void KaleidoEntryOcarinaButtons::CalculateColors() { - Color_RGB8 aButtonColor = { 80, 150, 255 }; - if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) { - aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor); - } else if (CVarGetInteger(CVAR_COSMETIC("DefaultColorScheme"), COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) { - aButtonColor = { 80, 255, 150}; - } - mButtonColors[0] = { aButtonColor.r, aButtonColor.g, aButtonColor.b, 255 }; - Color_RGB8 cButtonsColor = { 255, 255, 50 }; - Color_RGB8 cUpButtonColor = cButtonsColor; - Color_RGB8 cDownButtonColor = cButtonsColor; - Color_RGB8 cLeftButtonColor = cButtonsColor; - Color_RGB8 cRightButtonColor = cButtonsColor; - if (CVarGetInteger(CVAR_COSMETIC("HUD.CButtons.Changed"), 0)) { - cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.Changed"), 0)) { - cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CUpButton.Value"), cUpButtonColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.Changed"), 0)) { - cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CDownButton.Value"), cDownButtonColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.Changed"), 0)) { - cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CLeftButton.Value"), cLeftButtonColor); - } - if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.Changed"), 0)) { - cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor); - } - mButtonColors[1] = { cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, 255 }; - mButtonColors[2] = { cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, 255 }; - mButtonColors[3] = { cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, 255 }; - mButtonColors[4] = { cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, 255 }; + if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.Changed"), 0)) { + cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor); } + mButtonColors[1] = { cUpButtonColor.r, cUpButtonColor.g, cUpButtonColor.b, 255 }; + mButtonColors[2] = { cDownButtonColor.r, cDownButtonColor.g, cDownButtonColor.b, 255 }; + mButtonColors[3] = { cLeftButtonColor.r, cLeftButtonColor.g, cLeftButtonColor.b, 255 }; + mButtonColors[4] = { cRightButtonColor.r, cRightButtonColor.g, cRightButtonColor.b, 255 }; +} - void KaleidoEntryOcarinaButtons::Update(PlayState *play) { - mButtonCollected[0] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_A) > 0; - mButtonCollected[1] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_UP) > 0; - mButtonCollected[2] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_DOWN) > 0; - mButtonCollected[3] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_LEFT) > 0; - mButtonCollected[4] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_RIGHT) > 0; - CalculateColors(); - mAchieved = false; - for (int i = 0; i < mButtonCollected.size(); i++) { - if (!mButtonCollected[i]) { - mButtonColors[i] = Color_RGBA8{ 109, 109, 109, 255 }; - } else { - mAchieved = true; - } +void KaleidoEntryOcarinaButtons::Update(PlayState* play) { + mButtonCollected[0] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_A) > 0; + mButtonCollected[1] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_UP) > 0; + mButtonCollected[2] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_DOWN) > 0; + mButtonCollected[3] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_LEFT) > 0; + mButtonCollected[4] = GameInteractor::RawAction::CheckFlag(FLAG_RANDOMIZER_INF, RAND_INF_HAS_OCARINA_C_RIGHT) > 0; + CalculateColors(); + mAchieved = false; + for (int i = 0; i < mButtonCollected.size(); i++) { + if (!mButtonCollected[i]) { + mButtonColors[i] = Color_RGBA8{ 109, 109, 109, 255 }; + } else { + mAchieved = true; } } +} - void KaleidoEntryOcarinaButtons::Draw(PlayState *play, std::vector* mEntryDl) { - if (vtx == nullptr) { - return; - } - size_t numChar = mText.length(); - if (numChar == 0) { - return; - } - - Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); -// Matrix_Scale(0.75f, 0.75f, 0.75f, MTXMODE_APPLY); - - mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); - - // icon - if (!mAchieved) { - mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); - mEntryDl->push_back(gsSPGrayscale(true)); - } - mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); - mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); - LoadIconTex(mEntryDl); - mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); - mEntryDl->push_back(gsSPGrayscale(false)); - - // text - for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { - mEntryDl->push_back(gsDPSetPrimColor(0, 0, mButtonColors[i].r, mButtonColors[i].g, mButtonColors[i].b, mButtonColors[i].a)); - - // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters - // handle loading groups of 16 chars at a time until there are no more left to load. - // By this point 4 vertices have already been loaded for the preceding icon. - if (i % 16 == 0) { - size_t numVtxToLoad = std::min(numChar - i, 16) * 4; - mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); - vtxGroup++; - } - - auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); - auto vertexStart = static_cast(4 * (i % 16)); - - Gfx charTexture[] = { gsDPLoadTextureBlock_4b( - texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; - mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); - mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); - } - mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); +void KaleidoEntryOcarinaButtons::Draw(PlayState* play, std::vector* mEntryDl) { + if (vtx == nullptr) { + return; } -} // Rando + size_t numChar = mText.length(); + if (numChar == 0) { + return; + } + + Matrix_Translate(mX, mY, 0.0f, MTXMODE_APPLY); + // Matrix_Scale(0.75f, 0.75f, 0.75f, MTXMODE_APPLY); + + mEntryDl->push_back(gsSPMatrix(Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW)); + + // icon + if (!mAchieved) { + mEntryDl->push_back(gsDPSetGrayscaleColor(109, 109, 109, 255)); + mEntryDl->push_back(gsSPGrayscale(true)); + } + mEntryDl->push_back(gsDPSetPrimColor(0, 0, mIconColor.r, mIconColor.g, mIconColor.b, mIconColor.a)); + mEntryDl->push_back(gsSPVertex(vtx, 4, 0)); + LoadIconTex(mEntryDl); + mEntryDl->push_back(gsSP1Quadrangle(0, 2, 3, 1, 0)); + mEntryDl->push_back(gsSPGrayscale(false)); + + // text + for (size_t i = 0, vtxGroup = 0; i < numChar; i++) { + mEntryDl->push_back( + gsDPSetPrimColor(0, 0, mButtonColors[i].r, mButtonColors[i].g, mButtonColors[i].b, mButtonColors[i].a)); + + // A maximum of 64 Vtx can be loaded at once by gSPVertex, or basically 16 characters + // handle loading groups of 16 chars at a time until there are no more left to load. + // By this point 4 vertices have already been loaded for the preceding icon. + if (i % 16 == 0) { + size_t numVtxToLoad = std::min(numChar - i, 16) * 4; + mEntryDl->push_back(gsSPVertex(&vtx[4 + (vtxGroup * 16 * 4)], numVtxToLoad, 0)); + vtxGroup++; + } + + auto texture = reinterpret_cast(Ship_GetCharFontTexture(mText[i])); + auto vertexStart = static_cast(4 * (i % 16)); + + Gfx charTexture[] = { gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + mEntryDl->insert(mEntryDl->end(), std::begin(charTexture), std::end(charTexture)); + mEntryDl->push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); + } + mEntryDl->push_back(gsSPPopMatrix(G_MTX_MODELVIEW)); +} +} // namespace Rando void RandoKaleido_RegisterHooks() { - GameInteractor::Instance->RegisterGameHook(RandoKaleido_UpdateMiscCollectibles); + GameInteractor::Instance->RegisterGameHook( + RandoKaleido_UpdateMiscCollectibles); } diff --git a/soh/soh/Enhancements/kaleido.h b/soh/soh/Enhancements/kaleido.h index db86a817e..7776afb66 100644 --- a/soh/soh/Enhancements/kaleido.h +++ b/soh/soh/Enhancements/kaleido.h @@ -2,7 +2,6 @@ #define KALEIDO_H #include - #ifdef __cplusplus #include #include @@ -18,7 +17,7 @@ namespace Rando { * subclasses to declare their Draw and Update functions. */ class KaleidoEntry { -public: + public: /** * @brief Constructor for Base KaleidoEntry class. Sets the position and * initial value of the line of text. @@ -31,7 +30,8 @@ public: virtual void Draw(PlayState* play, std::vector* mEntryDl) = 0; virtual void Update(PlayState* play) = 0; void SetYOffset(int yOffset); -protected: + + protected: int16_t mX; int16_t mY; int16_t mHeight; @@ -39,7 +39,6 @@ protected: Vtx* vtx; std::string mText; bool mAchieved = false; - }; /** @@ -47,7 +46,7 @@ protected: * that wish to render an Icon at the start of their line. */ class KaleidoEntryIcon : public KaleidoEntry { -public: + public: /** * @param iconResourceName resource name of the icon to draw * @param iconFormat flag representing the format of the icon (i.e. G_IM_FMT_IA) @@ -63,7 +62,8 @@ public: Color_RGBA8 iconColor, int16_t x, int16_t y, std::string text = ""); void Draw(PlayState* play, std::vector* mEntryDl) override; void RebuildVertices(); -protected: + + protected: const char* mIconResourceName; int mIconFormat; int mIconSize; @@ -80,7 +80,7 @@ protected: * that is either colored in or Grayscale according to a flag */ class KaleidoEntryIconFlag : public KaleidoEntryIcon { -public : + public: /** * @param iconResourceName resource name of the icon to draw * @param iconFormat flag representing the format of the icon (i.e. G_IM_FMT_IA) @@ -98,7 +98,8 @@ public : Color_RGBA8 iconColor, FlagType flagType, int flag, int16_t x, int16_t y, std::string name = ""); void Update(PlayState* play) override; -private: + + private: FlagType mFlagType; int mFlag; }; @@ -109,7 +110,7 @@ private: * render the count and not show progress towards a required amount or a total. */ class KaleidoEntryIconCountRequired : public KaleidoEntryIcon { -public: + public: /** * @param iconResourceName resource name of the icon to draw * @param iconFormat flag representing the format of the icon (i.e. G_IM_FMT_IA) @@ -126,10 +127,12 @@ public: * @param required The amount of this collectible required to beat the seed. Set to 0 to not render. * @param total The amount of this collectible available in the seed. Set to 0 to not render. */ - KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, int iconHeight, - Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch, int required = 0, int total = 0); + KaleidoEntryIconCountRequired(const char* iconResourceName, int iconFormat, int iconSize, int iconWidth, + int iconHeight, Color_RGBA8 iconColor, int16_t x, int16_t y, int* watch, + int required = 0, int total = 0); void Update(PlayState* play) override; -private: + + private: int* mWatch; int mRequired; int mTotal; @@ -139,11 +142,12 @@ private: }; class KaleidoEntryOcarinaButtons : public KaleidoEntryIcon { -public: + public: KaleidoEntryOcarinaButtons(int16_t x, int16_t y); void Update(PlayState* play) override; void Draw(PlayState* play, std::vector* mEntryDl) override; -private: + + private: void CalculateColors(); std::array mButtonColors = {}; @@ -151,17 +155,18 @@ private: }; class Kaleido { -public: + public: Kaleido(); void Draw(PlayState* play); void Update(PlayState* play); -private: + + private: std::vector> mEntries; std::vector mEntryDl; int mTopIndex = 0; int mNumVisible = 7; }; -} // Rando +} // namespace Rando extern "C" { #endif @@ -172,5 +177,4 @@ void RandoKaleido_UpdateMiscCollectibles(int16_t inDungeonScene); #endif void RandoKaleido_RegisterHooks(); - -#endif //KALEIDO_H +#endif // KALEIDO_H diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index b208d2598..2c357fd34 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -66,7 +66,8 @@ static const ALIGN_ASSET(2) char tokinoma_room_0DL_007FD0[] = dtokinoma_room_0DL /// Switches Link's age and respawns him at the last entrance he entered. void SwitchAge() { - if (gPlayState == NULL) return; + if (gPlayState == NULL) + return; Player* player = GET_PLAYER(gPlayState); @@ -114,14 +115,16 @@ void RegisterOcarinaTimeTravel() { } Actor* player = &GET_PLAYER(gPlayState)->actor; - Actor* nearbyTimeBlockEmpty = Actor_FindNearby(gPlayState, player, ACTOR_OBJ_WARP2BLOCK, ACTORCAT_ITEMACTION, 300.0f); + Actor* nearbyTimeBlockEmpty = + Actor_FindNearby(gPlayState, player, ACTOR_OBJ_WARP2BLOCK, ACTORCAT_ITEMACTION, 300.0f); Actor* nearbyTimeBlock = Actor_FindNearby(gPlayState, player, ACTOR_OBJ_TIMEBLOCK, ACTORCAT_ITEMACTION, 300.0f); Actor* nearbyOcarinaSpot = Actor_FindNearby(gPlayState, player, ACTOR_EN_OKARINA_TAG, ACTORCAT_PROP, 120.0f); Actor* nearbyDoorOfTime = Actor_FindNearby(gPlayState, player, ACTOR_DOOR_TOKI, ACTORCAT_BG, 500.0f); Actor* nearbyFrogs = Actor_FindNearby(gPlayState, player, ACTOR_EN_FR, ACTORCAT_NPC, 300.0f); Actor* nearbyGossipStone = Actor_FindNearby(gPlayState, player, ACTOR_EN_GS, ACTORCAT_NPC, 300.0f); bool justPlayedSoT = gPlayState->msgCtx.lastPlayedSong == OCARINA_SONG_TIME; - bool notNearAnySource = !nearbyTimeBlockEmpty && !nearbyTimeBlock && !nearbyOcarinaSpot && !nearbyDoorOfTime && !nearbyFrogs && !nearbyGossipStone; + bool notNearAnySource = !nearbyTimeBlockEmpty && !nearbyTimeBlock && !nearbyOcarinaSpot && !nearbyDoorOfTime && + !nearbyFrogs && !nearbyGossipStone; bool hasOcarinaOfTime = (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME); bool doesntNeedOcarinaOfTime = CVarGetInteger(CVAR_ENHANCEMENT("TimeTravel"), 0) == 2; bool hasMasterSword = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER); @@ -137,11 +140,11 @@ void RegisterRupeeDash() { if (!CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0)) { return; } - + // Initialize Timer static uint16_t rupeeDashTimer = 0; uint16_t rdmTime = CVarGetInteger(CVAR_ENHANCEMENT("RupeeDashInterval"), 5) * 20; - + // Did time change by DashInterval? if (rupeeDashTimer >= rdmTime) { rupeeDashTimer = 0; @@ -165,10 +168,10 @@ void RegisterShadowTag() { if (!CVarGetInteger(CVAR_ENHANCEMENT("ShadowTag"), 0)) { return; } - if (gPlayState->sceneNum == SCENE_FOREST_TEMPLE && // Forest Temple Scene - gPlayState->roomCtx.curRoom.num == 16 || // Green Poe Room - gPlayState->roomCtx.curRoom.num == 13 || // Blue Poe Room - gPlayState->roomCtx.curRoom.num == 12) { // Red Poe Room + if (gPlayState->sceneNum == SCENE_FOREST_TEMPLE && // Forest Temple Scene + gPlayState->roomCtx.curRoom.num == 16 || // Green Poe Room + gPlayState->roomCtx.curRoom.num == 13 || // Blue Poe Room + gPlayState->roomCtx.curRoom.num == 12) { // Red Poe Room return; } else { if (shouldSpawn && (delayTimer <= 0)) { @@ -191,13 +194,14 @@ void RegisterShadowTag() { static bool hasAffectedHealth = false; void UpdatePermanentHeartLossState() { - if (!GameInteractor::IsSaveLoaded()) return; + if (!GameInteractor::IsSaveLoaded()) + return; if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 0) && hasAffectedHealth) { 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); - + uint8_t startingHealth = + 16 * (IS_RANDO ? (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_HEARTS) + 1) : 3); uint8_t newCapacity = startingHealth + (heartContainers * 16) + ((heartPieces - (heartPieces % 4)) * 4); gSaveContext.healthCapacity = MAX(newCapacity, gSaveContext.healthCapacity); @@ -213,7 +217,8 @@ void RegisterPermanentHeartLoss() { }); GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 0) || !GameInteractor::IsSaveLoaded()) return; + if (!CVarGetInteger(CVAR_ENHANCEMENT("PermanentHeartLoss"), 0) || !GameInteractor::IsSaveLoaded()) + return; if (gSaveContext.healthCapacity > 16 && gSaveContext.healthCapacity - gSaveContext.health >= 16) { gSaveContext.healthCapacity -= 16; @@ -225,12 +230,16 @@ void RegisterPermanentHeartLoss() { void RegisterDeleteFileOnDeath() { GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("DeleteFileOnDeath"), 0) || !GameInteractor::IsSaveLoaded() || gPlayState == NULL) return; + if (!CVarGetInteger(CVAR_ENHANCEMENT("DeleteFileOnDeath"), 0) || !GameInteractor::IsSaveLoaded() || + gPlayState == NULL) + return; if (gPlayState->gameOverCtx.state == GAMEOVER_DEATH_MENU && gPlayState->pauseCtx.state == 9) { SaveManager::Instance->DeleteZeldaFile(gSaveContext.fileNum); hasAffectedHealth = false; - std::reinterpret_pointer_cast(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))->Dispatch("reset"); + std::reinterpret_pointer_cast( + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console")) + ->Dispatch("reset"); } }); } @@ -258,7 +267,10 @@ void RegisterDaytimeGoldSkultullas() { // ZF { SCENE_ZORAS_FOUNTAIN, 0, true, { { ACTOR_EN_SW, { -1891, 187, 1911 }, { 16384, 18022, 0 }, -19964 } } }, // GF - { SCENE_GERUDOS_FORTRESS, 0, false, { { ACTOR_EN_SW, { 1598, 999, -2008 }, { 16384, -16384, 0 }, -19198 } } }, + { SCENE_GERUDOS_FORTRESS, + 0, + false, + { { ACTOR_EN_SW, { 1598, 999, -2008 }, { 16384, -16384, 0 }, -19198 } } }, { SCENE_GERUDOS_FORTRESS, 1, false, { { ACTOR_EN_SW, { 3377, 1734, -4935 }, { 16384, 0, 0 }, -19199 } } }, // Kak { SCENE_KAKARIKO_VILLAGE, 0, false, { { ACTOR_EN_SW, { -18, 540, 1800 }, { 0, -32768, 0 }, -20160 } } }, @@ -293,7 +305,8 @@ void RegisterDaytimeGoldSkultullas() { bool IsHyperBossesActive() { return CVarGetInteger(CVAR_ENHANCEMENT("HyperBosses"), 0) || - (IS_BOSS_RUSH && gSaveContext.ship.quest.data.bossRush.options[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() { @@ -304,53 +317,53 @@ void UpdateHyperBossesState() { } if (IsHyperBossesActive()) { - actorUpdateHookId = GameInteractor::Instance->RegisterGameHook([](void* refActor) { - // Run the update function a second time to make bosses move and act twice as fast. + actorUpdateHookId = + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + // Run the update function a second time to make bosses move and act twice as fast. - Player* player = GET_PLAYER(gPlayState); - Actor* actor = static_cast(refActor); + Player* player = GET_PLAYER(gPlayState); + Actor* actor = static_cast(refActor); - uint8_t isBossActor = - actor->id == ACTOR_BOSS_GOMA || // Gohma - actor->id == ACTOR_BOSS_DODONGO || // King Dodongo - actor->id == ACTOR_EN_BDFIRE || // King Dodongo Fire Breath - actor->id == ACTOR_BOSS_VA || // Barinade - actor->id == ACTOR_BOSS_GANONDROF || // Phantom Ganon - actor->id == ACTOR_EN_FHG_FIRE || // Phantom Ganon/Ganondorf Energy Ball/Thunder - actor->id == ACTOR_EN_FHG || // Phantom Ganon's Horse - actor->id == ACTOR_BOSS_FD || actor->id == ACTOR_BOSS_FD2 || // Volvagia (grounded/flying) - actor->id == ACTOR_EN_VB_BALL || // Volvagia Rocks - actor->id == ACTOR_BOSS_MO || // Morpha - actor->id == ACTOR_BOSS_SST || // Bongo Bongo - actor->id == ACTOR_BOSS_TW || // Twinrova - actor->id == ACTOR_BOSS_GANON || // Ganondorf - actor->id == ACTOR_BOSS_GANON2; // Ganon + uint8_t isBossActor = actor->id == ACTOR_BOSS_GOMA || // Gohma + actor->id == ACTOR_BOSS_DODONGO || // King Dodongo + actor->id == ACTOR_EN_BDFIRE || // King Dodongo Fire Breath + actor->id == ACTOR_BOSS_VA || // Barinade + actor->id == ACTOR_BOSS_GANONDROF || // Phantom Ganon + actor->id == ACTOR_EN_FHG_FIRE || // Phantom Ganon/Ganondorf Energy Ball/Thunder + actor->id == ACTOR_EN_FHG || // Phantom Ganon's Horse + actor->id == ACTOR_BOSS_FD || + actor->id == ACTOR_BOSS_FD2 || // Volvagia (grounded/flying) + actor->id == ACTOR_EN_VB_BALL || // Volvagia Rocks + actor->id == ACTOR_BOSS_MO || // Morpha + actor->id == ACTOR_BOSS_SST || // Bongo Bongo + actor->id == ACTOR_BOSS_TW || // Twinrova + actor->id == ACTOR_BOSS_GANON || // Ganondorf + actor->id == ACTOR_BOSS_GANON2; // Ganon - // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some bosses. - if (IsHyperBossesActive() && isBossActor && !Player_InBlockingCsMode(gPlayState, player)) { - // Barinade needs to be updated in sequence to avoid unintended behaviour. - if (actor->id == ACTOR_BOSS_VA) { - // params -1 is BOSSVA_BODY - if (actor->params == -1) { - Actor* actorList = gPlayState->actorCtx.actorLists[ACTORCAT_BOSS].head; - while (actorList != NULL) { - GameInteractor::RawAction::UpdateActor(actorList); - actorList = actorList->next; + // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some bosses. + if (IsHyperBossesActive() && isBossActor && !Player_InBlockingCsMode(gPlayState, player)) { + // Barinade needs to be updated in sequence to avoid unintended behaviour. + if (actor->id == ACTOR_BOSS_VA) { + // params -1 is BOSSVA_BODY + if (actor->params == -1) { + Actor* actorList = gPlayState->actorCtx.actorLists[ACTORCAT_BOSS].head; + while (actorList != NULL) { + GameInteractor::RawAction::UpdateActor(actorList); + actorList = actorList->next; + } } + } else { + GameInteractor::RawAction::UpdateActor(actor); } - } else { - GameInteractor::RawAction::UpdateActor(actor); } - } - }); + }); } } void RegisterHyperBosses() { UpdateHyperBossesState(); - GameInteractor::Instance->RegisterGameHook([](int16_t fileNum) { - UpdateHyperBossesState(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int16_t fileNum) { UpdateHyperBossesState(); }); } void UpdateHyperEnemiesState() { @@ -361,22 +374,23 @@ void UpdateHyperEnemiesState() { } if (CVarGetInteger(CVAR_ENHANCEMENT("HyperEnemies"), 0)) { - actorUpdateHookId = GameInteractor::Instance->RegisterGameHook([](void* refActor) { - // Run the update function a second time to make enemies and minibosses move and act twice as fast. + actorUpdateHookId = + GameInteractor::Instance->RegisterGameHook([](void* refActor) { + // Run the update function a second time to make enemies and minibosses move and act twice as fast. - Player* player = GET_PLAYER(gPlayState); - Actor* actor = static_cast(refActor); + Player* player = GET_PLAYER(gPlayState); + Actor* actor = static_cast(refActor); - // Some enemies are not in the ACTORCAT_ENEMY category, and some are that aren't really enemies. - bool isEnemy = actor->category == ACTORCAT_ENEMY || actor->id == ACTOR_EN_TORCH2; - bool isExcludedEnemy = actor->id == ACTOR_EN_FIRE_ROCK || actor->id == ACTOR_EN_ENCOUNT2; + // Some enemies are not in the ACTORCAT_ENEMY category, and some are that aren't really enemies. + bool isEnemy = actor->category == ACTORCAT_ENEMY || actor->id == ACTOR_EN_TORCH2; + bool isExcludedEnemy = actor->id == ACTOR_EN_FIRE_ROCK || actor->id == ACTOR_EN_ENCOUNT2; - // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some cutscenes. - if (CVarGetInteger(CVAR_ENHANCEMENT("HyperEnemies"), 0) && isEnemy && !isExcludedEnemy && - !Player_InBlockingCsMode(gPlayState, player)) { - GameInteractor::RawAction::UpdateActor(actor); - } - }); + // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some cutscenes. + if (CVarGetInteger(CVAR_ENHANCEMENT("HyperEnemies"), 0) && isEnemy && !isExcludedEnemy && + !Player_InBlockingCsMode(gPlayState, player)) { + GameInteractor::RawAction::UpdateActor(actor); + } + }); } } @@ -415,7 +429,7 @@ void RegisterBonkDamage() { default: break; } - + Health_ChangeBy(gPlayState, -bonkDamage); // Set invincibility to make Link flash red as a visual damage indicator. Player* player = GET_PLAYER(gPlayState); @@ -428,7 +442,8 @@ void UpdateDirtPathFixState(int32_t sceneNum) { case SCENE_HYRULE_FIELD: case SCENE_KOKIRI_FOREST: case SCENE_HYRULE_CASTLE: - CVarSetInteger(CVAR_Z_FIGHTING_MODE, CVarGetInteger(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_DISABLED)); + CVarSetInteger(CVAR_Z_FIGHTING_MODE, + CVarGetInteger(CVAR_ENHANCEMENT("SceneSpecificDirtPathFix"), ZFIGHT_FIX_DISABLED)); return; default: CVarClear(CVAR_Z_FIGHTING_MODE); @@ -436,9 +451,8 @@ void UpdateDirtPathFixState(int32_t sceneNum) { } void RegisterMenuPathFix() { - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - UpdateDirtPathFixState(sceneNum); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t sceneNum) { UpdateDirtPathFixState(sceneNum); }); } void UpdateMirrorModeState(int32_t sceneNum) { @@ -446,27 +460,28 @@ void UpdateMirrorModeState(int32_t sceneNum) { bool nextMirroredWorld = false; int16_t mirroredMode = CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorldMode"), MIRRORED_WORLD_OFF); - int16_t inDungeon = (sceneNum >= SCENE_DEKU_TREE && sceneNum <= SCENE_INSIDE_GANONS_CASTLE_COLLAPSE && sceneNum != SCENE_THIEVES_HIDEOUT) || + int16_t inDungeon = (sceneNum >= SCENE_DEKU_TREE && sceneNum <= SCENE_INSIDE_GANONS_CASTLE_COLLAPSE && + sceneNum != SCENE_THIEVES_HIDEOUT) || (sceneNum >= SCENE_DEKU_TREE_BOSS && sceneNum <= SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) || (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()->GetSeed() - : gSaveContext.ship.stats.fileCreatedAt); + uint32_t seed = + sceneNum + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(seed); } bool randomMirror = Random(0, 2) == 1; - if ( - mirroredMode == MIRRORED_WORLD_ALWAYS || + if (mirroredMode == MIRRORED_WORLD_ALWAYS || ((mirroredMode == MIRRORED_WORLD_RANDOM || mirroredMode == MIRRORED_WORLD_RANDOM_SEEDED) && randomMirror) || // Dungeon modes - (inDungeon && (mirroredMode == MIRRORED_WORLD_DUNGEONS_ALL || - (mirroredMode == MIRRORED_WORLD_DUNGEONS_VANILLA && !ResourceMgr_IsSceneMasterQuest(sceneNum)) || - (mirroredMode == MIRRORED_WORLD_DUNGEONS_MQ && ResourceMgr_IsSceneMasterQuest(sceneNum)) || - ((mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) && randomMirror))) - ) { + (inDungeon && + (mirroredMode == MIRRORED_WORLD_DUNGEONS_ALL || + (mirroredMode == MIRRORED_WORLD_DUNGEONS_VANILLA && !ResourceMgr_IsSceneMasterQuest(sceneNum)) || + (mirroredMode == MIRRORED_WORLD_DUNGEONS_MQ && ResourceMgr_IsSceneMasterQuest(sceneNum)) || + ((mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM || mirroredMode == MIRRORED_WORLD_DUNGEONS_RANDOM_SEEDED) && + randomMirror)))) { nextMirroredWorld = true; CVarSetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 1); } else { @@ -481,25 +496,33 @@ void UpdateMirrorModeState(int32_t sceneNum) { } void RegisterMirrorModeHandler() { - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - UpdateMirrorModeState(sceneNum); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t sceneNum) { UpdateMirrorModeState(sceneNum); }); } void UpdatePatchHand() { if ((CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0)) && LINK_IS_CHILD) { - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer1", 92, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer1", 92, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer2", 93, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot1", 84, gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot2", 85, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingBowNearDL, "childBow1", 51, gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot1", 84, + gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingHookshotNearDL, "childHookshot2", 85, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingBowNearDL, "childBow1", 51, + gsSPDisplayListOTRFilePath(gLinkChildRightHandClosedNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultRightHandHoldingBowNearDL, "childBow2", 52, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword1", 104, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword2", 105, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword1", 79, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword1", 104, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingMasterSwordNearDL, "childMasterSword2", 105, + gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword1", 79, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword2", 80, gsSPEndDisplayList()); - ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife1", 76, gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); - ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife2", 77, gsSPEndDisplayList()); + ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife1", 76, + gsSPDisplayListOTRFilePath(gLinkChildLeftFistNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife2", 77, + gsSPEndDisplayList()); } else { ResourceMgr_UnpatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "childHammer1"); @@ -514,12 +537,16 @@ void UpdatePatchHand() { ResourceMgr_UnpatchGfxByName(gLinkAdultLeftHandHoldingBgsNearDL, "childBiggoronSword2"); ResourceMgr_UnpatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife1"); ResourceMgr_UnpatchGfxByName(gLinkAdultHandHoldingBrokenGiantsKnifeDL, "childBrokenGiantsKnife2"); - } + } if ((CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0)) && LINK_IS_ADULT) { - ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndKokiriSwordNearDL, "adultKokiriSword", 13, gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkChildRightHandHoldingSlingshotNearDL, "adultSlingshot", 13, gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndBoomerangNearDL, "adultBoomerang", 50, gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); - ResourceMgr_PatchGfxByName(gLinkChildRightFistAndDekuShieldNearDL, "adultDekuShield", 49, gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndKokiriSwordNearDL, "adultKokiriSword", 13, + gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildRightHandHoldingSlingshotNearDL, "adultSlingshot", 13, + gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildLeftFistAndBoomerangNearDL, "adultBoomerang", 50, + gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkChildRightFistAndDekuShieldNearDL, "adultDekuShield", 49, + gsSPDisplayListOTRFilePath(gLinkAdultRightHandClosedNearDL)); } else { ResourceMgr_UnpatchGfxByName(gLinkChildLeftFistAndKokiriSwordNearDL, "adultKokiriSword"); ResourceMgr_UnpatchGfxByName(gLinkChildRightHandHoldingSlingshotNearDL, "adultSlingshot"); @@ -527,7 +554,8 @@ void UpdatePatchHand() { ResourceMgr_UnpatchGfxByName(gLinkChildRightFistAndDekuShieldNearDL, "adultDekuShield"); } if (CVarGetInteger("gEnhancements.FixHammerHand", 0) && LINK_IS_ADULT) { - ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand1", 92, gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); + ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand1", 92, + gsSPDisplayListOTRFilePath(gLinkAdultLeftHandClosedNearDL)); ResourceMgr_PatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand2", 93, gsSPEndDisplayList()); } else { ResourceMgr_UnpatchGfxByName(gLinkAdultLeftHandHoldingHammerNearDL, "hammerHand1"); @@ -536,62 +564,61 @@ void UpdatePatchHand() { } void RegisterPatchHandHandler() { - GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - UpdatePatchHand(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t sceneNum) { UpdatePatchHand(); }); } void RegisterResetNaviTimer() { GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { - if (CVarGetInteger(CVAR_ENHANCEMENT("ResetNaviTimer"), 0)) { - gSaveContext.naviTimer = 0; - } - }); + if (CVarGetInteger(CVAR_ENHANCEMENT("ResetNaviTimer"), 0)) { + gSaveContext.naviTimer = 0; + } + }); } -//this map is used for enemies that can be uniquely identified by their id -//and that are always counted -//enemies that can't be uniquely identified by their id -//or only sometimes count (like ACTOR_EN_TP) -//have to be manually handled in RegisterEnemyDefeatCounts +// this map is used for enemies that can be uniquely identified by their id +// and that are always counted +// enemies that can't be uniquely identified by their id +// or only sometimes count (like ACTOR_EN_TP) +// have to be manually handled in RegisterEnemyDefeatCounts static std::unordered_map uniqueEnemyIdToStatCount = { - { ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS }, - { ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS }, - { ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING }, - { ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI }, - { ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS }, - { ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO }, - { ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI }, - { ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB }, - { ACTOR_EN_TORCH, COUNT_ENEMIES_DEFEATED_DARK_LINK }, - { ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND }, - { ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB }, - { ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO }, - { ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY }, - { ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP }, - { ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER }, - { ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER }, - { ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT }, - { ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE }, - { ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD }, - { ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF }, - { ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA }, - { ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY }, - { ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE }, - { ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB }, - { ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK }, - { ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE }, + { ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS }, + { ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS }, + { ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING }, + { ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI }, + { ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS }, + { ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO }, + { ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI }, + { ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB }, + { ACTOR_EN_TORCH, COUNT_ENEMIES_DEFEATED_DARK_LINK }, + { ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND }, + { ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB }, + { ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO }, + { ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY }, + { ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP }, + { ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER }, + { ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER }, + { ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT }, + { ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE }, + { ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD }, + { ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF }, + { ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA }, + { ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY }, + { ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE }, + { ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB }, + { ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK }, + { ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE }, { ACTOR_EN_PO_SISTERS, COUNT_ENEMIES_DEFEATED_POE_SISTERS }, - { ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM }, - { ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE }, - { ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID }, - { ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE }, - { ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD }, - { ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS }, - { ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER }, - { ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG }, - { ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER }, - { ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA }, + { ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM }, + { ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE }, + { ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID }, + { ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE }, + { ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD }, + { ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS }, + { ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER }, + { ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG }, + { ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER }, + { ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA }, }; void RegisterEnemyDefeatCounts() { @@ -655,16 +682,14 @@ void RegisterEnemyDefeatCounts() { } break; - case ACTOR_EN_REEBA: - { - EnReeba* reeba = (EnReeba*)actor; - if (reeba->isBig) { - gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++; - } else { - gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++; - } + case ACTOR_EN_REEBA: { + EnReeba* reeba = (EnReeba*)actor; + if (reeba->isBig) { + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++; + } else { + gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++; } - break; + } break; case ACTOR_EN_MB: if (actor->params == 0) { @@ -781,26 +806,25 @@ void RegisterBossDefeatTimestamps() { } void UpdateHurtContainerModeState(bool newState) { - static bool hurtEnabled = false; - if (hurtEnabled == newState) { - return; - } + static bool hurtEnabled = false; + if (hurtEnabled == newState) { + return; + } - hurtEnabled = newState; - uint16_t getHeartPieces = gSaveContext.ship.stats.heartPieces / 4; - uint16_t getHeartContainers = gSaveContext.ship.stats.heartContainers; + hurtEnabled = newState; + 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); - } + if (hurtEnabled) { + gSaveContext.healthCapacity = 320 - ((getHeartPieces + getHeartContainers) * 16); + } else { + gSaveContext.healthCapacity = 48 + ((getHeartPieces + getHeartContainers) * 16); + } } void RegisterHurtContainerModeHandler() { - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - UpdateHurtContainerModeState(CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { UpdateHurtContainerModeState(CVarGetInteger(CVAR_ENHANCEMENT("HurtContainer"), 0)); }); } void RegisterRandomizedEnemySizes() { @@ -820,7 +844,8 @@ void RegisterRandomizedEnemySizes() { actor->id == ACTOR_BOSS_FD2 || actor->id == ACTOR_EN_DH; // Only apply to enemies and bosses. - if (!CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0) || (actor->category != ACTORCAT_ENEMY && actor->category != ACTORCAT_BOSS) || excludedEnemy) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemySizes"), 0) || + (actor->category != ACTORCAT_ENEMY && actor->category != ACTORCAT_BOSS) || excludedEnemy) { return; } @@ -860,7 +885,8 @@ void RegisterOpenAllHours() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); - if (CVarGetInteger(CVAR_ENHANCEMENT("OpenAllHours"), 0) && (actor->id == ACTOR_EN_DOOR) && (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOCK_OVERWORLD_DOORS))) { + 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 @@ -892,47 +918,65 @@ void PatchToTMedallions() { ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_StartGrayscale", 7, gsSPGrayscale(true)); if (CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, gsDPSetGrayscaleColor(0, 161, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, + gsDPSetGrayscaleColor(0, 161, 255, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeBlue", 16, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, gsDPSetGrayscaleColor(255, 135, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, + gsDPSetGrayscaleColor(255, 135, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeOrange", 45, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, gsDPSetGrayscaleColor(255, 255, 0, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, gsDPSetGrayscaleColor(255, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, + gsDPSetGrayscaleColor(255, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, + gsDPSetGrayscaleColor(255, 255, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, gsDPSetGrayscaleColor(255, 255, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeYellow", 69, + gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakeYellow", 16, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, gsDPSetGrayscaleColor(0, 255, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, + gsDPSetGrayscaleColor(0, 255, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeGreen", 94, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, gsDPSetGrayscaleColor(255, 0, 0, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, + gsDPSetGrayscaleColor(255, 0, 0, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakeRed", 118, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, gsDPSetGrayscaleColor(212, 0, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, gsDPSetGrayscaleColor(212, 0, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, + gsDPSetGrayscaleColor(212, 0, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, + gsDPSetGrayscaleColor(212, 0, 255, 255)); } else { - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, gsDPSetGrayscaleColor(255, 255, 255, 255)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_MakePurple", 142, + gsDPSetGrayscaleColor(255, 255, 255, 255)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_MakePurple", 27, + gsDPSetGrayscaleColor(255, 255, 255, 255)); } - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist", 160, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); - ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist", 51, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_EndGrayscaleAndEndDlist", 160, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); + ResourceMgr_PatchGfxByName(tokinoma_room_0DL_007FD0, "ToTMedallions_2_EndGrayscaleAndEndDlist", 51, + gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL)); } else { // Unpatch everything ResourceMgr_UnpatchGfxByName(tokinoma_room_0DL_007A70, "ToTMedallions_StartGrayscale"); @@ -953,7 +997,8 @@ void PatchToTMedallions() { void RegisterToTMedallions() { GameInteractor::Instance->RegisterGameHook([](GetItemEntry _unused) { - if (!CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0) || !gPlayState || gPlayState->sceneNum != SCENE_TEMPLE_OF_TIME) { + if (!CVarGetInteger(CVAR_ENHANCEMENT("ToTMedallionsColors"), 0) || !gPlayState || + gPlayState->sceneNum != SCENE_TEMPLE_OF_TIME) { return; } PatchToTMedallions(); @@ -966,7 +1011,6 @@ void RegisterToTMedallions() { }); } - void RegisterFloorSwitchesHook() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { Actor* actor = static_cast(refActor); @@ -991,10 +1035,10 @@ void RegisterPauseMenuHooks() { return; } if (!pauseWarpHooksRegistered) { - GameInteractor::Instance->RegisterGameHook([]() {PauseWarp_HandleSelection();}); - GameInteractor::Instance->RegisterGameHook([]() { - PauseWarp_Execute(); - }); + GameInteractor::Instance->RegisterGameHook( + []() { PauseWarp_HandleSelection(); }); + GameInteractor::Instance->RegisterGameHook( + []() { PauseWarp_Execute(); }); pauseWarpHooksRegistered = true; } }); @@ -1004,7 +1048,6 @@ void RegisterCustomSkeletons() { static int8_t previousTunic = -1; GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded() || gPlayState == NULL) { return; } diff --git a/soh/soh/Enhancements/nametag.cpp b/soh/soh/Enhancements/nametag.cpp index 131f9b724..253c0980b 100644 --- a/soh/soh/Enhancements/nametag.cpp +++ b/soh/soh/Enhancements/nametag.cpp @@ -19,15 +19,15 @@ extern PlayState* gPlayState; typedef struct { Actor* actor; - std::string text; // Original text + std::string text; // Original text std::string processedText; // Text filtered for supported font textures - const char* tag; // Tag identifier - Color_RGBA8 textColor; // Text color override. Global color is used if alpha is 0 - int16_t height; // Textbox height - int16_t width; // Textbox width - int16_t yOffset; // Addition Y offset - Mtx* mtx; // Allocated Mtx for rendering - Vtx* vtx; // Allocated Vtx for rendering + const char* tag; // Tag identifier + Color_RGBA8 textColor; // Text color override. Global color is used if alpha is 0 + int16_t height; // Textbox height + int16_t width; // Textbox width + int16_t yOffset; // Addition Y offset + Mtx* mtx; // Allocated Mtx for rendering + Vtx* vtx; // Allocated Vtx for rendering } NameTag; static std::vector nameTags; @@ -69,7 +69,7 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { return; } - Color_RGBA8 textboxColor = { 0, 0, 0, 80}; + Color_RGBA8 textboxColor = { 0, 0, 0, 80 }; Color_RGBA8 textColor = { 255, 255, 255, 255 }; if (CVarGetInteger(CVAR_COSMETIC("HUD.NameTagActorBackground.Changed"), 0)) { @@ -130,9 +130,9 @@ void DrawNameTag(PlayState* play, const NameTag* nameTag) { int16_t vertexStart = 4 * (i % 16); // Multi-instruction macro, need to insert all to the dl buffer - Gfx charTexture[] = { gsDPLoadTextureBlock_4b( - texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, G_TX_NOMIRROR | G_TX_CLAMP, - G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; + Gfx charTexture[] = { gsDPLoadTextureBlock_4b(texture, G_IM_FMT_I, FONT_CHAR_TEX_WIDTH, FONT_CHAR_TEX_HEIGHT, 0, + G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD) }; nameTagDl.insert(nameTagDl.end(), std::begin(charTexture), std::end(charTexture)); nameTagDl.push_back(gsSP1Quadrangle(vertexStart, vertexStart + 2, vertexStart + 3, vertexStart + 1, 0)); @@ -195,11 +195,14 @@ extern "C" void NameTag_RegisterForActorWithOptions(Actor* actor, const char* te std::string processedText = std::string(Interface_ReplaceSpecialCharacters((char*)text)); // Strip out unsupported characters - processedText.erase(std::remove_if(processedText.begin(), processedText.end(), [](const char& c) { - // 172 is max supported texture for the in-game font system, - // and filter anything less than a space but not the newline or nul characters - return (unsigned char)c > 172 || (c < ' ' && c != '\n' && c != '\0'); - }), processedText.end()); + processedText.erase(std::remove_if(processedText.begin(), processedText.end(), + [](const char& c) { + // 172 is max supported texture for the in-game font system, + // and filter anything less than a space but not the newline or nul + // characters + return (unsigned char)c > 172 || (c < ' ' && c != '\n' && c != '\0'); + }), + processedText.end()); int16_t numChar = processedText.length(); int16_t numLines = 1; diff --git a/soh/soh/Enhancements/nametag.h b/soh/soh/Enhancements/nametag.h index 9fd26643e..98b83f7cc 100644 --- a/soh/soh/Enhancements/nametag.h +++ b/soh/soh/Enhancements/nametag.h @@ -3,8 +3,8 @@ #include typedef struct { - const char* tag; // Tag identifier to filter/remove multiple tags - int16_t yOffset; // Additional Y offset to apply for the name tag + const char* tag; // Tag identifier to filter/remove multiple tags + int16_t yOffset; // Additional Y offset to apply for the name tag Color_RGBA8 textColor; // Text color override. Global color is used if alpha is 0 } NameTagOptions; diff --git a/soh/soh/Enhancements/pausewarp.c b/soh/soh/Enhancements/pausewarp.c index 4934f6050..10f7e4e39 100644 --- a/soh/soh/Enhancements/pausewarp.c +++ b/soh/soh/Enhancements/pausewarp.c @@ -4,49 +4,37 @@ #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, +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, }; static const int ocarinaSongMap[] = { - OCARINA_SONG_MINUET, - OCARINA_SONG_BOLERO, - OCARINA_SONG_SERENADE, - OCARINA_SONG_REQUIEM, - OCARINA_SONG_NOCTURNE, - OCARINA_SONG_PRELUDE, + OCARINA_SONG_MINUET, OCARINA_SONG_BOLERO, OCARINA_SONG_SERENADE, + OCARINA_SONG_REQUIEM, OCARINA_SONG_NOCTURNE, OCARINA_SONG_PRELUDE, }; static const int entranceIndexMap[] = { - ENTR_SACRED_FOREST_MEADOW_WARP_PAD, // Minuet + ENTR_SACRED_FOREST_MEADOW_WARP_PAD, // Minuet ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, // Bolero - ENTR_LAKE_HYLIA_WARP_PAD, // Serenade - ENTR_DESERT_COLOSSUS_WARP_PAD, // Requiem - ENTR_GRAVEYARD_WARP_PAD, // Nocturne - ENTR_TEMPLE_OF_TIME_WARP_PAD, // Prelude + ENTR_LAKE_HYLIA_WARP_PAD, // Serenade + ENTR_DESERT_COLOSSUS_WARP_PAD, // Requiem + ENTR_GRAVEYARD_WARP_PAD, // Nocturne + ENTR_TEMPLE_OF_TIME_WARP_PAD, // Prelude }; -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, +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, }; -static bool isWarpActive = false; +static bool isWarpActive = false; void PauseWarp_Execute() { if (!isWarpActive || gPlayState->msgCtx.msgMode != MSGMODE_NONE) { return; } - isWarpActive = false; + isWarpActive = false; GET_PLAYER(gPlayState)->stateFlags1 &= ~PLAYER_STATE1_IN_CUTSCENE; if (gPlayState->msgCtx.choiceIndex != 0) { return; @@ -88,41 +76,42 @@ 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)) { + 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); + 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); + 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); + 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); + 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); + 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); + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP); break; } if (!canplay) { diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp index fcab083b4..cec16a468 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp @@ -5,40 +5,76 @@ namespace CustomMessages { using namespace std::literals::string_literals; - std::string MESSAGE_END() { return "\x7F\x00"s; } - std::string WAIT_FOR_INPUT() { return "\x7F\x01"s; } - std::string HORIZONTAL_SPACE(uint8_t x) { - return "\x7F\x02"s + char(x); - } - std::string GO_TO(uint16_t x) { - return "\x7F\x03"s + char(x >> 8) + char(x & 0x00FF); - } - std::string INSTANT_TEXT_ON() { return "\x7F\x04"s; } - std::string INSTANT_TEXT_OFF() { return "\x7F\x05"s; } - std::string SHOP_MESSAGE_BOX() { return "\x7F\x06\x00"s; } - std::string EVENT_TRIGGER() { return "\x7F\x07"s; } - std::string DELAY_FRAMES(uint8_t x) { - return "\x7F\x08"s + char(x); - } - std::string CLOSE_AFTER(uint8_t x) { - return "\x7F\x0A"s + char(x); - } - std::string PLAYER_NAME() { return "\x7F\x0B"s; } - std::string PLAY_OCARINA() { return "\x7F\x0C"s; } - std::string ITEM_OBTAINED(uint8_t x) { - return "\x7F\x0F"s + char(x); - } - std::string SET_SPEED(uint8_t x) { - return "\x7F\x10"s + char(x); - } - std::string SKULLTULAS_DESTROYED() { return "\x7F\x15"s; } - std::string CURRENT_TIME() { return "\x7F\x17"s; } - std::string UNSKIPPABLE() { return "\x7F\x19"s; } - std::string TWO_WAY_CHOICE() { return "\x1B"s; } - std::string NEWLINE() { return "\x7F\x1C"s; } - std::string COLOR(std::string x) { return "\x7F\x1D"s + x; } - std::string CENTER_TEXT() { return "\x7F\x1E"s; } - std::string IF_NOT_MQ() { return "\x7F\x29"s; } - std::string MQ_ELSE() { return "\x7F\x2A"s; } - std::string MQ_END() { return "\x7F\x2B"s; } +std::string MESSAGE_END() { + return "\x7F\x00"s; } +std::string WAIT_FOR_INPUT() { + return "\x7F\x01"s; +} +std::string HORIZONTAL_SPACE(uint8_t x) { + return "\x7F\x02"s + char(x); +} +std::string GO_TO(uint16_t x) { + return "\x7F\x03"s + char(x >> 8) + char(x & 0x00FF); +} +std::string INSTANT_TEXT_ON() { + return "\x7F\x04"s; +} +std::string INSTANT_TEXT_OFF() { + return "\x7F\x05"s; +} +std::string SHOP_MESSAGE_BOX() { + return "\x7F\x06\x00"s; +} +std::string EVENT_TRIGGER() { + return "\x7F\x07"s; +} +std::string DELAY_FRAMES(uint8_t x) { + return "\x7F\x08"s + char(x); +} +std::string CLOSE_AFTER(uint8_t x) { + return "\x7F\x0A"s + char(x); +} +std::string PLAYER_NAME() { + return "\x7F\x0B"s; +} +std::string PLAY_OCARINA() { + return "\x7F\x0C"s; +} +std::string ITEM_OBTAINED(uint8_t x) { + return "\x7F\x0F"s + char(x); +} +std::string SET_SPEED(uint8_t x) { + return "\x7F\x10"s + char(x); +} +std::string SKULLTULAS_DESTROYED() { + return "\x7F\x15"s; +} +std::string CURRENT_TIME() { + return "\x7F\x17"s; +} +std::string UNSKIPPABLE() { + return "\x7F\x19"s; +} +std::string TWO_WAY_CHOICE() { + return "\x1B"s; +} +std::string NEWLINE() { + return "\x7F\x1C"s; +} +std::string COLOR(std::string x) { + return "\x7F\x1D"s + x; +} +std::string CENTER_TEXT() { + return "\x7F\x1E"s; +} +std::string IF_NOT_MQ() { + return "\x7F\x29"s; +} +std::string MQ_ELSE() { + return "\x7F\x2A"s; +} +std::string MQ_END() { + return "\x7F\x2B"s; +} +} // namespace CustomMessages diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 356bc507b..e5e22ad1d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -20,270 +20,287 @@ using namespace Rando; - static bool placementFailure = false; +PriceSettingsStruct shopsanityPrices = { + RSK_SHOPSANITY_PRICES, + RSK_SHOPSANITY_PRICES_FIXED_PRICE, + RSK_SHOPSANITY_PRICES_RANGE_1, + RSK_SHOPSANITY_PRICES_RANGE_2, + RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT, + RSK_SHOPSANITY_PRICES_AFFORDABLE, +}; -PriceSettingsStruct shopsanityPrices = {RSK_SHOPSANITY_PRICES, - RSK_SHOPSANITY_PRICES_FIXED_PRICE, - RSK_SHOPSANITY_PRICES_RANGE_1, - RSK_SHOPSANITY_PRICES_RANGE_2, - RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT, - RSK_SHOPSANITY_PRICES_AFFORDABLE, }; - -PriceSettingsStruct scrubPrices = {RSK_SCRUBS_PRICES, - RSK_SCRUBS_PRICES_FIXED_PRICE, - RSK_SCRUBS_PRICES_RANGE_1, - RSK_SCRUBS_PRICES_RANGE_2, - RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT, - RSK_SCRUBS_PRICES_AFFORDABLE, }; +PriceSettingsStruct scrubPrices = { + RSK_SCRUBS_PRICES, + RSK_SCRUBS_PRICES_FIXED_PRICE, + RSK_SCRUBS_PRICES_RANGE_1, + RSK_SCRUBS_PRICES_RANGE_2, + RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT, + RSK_SCRUBS_PRICES_AFFORDABLE, +}; -PriceSettingsStruct merchantPrices = {RSK_MERCHANT_PRICES, - RSK_MERCHANT_PRICES_FIXED_PRICE, - RSK_MERCHANT_PRICES_RANGE_1, - RSK_MERCHANT_PRICES_RANGE_2, - RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT, - RSK_MERCHANT_PRICES_AFFORDABLE, }; +PriceSettingsStruct merchantPrices = { + RSK_MERCHANT_PRICES, + RSK_MERCHANT_PRICES_FIXED_PRICE, + RSK_MERCHANT_PRICES_RANGE_1, + RSK_MERCHANT_PRICES_RANGE_2, + RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT, + RSK_MERCHANT_PRICES_AFFORDABLE, +}; static void RemoveStartingItemsFromPool() { - for (RandomizerGet startingItem : StartingInventory) { - for (size_t i = 0; i < ItemPool.size(); i++) { - if (startingItem == RG_BIGGORON_SWORD) { - if (ItemPool[i] == RG_GIANTS_KNIFE || ItemPool[i] == RG_BIGGORON_SWORD) { - ItemPool[i] = GetJunkItem(); + for (RandomizerGet startingItem : StartingInventory) { + for (size_t i = 0; i < ItemPool.size(); i++) { + if (startingItem == RG_BIGGORON_SWORD) { + if (ItemPool[i] == RG_GIANTS_KNIFE || ItemPool[i] == RG_BIGGORON_SWORD) { + ItemPool[i] = GetJunkItem(); + } + continue; + } else if (startingItem == ItemPool[i] || (Rando::StaticData::RetrieveItem(startingItem).IsBottleItem() && + Rando::StaticData::RetrieveItem(ItemPool[i]).IsBottleItem())) { + if (AdditionalHeartContainers > 0 && + (startingItem == RG_PIECE_OF_HEART || startingItem == RG_TREASURE_GAME_HEART)) { + ItemPool[i] = RG_HEART_CONTAINER; + AdditionalHeartContainers--; + } else { + ItemPool[i] = GetJunkItem(); + } + break; + } } - continue; - } else if (startingItem == ItemPool[i] || (Rando::StaticData::RetrieveItem(startingItem).IsBottleItem() && - Rando::StaticData::RetrieveItem(ItemPool[i]).IsBottleItem())) { - if (AdditionalHeartContainers > 0 && - (startingItem == RG_PIECE_OF_HEART || startingItem == RG_TREASURE_GAME_HEART)) { - ItemPool[i] = RG_HEART_CONTAINER; - AdditionalHeartContainers--; - } else { - ItemPool[i] = GetJunkItem(); - } - break; - } } - } } -static void PropagateTimeTravel(GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, - bool stopOnBeatable = false, bool addToPlaythrough = false){ - //special check for temple of time - if(gals.haveTimeAccess && gals.foundTempleOfTime && gals.validatedStartingRegion){ - if (!RegionTable(RR_ROOT)->Adult() && RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Child()) { //RANDOTODO: sphere weirdness, other age locations not propagated in this sphere - RegionTable(RR_ROOT)->adultDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childDay; - RegionTable(RR_ROOT)->adultNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childNight; - ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); - } else if (!RegionTable(RR_ROOT)->Child() && RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult()){ - RegionTable(RR_ROOT)->childDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultDay; - RegionTable(RR_ROOT)->childNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultNight; - ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); +static void PropagateTimeTravel(GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, + bool stopOnBeatable = false, bool addToPlaythrough = false) { + // special check for temple of time + if (gals.haveTimeAccess && gals.foundTempleOfTime && gals.validatedStartingRegion) { + if (!RegionTable(RR_ROOT)->Adult() && + RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME) + ->Child()) { // RANDOTODO: sphere weirdness, other age locations not propagated in this sphere + RegionTable(RR_ROOT)->adultDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childDay; + RegionTable(RR_ROOT)->adultNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->childNight; + ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); + } else if (!RegionTable(RR_ROOT)->Child() && RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->Adult()) { + RegionTable(RR_ROOT)->childDay = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultDay; + RegionTable(RR_ROOT)->childNight = RegionTable(RR_TOT_BEYOND_DOOR_OF_TIME)->adultNight; + ProcessRegion(RegionTable(RR_ROOT), gals, ignore, stopOnBeatable, addToPlaythrough); + } } - } } -//This function will propagate Time of Day access through the entrance +// This function will propagate Time of Day access through the entrance static bool UpdateToDAccess(Entrance* entrance, Region* connection) { - StartPerformanceTimer(PT_TOD_ACCESS); + StartPerformanceTimer(PT_TOD_ACCESS); - bool ageTimePropogated = false; - Region* parent = entrance->GetParentRegion(); + bool ageTimePropogated = false; + Region* parent = entrance->GetParentRegion(); - if (!connection->childDay && parent->childDay && entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) { - connection->childDay = true; - ageTimePropogated = true; - } - if (!connection->childNight && parent->childNight && entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) { - connection->childNight = true; - ageTimePropogated = true; - } - if (!connection->adultDay && parent->adultDay && entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) { - connection->adultDay = true; - ageTimePropogated = true; - } - if (!connection->adultNight && parent->adultNight && entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) { - connection->adultNight = true; - ageTimePropogated = true; - } + if (!connection->childDay && parent->childDay && entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) { + connection->childDay = true; + ageTimePropogated = true; + } + if (!connection->childNight && parent->childNight && + entrance->CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) { + connection->childNight = true; + ageTimePropogated = true; + } + if (!connection->adultDay && parent->adultDay && entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) { + connection->adultDay = true; + ageTimePropogated = true; + } + if (!connection->adultNight && parent->adultNight && + entrance->CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) { + connection->adultNight = true; + ageTimePropogated = true; + } - StopPerformanceTimer(PT_TOD_ACCESS); - return ageTimePropogated; + StopPerformanceTimer(PT_TOD_ACCESS); + return ageTimePropogated; } // Check if key locations in the overworld are accessable static void ValidateOtherEntrance(GetAccessibleLocationsStruct& gals) { - auto ctx = Rando::Context::GetInstance(); - // Condition for validating Temple of Time Access - 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->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); - - if ((childAccess && (kokiri->Child() || kakariko->Child())) ||// RANDOTODO when proper ammo logic is done, this could probably be made optional - (adultAccess && (kokiri->Adult() || kakariko->Adult()))) { - gals.validatedStartingRegion = true; - ApplyStartingInventory(); // RANDOTODO when proper ammo logic is done, this could be moved to the start + auto ctx = Rando::Context::GetInstance(); + // Condition for validating Temple of Time Access + 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->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); + + if ((childAccess && + (kokiri->Child() || + kakariko->Child())) || // RANDOTODO when proper ammo logic is done, this could probably be made optional + (adultAccess && (kokiri->Adult() || kakariko->Adult()))) { + gals.validatedStartingRegion = true; + ApplyStartingInventory(); // RANDOTODO when proper ammo logic is done, this could be moved to the start + } + } + // If we are not shuffling the guard house, add the key so we can properly check for poe merchant access + if (gals.validatedStartingRegion && gals.foundTempleOfTime && + !ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)) { + Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); } - } - //If we are not shuffling the guard house, add the key so we can properly check for poe merchant access - if (gals.validatedStartingRegion && gals.foundTempleOfTime && !ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)){ - Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); - } } // Apply all items that are necessary for checking all location access -static void ApplyAllAdvancmentItems(){ - std::vector itemsToPlace = - FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); - for (RandomizerGet unplacedItem : itemsToPlace) { - Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); - } +static void ApplyAllAdvancmentItems() { + std::vector itemsToPlace = + FilterFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + for (RandomizerGet unplacedItem : itemsToPlace) { + Rando::StaticData::RetrieveItem(unplacedItem).ApplyEffect(); + } } // Check if everything in an entrance rando seed that needs to be avalible without items, is, // and if so allow obtaining items in logic -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->AreCheckingBigPoes || logic->CanEmptyBigPoes) && gals.validatedStartingRegion && gals.foundTempleOfTime && gals.haveTimeAccess) { - //stop checking for big poes - logic->AreCheckingBigPoes = false; - // Apply all items that are necessary for checking all location access - ApplyAllAdvancmentItems(); - // Reset access as the non-starting age - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - for (RandomizerRegion regionKey : gals.regionPool) { - RegionTable(regionKey)->adultDay = false; - RegionTable(regionKey)->adultNight = false; - } - } else { - for (RandomizerRegion regionKey : gals.regionPool) { - RegionTable(regionKey)->childDay = false; - RegionTable(regionKey)->childNight = false; - } +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->AreCheckingBigPoes || logic->CanEmptyBigPoes) && gals.validatedStartingRegion && + gals.foundTempleOfTime && gals.haveTimeAccess) { + // stop checking for big poes + logic->AreCheckingBigPoes = false; + // Apply all items that are necessary for checking all location access + ApplyAllAdvancmentItems(); + // Reset access as the non-starting age + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + for (RandomizerRegion regionKey : gals.regionPool) { + RegionTable(regionKey)->adultDay = false; + RegionTable(regionKey)->adultNight = false; + } + } else { + for (RandomizerRegion regionKey : gals.regionPool) { + RegionTable(regionKey)->childDay = false; + RegionTable(regionKey)->childNight = false; + } + } + // RANDOTODO do we want to keep the region pool after this reset? + // It's a lot of potential looping over regions we have no access to + gals.sphereZeroComplete = true; } - //RANDOTODO do we want to keep the region pool after this reset? - //It's a lot of potential looping over regions we have no access to - gals.sphereZeroComplete = true; - } } -//This function handles each possible exit -void ProcessExits(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, - bool stopOnBeatable = false, bool addToPlaythrough = false){ - auto ctx = Rando::Context::GetInstance(); - for (auto& exit : region->exits) { - Region* exitRegion = exit.GetConnectedRegion(); - //Update Time of Day Access for the exit - if (UpdateToDAccess(&exit, exitRegion)) { - gals.logicUpdated = true; - if (!gals.sphereZeroComplete){ - if (!gals.foundTempleOfTime || !gals.validatedStartingRegion){ - ValidateOtherEntrance(gals); +// This function handles each possible exit +void ProcessExits(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, + bool stopOnBeatable = false, bool addToPlaythrough = false) { + auto ctx = Rando::Context::GetInstance(); + for (auto& exit : region->exits) { + Region* exitRegion = exit.GetConnectedRegion(); + // Update Time of Day Access for the exit + if (UpdateToDAccess(&exit, exitRegion)) { + gals.logicUpdated = true; + if (!gals.sphereZeroComplete) { + if (!gals.foundTempleOfTime || !gals.validatedStartingRegion) { + ValidateOtherEntrance(gals); + } + ValidateSphereZero(gals); + } + // process the region we just expanded to, to reduce looping + ProcessRegion(exitRegion, gals, ignore, stopOnBeatable, addToPlaythrough); } - ValidateSphereZero(gals); - } - //process the region we just expanded to, to reduce looping - ProcessRegion(exitRegion, gals, ignore, stopOnBeatable, addToPlaythrough); - } - //If the exit is accessible and hasn't been added yet, add it to the pool - //RANDOTODO do we want to add the region after the loop now, considering we - //are processing the new region immediately. Maybe a reverse for loop in ProcessRegion? - if (!exitRegion->addedToPool && exit.ConditionsMet()) { - exitRegion->addedToPool = true; - gals.regionPool.push_back(exit.GetConnectedRegionKey()); - } - - if (addToPlaythrough){ - // RANDOTODO Should this match the regular spheres? - // Add shuffled entrances to the entrance playthrough - // Include bluewarps when unshuffled but dungeon or boss shuffle is on - if((exit.IsShuffled() || (exit.GetType() == Rando::EntranceType::BlueWarp && - (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES)))) && - !exit.IsAddedToPool() && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { - gals.entranceSphere.push_back(&exit); - exit.AddToPool(); - // Don't list a two-way coupled entrance from both directions - if (exit.GetReverse() != nullptr && exit.GetReplacement()->GetReverse() != nullptr && !exit.IsDecoupled()) { - exit.GetReplacement()->GetReverse()->AddToPool(); + // If the exit is accessible and hasn't been added yet, add it to the pool + // RANDOTODO do we want to add the region after the loop now, considering we + // are processing the new region immediately. Maybe a reverse for loop in ProcessRegion? + if (!exitRegion->addedToPool && exit.ConditionsMet()) { + exitRegion->addedToPool = true; + gals.regionPool.push_back(exit.GetConnectedRegionKey()); + } + + if (addToPlaythrough) { + // RANDOTODO Should this match the regular spheres? + // Add shuffled entrances to the entrance playthrough + // Include bluewarps when unshuffled but dungeon or boss shuffle is on + if ((exit.IsShuffled() || + (exit.GetType() == Rando::EntranceType::BlueWarp && + (ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES)))) && + !exit.IsAddedToPool() && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { + gals.entranceSphere.push_back(&exit); + exit.AddToPool(); + // Don't list a two-way coupled entrance from both directions + if (exit.GetReverse() != nullptr && exit.GetReplacement()->GetReverse() != nullptr && + !exit.IsDecoupled()) { + exit.GetReplacement()->GetReverse()->AddToPool(); + } + } } - } } - } } - -//Get the max number of tokens that can possibly be useful +// Get the max number of tokens that can possibly be useful static int GetMaxGSCount() { - auto ctx = Rando::Context::GetInstance(); - //If bridge or LACS is set to tokens, get how many are required - int maxBridge = 0; - int maxLACS = 0; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - 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).Get(); - } - maxBridge = std::max(maxBridge, maxLACS); - //Get the max amount of GS which could be useful from token reward locations - int maxUseful = 0; - //If the highest advancement item is a token, we know it is useless since it won't lead to an otherwise useful item - if (ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 100; - } else if (ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 50; - } else if (ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 40; - } else if (ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 30; - } else if (ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - maxUseful = 20; - } else if (ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && - ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { - 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).Get(); + auto ctx = Rando::Context::GetInstance(); + // If bridge or LACS is set to tokens, get how many are required + int maxBridge = 0; + int maxLACS = 0; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { + 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).Get(); + } + maxBridge = std::max(maxBridge, maxLACS); + // Get the max amount of GS which could be useful from token reward locations + int maxUseful = 0; + // If the highest advancement item is a token, we know it is useless since it won't lead to an otherwise useful item + if (ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 100; + } else if (ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_50_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 50; + } else if (ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_40_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 40; + } else if (ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_30_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 30; + } else if (ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_20_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + maxUseful = 20; + } else if (ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().IsAdvancement() && + ctx->GetItemLocation(RC_KAK_10_GOLD_SKULLTULA_REWARD)->GetPlacedItem().GetItemType() != ITEMTYPE_TOKEN) { + 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).Get(); } std::string GetShopItemBaseName(std::string itemName) { - std::string baseName = itemName.erase(0, 4); //Delete "Buy " - //Delete amount, if present (so when it looks like Buy Deku Nut (10) remove the (10)) - if (baseName.find("(") != std::string::npos) { - baseName = baseName.erase(baseName.find("(")); - } - //Do the same for [] (only applies to red potions, other things with [] also have a ()) - if (baseName.find("[") != std::string::npos) { - baseName = baseName.erase(baseName.find("[")); - } - return baseName; + std::string baseName = itemName.erase(0, 4); // Delete "Buy " + // Delete amount, if present (so when it looks like Buy Deku Nut (10) remove the (10)) + if (baseName.find("(") != std::string::npos) { + baseName = baseName.erase(baseName.find("(")); + } + // Do the same for [] (only applies to red potions, other things with [] also have a ()) + if (baseName.find("[") != std::string::npos) { + baseName = baseName.erase(baseName.find("[")); + } + return baseName; } std::vector GetEmptyLocations(std::vector targetLocations) { @@ -300,501 +317,512 @@ std::vector GetAllEmptyLocations() { }); } -bool IsBombchus(RandomizerGet item, bool includeShops = false){ - return (item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS || - (includeShops && (item == RG_BUY_BOMBCHUS_10 || item == RG_BUY_BOMBCHUS_20)); +bool IsBombchus(RandomizerGet item, bool includeShops = false) { + return (item >= RG_BOMBCHU_5 && item <= RG_BOMBCHU_20) || item == RG_PROGRESSIVE_BOMBCHUS || + (includeShops && (item == RG_BUY_BOMBCHUS_10 || item == RG_BUY_BOMBCHUS_20)); } -bool IsBeatableWithout(RandomizerCheck excludedCheck, bool replaceItem, RandomizerGet ignore = RG_NONE){ //RANDOTODO make excludCheck an ItemLocation - auto ctx = Rando::Context::GetInstance(); - RandomizerGet copy = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); //Copy out item - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); //Write in empty item - ctx->playthroughBeatable = false; - logic->Reset(); - CheckBeatable(ignore); - if (replaceItem){ - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(copy); //Immediately put item back - } - return ctx->playthroughBeatable; +bool IsBeatableWithout(RandomizerCheck excludedCheck, bool replaceItem, + RandomizerGet ignore = RG_NONE) { // RANDOTODO make excludCheck an ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerGet copy = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); // Copy out item + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); // Write in empty item + ctx->playthroughBeatable = false; + logic->Reset(); + CheckBeatable(ignore); + if (replaceItem) { + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(copy); // Immediately put item back + } + return ctx->playthroughBeatable; } // Reset non-Logic-class logic, and optionally apply the initial inventory -void ResetLogic(std::shared_ptr& ctx, GetAccessibleLocationsStruct& gals, bool applyInventory = false){ - gals.timePassChildDay = true; - gals.timePassChildNight = true; - gals.timePassAdultDay = true; - gals.timePassAdultNight = true; - gals.haveTimeAccess = true; - gals.foundTempleOfTime = true; - gals.validatedStartingRegion = true; - gals.sphereZeroComplete = true; - if (applyInventory){ - ApplyStartingInventory(); - } - Regions::AccessReset(); - ctx->LocationReset(); -} - -//Generate the playthrough, so we want to add advancement items, unless we know to ignore them -void AddToPlaythrough(LocationAccess& locPair, GetAccessibleLocationsStruct& gals){ - auto ctx = Rando::Context::GetInstance(); - RandomizerCheck loc = locPair.GetLocation(); - Rando::ItemLocation* location = ctx->GetItemLocation(loc); - RandomizerGet locItem = location->GetPlacedRandomizerGet(); - //Item is an advancement item, figure out if it should be added to this sphere - if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { - ItemType type = location->GetPlacedItem().GetItemType(); - - //Decide whether to exclude this location - //This preprocessing is done to reduce the amount of searches performed in PareDownPlaythrough - //Want to exclude: - //1) Tokens after the last potentially useful one (the last one that gives an advancement item or last for token bridge) - //2) Buy items of the same type, after the first (So only see Buy Deku Nut of any amount once) - bool exclude = true; - //Exclude tokens after the last possibly useful one - if (type == ITEMTYPE_TOKEN && gals.gsCount < gals.maxGsCount) { - gals.gsCount++; - exclude = false; +void ResetLogic(std::shared_ptr& ctx, GetAccessibleLocationsStruct& gals, bool applyInventory = false) { + gals.timePassChildDay = true; + gals.timePassChildNight = true; + gals.timePassAdultDay = true; + gals.timePassAdultNight = true; + gals.haveTimeAccess = true; + gals.foundTempleOfTime = true; + gals.validatedStartingRegion = true; + gals.sphereZeroComplete = true; + if (applyInventory) { + ApplyStartingInventory(); } - //Handle buy items - //If ammo drops are off, don't do this step, since buyable ammo becomes logically important - // TODO: Reimplement Ammo Drops setting - else if (/*AmmoDrops.IsNot(AMMODROPS_NONE) &&*/ type == ITEMTYPE_SHOP) { - //Only check each buy item once - auto buyItem = location->GetPlacedItem().GetLogicVal(); - //Buy item not in list to ignore, add it to list and write to playthrough - if (std::find(gals.buyIgnores.begin(), gals.buyIgnores.end(), buyItem) == gals.buyIgnores.end()) { - exclude = false; - gals.buyIgnores.push_back(buyItem); - } - } - //Add all other advancement items - else if (type != ITEMTYPE_TOKEN && (/*AmmoDrops.Is(AMMODROPS_NONE) ||*/ type != ITEMTYPE_SHOP)) { - exclude = false; - } - //Has not been excluded, add to playthrough - if (!exclude) { - gals.itemSphere.push_back(loc); - } - } - //Triforce has been found, seed is beatable, nothing else in this or future spheres matters - else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { - gals.itemSphere.clear(); - gals.itemSphere.push_back(loc); - ctx->playthroughBeatable = true; - } + Regions::AccessReset(); + ctx->LocationReset(); } -void ApplyOrStoreItem(Rando::ItemLocation* loc, GetAccessibleLocationsStruct& gals, bool addToPlaythrough){ - if (addToPlaythrough){ - gals.newItemLocations.push_back(loc); - } else { - loc->ApplyPlacedItemEffect(); - } - gals.logicUpdated = true; +// Generate the playthrough, so we want to add advancement items, unless we know to ignore them +void AddToPlaythrough(LocationAccess& locPair, GetAccessibleLocationsStruct& gals) { + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); + RandomizerGet locItem = location->GetPlacedRandomizerGet(); + // Item is an advancement item, figure out if it should be added to this sphere + if (!ctx->playthroughBeatable && location->GetPlacedItem().IsAdvancement()) { + ItemType type = location->GetPlacedItem().GetItemType(); + + // Decide whether to exclude this location + // This preprocessing is done to reduce the amount of searches performed in PareDownPlaythrough + // Want to exclude: + // 1) Tokens after the last potentially useful one (the last one that gives an advancement item or last for + // token bridge) 2) Buy items of the same type, after the first (So only see Buy Deku Nut of any amount once) + bool exclude = true; + // Exclude tokens after the last possibly useful one + if (type == ITEMTYPE_TOKEN && gals.gsCount < gals.maxGsCount) { + gals.gsCount++; + exclude = false; + } + // Handle buy items + // If ammo drops are off, don't do this step, since buyable ammo becomes logically important + // TODO: Reimplement Ammo Drops setting + else if (/*AmmoDrops.IsNot(AMMODROPS_NONE) &&*/ type == ITEMTYPE_SHOP) { + // Only check each buy item once + auto buyItem = location->GetPlacedItem().GetLogicVal(); + // Buy item not in list to ignore, add it to list and write to playthrough + if (std::find(gals.buyIgnores.begin(), gals.buyIgnores.end(), buyItem) == gals.buyIgnores.end()) { + exclude = false; + gals.buyIgnores.push_back(buyItem); + } + } + // Add all other advancement items + else if (type != ITEMTYPE_TOKEN && (/*AmmoDrops.Is(AMMODROPS_NONE) ||*/ type != ITEMTYPE_SHOP)) { + exclude = false; + } + // Has not been excluded, add to playthrough + if (!exclude) { + gals.itemSphere.push_back(loc); + } + } + // Triforce has been found, seed is beatable, nothing else in this or future spheres matters + else if (location->GetPlacedRandomizerGet() == RG_TRIFORCE) { + gals.itemSphere.clear(); + gals.itemSphere.push_back(loc); + ctx->playthroughBeatable = true; + } +} + +void ApplyOrStoreItem(Rando::ItemLocation* loc, GetAccessibleLocationsStruct& gals, bool addToPlaythrough) { + if (addToPlaythrough) { + gals.newItemLocations.push_back(loc); + } else { + loc->ApplyPlacedItemEffect(); + } + gals.logicUpdated = true; } // Adds the contents of a location to the current progression and optionally playthrough -bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, bool stopOnBeatable, Region* parentRegion, bool addToPlaythrough=false){ - auto ctx = Rando::Context::GetInstance(); - StartPerformanceTimer(PT_LOCATION_LOGIC); - RandomizerCheck loc = locPair.GetLocation(); - Rando::ItemLocation* location = ctx->GetItemLocation(loc); - RandomizerGet locItem = location->GetPlacedRandomizerGet(); +bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, + bool stopOnBeatable, Region* parentRegion, bool addToPlaythrough = false) { + auto ctx = Rando::Context::GetInstance(); + StartPerformanceTimer(PT_LOCATION_LOGIC); + RandomizerCheck loc = locPair.GetLocation(); + Rando::ItemLocation* location = ctx->GetItemLocation(loc); + RandomizerGet locItem = location->GetPlacedRandomizerGet(); - if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, gals.calculatingAvailableChecks)) { - if (gals.calculatingAvailableChecks) { - gals.accessibleLocations.push_back(loc); - StopPerformanceTimer(PT_LOCATION_LOGIC); - return false; - } + if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, gals.calculatingAvailableChecks)) { + if (gals.calculatingAvailableChecks) { + gals.accessibleLocations.push_back(loc); + StopPerformanceTimer(PT_LOCATION_LOGIC); + return false; + } - location->AddToPool(); + location->AddToPool(); - if (locItem == RG_NONE) { - gals.accessibleLocations.push_back(loc); //Empty location, consider for placement - } else { - //If ignore has a value, we want to check if the item location should be considered or not - //This is necessary due to the below preprocessing for playthrough generation - if (ignore != RG_NONE) { - ItemType type = location->GetPlacedItem().GetItemType(); - //If we want to ignore tokens, only add if not a token - if (ignore == RG_GOLD_SKULLTULA_TOKEN && type != ITEMTYPE_TOKEN) { - ApplyOrStoreItem(location, gals, addToPlaythrough); + if (locItem == RG_NONE) { + gals.accessibleLocations.push_back(loc); // Empty location, consider for placement + } else { + // If ignore has a value, we want to check if the item location should be considered or not + // This is necessary due to the below preprocessing for playthrough generation + if (ignore != RG_NONE) { + ItemType type = location->GetPlacedItem().GetItemType(); + // If we want to ignore tokens, only add if not a token + if (ignore == RG_GOLD_SKULLTULA_TOKEN && type != ITEMTYPE_TOKEN) { + ApplyOrStoreItem(location, gals, addToPlaythrough); + } + // If we want to ignore bombchus, only add if bombchu is not in the name + else if (IsBombchus(ignore) && IsBombchus(locItem, true)) { + ApplyOrStoreItem(location, gals, addToPlaythrough); + } + // We want to ignore a specific Buy item. Buy items with different RandomizerGets are recognised by a + // shared GetLogicVal + else if (ignore != RG_GOLD_SKULLTULA_TOKEN && IsBombchus(ignore)) { + if ((type == ITEMTYPE_SHOP && Rando::StaticData::GetItemTable()[ignore].GetLogicVal() != + location->GetPlacedItem().GetLogicVal()) || + type != ITEMTYPE_SHOP) { + ApplyOrStoreItem(location, gals, addToPlaythrough); + } + } + } + // If it doesn't, we can just add the location + else { + ApplyOrStoreItem(location, gals, + addToPlaythrough); // Add item to cache to be considered in logic next iteration + } } - //If we want to ignore bombchus, only add if bombchu is not in the name - else if (IsBombchus(ignore) && IsBombchus(locItem, true)) { - ApplyOrStoreItem(location, gals, addToPlaythrough); + if (addToPlaythrough) { + AddToPlaythrough(locPair, gals); } - //We want to ignore a specific Buy item. Buy items with different RandomizerGets are recognised by a shared GetLogicVal - else if (ignore != RG_GOLD_SKULLTULA_TOKEN && IsBombchus(ignore)) { - if ((type == ITEMTYPE_SHOP && Rando::StaticData::GetItemTable()[ignore].GetLogicVal() != location->GetPlacedItem().GetLogicVal()) || type != ITEMTYPE_SHOP) { - ApplyOrStoreItem(location, gals, addToPlaythrough); - } + // All we care about is if the game is beatable, used to pare down playthrough + if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && stopOnBeatable) { + StopPerformanceTimer(PT_LOCATION_LOGIC); + return true; // Return early for efficiency } - } - //If it doesn't, we can just add the location - else { - ApplyOrStoreItem(location, gals, addToPlaythrough); //Add item to cache to be considered in logic next iteration - } } - if (addToPlaythrough){ - AddToPlaythrough(locPair, gals); - } - //All we care about is if the game is beatable, used to pare down playthrough - if (location->GetPlacedRandomizerGet() == RG_TRIFORCE && stopOnBeatable) { - StopPerformanceTimer(PT_LOCATION_LOGIC); - return true; //Return early for efficiency - } - } - StopPerformanceTimer(PT_LOCATION_LOGIC); - return false; + StopPerformanceTimer(PT_LOCATION_LOGIC); + return false; } -void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, - bool stopOnBeatable, bool addToPlaythrough){ - - if (gals.haveTimeAccess) { - region->ApplyTimePass(); - } else { - // If we're checking for TimePass access do that for each region as it's being updated. - // TimePass Access is satisfied when every AgeTime can reach a region with TimePass - // without the aid of TimePass. During this mode, TimePass won't update ToD access - // in any region. - //RANDOTODO can probably be removed after a ToD rework that accounts for having Dampe time access - if (region->timePass) { - if (region->childDay) { - gals.timePassChildDay = true; - } - if (region->childNight) { - gals.timePassChildNight = true; - } - if (region->adultDay) { - gals.timePassAdultDay = true; - } - if (region->adultNight) { - gals.timePassAdultNight = true; - } - } - // Condition for validating that all startring AgeTimes have timepass access - if (gals.timePassChildDay && gals.timePassChildNight && - gals.timePassAdultDay && gals.timePassAdultNight) { - gals.haveTimeAccess = true; - region->ApplyTimePass(); - } - } +void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore, bool stopOnBeatable, + bool addToPlaythrough) { - if (region->UpdateEvents()){ - gals.logicUpdated = true; - //if we are working in spheres, reset the sphere on an event being enabled to avoid sphere skipping - if (addToPlaythrough){ - gals.resetSphere = true; + if (gals.haveTimeAccess) { + region->ApplyTimePass(); + } else { + // If we're checking for TimePass access do that for each region as it's being updated. + // TimePass Access is satisfied when every AgeTime can reach a region with TimePass + // without the aid of TimePass. During this mode, TimePass won't update ToD access + // in any region. + // RANDOTODO can probably be removed after a ToD rework that accounts for having Dampe time access + if (region->timePass) { + if (region->childDay) { + gals.timePassChildDay = true; + } + if (region->childNight) { + gals.timePassChildNight = true; + } + if (region->adultDay) { + gals.timePassAdultDay = true; + } + if (region->adultNight) { + gals.timePassAdultNight = true; + } + } + // Condition for validating that all startring AgeTimes have timepass access + if (gals.timePassChildDay && gals.timePassChildNight && gals.timePassAdultDay && gals.timePassAdultNight) { + gals.haveTimeAccess = true; + region->ApplyTimePass(); + } } - } - - ProcessExits(region, gals, ignore, stopOnBeatable, addToPlaythrough); - - PropagateTimeTravel(gals, ignore, stopOnBeatable, addToPlaythrough); - for (size_t k = 0; k < region->locations.size(); k++) { - if(AddCheckToLogic(region->locations[k], gals, ignore, stopOnBeatable, region, addToPlaythrough)){ - Rando::Context::GetInstance()->playthroughBeatable = true; - return; + + if (region->UpdateEvents()) { + gals.logicUpdated = true; + // if we are working in spheres, reset the sphere on an event being enabled to avoid sphere skipping + if (addToPlaythrough) { + gals.resetSphere = true; + } + } + + ProcessExits(region, gals, ignore, stopOnBeatable, addToPlaythrough); + + PropagateTimeTravel(gals, ignore, stopOnBeatable, addToPlaythrough); + for (size_t k = 0; k < region->locations.size(); k++) { + if (AddCheckToLogic(region->locations[k], gals, ignore, stopOnBeatable, region, addToPlaythrough)) { + Rando::Context::GetInstance()->playthroughBeatable = true; + return; + } } - } } // Return any of the targetLocations that are accessible in logic -std::vector ReachabilitySearch(const std::vector& targetLocations, RandomizerGet ignore /* = RG_NONE*/, bool calculatingAvailableChecks /* = false */) { - auto ctx = Rando::Context::GetInstance(); - GetAccessibleLocationsStruct gals(0); - gals.calculatingAvailableChecks = calculatingAvailableChecks; - ResetLogic(ctx, gals, !calculatingAvailableChecks); - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore); - } - } while (gals.logicUpdated); - erase_if(gals.accessibleLocations, [&targetLocations, ctx, calculatingAvailableChecks](RandomizerCheck loc) { - if (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE && !calculatingAvailableChecks) { - return false; - } - for (RandomizerCheck allowedLocation : targetLocations) { - if (loc == allowedLocation) { - return false; - } - } - return true; - }); - return gals.accessibleLocations; +std::vector ReachabilitySearch(const std::vector& targetLocations, + RandomizerGet ignore /* = RG_NONE*/, + bool calculatingAvailableChecks /* = false */) { + auto ctx = Rando::Context::GetInstance(); + GetAccessibleLocationsStruct gals(0); + gals.calculatingAvailableChecks = calculatingAvailableChecks; + ResetLogic(ctx, gals, !calculatingAvailableChecks); + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore); + } + } while (gals.logicUpdated); + erase_if(gals.accessibleLocations, [&targetLocations, ctx, calculatingAvailableChecks](RandomizerCheck loc) { + if (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() != RG_NONE && !calculatingAvailableChecks) { + return false; + } + for (RandomizerCheck allowedLocation : targetLocations) { + if (loc == allowedLocation) { + return false; + } + } + return true; + }); + return gals.accessibleLocations; } // Create the playthrough for the seed void GeneratePlaythrough() { - auto ctx = Rando::Context::GetInstance(); - ctx->playthroughBeatable = false; - logic->Reset(); - GetAccessibleLocationsStruct gals(GetMaxGSCount()); - ResetLogic(ctx, gals, true); - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals, RG_NONE, false, true); - if (gals.resetSphere){ - gals.resetSphere = false; - i = -1; - } - } - if (gals.itemSphere.size() > 0) { - ctx->playthroughLocations.push_back(gals.itemSphere); - } - if (gals.entranceSphere.size() > 0 && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { - ctx->GetEntranceShuffler()->playthroughEntrances.push_back(gals.entranceSphere); - } - } while (gals.logicUpdated); + auto ctx = Rando::Context::GetInstance(); + ctx->playthroughBeatable = false; + logic->Reset(); + GetAccessibleLocationsStruct gals(GetMaxGSCount()); + ResetLogic(ctx, gals, true); + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals, RG_NONE, false, true); + if (gals.resetSphere) { + gals.resetSphere = false; + i = -1; + } + } + if (gals.itemSphere.size() > 0) { + ctx->playthroughLocations.push_back(gals.itemSphere); + } + if (gals.entranceSphere.size() > 0 && !ctx->GetEntranceShuffler()->HasNoRandomEntrances()) { + ctx->GetEntranceShuffler()->playthroughEntrances.push_back(gals.entranceSphere); + } + } while (gals.logicUpdated); } // return if the seed is currently beatable or not bool CheckBeatable(RandomizerGet ignore /* = RG_NONE*/) { - auto ctx = Rando::Context::GetInstance(); - GetAccessibleLocationsStruct gals(0); - ResetLogic(ctx, gals, true); - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore, true); - if (ctx->playthroughBeatable == true){ - return true; - } - } - } while (gals.logicUpdated); - return false; + auto ctx = Rando::Context::GetInstance(); + GetAccessibleLocationsStruct gals(0); + ResetLogic(ctx, gals, true); + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals, ignore, true); + if (ctx->playthroughBeatable == true) { + return true; + } + } + } while (gals.logicUpdated); + return false; } // Check if the currently randomised set of entrances is a valid game map. void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess) { - auto ctx = Rando::Context::GetInstance(); - GetAccessibleLocationsStruct gals(0); - ResetLogic(ctx, gals, !checkOtherEntranceAccess); + auto ctx = Rando::Context::GetInstance(); + GetAccessibleLocationsStruct gals(0); + ResetLogic(ctx, gals, !checkOtherEntranceAccess); - ctx->allLocationsReachable = false; - if (checkPoeCollectorAccess){ - logic->AreCheckingBigPoes = true; - } - - if (checkOtherEntranceAccess){ - gals.foundTempleOfTime = false; - gals.validatedStartingRegion = false; - //Variables for Time Pass access - gals.timePassChildDay = false; - gals.timePassChildNight = false; - gals.timePassAdultDay = false; - gals.timePassAdultNight = false; - gals.haveTimeAccess = false; - gals.sphereZeroComplete = false; - RegionTable(RR_ROOT)->childNight = true; - RegionTable(RR_ROOT)->adultNight = true; - RegionTable(RR_ROOT)->childDay = true; - RegionTable(RR_ROOT)->adultDay = true; - } else if (checkPoeCollectorAccess){ - //If we are not shuffling the guard house, add the key so we can properly check for poe merchant access - if (!ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)){ - Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); + ctx->allLocationsReachable = false; + if (checkPoeCollectorAccess) { + logic->AreCheckingBigPoes = true; } - } else { - ApplyAllAdvancmentItems(); - } - do { - gals.InitLoop(); - for (size_t i = 0; i < gals.regionPool.size(); i++) { - ProcessRegion(RegionTable(gals.regionPool[i]), gals); - } - } while (gals.logicUpdated); - if (gals.sphereZeroComplete) { - ctx->allLocationsReachable = true; - //RANDOTODO a size check here before getting the exact fails would be a minor optimization - //and a full list of location failures would be useful for logging when it does fail - for (const RandomizerCheck loc : ctx->allLocations) { - if (!ctx->GetItemLocation(loc)->IsAddedToPool()) { - ctx->allLocationsReachable = false; - auto message = "Location " + - Rando::StaticData::GetLocation(ctx->GetItemLocation(loc)->GetRandomizerCheck())->GetName() + - " not reachable\n"; - LUSLOG_DEBUG("%s", message.c_str()); - #ifndef ENABLE_DEBUG - break; - #endif - } - } - } -} - -void LookForExternalArea(Region* currentRegion, std::set &alreadyChecked, std::set &areas, bool LowPriorityMode=false){ - for (const auto& entrance : currentRegion->entrances) { - //if the region is arealess and hasn't already been checked, recursivly check what connects to it - //if this entrance does not pass areas, only process it if we are in low priority mode - if ((LowPriorityMode || entrance->DoesSpreadAreas()) && !alreadyChecked.contains(entrance->GetParentRegion())){ - std::set otherAreas = entrance->GetParentRegion()->GetAllAreas(); - if (otherAreas.size() == 0) { - alreadyChecked.insert(entrance->GetParentRegion()); - LookForExternalArea(entrance->GetParentRegion(), alreadyChecked, areas, LowPriorityMode); - //If we find a valid area we should add it. - //If it's Links Pocket or RA_NONE, do not propagate those, they are not real areas. - //This check is likely to fail if a region somehow is both in Link's Pocket and elsewhere, but this should never happen - } else if (*otherAreas.begin() > RA_LINKS_POCKET){ - areas.merge(otherAreas); - } - } - } -} - -void SetAreas(){ - auto ctx = Rando::Context::GetInstance(); -//RANDOTODO give entrances an enum like RandomizerCheck, the give them all areas here, -//then use those areas to not need to recursivly find ItemLocation areas when an identifying entrance's area - for (int regionType = 0; regionType < RR_MARKER_AREAS_END; regionType++) { - Region* region = &areaTable[regionType]; - std::set areas = region->GetAllAreas(); - std::set regionsToSet = {region}; - if (areas.empty()) { - LookForExternalArea(region, regionsToSet, areas); - //If we found nothing, try again in low priority mode to try every entrance - if (areas.empty()) { - LookForExternalArea(region, regionsToSet, areas, true); - //If we still found nothing, we're disconnected, use RA_NONE to represent that - if (areas.empty()){ - areas.insert(RA_NONE); + if (checkOtherEntranceAccess) { + gals.foundTempleOfTime = false; + gals.validatedStartingRegion = false; + // Variables for Time Pass access + gals.timePassChildDay = false; + gals.timePassChildNight = false; + gals.timePassAdultDay = false; + gals.timePassAdultNight = false; + gals.haveTimeAccess = false; + gals.sphereZeroComplete = false; + RegionTable(RR_ROOT)->childNight = true; + RegionTable(RR_ROOT)->adultNight = true; + RegionTable(RR_ROOT)->childDay = true; + RegionTable(RR_ROOT)->adultDay = true; + } else if (checkPoeCollectorAccess) { + // If we are not shuffling the guard house, add the key so we can properly check for poe merchant access + if (!ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES).Is(RO_INTERIOR_ENTRANCE_SHUFFLE_ALL)) { + Rando::StaticData::RetrieveItem(RG_GUARD_HOUSE_KEY).ApplyEffect(); } - } + } else { + ApplyAllAdvancmentItems(); } - for (auto regionToSet : regionsToSet) { - regionToSet->ReplaceAreas(areas); - for (auto& loc : regionToSet->locations){ - ctx->GetItemLocation(loc.GetLocation())->MergeAreas(areas); - } + + do { + gals.InitLoop(); + for (size_t i = 0; i < gals.regionPool.size(); i++) { + ProcessRegion(RegionTable(gals.regionPool[i]), gals); + } + } while (gals.logicUpdated); + if (gals.sphereZeroComplete) { + ctx->allLocationsReachable = true; + // RANDOTODO a size check here before getting the exact fails would be a minor optimization + // and a full list of location failures would be useful for logging when it does fail + for (const RandomizerCheck loc : ctx->allLocations) { + if (!ctx->GetItemLocation(loc)->IsAddedToPool()) { + ctx->allLocationsReachable = false; + auto message = + "Location " + + Rando::StaticData::GetLocation(ctx->GetItemLocation(loc)->GetRandomizerCheck())->GetName() + + " not reachable\n"; + LUSLOG_DEBUG("%s", message.c_str()); +#ifndef ENABLE_DEBUG + break; +#endif + } + } } - } } -//Remove unnecessary items from playthrough by removing their location, and checking if game is still beatable -//To reduce searches, some preprocessing is done in playthrough generation to avoid adding obviously unnecessary items +void LookForExternalArea(Region* currentRegion, std::set& alreadyChecked, std::set& areas, + bool LowPriorityMode = false) { + for (const auto& entrance : currentRegion->entrances) { + // if the region is arealess and hasn't already been checked, recursivly check what connects to it + // if this entrance does not pass areas, only process it if we are in low priority mode + if ((LowPriorityMode || entrance->DoesSpreadAreas()) && !alreadyChecked.contains(entrance->GetParentRegion())) { + std::set otherAreas = entrance->GetParentRegion()->GetAllAreas(); + if (otherAreas.size() == 0) { + alreadyChecked.insert(entrance->GetParentRegion()); + LookForExternalArea(entrance->GetParentRegion(), alreadyChecked, areas, LowPriorityMode); + // If we find a valid area we should add it. + // If it's Links Pocket or RA_NONE, do not propagate those, they are not real areas. + // This check is likely to fail if a region somehow is both in Link's Pocket and elsewhere, but this + // should never happen + } else if (*otherAreas.begin() > RA_LINKS_POCKET) { + areas.merge(otherAreas); + } + } + } +} + +void SetAreas() { + auto ctx = Rando::Context::GetInstance(); + // RANDOTODO give entrances an enum like RandomizerCheck, the give them all areas here, + // then use those areas to not need to recursivly find ItemLocation areas when an identifying entrance's area + for (int regionType = 0; regionType < RR_MARKER_AREAS_END; regionType++) { + Region* region = &areaTable[regionType]; + std::set areas = region->GetAllAreas(); + std::set regionsToSet = { region }; + if (areas.empty()) { + LookForExternalArea(region, regionsToSet, areas); + // If we found nothing, try again in low priority mode to try every entrance + if (areas.empty()) { + LookForExternalArea(region, regionsToSet, areas, true); + // If we still found nothing, we're disconnected, use RA_NONE to represent that + if (areas.empty()) { + areas.insert(RA_NONE); + } + } + } + for (auto regionToSet : regionsToSet) { + regionToSet->ReplaceAreas(areas); + for (auto& loc : regionToSet->locations) { + ctx->GetItemLocation(loc.GetLocation())->MergeAreas(areas); + } + } + } +} + +// Remove unnecessary items from playthrough by removing their location, and checking if game is still beatable +// To reduce searches, some preprocessing is done in playthrough generation to avoid adding obviously unnecessary items static void PareDownPlaythrough() { - auto ctx = Rando::Context::GetInstance(); - std::vector toAddBackItem; - //Start at sphere before Ganon's and count down - for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { - //Check each item location in sphere - std::vector erasableIndices; - std::vector sphere = ctx->playthroughLocations.at(i); - for (int j = sphere.size() - 1; j >= 0; j--) { - RandomizerCheck loc = sphere.at(j); - RandomizerGet locGet = ctx->GetItemLocation(loc)->GetPlacedRandomizerGet(); //Copy out item + auto ctx = Rando::Context::GetInstance(); + std::vector toAddBackItem; + // Start at sphere before Ganon's and count down + for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { + // Check each item location in sphere + std::vector erasableIndices; + std::vector sphere = ctx->playthroughLocations.at(i); + for (int j = sphere.size() - 1; j >= 0; j--) { + RandomizerCheck loc = sphere.at(j); + RandomizerGet locGet = ctx->GetItemLocation(loc)->GetPlacedRandomizerGet(); // Copy out item - RandomizerGet ignore = RG_NONE; - if (locGet == RG_GOLD_SKULLTULA_TOKEN || IsBombchus(locGet, true) - || Rando::StaticData::RetrieveItem(locGet).GetItemType() == ITEMTYPE_SHOP) { - ignore = locGet; - } + RandomizerGet ignore = RG_NONE; + if (locGet == RG_GOLD_SKULLTULA_TOKEN || IsBombchus(locGet, true) || + Rando::StaticData::RetrieveItem(locGet).GetItemType() == ITEMTYPE_SHOP) { + ignore = locGet; + } - //Playthrough is still beatable without this item, therefore it can be removed from playthrough section. - if (IsBeatableWithout(loc, false, ignore)) { - ctx->playthroughLocations[i].erase(ctx->playthroughLocations[i].begin() + j); - ctx->GetItemLocation(loc)->SetDelayedItem(locGet); //Game is still beatable, don't add back until later - toAddBackItem.push_back(loc); - } - else { - ctx->GetItemLocation(loc)->SetPlacedItem(locGet); //Immediately put item back so game is beatable again - } + // Playthrough is still beatable without this item, therefore it can be removed from playthrough section. + if (IsBeatableWithout(loc, false, ignore)) { + ctx->playthroughLocations[i].erase(ctx->playthroughLocations[i].begin() + j); + ctx->GetItemLocation(loc)->SetDelayedItem(locGet); // Game is still beatable, don't add back until later + toAddBackItem.push_back(loc); + } else { + ctx->GetItemLocation(loc)->SetPlacedItem(locGet); // Immediately put item back so game is beatable again + } + } } - } - //Some spheres may now be empty, remove these - for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { - if (ctx->playthroughLocations.at(i).size() == 0) { - ctx->playthroughLocations.erase(ctx->playthroughLocations.begin() + i); + // Some spheres may now be empty, remove these + for (int i = ctx->playthroughLocations.size() - 2; i >= 0; i--) { + if (ctx->playthroughLocations.at(i).size() == 0) { + ctx->playthroughLocations.erase(ctx->playthroughLocations.begin() + i); + } } - } - //Now we can add back items which were removed previously - for (RandomizerCheck loc : toAddBackItem) { - ctx->GetItemLocation(loc)->SaveDelayedItem(); - } + // Now we can add back items which were removed previously + for (RandomizerCheck loc : toAddBackItem) { + ctx->GetItemLocation(loc)->SaveDelayedItem(); + } } -//Very similar to PareDownPlaythrough except it sets WotH candidacy of Way of the Hero items -//Way of the Hero items are more specific than playthrough items in that they are items which *must* -// be obtained to logically be able to complete the seed, rather than playthrough items which -// are just possible items you *can* collect to complete the seed. +// Very similar to PareDownPlaythrough except it sets WotH candidacy of Way of the Hero items +// Way of the Hero items are more specific than playthrough items in that they are items which *must* +// be obtained to logically be able to complete the seed, rather than playthrough items which +// are just possible items you *can* collect to complete the seed. static void CalculateWotH() { - auto ctx = Rando::Context::GetInstance(); - //size - 1 so Triforce is not counted - for (size_t i = 0; i < ctx->playthroughLocations.size() - 1; i++) { - for (size_t j = 0; j < ctx->playthroughLocations[i].size(); j++) { - //If removing this item and no other item caused the game to become unbeatable, then it is strictly necessary, - //so add it unless it is in Links Pocket or an isolated place. - auto itemLoc = ctx->GetItemLocation(ctx->playthroughLocations[i][j]); - if (itemLoc->IsHintable() && itemLoc->GetFirstArea() > RA_LINKS_POCKET && - !(IsBeatableWithout(ctx->playthroughLocations[i][j], true))) { - itemLoc->SetWothCandidate(); - } + auto ctx = Rando::Context::GetInstance(); + // size - 1 so Triforce is not counted + for (size_t i = 0; i < ctx->playthroughLocations.size() - 1; i++) { + for (size_t j = 0; j < ctx->playthroughLocations[i].size(); j++) { + // If removing this item and no other item caused the game to become unbeatable, then it is strictly + // necessary, so add it unless it is in Links Pocket or an isolated place. + auto itemLoc = ctx->GetItemLocation(ctx->playthroughLocations[i][j]); + if (itemLoc->IsHintable() && itemLoc->GetFirstArea() > RA_LINKS_POCKET && + !(IsBeatableWithout(ctx->playthroughLocations[i][j], true))) { + itemLoc->SetWothCandidate(); + } + } } - } - ctx->playthroughBeatable = true; - logic->Reset(); - ReachabilitySearch(ctx->allLocations); + ctx->playthroughBeatable = true; + logic->Reset(); + ReachabilitySearch(ctx->allLocations); } -static bool FindIfBarren(Rando::ItemLocation* itemLoc, std::array NotBarren){ - std::set locAreas = itemLoc->GetAreas(); - for (auto locArea: locAreas){ - if (NotBarren[locArea]){ - return false; - } - } - return true; -} - -//Calculate barren locations and assign Barren Candidacy to all locations inside those areas -static void CalculateBarren() { - auto ctx = Rando::Context::GetInstance(); - std::array NotBarren = {}; //I would invert this but the "initialise all as true" syntax wasn't working - //Isolated Areas and Link's Pocket are never Hinted Barren - NotBarren[RA_NONE] = true; - NotBarren[RA_LINKS_POCKET] = true; - - for (RandomizerCheck loc : ctx->allLocations) { - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); +static bool FindIfBarren(Rando::ItemLocation* itemLoc, std::array NotBarren) { std::set locAreas = itemLoc->GetAreas(); - for (auto locArea: locAreas){ - // If a location has a major item or is a way of the hero location, it is not barren - if (NotBarren[locArea] == false && (itemLoc->GetPlacedItem().IsMajorItem() || itemLoc->IsWothCandidate())) { - NotBarren[locArea] = true; - } + for (auto locArea : locAreas) { + if (NotBarren[locArea]) { + return false; + } } - } - - for (RandomizerCheck loc : ctx->allLocations) { - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); - if (FindIfBarren(itemLoc, NotBarren)){ - itemLoc->SetBarrenCandidate(); - } - } + return true; } -//Will place things completely randomly, no logic checks are performed -static void FastFill(std::vector items, std::vector locations, bool endOnItemsEmpty = false) { - auto ctx = Rando::Context::GetInstance(); - //Loop until locations are empty, or also end if items are empty and the parameters specify to end then - while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { - if (items.empty() && !endOnItemsEmpty) { - items.push_back(GetJunkItem()); +// Calculate barren locations and assign Barren Candidacy to all locations inside those areas +static void CalculateBarren() { + auto ctx = Rando::Context::GetInstance(); + std::array + NotBarren = {}; // I would invert this but the "initialise all as true" syntax wasn't working + // Isolated Areas and Link's Pocket are never Hinted Barren + NotBarren[RA_NONE] = true; + NotBarren[RA_LINKS_POCKET] = true; + + for (RandomizerCheck loc : ctx->allLocations) { + Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); + std::set locAreas = itemLoc->GetAreas(); + for (auto locArea : locAreas) { + // If a location has a major item or is a way of the hero location, it is not barren + if (NotBarren[locArea] == false && (itemLoc->GetPlacedItem().IsMajorItem() || itemLoc->IsWothCandidate())) { + NotBarren[locArea] = true; + } + } } - RandomizerCheck loc = RandomElement(locations, true); - ctx->GetItemLocation(loc)->SetAsHintable(); - ctx->PlaceItemInLocation(loc, RandomElement(items, true)); - } + for (RandomizerCheck loc : ctx->allLocations) { + Rando::ItemLocation* itemLoc = ctx->GetItemLocation(loc); + if (FindIfBarren(itemLoc, NotBarren)) { + itemLoc->SetBarrenCandidate(); + } + } +} + +// Will place things completely randomly, no logic checks are performed +static void FastFill(std::vector items, std::vector locations, + bool endOnItemsEmpty = false) { + auto ctx = Rando::Context::GetInstance(); + // Loop until locations are empty, or also end if items are empty and the parameters specify to end then + while (!locations.empty() && (!endOnItemsEmpty || !items.empty())) { + if (items.empty() && !endOnItemsEmpty) { + items.push_back(GetJunkItem()); + } + + RandomizerCheck loc = RandomElement(locations, true); + ctx->GetItemLocation(loc)->SetAsHintable(); + ctx->PlaceItemInLocation(loc, RandomElement(items, true)); + } } /* @@ -878,7 +906,7 @@ static void AssumedFill(const std::vector& items, const std::vect // reset any locations that got an item for (RandomizerCheck loc : attemptedLocations) { ctx->GetItemLocation(loc)->SetPlacedItem(RG_NONE); - //itemsPlaced--; + // itemsPlaced--; } attemptedLocations.clear(); @@ -906,7 +934,7 @@ static void AssumedFill(const std::vector& items, const std::vect CheckBeatable(); if (ctx->playthroughBeatable) { SPDLOG_DEBUG("Game beatable, now placing items randomly. " + std::to_string(itemsToPlace.size()) + - " major items remaining.\n\n"); + " major items remaining.\n\n"); FastFill(itemsToPlace, GetEmptyLocations(allowedLocations), true); return; } @@ -915,121 +943,135 @@ static void AssumedFill(const std::vector& items, const std::vect } while (unsuccessfulPlacement); } -//This function will specifically randomize dungeon rewards for the End of Dungeons -//setting, or randomize one dungeon reward to Link's Pocket if that setting is on +// This function will specifically randomize dungeon rewards for the End of Dungeons +// setting, or randomize one dungeon reward to Link's Pocket if that setting is on static void RandomizeDungeonRewards() { - auto ctx = Rando::Context::GetInstance(); - //quest item bit mask of each stone/medallion for the savefile - // static constexpr std::array bitMaskTable = { - // 0x00040000, //Kokiri Emerald - // 0x00080000, //Goron Ruby - // 0x00100000, //Zora Sapphire - // 0x00000001, //Forest Medallion - // 0x00000002, //Fire Medallion - // 0x00000004, //Water Medallion - // 0x00000008, //Spirit Medallion - // 0x00000010, //Shadow Medallion - // 0x00000020, //Light Medallion - // }; - int baseOffset = Rando::StaticData::RetrieveItem(RG_KOKIRI_EMERALD).GetItemID(); + auto ctx = Rando::Context::GetInstance(); + // quest item bit mask of each stone/medallion for the savefile + // static constexpr std::array bitMaskTable = { + // 0x00040000, //Kokiri Emerald + // 0x00080000, //Goron Ruby + // 0x00100000, //Zora Sapphire + // 0x00000001, //Forest Medallion + // 0x00000002, //Fire Medallion + // 0x00000004, //Water Medallion + // 0x00000008, //Spirit Medallion + // 0x00000010, //Shadow Medallion + // 0x00000020, //Light Medallion + // }; + int baseOffset = Rando::StaticData::RetrieveItem(RG_KOKIRI_EMERALD).GetItemID(); - //End of Dungeons includes Link's Pocket - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - //get stones and medallions - std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) {return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD;}); + // End of Dungeons includes Link's Pocket + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + // get stones and medallions + std::vector rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { // Place dungeon rewards in vanilla locations - for (RandomizerCheck loc : Rando::StaticData::dungeonRewardLocations) { - ctx->GetItemLocation(loc)->PlaceVanillaItem(); - } - ctx->GetItemLocation(RC_GIFT_FROM_RAURU)->PlaceVanillaItem(); - } else { // Randomize dungeon rewards with assumed fill - std::vector rewardLocations(Rando::StaticData::dungeonRewardLocations); - // If there are less than 9 dungeon rewards, prioritize actual dungeons for placement - if (rewards.size() < 9) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - } else { - rewardLocations.push_back(RC_LINKS_POCKET); - } - AssumedFill(rewards, rewardLocations); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS) + .Is(RO_DUNGEON_REWARDS_VANILLA)) { // Place dungeon rewards in vanilla locations + for (RandomizerCheck loc : Rando::StaticData::dungeonRewardLocations) { + ctx->GetItemLocation(loc)->PlaceVanillaItem(); + } + ctx->GetItemLocation(RC_GIFT_FROM_RAURU)->PlaceVanillaItem(); + } else { // Randomize dungeon rewards with assumed fill + std::vector rewardLocations(Rando::StaticData::dungeonRewardLocations); + // If there are less than 9 dungeon rewards, prioritize actual dungeons for placement + if (rewards.size() < 9) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + } else { + rewardLocations.push_back(RC_LINKS_POCKET); + } + AssumedFill(rewards, rewardLocations); + } + } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_DUNGEON_REWARD)) { + // get 1 stone/medallion + std::vector rewards = FilterFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); + // If there are no remaining stones/medallions, then Link's pocket won't get one + if (rewards.empty()) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + return; + } + RandomizerGet startingReward = RandomElement(rewards, true); + + // LinksPocketRewardBitMask = bitMaskTable[Rando::StaticData::RetrieveItem(startingReward).GetItemID() - + // baseOffset]; + ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingReward); + // erase the stone/medallion from the Item Pool + FilterAndEraseFromPool(ItemPool, [startingReward](const RandomizerGet i) { return i == startingReward; }); } - } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_DUNGEON_REWARD)) { - //get 1 stone/medallion - std::vector rewards = FilterFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); - // If there are no remaining stones/medallions, then Link's pocket won't get one - if (rewards.empty()) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - return; - } - RandomizerGet startingReward = RandomElement(rewards, true); - - //LinksPocketRewardBitMask = bitMaskTable[Rando::StaticData::RetrieveItem(startingReward).GetItemID() - baseOffset]; - ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingReward); - //erase the stone/medallion from the Item Pool - FilterAndEraseFromPool(ItemPool, [startingReward](const RandomizerGet i) {return i == startingReward;}); - } } -//Fills any locations excluded by the player with junk items so that advancement items -//can't be placed there. +// Fills any locations excluded by the player with junk items so that advancement items +// can't be placed there. static void FillExcludedLocations() { - auto ctx = Rando::Context::GetInstance(); - //Only fill in excluded locations that don't already have something and are forbidden - std::vector excludedLocations = FilterFromPool(ctx->allLocations, [ctx](const auto loc){ - return ctx->GetItemLocation(loc)->IsExcluded(); - }); + auto ctx = Rando::Context::GetInstance(); + // Only fill in excluded locations that don't already have something and are forbidden + std::vector excludedLocations = + FilterFromPool(ctx->allLocations, [ctx](const auto loc) { return ctx->GetItemLocation(loc)->IsExcluded(); }); - for (RandomizerCheck loc : excludedLocations) { - PlaceJunkInExcludedLocation(loc); - } + for (RandomizerCheck loc : excludedLocations) { + PlaceJunkInExcludedLocation(loc); + } } -//Function to handle the Own Dungeon setting +// Function to handle the Own Dungeon setting static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) { - auto ctx = Rando::Context::GetInstance(); - std::vector dungeonItems; + auto ctx = Rando::Context::GetInstance(); + std::vector dungeonItems; - // Search and filter for locations that match the hint region of the dungeon - // This accounts for boss room shuffle so that own dungeon items can be placed - // in the shuffled boss room - std::vector dungeonLocations = FilterFromPool(ctx->allLocations, [dungeon, ctx](const auto loc) { - return ctx->GetItemLocation(loc)->GetAreas().contains(dungeon->GetArea()); - }); + // Search and filter for locations that match the hint region of the dungeon + // This accounts for boss room shuffle so that own dungeon items can be placed + // in the shuffled boss room + std::vector dungeonLocations = FilterFromPool(ctx->allLocations, [dungeon, ctx](const auto loc) { + return ctx->GetItemLocation(loc)->GetAreas().contains(dungeon->GetArea()); + }); - //filter out locations that may be required to have songs placed at them - dungeonLocations = FilterFromPool(dungeonLocations, [ctx](const auto loc) { - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { - return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION); + // filter out locations that may be required to have songs placed at them + dungeonLocations = FilterFromPool(dungeonLocations, [ctx](const auto loc) { + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { + return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION); + } + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { + return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || + loc == RC_SHEIK_IN_ICE_CAVERN || loc == RC_SONG_FROM_IMPA); + } + return true; + }); + + // Add specific items that need be randomized within this dungeon + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetSmallKey() != RG_NONE) { + std::vector dungeonSmallKeys = + FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing()); + }); + AddElementsToPool(dungeonItems, dungeonSmallKeys); } - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { - return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || - loc == RC_SHEIK_IN_ICE_CAVERN || - loc == RC_SONG_FROM_IMPA); - } - return true; - }); - //Add specific items that need be randomized within this dungeon - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetSmallKey() != RG_NONE) { - std::vector dungeonSmallKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); - AddElementsToPool(dungeonItems, dungeonSmallKeys); - } - - if ((ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) || - (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON) && dungeon->GetBossKey() == RG_GANONS_CASTLE_BOSS_KEY)) { - auto dungeonBossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return i == dungeon->GetBossKey();}); + if ((ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && + dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) || + (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON) && + dungeon->GetBossKey() == RG_GANONS_CASTLE_BOSS_KEY)) { + auto dungeonBossKey = + FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { return i == dungeon->GetBossKey(); }); AddElementsToPool(dungeonItems, dungeonBossKey); - } + } - //randomize boss key and small keys together for even distribution - AssumedFill(dungeonItems, dungeonLocations); + // randomize boss key and small keys together for even distribution + AssumedFill(dungeonItems, dungeonLocations); - //randomize map and compass separately since they're not progressive - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetMap() != RG_NONE && dungeon->GetCompass() != RG_NONE) { - auto dungeonMapAndCompass = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){ return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(dungeonMapAndCompass, dungeonLocations); - } + // randomize map and compass separately since they're not progressive + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) && dungeon->GetMap() != RG_NONE && + dungeon->GetCompass() != RG_NONE) { + auto dungeonMapAndCompass = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return i == dungeon->GetMap() || i == dungeon->GetCompass(); + }); + AssumedFill(dungeonMapAndCompass, dungeonLocations); + } } /*Randomize items restricted to a certain set of locations. @@ -1041,353 +1083,373 @@ static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) { will be randomized together if they have the same setting. Maps and Compasses are randomized separately once the dungeon advancement items have all been placed.*/ static void RandomizeDungeonItems() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - //Get Any Dungeon and Overworld group locations - std::vector anyDungeonLocations = Rando::StaticData::GetAllDungeonLocations(); + // Get Any Dungeon and Overworld group locations + std::vector anyDungeonLocations = Rando::StaticData::GetAllDungeonLocations(); - //Create Any Dungeon and Overworld item pools - std::vector anyDungeonItems; - std::vector overworldItems; + // Create Any Dungeon and Overworld item pools + std::vector anyDungeonItems; + std::vector overworldItems; - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { - auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); - AddElementsToPool(anyDungeonItems, dungeonKeys); - } else if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing());}); - AddElementsToPool(overworldItems, dungeonKeys); + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { + auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing()); + }); + AddElementsToPool(anyDungeonItems, dungeonKeys); + } else if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + auto dungeonKeys = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return (i == dungeon->GetSmallKey()) || (i == dungeon->GetKeyRing()); + }); + AddElementsToPool(overworldItems, dungeonKeys); + } + + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) && + dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { + auto bossKey = FilterAndEraseFromPool( + ItemPool, [dungeon](const RandomizerGet i) { return i == dungeon->GetBossKey(); }); + AddElementsToPool(anyDungeonItems, bossKey); + } else if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD) && + dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { + auto bossKey = FilterAndEraseFromPool( + ItemPool, [dungeon](const RandomizerGet i) { return i == dungeon->GetBossKey(); }); + AddElementsToPool(overworldItems, bossKey); + } + + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { + auto ganonBossKey = + FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); + AddElementsToPool(anyDungeonItems, ganonBossKey); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + auto ganonBossKey = + FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); + AddElementsToPool(overworldItems, ganonBossKey); + } } - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { - auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetBossKey();}); - AddElementsToPool(anyDungeonItems, bossKey); - } else if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD) && dungeon->GetBossKey() != RG_GANONS_CASTLE_BOSS_KEY) { - auto bossKey = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetBossKey();}); - AddElementsToPool(overworldItems, bossKey); + if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) { + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; + }); + AddElementsToPool(anyDungeonItems, gerudoKeys); + } else if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_OVERWORLD)) { + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; + }); + AddElementsToPool(overworldItems, gerudoKeys); } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { - auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i){return i == RG_GANONS_CASTLE_BOSS_KEY;}); - AddElementsToPool(anyDungeonItems, ganonBossKey); - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - auto ganonBossKey = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GANONS_CASTLE_BOSS_KEY; }); - AddElementsToPool(overworldItems, ganonBossKey); + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANY_DUNGEON)) { + auto rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); + AddElementsToPool(anyDungeonItems, rewards); + } else if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_OVERWORLD)) { + auto rewards = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; + }); + AddElementsToPool(overworldItems, rewards); } - } - if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; }); - AddElementsToPool(anyDungeonItems, gerudoKeys); - } else if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_OVERWORLD)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == RG_GERUDO_FORTRESS_SMALL_KEY || i == RG_GERUDO_FORTRESS_KEY_RING; }); - AddElementsToPool(overworldItems, gerudoKeys); - } + // Randomize Any Dungeon and Overworld pools + AssumedFill(anyDungeonItems, anyDungeonLocations, true); + AssumedFill(overworldItems, ctx->overworldLocations, true); - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANY_DUNGEON)) { - auto rewards = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); - AddElementsToPool(anyDungeonItems, rewards); - } else if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_OVERWORLD)) { - auto rewards = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_DUNGEONREWARD; }); - AddElementsToPool(overworldItems, rewards); - } - - //Randomize Any Dungeon and Overworld pools - AssumedFill(anyDungeonItems, anyDungeonLocations, true); - AssumedFill(overworldItems, ctx->overworldLocations, true); - - //Randomize maps and compasses after since they're not advancement items - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { - auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(mapAndCompassItems, anyDungeonLocations, true); - } else if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i){return i == dungeon->GetMap() || i == dungeon->GetCompass();}); - AssumedFill(mapAndCompassItems, ctx->overworldLocations, true); + // Randomize maps and compasses after since they're not advancement items + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON)) { + auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return i == dungeon->GetMap() || i == dungeon->GetCompass(); + }); + AssumedFill(mapAndCompassItems, anyDungeonLocations, true); + } else if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + auto mapAndCompassItems = FilterAndEraseFromPool(ItemPool, [dungeon](const RandomizerGet i) { + return i == dungeon->GetMap() || i == dungeon->GetCompass(); + }); + AssumedFill(mapAndCompassItems, ctx->overworldLocations, true); + } } - } } static void RandomizeLinksPocket() { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_ADVANCEMENT)) { - //Get all the advancement items don't include tokens - std::vector advancementItems = FilterAndEraseFromPool(ItemPool, [](const auto i) { - return Rando::StaticData::RetrieveItem(i).IsAdvancement() && Rando::StaticData::RetrieveItem(i).GetItemType() != ITEMTYPE_TOKEN; - }); - //select a random one - RandomizerGet startingItem = RandomElement(advancementItems, true); - //add the others back - AddElementsToPool(ItemPool, advancementItems); + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_ADVANCEMENT)) { + // Get all the advancement items don't include tokens + std::vector advancementItems = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).IsAdvancement() && + Rando::StaticData::RetrieveItem(i).GetItemType() != ITEMTYPE_TOKEN; + }); + // select a random one + RandomizerGet startingItem = RandomElement(advancementItems, true); + // add the others back + AddElementsToPool(ItemPool, advancementItems); - ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingItem); - } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_NOTHING)) { - ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); - } + ctx->PlaceItemInLocation(RC_LINKS_POCKET, startingItem); + } else if (ctx->GetOption(RSK_LINKS_POCKET).Is(RO_LINKS_POCKET_NOTHING)) { + ctx->PlaceItemInLocation(RC_LINKS_POCKET, RG_GREEN_RUPEE); + } } void VanillaFill() { - auto ctx = Rando::Context::GetInstance(); - //Perform minimum needed initialization - RegionTable_Init(); - ctx->GenerateLocationPool(); - GenerateItemPool(); - GenerateStartingInventory(); - //Place vanilla item in each location - RandomizeDungeonRewards(); - for (RandomizerCheck loc : ctx->allLocations) { - ctx->GetItemLocation(loc)->PlaceVanillaItem(); - } - //If necessary, handle ER stuff - if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { - SPDLOG_INFO("Shuffling Entrances..."); - ctx->GetEntranceShuffler()->ShuffleAllEntrances(); - SPDLOG_INFO("Shuffling Entrances Done"); - } - // Populate the playthrough for entrances so they are placed in the spoiler log - GeneratePlaythrough(); - //Finish up - ctx->CreateItemOverrides(); - ctx->GetEntranceShuffler()->CreateEntranceOverrides(); - CreateWarpSongTexts(); + auto ctx = Rando::Context::GetInstance(); + // Perform minimum needed initialization + RegionTable_Init(); + ctx->GenerateLocationPool(); + GenerateItemPool(); + GenerateStartingInventory(); + // Place vanilla item in each location + RandomizeDungeonRewards(); + for (RandomizerCheck loc : ctx->allLocations) { + ctx->GetItemLocation(loc)->PlaceVanillaItem(); + } + // If necessary, handle ER stuff + if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { + SPDLOG_INFO("Shuffling Entrances..."); + ctx->GetEntranceShuffler()->ShuffleAllEntrances(); + SPDLOG_INFO("Shuffling Entrances Done"); + } + // Populate the playthrough for entrances so they are placed in the spoiler log + GeneratePlaythrough(); + // Finish up + ctx->CreateItemOverrides(); + ctx->GetEntranceShuffler()->CreateEntranceOverrides(); + CreateWarpSongTexts(); } void ClearProgress() { } int Fill() { - auto ctx = Rando::Context::GetInstance(); - int retries = 0; - SPDLOG_INFO("Starting seed generation..."); - while(retries < 5) { - SPDLOG_INFO("Attempt {}...", retries + 1); - placementFailure = false; - //showItemProgress = false; - ctx->playthroughLocations.clear(); - ctx->GetEntranceShuffler()->playthroughEntrances.clear(); - RegionTable_Init(); //Reset the world graph to intialize the proper locations - ctx->ItemReset(); //Reset shops incase of shopsanity random - ctx->GenerateLocationPool(); - GenerateItemPool(); - GenerateStartingInventory(); - RemoveStartingItemsFromPool(); - FillExcludedLocations(); + auto ctx = Rando::Context::GetInstance(); + int retries = 0; + SPDLOG_INFO("Starting seed generation..."); + while (retries < 5) { + SPDLOG_INFO("Attempt {}...", retries + 1); + placementFailure = false; + // showItemProgress = false; + ctx->playthroughLocations.clear(); + ctx->GetEntranceShuffler()->playthroughEntrances.clear(); + RegionTable_Init(); // Reset the world graph to intialize the proper locations + ctx->ItemReset(); // Reset shops incase of shopsanity random + ctx->GenerateLocationPool(); + GenerateItemPool(); + GenerateStartingInventory(); + RemoveStartingItemsFromPool(); + FillExcludedLocations(); - //Temporarily add shop items to the ItemPool so that entrance randomization - //can validate the world using deku/hylian shields - StartPerformanceTimer(PT_ENTRANCE_SHUFFLE); - AddElementsToPool(ItemPool, GetMinVanillaShopItems(8)); //assume worst case shopsanity 7 - if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { - SPDLOG_INFO("Shuffling Entrances..."); - if (ctx->GetEntranceShuffler()->ShuffleAllEntrances() == ENTRANCE_SHUFFLE_FAILURE) { + // Temporarily add shop items to the ItemPool so that entrance randomization + // can validate the world using deku/hylian shields + StartPerformanceTimer(PT_ENTRANCE_SHUFFLE); + AddElementsToPool(ItemPool, GetMinVanillaShopItems(8)); // assume worst case shopsanity 7 + if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES)) { + SPDLOG_INFO("Shuffling Entrances..."); + if (ctx->GetEntranceShuffler()->ShuffleAllEntrances() == ENTRANCE_SHUFFLE_FAILURE) { + retries++; + ClearProgress(); + continue; + } + SPDLOG_INFO("Shuffling Entrances Done"); + } + SetAreas(); + // erase temporary shop items + FilterAndEraseFromPool(ItemPool, [](const auto item) { + return Rando::StaticData::RetrieveItem(item).GetItemType() == ITEMTYPE_SHOP; + }); + StopPerformanceTimer(PT_ENTRANCE_SHUFFLE); + + // ctx->showItemProgress = true; + // Place shop items first, since a buy shield is needed to place a dungeon reward on Gohma due to access + + StartPerformanceTimer(PT_SHOPSANITY); + if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { + SPDLOG_INFO("Placing Vanilla Shop Items..."); + PlaceVanillaShopItems(); // Place vanilla shop items in vanilla location + } else { + SPDLOG_INFO("Shuffling Shop Items"); + int total_replaced = 0; + if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_RANDOM) || + ctx->GetOption(RSK_SHOPSANITY_COUNT).IsNot(RO_SHOPSANITY_COUNT_ZERO_ITEMS)) { // Shopsanity 1-7, random + /* + Indices from OoTR. So shopsanity one will overwrite 7, three will overwrite 7, 5, 8, etc. + 8 6 2 4 + 7 5 1 3 + */ + const std::array indices = { 7, 5, 8, 6, 3, 1, 4, 2 }; +// Overwrite appropriate number of shop items +#define LOCATIONS_PER_SHOP 8 + for (size_t i = 0; i < Rando::StaticData::GetShopLocations().size() / LOCATIONS_PER_SHOP; i++) { + int num_to_replace = + GetShopsanityReplaceAmount(); // 1-7 shop items will be overwritten, depending on settings + total_replaced += num_to_replace; + for (int j = 0; j < num_to_replace; j++) { + int itemindex = indices[j]; + RandomizerCheck rc = + Rando::StaticData::GetShopLocations()[i * LOCATIONS_PER_SHOP + itemindex - 1]; + Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc); + uint16_t shopsanityPrice = GetRandomPrice(Rando::StaticData::GetLocation(rc), shopsanityPrices); + itemLoc->SetCustomPrice(shopsanityPrice); + } + } +#undef LOCATIONS_PER_SHOP + } + // Get all locations and items that don't have a shopsanity price attached + std::vector shopLocations = {}; + // Get as many vanilla shop items as the total number of shop items minus the number of replaced items + // So shopsanity 0 will get all 64 vanilla items, shopsanity 4 will get 32, etc. + std::vector shopItems = GetMinVanillaShopItems(total_replaced); + + for (RandomizerCheck& randomizerCheck : Rando::StaticData::GetShopLocations()) { + if (!(ctx->GetItemLocation(randomizerCheck)->HasCustomPrice())) { + shopLocations.push_back(randomizerCheck); + } + } + // Place the shop items which will still be at shop locations + AssumedFill(shopItems, shopLocations); + } + + // Add prices to scrubs + auto scrubLoc = Rando::StaticData::GetScrubLocations(); + if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { + for (size_t i = 0; i < scrubLoc.size(); i++) { + ctx->GetItemLocation(scrubLoc[i]) + ->SetCustomPrice(GetRandomPrice(Rando::StaticData::GetLocation(scrubLoc[i]), scrubPrices)); + } + } else { + for (size_t i = 0; i < scrubLoc.size(); i++) { + ctx->GetItemLocation(scrubLoc[i]) + ->SetCustomPrice(Rando::StaticData::GetLocation(scrubLoc[i])->GetVanillaPrice()); + } + } + + // set merchant prices + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN) + ->SetCustomPrice( + GetRandomPrice(Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN), merchantPrices)); + } else { + ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN) + ->SetCustomPrice(Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetVanillaPrice()); + } + + auto merchantLoc = Rando::StaticData::GetMerchantLocations(); + + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + for (size_t i = 0; i < merchantLoc.size(); i++) { + ctx->GetItemLocation(merchantLoc[i]) + ->SetCustomPrice(GetRandomPrice(Rando::StaticData::GetLocation(merchantLoc[i]), merchantPrices)); + } + } else { + for (size_t i = 0; i < merchantLoc.size(); i++) { + ctx->GetItemLocation(merchantLoc[i]) + ->SetCustomPrice(Rando::StaticData::GetLocation(merchantLoc[i])->GetVanillaPrice()); + } + } + StopPerformanceTimer(PT_SHOPSANITY); + + StartPerformanceTimer(PT_OWN_DUNGEON); + // Place dungeon rewards + SPDLOG_INFO("Shuffling and Placing Dungeon Items..."); + RandomizeDungeonRewards(); + + // Place dungeon items restricted to their Own Dungeon + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + RandomizeOwnDungeon(dungeon); + } + StopPerformanceTimer(PT_OWN_DUNGEON); + + StartPerformanceTimer(PT_LIMITED_CHECKS); + // Then Place songs if song shuffle is set to specific locations + if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_ANYWHERE)) { + + // Get each song + std::vector songs = FilterAndEraseFromPool(ItemPool, [](const auto i) { + return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_SONG; + }); + + // Get each song location + std::vector songLocations; + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { + songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { + return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; + }); + + } else if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { + songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { + return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || + loc == RC_SHEIK_IN_ICE_CAVERN || loc == RC_SONG_FROM_IMPA; + }); + } + + AssumedFill(songs, songLocations, true); + } + + // Then place dungeon items that are assigned to restrictive location pools + RandomizeDungeonItems(); + SPDLOG_INFO("Dungeon Items Done"); + + // Then place Link's Pocket Item if it has to be an advancement item + RandomizeLinksPocket(); + StopPerformanceTimer(PT_LIMITED_CHECKS); + + StartPerformanceTimer(PT_ADVANCEMENT_ITEMS); + SPDLOG_INFO("Shuffling Advancement Items"); + // Then place the rest of the advancement items + std::vector remainingAdvancementItems = FilterAndEraseFromPool( + ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); + AssumedFill(remainingAdvancementItems, ctx->allLocations, true); + StopPerformanceTimer(PT_ADVANCEMENT_ITEMS); + + StartPerformanceTimer(PT_REMAINING_ITEMS); + // Fast fill for the rest of the pool + SPDLOG_INFO("Shuffling Remaining Items"); + std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const auto i) { return true; }); + FastFill(remainingPool, GetAllEmptyLocations(), false); + StopPerformanceTimer(PT_REMAINING_ITEMS); + + StartPerformanceTimer(PT_PLAYTHROUGH_GENERATION); + GeneratePlaythrough(); + StopPerformanceTimer(PT_PLAYTHROUGH_GENERATION); + // Successful placement, produced beatable result + if (ctx->playthroughBeatable && !placementFailure) { + + SPDLOG_INFO("Calculating Playthrough..."); + StartPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); + PareDownPlaythrough(); + StopPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); + + StartPerformanceTimer(PT_WOTH); + CalculateWotH(); + StopPerformanceTimer(PT_WOTH); + + StartPerformanceTimer(PT_FOOLISH); + CalculateBarren(); + StopPerformanceTimer(PT_FOOLISH); + SPDLOG_INFO("Calculating Playthrough Done"); + + StartPerformanceTimer(PT_OVERRIDES); + ctx->CreateItemOverrides(); + ctx->GetEntranceShuffler()->CreateEntranceOverrides(); + StopPerformanceTimer(PT_OVERRIDES); + + StartPerformanceTimer(PT_HINTS); + CreateAllHints(); + CreateWarpSongTexts(); + StopPerformanceTimer(PT_HINTS); + SPDLOG_DEBUG("Number of retries {}", retries); + return 1; + } + // Unsuccessful placement + if (retries < 4) { + SPDLOG_DEBUG("Failed to generate a beatable seed. Retrying..."); + Regions::ResetAllLocations(); + logic->Reset(); + ClearProgress(); + } retries++; - ClearProgress(); - continue; - } - SPDLOG_INFO("Shuffling Entrances Done"); } - SetAreas(); - //erase temporary shop items - FilterAndEraseFromPool(ItemPool, [](const auto item) { return Rando::StaticData::RetrieveItem(item).GetItemType() == ITEMTYPE_SHOP; }); - StopPerformanceTimer(PT_ENTRANCE_SHUFFLE); - - //ctx->showItemProgress = true; - //Place shop items first, since a buy shield is needed to place a dungeon reward on Gohma due to access - - StartPerformanceTimer(PT_SHOPSANITY); - if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { - SPDLOG_INFO("Placing Vanilla Shop Items..."); - PlaceVanillaShopItems(); //Place vanilla shop items in vanilla location - } else { - SPDLOG_INFO("Shuffling Shop Items"); - int total_replaced = 0; - if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_RANDOM) || ctx->GetOption(RSK_SHOPSANITY_COUNT).IsNot(RO_SHOPSANITY_COUNT_ZERO_ITEMS)) { //Shopsanity 1-7, random - /* - Indices from OoTR. So shopsanity one will overwrite 7, three will overwrite 7, 5, 8, etc. - 8 6 2 4 - 7 5 1 3 - */ - const std::array indices = { 7, 5, 8, 6, 3, 1, 4, 2 }; - //Overwrite appropriate number of shop items - #define LOCATIONS_PER_SHOP 8 - for (size_t i = 0; i < Rando::StaticData::GetShopLocations().size() / LOCATIONS_PER_SHOP; i++) { - int num_to_replace = GetShopsanityReplaceAmount(); //1-7 shop items will be overwritten, depending on settings - total_replaced += num_to_replace; - for (int j = 0; j < num_to_replace; j++) { - int itemindex = indices[j]; - RandomizerCheck rc = Rando::StaticData::GetShopLocations()[i * LOCATIONS_PER_SHOP + itemindex - 1]; - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc); - uint16_t shopsanityPrice = GetRandomPrice(Rando::StaticData::GetLocation(rc), shopsanityPrices); - itemLoc->SetCustomPrice(shopsanityPrice); - } - } - #undef LOCATIONS_PER_SHOP - } - //Get all locations and items that don't have a shopsanity price attached - std::vector shopLocations = {}; - //Get as many vanilla shop items as the total number of shop items minus the number of replaced items - //So shopsanity 0 will get all 64 vanilla items, shopsanity 4 will get 32, etc. - std::vector shopItems = GetMinVanillaShopItems(total_replaced); - - for (RandomizerCheck& randomizerCheck : Rando::StaticData::GetShopLocations()) { - if (!(ctx->GetItemLocation(randomizerCheck)->HasCustomPrice())) { - shopLocations.push_back(randomizerCheck); - } - } - //Place the shop items which will still be at shop locations - AssumedFill(shopItems, shopLocations); - } - - //Add prices to scrubs - auto scrubLoc = Rando::StaticData::GetScrubLocations(); - if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { - for (size_t i = 0; i < scrubLoc.size(); i++) { - ctx->GetItemLocation(scrubLoc[i])->SetCustomPrice( - GetRandomPrice(Rando::StaticData::GetLocation(scrubLoc[i]), scrubPrices) - ); - } - } else { - for (size_t i = 0; i < scrubLoc.size(); i++) { - ctx->GetItemLocation(scrubLoc[i])->SetCustomPrice( - Rando::StaticData::GetLocation(scrubLoc[i])->GetVanillaPrice() - ); - } - } - - //set merchant prices - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)){ - ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->SetCustomPrice( - GetRandomPrice(Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN), merchantPrices) - ); - } else { - ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->SetCustomPrice( - Rando::StaticData::GetLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetVanillaPrice() - ); - } - - auto merchantLoc = Rando::StaticData::GetMerchantLocations(); - - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)){ - for (size_t i = 0; i < merchantLoc.size(); i++) { - ctx->GetItemLocation(merchantLoc[i])->SetCustomPrice( - GetRandomPrice(Rando::StaticData::GetLocation(merchantLoc[i]), merchantPrices) - ); - } - } else { - for (size_t i = 0; i < merchantLoc.size(); i++) { - ctx->GetItemLocation(merchantLoc[i])->SetCustomPrice( - Rando::StaticData::GetLocation(merchantLoc[i])->GetVanillaPrice() - ); - } - } - StopPerformanceTimer(PT_SHOPSANITY); - - StartPerformanceTimer(PT_OWN_DUNGEON); - //Place dungeon rewards - SPDLOG_INFO("Shuffling and Placing Dungeon Items..."); - RandomizeDungeonRewards(); - - //Place dungeon items restricted to their Own Dungeon - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - RandomizeOwnDungeon(dungeon); - } - StopPerformanceTimer(PT_OWN_DUNGEON); - - StartPerformanceTimer(PT_LIMITED_CHECKS); - //Then Place songs if song shuffle is set to specific locations - if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_ANYWHERE)) { - - //Get each song - std::vector songs = FilterAndEraseFromPool( - ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_SONG; }); - - //Get each song location - std::vector songLocations; - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { - songLocations = FilterFromPool( - ctx->allLocations, [](const auto loc) { return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; }); - - } else if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { - songLocations = FilterFromPool(ctx->allLocations, [](const auto loc) { - return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_BOSS_HEART_OR_OTHER_REWARD || - loc == RC_SHEIK_IN_ICE_CAVERN || - loc == RC_SONG_FROM_IMPA; - }); - } - - AssumedFill(songs, songLocations, true); - } - - //Then place dungeon items that are assigned to restrictive location pools - RandomizeDungeonItems(); - SPDLOG_INFO("Dungeon Items Done"); - - //Then place Link's Pocket Item if it has to be an advancement item - RandomizeLinksPocket(); - StopPerformanceTimer(PT_LIMITED_CHECKS); - - - StartPerformanceTimer(PT_ADVANCEMENT_ITEMS); - SPDLOG_INFO("Shuffling Advancement Items"); - //Then place the rest of the advancement items - std::vector remainingAdvancementItems = - FilterAndEraseFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).IsAdvancement(); }); - AssumedFill(remainingAdvancementItems, ctx->allLocations, true); - StopPerformanceTimer(PT_ADVANCEMENT_ITEMS); - - StartPerformanceTimer(PT_REMAINING_ITEMS); - //Fast fill for the rest of the pool - SPDLOG_INFO("Shuffling Remaining Items"); - std::vector remainingPool = FilterAndEraseFromPool(ItemPool, [](const auto i) { return true; }); - FastFill(remainingPool, GetAllEmptyLocations(), false); - StopPerformanceTimer(PT_REMAINING_ITEMS); - - - StartPerformanceTimer(PT_PLAYTHROUGH_GENERATION); - GeneratePlaythrough(); - StopPerformanceTimer(PT_PLAYTHROUGH_GENERATION); - //Successful placement, produced beatable result - if(ctx->playthroughBeatable && !placementFailure) { - - SPDLOG_INFO("Calculating Playthrough..."); - StartPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); - PareDownPlaythrough(); - StopPerformanceTimer(PT_PARE_DOWN_PLAYTHROUGH); - - StartPerformanceTimer(PT_WOTH); - CalculateWotH(); - StopPerformanceTimer(PT_WOTH); - - StartPerformanceTimer(PT_FOOLISH); - CalculateBarren(); - StopPerformanceTimer(PT_FOOLISH); - SPDLOG_INFO("Calculating Playthrough Done"); - - StartPerformanceTimer(PT_OVERRIDES); - ctx->CreateItemOverrides(); - ctx->GetEntranceShuffler()->CreateEntranceOverrides(); - StopPerformanceTimer(PT_OVERRIDES); - - StartPerformanceTimer(PT_HINTS); - CreateAllHints(); - CreateWarpSongTexts(); - StopPerformanceTimer(PT_HINTS); - SPDLOG_DEBUG("Number of retries {}", retries); - return 1; - } - //Unsuccessful placement - if(retries < 4) { - SPDLOG_DEBUG("Failed to generate a beatable seed. Retrying..."); - Regions::ResetAllLocations(); - logic->Reset(); - ClearProgress(); - } - retries++; - } - //All retries failed - return -1; + // All retries failed + return -1; } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index f0d7742f0..5d880f047 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -2422,4 +2422,4 @@ void StaticData::HintTable_Init() { // clang-format on } -} +} // namespace Rando 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 a54de6b64..1347945ec 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 @@ -2227,4 +2227,4 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // clang-format on } -} +} // namespace Rando 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 6d5242a5d..11d89d837 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 @@ -2017,4 +2017,4 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // clang-format on } -} +} // namespace Rando 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 9f4a0026a..ba0468849 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 @@ -2173,4 +2173,4 @@ void StaticData::HintTable_Init_Item() { // clang-format on } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index 932b97316..c55145fcd 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -13,16 +13,11 @@ #include "../hint.h" #include "../static_data.h" - using namespace Rando; -HintDistributionSetting::HintDistributionSetting(std::string _name, - HintType _type, - uint32_t _weight, - uint8_t _fixed, - uint8_t _copies, - std::function _filter, - uint8_t _dungeonLimit){ +HintDistributionSetting::HintDistributionSetting(std::string _name, HintType _type, uint32_t _weight, uint8_t _fixed, + uint8_t _copies, std::function _filter, + uint8_t _dungeonLimit) { name = _name; type = _type; weight = _weight; @@ -30,10 +25,12 @@ HintDistributionSetting::HintDistributionSetting(std::string _name, copies = _copies; filter = _filter; dungeonLimit = _dungeonLimit; - } +} -HintText::HintText(CustomMessage clearText_, std::vector ambiguousText_, std::vector obscureText_) -: clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)){} +HintText::HintText(CustomMessage clearText_, std::vector ambiguousText_, + std::vector obscureText_) + : clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)) { +} const CustomMessage& HintText::GetClear() const { return clearText; @@ -44,7 +41,7 @@ const CustomMessage& HintText::GetObscure() const { } const CustomMessage& HintText::GetObscure(uint8_t selection) const { - if (obscureText.size() > selection){ + if (obscureText.size() > selection) { return obscureText[selection]; } else if (obscureText.size() > 0) { return obscureText[0]; @@ -57,7 +54,7 @@ const CustomMessage& HintText::GetAmbiguous() const { } const CustomMessage& HintText::GetAmbiguous(uint8_t selection) const { - if (ambiguousText.size() > selection){ + if (ambiguousText.size() > selection) { return ambiguousText[selection]; } else if (ambiguousText.size() > 0) { return ambiguousText[0]; @@ -65,11 +62,11 @@ const CustomMessage& HintText::GetAmbiguous(uint8_t selection) const { return clearText; } -uint8_t HintText::GetAmbiguousSize() const{ +uint8_t HintText::GetAmbiguousSize() const { return ambiguousText.size(); } -uint8_t HintText::GetObscureSize() const{ +uint8_t HintText::GetObscureSize() const { return obscureText.size(); } @@ -96,66 +93,65 @@ const CustomMessage HintText::GetMessageCopy() const { } bool HintText::operator==(const HintText& right) const { - return obscureText == right.obscureText && - ambiguousText == right.ambiguousText && - clearText == right.clearText; + return obscureText == right.obscureText && ambiguousText == right.ambiguousText && clearText == right.clearText; } bool HintText::operator!=(const HintText& right) const { return !operator==(right); } -StaticHintInfo::StaticHintInfo(HintType _type, std::vector _hintKeys, RandomizerSettingKey _setting, - std::variant _condition, std::vector _targetChecks, - std::vector _targetItems, std::vector _hintChecks, bool _yourPocket, int _num): - type(_type), hintKeys(_hintKeys), setting(_setting), condition(_condition), targetChecks(_targetChecks), - targetItems(_targetItems), hintChecks(_hintChecks), yourPocket(_yourPocket), num(_num){} +StaticHintInfo::StaticHintInfo(HintType _type, std::vector _hintKeys, + RandomizerSettingKey _setting, std::variant _condition, + std::vector _targetChecks, std::vector _targetItems, + std::vector _hintChecks, bool _yourPocket, int _num) + : type(_type), hintKeys(_hintKeys), setting(_setting), condition(_condition), targetChecks(_targetChecks), + targetItems(_targetItems), hintChecks(_hintChecks), yourPocket(_yourPocket), num(_num) { +} -RandomizerHintTextKey GetRandomJunkHint(){ +RandomizerHintTextKey GetRandomJunkHint() { // Temp code to handle random junk hints now I work in keys instead of a vector of HintText // Will be replaced with a better system once more customisable hint pools are added uint32_t range = RHT_JUNK71 - RHT_JUNK01; return (RandomizerHintTextKey)(Random(0, range) + RHT_JUNK01); } -RandomizerHintTextKey GetRandomGanonJoke(){ - uint32_t range = RHT_GANON_JOKE11 - RHT_GANON_JOKE01; - return (RandomizerHintTextKey)(Random(0, range) + RHT_GANON_JOKE01); +RandomizerHintTextKey GetRandomGanonJoke() { + uint32_t range = RHT_GANON_JOKE11 - RHT_GANON_JOKE01; + return (RandomizerHintTextKey)(Random(0, range) + RHT_GANON_JOKE01); } - -bool FilterWotHLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return ctx->GetItemLocation(loc)->IsWothCandidate(); +bool FilterWotHLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(loc)->IsWothCandidate(); } -bool FilterFoolishLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return ctx->GetItemLocation(loc)->IsFoolishCandidate(); +bool FilterFoolishLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(loc)->IsFoolishCandidate(); } -bool FilterSongLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; +bool FilterSongLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION; } -bool FilterOverworldLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return Rando::StaticData::GetLocation(loc)->IsOverworld(); +bool FilterOverworldLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return Rando::StaticData::GetLocation(loc)->IsOverworld(); } -bool FilterDungeonLocations(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return Rando::StaticData::GetLocation(loc)->IsDungeon(); +bool FilterDungeonLocations(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return Rando::StaticData::GetLocation(loc)->IsDungeon(); } -bool FilterGoodItems(RandomizerCheck loc){ - auto ctx = Rando::Context::GetInstance(); - return ctx->GetItemLocation(loc)->GetPlacedItem().IsMajorItem(); +bool FilterGoodItems(RandomizerCheck loc) { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetItemLocation(loc)->GetPlacedItem().IsMajorItem(); } -bool NoFilter(RandomizerCheck loc){ - return true; +bool NoFilter(RandomizerCheck loc) { + return true; } const std::array hintSettingTable{{ @@ -225,15 +221,16 @@ uint8_t StonesRequiredBySettings() { 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).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))) { + } 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).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).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).Get() - 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).Get() - 6 )}); + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Get() - 6) }); } return stones; } @@ -245,15 +242,17 @@ uint8_t MedallionsRequiredBySettings() { 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).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)) { + } 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).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).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).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).Get() - 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).Get() - 3) }); } return medallions; } @@ -271,555 +270,601 @@ uint8_t TokensRequiredBySettings() { } std::vector>> conditionalAlwaysHints = { - std::make_pair(RC_MARKET_10_BIG_POES, []() { + std::make_pair(RC_MARKET_10_BIG_POES, + []() { auto ctx = Rando::Context::GetInstance(); 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, []() { + std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_MASK_SHOP_HINT) && !ctx->GetOption(RSK_COMPLETE_MASK_QUEST); }), - std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, []() { - auto ctx = Rando::Context::GetInstance(); - return StonesRequiredBySettings() < 2 && !ctx->GetOption(RSK_OOT_HINT); + std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, + []() { + auto ctx = Rando::Context::GetInstance(); + return StonesRequiredBySettings() < 2 && !ctx->GetOption(RSK_OOT_HINT); }), std::make_pair(RC_HF_OCARINA_OF_TIME_ITEM, []() { return StonesRequiredBySettings() < 2; }), std::make_pair(RC_SHEIK_IN_KAKARIKO, []() { return MedallionsRequiredBySettings() < 5; }), - std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, []() { + std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_BIGGORON_HINT); }), - std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_30_SKULLS_HINT) && TokensRequiredBySettings() < 30; }), - std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_40_SKULLS_HINT) && TokensRequiredBySettings() < 40; }), - std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_50_SKULLS_HINT) && TokensRequiredBySettings() < 50; }), - std::make_pair(RC_ZR_FROGS_OCARINA_GAME, []() { + std::make_pair(RC_ZR_FROGS_OCARINA_GAME, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_FROGS_HINT); }), - std::make_pair(RC_KF_LINKS_HOUSE_COW, []() { + std::make_pair(RC_KF_LINKS_HOUSE_COW, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_MALON_HINT); }), - std::make_pair(RC_KAK_100_GOLD_SKULLTULA_REWARD, []() { + std::make_pair(RC_KAK_100_GOLD_SKULLTULA_REWARD, + []() { auto ctx = Rando::Context::GetInstance(); return !ctx->GetOption(RSK_KAK_100_SKULLS_HINT) && TokensRequiredBySettings() < 100; }), }; static std::vector GetEmptyGossipStones() { - auto emptyGossipStones = GetEmptyLocations(Rando::StaticData::GetGossipStoneLocations()); - return emptyGossipStones; + auto emptyGossipStones = GetEmptyLocations(Rando::StaticData::GetGossipStoneLocations()); + return emptyGossipStones; } static std::vector GetAccessibleGossipStones(const RandomizerCheck hintedLocation = RC_GANON) { - auto ctx = Rando::Context::GetInstance(); - //temporarily remove the hinted location's item, and then perform a - //reachability search for gossip stone locations. - RandomizerGet originalItem = ctx->GetItemLocation(hintedLocation)->GetPlacedRandomizerGet(); - ctx->GetItemLocation(hintedLocation)->SetPlacedItem(RG_NONE); + auto ctx = Rando::Context::GetInstance(); + // temporarily remove the hinted location's item, and then perform a + // reachability search for gossip stone locations. + RandomizerGet originalItem = ctx->GetItemLocation(hintedLocation)->GetPlacedRandomizerGet(); + ctx->GetItemLocation(hintedLocation)->SetPlacedItem(RG_NONE); - ctx->GetLogic()->Reset(); - auto accessibleGossipStones = ReachabilitySearch(Rando::StaticData::GetGossipStoneLocations()); - //Give the item back to the location - ctx->GetItemLocation(hintedLocation)->SetPlacedItem(originalItem); - - return accessibleGossipStones; -} - -bool IsReachableWithout(std::vector locsToCheck, RandomizerCheck excludedCheck, bool resetAfter = true){ - //temporarily remove the hinted location's item, and then perform a - //reachability search for this check RANDOTODO convert excludedCheck to an ItemLocation - auto ctx = Rando::Context::GetInstance(); - RandomizerGet originalItem = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); - ctx->GetLogic()->Reset(); - const auto rechableWithout = ReachabilitySearch(locsToCheck); - ctx->GetItemLocation(excludedCheck)->SetPlacedItem(originalItem); - if (resetAfter){ - //if resetAfter is on, reset logic we are done ctx->GetLogic()->Reset(); - } - if (rechableWithout.empty()) { - return false; - } - return true; + auto accessibleGossipStones = ReachabilitySearch(Rando::StaticData::GetGossipStoneLocations()); + // Give the item back to the location + ctx->GetItemLocation(hintedLocation)->SetPlacedItem(originalItem); + + return accessibleGossipStones; } -static void SetAllInAreaAsHintAccesible(RandomizerArea area, std::vector locations){ - auto ctx = Rando::Context::GetInstance(); - std::vector locsInArea = FilterFromPool(locations, [area, ctx](const RandomizerCheck loc){ - return ctx->GetItemLocation(loc)->GetAreas().contains(area); - }); - for(RandomizerCheck loc: locsInArea){ - ctx->GetItemLocation(loc)->SetHintAccesible(); - } +bool IsReachableWithout(std::vector locsToCheck, RandomizerCheck excludedCheck, + bool resetAfter = true) { + // temporarily remove the hinted location's item, and then perform a + // reachability search for this check RANDOTODO convert excludedCheck to an ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerGet originalItem = ctx->GetItemLocation(excludedCheck)->GetPlacedRandomizerGet(); + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(RG_NONE); + ctx->GetLogic()->Reset(); + const auto rechableWithout = ReachabilitySearch(locsToCheck); + ctx->GetItemLocation(excludedCheck)->SetPlacedItem(originalItem); + if (resetAfter) { + // if resetAfter is on, reset logic we are done + ctx->GetLogic()->Reset(); + } + if (rechableWithout.empty()) { + return false; + } + return true; } -static void AddGossipStoneHint( const RandomizerCheck gossipStone, - const HintType hintType, - const std::string distributionName, - const std::vector hintKeys, - const std::vector locations, - const std::vector areas, - const std::vector trials) { - auto ctx = Rando::Context::GetInstance(); - ctx->AddHint(StaticData::gossipStoneCheckToHint[gossipStone], Hint(StaticData::gossipStoneCheckToHint[gossipStone], hintType, distributionName, hintKeys, locations, areas, trials)); - ctx->GetItemLocation(gossipStone)->SetPlacedItem(RG_HINT); //RANDOTODO, better gossip stone to location to hint key system +static void SetAllInAreaAsHintAccesible(RandomizerArea area, std::vector locations) { + auto ctx = Rando::Context::GetInstance(); + std::vector locsInArea = FilterFromPool(locations, [area, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetAreas().contains(area); + }); + for (RandomizerCheck loc : locsInArea) { + ctx->GetItemLocation(loc)->SetHintAccesible(); + } } -static void AddGossipStoneHintCopies(uint8_t copies, - const HintType hintType, - const std::string distributionName, +static void AddGossipStoneHint(const RandomizerCheck gossipStone, const HintType hintType, + const std::string distributionName, const std::vector hintKeys, + const std::vector locations, const std::vector areas, + const std::vector trials) { + auto ctx = Rando::Context::GetInstance(); + ctx->AddHint(StaticData::gossipStoneCheckToHint[gossipStone], + Hint(StaticData::gossipStoneCheckToHint[gossipStone], hintType, distributionName, hintKeys, locations, + areas, trials)); + ctx->GetItemLocation(gossipStone) + ->SetPlacedItem(RG_HINT); // RANDOTODO, better gossip stone to location to hint key system +} + +static void AddGossipStoneHintCopies(uint8_t copies, const HintType hintType, const std::string distributionName, const std::vector hintKeys = {}, const std::vector locations = {}, const std::vector areas = {}, const std::vector trials = {}, - RandomizerCheck firstStone = RC_UNKNOWN_CHECK){ + RandomizerCheck firstStone = RC_UNKNOWN_CHECK) { - if (firstStone != RC_UNKNOWN_CHECK && copies > 0){ - AddGossipStoneHint(firstStone, hintType, distributionName, hintKeys, locations, areas, trials); - copies -= 1; - } - for(int c=0; c 0) { + AddGossipStoneHint(firstStone, hintType, distributionName, hintKeys, locations, areas, trials); + copies -= 1; + } + for (int c = 0; c < copies; c++) { + // get a random gossip stone + auto gossipStones = GetEmptyGossipStones(); + if (gossipStones.empty()) { + SPDLOG_DEBUG("\tNO GOSSIP STONES TO PLACE HINT\n\n"); + return; + } + auto gossipStone = RandomElement(gossipStones, false); + AddGossipStoneHint(gossipStone, hintType, distributionName, hintKeys, locations, areas, trials); } - auto gossipStone = RandomElement(gossipStones, false); - AddGossipStoneHint(gossipStone, hintType, distributionName, hintKeys, locations, areas, trials); - } } -static bool CreateHint(RandomizerCheck location, uint8_t copies, HintType type, std::string distribution){ - auto ctx = Rando::Context::GetInstance(); +static bool CreateHint(RandomizerCheck location, uint8_t copies, HintType type, std::string distribution) { + auto ctx = Rando::Context::GetInstance(); - //get a gossip stone accessible without the hinted item - std::vector gossipStoneLocations = GetAccessibleGossipStones(location); - if (gossipStoneLocations.empty()) { - SPDLOG_DEBUG("\tNO IN LOGIC GOSSIP STONE\n\n"); - return false; - } - RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); - RandomizerArea area = ctx->GetItemLocation(location)->GetRandomArea(); + // get a gossip stone accessible without the hinted item + std::vector gossipStoneLocations = GetAccessibleGossipStones(location); + if (gossipStoneLocations.empty()) { + SPDLOG_DEBUG("\tNO IN LOGIC GOSSIP STONE\n\n"); + return false; + } + RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); + RandomizerArea area = ctx->GetItemLocation(location)->GetRandomArea(); - //Set that hints are accesible - ctx->GetItemLocation(location)->SetHintAccesible(); - if (type == HINT_TYPE_FOOLISH){ - SetAllInAreaAsHintAccesible(area, ctx->allLocations); - } + // Set that hints are accesible + ctx->GetItemLocation(location)->SetHintAccesible(); + if (type == HINT_TYPE_FOOLISH) { + SetAllInAreaAsHintAccesible(area, ctx->allLocations); + } - AddGossipStoneHintCopies(copies, type, distribution, {}, {location}, {area}, {}, gossipStone); - return true; + AddGossipStoneHintCopies(copies, type, distribution, {}, { location }, { area }, {}, gossipStone); + return true; } +static RandomizerCheck CreateRandomHint(std::vector& possibleHintLocations, uint8_t copies, + HintType type, std::string distributionName) { + auto ctx = Rando::Context::GetInstance(); -static RandomizerCheck CreateRandomHint(std::vector& possibleHintLocations, - uint8_t copies, - HintType type, - std::string distributionName) { - auto ctx = Rando::Context::GetInstance(); - - //return if there aren't any hintable locations or gossip stones available - if (GetEmptyGossipStones().size() < copies) { - SPDLOG_DEBUG("\tNOT ENOUGH GOSSIP STONES TO PLACE HINTS\n\n"); - return RC_UNKNOWN_CHECK; - } - - RandomizerCheck hintedLocation; - bool placed = false; - while (!placed){ - if (possibleHintLocations.empty()) { - SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); - return RC_UNKNOWN_CHECK; + // return if there aren't any hintable locations or gossip stones available + if (GetEmptyGossipStones().size() < copies) { + SPDLOG_DEBUG("\tNOT ENOUGH GOSSIP STONES TO PLACE HINTS\n\n"); + return RC_UNKNOWN_CHECK; } - hintedLocation = RandomElement(possibleHintLocations, true); //removing the location to avoid it being hinted again on fail - - SPDLOG_DEBUG("\tLocation: "); - SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); - SPDLOG_DEBUG("\n"); - SPDLOG_DEBUG("\tItem: "); - SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); - SPDLOG_DEBUG("\n"); + RandomizerCheck hintedLocation; + bool placed = false; + while (!placed) { + if (possibleHintLocations.empty()) { + SPDLOG_DEBUG("\tNO LOCATIONS TO HINT\n\n"); + return RC_UNKNOWN_CHECK; + } + hintedLocation = + RandomElement(possibleHintLocations, true); // removing the location to avoid it being hinted again on fail - placed = CreateHint(hintedLocation, copies, type, distributionName); - } - return hintedLocation; + SPDLOG_DEBUG("\tLocation: "); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(hintedLocation)->GetName()); + SPDLOG_DEBUG("\n"); + + SPDLOG_DEBUG("\tItem: "); + SPDLOG_DEBUG(ctx->GetItemLocation(hintedLocation)->GetPlacedItemName().GetEnglish()); + SPDLOG_DEBUG("\n"); + + placed = CreateHint(hintedLocation, copies, type, distributionName); + } + return hintedLocation; } static std::vector FilterHintability(std::vector& locations, - std::function extraFilter = NoFilter){ - auto ctx = Rando::Context::GetInstance(); - return FilterFromPool(locations, [extraFilter, ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsAHintAccessible()) - && extraFilter(loc); - }); + std::function extraFilter = NoFilter) { + auto ctx = Rando::Context::GetInstance(); + return FilterFromPool(locations, [extraFilter, ctx](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsAHintAccessible()) && + extraFilter(loc); + }); } static void CreateJunkHints(uint8_t numHints) { - for(uint8_t c = 0; c < numHints; c++){ - //duplicate junk hints are possible for now - AddGossipStoneHintCopies(1, HINT_TYPE_HINT_KEY, "Junk", {GetRandomJunkHint()}); - } + for (uint8_t c = 0; c < numHints; c++) { + // duplicate junk hints are possible for now + AddGossipStoneHintCopies(1, HINT_TYPE_HINT_KEY, "Junk", { GetRandomJunkHint() }); + } } static void CreateTrialHints(uint8_t copies) { - if (copies > 0) { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_TRIAL_COUNT).Is(6)) {//six trials - AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", {RHT_SIX_TRIALS}); - } else if (ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) {//zero trials - 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).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();}); - } - for (auto& trial : trials) {//create a hint for each hinted trial - AddGossipStoneHintCopies(copies, HINT_TYPE_TRIAL, "Trial", {}, {}, {}, {trial->GetTrialKey()}); - } + if (copies > 0) { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_TRIAL_COUNT).Is(6)) { // six trials + AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", { RHT_SIX_TRIALS }); + } else if (ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { // zero trials + 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).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(); }); + } + for (auto& trial : trials) { // create a hint for each hinted trial + AddGossipStoneHintCopies(copies, HINT_TYPE_TRIAL, "Trial", {}, {}, {}, { trial->GetTrialKey() }); + } + } } - } } void CreateWarpSongTexts() { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_WARP_SONG_HINTS)){ - auto warpSongEntrances = GetShuffleableEntrances(EntranceType::WarpSong, false); - for (auto entrance : warpSongEntrances) { - //RANDOTODO make random - RandomizerArea destination = entrance->GetConnectedRegion()->GetFirstArea(); - switch (entrance->GetIndex()) { - case 0x0600: // minuet RANDOTODO make into entrance hints when they are added - ctx->AddHint(RH_MINUET_WARP_LOC, Hint(RH_MINUET_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x04F6: // bolero - ctx->AddHint(RH_BOLERO_WARP_LOC, Hint(RH_BOLERO_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x0604: // serenade - ctx->AddHint(RH_SERENADE_WARP_LOC, Hint(RH_SERENADE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x01F1: // requiem - ctx->AddHint(RH_REQUIEM_WARP_LOC, Hint(RH_REQUIEM_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x0568: // nocturne - ctx->AddHint(RH_NOCTURNE_WARP_LOC, Hint(RH_NOCTURNE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - case 0x05F4: // prelude - ctx->AddHint(RH_PRELUDE_WARP_LOC, Hint(RH_PRELUDE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); - break; - default: - break; - } - } - } -} - -int32_t getRandomWeight(int32_t totalWeight){ - if (totalWeight <= 1){ - return 1; - } - return Random(1,totalWeight); -} - -static void DistributeHints(std::vector& selected, size_t stoneCount, std::vector distTable, uint8_t junkWieght, bool addFixed = true){ - int32_t totalWeight = junkWieght; //Start with our Junk Weight, the natural chance of a junk hint - - for (size_t c=0; c < distTable.size(); c++){ //Gather the weights of each distribution and, if it's the first pass, apply fixed hints - totalWeight += distTable[c].weight; //Note that PlaceHints will set weights of distributions to zero if it can't place anything from them - if (addFixed){ - selected[c] += distTable[c].fixed; - stoneCount -= distTable[c].fixed * distTable[c].copies; - } - } - int32_t currentWeight = getRandomWeight(totalWeight); //Initialise with the first random weight from 1 to the total. - while(stoneCount > 0 && totalWeight > 0){//Loop until we run out of stones or have no TotalWeight. 0 totalWeight means junkWeight is 0 - //and that all weights have been 0'd out for another reason, and skips to placing all junk hints - for (size_t distribution = 0; distribution < distTable.size(); distribution++){ - currentWeight -= distTable[distribution].weight; //go over each distribution, subtracting the weight each time. Once we reach zero or less, - if (currentWeight <= 0){ //tell the system to make 1 of that hint, unless not enough stones remain - if (stoneCount >= distTable[distribution].copies && distTable[distribution].copies > 0){ - selected[distribution] += 1; //if we have enough stones, and copies are not zero, assign 1 to this hint type, remove the stones, and break - stoneCount -= distTable[distribution].copies; - break; //This leaves the whole for loop - } else { //If we don't have the stones, or copies is 0 despite there being the wieght to trigger a hit, temporerally set wieght to zero - totalWeight -= distTable[distribution].weight; //Unlike PlaceHint, distTable is passed by value here, making this temporary - distTable[distribution].weight = 0; //this is so we can still roll this hint type if more stones free up later - break; + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_WARP_SONG_HINTS)) { + auto warpSongEntrances = GetShuffleableEntrances(EntranceType::WarpSong, false); + for (auto entrance : warpSongEntrances) { + // RANDOTODO make random + RandomizerArea destination = entrance->GetConnectedRegion()->GetFirstArea(); + switch (entrance->GetIndex()) { + case 0x0600: // minuet RANDOTODO make into entrance hints when they are added + ctx->AddHint(RH_MINUET_WARP_LOC, + Hint(RH_MINUET_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + case 0x04F6: // bolero + ctx->AddHint(RH_BOLERO_WARP_LOC, + Hint(RH_BOLERO_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + case 0x0604: // serenade + ctx->AddHint(RH_SERENADE_WARP_LOC, Hint(RH_SERENADE_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, + {}, { destination })); + break; + case 0x01F1: // requiem + ctx->AddHint(RH_REQUIEM_WARP_LOC, + Hint(RH_REQUIEM_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + case 0x0568: // nocturne + ctx->AddHint(RH_NOCTURNE_WARP_LOC, Hint(RH_NOCTURNE_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, + {}, { destination })); + break; + case 0x05F4: // prelude + ctx->AddHint(RH_PRELUDE_WARP_LOC, + Hint(RH_PRELUDE_WARP_LOC, HINT_TYPE_AREA, "", { RHT_WARP_SONG }, {}, { destination })); + break; + default: + break; + } } - } } - //if there's still weight then it's junk, as the leftover weight is junkWeight - if (currentWeight > 0){ //zero TotalWeight breaks the while loop and hits the fallback, so skipping this is fine in that case - selected[selected.size()-1] += 1; - stoneCount -= 1; - } - currentWeight = getRandomWeight(totalWeight); - } - //if stones are left, assign junk to every remaining stone as a fallback. - if (stoneCount > 0){ - selected[selected.size()-1] += stoneCount; - } } -uint8_t PlaceHints(std::vector& selectedHints, std::vector& distTable){ - auto ctx = Rando::Context::GetInstance(); - uint8_t curSlot = 0; - for (HintDistributionSetting distribution : distTable){ - std::vector hintTypePool = FilterHintability(ctx->allLocations, distribution.filter); - for (uint8_t numHint = 0; numHint < selectedHints[curSlot]; numHint++){ - hintTypePool = FilterHintability(hintTypePool); - SPDLOG_DEBUG("Attempting to make hint of type: " + StaticData::hintTypeNames[distribution.type].GetEnglish(MF_CLEAN) + "\n"); - RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK; - - hintedLocation = CreateRandomHint(hintTypePool, distribution.copies, distribution.type, distribution.name); - - if (hintedLocation == RC_UNKNOWN_CHECK){ //if hint failed to place, remove all wieght and copies then return the number of stones to redistribute - uint8_t hintsToRemove = (selectedHints[curSlot] - numHint) * distribution.copies; - selectedHints[curSlot] = 0; //as distTable is passed by refernce here, these changes stick for the rest of this seed generation - distTable[curSlot].copies = 0;//and prevent future distribution from choosing this slot - distTable[curSlot].weight = 0; - return hintsToRemove; - } - if(Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()){ - distribution.dungeonLimit -= 1; - if (distribution.dungeonLimit == 0){ - FilterFromPool(hintTypePool, FilterOverworldLocations); - } - } +int32_t getRandomWeight(int32_t totalWeight) { + if (totalWeight <= 1) { + return 1; } - selectedHints[curSlot] = 0; - curSlot += 1; - } - CreateJunkHints(selectedHints[selectedHints.size() - 1]); - return 0; + return Random(1, totalWeight); +} + +static void DistributeHints(std::vector& selected, size_t stoneCount, + std::vector distTable, uint8_t junkWieght, bool addFixed = true) { + int32_t totalWeight = junkWieght; // Start with our Junk Weight, the natural chance of a junk hint + + for (size_t c = 0; c < distTable.size(); + c++) { // Gather the weights of each distribution and, if it's the first pass, apply fixed hints + totalWeight += distTable[c].weight; // Note that PlaceHints will set weights of distributions to zero if it + // can't place anything from them + if (addFixed) { + selected[c] += distTable[c].fixed; + stoneCount -= distTable[c].fixed * distTable[c].copies; + } + } + int32_t currentWeight = getRandomWeight(totalWeight); // Initialise with the first random weight from 1 to the + // total. + while (stoneCount > 0 && + totalWeight > + 0) { // Loop until we run out of stones or have no TotalWeight. 0 totalWeight means junkWeight is 0 + // and that all weights have been 0'd out for another reason, and skips to placing all junk hints + for (size_t distribution = 0; distribution < distTable.size(); distribution++) { + currentWeight -= + distTable[distribution] + .weight; // go over each distribution, subtracting the weight each time. Once we reach zero or less, + if (currentWeight <= 0) { // tell the system to make 1 of that hint, unless not enough stones remain + if (stoneCount >= distTable[distribution].copies && distTable[distribution].copies > 0) { + selected[distribution] += 1; // if we have enough stones, and copies are not zero, assign 1 to this + // hint type, remove the stones, and break + stoneCount -= distTable[distribution].copies; + break; // This leaves the whole for loop + } else { // If we don't have the stones, or copies is 0 despite there being the wieght to trigger a hit, + // temporerally set wieght to zero + totalWeight -= + distTable[distribution] + .weight; // Unlike PlaceHint, distTable is passed by value here, making this temporary + distTable[distribution].weight = + 0; // this is so we can still roll this hint type if more stones free up later + break; + } + } + } + // if there's still weight then it's junk, as the leftover weight is junkWeight + if (currentWeight > + 0) { // zero TotalWeight breaks the while loop and hits the fallback, so skipping this is fine in that case + selected[selected.size() - 1] += 1; + stoneCount -= 1; + } + currentWeight = getRandomWeight(totalWeight); + } + // if stones are left, assign junk to every remaining stone as a fallback. + if (stoneCount > 0) { + selected[selected.size() - 1] += stoneCount; + } +} + +uint8_t PlaceHints(std::vector& selectedHints, std::vector& distTable) { + auto ctx = Rando::Context::GetInstance(); + uint8_t curSlot = 0; + for (HintDistributionSetting distribution : distTable) { + std::vector hintTypePool = FilterHintability(ctx->allLocations, distribution.filter); + for (uint8_t numHint = 0; numHint < selectedHints[curSlot]; numHint++) { + hintTypePool = FilterHintability(hintTypePool); + SPDLOG_DEBUG("Attempting to make hint of type: " + + StaticData::hintTypeNames[distribution.type].GetEnglish(MF_CLEAN) + "\n"); + RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK; + + hintedLocation = CreateRandomHint(hintTypePool, distribution.copies, distribution.type, distribution.name); + + if (hintedLocation == RC_UNKNOWN_CHECK) { // if hint failed to place, remove all wieght and copies then + // return the number of stones to redistribute + uint8_t hintsToRemove = (selectedHints[curSlot] - numHint) * distribution.copies; + selectedHints[curSlot] = 0; // as distTable is passed by refernce here, these changes stick for the rest + // of this seed generation + distTable[curSlot].copies = 0; // and prevent future distribution from choosing this slot + distTable[curSlot].weight = 0; + return hintsToRemove; + } + if (Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()) { + distribution.dungeonLimit -= 1; + if (distribution.dungeonLimit == 0) { + FilterFromPool(hintTypePool, FilterOverworldLocations); + } + } + } + selectedHints[curSlot] = 0; + curSlot += 1; + } + CreateJunkHints(selectedHints[selectedHints.size() - 1]); + return 0; } void CreateStoneHints() { - auto ctx = Rando::Context::GetInstance(); - SPDLOG_DEBUG("\nNOW CREATING HINTS\n"); - const HintSetting& hintSetting = hintSettingTable[ctx->GetOption(RSK_HINT_DISTRIBUTION).Get()]; - std::vector distTable = hintSetting.distTable; + auto ctx = Rando::Context::GetInstance(); + SPDLOG_DEBUG("\nNOW CREATING HINTS\n"); + const HintSetting& hintSetting = hintSettingTable[ctx->GetOption(RSK_HINT_DISTRIBUTION).Get()]; + std::vector distTable = hintSetting.distTable; - // Apply impa's song exclusions when zelda is skipped - if(ctx->GetOption(RSK_SKIP_CHILD_ZELDA)){ - ctx->GetItemLocation(RC_SONG_FROM_IMPA)->SetHintAccesible(); - } - - // Add 'always' location hints - std::vector alwaysHintLocations = {}; - if (hintSetting.alwaysCopies > 0) { - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)){ - // If we have Rainbow Bridge set to Greg and the greg hint isn't useful, add a hint for where Greg is - // Do we really need this with the greg hint? - auto gregLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { - return ( - (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && - ctx->GetItemLocation(loc)->IsHintable() && - !(ctx->GetOption(RSK_GREG_HINT) && (IsReachableWithout({RC_GREG_HINT}, loc, true))); - }); - if (gregLocations.size() > 0){ - alwaysHintLocations.push_back(gregLocations[0]); - } + // Apply impa's song exclusions when zelda is skipped + if (ctx->GetOption(RSK_SKIP_CHILD_ZELDA)) { + ctx->GetItemLocation(RC_SONG_FROM_IMPA)->SetHintAccesible(); } - for (auto& hint : conditionalAlwaysHints) { - RandomizerCheck loc = hint.first; - if (hint.second() && ctx->GetItemLocation(loc)->IsHintable()) { - alwaysHintLocations.push_back(loc); + // Add 'always' location hints + std::vector alwaysHintLocations = {}; + if (hintSetting.alwaysCopies > 0) { + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { + // If we have Rainbow Bridge set to Greg and the greg hint isn't useful, add a hint for where Greg is + // Do we really need this with the greg hint? + auto gregLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ((ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && + ctx->GetItemLocation(loc)->IsHintable() && + !(ctx->GetOption(RSK_GREG_HINT) && (IsReachableWithout({ RC_GREG_HINT }, loc, true))); + }); + if (gregLocations.size() > 0) { + alwaysHintLocations.push_back(gregLocations[0]); + } + } + + for (auto& hint : conditionalAlwaysHints) { + RandomizerCheck loc = hint.first; + if (hint.second() && ctx->GetItemLocation(loc)->IsHintable()) { + alwaysHintLocations.push_back(loc); + } + } + + for (RandomizerCheck location : alwaysHintLocations) { + CreateHint(location, hintSetting.alwaysCopies, HINT_TYPE_ITEM, "Always"); } } - for (RandomizerCheck location : alwaysHintLocations) { - CreateHint(location, hintSetting.alwaysCopies, HINT_TYPE_ITEM, "Always"); + // Add 'trial' location hints + if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP)) { + CreateTrialHints(hintSetting.trialCopies); } - } - //Add 'trial' location hints - if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP)) { - CreateTrialHints(hintSetting.trialCopies); - } - - size_t totalStones = GetEmptyGossipStones().size(); - std::vector selectedHints = {}; - for (size_t c=0; c < distTable.size(); c++){ + size_t totalStones = GetEmptyGossipStones().size(); + std::vector selectedHints = {}; + for (size_t c = 0; c < distTable.size(); c++) { + selectedHints.push_back(0); + } selectedHints.push_back(0); - } - selectedHints.push_back(0); - DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight); - - while(totalStones != 0){ - totalStones = PlaceHints(selectedHints, distTable); - if (totalStones != 0){ - DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight, false); - } - } + DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight); - //Getting gossip stone locations temporarily sets one location to not be reachable. - //Call the function one last time to get rid of false positives on locations not - //being reachable. - ReachabilitySearch({}); + while (totalStones != 0) { + totalStones = PlaceHints(selectedHints, distTable); + if (totalStones != 0) { + DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight, false); + } + } + + // Getting gossip stone locations temporarily sets one location to not be reachable. + // Call the function one last time to get rid of false positives on locations not + // being reachable. + ReachabilitySearch({}); } -std::vector FindItemsAndMarkHinted(std::vector items, std::vector hintChecks){ - std::vector locations = {}; - auto ctx = Rando::Context::GetInstance(); - for (size_t c = 0; c < items.size(); c++){ - std::vector found = FilterFromPool(ctx->allLocations, [items, ctx, c](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == items[c];}); - if (found.size() > 0){ - locations.push_back(found[0]); - //RANDOTODO make the called functions of this always return true if empty hintChecks are provided - if (!ctx->GetItemLocation(found[0])->IsAHintAccessible() && (hintChecks.size() == 0 || IsReachableWithout(hintChecks, found[0],true))){ - ctx->GetItemLocation(found[0])->SetHintAccesible(); - } - } else { - locations.push_back(RC_UNKNOWN_CHECK); +std::vector FindItemsAndMarkHinted(std::vector items, + std::vector hintChecks) { + std::vector locations = {}; + auto ctx = Rando::Context::GetInstance(); + for (size_t c = 0; c < items.size(); c++) { + std::vector found = + FilterFromPool(ctx->allLocations, [items, ctx, c](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == items[c]; + }); + if (found.size() > 0) { + locations.push_back(found[0]); + // RANDOTODO make the called functions of this always return true if empty hintChecks are provided + if (!ctx->GetItemLocation(found[0])->IsAHintAccessible() && + (hintChecks.size() == 0 || IsReachableWithout(hintChecks, found[0], true))) { + ctx->GetItemLocation(found[0])->SetHintAccesible(); + } + } else { + locations.push_back(RC_UNKNOWN_CHECK); + } } - } - return locations; + return locations; } void CreateChildAltarHint() { - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled() && ctx->GetOption(RSK_TOT_ALTAR_HINT)){ - std::vector stoneLocs = {}; - //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {}); - } else { - stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {RC_ALTAR_HINT_CHILD}); + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled() && ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + std::vector stoneLocs = {}; + // force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + stoneLocs = FindItemsAndMarkHinted({ RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE }, {}); + } else { + stoneLocs = + FindItemsAndMarkHinted({ RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE }, { RC_ALTAR_HINT_CHILD }); + } + std::vector stoneAreas = {}; + for (auto loc : stoneLocs) { + if (loc != RC_UNKNOWN_CHECK) { + stoneAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } + } + ctx->AddHint(RH_ALTAR_CHILD, Hint(RH_ALTAR_CHILD, HINT_TYPE_ALTAR_CHILD, {}, stoneLocs, stoneAreas)); } - std::vector stoneAreas = {}; - for (auto loc : stoneLocs){ - if (loc != RC_UNKNOWN_CHECK) { - stoneAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - } - ctx->AddHint(RH_ALTAR_CHILD, Hint(RH_ALTAR_CHILD, HINT_TYPE_ALTAR_CHILD, {}, stoneLocs, stoneAreas)); - } } void CreateAdultAltarHint() { - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_ALTAR_ADULT)->IsEnabled()){ - std::vector medallionLocs = {}; - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - //force marking the rewards as hinted if they are at the end of dungeons as they can be inferred - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { - medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, - {}); - } else { - medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, - {RC_ALTAR_HINT_ADULT}); - } + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_ALTAR_ADULT)->IsEnabled()) { + std::vector medallionLocs = {}; + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + // force marking the rewards as hinted if they are at the end of dungeons as they can be inferred + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON) || + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_VANILLA)) { + medallionLocs = FindItemsAndMarkHinted({ RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION }, + {}); + } else { + medallionLocs = FindItemsAndMarkHinted({ RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION }, + { RC_ALTAR_HINT_ADULT }); + } + } + std::vector medallionAreas = {}; + for (auto loc : medallionLocs) { + if (loc != RC_UNKNOWN_CHECK) { + medallionAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } + } + ctx->AddHint(RH_ALTAR_ADULT, Hint(RH_ALTAR_ADULT, HINT_TYPE_ALTAR_ADULT, {}, medallionLocs, medallionAreas)); } - std::vector medallionAreas = {}; - for (auto loc : medallionLocs){ - if (loc != RC_UNKNOWN_CHECK) { - medallionAreas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - } - ctx->AddHint(RH_ALTAR_ADULT, Hint(RH_ALTAR_ADULT, HINT_TYPE_ALTAR_ADULT, {}, medallionLocs, medallionAreas)); - } } -void CreateStaticHintFromData(RandomizerHint hint, StaticHintInfo staticData){ - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(hint)->IsEnabled()){ - 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)))){ +void CreateStaticHintFromData(RandomizerHint hint, StaticHintInfo staticData) { + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(hint)->IsEnabled()) { + 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)))) { - std::vector locations = {}; - if (staticData.targetItems.size() > 0){ - locations = FindItemsAndMarkHinted(staticData.targetItems, staticData.hintChecks); - } else { - for(auto check: staticData.targetChecks){ - locations.push_back(check); + std::vector locations = {}; + if (staticData.targetItems.size() > 0) { + locations = FindItemsAndMarkHinted(staticData.targetItems, staticData.hintChecks); + } else { + for (auto check : staticData.targetChecks) { + locations.push_back(check); + } + } + std::vector areas = {}; + for (auto loc : locations) { + ctx->GetItemLocation(loc)->SetHintAccesible(); + if (ctx->GetItemLocation(loc)->GetAreas().empty()) { + // If we get to here then it means a location got through with no area assignment, which means + // something went wrong elsewhere. + SPDLOG_DEBUG("Attempted to hint location with no areas: "); + SPDLOG_DEBUG(Rando::StaticData::GetLocation(loc)->GetName()); + // assert(false); + areas.push_back(RA_NONE); + } else { + areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); + } + } + // hintKeys are defaulted to in the hint object and do not need to be specified + ctx->AddHint(hint, + Hint(hint, staticData.type, {}, locations, areas, {}, staticData.yourPocket, staticData.num)); } - } - std::vector areas = {}; - for (auto loc : locations){ - ctx->GetItemLocation(loc)->SetHintAccesible(); - if (ctx->GetItemLocation(loc)->GetAreas().empty()){ - //If we get to here then it means a location got through with no area assignment, which means something went wrong elsewhere. - SPDLOG_DEBUG("Attempted to hint location with no areas: "); - SPDLOG_DEBUG(Rando::StaticData::GetLocation(loc)->GetName()); - //assert(false); - areas.push_back(RA_NONE); - } else { - areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - } - //hintKeys are defaulted to in the hint object and do not need to be specified - ctx->AddHint(hint, Hint(hint, staticData.type, {}, locations, areas, {}, staticData.yourPocket, staticData.num)); } - } } void CreateStaticItemHint(RandomizerHint hintKey, std::vector hintTextKeys, - std::vector items, std::vector hintChecks, bool yourPocket = false) { - //RANDOTODO choose area in case there are multiple - auto ctx = Rando::Context::GetInstance(); - std::vector locations = FindItemsAndMarkHinted(items, hintChecks); - std::vector areas = {}; - for (auto loc : locations){ - areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); - } - ctx->AddHint(hintKey, Hint(hintKey, HINT_TYPE_AREA, hintTextKeys, locations, areas, {}, yourPocket)); -} - -void CreateGanondorfJoke(){ - auto ctx = Rando::Context::GetInstance(); - if (!ctx->GetHint(RH_GANONDORF_JOKE)->IsEnabled()){ - ctx->AddHint(RH_GANONDORF_JOKE, Hint(RH_GANONDORF_JOKE, HINT_TYPE_HINT_KEY, {GetRandomGanonJoke()})); - } -} - -void CreateGanondorfHint(){ - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_GANONDORF_HINT) && !ctx->GetHint(RH_GANONDORF_HINT)->IsEnabled()){ - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - CreateStaticItemHint(RH_GANONDORF_HINT, {RHT_GANONDORF_HINT_LA_ONLY, RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_LA_AND_MS}, - {RG_LIGHT_ARROWS, RG_MASTER_SWORD}, {RC_GANONDORF_HINT}, true); - } else { - CreateStaticItemHint(RH_GANONDORF_HINT, {RHT_GANONDORF_HINT_LA_ONLY}, {RG_LIGHT_ARROWS}, {RC_GANONDORF_HINT}, true); + std::vector items, std::vector hintChecks, + bool yourPocket = false) { + // RANDOTODO choose area in case there are multiple + auto ctx = Rando::Context::GetInstance(); + std::vector locations = FindItemsAndMarkHinted(items, hintChecks); + std::vector areas = {}; + for (auto loc : locations) { + areas.push_back(ctx->GetItemLocation(loc)->GetRandomArea()); } - } + ctx->AddHint(hintKey, Hint(hintKey, HINT_TYPE_AREA, hintTextKeys, locations, areas, {}, yourPocket)); } -void CreateStaticHints(){ - CreateChildAltarHint(); - CreateAdultAltarHint(); - CreateGanondorfJoke(); - CreateGanondorfHint(); - for (auto[hint, staticData] : StaticData::staticHintInfoMap){ - CreateStaticHintFromData(hint, staticData); - } +void CreateGanondorfJoke() { + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_GANONDORF_JOKE)->IsEnabled()) { + ctx->AddHint(RH_GANONDORF_JOKE, Hint(RH_GANONDORF_JOKE, HINT_TYPE_HINT_KEY, { GetRandomGanonJoke() })); + } } -void CreateAllHints(){ - auto ctx = Rando::Context::GetInstance(); - - CreateStaticHints(); - - if (ctx->GetOption(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE)) { - SPDLOG_INFO("Creating Hints..."); - CreateStoneHints(); - SPDLOG_INFO("Creating Hints Done"); - } +void CreateGanondorfHint() { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_GANONDORF_HINT) && !ctx->GetHint(RH_GANONDORF_HINT)->IsEnabled()) { + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + CreateStaticItemHint( + RH_GANONDORF_HINT, + { RHT_GANONDORF_HINT_LA_ONLY, RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_LA_AND_MS }, + { RG_LIGHT_ARROWS, RG_MASTER_SWORD }, { RC_GANONDORF_HINT }, true); + } else { + CreateStaticItemHint(RH_GANONDORF_HINT, { RHT_GANONDORF_HINT_LA_ONLY }, { RG_LIGHT_ARROWS }, + { RC_GANONDORF_HINT }, true); + } + } +} + +void CreateStaticHints() { + CreateChildAltarHint(); + CreateAdultAltarHint(); + CreateGanondorfJoke(); + CreateGanondorfHint(); + for (auto [hint, staticData] : StaticData::staticHintInfoMap) { + CreateStaticHintFromData(hint, staticData); + } +} + +void CreateAllHints() { + auto ctx = Rando::Context::GetInstance(); + + CreateStaticHints(); + + if (ctx->GetOption(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE)) { + SPDLOG_INFO("Creating Hints..."); + CreateStoneHints(); + SPDLOG_INFO("Creating Hints Done"); + } } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 9b1fd2bf0..a04a7d65c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -13,1358 +13,1254 @@ std::vector ItemPool = {}; std::vector PendingJunkPool = {}; const std::array dungeonRewards = { - RG_KOKIRI_EMERALD, - RG_GORON_RUBY, - RG_ZORA_SAPPHIRE, - RG_FOREST_MEDALLION, - RG_FIRE_MEDALLION, - RG_WATER_MEDALLION, - RG_SPIRIT_MEDALLION, - RG_SHADOW_MEDALLION, - RG_LIGHT_MEDALLION, + RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, + RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION, RG_LIGHT_MEDALLION, }; const std::array JunkPoolItems = { - RG_BOMBS_5, - RG_BOMBS_10, - RG_BOMBS_20, - RG_DEKU_NUTS_5, - RG_DEKU_STICK_1, - RG_DEKU_SEEDS_30, - RG_RECOVERY_HEART, - RG_ARROWS_5, - RG_ARROWS_10, - RG_ARROWS_30, - RG_BLUE_RUPEE, - RG_RED_RUPEE, - RG_PURPLE_RUPEE, - RG_HUGE_RUPEE, - RG_DEKU_NUTS_10, - RG_ICE_TRAP, + RG_BOMBS_5, RG_BOMBS_10, RG_BOMBS_20, RG_DEKU_NUTS_5, RG_DEKU_STICK_1, RG_DEKU_SEEDS_30, + RG_RECOVERY_HEART, RG_ARROWS_5, RG_ARROWS_10, RG_ARROWS_30, RG_BLUE_RUPEE, RG_RED_RUPEE, + RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_DEKU_NUTS_10, RG_ICE_TRAP, }; const std::array alwaysItems = { - RG_BIGGORON_SWORD, - RG_BOOMERANG, - RG_LENS_OF_TRUTH, - RG_MEGATON_HAMMER, - RG_IRON_BOOTS, - RG_GORON_TUNIC, - RG_ZORA_TUNIC, - RG_HOVER_BOOTS, - RG_MIRROR_SHIELD, - RG_STONE_OF_AGONY, - RG_FIRE_ARROWS, - RG_ICE_ARROWS, - RG_LIGHT_ARROWS, - RG_DINS_FIRE, - RG_FARORES_WIND, - RG_NAYRUS_LOVE, - RG_GREG_RUPEE, - RG_PROGRESSIVE_HOOKSHOT, //2 progressive hookshots - RG_PROGRESSIVE_HOOKSHOT, - RG_DEKU_SHIELD, - RG_HYLIAN_SHIELD, - RG_PROGRESSIVE_STRENGTH, //3 progressive strength upgrades - RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_SCALE, //2 progressive scales - RG_PROGRESSIVE_SCALE, - RG_PROGRESSIVE_BOW, //3 progressive Bows - RG_PROGRESSIVE_BOW, - RG_PROGRESSIVE_BOW, - RG_PROGRESSIVE_SLINGSHOT, //3 progressive bullet bags - RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_BOMB_BAG, //3 progressive bomb bags - RG_PROGRESSIVE_BOMB_BAG, - RG_PROGRESSIVE_BOMB_BAG, - RG_PROGRESSIVE_WALLET, //2 progressive wallets - RG_PROGRESSIVE_WALLET, - RG_PROGRESSIVE_MAGIC_METER, //2 progressive magic meters - RG_PROGRESSIVE_MAGIC_METER, - RG_DOUBLE_DEFENSE, - RG_PROGRESSIVE_STICK_UPGRADE, //2 stick upgrades - RG_PROGRESSIVE_STICK_UPGRADE, - RG_PROGRESSIVE_NUT_UPGRADE, //2 nut upgrades - RG_PROGRESSIVE_NUT_UPGRADE, - RG_RECOVERY_HEART, //6 recovery hearts - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_BOMBS_5, //2 - RG_BOMBS_5, - RG_BOMBS_10, - RG_BOMBS_20, - RG_ARROWS_5, - RG_ARROWS_10, //5 - RG_ARROWS_10, - RG_ARROWS_10, - RG_TREASURE_GAME_HEART, -}; -const std::array easyItems = { - RG_BIGGORON_SWORD, - RG_KOKIRI_SWORD, - RG_MASTER_SWORD, - RG_BOOMERANG, - RG_LENS_OF_TRUTH, - RG_MEGATON_HAMMER, - RG_IRON_BOOTS, - RG_GORON_TUNIC, - RG_ZORA_TUNIC, - RG_HOVER_BOOTS, - RG_MIRROR_SHIELD, - RG_FIRE_ARROWS, - RG_LIGHT_ARROWS, - RG_DINS_FIRE, - RG_PROGRESSIVE_HOOKSHOT, - RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_SCALE, - RG_PROGRESSIVE_WALLET, - RG_PROGRESSIVE_MAGIC_METER, - RG_PROGRESSIVE_STICK_UPGRADE, - RG_PROGRESSIVE_NUT_UPGRADE, - RG_PROGRESSIVE_BOW, - RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_BOMB_BAG, - RG_DOUBLE_DEFENSE, - RG_HEART_CONTAINER, //16 Heart Containers - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_PIECE_OF_HEART, //3 heart pieces - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, -}; -const std::array normalItems = { - // 35 pieces of heart - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - RG_PIECE_OF_HEART, - // 8 heart containers - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, - RG_HEART_CONTAINER, -}; -const std::array DT_Vanilla = { - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, -}; -const std::array DT_MQ = { - RG_DEKU_SHIELD, - RG_DEKU_SHIELD, - RG_PURPLE_RUPEE, -}; -const std::array DC_Vanilla = { - RG_RED_RUPEE, -}; -const std::array DC_MQ = { - RG_HYLIAN_SHIELD, - RG_BLUE_RUPEE, -}; -const std::array JB_MQ = { - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_RECOVERY_HEART, - RG_DEKU_SHIELD, - RG_DEKU_STICK_1, -}; -const std::array FoT_Vanilla = { - RG_RECOVERY_HEART, - RG_ARROWS_10, - RG_ARROWS_30, -}; -const std::array FoT_MQ = { - RG_ARROWS_5, -}; -const std::array FiT_Vanilla = { - RG_HUGE_RUPEE, -}; -const std::array FiT_MQ = { - RG_BOMBS_20, - RG_HYLIAN_SHIELD, -}; -const std::array SpT_Vanilla = { - RG_DEKU_SHIELD, - RG_DEKU_SHIELD, - RG_RECOVERY_HEART, - RG_BOMBS_20, -}; -const std::array SpT_MQ = { - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_ARROWS_30, -}; -const std::array ShT_Vanilla = { - RG_ARROWS_30, -}; -const std::array ShT_MQ = { - RG_ARROWS_5, - RG_ARROWS_5, - RG_RED_RUPEE, -}; -const std::array BW_Vanilla = { - RG_RECOVERY_HEART, - RG_BOMBS_10, - RG_HUGE_RUPEE, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_10, - RG_DEKU_SHIELD, - RG_HYLIAN_SHIELD, -}; -const std::array GTG_Vanilla = { - RG_ARROWS_30, - RG_ARROWS_30, - RG_ARROWS_30, - RG_HUGE_RUPEE, -}; -const std::array GTG_MQ = { - RG_TREASURE_GAME_GREEN_RUPEE, - RG_TREASURE_GAME_GREEN_RUPEE, - RG_ARROWS_10, - RG_GREEN_RUPEE, - RG_PURPLE_RUPEE, -}; -const std::array GC_Vanilla = { - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_ARROWS_30, -}; -const std::array GC_MQ = { - RG_ARROWS_10, - RG_ARROWS_10, - RG_BOMBS_5, - RG_RED_RUPEE, - RG_RECOVERY_HEART, -}; -const std::array normalBottles = { - RG_EMPTY_BOTTLE, - RG_BOTTLE_WITH_MILK, - RG_BOTTLE_WITH_RED_POTION, - RG_BOTTLE_WITH_GREEN_POTION, - RG_BOTTLE_WITH_BLUE_POTION, - RG_BOTTLE_WITH_FAIRY, - RG_BOTTLE_WITH_FISH, - RG_BOTTLE_WITH_BUGS, - RG_BOTTLE_WITH_POE, - RG_BOTTLE_WITH_BIG_POE, - RG_BOTTLE_WITH_BLUE_FIRE, -}; -const std::array normalRupees = { - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, -}; -const std::array shopsanityRupees = { - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_RED_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_PURPLE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, - RG_HUGE_RUPEE, -}; -const std::array dekuScrubItems = { - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_NUTS_5, - RG_DEKU_STICK_1, - RG_BOMBS_5, - RG_BOMBS_5, - RG_BOMBS_5, - RG_BOMBS_5, - RG_BOMBS_5, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_RECOVERY_HEART, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, - RG_BLUE_RUPEE, -}; -const std::array songList = { - RG_ZELDAS_LULLABY, - RG_EPONAS_SONG, - RG_SUNS_SONG, - RG_SARIAS_SONG, - RG_SONG_OF_TIME, - RG_SONG_OF_STORMS, - RG_MINUET_OF_FOREST, - RG_PRELUDE_OF_LIGHT, - RG_BOLERO_OF_FIRE, - RG_SERENADE_OF_WATER, - RG_NOCTURNE_OF_SHADOW, - RG_REQUIEM_OF_SPIRIT, -}; -const std::array tradeItems = { - RG_POCKET_EGG, - //RG_POCKET_CUCCO, - RG_COJIRO, - RG_ODD_MUSHROOM, - RG_POACHERS_SAW, - RG_BROKEN_SWORD, - RG_PRESCRIPTION, - RG_EYEBALL_FROG, - RG_EYEDROPS, - RG_CLAIM_CHECK, -}; - -void AddItemToPool(std::vector& pool, RandomizerGet item, size_t count /*= 1*/) { - pool.insert(pool.end(), count, item); -} - -template -static void AddItemsToPool(std::vector& toPool, const FromPool& fromPool) { - AddElementsToPool(toPool, fromPool); -} - -static void AddItemToMainPool(const RandomizerGet item, size_t count = 1) { - ItemPool.insert(ItemPool.end(), count, item); -} - -static void AddRandomBottle(std::vector& bottlePool) { - AddItemToMainPool(RandomElement(bottlePool, true)); -} - -RandomizerGet GetJunkItem() { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_MAYHEM) || ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { - return RG_ICE_TRAP; - } else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_EXTRA)) { - return RandomElement(JunkPoolItems); - } - //Ice Trap is the last item in JunkPoolItems, so subtract 1 to never hit that index - uint8_t idx = Random(0, JunkPoolItems.size() - 1); - return JunkPoolItems[idx]; -} - -static RandomizerGet GetPendingJunkItem() { - if (PendingJunkPool.empty()) { - return GetJunkItem(); - } - - return RandomElement(PendingJunkPool, true); -} - -//Replace junk items in the pool with pending junk -static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { - int itemCount = 0; - for (size_t i = 0; i < ItemPool.size(); i++) { - if (ItemPool[i] == itemToReplace) { - if (itemCount >= max) { - ItemPool[i] = RG_NONE; - } - itemCount++; - } - } -} - -void PlaceJunkInExcludedLocation(const RandomizerCheck il) { - //place a non-advancement item in this location - auto ctx = Rando::Context::GetInstance(); - for (size_t i = 0; i < ItemPool.size(); i++) { - if (!Rando::StaticData::RetrieveItem(ItemPool[i]).IsAdvancement()) { - ctx->PlaceItemInLocation(il, ItemPool[i]); - ItemPool.erase(ItemPool.begin() + i); - return; - } - } - SPDLOG_ERROR("ERROR: No Junk to Place!!!"); -} - -static void PlaceVanillaMapsAndCompasses() { - auto ctx = Rando::Context::GetInstance(); - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - dungeon->PlaceVanillaMap(); - dungeon->PlaceVanillaCompass(); - } -} - -static void PlaceVanillaSmallKeys() { - auto ctx = Rando::Context::GetInstance(); - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - dungeon->PlaceVanillaSmallKeys(); - } -} - -static void PlaceVanillaBossKeys() { - auto ctx = Rando::Context::GetInstance(); - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - dungeon->PlaceVanillaBossKey(); - } -} - -static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, bool dungeonActive) { - if (!(overworldActive || dungeonActive)) { - return; - } - for (RandomizerCheck rc : ctx->GetLocations(ctx->allLocations, rctype)) { - auto loc = Rando::StaticData::GetLocation(rc); - - // If item is in the overworld and shuffled, add its item to the pool - if (loc->IsOverworld()) { - if (overworldActive) { - AddItemToMainPool(loc->GetVanillaItem()); - } - } else { - if (dungeonActive) { - // If the same in MQ and vanilla, add. - RandomizerCheckQuest currentQuest = loc->GetQuest(); - if (currentQuest == RCQUEST_BOTH) { - AddItemToMainPool(loc->GetVanillaItem()); - } else { - // Check if current item's dungeon is vanilla or MQ, and only add if quest corresponds to it. - SceneID itemScene = loc->GetScene(); - - if (itemScene >= SCENE_DEKU_TREE && itemScene <= SCENE_GERUDO_TRAINING_GROUND) { - bool isMQ = ctx->GetDungeon(itemScene)->IsMQ(); - - if ((isMQ && currentQuest == RCQUEST_MQ) || (!isMQ && currentQuest == RCQUEST_VANILLA)) { - AddItemToMainPool(loc->GetVanillaItem()); - } - } - } - } - } - } -} - -static void SetScarceItemPool() { - ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); - ReplaceMaxItem(RG_BOMBCHU_5, 1); - ReplaceMaxItem(RG_BOMBCHU_10, 2); - ReplaceMaxItem(RG_BOMBCHU_20, 0); - ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); - ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); - ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 2 : 1); - ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 2 : 1); - ReplaceMaxItem(RG_PROGRESSIVE_BOW, 2); - ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 2); - ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 2); - ReplaceMaxItem(RG_HEART_CONTAINER, 0); -} - -static void SetMinimalItemPool() { - auto ctx = Rando::Context::GetInstance(); - ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 1); - ReplaceMaxItem(RG_BOMBCHU_5, 1); - ReplaceMaxItem(RG_BOMBCHU_10, 0); - ReplaceMaxItem(RG_BOMBCHU_20, 0); - ReplaceMaxItem(RG_NAYRUS_LOVE, 0); - ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); - ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); - ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 1 : 0); - ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 1 : 0); - ReplaceMaxItem(RG_PROGRESSIVE_BOW, 1); - ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 1); - 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).Get() == 18)? 1 : 0); -} - -void GenerateItemPool() { - //RANDOTODO proper removal of items not in pool or logically relevant instead of dummy checks. - auto ctx = Rando::Context::GetInstance(); - ItemPool.clear(); - PendingJunkPool.clear(); - - //Initialize ice trap models to always major items - ctx->possibleIceTrapModels = { - RG_MIRROR_SHIELD, + RG_BIGGORON_SWORD, RG_BOOMERANG, RG_LENS_OF_TRUTH, RG_MEGATON_HAMMER, RG_IRON_BOOTS, + RG_GORON_TUNIC, + RG_ZORA_TUNIC, RG_HOVER_BOOTS, + RG_MIRROR_SHIELD, RG_STONE_OF_AGONY, - RG_DINS_FIRE, - RG_FARORES_WIND, - RG_NAYRUS_LOVE, RG_FIRE_ARROWS, RG_ICE_ARROWS, RG_LIGHT_ARROWS, + RG_DINS_FIRE, + RG_FARORES_WIND, + RG_NAYRUS_LOVE, + RG_GREG_RUPEE, + RG_PROGRESSIVE_HOOKSHOT, // 2 progressive hookshots + RG_PROGRESSIVE_HOOKSHOT, + RG_DEKU_SHIELD, + RG_HYLIAN_SHIELD, + RG_PROGRESSIVE_STRENGTH, // 3 progressive strength upgrades + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_SCALE, // 2 progressive scales + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_BOW, // 3 progressive Bows + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_SLINGSHOT, // 3 progressive bullet bags + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_BOMB_BAG, // 3 progressive bomb bags + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_WALLET, // 2 progressive wallets + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_MAGIC_METER, // 2 progressive magic meters + RG_PROGRESSIVE_MAGIC_METER, RG_DOUBLE_DEFENSE, - RG_CLAIM_CHECK, + RG_PROGRESSIVE_STICK_UPGRADE, // 2 stick upgrades + RG_PROGRESSIVE_STICK_UPGRADE, + RG_PROGRESSIVE_NUT_UPGRADE, // 2 nut upgrades + RG_PROGRESSIVE_NUT_UPGRADE, + RG_RECOVERY_HEART, // 6 recovery hearts + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, + RG_BOMBS_5, // 2 + RG_BOMBS_5, + RG_BOMBS_10, + RG_BOMBS_20, + RG_ARROWS_5, + RG_ARROWS_10, // 5 + RG_ARROWS_10, + RG_ARROWS_10, + RG_TREASURE_GAME_HEART, +}; +const std::array easyItems = { + RG_BIGGORON_SWORD, + RG_KOKIRI_SWORD, + RG_MASTER_SWORD, + RG_BOOMERANG, + RG_LENS_OF_TRUTH, + RG_MEGATON_HAMMER, + RG_IRON_BOOTS, + RG_GORON_TUNIC, + RG_ZORA_TUNIC, + RG_HOVER_BOOTS, + RG_MIRROR_SHIELD, + RG_FIRE_ARROWS, + RG_LIGHT_ARROWS, + RG_DINS_FIRE, RG_PROGRESSIVE_HOOKSHOT, RG_PROGRESSIVE_STRENGTH, - RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_MAGIC_METER, + RG_PROGRESSIVE_STICK_UPGRADE, + RG_PROGRESSIVE_NUT_UPGRADE, RG_PROGRESSIVE_BOW, RG_PROGRESSIVE_SLINGSHOT, - RG_PROGRESSIVE_WALLET, - RG_PROGRESSIVE_SCALE, - RG_PROGRESSIVE_MAGIC_METER, - }; - //Check song shuffle and dungeon reward shuffle just for ice traps - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE)) { - //Push item ids for songs - ctx->possibleIceTrapModels.push_back(RG_ZELDAS_LULLABY); - ctx->possibleIceTrapModels.push_back(RG_EPONAS_SONG); - ctx->possibleIceTrapModels.push_back(RG_SARIAS_SONG); - ctx->possibleIceTrapModels.push_back(RG_SUNS_SONG); - ctx->possibleIceTrapModels.push_back(RG_SONG_OF_TIME); - ctx->possibleIceTrapModels.push_back(RG_SONG_OF_STORMS); - ctx->possibleIceTrapModels.push_back(RG_MINUET_OF_FOREST); - ctx->possibleIceTrapModels.push_back(RG_BOLERO_OF_FIRE); - ctx->possibleIceTrapModels.push_back(RG_SERENADE_OF_WATER); - ctx->possibleIceTrapModels.push_back(RG_REQUIEM_OF_SPIRIT); - ctx->possibleIceTrapModels.push_back(RG_NOCTURNE_OF_SHADOW); - ctx->possibleIceTrapModels.push_back(RG_PRELUDE_OF_LIGHT); - } - if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANYWHERE)) { - //Push item ids for dungeon rewards - ctx->possibleIceTrapModels.push_back(RG_KOKIRI_EMERALD); - ctx->possibleIceTrapModels.push_back(RG_GORON_RUBY); - ctx->possibleIceTrapModels.push_back(RG_ZORA_SAPPHIRE); - ctx->possibleIceTrapModels.push_back(RG_FOREST_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_FIRE_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_WATER_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_SPIRIT_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_SHADOW_MEDALLION); - ctx->possibleIceTrapModels.push_back(RG_LIGHT_MEDALLION); - } + RG_PROGRESSIVE_BOMB_BAG, + RG_DOUBLE_DEFENSE, + RG_HEART_CONTAINER, // 16 Heart Containers + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_PIECE_OF_HEART, // 3 heart pieces + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, +}; +const std::array normalItems = { + // 35 pieces of heart + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + RG_PIECE_OF_HEART, + // 8 heart containers + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, + RG_HEART_CONTAINER, +}; +const std::array DT_Vanilla = { + RG_RECOVERY_HEART, + RG_RECOVERY_HEART, +}; +const std::array DT_MQ = { + RG_DEKU_SHIELD, + RG_DEKU_SHIELD, + RG_PURPLE_RUPEE, +}; +const std::array DC_Vanilla = { + RG_RED_RUPEE, +}; +const std::array DC_MQ = { + RG_HYLIAN_SHIELD, + RG_BLUE_RUPEE, +}; +const std::array JB_MQ = { + RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_RECOVERY_HEART, RG_DEKU_SHIELD, RG_DEKU_STICK_1, +}; +const std::array FoT_Vanilla = { + RG_RECOVERY_HEART, + RG_ARROWS_10, + RG_ARROWS_30, +}; +const std::array FoT_MQ = { + RG_ARROWS_5, +}; +const std::array FiT_Vanilla = { + RG_HUGE_RUPEE, +}; +const std::array FiT_MQ = { + RG_BOMBS_20, + RG_HYLIAN_SHIELD, +}; +const std::array SpT_Vanilla = { + RG_DEKU_SHIELD, + RG_DEKU_SHIELD, + RG_RECOVERY_HEART, + RG_BOMBS_20, +}; +const std::array SpT_MQ = { + RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, + RG_ARROWS_30, +}; +const std::array ShT_Vanilla = { + RG_ARROWS_30, +}; +const std::array ShT_MQ = { + RG_ARROWS_5, + RG_ARROWS_5, + RG_RED_RUPEE, +}; +const std::array BW_Vanilla = { + RG_RECOVERY_HEART, RG_BOMBS_10, RG_HUGE_RUPEE, RG_DEKU_NUTS_5, RG_DEKU_NUTS_10, RG_DEKU_SHIELD, RG_HYLIAN_SHIELD, +}; +const std::array GTG_Vanilla = { + RG_ARROWS_30, + RG_ARROWS_30, + RG_ARROWS_30, + RG_HUGE_RUPEE, +}; +const std::array GTG_MQ = { + RG_TREASURE_GAME_GREEN_RUPEE, RG_TREASURE_GAME_GREEN_RUPEE, RG_ARROWS_10, RG_GREEN_RUPEE, RG_PURPLE_RUPEE, +}; +const std::array GC_Vanilla = { + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_BLUE_RUPEE, + RG_ARROWS_30, +}; +const std::array GC_MQ = { + RG_ARROWS_10, RG_ARROWS_10, RG_BOMBS_5, RG_RED_RUPEE, RG_RECOVERY_HEART, +}; +const std::array normalBottles = { + RG_EMPTY_BOTTLE, + RG_BOTTLE_WITH_MILK, + RG_BOTTLE_WITH_RED_POTION, + RG_BOTTLE_WITH_GREEN_POTION, + RG_BOTTLE_WITH_BLUE_POTION, + RG_BOTTLE_WITH_FAIRY, + RG_BOTTLE_WITH_FISH, + RG_BOTTLE_WITH_BUGS, + RG_BOTTLE_WITH_POE, + RG_BOTTLE_WITH_BIG_POE, + RG_BOTTLE_WITH_BLUE_FIRE, +}; +const std::array normalRupees = { + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, + RG_BLUE_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, + RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, +}; +const std::array shopsanityRupees = { + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, + RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, RG_RED_RUPEE, + RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, + RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, + RG_HUGE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, RG_HUGE_RUPEE, +}; +const std::array dekuScrubItems = { + RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, RG_DEKU_NUTS_5, + RG_DEKU_STICK_1, RG_BOMBS_5, RG_BOMBS_5, RG_BOMBS_5, RG_BOMBS_5, + RG_BOMBS_5, RG_RECOVERY_HEART, RG_RECOVERY_HEART, RG_RECOVERY_HEART, RG_RECOVERY_HEART, + RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, RG_BLUE_RUPEE, +}; +const std::array songList = { + RG_ZELDAS_LULLABY, RG_EPONAS_SONG, RG_SUNS_SONG, RG_SARIAS_SONG, + RG_SONG_OF_TIME, RG_SONG_OF_STORMS, RG_MINUET_OF_FOREST, RG_PRELUDE_OF_LIGHT, + RG_BOLERO_OF_FIRE, RG_SERENADE_OF_WATER, RG_NOCTURNE_OF_SHADOW, RG_REQUIEM_OF_SPIRIT, +}; +const std::array tradeItems = { + RG_POCKET_EGG, + // RG_POCKET_CUCCO, + RG_COJIRO, + RG_ODD_MUSHROOM, + RG_POACHERS_SAW, + RG_BROKEN_SWORD, + RG_PRESCRIPTION, + RG_EYEBALL_FROG, + RG_EYEDROPS, + RG_CLAIM_CHECK, +}; - if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { - ctx->possibleIceTrapModels.push_back(RG_TRIFORCE_PIECE); - 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 { - ctx->PlaceItemInLocation(RC_GANON, RG_TRIFORCE); // Win condition - } +void AddItemToPool(std::vector& pool, RandomizerGet item, size_t count /*= 1*/) { + pool.insert(pool.end(), count, item); +} - //Fixed item locations - ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER); +template static void AddItemsToPool(std::vector& toPool, const FromPool& fromPool) { + AddElementsToPool(toPool, fromPool); +} - if (ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { - AddItemToMainPool(RG_KOKIRI_SWORD); - ctx->possibleIceTrapModels.push_back(RG_KOKIRI_SWORD); - } else { - if (!ctx->GetOption(RSK_STARTING_KOKIRI_SWORD)) { - ctx->PlaceItemInLocation(RC_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, false, true); - } - } +static void AddItemToMainPool(const RandomizerGet item, size_t count = 1) { + ItemPool.insert(ItemPool.end(), count, item); +} - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - AddItemToMainPool(RG_MASTER_SWORD); - ctx->possibleIceTrapModels.push_back(RG_MASTER_SWORD); - } else { - if (!ctx->GetOption(RSK_STARTING_MASTER_SWORD)) { - ctx->PlaceItemInLocation(RC_TOT_MASTER_SWORD, RG_MASTER_SWORD, false, true); - } - } +static void AddRandomBottle(std::vector& bottlePool) { + AddItemToMainPool(RandomElement(bottlePool, true)); +} - if (ctx->GetOption(RSK_SHUFFLE_WEIRD_EGG)) { - AddItemToMainPool(RG_WEIRD_EGG); - ctx->possibleIceTrapModels.push_back(RG_WEIRD_EGG); - } else { - ctx->PlaceItemInLocation(RC_HC_MALON_EGG, RG_WEIRD_EGG, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_OCARINA)) { - AddItemToMainPool(RG_PROGRESSIVE_OCARINA, 2); - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, RG_PROGRESSIVE_OCARINA); +RandomizerGet GetJunkItem() { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_MAYHEM) || + ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { + return RG_ICE_TRAP; + } else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_EXTRA)) { + return RandomElement(JunkPoolItems); } - ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_OCARINA); - } else { - if (ctx->GetOption(RSK_STARTING_OCARINA).Is(RO_STARTING_OCARINA_OFF)) { - ctx->PlaceItemInLocation(RC_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, false, true); - ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); - } else { - if (ctx->GetOption(RSK_STARTING_OCARINA).IsNot(RO_STARTING_OCARINA_TIME)) { - ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); - } - } - } + // Ice Trap is the last item in JunkPoolItems, so subtract 1 to never hit that index + uint8_t idx = Random(0, JunkPoolItems.size() - 1); + return JunkPoolItems[idx]; +} - if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { - AddItemToMainPool(RG_OCARINA_A_BUTTON); - AddItemToMainPool(RG_OCARINA_C_UP_BUTTON); - AddItemToMainPool(RG_OCARINA_C_DOWN_BUTTON); - AddItemToMainPool(RG_OCARINA_C_LEFT_BUTTON); - AddItemToMainPool(RG_OCARINA_C_RIGHT_BUTTON); +static RandomizerGet GetPendingJunkItem() { + if (PendingJunkPool.empty()) { + return GetJunkItem(); + } - ctx->possibleIceTrapModels.push_back(RG_OCARINA_A_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_UP_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_DOWN_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_LEFT_BUTTON); - ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_RIGHT_BUTTON); - } + return RandomElement(PendingJunkPool, true); +} - if (ctx->GetOption(RSK_SKELETON_KEY)) { - AddItemToMainPool(RG_SKELETON_KEY); - } - - if (ctx->GetOption(RSK_SHUFFLE_SWIM)) { - AddItemToMainPool(RG_PROGRESSIVE_SCALE); - } - - if (ctx->GetOption(RSK_SHUFFLE_BEEHIVES)) { - //32 total beehive locations - AddItemToPool(PendingJunkPool, RG_RED_RUPEE, 23); - AddItemToPool(PendingJunkPool, RG_BLUE_RUPEE, 9); - } - - // Shuffle Pots - bool overworldPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OVERWORLD) || - ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); - bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || - ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); - PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); - - // Shuffle Crates - bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || - ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); - bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && - (ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || - ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL)); - bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || - ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); - PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); - PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); - PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); - - auto fsMode = ctx->GetOption(RSK_FISHSANITY); - 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).Get(); - for (uint8_t i = 0; i < pondCt; i++) { - AddItemToMainPool(GetJunkItem()); - } - - if (ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)) { - // 16 max adult pond fish, have to reduce to 16 if every fish is enabled - if (pondCt > 16) - pondCt = 16; - for (uint8_t i = 0; i < pondCt; i++) { - AddItemToMainPool(GetJunkItem()); +// Replace junk items in the pool with pending junk +static void ReplaceMaxItem(const RandomizerGet itemToReplace, int max) { + int itemCount = 0; + for (size_t i = 0; i < ItemPool.size(); i++) { + if (ItemPool[i] == itemToReplace) { + if (itemCount >= max) { + ItemPool[i] = RG_NONE; + } + itemCount++; } - } - } - // 9 grotto fish, 5 zora's domain fish - if (fsMode.Is(RO_FISHSANITY_OVERWORLD) || fsMode.Is(RO_FISHSANITY_BOTH)) { - for (uint8_t i = 0; i < Rando::StaticData::GetOverworldFishLocations().size(); i++) - AddItemToMainPool(GetJunkItem()); } +} - if (fsMode.Is(RO_FISHSANITY_HYRULE_LOACH)) { - AddItemToMainPool(RG_PURPLE_RUPEE); - } else { - ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true); - } - } - - if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { - AddItemToMainPool(RG_FISHING_POLE); - ctx->possibleIceTrapModels.push_back(RG_FISHING_POLE); - } - - if (ctx->GetOption(RSK_INFINITE_UPGRADES).Is(RO_INF_UPGRADES_PROGRESSIVE)) { - AddItemToMainPool(RG_PROGRESSIVE_BOMB_BAG); - AddItemToMainPool(RG_PROGRESSIVE_BOW); - AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); - AddItemToMainPool(RG_PROGRESSIVE_SLINGSHOT); - AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); - AddItemToMainPool(RG_PROGRESSIVE_MAGIC_METER); - AddItemToMainPool(RG_PROGRESSIVE_WALLET); - } - - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { - AddItemToMainPool(RG_MAGIC_BEAN_PACK); - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, RG_MAGIC_BEAN_PACK); - } - ctx->possibleIceTrapModels.push_back(RG_MAGIC_BEAN_PACK); - } else { - ctx->PlaceItemInLocation(RC_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { - if (/*!ProgressiveGoronSword TODO: Implement Progressive Goron Sword*/true) { - AddItemToMainPool(RG_GIANTS_KNIFE); - } - if (ctx->GetOption(RSK_BOMBCHU_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS); - } else { - AddItemToMainPool(RG_BOMBCHU_10); - } - } else { - ctx->PlaceItemInLocation(RC_KAK_GRANNYS_SHOP, RG_BLUE_POTION_REFILL, false, true); - ctx->PlaceItemInLocation(RC_GC_MEDIGORON, RG_GIANTS_KNIFE, false, true); - ctx->PlaceItemInLocation(RC_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_FROG_SONG_RUPEES)) { - AddItemToMainPool(RG_PURPLE_RUPEE, 5); - } else { - ctx->PlaceItemInLocation(RC_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, false, true); - ctx->PlaceItemInLocation(RC_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { - AddItemToMainPool(RG_POCKET_EGG); - AddItemToMainPool(RG_COJIRO); - AddItemToMainPool(RG_ODD_MUSHROOM); - AddItemToMainPool(RG_ODD_POTION); - AddItemToMainPool(RG_POACHERS_SAW); - AddItemToMainPool(RG_BROKEN_SWORD); - AddItemToMainPool(RG_PRESCRIPTION); - AddItemToMainPool(RG_EYEBALL_FROG); - AddItemToMainPool(RG_EYEDROPS); - } - AddItemToMainPool(RG_CLAIM_CHECK); - - if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS)) { - AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys - } else if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK)) { - AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 - } - - if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) { - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { - ctx->PlaceItemInLocation(loc, RG_GOLD_SKULLTULA_TOKEN, false, true); - } - } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_DUNGEONS)) { - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { - if (Rando::StaticData::GetLocation(loc)->IsOverworld()) { - ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); - } else { - AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); - } - } - } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OVERWORLD)) { - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { - if (Rando::StaticData::GetLocation(loc)->IsDungeon()) { - ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); - } else { - AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); - } - } - } else { - AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN, 100); - } - - if (ctx->GetOption(RSK_SHUFFLE_100_GS_REWARD)) { - if (ctx->GetOption(RSK_SHUFFLE_TOKENS).IsNot(RO_TOKENSANITY_OFF) && ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemToPool(PendingJunkPool, RG_GOLD_SKULLTULA_TOKEN, 10); - } - AddItemToMainPool(RG_HUGE_RUPEE); - } else { - ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_HUGE_RUPEE, false, true); - } - - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { - AddItemToMainPool(RG_GOHMA_SOUL); - AddItemToMainPool(RG_KING_DODONGO_SOUL); - AddItemToMainPool(RG_BARINADE_SOUL); - AddItemToMainPool(RG_PHANTOM_GANON_SOUL); - AddItemToMainPool(RG_VOLVAGIA_SOUL); - AddItemToMainPool(RG_MORPHA_SOUL); - AddItemToMainPool(RG_BONGO_BONGO_SOUL); - AddItemToMainPool(RG_TWINROVA_SOUL); - - ctx->possibleIceTrapModels.push_back(RG_GOHMA_SOUL); - ctx->possibleIceTrapModels.push_back(RG_KING_DODONGO_SOUL); - ctx->possibleIceTrapModels.push_back(RG_BARINADE_SOUL); - ctx->possibleIceTrapModels.push_back(RG_PHANTOM_GANON_SOUL); - ctx->possibleIceTrapModels.push_back(RG_VOLVAGIA_SOUL); - ctx->possibleIceTrapModels.push_back(RG_MORPHA_SOUL); - ctx->possibleIceTrapModels.push_back(RG_BONGO_BONGO_SOUL); - ctx->possibleIceTrapModels.push_back(RG_TWINROVA_SOUL); - if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { - AddItemToMainPool(RG_GANON_SOUL); - ctx->possibleIceTrapModels.push_back(RG_GANON_SOUL); - } - } - - if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET)) { - AddItemToMainPool(RG_PROGRESSIVE_WALLET); - } - - if (ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET)) { - AddItemToMainPool(RG_PROGRESSIVE_WALLET); - } - - if (ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); - } - - if (ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); - } - - if (ctx->GetOption(RSK_BOMBCHU_BAG)) { - AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS, 5); - } else { - AddItemToMainPool(RG_BOMBCHU_5); - AddItemToMainPool(RG_BOMBCHU_10, 3); - AddItemToMainPool(RG_BOMBCHU_20); - } - - //Ice Traps - AddItemToMainPool(RG_ICE_TRAP); - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla()) { - AddItemToMainPool(RG_ICE_TRAP); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { - AddItemToMainPool(RG_ICE_TRAP, 4); - } - - //Gerudo Fortress - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE)) { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - } else if (ctx->GetOption(RSK_GERUDO_KEYS).IsNot(RO_GERUDO_KEYS_VANILLA)) { - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { - AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - } else { - //Only add key ring if 4 Fortress keys necessary - if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_KEYRINGS)) { - AddItemToMainPool(RG_GERUDO_FORTRESS_KEY_RING); - //Add junk to make up for missing keys - for (uint8_t i = 0; i < 3; i++) { - AddItemToMainPool(GetJunkItem()); +void PlaceJunkInExcludedLocation(const RandomizerCheck il) { + // place a non-advancement item in this location + auto ctx = Rando::Context::GetInstance(); + for (size_t i = 0; i < ItemPool.size(); i++) { + if (!Rando::StaticData::RetrieveItem(ItemPool[i]).IsAdvancement()) { + ctx->PlaceItemInLocation(il, ItemPool[i]); + ItemPool.erase(ItemPool.begin() + i); + return; } - } else { - AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY, 4); - } } - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && ctx->GetOption(RSK_KEYRINGS) ) { - AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_SMALL_KEY); - } - } - } else { - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - } else { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - } - } + SPDLOG_ERROR("ERROR: No Junk to Place!!!"); +} - //Gerudo Membership Card - if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) && ctx->GetOption(RSK_GERUDO_FORTRESS).IsNot(RO_GF_CARPENTERS_FREE)) { - AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD); - ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD); - } else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { - AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); - ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true); - } else { - ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true); - } - - //Keys - - //For key rings, need to add as many junk items as "missing" keys - if (ctx->GetOption(RSK_KEYRINGS).IsNot(RO_KEYRINGS_OFF)) { - uint8_t ringJunkAmt = 0; +static void PlaceVanillaMapsAndCompasses() { + auto ctx = Rando::Context::GetInstance(); for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->HasKeyRing()) { - ringJunkAmt += dungeon->GetSmallKeyCount() - 1; - } + dungeon->PlaceVanillaMap(); + dungeon->PlaceVanillaCompass(); } - for (uint8_t i = 0; i < ringJunkAmt; i++) { - AddItemToMainPool(GetJunkItem()); - } - } +} - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { - AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); +static void PlaceVanillaSmallKeys() { + auto ctx = Rando::Context::GetInstance(); + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + dungeon->PlaceVanillaSmallKeys(); + } +} + +static void PlaceVanillaBossKeys() { + auto ctx = Rando::Context::GetInstance(); + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + dungeon->PlaceVanillaBossKey(); + } +} + +static void PlaceItemsForType(RandomizerCheckType rctype, bool overworldActive, bool dungeonActive) { + if (!(overworldActive || dungeonActive)) { + return; + } + for (RandomizerCheck rc : ctx->GetLocations(ctx->allLocations, rctype)) { + auto loc = Rando::StaticData::GetLocation(rc); + + // If item is in the overworld and shuffled, add its item to the pool + if (loc->IsOverworld()) { + if (overworldActive) { + AddItemToMainPool(loc->GetVanillaItem()); + } + } else { + if (dungeonActive) { + // If the same in MQ and vanilla, add. + RandomizerCheckQuest currentQuest = loc->GetQuest(); + if (currentQuest == RCQUEST_BOTH) { + AddItemToMainPool(loc->GetVanillaItem()); + } else { + // Check if current item's dungeon is vanilla or MQ, and only add if quest corresponds to it. + SceneID itemScene = loc->GetScene(); + + if (itemScene >= SCENE_DEKU_TREE && itemScene <= SCENE_GERUDO_TRAINING_GROUND) { + bool isMQ = ctx->GetDungeon(itemScene)->IsMQ(); + + if ((isMQ && currentQuest == RCQUEST_MQ) || (!isMQ && currentQuest == RCQUEST_VANILLA)) { + AddItemToMainPool(loc->GetVanillaItem()); + } + } + } + } + } + } +} + +static void SetScarceItemPool() { + ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); + ReplaceMaxItem(RG_BOMBCHU_5, 1); + ReplaceMaxItem(RG_BOMBCHU_10, 2); + ReplaceMaxItem(RG_BOMBCHU_20, 0); + ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 2 : 1); + ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 2 : 1); + ReplaceMaxItem(RG_PROGRESSIVE_BOW, 2); + ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 2); + ReplaceMaxItem(RG_PROGRESSIVE_BOMB_BAG, 2); + ReplaceMaxItem(RG_HEART_CONTAINER, 0); +} + +static void SetMinimalItemPool() { + auto ctx = Rando::Context::GetInstance(); + ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 1); + ReplaceMaxItem(RG_BOMBCHU_5, 1); + ReplaceMaxItem(RG_BOMBCHU_10, 0); + ReplaceMaxItem(RG_BOMBCHU_20, 0); + ReplaceMaxItem(RG_NAYRUS_LOVE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_MAGIC_METER, 1); + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + ReplaceMaxItem(RG_PROGRESSIVE_STICK_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG) ? 1 : 0); + ReplaceMaxItem(RG_PROGRESSIVE_NUT_UPGRADE, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG) ? 1 : 0); + ReplaceMaxItem(RG_PROGRESSIVE_BOW, 1); + ReplaceMaxItem(RG_PROGRESSIVE_SLINGSHOT, 1); + 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).Get() == 18) ? 1 : 0); +} + +void GenerateItemPool() { + // RANDOTODO proper removal of items not in pool or logically relevant instead of dummy checks. + auto ctx = Rando::Context::GetInstance(); + ItemPool.clear(); + PendingJunkPool.clear(); + + // Initialize ice trap models to always major items + ctx->possibleIceTrapModels = { + RG_MIRROR_SHIELD, + RG_BOOMERANG, + RG_LENS_OF_TRUTH, + RG_MEGATON_HAMMER, + RG_IRON_BOOTS, + RG_HOVER_BOOTS, + RG_STONE_OF_AGONY, + RG_DINS_FIRE, + RG_FARORES_WIND, + RG_NAYRUS_LOVE, + RG_FIRE_ARROWS, + RG_ICE_ARROWS, + RG_LIGHT_ARROWS, + RG_DOUBLE_DEFENSE, + RG_CLAIM_CHECK, + RG_PROGRESSIVE_HOOKSHOT, + RG_PROGRESSIVE_STRENGTH, + RG_PROGRESSIVE_BOMB_BAG, + RG_PROGRESSIVE_BOW, + RG_PROGRESSIVE_SLINGSHOT, + RG_PROGRESSIVE_WALLET, + RG_PROGRESSIVE_SCALE, + RG_PROGRESSIVE_MAGIC_METER, + }; + // Check song shuffle and dungeon reward shuffle just for ice traps + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE)) { + // Push item ids for songs + ctx->possibleIceTrapModels.push_back(RG_ZELDAS_LULLABY); + ctx->possibleIceTrapModels.push_back(RG_EPONAS_SONG); + ctx->possibleIceTrapModels.push_back(RG_SARIAS_SONG); + ctx->possibleIceTrapModels.push_back(RG_SUNS_SONG); + ctx->possibleIceTrapModels.push_back(RG_SONG_OF_TIME); + ctx->possibleIceTrapModels.push_back(RG_SONG_OF_STORMS); + ctx->possibleIceTrapModels.push_back(RG_MINUET_OF_FOREST); + ctx->possibleIceTrapModels.push_back(RG_BOLERO_OF_FIRE); + ctx->possibleIceTrapModels.push_back(RG_SERENADE_OF_WATER); + ctx->possibleIceTrapModels.push_back(RG_REQUIEM_OF_SPIRIT); + ctx->possibleIceTrapModels.push_back(RG_NOCTURNE_OF_SHADOW); + ctx->possibleIceTrapModels.push_back(RG_PRELUDE_OF_LIGHT); + } + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_ANYWHERE)) { + // Push item ids for dungeon rewards + ctx->possibleIceTrapModels.push_back(RG_KOKIRI_EMERALD); + ctx->possibleIceTrapModels.push_back(RG_GORON_RUBY); + ctx->possibleIceTrapModels.push_back(RG_ZORA_SAPPHIRE); + ctx->possibleIceTrapModels.push_back(RG_FOREST_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_FIRE_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_WATER_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_SPIRIT_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_SHADOW_MEDALLION); + ctx->possibleIceTrapModels.push_back(RG_LIGHT_MEDALLION); + } + + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + ctx->possibleIceTrapModels.push_back(RG_TRIFORCE_PIECE); + 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 { + ctx->PlaceItemInLocation(RC_GANON, RG_TRIFORCE); // Win condition + } + + // Fixed item locations + ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER); + + if (ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { + AddItemToMainPool(RG_KOKIRI_SWORD); + ctx->possibleIceTrapModels.push_back(RG_KOKIRI_SWORD); + } else { + if (!ctx->GetOption(RSK_STARTING_KOKIRI_SWORD)) { + ctx->PlaceItemInLocation(RC_KF_KOKIRI_SWORD_CHEST, RG_KOKIRI_SWORD, false, true); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + AddItemToMainPool(RG_MASTER_SWORD); + ctx->possibleIceTrapModels.push_back(RG_MASTER_SWORD); + } else { + if (!ctx->GetOption(RSK_STARTING_MASTER_SWORD)) { + ctx->PlaceItemInLocation(RC_TOT_MASTER_SWORD, RG_MASTER_SWORD, false, true); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_WEIRD_EGG)) { + AddItemToMainPool(RG_WEIRD_EGG); + ctx->possibleIceTrapModels.push_back(RG_WEIRD_EGG); + } else { + ctx->PlaceItemInLocation(RC_HC_MALON_EGG, RG_WEIRD_EGG, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_OCARINA)) { + AddItemToMainPool(RG_PROGRESSIVE_OCARINA, 2); + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_PROGRESSIVE_OCARINA); + } + ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_OCARINA); + } else { + if (ctx->GetOption(RSK_STARTING_OCARINA).Is(RO_STARTING_OCARINA_OFF)) { + ctx->PlaceItemInLocation(RC_LW_GIFT_FROM_SARIA, RG_PROGRESSIVE_OCARINA, false, true); + ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); + } else { + if (ctx->GetOption(RSK_STARTING_OCARINA).IsNot(RO_STARTING_OCARINA_TIME)) { + ctx->PlaceItemInLocation(RC_HF_OCARINA_OF_TIME_ITEM, RG_PROGRESSIVE_OCARINA, false, true); + } + } + } + + if (ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS)) { + AddItemToMainPool(RG_OCARINA_A_BUTTON); + AddItemToMainPool(RG_OCARINA_C_UP_BUTTON); + AddItemToMainPool(RG_OCARINA_C_DOWN_BUTTON); + AddItemToMainPool(RG_OCARINA_C_LEFT_BUTTON); + AddItemToMainPool(RG_OCARINA_C_RIGHT_BUTTON); + + ctx->possibleIceTrapModels.push_back(RG_OCARINA_A_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_UP_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_DOWN_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_LEFT_BUTTON); + ctx->possibleIceTrapModels.push_back(RG_OCARINA_C_RIGHT_BUTTON); + } + + if (ctx->GetOption(RSK_SKELETON_KEY)) { + AddItemToMainPool(RG_SKELETON_KEY); + } + + if (ctx->GetOption(RSK_SHUFFLE_SWIM)) { + AddItemToMainPool(RG_PROGRESSIVE_SCALE); + } + + if (ctx->GetOption(RSK_SHUFFLE_BEEHIVES)) { + // 32 total beehive locations + AddItemToPool(PendingJunkPool, RG_RED_RUPEE, 23); + AddItemToPool(PendingJunkPool, RG_BLUE_RUPEE, 9); + } + + // Shuffle Pots + bool overworldPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); + bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); + PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); + + // Shuffle Crates + bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && + (ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL)); + bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); + + auto fsMode = ctx->GetOption(RSK_FISHSANITY); + 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).Get(); + for (uint8_t i = 0; i < pondCt; i++) { + AddItemToMainPool(GetJunkItem()); + } + + if (ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT)) { + // 16 max adult pond fish, have to reduce to 16 if every fish is enabled + if (pondCt > 16) + pondCt = 16; + for (uint8_t i = 0; i < pondCt; i++) { + AddItemToMainPool(GetJunkItem()); + } + } + } + // 9 grotto fish, 5 zora's domain fish + if (fsMode.Is(RO_FISHSANITY_OVERWORLD) || fsMode.Is(RO_FISHSANITY_BOTH)) { + for (uint8_t i = 0; i < Rando::StaticData::GetOverworldFishLocations().size(); i++) + AddItemToMainPool(GetJunkItem()); + } + + if (fsMode.Is(RO_FISHSANITY_HYRULE_LOACH)) { + AddItemToMainPool(RG_PURPLE_RUPEE); + } else { + ctx->PlaceItemInLocation(RC_LH_HYRULE_LOACH, RG_PURPLE_RUPEE, false, true); + } } if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { - AddItemToPool(PendingJunkPool, RG_FISHING_POLE); + AddItemToMainPool(RG_FISHING_POLE); + ctx->possibleIceTrapModels.push_back(RG_FISHING_POLE); } - //Plentiful small keys - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::WATER_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_SMALL_KEY); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->HasKeyRing()) { - AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_KEY_RING); - } else { - AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_SMALL_KEY); - } + if (ctx->GetOption(RSK_INFINITE_UPGRADES).Is(RO_INF_UPGRADES_PROGRESSIVE)) { + AddItemToMainPool(RG_PROGRESSIVE_BOMB_BAG); + AddItemToMainPool(RG_PROGRESSIVE_BOW); + AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); + AddItemToMainPool(RG_PROGRESSIVE_SLINGSHOT); + AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); + AddItemToMainPool(RG_PROGRESSIVE_MAGIC_METER); + AddItemToMainPool(RG_PROGRESSIVE_WALLET); } - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { - AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_BOSS_KEY); - AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_BOSS_KEY); - } - - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE) || ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON) || ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_BOSS_KEY); - } - } - - 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) || - ( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && - ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS) - ) - ) { - AddItemsToPool(ItemPool, normalRupees); - } else { - AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees - } - - // Shuffle Fairies - if (ctx->GetOption(RSK_SHUFFLE_FAIRIES)) { - for (auto rc : Rando::StaticData::GetOverworldFairyLocations()) { - AddItemToMainPool(GetJunkItem()); - } - // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + 3 Shadow Temple - int extra = 13; - extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; - extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; - extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; - extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; - extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; - extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla() ? 1 : 0; - extra += ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla() ? 1 : 0; - for (int i = 0; i < extra; i++) { - AddItemToMainPool(GetJunkItem()); - } - } - - //Scrubsanity - if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { - //Deku Tree - if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { - AddItemToMainPool(RG_DEKU_SHIELD); - } - - //Dodongos Cavern - AddItemToMainPool(RG_DEKU_STICK_1); - AddItemToMainPool(RG_DEKU_SHIELD); - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - AddItemToMainPool(RG_RECOVERY_HEART); - } else { - AddItemToMainPool(RG_DEKU_NUTS_5); - } - - //Jabu Jabus Belly - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsVanilla()) { - AddItemToMainPool(RG_DEKU_NUTS_5); - } - - //Ganons Castle - AddItemToMainPool(RG_BOMBS_5); - AddItemToMainPool(RG_RECOVERY_HEART); - AddItemToMainPool(RG_BLUE_RUPEE); - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - AddItemToMainPool(RG_DEKU_NUTS_5); - } - - //Overworld Scrubs - AddItemsToPool(ItemPool, dekuScrubItems); - - //Scrubs which sell seeds or arrows sell it based on age, this randomly assigns them - for (uint8_t i = 0; i < 7; i++) { - if (Random(0, 3)) { - AddItemToMainPool(RG_ARROWS_30); - } else { - AddItemToMainPool(RG_DEKU_SEEDS_30); - } - } - } - - bool overworldFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_OVERWORLD) || - ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); - bool dungeonFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_DUNGEONS) || - ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); - PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive); - - AddItemsToPool(ItemPool, alwaysItems); - AddItemsToPool(ItemPool, dungeonRewards); - - //Dungeon pools - if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { - AddItemsToPool(ItemPool, DT_MQ); - } else { - AddItemsToPool(ItemPool, DT_Vanilla); - } - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - AddItemsToPool(ItemPool, DC_MQ); - } else { - AddItemsToPool(ItemPool, DC_Vanilla); - } - if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { - AddItemsToPool(ItemPool, JB_MQ); - } - if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, FoT_MQ); - } else { - AddItemsToPool(ItemPool, FoT_Vanilla); - } - if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, FiT_MQ); - } else { - AddItemsToPool(ItemPool, FiT_Vanilla); - } - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, SpT_MQ); - } else { - AddItemsToPool(ItemPool, SpT_Vanilla); - } - if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { - AddItemsToPool(ItemPool, ShT_MQ); - } else { - AddItemsToPool(ItemPool, ShT_Vanilla); - } - if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla()) { - AddItemsToPool(ItemPool, BW_Vanilla); - } - if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsMQ()) { - AddItemsToPool(ItemPool, GTG_MQ); - } else { - AddItemsToPool(ItemPool, GTG_Vanilla); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - AddItemsToPool(ItemPool, GC_MQ); - } else { - AddItemsToPool(ItemPool, GC_Vanilla); - } - - uint8_t rutoBottles = 1; - if (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN)) { - rutoBottles = 0; - } - - //Add 4 total bottles - uint8_t bottleCount = 4; - std::vector bottles; - bottles.assign(normalBottles.begin(), normalBottles.end()); - ctx->possibleIceTrapModels.push_back( - Rando::StaticData::RetrieveItem(RandomElement(bottles)).GetRandomizerGet()); // Get one random bottle type for ice traps - for (uint8_t i = 0; i < bottleCount; i++) { - if (i >= rutoBottles) { - if ((i == bottleCount - 1) && - (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { - AddItemToMainPool(RG_BOTTLE_WITH_BLUE_POTION); - } else { - AddRandomBottle(bottles); - } - } else { - AddItemToMainPool(RG_RUTOS_LETTER); - } - } - - //add extra songs only if song shuffle is anywhere - AddItemsToPool(ItemPool, songList); - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE) && ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemsToPool(PendingJunkPool, songList); - } - - /*For item pool generation, dungeon items are either placed in their vanilla - | location, or added to the pool now and filtered out later depending on when - | they need to get placed or removed in fill.cpp. These items are kept in the - | pool until removal because the filling algorithm needs to know all of the - | advancement items that haven't been placed yet for placing higher priority - | items like stones/medallions.*/ - - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - PlaceVanillaMapsAndCompasses(); - } else { - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->GetMap() != RG_NONE) { - AddItemToMainPool(dungeon->GetMap()); - } - - if (dungeon->GetCompass() != RG_NONE) { - AddItemToMainPool(dungeon->GetCompass()); - } - } - } - - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - PlaceVanillaSmallKeys(); - } else { - for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->HasKeyRing() && ctx->GetOption(RSK_KEYSANITY).IsNot(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - AddItemToMainPool(dungeon->GetKeyRing()); - } else if (dungeon->GetSmallKeyCount() > 0) { - AddItemToMainPool(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); - } - } - } - - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { - PlaceVanillaBossKeys(); - } else { - AddItemToMainPool(RG_FOREST_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_FIRE_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_WATER_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_SPIRIT_TEMPLE_BOSS_KEY); - AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); - } - - if (!ctx->GetOption(RSK_TRIFORCE_HUNT)) { // Don't add GBK to the pool at all for Triforce Hunt. - 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).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { - 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); - } else { - AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); - } - } - - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemsToPool(ItemPool, easyItems); - } else { - AddItemsToPool(ItemPool, normalItems); - } - - if (!ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { - ReplaceMaxItem(RG_KOKIRI_SWORD, 0); - } - - if (!ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - ReplaceMaxItem(RG_MASTER_SWORD, 0); - } - - if (/*ProgressiveGoronSword TODO: Implement Setting*/false) { - ReplaceMaxItem(RG_BIGGORON_SWORD, 0); - AddItemToMainPool(RG_PROGRESSIVE_GORONSWORD, 2); - ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_GORONSWORD); - } else { - ctx->possibleIceTrapModels.push_back(RG_BIGGORON_SWORD); - } - - //Replace ice traps with junk from the pending junk pool if necessary - if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_OFF)) { - ReplaceMaxItem(RG_ICE_TRAP, 0); - } - //Replace all junk items with ice traps for onslaught mode - else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { - PendingJunkPool.clear(); - for (uint8_t i = 0; i < JunkPoolItems.size() - 3; i++) { // -3 Omits Huge Rupees and Deku Nuts 10 - ReplaceMaxItem(JunkPoolItems[i], 0); - } - } - - if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_SCARCE)) { - SetScarceItemPool(); - } else if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_MINIMAL)) { - SetMinimalItemPool(); - } else if (/*RemoveDoubleDefense TODO: Implement setting*/ false) { - ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); - } - - std::erase(ItemPool, RG_NONE); - - if (ItemPool.size() < ctx->allLocations.size()) { - Shuffle(PendingJunkPool); - size_t junkNeeded = std::min(PendingJunkPool.size(), ctx->allLocations.size() - ItemPool.size()); - ItemPool.insert(ItemPool.end(), PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); - PendingJunkPool.erase(PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); - } else if (ItemPool.size() > ctx->allLocations.size()) { - // RANDOTODO: all junk should be put in PendingJunkPool so this is never needed - size_t remove = ItemPool.size() - ctx->allLocations.size(); - for (size_t i = 0; remove > 0 && i < ItemPool.size(); i++) { - for (size_t j = 0; j < JunkPoolItems.size(); j++) { - if (ItemPool[i] == JunkPoolItems[j]) { - ItemPool[i] = RG_NONE; - remove--; - break; + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + AddItemToMainPool(RG_MAGIC_BEAN_PACK); + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_MAGIC_BEAN_PACK); } - } + ctx->possibleIceTrapModels.push_back(RG_MAGIC_BEAN_PACK); + } else { + ctx->PlaceItemInLocation(RC_ZR_MAGIC_BEAN_SALESMAN, RG_MAGIC_BEAN, false, true); } - std::erase(ItemPool, RG_NONE); - } - // RANDOTODO: Ideally this should be checking for equality, but that is not currently the case and has never been - // the case, and isn't even currently the case in the 3drando repo we inherited this from years ago, so it may - // be a large undertaking to fix. - assert(ItemPool.size() <= ctx->allLocations.size() || !"Item Pool larger than Location Pool"); + if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL)) { + if (/*!ProgressiveGoronSword TODO: Implement Progressive Goron Sword*/ true) { + AddItemToMainPool(RG_GIANTS_KNIFE); + } + if (ctx->GetOption(RSK_BOMBCHU_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS); + } else { + AddItemToMainPool(RG_BOMBCHU_10); + } + } else { + ctx->PlaceItemInLocation(RC_KAK_GRANNYS_SHOP, RG_BLUE_POTION_REFILL, false, true); + ctx->PlaceItemInLocation(RC_GC_MEDIGORON, RG_GIANTS_KNIFE, false, true); + ctx->PlaceItemInLocation(RC_WASTELAND_BOMBCHU_SALESMAN, RG_BOMBCHU_10, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_FROG_SONG_RUPEES)) { + AddItemToMainPool(RG_PURPLE_RUPEE, 5); + } else { + ctx->PlaceItemInLocation(RC_ZR_FROGS_ZELDAS_LULLABY, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_EPONAS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SARIAS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SUNS_SONG, RG_PURPLE_RUPEE, false, true); + ctx->PlaceItemInLocation(RC_ZR_FROGS_SONG_OF_TIME, RG_PURPLE_RUPEE, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { + AddItemToMainPool(RG_POCKET_EGG); + AddItemToMainPool(RG_COJIRO); + AddItemToMainPool(RG_ODD_MUSHROOM); + AddItemToMainPool(RG_ODD_POTION); + AddItemToMainPool(RG_POACHERS_SAW); + AddItemToMainPool(RG_BROKEN_SWORD); + AddItemToMainPool(RG_PRESCRIPTION); + AddItemToMainPool(RG_EYEBALL_FROG); + AddItemToMainPool(RG_EYEDROPS); + } + AddItemToMainPool(RG_CLAIM_CHECK); + + if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS)) { + AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY, 6); // 6 individual keys + } else if (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK)) { + AddItemToMainPool(RG_TREASURE_GAME_SMALL_KEY); // 1 key which will behave as a pack of 6 + } + + if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { + ctx->PlaceItemInLocation(loc, RG_GOLD_SKULLTULA_TOKEN, false, true); + } + } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_DUNGEONS)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { + if (Rando::StaticData::GetLocation(loc)->IsOverworld()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); + } else { + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); + } + } + } else if (ctx->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OVERWORLD)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, RCTYPE_SKULL_TOKEN)) { + if (Rando::StaticData::GetLocation(loc)->IsDungeon()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GOLD_SKULLTULA_TOKEN, false, true); + } else { + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN); + } + } + } else { + AddItemToMainPool(RG_GOLD_SKULLTULA_TOKEN, 100); + } + + if (ctx->GetOption(RSK_SHUFFLE_100_GS_REWARD)) { + if (ctx->GetOption(RSK_SHUFFLE_TOKENS).IsNot(RO_TOKENSANITY_OFF) && + ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_GOLD_SKULLTULA_TOKEN, 10); + } + AddItemToMainPool(RG_HUGE_RUPEE); + } else { + ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_HUGE_RUPEE, false, true); + } + + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { + AddItemToMainPool(RG_GOHMA_SOUL); + AddItemToMainPool(RG_KING_DODONGO_SOUL); + AddItemToMainPool(RG_BARINADE_SOUL); + AddItemToMainPool(RG_PHANTOM_GANON_SOUL); + AddItemToMainPool(RG_VOLVAGIA_SOUL); + AddItemToMainPool(RG_MORPHA_SOUL); + AddItemToMainPool(RG_BONGO_BONGO_SOUL); + AddItemToMainPool(RG_TWINROVA_SOUL); + + ctx->possibleIceTrapModels.push_back(RG_GOHMA_SOUL); + ctx->possibleIceTrapModels.push_back(RG_KING_DODONGO_SOUL); + ctx->possibleIceTrapModels.push_back(RG_BARINADE_SOUL); + ctx->possibleIceTrapModels.push_back(RG_PHANTOM_GANON_SOUL); + ctx->possibleIceTrapModels.push_back(RG_VOLVAGIA_SOUL); + ctx->possibleIceTrapModels.push_back(RG_MORPHA_SOUL); + ctx->possibleIceTrapModels.push_back(RG_BONGO_BONGO_SOUL); + ctx->possibleIceTrapModels.push_back(RG_TWINROVA_SOUL); + if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) { + AddItemToMainPool(RG_GANON_SOUL); + ctx->possibleIceTrapModels.push_back(RG_GANON_SOUL); + } + } + + if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET)) { + AddItemToMainPool(RG_PROGRESSIVE_WALLET); + } + + if (ctx->GetOption(RSK_INCLUDE_TYCOON_WALLET)) { + AddItemToMainPool(RG_PROGRESSIVE_WALLET); + } + + if (ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE); + } + + if (ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); + } + + if (ctx->GetOption(RSK_BOMBCHU_BAG)) { + AddItemToMainPool(RG_PROGRESSIVE_BOMBCHUS, 5); + } else { + AddItemToMainPool(RG_BOMBCHU_5); + AddItemToMainPool(RG_BOMBCHU_10, 3); + AddItemToMainPool(RG_BOMBCHU_20); + } + + // Ice Traps + AddItemToMainPool(RG_ICE_TRAP); + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla()) { + AddItemToMainPool(RG_ICE_TRAP); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { + AddItemToMainPool(RG_ICE_TRAP, 4); + } + + // Gerudo Fortress + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE)) { + ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + } else if (ctx->GetOption(RSK_GERUDO_KEYS).IsNot(RO_GERUDO_KEYS_VANILLA)) { + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { + AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + } else { + // Only add key ring if 4 Fortress keys necessary + if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_KEYRINGS)) { + AddItemToMainPool(RG_GERUDO_FORTRESS_KEY_RING); + // Add junk to make up for missing keys + for (uint8_t i = 0; i < 3; i++) { + AddItemToMainPool(GetJunkItem()); + } + } else { + AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY, 4); + } + } + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && + ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && ctx->GetOption(RSK_KEYRINGS)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_GERUDO_FORTRESS_SMALL_KEY); + } + } + } else { + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { + ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + } else { + ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + } + } + + // Gerudo Membership Card + if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) && + ctx->GetOption(RSK_GERUDO_FORTRESS).IsNot(RO_GF_CARPENTERS_FREE)) { + AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD); + ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD); + } else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); + ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true); + } else { + ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true); + } + + // Keys + + // For key rings, need to add as many junk items as "missing" keys + if (ctx->GetOption(RSK_KEYRINGS).IsNot(RO_KEYRINGS_OFF)) { + uint8_t ringJunkAmt = 0; + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->HasKeyRing()) { + ringJunkAmt += dungeon->GetSmallKeyCount() - 1; + } + } + for (uint8_t i = 0; i < ringJunkAmt; i++) { + AddItemToMainPool(GetJunkItem()); + } + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); + } + + if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE)) { + AddItemToPool(PendingJunkPool, RG_FISHING_POLE); + } + + // Plentiful small keys + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_BOTTOM_OF_THE_WELL_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::WATER_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_GERUDO_TRAINING_GROUND_SMALL_KEY); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->HasKeyRing()) { + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_KEY_RING); + } else { + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_SMALL_KEY); + } + } + + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANY_DUNGEON) || + ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OVERWORLD)) { + AddItemToPool(PendingJunkPool, RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_WATER_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToPool(PendingJunkPool, RG_SHADOW_TEMPLE_BOSS_KEY); + } + + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE) || + ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON) || + ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + AddItemToPool(PendingJunkPool, RG_GANONS_CASTLE_BOSS_KEY); + } + } + + 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) || + (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && + ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS))) { + AddItemsToPool(ItemPool, normalRupees); + } else { + AddItemsToPool(ItemPool, shopsanityRupees); // Shopsanity gets extra large rupees + } + + // Shuffle Fairies + if (ctx->GetOption(RSK_SHUFFLE_FAIRIES)) { + for (auto rc : Rando::StaticData::GetOverworldFairyLocations()) { + AddItemToMainPool(GetJunkItem()); + } + // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + 3 Shadow Temple + int extra = 13; + extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; + extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; + extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; + extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; + extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla() ? 1 : 0; + for (int i = 0; i < extra; i++) { + AddItemToMainPool(GetJunkItem()); + } + } + + // Scrubsanity + if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_ALL)) { + // Deku Tree + if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { + AddItemToMainPool(RG_DEKU_SHIELD); + } + + // Dodongos Cavern + AddItemToMainPool(RG_DEKU_STICK_1); + AddItemToMainPool(RG_DEKU_SHIELD); + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + AddItemToMainPool(RG_RECOVERY_HEART); + } else { + AddItemToMainPool(RG_DEKU_NUTS_5); + } + + // Jabu Jabus Belly + if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsVanilla()) { + AddItemToMainPool(RG_DEKU_NUTS_5); + } + + // Ganons Castle + AddItemToMainPool(RG_BOMBS_5); + AddItemToMainPool(RG_RECOVERY_HEART); + AddItemToMainPool(RG_BLUE_RUPEE); + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + AddItemToMainPool(RG_DEKU_NUTS_5); + } + + // Overworld Scrubs + AddItemsToPool(ItemPool, dekuScrubItems); + + // Scrubs which sell seeds or arrows sell it based on age, this randomly assigns them + for (uint8_t i = 0; i < 7; i++) { + if (Random(0, 3)) { + AddItemToMainPool(RG_ARROWS_30); + } else { + AddItemToMainPool(RG_DEKU_SEEDS_30); + } + } + } + + bool overworldFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); + bool dungeonFreeStandingActive = ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); + PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive); + + AddItemsToPool(ItemPool, alwaysItems); + AddItemsToPool(ItemPool, dungeonRewards); + + // Dungeon pools + if (ctx->GetDungeon(Rando::DEKU_TREE)->IsMQ()) { + AddItemsToPool(ItemPool, DT_MQ); + } else { + AddItemsToPool(ItemPool, DT_Vanilla); + } + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + AddItemsToPool(ItemPool, DC_MQ); + } else { + AddItemsToPool(ItemPool, DC_Vanilla); + } + if (ctx->GetDungeon(Rando::JABU_JABUS_BELLY)->IsMQ()) { + AddItemsToPool(ItemPool, JB_MQ); + } + if (ctx->GetDungeon(Rando::FOREST_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, FoT_MQ); + } else { + AddItemsToPool(ItemPool, FoT_Vanilla); + } + if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, FiT_MQ); + } else { + AddItemsToPool(ItemPool, FiT_Vanilla); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, SpT_MQ); + } else { + AddItemsToPool(ItemPool, SpT_Vanilla); + } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { + AddItemsToPool(ItemPool, ShT_MQ); + } else { + AddItemsToPool(ItemPool, ShT_Vanilla); + } + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla()) { + AddItemsToPool(ItemPool, BW_Vanilla); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUND)->IsMQ()) { + AddItemsToPool(ItemPool, GTG_MQ); + } else { + AddItemsToPool(ItemPool, GTG_Vanilla); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + AddItemsToPool(ItemPool, GC_MQ); + } else { + AddItemsToPool(ItemPool, GC_Vanilla); + } + + uint8_t rutoBottles = 1; + if (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN)) { + rutoBottles = 0; + } + + // Add 4 total bottles + uint8_t bottleCount = 4; + std::vector bottles; + bottles.assign(normalBottles.begin(), normalBottles.end()); + ctx->possibleIceTrapModels.push_back(Rando::StaticData::RetrieveItem(RandomElement(bottles)) + .GetRandomizerGet()); // Get one random bottle type for ice traps + for (uint8_t i = 0; i < bottleCount; i++) { + if (i >= rutoBottles) { + if ((i == bottleCount - 1) && + (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { + AddItemToMainPool(RG_BOTTLE_WITH_BLUE_POTION); + } else { + AddRandomBottle(bottles); + } + } else { + AddItemToMainPool(RG_RUTOS_LETTER); + } + } + + // add extra songs only if song shuffle is anywhere + AddItemsToPool(ItemPool, songList); + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE) && + ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemsToPool(PendingJunkPool, songList); + } + + /*For item pool generation, dungeon items are either placed in their vanilla + | location, or added to the pool now and filtered out later depending on when + | they need to get placed or removed in fill.cpp. These items are kept in the + | pool until removal because the filling algorithm needs to know all of the + | advancement items that haven't been placed yet for placing higher priority + | items like stones/medallions.*/ + + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + PlaceVanillaMapsAndCompasses(); + } else { + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->GetMap() != RG_NONE) { + AddItemToMainPool(dungeon->GetMap()); + } + + if (dungeon->GetCompass() != RG_NONE) { + AddItemToMainPool(dungeon->GetCompass()); + } + } + } + + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + PlaceVanillaSmallKeys(); + } else { + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->HasKeyRing() && ctx->GetOption(RSK_KEYSANITY).IsNot(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + AddItemToMainPool(dungeon->GetKeyRing()); + } else if (dungeon->GetSmallKeyCount() > 0) { + AddItemToMainPool(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); + } + } + } + + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA)) { + PlaceVanillaBossKeys(); + } else { + AddItemToMainPool(RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_WATER_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); + } + + if (!ctx->GetOption(RSK_TRIFORCE_HUNT)) { // Don't add GBK to the pool at all for Triforce Hunt. + 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).Get() >= RO_GANON_BOSS_KEY_LACS_VANILLA) { + 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); + } else { + AddItemToMainPool(RG_GANONS_CASTLE_BOSS_KEY); + } + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemsToPool(ItemPool, easyItems); + } else { + AddItemsToPool(ItemPool, normalItems); + } + + if (!ctx->GetOption(RSK_SHUFFLE_KOKIRI_SWORD)) { + ReplaceMaxItem(RG_KOKIRI_SWORD, 0); + } + + if (!ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + ReplaceMaxItem(RG_MASTER_SWORD, 0); + } + + if (/*ProgressiveGoronSword TODO: Implement Setting*/ false) { + ReplaceMaxItem(RG_BIGGORON_SWORD, 0); + AddItemToMainPool(RG_PROGRESSIVE_GORONSWORD, 2); + ctx->possibleIceTrapModels.push_back(RG_PROGRESSIVE_GORONSWORD); + } else { + ctx->possibleIceTrapModels.push_back(RG_BIGGORON_SWORD); + } + + // Replace ice traps with junk from the pending junk pool if necessary + if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_OFF)) { + ReplaceMaxItem(RG_ICE_TRAP, 0); + } + // Replace all junk items with ice traps for onslaught mode + else if (ctx->GetOption(RSK_ICE_TRAPS).Is(RO_ICE_TRAPS_ONSLAUGHT)) { + PendingJunkPool.clear(); + for (uint8_t i = 0; i < JunkPoolItems.size() - 3; i++) { // -3 Omits Huge Rupees and Deku Nuts 10 + ReplaceMaxItem(JunkPoolItems[i], 0); + } + } + + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_SCARCE)) { + SetScarceItemPool(); + } else if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_MINIMAL)) { + SetMinimalItemPool(); + } else if (/*RemoveDoubleDefense TODO: Implement setting*/ false) { + ReplaceMaxItem(RG_DOUBLE_DEFENSE, 0); + } + + std::erase(ItemPool, RG_NONE); + + if (ItemPool.size() < ctx->allLocations.size()) { + Shuffle(PendingJunkPool); + size_t junkNeeded = std::min(PendingJunkPool.size(), ctx->allLocations.size() - ItemPool.size()); + ItemPool.insert(ItemPool.end(), PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + PendingJunkPool.erase(PendingJunkPool.begin(), PendingJunkPool.begin() + junkNeeded); + } else if (ItemPool.size() > ctx->allLocations.size()) { + // RANDOTODO: all junk should be put in PendingJunkPool so this is never needed + size_t remove = ItemPool.size() - ctx->allLocations.size(); + for (size_t i = 0; remove > 0 && i < ItemPool.size(); i++) { + for (size_t j = 0; j < JunkPoolItems.size(); j++) { + if (ItemPool[i] == JunkPoolItems[j]) { + ItemPool[i] = RG_NONE; + remove--; + break; + } + } + } + std::erase(ItemPool, RG_NONE); + } + + // RANDOTODO: Ideally this should be checking for equality, but that is not currently the case and has never been + // the case, and isn't even currently the case in the 3drando repo we inherited this from years ago, so it may + // be a large undertaking to fix. + assert(ItemPool.size() <= ctx->allLocations.size() || !"Item Pool larger than Location Pool"); } diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index 6bcf21af9..831330571 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -22,7 +22,7 @@ Rando::Option* currentSetting; } // namespace bool GenerateRandomizer(std::set excludedLocations, std::set enabledTricks, - std::string seedInput) { + std::string seedInput) { const auto ctx = Rando::Context::GetInstance(); ResetPerformanceTimers(); StartPerformanceTimer(PT_WHOLE_SEED); @@ -35,9 +35,7 @@ bool GenerateRandomizer(std::set excludedLocations, std::set excludedLocations, std::set enabledTricks) { +int Playthrough_Init(uint32_t seed, std::set excludedLocations, + std::set enabledTricks) { // initialize the RNG with just the seed incase any settings need to be // resolved to something random Random_Init(seed); @@ -65,7 +66,6 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, Random_Init(finalHash); ctx->SetHash(std::to_string(finalHash)); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_VANILLA)) { VanillaFill(); // Just place items in their vanilla locations } else { // Fill locations with logic @@ -78,8 +78,9 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, GenerateHash(); if (true) { - //TODO: Handle different types of file output (i.e. Spoiler Log, Plando Template, Patch Files, Race Files, etc.) - // write logs + // TODO: Handle different types of file output (i.e. Spoiler Log, Plando Template, Patch Files, Race Files, + // etc.) + // write logs SPDLOG_INFO("Writing Spoiler Log..."); StartPerformanceTimer(PT_SPOILER_LOG); if (SpoilerLog_Write()) { @@ -97,7 +98,8 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, } // used for generating a lot of seeds at once -int Playthrough_Repeat(std::set excludedLocations, std::set enabledTricks, int count /*= 1*/) { +int Playthrough_Repeat(std::set excludedLocations, std::set enabledTricks, + int count /*= 1*/) { SPDLOG_INFO("GENERATING {} SEEDS", count); auto ctx = Rando::Context::GetInstance(); uint32_t repeatedSeed = 0; diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index d26e89adb..51cfdd535 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -11,7 +11,7 @@ #include "soh/cvar_prefixes.h" void RandoMain::GenerateRando(std::set excludedLocations, std::set enabledTricks, - std::string seedString) { + std::string seedString) { Rando::Context::GetInstance()->SetSeedGenerated(GenerateRandomizer(excludedLocations, enabledTricks, seedString)); diff --git a/soh/soh/Enhancements/randomizer/3drando/random.cpp b/soh/soh/Enhancements/randomizer/3drando/random.cpp index 92cf22b85..f2599da94 100644 --- a/soh/soh/Enhancements/randomizer/3drando/random.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/random.cpp @@ -8,16 +8,16 @@ static bool init = false; static boost::random::mt19937 generator; -//Initialize with seed specified +// Initialize with seed specified void Random_Init(uint32_t seed) { init = true; - generator = boost::random::mt19937{seed}; + generator = boost::random::mt19937{ seed }; } -//Returns a random integer in range [min, max-1] +// Returns a random integer in range [min, max-1] uint32_t Random(int min, int max) { if (!init) { - //No seed given, get a random number from device to seed + // No seed given, get a random number from device to seed #if !defined(__SWITCH__) && !defined(__WIIU__) const auto seed = static_cast(std::random_device{}()); #else @@ -25,11 +25,11 @@ uint32_t Random(int min, int max) { #endif Random_Init(seed); } - boost::random::uniform_int_distribution distribution(min, max-1); + boost::random::uniform_int_distribution distribution(min, max - 1); return distribution(generator); } -//Returns a random floating point number in [0.0, 1.0] +// Returns a random floating point number in [0.0, 1.0] double RandomDouble() { boost::random::uniform_real_distribution distribution(0.0, 1.0); return distribution(generator); diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 636f9ecd7..8224865ac 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -10,143 +10,90 @@ #include #include "z64item.h" -PriceSettingsStruct::PriceSettingsStruct(RandomizerSettingKey _main, - RandomizerSettingKey _fixedPrice, - RandomizerSettingKey _range1, - RandomizerSettingKey _range2, - RandomizerSettingKey _noWallet, - RandomizerSettingKey _childWallet, - RandomizerSettingKey _adultWallet, - RandomizerSettingKey _giantWallet, - RandomizerSettingKey _tycoonWallet, - RandomizerSettingKey _affordable){ - main = _main; - fixedPrice = _fixedPrice; - range1 = _range1; - range2 = _range2; - noWallet = _noWallet; - childWallet = _childWallet; - adultWallet = _adultWallet; - giantWallet= _giantWallet; - tycoonWallet= _tycoonWallet; - affordable= _affordable; +PriceSettingsStruct::PriceSettingsStruct(RandomizerSettingKey _main, RandomizerSettingKey _fixedPrice, + RandomizerSettingKey _range1, RandomizerSettingKey _range2, + RandomizerSettingKey _noWallet, RandomizerSettingKey _childWallet, + RandomizerSettingKey _adultWallet, RandomizerSettingKey _giantWallet, + RandomizerSettingKey _tycoonWallet, RandomizerSettingKey _affordable) { + main = _main; + fixedPrice = _fixedPrice; + range1 = _range1; + range2 = _range2; + noWallet = _noWallet; + childWallet = _childWallet; + adultWallet = _adultWallet; + giantWallet = _giantWallet; + tycoonWallet = _tycoonWallet; + affordable = _affordable; } - static std::array, 0xF1> trickNameTable; // Table of trick names for ice traps -bool initTrickNames = false; //Indicates if trick ice trap names have been initialized yet +bool initTrickNames = false; // Indicates if trick ice trap names have been initialized yet -//Set vanilla shop item locations before potentially shuffling +// Set vanilla shop item locations before potentially shuffling void PlaceVanillaShopItems() { auto ctx = Rando::Context::GetInstance(); - //Loop to place vanilla items in each location + // Loop to place vanilla items in each location for (RandomizerCheck& randomizerCheck : Rando::StaticData::GetShopLocations()) { ctx->GetItemLocation(randomizerCheck)->PlaceVanillaItem(); } } -//These are the vanilla shop items, but in a priority order of importance -//However many shop item slots were cleared, this will return 64 minus that number of vanilla shop items to be placed with assumed fill -//The first 32 items here will always be present in shops -//Shopsanity 4 will only have the first 32, shopsanity 1 will have the first 56, etc. -//Shopsanity random will have anywhere from the first 32 to the first 56, so the order of items after 32 is relevant +// These are the vanilla shop items, but in a priority order of importance +// However many shop item slots were cleared, this will return 64 minus that number of vanilla shop items to be placed +// with assumed fill The first 32 items here will always be present in shops Shopsanity 4 will only have the first 32, +// shopsanity 1 will have the first 56, etc. Shopsanity random will have anywhere from the first 32 to the first 56, so +// the order of items after 32 is relevant std::vector GetMinVanillaShopItems(int total_replaced) { std::vector minShopItems = { - RG_BUY_DEKU_SHIELD, - RG_BUY_HYLIAN_SHIELD, - RG_BUY_GORON_TUNIC, - RG_BUY_ZORA_TUNIC, - RG_BUY_DEKU_NUTS_5, - RG_BUY_BOMBS_20, - RG_BUY_BOMBCHUS_10, - RG_BUY_DEKU_STICK_1, + RG_BUY_DEKU_SHIELD, RG_BUY_HYLIAN_SHIELD, RG_BUY_GORON_TUNIC, RG_BUY_ZORA_TUNIC, RG_BUY_DEKU_NUTS_5, + RG_BUY_BOMBS_20, RG_BUY_BOMBCHUS_10, RG_BUY_DEKU_STICK_1, //^First 8 items: Exist on shopsanity 7 or less - RG_BUY_FAIRYS_SPIRIT, - RG_BUY_DEKU_SEEDS_30, - RG_BUY_ARROWS_10, - RG_BUY_BLUE_FIRE, - RG_BUY_RED_POTION_30, - RG_BUY_GREEN_POTION, - RG_BUY_DEKU_NUTS_10, - RG_BUY_BOMBCHUS_10, + RG_BUY_FAIRYS_SPIRIT, RG_BUY_DEKU_SEEDS_30, RG_BUY_ARROWS_10, RG_BUY_BLUE_FIRE, RG_BUY_RED_POTION_30, + RG_BUY_GREEN_POTION, RG_BUY_DEKU_NUTS_10, RG_BUY_BOMBCHUS_10, //^First 16 items: Exist on shopsanity 6 or less - RG_BUY_BOMBCHUS_10, - RG_BUY_BOMBCHUS_20, - RG_BUY_BOMBS_525, - RG_BUY_BOMBS_535, - RG_BUY_BOMBS_10, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_30, - RG_BUY_ARROWS_50, + RG_BUY_BOMBCHUS_10, RG_BUY_BOMBCHUS_20, RG_BUY_BOMBS_525, RG_BUY_BOMBS_535, RG_BUY_BOMBS_10, RG_BUY_DEKU_NUTS_5, + RG_BUY_ARROWS_30, RG_BUY_ARROWS_50, //^First 24 items: Exist on shopsanity 5 or less - RG_BUY_ARROWS_10, - RG_BUY_FAIRYS_SPIRIT, - RG_BUY_BOTTLE_BUG, - RG_BUY_FISH, + RG_BUY_ARROWS_10, RG_BUY_FAIRYS_SPIRIT, RG_BUY_BOTTLE_BUG, RG_BUY_FISH, //^First 28 items from OoTR - RG_BUY_HYLIAN_SHIELD, - RG_BUY_BOTTLE_BUG, - RG_BUY_DEKU_STICK_1, - RG_BUY_DEKU_STICK_1, + RG_BUY_HYLIAN_SHIELD, RG_BUY_BOTTLE_BUG, RG_BUY_DEKU_STICK_1, RG_BUY_DEKU_STICK_1, //^First 32 items: Exist on shopsanity 4 or less - RG_BUY_BLUE_FIRE, - RG_BUY_FISH, - RG_BUY_BOMBCHUS_10, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_10, - RG_BUY_BOMBCHUS_20, - RG_BUY_BOMBS_535, - RG_BUY_RED_POTION_30, + RG_BUY_BLUE_FIRE, RG_BUY_FISH, RG_BUY_BOMBCHUS_10, RG_BUY_DEKU_NUTS_5, RG_BUY_ARROWS_10, RG_BUY_BOMBCHUS_20, + RG_BUY_BOMBS_535, RG_BUY_RED_POTION_30, //^First 40 items: Exist on shopsanity 3 or less - RG_BUY_BOMBS_30, - RG_BUY_BOMBCHUS_20, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_10, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_30, - RG_BUY_RED_POTION_40, - RG_BUY_FISH, + RG_BUY_BOMBS_30, RG_BUY_BOMBCHUS_20, RG_BUY_DEKU_NUTS_5, RG_BUY_ARROWS_10, RG_BUY_DEKU_NUTS_5, RG_BUY_ARROWS_30, + RG_BUY_RED_POTION_40, RG_BUY_FISH, //^First 48 items: Exist on shopsanity 2 or less - RG_BUY_BOMBCHUS_20, - RG_BUY_ARROWS_30, - RG_BUY_RED_POTION_50, - RG_BUY_ARROWS_30, - RG_BUY_DEKU_NUTS_5, - RG_BUY_ARROWS_50, - RG_BUY_ARROWS_50, - RG_BUY_GREEN_POTION, + RG_BUY_BOMBCHUS_20, RG_BUY_ARROWS_30, RG_BUY_RED_POTION_50, RG_BUY_ARROWS_30, RG_BUY_DEKU_NUTS_5, + RG_BUY_ARROWS_50, RG_BUY_ARROWS_50, RG_BUY_GREEN_POTION, //^First 56 items: Exist on shopsanity 1 or less - RG_BUY_POE, - RG_BUY_POE, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, - RG_BUY_HEART, + RG_BUY_POE, RG_BUY_POE, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, RG_BUY_HEART, //^All 64 items: Only exist with shopsanity 0 }; - //Now delete however many items there are to replace + // Now delete however many items there are to replace for (int i = 0; i < total_replaced; i++) { minShopItems.pop_back(); } return minShopItems; } -//This table contains a cumulative probability for each possible shop price based on -// a beta distribution with alpha = 1.5, beta = 2, and the result of the distribution, a float in [0.0, 1.0), -// being mutliplied by 60, casted to an integer, then multiplied by 5 to give a value in range [0, 295] in increments of 5. -// Meaning the first value is the probability of 0, the next value is the probability of 0 plus the probability of 5, etc. -//Probabilities generated using a python script with 1 billion trials, so should hopefully be pretty good -//Average price ~126 +// This table contains a cumulative probability for each possible shop price based on +// a beta distribution with alpha = 1.5, beta = 2, and the result of the distribution, a float in [0.0, 1.0), +// being mutliplied by 60, casted to an integer, then multiplied by 5 to give a value in range [0, 295] in increments +// of 5. Meaning the first value is the probability of 0, the next value is the probability of 0 plus the probability +// of 5, etc. +// Probabilities generated using a python script with 1 billion trials, so should hopefully be pretty good +// Average price ~126 //~38% chance of needing no wallet, ~45% chance of needing 1, ~17% chance of needing 2 -static constexpr std::array ShopPriceProbability= { - 0.005326994, 0.014908518, 0.027114719, 0.041315285, 0.057136304, 0.074325887, 0.092667151, 0.112002061, 0.132198214, 0.153125390, - 0.174696150, 0.196810540, 0.219388148, 0.242361379, 0.265657012, 0.289205134, 0.312970402, 0.336877590, 0.360881110, 0.384932772, - 0.408976198, 0.432982176, 0.456902494, 0.480686053, 0.504313389, 0.527746488, 0.550938554, 0.573856910, 0.596465330, 0.618736235, - 0.640646600, 0.662162782, 0.683240432, 0.703859801, 0.724001242, 0.743631336, 0.762722631, 0.781259986, 0.799198449, 0.816521905, - 0.833208595, 0.849243398, 0.864579161, 0.879211177, 0.893112051, 0.906263928, 0.918639420, 0.930222611, 0.940985829, 0.950914731, - 0.959992180, 0.968187000, 0.975495390, 0.981884488, 0.987344345, 0.991851853, 0.995389113, 0.997937921, 0.999481947, 1.000000000, +static constexpr std::array ShopPriceProbability = { + 0.005326994, 0.014908518, 0.027114719, 0.041315285, 0.057136304, 0.074325887, 0.092667151, 0.112002061, 0.132198214, + 0.153125390, 0.174696150, 0.196810540, 0.219388148, 0.242361379, 0.265657012, 0.289205134, 0.312970402, 0.336877590, + 0.360881110, 0.384932772, 0.408976198, 0.432982176, 0.456902494, 0.480686053, 0.504313389, 0.527746488, 0.550938554, + 0.573856910, 0.596465330, 0.618736235, 0.640646600, 0.662162782, 0.683240432, 0.703859801, 0.724001242, 0.743631336, + 0.762722631, 0.781259986, 0.799198449, 0.816521905, 0.833208595, 0.849243398, 0.864579161, 0.879211177, 0.893112051, + 0.906263928, 0.918639420, 0.930222611, 0.940985829, 0.950914731, 0.959992180, 0.968187000, 0.975495390, 0.981884488, + 0.987344345, 0.991851853, 0.995389113, 0.997937921, 0.999481947, 1.000000000, }; // Generate random number from 5 to wallet max @@ -155,92 +102,94 @@ int GetPriceFromMax(int max) { return Random(1, max) * 5; } -uint16_t GetPriceFromSettings(Rando::Location *loc, PriceSettingsStruct priceSettings) { - auto ctx = Rando::Context::GetInstance(); - switch (ctx->GetOption(priceSettings.main).Get()){ - case RO_PRICE_VANILLA: - return loc->GetVanillaPrice(); - case RO_PRICE_CHEAP_BALANCED: - return GetCheapBalancedPrice(); - case RO_PRICE_BALANCED:{ - double random = RandomDouble(); //Randomly generated probability value - for (size_t i = 0; i < ShopPriceProbability.size(); i++) { - if (random < ShopPriceProbability[i]) { - // The randomly generated value has surpassed the total probability up to this point, so this is the generated price - // i in range [0, 59], output in range [0, 295] in increments of 5 - return i * 5; +uint16_t GetPriceFromSettings(Rando::Location* loc, PriceSettingsStruct priceSettings) { + auto ctx = Rando::Context::GetInstance(); + switch (ctx->GetOption(priceSettings.main).Get()) { + case RO_PRICE_VANILLA: + return loc->GetVanillaPrice(); + case RO_PRICE_CHEAP_BALANCED: + return GetCheapBalancedPrice(); + case RO_PRICE_BALANCED: { + double random = RandomDouble(); // Randomly generated probability value + for (size_t i = 0; i < ShopPriceProbability.size(); i++) { + if (random < ShopPriceProbability[i]) { + // The randomly generated value has surpassed the total probability up to this point, so this is the + // generated price i in range [0, 59], output in range [0, 295] in increments of 5 + return i * 5; + } } - } - return 150; - } - case RO_PRICE_FIXED: - return (uint16_t)ctx->GetOption(priceSettings.fixedPrice).Get() * 5; - case RO_PRICE_RANGE:{ - 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).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); - } - int16_t selected = Random(1, totalWeight + 1); - selected = selected - noWeight; - if (selected <= 0){ - return 0; - } - selected = selected - childWeight; - if (selected <= 0){ - return Random(1, 100); - } - selected = selected - adultWeight; - if (selected <= 0){ - return Random(100, 201); - } - selected = selected - giantWeight; - if (selected <= 0){ - return Random(201, 501); - } - return Random(501, 999); - } - } - SPDLOG_ERROR("GetPriceFromSettings has failed to return a price for location {}, assigning a default value.", loc->GetName()); - assert(false); - return 69; //this should never happen, if it does, EASTER EGG that tells us something is wrong + return 150; + } + case RO_PRICE_FIXED: + return (uint16_t)ctx->GetOption(priceSettings.fixedPrice).Get() * 5; + case RO_PRICE_RANGE: { + 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).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); + } + int16_t selected = Random(1, totalWeight + 1); + selected = selected - noWeight; + if (selected <= 0) { + return 0; + } + selected = selected - childWeight; + if (selected <= 0) { + return Random(1, 100); + } + selected = selected - adultWeight; + if (selected <= 0) { + return Random(100, 201); + } + selected = selected - giantWeight; + if (selected <= 0) { + return Random(201, 501); + } + return Random(501, 999); + } + } + SPDLOG_ERROR("GetPriceFromSettings has failed to return a price for location {}, assigning a default value.", + loc->GetName()); + assert(false); + return 69; // this should never happen, if it does, EASTER EGG that tells us something is wrong } -uint16_t GetRandomPrice(Rando::Location *loc, PriceSettingsStruct priceSettings) { - uint16_t initialPrice = GetPriceFromSettings(loc, priceSettings); - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(priceSettings.affordable) && !ctx->GetOption(priceSettings.main).Is(RO_PRICE_FIXED)){ - if (initialPrice > 500) { - return 505; - } else if (initialPrice > 200) { - return 205; - } else if (initialPrice > 99) { - return 100; - } else if (initialPrice > 0) { - return 5; - } - return 0; - } else { - return initialPrice; - } +uint16_t GetRandomPrice(Rando::Location* loc, PriceSettingsStruct priceSettings) { + uint16_t initialPrice = GetPriceFromSettings(loc, priceSettings); + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(priceSettings.affordable) && !ctx->GetOption(priceSettings.main).Is(RO_PRICE_FIXED)) { + if (initialPrice > 500) { + return 505; + } else if (initialPrice > 200) { + return 205; + } else if (initialPrice > 99) { + return 100; + } else if (initialPrice > 0) { + return 5; + } + return 0; + } else { + return initialPrice; + } } -//Similar to above, beta distribution with alpha = 1, beta = 2, -// multiplied by 20 instead of 60 to give values in rage [0, 95] in increments of 5 -//Average price ~31 +// Similar to above, beta distribution with alpha = 1, beta = 2, +// multiplied by 20 instead of 60 to give values in rage [0, 95] in increments of 5 +// Average price ~31 static constexpr std::array CheapPriceProbability = { - 0.097500187, 0.190002748, 0.277509301, 0.360018376, 0.437522571, 0.510021715, 0.577520272, 0.640029304, 0.697527584, 0.750024535, - 0.797518749, 0.840011707, 0.877508776, 0.910010904, 0.937504342, 0.960004661, 0.977502132, 0.989998967, 0.997500116, 1.000000000, + 0.097500187, 0.190002748, 0.277509301, 0.360018376, 0.437522571, 0.510021715, 0.577520272, + 0.640029304, 0.697527584, 0.750024535, 0.797518749, 0.840011707, 0.877508776, 0.910010904, + 0.937504342, 0.960004661, 0.977502132, 0.989998967, 0.997500116, 1.000000000, }; uint16_t GetCheapBalancedPrice() { @@ -253,7 +202,7 @@ uint16_t GetCheapBalancedPrice() { return -1; } -//Get 0 to 7, or a random number from 1-7 depending on shopsanity setting +// Get 0 to 7, or a random number from 1-7 depending on shopsanity setting int GetShopsanityReplaceAmount() { auto ctx = Rando::Context::GetInstance(); if (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { @@ -276,670 +225,668 @@ int GetShopsanityReplaceAmount() { } else if (ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_SEVEN_ITEMS)) { return 7; } else if (ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_EIGHT_ITEMS)) { - return 8; //temporarily unreachable due to logic limitations + return 8; // temporarily unreachable due to logic limitations } else { assert(false); return 0; } - } else { //Random, get number in [1, 7] + } else { // Random, get number in [1, 7] return Random(1, 8); } } -//Initialize the table of trick names with an easy, medium, and hard name for each language +// Initialize the table of trick names with an easy, medium, and hard name for each language void InitTrickNames() { trickNameTable[RG_KOKIRI_SWORD] = { - Text{"Korok Sword", "Épée Korok", "Espada Korok"}, - Text{"Hero's Sword", "Épée du Héros", "Espada del héroe"}, - Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}, + Text{ "Korok Sword", "Épée Korok", "Espada Korok" }, + Text{ "Hero's Sword", "Épée du Héros", "Espada del héroe" }, + Text{ "Razor Sword", "Lame Rasoir", "Espada de esmeril" }, }; trickNameTable[RG_MASTER_SWORD] = { - Text{"Goddess Sword", "Épée de la déesse", "Espada Divina"}, - Text{"Gilded Sword", "Excalibur", "Espada de los Sabios"}, - Text{"Magical Sword", "Lame dorée", "Fay"}, + Text{ "Goddess Sword", "Épée de la déesse", "Espada Divina" }, + Text{ "Gilded Sword", "Excalibur", "Espada de los Sabios" }, + Text{ "Magical Sword", "Lame dorée", "Fay" }, }; trickNameTable[RG_GIANTS_KNIFE] = { - Text{"Medigoron's Sword", "l'Épée de Medigoron", "La espada de Medigoron"}, - Text{"Razor Sword", "Lame Rasoir", "Espada de esmeril"}, - Text{"Royal Claymore", "Claymore Royale", "Royal Claymore"}, + Text{ "Medigoron's Sword", "l'Épée de Medigoron", "La espada de Medigoron" }, + Text{ "Razor Sword", "Lame Rasoir", "Espada de esmeril" }, + Text{ "Royal Claymore", "Claymore Royale", "Royal Claymore" }, }; trickNameTable[RG_BIGGORON_SWORD] = { - Text{"Power Sword", "Épée de Puissance", "Espada de poder"}, - Text{"Fierce Deity Sword", "Épée du dieu démon", "Espada de la Fiera Deidad"}, - Text{"Tempered Sword", "Épée de Légende Nv.2", "Espada Maestra mejorada"}, - Text{"Biggoron's Knife", "Lame de Grogoron", "Daga de Biggoron"}, + Text{ "Power Sword", "Épée de Puissance", "Espada de poder" }, + Text{ "Fierce Deity Sword", "Épée du dieu démon", "Espada de la Fiera Deidad" }, + Text{ "Tempered Sword", "Épée de Légende Nv.2", "Espada Maestra mejorada" }, + Text{ "Biggoron's Knife", "Lame de Grogoron", "Daga de Biggoron" }, }; trickNameTable[RG_DEKU_SHIELD] = { - Text{"Boko Shield", "Bouclier Boko", "Escudo Boko"}, - Text{"Ordon Shield", "Bouclier de Toal", "Escudo de Ordon"}, - Text{"Wooden Shield", "Bouclier de Bois", "Escudo de madera"}, + Text{ "Boko Shield", "Bouclier Boko", "Escudo Boko" }, + Text{ "Ordon Shield", "Bouclier de Toal", "Escudo de Ordon" }, + Text{ "Wooden Shield", "Bouclier de Bois", "Escudo de madera" }, }; trickNameTable[RG_HYLIAN_SHIELD] = { - Text{"Hyrule Shield", "Bouclier d'Hyrule", "Escudo Hylian"}, - Text{"Goddess Shield", "Bouclier Sacré", "Escudo Divino"}, - Text{"Hero's Shield", "Bouclier du Héros", "Escudo del héroe"}, + Text{ "Hyrule Shield", "Bouclier d'Hyrule", "Escudo Hylian" }, + Text{ "Goddess Shield", "Bouclier Sacré", "Escudo Divino" }, + Text{ "Hero's Shield", "Bouclier du Héros", "Escudo del héroe" }, }; trickNameTable[RG_MIRROR_SHIELD] = { - Text{"Magic Mirror", "Miroir Magique", "Escudo mágico"}, - Text{"Magical Shield", "Bouclier Magique", "Escudo arcano"}, - Text{"Mirror of Twilight", "Miroir des Ombres", "Espejo del Crepúsculo"}, + Text{ "Magic Mirror", "Miroir Magique", "Escudo mágico" }, + Text{ "Magical Shield", "Bouclier Magique", "Escudo arcano" }, + Text{ "Mirror of Twilight", "Miroir des Ombres", "Espejo del Crepúsculo" }, }; trickNameTable[RG_GORON_TUNIC] = { - Text{"Gerudo Top", "Tunique Gerudo", "Pechera gerudo"}, - Text{"Flamebreaker Armor", "Armure de Pierre", " Armadura ignífuga"}, - Text{"Red Mail", "Habits Rouges", "Ropas rojas"}, + Text{ "Gerudo Top", "Tunique Gerudo", "Pechera gerudo" }, + Text{ "Flamebreaker Armor", "Armure de Pierre", " Armadura ignífuga" }, + Text{ "Red Mail", "Habits Rouges", "Ropas rojas" }, }; trickNameTable[RG_ZORA_TUNIC] = { - Text{"Rito Tunic", "Tunique Rito", "Sayo rito"}, - Text{"Mermaid Suit", "Costume de sirène", "Costume de sirène"}, - Text{"Zora Armor", "Armure Zora", "Túnica Zora"}, - Text{"Blue Mail", "Habits Bleus", "Ropas azules"}, + Text{ "Rito Tunic", "Tunique Rito", "Sayo rito" }, + Text{ "Mermaid Suit", "Costume de sirène", "Costume de sirène" }, + Text{ "Zora Armor", "Armure Zora", "Túnica Zora" }, + Text{ "Blue Mail", "Habits Bleus", "Ropas azules" }, }; trickNameTable[RG_IRON_BOOTS] = { - Text{"Iron Hoofs", "Patins de Plomb", "Botas férreas"}, - Text{"Snow Boots", "Bottes de Neige", "Botas de nieve"}, - Text{"Red Boots", "Bottes rouges", "Botas rojas"}, - Text{"Zora Greaves", "Bottes Zora", "Zora Greaves"}, - Text{"Boots of Power", "Bottes de Puissance", "Botas de plomo"}, + Text{ "Iron Hoofs", "Patins de Plomb", "Botas férreas" }, + Text{ "Snow Boots", "Bottes de Neige", "Botas de nieve" }, + Text{ "Red Boots", "Bottes rouges", "Botas rojas" }, + Text{ "Zora Greaves", "Bottes Zora", "Zora Greaves" }, + Text{ "Boots of Power", "Bottes de Puissance", "Botas de plomo" }, }; trickNameTable[RG_HOVER_BOOTS] = { - Text{"Hover Hoofs", "Patins des airs", "Botas flotadoras"}, - Text{"Golden Boots", "Bottes dorées", "Botas de Oro"}, - Text{"Pegasus Boots", "Bottes pégase", "Botas de Pegaso"}, - Text{"Boots of Speed", "Bottes de vitesse", "Botas del desierto"}, + Text{ "Hover Hoofs", "Patins des airs", "Botas flotadoras" }, + Text{ "Golden Boots", "Bottes dorées", "Botas de Oro" }, + Text{ "Pegasus Boots", "Bottes pégase", "Botas de Pegaso" }, + Text{ "Boots of Speed", "Bottes de vitesse", "Botas del desierto" }, }; trickNameTable[RG_WEIRD_EGG] = { - Text{"Poached Egg", "Oeuf à la coque", "Huevo pasado"}, - Text{"Lon Lon Egg", "Oeuf Lon Lon", "Huevo Lon Lon"}, - Text{"Zora Egg", "Oeuf Zora", "Huevo Zora"}, + Text{ "Poached Egg", "Oeuf à la coque", "Huevo pasado" }, + Text{ "Lon Lon Egg", "Oeuf Lon Lon", "Huevo Lon Lon" }, + Text{ "Zora Egg", "Oeuf Zora", "Huevo Zora" }, }; trickNameTable[RG_ZELDAS_LETTER] = { - Text{"Ruto's Letter", "Lettre de Ruto", "Carta de Ruto"}, - Text{"Royal Letter", "Lettre Eoyale", "Carta para Kafei"}, - Text{"Zelda's Business Card", "Carte d'affaires de Zelda", "Carta"}, - Text{"Letter to Kafei", "Lettre pour Kafei", "Carta para Kafei "}, - Text{"Goat's Letter", "Lettre de la Chèvre", "Carta de la Cabra"}, - Text{"Maggie's Letter", "Lettre de Maggy", "Carta de Dolores"}, + Text{ "Ruto's Letter", "Lettre de Ruto", "Carta de Ruto" }, + Text{ "Royal Letter", "Lettre Eoyale", "Carta para Kafei" }, + Text{ "Zelda's Business Card", "Carte d'affaires de Zelda", "Carta" }, + Text{ "Letter to Kafei", "Lettre pour Kafei", "Carta para Kafei " }, + Text{ "Goat's Letter", "Lettre de la Chèvre", "Carta de la Cabra" }, + Text{ "Maggie's Letter", "Lettre de Maggy", "Carta de Dolores" }, }; trickNameTable[RG_BOOMERANG] = { - Text{"Banana", "Banane", "Plátano"}, - Text{"Prank Fetch Toy", "Inséparable Bâtonnet", "Bumerang"}, - Text{"Gale Boomerang", "Boomerang Tornade", "Bumerán tornado"}, - Text{"Magic Boomerang", "Boomerang Magique", "Bumerán mágico"}, + Text{ "Banana", "Banane", "Plátano" }, + Text{ "Prank Fetch Toy", "Inséparable Bâtonnet", "Bumerang" }, + Text{ "Gale Boomerang", "Boomerang Tornade", "Bumerán tornado" }, + Text{ "Magic Boomerang", "Boomerang Magique", "Bumerán mágico" }, }; trickNameTable[RG_LENS_OF_TRUTH] = { - Text{"Sheikah-leidoscope", "Sheikah-léidoscope", "Monóculo de la Verdad"}, - Text{"Sheikah Sensor", "Sonar Sheikah", "Sensor Sheikah"}, - Text{"Crystal of Vision", "Cristal de Vision", "Cristal de Visión"}, - Text{"Magnifying Lens", "Loupe", "Lente Aumentadora"}, + Text{ "Sheikah-leidoscope", "Sheikah-léidoscope", "Monóculo de la Verdad" }, + Text{ "Sheikah Sensor", "Sonar Sheikah", "Sensor Sheikah" }, + Text{ "Crystal of Vision", "Cristal de Vision", "Cristal de Visión" }, + Text{ "Magnifying Lens", "Loupe", "Lente Aumentadora" }, }; trickNameTable[RG_MEGATON_HAMMER] = { - Text{"Goron Gavel", "Masse Perforatrice", "Mazo Goron"}, - Text{"Magic Hammer", "Marteau Magique", "Martillo mágico"}, - Text{"Skull Hammer", "Maillet Ressort", "Martillo de hierro"}, + Text{ "Goron Gavel", "Masse Perforatrice", "Mazo Goron" }, + Text{ "Magic Hammer", "Marteau Magique", "Martillo mágico" }, + Text{ "Skull Hammer", "Maillet Ressort", "Martillo de hierro" }, }; trickNameTable[RG_STONE_OF_AGONY] = { - Text{"Cave Charm", "Charme de grotte", "Amuleto de la cueva"}, - Text{"Stone of Agahnim", "Fragment d'Agahnim", "Piedra de Agahnim"}, - Text{"Shard of Agony", "Fragment de Souffrance", "Piedra de la Agonía"}, - Text{"Pirate's Charm", "Pierre de Pirate", "Amuleto Pirata"}, + Text{ "Cave Charm", "Charme de grotte", "Amuleto de la cueva" }, + Text{ "Stone of Agahnim", "Fragment d'Agahnim", "Piedra de Agahnim" }, + Text{ "Shard of Agony", "Fragment de Souffrance", "Piedra de la Agonía" }, + Text{ "Pirate's Charm", "Pierre de Pirate", "Amuleto Pirata" }, }; trickNameTable[RG_DINS_FIRE] = { - Text{"Eldin's Fire", "Feu d'Eldin", "Fuego de Eldin"}, - Text{"Din's Blaze", "Flamme de Din", "Poder de Din"}, - Text{"Magic Lantern", "Lanterne Magique", "Linterna mágica"}, - Text{"Ether Medallion", "Médaillon d'Éther", "Medallón de Tesoro"}, - Text{"Bombos Medallion", "Médaillon des Flammes", "Medallón del Temblor"}, + Text{ "Eldin's Fire", "Feu d'Eldin", "Fuego de Eldin" }, + Text{ "Din's Blaze", "Flamme de Din", "Poder de Din" }, + Text{ "Magic Lantern", "Lanterne Magique", "Linterna mágica" }, + Text{ "Ether Medallion", "Médaillon d'Éther", "Medallón de Tesoro" }, + Text{ "Bombos Medallion", "Médaillon des Flammes", "Medallón del Temblor" }, }; trickNameTable[RG_FARORES_WIND] = { - Text{"Faron's Wind", "Vent de Firone", "Viento de Farone"}, - Text{"Farore's Windfall", "Zéphyr de Farore", "Valor de Farore"}, - Text{"Tingle Air", "Tingle Air", "Tingle de aire"}, - Text{"Travel Medallion", "Amulette de téléportation", "Medallón Maligno"}, - Text{"Irene's Taxi", "Le taxi d'Aëline", "El taxi de Airín"}, + Text{ "Faron's Wind", "Vent de Firone", "Viento de Farone" }, + Text{ "Farore's Windfall", "Zéphyr de Farore", "Valor de Farore" }, + Text{ "Tingle Air", "Tingle Air", "Tingle de aire" }, + Text{ "Travel Medallion", "Amulette de téléportation", "Medallón Maligno" }, + Text{ "Irene's Taxi", "Le taxi d'Aëline", "El taxi de Airín" }, }; trickNameTable[RG_NAYRUS_LOVE] = { - Text{"Lanayru's Love", "Amour de Lanelle", "Amor de Lanayru"}, - Text{"Nayru's Passion", "Passion de Nayru", "Sabiduría de Nayru"}, - Text{"Tingle Shield", "Bouclier Tingle", "Escudo de hormigueo"}, - Text{"Shield Spell", "Bouclier Magique", "Hechizo de Protección"}, - Text{"Magic Armor", "Armure Magique", "Armadura mágica"}, + Text{ "Lanayru's Love", "Amour de Lanelle", "Amor de Lanayru" }, + Text{ "Nayru's Passion", "Passion de Nayru", "Sabiduría de Nayru" }, + Text{ "Tingle Shield", "Bouclier Tingle", "Escudo de hormigueo" }, + Text{ "Shield Spell", "Bouclier Magique", "Hechizo de Protección" }, + Text{ "Magic Armor", "Armure Magique", "Armadura mágica" }, }; trickNameTable[RG_FIRE_ARROWS] = { - Text{"Fire Rod", "Baguette de feu", "Cetro de fuego"}, - Text{"Bomb Arrow", "Flèche-Bombe", "Flecha bomba"}, - Text{"Red Candle", "Bougie Rouge", "Vela roja"}, + Text{ "Fire Rod", "Baguette de feu", "Cetro de fuego" }, + Text{ "Bomb Arrow", "Flèche-Bombe", "Flecha bomba" }, + Text{ "Red Candle", "Bougie Rouge", "Vela roja" }, }; trickNameTable[RG_ICE_ARROWS] = { - Text{"Ice Rod", "Baguette des Glaces", "Cetro de Hielo"}, - Text{"Ancient Arrow", "Flèche Archéonique", "Flecha ancestral"}, - Text{"Ice Trap Arrow", "Flèche de Piège de Glace", "Cetro de hielo"}, + Text{ "Ice Rod", "Baguette des Glaces", "Cetro de Hielo" }, + Text{ "Ancient Arrow", "Flèche Archéonique", "Flecha ancestral" }, + Text{ "Ice Trap Arrow", "Flèche de Piège de Glace", "Cetro de hielo" }, }; trickNameTable[RG_LIGHT_ARROWS] = { - Text{"Wind Arrow", "Flèche de Vent", "Flecha del Viento"}, - Text{"Wand of Gamelon", "Baguette de Gamelon", "Varita de Gamelón"}, - Text{"Shock Arrow", "Flèches Électriques", "Flecha eléctrica"}, - Text{"Silver Arrow", "Flèches d'Argent", "Flecha de plata"}, + Text{ "Wind Arrow", "Flèche de Vent", "Flecha del Viento" }, + Text{ "Wand of Gamelon", "Baguette de Gamelon", "Varita de Gamelón" }, + Text{ "Shock Arrow", "Flèches Électriques", "Flecha eléctrica" }, + Text{ "Silver Arrow", "Flèches d'Argent", "Flecha de plata" }, }; trickNameTable[RG_GERUDO_MEMBERSHIP_CARD] = { - Text{"Desert Title Deed", "Abonnement Gerudo", "Escritura del desierto"}, - Text{"Sickle Moon Flag", "Drapeau du croissant de lune", "Bandera de la Luna Creciente"}, - Text{"Complimentary ID", "Bon de félicitation", "Cupón especial"}, - Text{"Gerudo's Card", "Carte Goron", "Tóken Gerudo"}, - Text{"Gerudo's Membership Card", "Autographe de Nabooru", "Tarjeta Gerudo"}, + Text{ "Desert Title Deed", "Abonnement Gerudo", "Escritura del desierto" }, + Text{ "Sickle Moon Flag", "Drapeau du croissant de lune", "Bandera de la Luna Creciente" }, + Text{ "Complimentary ID", "Bon de félicitation", "Cupón especial" }, + Text{ "Gerudo's Card", "Carte Goron", "Tóken Gerudo" }, + Text{ "Gerudo's Membership Card", "Autographe de Nabooru", "Tarjeta Gerudo" }, }; trickNameTable[RG_MAGIC_BEAN_PACK] = { - Text{"Funky Bean Pack", "Paquet de Fèves Magiques", "Lote de frijoles mágicos"}, - Text{"Grapple Berries", "Baies de grappin", "Bayas de garfio"}, - Text{"Crenel Bean Pack", "Paquet de Haricots Gonggle", "Lote de alubias mágicas"}, - Text{"Mystical Seed Pack", "Pack de graines mystiques", "Paquete de semillas místicas"}, + Text{ "Funky Bean Pack", "Paquet de Fèves Magiques", "Lote de frijoles mágicos" }, + Text{ "Grapple Berries", "Baies de grappin", "Bayas de garfio" }, + Text{ "Crenel Bean Pack", "Paquet de Haricots Gonggle", "Lote de alubias mágicas" }, + Text{ "Mystical Seed Pack", "Pack de graines mystiques", "Paquete de semillas místicas" }, }; trickNameTable[RG_DOUBLE_DEFENSE] = { - Text{"Diamond Hearts", "Coeurs de Diamant", "Contenedor de diamante"}, - Text{"Double Damage", "Double Souffrance", "Doble daño receptivo"}, - Text{"Quadruple Defence", "Quadruple Défence", "Defensa cuádruple"}, + Text{ "Diamond Hearts", "Coeurs de Diamant", "Contenedor de diamante" }, + Text{ "Double Damage", "Double Souffrance", "Doble daño receptivo" }, + Text{ "Quadruple Defence", "Quadruple Défence", "Defensa cuádruple" }, }; trickNameTable[RG_POCKET_EGG] = { - Text{"Arpagos Egg", "Oeuf d'Arpagos", "Huevo de Arpagos"}, - Text{"Lon Lon Egg", "oeuf Lon Lon", "Huevo Lon Lon"}, - Text{"Zora Egg", "oeuf Zora", "Huevo del Pez Viento"}, + Text{ "Arpagos Egg", "Oeuf d'Arpagos", "Huevo de Arpagos" }, + Text{ "Lon Lon Egg", "oeuf Lon Lon", "Huevo Lon Lon" }, + Text{ "Zora Egg", "oeuf Zora", "Huevo del Pez Viento" }, }; trickNameTable[RG_POCKET_EGG] = { - Text{"D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Alarma emplumada portátil"}, - Text{"Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko"}, - Text{"Hatched Cucco", "Cocotte éclose", "Pollo de bolsillo"}, + Text{ "D.I.Y. Alarm Clock", "Réveille-matin improvisé", "Alarma emplumada portátil" }, + Text{ "Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko" }, + Text{ "Hatched Cucco", "Cocotte éclose", "Pollo de bolsillo" }, }; trickNameTable[RG_COJIRO] = { - Text{"Blucco", "Chair-Qui-Poule", "Cucazul"}, - Text{"Piyoko", "Piyoko", "Piyoko"}, - Text{"Dark Cucco", "Cocotte Sombre", "Cucco oscuro"}, - Text{"Grog's Cucco", "Cocotte de Grog", "Cuco de Grog"}, + Text{ "Blucco", "Chair-Qui-Poule", "Cucazul" }, + Text{ "Piyoko", "Piyoko", "Piyoko" }, + Text{ "Dark Cucco", "Cocotte Sombre", "Cucco oscuro" }, + Text{ "Grog's Cucco", "Cocotte de Grog", "Cuco de Grog" }, }; trickNameTable[RG_ODD_MUSHROOM] = { - Text{"Magic Mushroom", "Champignon magique", "Champiñón mágico"}, - Text{"Endura Shroom", "Champi Vigueur", "Champiñón del bosque"}, - Text{"Sleepy Toadstool", "Crapaud Fatigué", "Seta durmiente"}, - Text{"Mushroom", "Champignon", "Seta"}, + Text{ "Magic Mushroom", "Champignon magique", "Champiñón mágico" }, + Text{ "Endura Shroom", "Champi Vigueur", "Champiñón del bosque" }, + Text{ "Sleepy Toadstool", "Crapaud Fatigué", "Seta durmiente" }, + Text{ "Mushroom", "Champignon", "Seta" }, }; trickNameTable[RG_ODD_POTION] = { - Text{"Odd Medicine", "Élixir suspect", "Poción rara"}, - Text{"Granny's Poultice", "Mixture de Granny", "Medicina de la abuela"}, - Text{"Mushroom Poultice", "Mixture de champignon", "Medicina de champiñones"}, - Text{"Secret Medicine", "Médicament", "Pócima secreta"}, - Text{"Mushroom Spores", "Spores de Champignons", "Esporas de hongos"}, - Text{"Hanyu Spore", "Hanyu Spore", "Espora Hanyu"}, + Text{ "Odd Medicine", "Élixir suspect", "Poción rara" }, + Text{ "Granny's Poultice", "Mixture de Granny", "Medicina de la abuela" }, + Text{ "Mushroom Poultice", "Mixture de champignon", "Medicina de champiñones" }, + Text{ "Secret Medicine", "Médicament", "Pócima secreta" }, + Text{ "Mushroom Spores", "Spores de Champignons", "Esporas de hongos" }, + Text{ "Hanyu Spore", "Hanyu Spore", "Espora Hanyu" }, }; trickNameTable[RG_POACHERS_SAW] = { - Text{"Carpenter's Saw", "Scie du charpentier", "Sierra del carpintero"}, - Text{"Poacher's Sword", "Hache du chasseur", "Espada del capataz"}, - Text{"Ancient Bladesaw", "Longue Épée Archéonique", "Mandoble ancestral"}, - Text{"Woodcutter's Axe", "Hache du Bûcheron", "Hacha de leñador"}, - Text{"Grog's Saw", "Scie de Grog", "Sierra del Cazador Furtivo"}, + Text{ "Carpenter's Saw", "Scie du charpentier", "Sierra del carpintero" }, + Text{ "Poacher's Sword", "Hache du chasseur", "Espada del capataz" }, + Text{ "Ancient Bladesaw", "Longue Épée Archéonique", "Mandoble ancestral" }, + Text{ "Woodcutter's Axe", "Hache du Bûcheron", "Hacha de leñador" }, + Text{ "Grog's Saw", "Scie de Grog", "Sierra del Cazador Furtivo" }, }; trickNameTable[RG_BROKEN_SWORD] = { - Text{"Broken Biggoron's Sword", "Épée brisée de Grogoron", "Espada de Biggoron rota"}, - Text{"Broken Giant's Knife", "Lame des Géants brisée", "Daga gigante rota"}, - Text{"Broken Noble Sword", "Épée noble brisée", "Espada noble rota"}, - Text{"Broken Picori Blade", "Épée Minish brisée", "Espada minish rota"}, - Text{"Decayed Master Sword", "Épée de légende pourrie", "Espada decadente de leyenda"}, + Text{ "Broken Biggoron's Sword", "Épée brisée de Grogoron", "Espada de Biggoron rota" }, + Text{ "Broken Giant's Knife", "Lame des Géants brisée", "Daga gigante rota" }, + Text{ "Broken Noble Sword", "Épée noble brisée", "Espada noble rota" }, + Text{ "Broken Picori Blade", "Épée Minish brisée", "Espada minish rota" }, + Text{ "Decayed Master Sword", "Épée de légende pourrie", "Espada decadente de leyenda" }, }; trickNameTable[RG_PRESCRIPTION] = { - Text{"Biggoron's Prescription", "Ordonnance de Grogoron", "Receta de Biggoron"}, - Text{"Eyedrop Prescription", "Ordonnance de gouttes", "Receta ocular"}, - Text{"Urgent Prescription", "Ordonnance urgente", "Prescripción"}, - Text{"Swordsman's Scroll", "Précis d'escrime", "Esgrimidorium"}, - Text{"Portrait of Oren", "Portrait d'Orlène", "Retrato de Oren"}, - Text{"Letter to King Zora", "Lettre au roi Zora", "Carta al Rey Zora"}, + Text{ "Biggoron's Prescription", "Ordonnance de Grogoron", "Receta de Biggoron" }, + Text{ "Eyedrop Prescription", "Ordonnance de gouttes", "Receta ocular" }, + Text{ "Urgent Prescription", "Ordonnance urgente", "Prescripción" }, + Text{ "Swordsman's Scroll", "Précis d'escrime", "Esgrimidorium" }, + Text{ "Portrait of Oren", "Portrait d'Orlène", "Retrato de Oren" }, + Text{ "Letter to King Zora", "Lettre au roi Zora", "Carta al Rey Zora" }, }; trickNameTable[RG_EYEBALL_FROG] = { - Text{"Don Gero", "Don Gero", "Don Gero"}, - Text{"Hot-Footed Frog", "Grenouille à pieds chauds", "Rana de patas calientes"}, - Text{"Lost Swordsmith", "Forgeron perdu", "Espadachín perdido"}, - Text{"Eyedrop Frog", "Grenouille-qui-louche", "Globo Ocular de Rana"}, + Text{ "Don Gero", "Don Gero", "Don Gero" }, + Text{ "Hot-Footed Frog", "Grenouille à pieds chauds", "Rana de patas calientes" }, + Text{ "Lost Swordsmith", "Forgeron perdu", "Espadachín perdido" }, + Text{ "Eyedrop Frog", "Grenouille-qui-louche", "Globo Ocular de Rana" }, }; trickNameTable[RG_EYEDROPS] = { - Text{"Biggoron's Eyedrops", "Gouttes de Grogoron", "Gotas de Biggoron"}, - Text{"Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Gotas oculares"}, - Text{"Moon's Tear", "Larme de Lune", "Lágrima de Luna"}, - Text{"Engine Grease", "Graisse moteur", "Grasa del motor"}, - Text{"Zora Perfume", "Parfum Zora", "Perfume Zora"}, + Text{ "Biggoron's Eyedrops", "Gouttes de Grogoron", "Gotas de Biggoron" }, + Text{ "Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Gotas oculares" }, + Text{ "Moon's Tear", "Larme de Lune", "Lágrima de Luna" }, + Text{ "Engine Grease", "Graisse moteur", "Grasa del motor" }, + Text{ "Zora Perfume", "Parfum Zora", "Perfume Zora" }, }; trickNameTable[RG_CLAIM_CHECK] = { - Text{"Clay Check", "Certificat Grogoron", "Comprobante de Reclamación"}, - Text{"Ancient Tablet", "Stèle ancienne", "Litografía arcana"}, - Text{"Sheikah Slate", "Tablette Sheikah", "Piedra Sheikah"}, - Text{"Cyclone Slate", "Ardoise des tornades", "Pizarra de los Torbellinos"}, + Text{ "Clay Check", "Certificat Grogoron", "Comprobante de Reclamación" }, + Text{ "Ancient Tablet", "Stèle ancienne", "Litografía arcana" }, + Text{ "Sheikah Slate", "Tablette Sheikah", "Piedra Sheikah" }, + Text{ "Cyclone Slate", "Ardoise des tornades", "Pizarra de los Torbellinos" }, }; trickNameTable[RG_GOLD_SKULLTULA_TOKEN] = { - Text{"Skulltula Token", "Bon de Skulltula dorée", "Símbolo de Skulltula"}, - Text{"Golden Skulltula Spirit", "Pièce de Skulltula dorée", "Tóken de Skulltula Dorada"}, - Text{"Gold Walltula Token", "Jeton de Walltula dorée", "Skulltula dorada"}, - Text{"Maiamai", "Ti'gorneau", "Maimai"}, - Text{"Gratitude Crystal", "Cristal de gratitude", "Gema de gratitud"}, - Text{"Korok Seed", "Noix korogu", "Semilla de kolog"}, + Text{ "Skulltula Token", "Bon de Skulltula dorée", "Símbolo de Skulltula" }, + Text{ "Golden Skulltula Spirit", "Pièce de Skulltula dorée", "Tóken de Skulltula Dorada" }, + Text{ "Gold Walltula Token", "Jeton de Walltula dorée", "Skulltula dorada" }, + Text{ "Maiamai", "Ti'gorneau", "Maimai" }, + Text{ "Gratitude Crystal", "Cristal de gratitude", "Gema de gratitud" }, + Text{ "Korok Seed", "Noix korogu", "Semilla de kolog" }, }; trickNameTable[RG_PROGRESSIVE_HOOKSHOT] = { - Text{"Progressive Grappling Hook", "Lance-chaîne (prog.)", "Garra progresiva"}, - Text{"Progressive Clawshot", "Grappin-griffe (prog.)", "Zarpa progresiva"}, - Text{"Progressive Gripshot", "Grappince (prog.)", "Enganchador progresivo"}, - Text{"Progressive Rope", "Corde (prog.)", "Cuerda progresivo"}, + Text{ "Progressive Grappling Hook", "Lance-chaîne (prog.)", "Garra progresiva" }, + Text{ "Progressive Clawshot", "Grappin-griffe (prog.)", "Zarpa progresiva" }, + Text{ "Progressive Gripshot", "Grappince (prog.)", "Enganchador progresivo" }, + Text{ "Progressive Rope", "Corde (prog.)", "Cuerda progresivo" }, }; trickNameTable[RG_PROGRESSIVE_STRENGTH] = { - Text{"Power Glove", "Gant de Puissance (prog.)", "Guanteletes progresivos"}, - Text{"Power Bracelet", "Bracelet de Force (prog.)", "Brasaletes progresivos"}, - Text{"Magic Bracelet", "Bracelet Magique (prog.)", "Manoplas progresivas"}, + Text{ "Power Glove", "Gant de Puissance (prog.)", "Guanteletes progresivos" }, + Text{ "Power Bracelet", "Bracelet de Force (prog.)", "Brasaletes progresivos" }, + Text{ "Magic Bracelet", "Bracelet Magique (prog.)", "Manoplas progresivas" }, }; trickNameTable[RG_PROGRESSIVE_BOMB_BAG] = { - Text{"Progressive Bomb Capacity", "Capacité de bombes (prog.)", "Mayor capacidad de bombas"}, - Text{"Progressive Bomb Pack", "Paquet de bombes (prog.)", "Zurrón de bombas progresivo"}, - Text{"Progressive Bomb Box", "Boîte à bombes (prog.)", "Bolsa de bombas progresiva"}, - Text{"Progressive Blast Mask", "Masque d'Explosion (prog.)", "Máscara explosiva progresiva"}, - Text{"Progressive Powder Kegs", "Baril de Poudre (prog.)", "Barril de polvo progresivo"}, - Text{"Progressive Remote Bombs", "Bombes à distance (prog.)", "Bombas remotas progresivas"}, + Text{ "Progressive Bomb Capacity", "Capacité de bombes (prog.)", "Mayor capacidad de bombas" }, + Text{ "Progressive Bomb Pack", "Paquet de bombes (prog.)", "Zurrón de bombas progresivo" }, + Text{ "Progressive Bomb Box", "Boîte à bombes (prog.)", "Bolsa de bombas progresiva" }, + Text{ "Progressive Blast Mask", "Masque d'Explosion (prog.)", "Máscara explosiva progresiva" }, + Text{ "Progressive Powder Kegs", "Baril de Poudre (prog.)", "Barril de polvo progresivo" }, + Text{ "Progressive Remote Bombs", "Bombes à distance (prog.)", "Bombas remotas progresivas" }, }; trickNameTable[RG_PROGRESSIVE_BOW] = { - Text{"Progressive Arrow Capacity", "Capacité de flèches (prog.)", "Mayor capacidad de flechas"}, - Text{"Progressive Hero's Bow", "Arc du héros (prog.)", "Arco del héroe progresivo"}, - Text{"Progressive Arrow Holder", "Arbalète (prog.)", "Ballesta progresiva"}, - Text{"Progressive Crossbow", "Arbalète (prog.)", "Ballesta progresiva"}, - Text{"Progressive Sacred Bow", "Arc sacré (prog)", "Arco Sagrado Progresivo"}, - Text{"Progressive Lynel Bow", "Arc de Lynel (prog.)", "Arco de centaleón Progresivo"}, + Text{ "Progressive Arrow Capacity", "Capacité de flèches (prog.)", "Mayor capacidad de flechas" }, + Text{ "Progressive Hero's Bow", "Arc du héros (prog.)", "Arco del héroe progresivo" }, + Text{ "Progressive Arrow Holder", "Arbalète (prog.)", "Ballesta progresiva" }, + Text{ "Progressive Crossbow", "Arbalète (prog.)", "Ballesta progresiva" }, + Text{ "Progressive Sacred Bow", "Arc sacré (prog)", "Arco Sagrado Progresivo" }, + Text{ "Progressive Lynel Bow", "Arc de Lynel (prog.)", "Arco de centaleón Progresivo" }, }; trickNameTable[RG_PROGRESSIVE_SLINGSHOT] = { - Text{"Progressive Seed Capacity", "Capacité de graines (prog.)", "Mayor capacidad de semillas"}, - Text{"Progressive Catapult", "Catapulte (prog.)", "Catapulta progresiva"}, - Text{"Progressive Scattershot", "Lance-Pierre rafale (prog.)", "Resortera múltiple progresiva"}, - Text{"Progressive Seed Launcher", "Lanceur de semences (prog.)", "Lanzador de semillas progresivo"}, - Text{"Progressive Seed Satchel", "Sac de graines (prog.)", "Bolsa de semillas progresiva"}, + Text{ "Progressive Seed Capacity", "Capacité de graines (prog.)", "Mayor capacidad de semillas" }, + Text{ "Progressive Catapult", "Catapulte (prog.)", "Catapulta progresiva" }, + Text{ "Progressive Scattershot", "Lance-Pierre rafale (prog.)", "Resortera múltiple progresiva" }, + Text{ "Progressive Seed Launcher", "Lanceur de semences (prog.)", "Lanzador de semillas progresivo" }, + Text{ "Progressive Seed Satchel", "Sac de graines (prog.)", "Bolsa de semillas progresiva" }, }; trickNameTable[RG_PROGRESSIVE_WALLET] = { - Text{"Progressive Rupee Capacity", "Capacité de rubis (prog.)", "Mayor capacidad de rupias"}, - Text{"Progressive Purse", "Sacoche (prog.)", "Cartera de rupias progresiva"}, - Text{"Progressive Rupee Bag", "Sac à rubis (prog.)", "Zurrón de rupias progresivo"}, - Text{"Progressive Rupoor Capacity", "Capacité de Roupir (prog.)", "Capacidad progresiva Rupobre"}, - Text{"Progressive Spoils Bag", "Sac à Butin (prog.)", "Bolsa de trofeos progresiva"}, - Text{"Progressive Ruby Bag", "Capacité du sac Ruby (prog.)", "Bolso Ruby progresivo"}, + Text{ "Progressive Rupee Capacity", "Capacité de rubis (prog.)", "Mayor capacidad de rupias" }, + Text{ "Progressive Purse", "Sacoche (prog.)", "Cartera de rupias progresiva" }, + Text{ "Progressive Rupee Bag", "Sac à rubis (prog.)", "Zurrón de rupias progresivo" }, + Text{ "Progressive Rupoor Capacity", "Capacité de Roupir (prog.)", "Capacidad progresiva Rupobre" }, + Text{ "Progressive Spoils Bag", "Sac à Butin (prog.)", "Bolsa de trofeos progresiva" }, + Text{ "Progressive Ruby Bag", "Capacité du sac Ruby (prog.)", "Bolso Ruby progresivo" }, }; trickNameTable[RG_PROGRESSIVE_SCALE] = { - Text{"Progressive Flippers", "Palmes de Zora (prog.)", "Aletas de zora progresiva"}, - Text{"Progressive Dragon's Scale", "Écaille du dragon d'eau (prog.)", "Escama dragón acuático progresiva"}, - Text{"Progressive Diving Ability", "Plongée (prog.)", "Buceo progresivo"}, - Text{"Progressive Pearl", "Perle (prog.)", "Perla progresiva"}, - Text{"Progressive Scute", "Bulle (prog.)", "Fragmento Zora progresivo"}, + Text{ "Progressive Flippers", "Palmes de Zora (prog.)", "Aletas de zora progresiva" }, + Text{ "Progressive Dragon's Scale", "Écaille du dragon d'eau (prog.)", "Escama dragón acuático progresiva" }, + Text{ "Progressive Diving Ability", "Plongée (prog.)", "Buceo progresivo" }, + Text{ "Progressive Pearl", "Perle (prog.)", "Perla progresiva" }, + Text{ "Progressive Scute", "Bulle (prog.)", "Fragmento Zora progresivo" }, }; trickNameTable[RG_PROGRESSIVE_NUT_UPGRADE] = { - Text{"Progressive Nut Pack", "Paquet de noix (prog.)", "Mayor capacidad de semillas"}, - Text{"Progressive Bait Bag", "Sac à Appâts (prog.)", "Bolsa de cebo progresiva"}, - Text{"Progressive Pear Capacity", "Capacité de poire (prog.)", "Capacidad progresiva de pera"}, - Text{"Progressive Nut Bag", "Sac de noix (prog.)", "Bolsa de nueces progresiva"}, - Text{"Progressive Husk Capacity", "Capacité de noisettes (prog.)", "Mayor capacidad de castañas"}, + Text{ "Progressive Nut Pack", "Paquet de noix (prog.)", "Mayor capacidad de semillas" }, + Text{ "Progressive Bait Bag", "Sac à Appâts (prog.)", "Bolsa de cebo progresiva" }, + Text{ "Progressive Pear Capacity", "Capacité de poire (prog.)", "Capacidad progresiva de pera" }, + Text{ "Progressive Nut Bag", "Sac de noix (prog.)", "Bolsa de nueces progresiva" }, + Text{ "Progressive Husk Capacity", "Capacité de noisettes (prog.)", "Mayor capacidad de castañas" }, }; trickNameTable[RG_PROGRESSIVE_STICK_UPGRADE] = { - Text{"Progressive Stick Bag", "Sac de bâtons (prog.)", "Mayor capacidad de ramas deku"}, - Text{"Progressive Stick Pack", "Paquet de bâtons Mojo (prog.)", "Mayor capacidad de bastones"}, - Text{"Progressive Branch Capacity", "Capacité de la succursale (prog.)", "Capacidad progresiva de la sucursal"}, - Text{"Progressive Rod Capacity", "Capacité de tiges (prog.)", "Mayor capacidad de cetros deku"}, + Text{ "Progressive Stick Bag", "Sac de bâtons (prog.)", "Mayor capacidad de ramas deku" }, + Text{ "Progressive Stick Pack", "Paquet de bâtons Mojo (prog.)", "Mayor capacidad de bastones" }, + Text{ "Progressive Branch Capacity", "Capacité de la succursale (prog.)", + "Capacidad progresiva de la sucursal" }, + Text{ "Progressive Rod Capacity", "Capacité de tiges (prog.)", "Mayor capacidad de cetros deku" }, }; trickNameTable[RG_PROGRESSIVE_BOMBCHUS] = { - Text{"Progressive Bomblings", "Bombinsectes (prog.)", "Bombinsectos progresivos"}, - Text{"Progressive Sentrobe Bombs", "Bombe de Sphérodrone (prog.)", "Bomba de helicobot progresivo"}, - Text{"Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Soldado bomba progresivo"}, - Text{"Progressive Missiles", "Missiles (prog.)", "Misiles progresivos"}, - Text{"Progressive Bombchu Bag", "Sac à Bombchu (prog.)", "Bombachus progresivos"}, + Text{ "Progressive Bomblings", "Bombinsectes (prog.)", "Bombinsectos progresivos" }, + Text{ "Progressive Sentrobe Bombs", "Bombe de Sphérodrone (prog.)", "Bomba de helicobot progresivo" }, + Text{ "Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Soldado bomba progresivo" }, + Text{ "Progressive Missiles", "Missiles (prog.)", "Misiles progresivos" }, + Text{ "Progressive Bombchu Bag", "Sac à Bombchu (prog.)", "Bombachus progresivos" }, }; trickNameTable[RG_PROGRESSIVE_MAGIC_METER] = { - Text{"Progressive Stamina Meter", "Jauge d'endurance (prog.)", "Medidor de vigor progresivo"}, - Text{"Progressive Energy Gauge", "Jauge d'énergie (prog.)", "Medidor de energía progresivo"}, - Text{"Progressive Magic Powder", "Poudre magique (prog.)", "Medidor de carga progresivo"}, + Text{ "Progressive Stamina Meter", "Jauge d'endurance (prog.)", "Medidor de vigor progresivo" }, + Text{ "Progressive Energy Gauge", "Jauge d'énergie (prog.)", "Medidor de energía progresivo" }, + Text{ "Progressive Magic Powder", "Poudre magique (prog.)", "Medidor de carga progresivo" }, }; trickNameTable[RG_PROGRESSIVE_OCARINA] = { - Text{"Progressive Memento", "Souvenir (prog.)", "Silbato progresivo"}, - Text{"Progressive Whistle", "Siffler (prog.)", "Silbido progresivo"}, - Text{"Progressive Flute", "Flûte (prog.)", "Flauta progresiva"}, - Text{"Progressive Recorder", "Harmonica (prog.)", "Armónica progresiva"}, + Text{ "Progressive Memento", "Souvenir (prog.)", "Silbato progresivo" }, + Text{ "Progressive Whistle", "Siffler (prog.)", "Silbido progresivo" }, + Text{ "Progressive Flute", "Flûte (prog.)", "Flauta progresiva" }, + Text{ "Progressive Recorder", "Harmonica (prog.)", "Armónica progresiva" }, }; trickNameTable[RG_PROGRESSIVE_GORONSWORD] = { - Text{"Progressive Titan Blade", "Lame des Titans (prog.)", "Hoja del Titán progresiva"}, - Text{"Progressive Goron Knife", "Lame Goron (prog.)", "Daga Goron progresiva"}, - Text{"Progressive Giant Sword", "Épée géante (prog.)", "Espada gigante progresiva"}, - Text{"Progressive Darknut Sword", "Épée de Darknut (prog.)", "Espada Darknut progresiva"}, - Text{"Progressive Power Sword", "Épée de Puissance (prog.)", "Espada de poder progresiva"}, - Text{"Progressive Big Stabby", "Gros coup de poignard (prog.)", "Gran puñalada progresiva"}, + Text{ "Progressive Titan Blade", "Lame des Titans (prog.)", "Hoja del Titán progresiva" }, + Text{ "Progressive Goron Knife", "Lame Goron (prog.)", "Daga Goron progresiva" }, + Text{ "Progressive Giant Sword", "Épée géante (prog.)", "Espada gigante progresiva" }, + Text{ "Progressive Darknut Sword", "Épée de Darknut (prog.)", "Espada Darknut progresiva" }, + Text{ "Progressive Power Sword", "Épée de Puissance (prog.)", "Espada de poder progresiva" }, + Text{ "Progressive Big Stabby", "Gros coup de poignard (prog.)", "Gran puñalada progresiva" }, }; trickNameTable[RG_EMPTY_BOTTLE] = { - Text{"Empty Canteen", "Cantine vide", "cantimplora vacía"}, - Text{"Vial of Winds", "Fiole de vents", "Vial de Vientos"}, - Text{"Tingle Bottle", "Flacon de Tingle", "Botella de Tingle"}, - Text{"Magic Bottle", "Flacon magique", "Frasco feérico"}, - Text{"Glass Bottle", "Flacon de verre", "Botella de cristal"}, - Text{"Bottle with Water", "Flacon d'eau", "Botella Tingle"}, + Text{ "Empty Canteen", "Cantine vide", "cantimplora vacía" }, + Text{ "Vial of Winds", "Fiole de vents", "Vial de Vientos" }, + Text{ "Tingle Bottle", "Flacon de Tingle", "Botella de Tingle" }, + Text{ "Magic Bottle", "Flacon magique", "Frasco feérico" }, + Text{ "Glass Bottle", "Flacon de verre", "Botella de cristal" }, + Text{ "Bottle with Water", "Flacon d'eau", "Botella Tingle" }, }; trickNameTable[RG_BOTTLE_WITH_MILK] = { - Text{"Bottle with Chateau Romani", "Flacon de cuvée Romani", "Botella de Reserva Romani"}, - Text{"Bottle with Premium Milk", "Flacon avec lait de qualité supérieure", "Biberón con leche Premium"}, - Text{"Bottle with Mystery Milk", "Flacon de lait grand cru", "Botella de leche extra"}, - Text{"Bottle with Fresh Milk", "Flacon de lait frais", "Botella de leche fresca"},}; + Text{ "Bottle with Chateau Romani", "Flacon de cuvée Romani", "Botella de Reserva Romani" }, + Text{ "Bottle with Premium Milk", "Flacon avec lait de qualité supérieure", "Biberón con leche Premium" }, + Text{ "Bottle with Mystery Milk", "Flacon de lait grand cru", "Botella de leche extra" }, + Text{ "Bottle with Fresh Milk", "Flacon de lait frais", "Botella de leche fresca" }, + }; trickNameTable[RG_BOTTLE_WITH_RED_POTION] = { - Text{"Bottle with Red Chu Jelly", "Flacon de gelée Chuchu rouge", "Jugo de Chuchu Rojo"}, - Text{"Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", "Botella de poción de Hibisco"}, - Text{"Bottle with Medicine of Life", "Flacon d'élixir rouge", "Botella de medicina de la vida"}, - Text{"Bottle with Heart Potion", "Flacon de potion de soin", "Botella de poción de salud"}, + Text{ "Bottle with Red Chu Jelly", "Flacon de gelée Chuchu rouge", "Jugo de Chuchu Rojo" }, + Text{ "Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", "Botella de poción de Hibisco" }, + Text{ "Bottle with Medicine of Life", "Flacon d'élixir rouge", "Botella de medicina de la vida" }, + Text{ "Bottle with Heart Potion", "Flacon de potion de soin", "Botella de poción de salud" }, }; trickNameTable[RG_BOTTLE_WITH_GREEN_POTION] = { - Text{"Bottle with Green Chu Jelly", "Flacon de gelée Chuchu verte", "Jugo de Chuchu Verde"}, - Text{"Bottle with Lamp Oil", "Flacon de Huile à lanterne", "Botella de Aceite de candil "}, - Text{"Bottle with Medicine of Magic", "Flacon d'élixir vert", "Botella de medicina mágica"}, - Text{"Bottle with Stamina Potion", "Flacon d'Endurol", "Botella de elixir vigorizante"}, + Text{ "Bottle with Green Chu Jelly", "Flacon de gelée Chuchu verte", "Jugo de Chuchu Verde" }, + Text{ "Bottle with Lamp Oil", "Flacon de Huile à lanterne", "Botella de Aceite de candil " }, + Text{ "Bottle with Medicine of Magic", "Flacon d'élixir vert", "Botella de medicina mágica" }, + Text{ "Bottle with Stamina Potion", "Flacon d'Endurol", "Botella de elixir vigorizante" }, }; trickNameTable[RG_BOTTLE_WITH_BLUE_POTION] = { - Text{"Bottle with Blue Chu Jelly", "Flacon de gelée Chuchu bleue", "Jugo de Chuchu Azul"}, - Text{"Bottle with Water of Life", "Flacon d'élixir bleu", "Botella de agua de la vida"}, - Text{"Bottle with Air Potion", "Flacon de potion d'oxygène", "Botella de oxígeno"}, + Text{ "Bottle with Blue Chu Jelly", "Flacon de gelée Chuchu bleue", "Jugo de Chuchu Azul" }, + Text{ "Bottle with Water of Life", "Flacon d'élixir bleu", "Botella de agua de la vida" }, + Text{ "Bottle with Air Potion", "Flacon de potion d'oxygène", "Botella de oxígeno" }, }; trickNameTable[RG_BOTTLE_WITH_FAIRY] = { - Text{"Bottle with Forest Firefly", "Flacon avec une luciole", "Luciérnaga del bosque"}, - Text{"Bottle with Deku Princess", "Flacon avec Deku Princess", "Botella con Deku Princess"}, - Text{"Bottle with Stray Fairy", "Flacon avec une fée perdue", "Hada perdida en una botella"}, + Text{ "Bottle with Forest Firefly", "Flacon avec une luciole", "Luciérnaga del bosque" }, + Text{ "Bottle with Deku Princess", "Flacon avec Deku Princess", "Botella con Deku Princess" }, + Text{ "Bottle with Stray Fairy", "Flacon avec une fée perdue", "Hada perdida en una botella" }, }; trickNameTable[RG_BOTTLE_WITH_FISH] = { - Text{"Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", "Lord Chapu-Chapu embotellado"}, - Text{"Bottle with Reekfish", "Flacon avec Reekfish", "Reekfish embotellada"}, - Text{"Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", "Locha de Hyrule embotellada"}, - Text{"Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", "Perca de Términa embotellada"}, + Text{ "Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", "Lord Chapu-Chapu embotellado" }, + Text{ "Bottle with Reekfish", "Flacon avec Reekfish", "Reekfish embotellada" }, + Text{ "Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", "Locha de Hyrule embotellada" }, + Text{ "Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", "Perca de Términa embotellada" }, }; trickNameTable[RG_BOTTLE_WITH_BLUE_FIRE] = { - Text{"Bottle with Will-O-Wisp", "Flacon avec feu follet", "Botella de llama azul"}, - Text{"Bottle with Ancient Flame", "Flacon de flamme ancienne", "Botella de fuego ancestral"}, - Text{"Bottle with a Blue Candle", "Flacon avec une bougie bleue", "Botella con una vela azul"}, - Text{"Bottle with Red Ice", "Flacon de Glace Rouge", "Botella de Hielo rojo"}, - Text{"Bottle with Nayru's Flame", "Flacon de flamme de Nayru", "Botella de llamas de Nayru"}, + Text{ "Bottle with Will-O-Wisp", "Flacon avec feu follet", "Botella de llama azul" }, + Text{ "Bottle with Ancient Flame", "Flacon de flamme ancienne", "Botella de fuego ancestral" }, + Text{ "Bottle with a Blue Candle", "Flacon avec une bougie bleue", "Botella con una vela azul" }, + Text{ "Bottle with Red Ice", "Flacon de Glace Rouge", "Botella de Hielo rojo" }, + Text{ "Bottle with Nayru's Flame", "Flacon de flamme de Nayru", "Botella de llamas de Nayru" }, }; trickNameTable[RG_BOTTLE_WITH_BUGS] = { - Text{"Bottle with Baby Tektites", "Flacon de bébé Araknon", "Tektites en una botella"}, - Text{"Bottle with A Beetle", "Flacon avec un scarabée", "Botella con un escarabajo"}, - Text{"Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", "Celestarabajo embotellado"}, - Text{"Bottle with Insects", "Flacon de bibittes", "Saltabosques embotellados"}, - Text{"Bottle with a Golden Bee", "Flacon avec une abeille dorée", "Botella con una abeja dorada"}, + Text{ "Bottle with Baby Tektites", "Flacon de bébé Araknon", "Tektites en una botella" }, + Text{ "Bottle with A Beetle", "Flacon avec un scarabée", "Botella con un escarabajo" }, + Text{ "Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", "Celestarabajo embotellado" }, + Text{ "Bottle with Insects", "Flacon de bibittes", "Saltabosques embotellados" }, + Text{ "Bottle with a Golden Bee", "Flacon avec une abeille dorée", "Botella con una abeja dorada" }, }; trickNameTable[RG_BOTTLE_WITH_POE] = { - Text{"Bottle with Ghini", "Flacon avec Ghini", "Ghini en una botella"}, - Text{"Bottle with Reapling", "Flacon avec Âme Damnée", "Reapling en una botella"}, - Text{"Bottle with Imp Poe", "Flacon avec Spectre", "Espectro en una botella"}, - Text{"Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Whisp en una botella"}, + Text{ "Bottle with Ghini", "Flacon avec Ghini", "Ghini en una botella" }, + Text{ "Bottle with Reapling", "Flacon avec Âme Damnée", "Reapling en una botella" }, + Text{ "Bottle with Imp Poe", "Flacon avec Spectre", "Espectro en una botella" }, + Text{ "Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Whisp en una botella" }, }; trickNameTable[RG_RUTOS_LETTER] = { - Text{"Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", "Carta de Dolores"}, - Text{"Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", "Carta para Kafei"}, - Text{"Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", "Carta náutica"}, + Text{ "Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", "Carta de Dolores" }, + Text{ "Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", "Carta para Kafei" }, + Text{ "Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", "Carta náutica" }, }; trickNameTable[RG_BOTTLE_WITH_BIG_POE] = { - Text{"Bottle with Composer Brother", "Flacon avec un compositeur", "Hermana Poe embotellada"}, - Text{"Bottle with Jalhalla", "Flacon avec Jalhalla", "Yaihalla embotellado"}, - Text{"Bottle with Grim Repoe", "Flacon avec le Faucheur", "Bubble en una botella"}, + Text{ "Bottle with Composer Brother", "Flacon avec un compositeur", "Hermana Poe embotellada" }, + Text{ "Bottle with Jalhalla", "Flacon avec Jalhalla", "Yaihalla embotellado" }, + Text{ "Bottle with Grim Repoe", "Flacon avec le Faucheur", "Bubble en una botella" }, }; trickNameTable[RG_ZELDAS_LULLABY] = { - Text{"Ballad of the Goddess", "Chant de la déesse", "Cántico de la Diosa"}, - Text{"Song of Healing", "Chant de l'apaisement", "Canción de curación"}, - Text{"Song of the Hero", "Chant du héros", "Canción del héroe"}, + Text{ "Ballad of the Goddess", "Chant de la déesse", "Cántico de la Diosa" }, + Text{ "Song of Healing", "Chant de l'apaisement", "Canción de curación" }, + Text{ "Song of the Hero", "Chant du héros", "Canción del héroe" }, }; trickNameTable[RG_EPONAS_SONG] = { - Text{"Song of Birds","Chant des oiseaux","Cantar del ave"}, - Text{"Song of Soaring", "Chant de l'envol", "Canción del viento"}, - Text{"Song of Horse", "Chant du cheval", "Chant du cheval"}, + Text{ "Song of Birds", "Chant des oiseaux", "Cantar del ave" }, + Text{ "Song of Soaring", "Chant de l'envol", "Canción del viento" }, + Text{ "Song of Horse", "Chant du cheval", "Chant du cheval" }, }; trickNameTable[RG_SARIAS_SONG] = { - Text{"Mido's Song", "La chanson de Mido", "La canción de Mido"}, - Text{"Kass' Theme", "Le thème de Kass", "El tema de Kass"}, - Text{"Tune of Echoes", "Chant des Échos ", "Melodía del Eco "}, + Text{ "Mido's Song", "La chanson de Mido", "La canción de Mido" }, + Text{ "Kass' Theme", "Le thème de Kass", "El tema de Kass" }, + Text{ "Tune of Echoes", "Chant des Échos ", "Melodía del Eco " }, }; trickNameTable[RG_SUNS_SONG] = { - Text{"Song of Passing", "Mambo de Manbo", "Melodía del transcurrir"}, - Text{"Command Melody", "Air du marionnettiste", "Cara al Sol"}, - Text{"Moon's Song", "La chanson de Moon", "La canción de la luna"}, + Text{ "Song of Passing", "Mambo de Manbo", "Melodía del transcurrir" }, + Text{ "Command Melody", "Air du marionnettiste", "Cara al Sol" }, + Text{ "Moon's Song", "La chanson de Moon", "La canción de la luna" }, }; trickNameTable[RG_SONG_OF_TIME] = { - Text{"Song of Double Time", "Chant accéléré", "Canción del doble tiempo"}, - Text{"Inverted Song of Time", "Chant du temps inversé", "Canción del tiempo invertida"}, - Text{"Tune of Ages", "Chant du Temps", "Melodía del Tiempo"}, + Text{ "Song of Double Time", "Chant accéléré", "Canción del doble tiempo" }, + Text{ "Inverted Song of Time", "Chant du temps inversé", "Canción del tiempo invertida" }, + Text{ "Tune of Ages", "Chant du Temps", "Melodía del Tiempo" }, }; trickNameTable[RG_SONG_OF_STORMS] = { - Text{"Ballad of Gales", "Requiem de la tornade", "Melodía del Tornado"}, - Text{"Frog's Song of Soul", "Rap des grenouilles", "Canción del alma de la rana"}, - Text{"Wind's Requiem", "Mélodie du vent", "Melodía del Viento"}, + Text{ "Ballad of Gales", "Requiem de la tornade", "Melodía del Tornado" }, + Text{ "Frog's Song of Soul", "Rap des grenouilles", "Canción del alma de la rana" }, + Text{ "Wind's Requiem", "Mélodie du vent", "Melodía del Viento" }, }; trickNameTable[RG_MINUET_OF_FOREST] = { - Text{"Saria's Karaoke", "Karaoké de Saria", "Dueto del bosque"}, - Text{"Sonata of Awakening", "Sonate de l'éveil", "Sonata del despertar"}, - Text{"Wind God's Aria", "Hymne du dieu du vent", "Melodía del Espíritu del Viento"}, + Text{ "Saria's Karaoke", "Karaoké de Saria", "Dueto del bosque" }, + Text{ "Sonata of Awakening", "Sonate de l'éveil", "Sonata del despertar" }, + Text{ "Wind God's Aria", "Hymne du dieu du vent", "Melodía del Espíritu del Viento" }, }; trickNameTable[RG_BOLERO_OF_FIRE] = { - Text{"Darunia's Tango", "Tango de Darunia", "Coro del fuego"}, - Text{"Tune of Currents", "Chants des Flux", "Melodía de las Corrientes"}, - Text{"Goron Lullaby", "Berceuse des Gorons", "Nana goron"}, + Text{ "Darunia's Tango", "Tango de Darunia", "Coro del fuego" }, + Text{ "Tune of Currents", "Chants des Flux", "Melodía de las Corrientes" }, + Text{ "Goron Lullaby", "Berceuse des Gorons", "Nana goron" }, }; trickNameTable[RG_SERENADE_OF_WATER] = { - Text{"Ruto's Blues", "Blues de Ruto", "Sonata del agua"}, - Text{"New Wave Bossa Nova", "Bossa-nova des flots", "Bossanova de las olas"}, - Text{"Manbo's Mambo", "Mambo de Manbo", "Mambo de Manbo"}, + Text{ "Ruto's Blues", "Blues de Ruto", "Sonata del agua" }, + Text{ "New Wave Bossa Nova", "Bossa-nova des flots", "Bossanova de las olas" }, + Text{ "Manbo's Mambo", "Mambo de Manbo", "Mambo de Manbo" }, }; trickNameTable[RG_REQUIEM_OF_SPIRIT] = { - Text{"Nabooru's Reggae", "Reggae de Nabooru", "Reggae del espíritu"}, - Text{"Elegy of Emptiness", "Hymne du vide", "Elegía al vacío"}, - Text{"Earth God's Lyric", "Hymne du dieu de la terre", "Melodía del Espíritu de la Tierra"}, + Text{ "Nabooru's Reggae", "Reggae de Nabooru", "Reggae del espíritu" }, + Text{ "Elegy of Emptiness", "Hymne du vide", "Elegía al vacío" }, + Text{ "Earth God's Lyric", "Hymne du dieu de la terre", "Melodía del Espíritu de la Tierra" }, }; trickNameTable[RG_NOCTURNE_OF_SHADOW] = { - Text{"Impa's Death Metal", "Death métal d'Impa", "Diurno de la sombra"}, - Text{"Oath to Order", "Ode de l'appel", "Oda al orden"}, - Text{"Song of Discovery", "Chant des secrets", "Canto revelador"}, + Text{ "Impa's Death Metal", "Death métal d'Impa", "Diurno de la sombra" }, + Text{ "Oath to Order", "Ode de l'appel", "Oda al orden" }, + Text{ "Song of Discovery", "Chant des secrets", "Canto revelador" }, }; trickNameTable[RG_PRELUDE_OF_LIGHT] = { - Text{"Rauru's Sing-Along", "Chansonnette de Rauru", "Predulio de luz"}, - Text{"Ballad of the Wind Fish", "Ballade sur Poisson-Rêve", "Balada del Piez Viento"}, - Text{"Song of Light", "Chant de la lumière", "Sonidos de la luz"}, + Text{ "Rauru's Sing-Along", "Chansonnette de Rauru", "Predulio de luz" }, + Text{ "Ballad of the Wind Fish", "Ballade sur Poisson-Rêve", "Balada del Piez Viento" }, + Text{ "Song of Light", "Chant de la lumière", "Sonidos de la luz" }, }; trickNameTable[RG_KOKIRI_EMERALD] = { - Text{"Pendant of Courage", "Pendentif du courage", "Colgante del valor"}, - Text{"Farore's Pearl", "Perle de Farore", "Orbe de Farore"}, - Text{"Aquanine", "Smaragdine", "Yerbánida"}, - Text{"Farore's Emerald", "Émeraude de Farore", "Esmeralda de Farore"}, - Text{"Kokiri's Peridot", "Péridot Kokiri", "Ágata de los Kokiri"}, + Text{ "Pendant of Courage", "Pendentif du courage", "Colgante del valor" }, + Text{ "Farore's Pearl", "Perle de Farore", "Orbe de Farore" }, + Text{ "Aquanine", "Smaragdine", "Yerbánida" }, + Text{ "Farore's Emerald", "Émeraude de Farore", "Esmeralda de Farore" }, + Text{ "Kokiri's Peridot", "Péridot Kokiri", "Ágata de los Kokiri" }, }; trickNameTable[RG_GORON_RUBY] = { - Text{"Pendant of Power", "Pendentif de la force", "Colgante del poder"}, - Text{"Din's Pearl", "Perle de Din", "Orbe de Din"}, - Text{"Crimsonine", "Alzanine", "Bermellina"}, - Text{"Din's Ruby", "Rubis de Din", "Rubí de Din"}, - Text{"Goron's Garnet", "Grenat Goron", "Topacio de los Goron"}, + Text{ "Pendant of Power", "Pendentif de la force", "Colgante del poder" }, + Text{ "Din's Pearl", "Perle de Din", "Orbe de Din" }, + Text{ "Crimsonine", "Alzanine", "Bermellina" }, + Text{ "Din's Ruby", "Rubis de Din", "Rubí de Din" }, + Text{ "Goron's Garnet", "Grenat Goron", "Topacio de los Goron" }, }; trickNameTable[RG_ZORA_SAPPHIRE] = { - Text{"Pendant of Wisdom", "Pendentif de la sagesse", "Colgante de la sabiduría"}, - Text{"Nayru's Pearl", "Perle de Nayru", "Orbe de Nayru"}, - Text{"Azurine", "Aquanine", "Azurina"}, - Text{"Nayru's Sapphire", "Saphir de Nayru", "Zafiro de Nayru"}, - Text{"Zora's Aquamarine", "Aquamarine Zora", "Lapislázuli de los Zora"}, + Text{ "Pendant of Wisdom", "Pendentif de la sagesse", "Colgante de la sabiduría" }, + Text{ "Nayru's Pearl", "Perle de Nayru", "Orbe de Nayru" }, + Text{ "Azurine", "Aquanine", "Azurina" }, + Text{ "Nayru's Sapphire", "Saphir de Nayru", "Zafiro de Nayru" }, + Text{ "Zora's Aquamarine", "Aquamarine Zora", "Lapislázuli de los Zora" }, }; trickNameTable[RG_FOREST_MEDALLION] = { - Text{"Wind Medallion", "Médaillon du vent", "Medallón del Viento"}, - Text{"Wind Element", "Elément Vent", "Elemento de aire"}, - Text{"Saria's Medallion", "Médaillon de Saria", "Medallón de Saria"}, - Text{"Sign of Air", "Glyphe de l'air", "Glifo de aire"}, - Text{"Medallion of Forest", "Médaillon du Temple de la Forêt", "Medalla del Bosque"}, + Text{ "Wind Medallion", "Médaillon du vent", "Medallón del Viento" }, + Text{ "Wind Element", "Elément Vent", "Elemento de aire" }, + Text{ "Saria's Medallion", "Médaillon de Saria", "Medallón de Saria" }, + Text{ "Sign of Air", "Glyphe de l'air", "Glifo de aire" }, + Text{ "Medallion of Forest", "Médaillon du Temple de la Forêt", "Medalla del Bosque" }, }; trickNameTable[RG_FIRE_MEDALLION] = { - Text{"Fire Element", "Elément Feu", "Elemento de fuego"}, - Text{"Darunia's Medallion", "Médaillon de Darunia", "Medallón de Darunia"}, - Text{"Sign of Fire", "Glyphe de feu", "Glifo de fuego"}, - Text{"Medallion of Fire", "Médaillon du Temple du Feu", "Medalla del Fuego"}, + Text{ "Fire Element", "Elément Feu", "Elemento de fuego" }, + Text{ "Darunia's Medallion", "Médaillon de Darunia", "Medallón de Darunia" }, + Text{ "Sign of Fire", "Glyphe de feu", "Glifo de fuego" }, + Text{ "Medallion of Fire", "Médaillon du Temple du Feu", "Medalla del Fuego" }, }; trickNameTable[RG_WATER_MEDALLION] = { - Text{"Water Element", "Elément Eau", "Elemento de agua"}, - Text{"Ice Medallion", "Médaillon de glace", "Medallón Helado"}, - Text{"Ruto's Medallion", "Médaillon de Ruto", "Medallón de Ruto"}, - Text{"Sign of Water", "Glyphe de l'eau", "Glifo de agua"}, - Text{"Medallion of Water", "Médaillon du Temple de l'Eau", "Medalla del Agua"}, + Text{ "Water Element", "Elément Eau", "Elemento de agua" }, + Text{ "Ice Medallion", "Médaillon de glace", "Medallón Helado" }, + Text{ "Ruto's Medallion", "Médaillon de Ruto", "Medallón de Ruto" }, + Text{ "Sign of Water", "Glyphe de l'eau", "Glifo de agua" }, + Text{ "Medallion of Water", "Médaillon du Temple de l'Eau", "Medalla del Agua" }, }; trickNameTable[RG_SPIRIT_MEDALLION] = { - Text{"Earth Element", "Elément Terre", "Elemento de tierra"}, - Text{"Nabooru's Medallion", "Médaillon de Nabooru", "Medallón de Nabooru"}, - Text{"Sign of Earth", "Glyphe de la Terre", "Glifo de la tierra"}, - Text{"Medallion of Spirit", "Médaillon du Temple de l'Esprit", "Medalla del Espíritu"}, + Text{ "Earth Element", "Elément Terre", "Elemento de tierra" }, + Text{ "Nabooru's Medallion", "Médaillon de Nabooru", "Medallón de Nabooru" }, + Text{ "Sign of Earth", "Glyphe de la Terre", "Glifo de la tierra" }, + Text{ "Medallion of Spirit", "Médaillon du Temple de l'Esprit", "Medalla del Espíritu" }, }; trickNameTable[RG_SHADOW_MEDALLION] = { - Text{"Fused Shadow", "Cristal d'ombre", "Sombra Fundida"}, - Text{"Impa's Medallion", "Médaillon d'Impa", "Medallón de Impa"}, - Text{"Sign of Illusion", "Glyphe de l'illusion", "Glifo de ilusión"}, - Text{"Medallion of Shadow", "Médaillon du Temple de l'Ombre", "Medalla de la Sombra"}, + Text{ "Fused Shadow", "Cristal d'ombre", "Sombra Fundida" }, + Text{ "Impa's Medallion", "Médaillon d'Impa", "Medallón de Impa" }, + Text{ "Sign of Illusion", "Glyphe de l'illusion", "Glifo de ilusión" }, + Text{ "Medallion of Shadow", "Médaillon du Temple de l'Ombre", "Medalla de la Sombra" }, }; trickNameTable[RG_LIGHT_MEDALLION] = { - Text{"Compass of Light", "Boussole de lumière", "Brújula de Luz"}, - Text{"Rauru's Medallion", "Médaillon de Rauru", "Medallón de Rauru"}, - Text{"Sign of Destiny", "Glyphe du destin", "Glifo del destino"}, - Text{"Medallion of Light", "Médaillon du temple de lumière", "Medalla de la Luz"}, + Text{ "Compass of Light", "Boussole de lumière", "Brújula de Luz" }, + Text{ "Rauru's Medallion", "Médaillon de Rauru", "Medallón de Rauru" }, + Text{ "Sign of Destiny", "Glyphe du destin", "Glifo del destino" }, + Text{ "Medallion of Light", "Médaillon du temple de lumière", "Medalla de la Luz" }, }; trickNameTable[RG_RECOVERY_HEART] = { - Text{"Love", "Bisou", "Te amo"}, - Text{"Life", "Vie", "vida"}, - Text{"HP", "VP", "VP"}, + Text{ "Love", "Bisou", "Te amo" }, + Text{ "Life", "Vie", "vida" }, + Text{ "HP", "VP", "VP" }, }; trickNameTable[RG_GREEN_RUPEE] = { - Text{"False Greg", "Faux Greg", "Falso Greg"}, - Text{"One Ruby", "Un rubis", "Un rubí"}, - Text{"Rupoor (1)", "Roupir (1)", "Rupobre (1)"}, - Text{"One Rupee", "Un rubis", "Guaraní hyliano"}, - Text{"Rupee (1)", "Rubis (1)", "Peso hyliano"}, + Text{ "False Greg", "Faux Greg", "Falso Greg" }, Text{ "One Ruby", "Un rubis", "Un rubí" }, + Text{ "Rupoor (1)", "Roupir (1)", "Rupobre (1)" }, Text{ "One Rupee", "Un rubis", "Guaraní hyliano" }, + Text{ "Rupee (1)", "Rubis (1)", "Peso hyliano" }, }; trickNameTable[RG_BLUE_RUPEE] = { - Text{"Blupee", "Bleubi", "Azupia"}, - Text{"Five Rubies", "Cinq Rubys", "Cinco rubíes"}, - Text{"Five Rupees", "Cinq rubis", "Bolívar hyliano"}, - Text{"Rupee (5)", "Rubis (5)", "Peso hyliano"}, - Text{"Rupoor (5)", "Roupir (5)", "Rupobre (5)"}, + Text{ "Blupee", "Bleubi", "Azupia" }, + Text{ "Five Rubies", "Cinq Rubys", "Cinco rubíes" }, + Text{ "Five Rupees", "Cinq rubis", "Bolívar hyliano" }, + Text{ "Rupee (5)", "Rubis (5)", "Peso hyliano" }, + Text{ "Rupoor (5)", "Roupir (5)", "Rupobre (5)" }, }; trickNameTable[RG_RED_RUPEE] = { - Text{"Big 20", "Grand 20", "Los 20 grandes"}, - Text{"Twenty Rubies", "vingt rubis", "Veinte rubíes"}, - Text{"Rupoor (20)", "Roupir (20)", "Rupobre (20)"}, - Text{"Twenty Rupees", "Vingt rubis", "Colon hyliano"}, - Text{"Rupee (20)", "Rubis (20)", "Peso hyliano"}, + Text{ "Big 20", "Grand 20", "Los 20 grandes" }, Text{ "Twenty Rubies", "vingt rubis", "Veinte rubíes" }, + Text{ "Rupoor (20)", "Roupir (20)", "Rupobre (20)" }, Text{ "Twenty Rupees", "Vingt rubis", "Colon hyliano" }, + Text{ "Rupee (20)", "Rubis (20)", "Peso hyliano" }, }; trickNameTable[RG_PURPLE_RUPEE] = { - Text{"Purpee", "pourbi", "morupiua"}, - Text{"Fifty Rubies", "cinquante rubis", "Cincuenta rubíes"}, - Text{"Rupoor (50)", "Roupir (50)", "Rupobre (50)"}, - Text{"Fifty Rupees", "Cinquante rubis", "Balboa hyliano"}, - Text{"Rupee (50)", "Rubis (50)", "Peso hyliano"}, + Text{ "Purpee", "pourbi", "morupiua" }, + Text{ "Fifty Rubies", "cinquante rubis", "Cincuenta rubíes" }, + Text{ "Rupoor (50)", "Roupir (50)", "Rupobre (50)" }, + Text{ "Fifty Rupees", "Cinquante rubis", "Balboa hyliano" }, + Text{ "Rupee (50)", "Rubis (50)", "Peso hyliano" }, }; trickNameTable[RG_HUGE_RUPEE] = { - Text{"Hugo", "Or Rubi", "Oro Rubi"}, - Text{"Two Hundred Rubies", "deux cents rubis", "Doscientos rubíes"}, - Text{"Diamond", "Diamant", "Diamante"}, - Text{"Huge Ruby", "Énorme rubis", "Rubi gigante"}, - Text{"Two Hundred Rupees", "Deux cent rubis", "Euro hyliano"}, - Text{"Rupee (200)", "Rubis (200)", "Dólar hyliano"}, + Text{ "Hugo", "Or Rubi", "Oro Rubi" }, + Text{ "Two Hundred Rubies", "deux cents rubis", "Doscientos rubíes" }, + Text{ "Diamond", "Diamant", "Diamante" }, + Text{ "Huge Ruby", "Énorme rubis", "Rubi gigante" }, + Text{ "Two Hundred Rupees", "Deux cent rubis", "Euro hyliano" }, + Text{ "Rupee (200)", "Rubis (200)", "Dólar hyliano" }, }; trickNameTable[RG_PIECE_OF_HEART] = { - Text{"Pizza Heart", "Fromage de cœur", "Pieza de Chorizo"}, - Text{"Little Bit Of Love", "Un peu d'amour", "Un poco de amor"}, - Text{"Rare Peach Stone", "Pierre de pêche rare", "Pierre de pêche rare"}, + Text{ "Pizza Heart", "Fromage de cœur", "Pieza de Chorizo" }, + Text{ "Little Bit Of Love", "Un peu d'amour", "Un poco de amor" }, + Text{ "Rare Peach Stone", "Pierre de pêche rare", "Pierre de pêche rare" }, }; trickNameTable[RG_HEART_CONTAINER] = { - Text{"Crystal Heart", "Cœur de cristal", "Corazón de cristal"}, - Text{"Life Heart", "Cœur de vie", "Vida Corazón"}, - Text{"Lots of Love", "Beaucoup d'amour", "Mucho amor"}, + Text{ "Crystal Heart", "Cœur de cristal", "Corazón de cristal" }, + Text{ "Life Heart", "Cœur de vie", "Vida Corazón" }, + Text{ "Lots of Love", "Beaucoup d'amour", "Mucho amor" }, }; trickNameTable[RG_TRIFORCE_PIECE] = { - Text{"Piece of Cheese", "Morceau de Fromage", "Piece of Cheese"}, - Text{"Triforce Shard", "Éclat de Triforce", "Triforce Shard"}, - Text{"Shiny Rock", "Caiiloux Brillant", "Shiny Rock"}, + Text{ "Piece of Cheese", "Morceau de Fromage", "Piece of Cheese" }, + Text{ "Triforce Shard", "Éclat de Triforce", "Triforce Shard" }, + Text{ "Shiny Rock", "Caiiloux Brillant", "Shiny Rock" }, }; trickNameTable[RG_GOHMA_SOUL] = { - Text{"Spider Sense", "", ""}, - Text{"Deku Spirit", "", ""}, - Text{"Ghost of Ghoma", "", ""}, + Text{ "Spider Sense", "", "" }, + Text{ "Deku Spirit", "", "" }, + Text{ "Ghost of Ghoma", "", "" }, }; trickNameTable[RG_KING_DODONGO_SOUL] = { - Text{"Lizard Soul", "", ""}, - Text{"Regal Remains", "", ""}, - Text{"Dodongo's Core", "", ""}, + Text{ "Lizard Soul", "", "" }, + Text{ "Regal Remains", "", "" }, + Text{ "Dodongo's Core", "", "" }, }; trickNameTable[RG_BARINADE_SOUL] = { - Text{"Parasitic Poltergeist", "", ""}, - Text{"Jabu Insides", "", ""}, - Text{"Barinade Bacteria", "", ""}, + Text{ "Parasitic Poltergeist", "", "" }, + Text{ "Jabu Insides", "", "" }, + Text{ "Barinade Bacteria", "", "" }, }; trickNameTable[RG_PHANTOM_GANON_SOUL] = { - Text{"Bigger Poe", "", ""}, - Text{"Sacred Forest Pine Tree", "", ""}, - Text{"Ganon's Phantom", "", ""}, + Text{ "Bigger Poe", "", "" }, + Text{ "Sacred Forest Pine Tree", "", "" }, + Text{ "Ganon's Phantom", "", "" }, }; trickNameTable[RG_VOLVAGIA_SOUL] = { - Text{"Dragon Roast", "", ""}, - Text{"Hot n' Ready", "", ""}, - Text{"Volvagia's Vitality", "", ""}, + Text{ "Dragon Roast", "", "" }, + Text{ "Hot n' Ready", "", "" }, + Text{ "Volvagia's Vitality", "", "" }, }; trickNameTable[RG_MORPHA_SOUL] = { - Text{"Dihydrogen Monoxide", "", ""}, - Text{"Morpha Molecules", "", ""}, - Text{"Wet Stuff", "", ""}, + Text{ "Dihydrogen Monoxide", "", "" }, + Text{ "Morpha Molecules", "", "" }, + Text{ "Wet Stuff", "", "" }, }; trickNameTable[RG_BONGO_BONGO_SOUL] = { - Text{"Shadow Soul", "", ""}, - Text{"Dark Essence", "", ""}, - Text{"Bongo Bongo's Bongo", "", ""}, + Text{ "Shadow Soul", "", "" }, + Text{ "Dark Essence", "", "" }, + Text{ "Bongo Bongo's Bongo", "", "" }, }; trickNameTable[RG_TWINROVA_SOUL] = { - Text{"Sandy Ashes", "", ""}, - Text{"Spiritual Spirit", "", ""}, - Text{"Twin Rovers", "", ""}, + Text{ "Sandy Ashes", "", "" }, + Text{ "Spiritual Spirit", "", "" }, + Text{ "Twin Rovers", "", "" }, }; trickNameTable[RG_GANON_SOUL] = { - Text{"Pure Evil", "", ""}, - Text{"Ganon's Ghost", "", ""}, - Text{"Pork", "", ""}, + Text{ "Pure Evil", "", "" }, + Text{ "Ganon's Ghost", "", "" }, + Text{ "Pork", "", "" }, }; trickNameTable[RG_FISHING_POLE] = { - Text{"Fish Tickler", "Fish Tickler", "Fish Tickler"}, - Text{"Floating Lure", "Floating Lure", "Floating Lure"}, - Text{"Fishing Reel", "Fishing Reel", "Fishing Reel"}, + Text{ "Fish Tickler", "Fish Tickler", "Fish Tickler" }, + Text{ "Floating Lure", "Floating Lure", "Floating Lure" }, + Text{ "Fishing Reel", "Fishing Reel", "Fishing Reel" }, }; trickNameTable[RG_OCARINA_A_BUTTON] = { - Text{"Ocarina J Button", "", ""}, - Text{"Ocarina Ayy Button", "", ""}, - Text{"Ocarina A Trigger", "", ""}, + Text{ "Ocarina J Button", "", "" }, + Text{ "Ocarina Ayy Button", "", "" }, + Text{ "Ocarina A Trigger", "", "" }, }; trickNameTable[RG_OCARINA_C_UP_BUTTON] = { - Text{"Ocarina C North Button", "", ""}, - Text{"Ocarina C App Button", "", ""}, - Text{"Ocarina Sup Button", "", ""}, + Text{ "Ocarina C North Button", "", "" }, + Text{ "Ocarina C App Button", "", "" }, + Text{ "Ocarina Sup Button", "", "" }, }; trickNameTable[RG_OCARINA_C_DOWN_BUTTON] = { - Text{"Ocarina C South Button", "", ""}, - Text{"Ocarina Z Down Button", "", ""}, - Text{"Ocarina See Down Button", "", ""}, - Text{"Ocarina C Dawn Button", "", ""}, + Text{ "Ocarina C South Button", "", "" }, + Text{ "Ocarina Z Down Button", "", "" }, + Text{ "Ocarina See Down Button", "", "" }, + Text{ "Ocarina C Dawn Button", "", "" }, }; trickNameTable[RG_OCARINA_C_LEFT_BUTTON] = { - Text{"Ocarina C West Button", "", ""}, - Text{"Ocarina Sea Left Button", "", ""}, - Text{"Ocarina C Lift Button", "", ""}, - Text{"Ocarina Rewind Button", "", ""}, + Text{ "Ocarina C West Button", "", "" }, + Text{ "Ocarina Sea Left Button", "", "" }, + Text{ "Ocarina C Lift Button", "", "" }, + Text{ "Ocarina Rewind Button", "", "" }, }; trickNameTable[RG_OCARINA_C_RIGHT_BUTTON] = { - Text{"Ocarina C East Button", "", ""}, - Text{"Ocarina C Wright Button", "", ""}, - Text{"Overworld C Right Button", "", ""}, + Text{ "Ocarina C East Button", "", "" }, + Text{ "Ocarina C Wright Button", "", "" }, + Text{ "Overworld C Right Button", "", "" }, }; /* @@ -1127,13 +1074,13 @@ void InitTrickNames() { */ } -//Generate a fake name for the ice trap based on the item it's displayed as +// Generate a fake name for the ice trap based on the item it's displayed as Text GetIceTrapName(uint8_t id) { - //If the trick names table has not been initialized, do so + // If the trick names table has not been initialized, do so if (!initTrickNames) { InitTrickNames(); initTrickNames = true; } - //Randomly get the easy, medium, or hard name for the given item id + // Randomly get the easy, medium, or hard name for the given item id return RandomElement(trickNameTable[id]); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index da4c3eb43..7938d8665 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -66,16 +66,15 @@ static auto GetSpoilerLogPath() { } static auto GetPlacementLogPath() { - return GetGeneralPath(); + return GetGeneralPath(); } // Writes the location to the specified node. -static void WriteLocation( - std::string sphere, const RandomizerCheck locationKey, const bool withPadding = false) { - Rando::Location* location = Rando::StaticData::GetLocation(locationKey); - Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey); +static void WriteLocation(std::string sphere, const RandomizerCheck locationKey, const bool withPadding = false) { + Rando::Location* location = Rando::StaticData::GetLocation(locationKey); + Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey); - switch (gSaveContext.language) { + switch (gSaveContext.language) { case LANGUAGE_ENG: default: jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetEnglish(); @@ -86,48 +85,48 @@ static void WriteLocation( } } -//Writes a shuffled entrance to the specified node +// Writes a shuffled entrance to the specified node static void WriteShuffledEntrance(std::string sphereString, Entrance* entrance) { - int16_t originalIndex = entrance->GetIndex(); - int16_t destinationIndex = -1; - int16_t replacementIndex = entrance->GetReplacement()->GetIndex(); - int16_t replacementDestinationIndex = -1; - std::string name = GetEntranceData(originalIndex)->source; - std::string text = GetEntranceData(replacementIndex)->destination; + int16_t originalIndex = entrance->GetIndex(); + int16_t destinationIndex = -1; + int16_t replacementIndex = entrance->GetReplacement()->GetIndex(); + int16_t replacementDestinationIndex = -1; + std::string name = GetEntranceData(originalIndex)->source; + std::string text = GetEntranceData(replacementIndex)->destination; - // Track the reverse destination, useful for savewarp handling - if (entrance->GetReverse() != nullptr) { - destinationIndex = entrance->GetReverse()->GetIndex(); - // When decouple is off we track the replacement's reverse destination, useful for recording visited entrances - if (!entrance->IsDecoupled()) { - replacementDestinationIndex = entrance->GetReplacement()->GetReverse()->GetIndex(); + // Track the reverse destination, useful for savewarp handling + if (entrance->GetReverse() != nullptr) { + destinationIndex = entrance->GetReverse()->GetIndex(); + // When decouple is off we track the replacement's reverse destination, useful for recording visited entrances + if (!entrance->IsDecoupled()) { + replacementDestinationIndex = entrance->GetReplacement()->GetReverse()->GetIndex(); + } } - } - json entranceJson = json::object({ - {"type", entrance->GetType()}, - {"index", originalIndex}, - {"destination", destinationIndex}, - {"override", replacementIndex}, - {"overrideDestination", replacementDestinationIndex}, - }); - - jsonData["entrances"].push_back(entranceJson); - - // When decoupled entrances is off, handle saving reverse entrances - if (entrance->GetReverse() != nullptr && !entrance->IsDecoupled()) { - json reverseEntranceJson = json::object({ - {"type", entrance->GetReverse()->GetType()}, - {"index", replacementDestinationIndex}, - {"destination", replacementIndex}, - {"override", destinationIndex}, - {"overrideDestination", originalIndex}, + json entranceJson = json::object({ + { "type", entrance->GetType() }, + { "index", originalIndex }, + { "destination", destinationIndex }, + { "override", replacementIndex }, + { "overrideDestination", replacementDestinationIndex }, }); - jsonData["entrances"].push_back(reverseEntranceJson); - } + jsonData["entrances"].push_back(entranceJson); - switch (gSaveContext.language) { + // When decoupled entrances is off, handle saving reverse entrances + if (entrance->GetReverse() != nullptr && !entrance->IsDecoupled()) { + json reverseEntranceJson = json::object({ + { "type", entrance->GetReverse()->GetType() }, + { "index", replacementDestinationIndex }, + { "destination", replacementIndex }, + { "override", destinationIndex }, + { "overrideDestination", originalIndex }, + }); + + jsonData["entrances"].push_back(reverseEntranceJson); + } + + switch (gSaveContext.language) { case LANGUAGE_ENG: case LANGUAGE_FRA: default: @@ -141,32 +140,31 @@ static void WriteSettings() { auto ctx = Rando::Context::GetInstance(); std::array options = Rando::Settings::GetInstance()->GetAllOptions(); for (const Rando::Option& option : options) { - if (option.GetName() != ""){ - jsonData["settings"][option.GetName()] = option.GetOptionText(ctx->GetOption(option.GetKey()).Get()); - } + if (option.GetName() != "") { + jsonData["settings"][option.GetName()] = option.GetOptionText(ctx->GetOption(option.GetKey()).Get()); + } } } // Removes any line breaks from s. std::string RemoveLineBreaks(std::string s) { - s.erase(std::remove(s.begin(), s.end(), '\n'), s.end()); - return s; + s.erase(std::remove(s.begin(), s.end(), '\n'), s.end()); + return s; } // Writes the excluded locations to the spoiler log, if there are any. static void WriteExcludedLocations() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - 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; - } - - jsonData["excludedLocations"].push_back(RemoveLineBreaks(location->GetName())); + 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; + } + jsonData["excludedLocations"].push_back(RemoveLineBreaks(location->GetName())); + } } - } } // Writes the starting inventory to the spoiler log, if there is any. @@ -182,16 +180,16 @@ static void WriteStartingInventory() { } } -//Writes the enabled tricks to the spoiler log, if there are any. +// Writes the enabled tricks to the spoiler log, if there are any. static void WriteEnabledTricks() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - for (const auto& setting : Rando::Settings::GetInstance()->GetOptionGroup(RSG_TRICKS).GetOptions()) { - if (ctx->GetTrickOption(static_cast(setting->GetKey())).IsNot(RO_GENERIC_ON)) { - continue; + for (const auto& setting : Rando::Settings::GetInstance()->GetOptionGroup(RSG_TRICKS).GetOptions()) { + if (ctx->GetTrickOption(static_cast(setting->GetKey())).IsNot(RO_GENERIC_ON)) { + continue; + } + jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); } - jsonData["enabledTricks"].push_back(RemoveLineBreaks(setting->GetName()).c_str()); - } } // Writes the Master Quest dungeons to the spoiler log, if there are any. @@ -208,47 +206,49 @@ static void WriteMasterQuestDungeons() { // Writes the required trials to the spoiler log, if there are any. 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)); + 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"; } - } - 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. static void WritePlaythrough() { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); - for (uint32_t i = 0; i < ctx->playthroughLocations.size(); ++i) { - auto sphereNum = std::to_string(i); - std::string sphereString = "sphere "; - if (i < 10) sphereString += "0"; - sphereString += sphereNum; - for (const RandomizerCheck key : ctx->playthroughLocations[i]) { - WriteLocation(sphereString, key, true); + for (uint32_t i = 0; i < ctx->playthroughLocations.size(); ++i) { + auto sphereNum = std::to_string(i); + std::string sphereString = "sphere "; + if (i < 10) + sphereString += "0"; + sphereString += sphereNum; + for (const RandomizerCheck key : ctx->playthroughLocations[i]) { + WriteLocation(sphereString, key, true); + } } - } } -//Write the randomized entrance playthrough to the spoiler log, if applicable +// Write the randomized entrance playthrough to the spoiler log, if applicable static void WriteShuffledEntrances() { - auto ctx = Rando::Context::GetInstance(); - for (uint32_t i = 0; i < ctx->GetEntranceShuffler()->playthroughEntrances.size(); ++i) { - auto sphereNum = std::to_string(i); - std::string sphereString = "sphere "; - if (i < 10) sphereString += "0"; - sphereString += sphereNum; - for (Entrance* entrance : ctx->GetEntranceShuffler()->playthroughEntrances[i]) { - WriteShuffledEntrance(sphereString, entrance); + auto ctx = Rando::Context::GetInstance(); + for (uint32_t i = 0; i < ctx->GetEntranceShuffler()->playthroughEntrances.size(); ++i) { + auto sphereNum = std::to_string(i); + std::string sphereString = "sphere "; + if (i < 10) + sphereString += "0"; + sphereString += sphereNum; + for (Entrance* entrance : ctx->GetEntranceShuffler()->playthroughEntrances[i]) { + WriteShuffledEntrance(sphereString, entrance); + } } - } } Rando::ItemLocation* GetItemLocation(RandomizerGet item) { @@ -265,52 +265,59 @@ static void WriteAllLocations() { std::string placedItemName; switch (gSaveContext.language) { - case 0: - default: - placedItemName = location->GetPlacedItemName().english; - break; - case 2: - placedItemName = location->GetPlacedItemName().french; - break; + case 0: + default: + placedItemName = location->GetPlacedItemName().english; + break; + case 2: + placedItemName = location->GetPlacedItemName().french; + break; } // If it's a simple item (not an ice trap, doesn't have a price) // just add the name of the item and move on - if (!location->HasCustomPrice() && - location->GetPlacedRandomizerGet() != RG_ICE_TRAP) { - - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] = placedItemName; + if (!location->HasCustomPrice() && location->GetPlacedRandomizerGet() != RG_ICE_TRAP) { + + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] = + placedItemName; continue; } // We're dealing with a complex item, build out the json object for it - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["item"] = placedItemName; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["item"] = + placedItemName; if (location->HasCustomPrice()) { jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["price"] = location->GetPrice(); } if (location->IsAHintAccessible()) { - hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); + hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); } if (location->GetPlacedRandomizerGet() == RG_ICE_TRAP) { - switch (gSaveContext.language) { - case 0: - default: - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = - Rando::StaticData::RetrieveItem(ctx->overrides[location->GetRandomizerCheck()].LooksLike()).GetName().english; - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = - ctx->overrides[location->GetRandomizerCheck()].GetTrickName().english; - break; - case 2: - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = - Rando::StaticData::RetrieveItem(ctx->overrides[location->GetRandomizerCheck()].LooksLike()).GetName().french; - jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = - ctx->overrides[location->GetRandomizerCheck()].GetTrickName().french; - break; - } - } + switch (gSaveContext.language) { + case 0: + default: + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["model"] = Rando::StaticData::RetrieveItem( + ctx->overrides[location->GetRandomizerCheck()].LooksLike()) + .GetName() + .english; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().english; + break; + case 2: + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["model"] = Rando::StaticData::RetrieveItem( + ctx->overrides[location->GetRandomizerCheck()].LooksLike()) + .GetName() + .french; + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().french; + break; + } + } } } @@ -319,9 +326,9 @@ const char* SpoilerLog_Write() { jsonData.clear(); - jsonData["version"] = (char*) gBuildVersion; - jsonData["git_branch"] = (char*) gGitBranch; - jsonData["git_commit"] = (char*) gGitCommitHash; + jsonData["version"] = (char*)gBuildVersion; + jsonData["git_branch"] = (char*)gGitBranch; + jsonData["git_commit"] = (char*)gGitCommitHash; jsonData["seed"] = ctx->GetSeedString(); jsonData["finalSeed"] = ctx->GetSeed(); @@ -335,7 +342,7 @@ const char* SpoilerLog_Write() { WriteSettings(); WriteExcludedLocations(); WriteStartingInventory(); - WriteEnabledTricks(); + WriteEnabledTricks(); WriteMasterQuestDungeons(); WriteChosenOptions(); WritePlaythrough(); @@ -353,7 +360,7 @@ const char* SpoilerLog_Write() { std::string jsonString = jsonData.dump(4); std::ostringstream fileNameStream; - for (uint8_t i = 0; i < ctx->hashIconIndexes.size(); i ++) { + for (uint8_t i = 0; i < ctx->hashIconIndexes.size(); i++) { if (i) { fileNameStream << '-'; } @@ -384,4 +391,3 @@ void PlacementLog_Msg(std::string_view msg) { void PlacementLog_Clear() { placementtxt = ""; } - diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index 04a7e3040..dda37b18a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -10,188 +10,188 @@ std::vector StartingInventory; uint8_t AdditionalHeartContainers; static void AddItemToInventory(RandomizerGet item, size_t count = 1) { - StartingInventory.insert(StartingInventory.end(), count, item); + StartingInventory.insert(StartingInventory.end(), count, item); } void GenerateStartingInventory() { - auto ctx = Rando::Context::GetInstance(); - StartingInventory.clear(); + auto ctx = Rando::Context::GetInstance(); + StartingInventory.clear(); - if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->GetMap() != RG_NONE) { - AddItemToInventory(dungeon->GetMap()); - } + if (ctx->GetOption(RSK_SHUFFLE_MAPANDCOMPASS).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->GetMap() != RG_NONE) { + AddItemToInventory(dungeon->GetMap()); + } - if (dungeon->GetCompass() != RG_NONE) { - AddItemToInventory(dungeon->GetCompass()); - } - } - } - - if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { - if (dungeon->GetSmallKeyCount() > 0) { - AddItemToInventory(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); - } - } - } else if (ctx->GetOption(RSK_KEYSANITY).Is(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 - // locked behind the keys, which is not always true in rando. - // We can resolve this by starting with some extra keys - // - OoT Randomizer - if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { - AddItemToInventory(RG_SPIRIT_TEMPLE_SMALL_KEY, 3); - } - } - - if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { - AddItemToInventory(RG_FOREST_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_FIRE_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_WATER_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_SPIRIT_TEMPLE_BOSS_KEY); - AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY); - } - - // Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start. - // During save init, the boss key isn't actually given and it's instead given when completing the triforce. - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH) || - ctx->GetOption(RSK_TRIFORCE_HUNT)) { - AddItemToInventory(RG_GANONS_CASTLE_BOSS_KEY); - } - - if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) && !ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { - AddItemToInventory(RG_GERUDO_MEMBERSHIP_CARD); - } - - //Starting Inventory Menu - //Values are associated so that the count of items matches the index of - //the option selected. If None is selected, the value will be zero and - //zero of the item will be added to the starting inventory. - // TODO: Uncomment when these options are implemented. - // AddItemToInventory(RG_PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); - // AddItemToInventory(RG_PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); - // AddItemToInventory(RG_PROGRESSIVE_BOMB_BAG, StartingBombBag.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()); - // AddItemToInventory(RG_LIGHT_ARROWS, StartingLightArrows.Value()); - // AddItemToInventory(RG_DINS_FIRE, StartingDinsFire.Value()); - // AddItemToInventory(RG_FARORES_WIND, StartingFaroresWind.Value()); - // AddItemToInventory(RG_NAYRUS_LOVE, StartingNayrusLove.Value()); - // AddItemToInventory(RG_PROGRESSIVE_SLINGSHOT, StartingSlingshot.Value()); - // AddItemToInventory(RG_BOOMERANG, StartingBoomerang.Value()); - // AddItemToInventory(RG_LENS_OF_TRUTH, StartingLensOfTruth.Value()); - // AddItemToInventory(RG_MAGIC_BEAN_PACK, StartingMagicBean.Value()); - // AddItemToInventory(RG_MEGATON_HAMMER, StartingMegatonHammer.Value()); - // AddItemToInventory(RG_PROGRESSIVE_HOOKSHOT, StartingHookshot.Value()); - // AddItemToInventory(RG_IRON_BOOTS, StartingIronBoots.Value()); - // AddItemToInventory(RG_HOVER_BOOTS, StartingHoverBoots.Value()); - //For starting bottles, we need to check if they are a big poe and add that if so - // since a big poe bottle is not logically equivalent to an empty bottle. - // if (StartingBottle1.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle1.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // if (StartingBottle2.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle2.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // if (StartingBottle3.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle3.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // if (StartingBottle4.Value() == STARTINGBOTTLE_BIG_POE) { - // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); - // } else if (StartingBottle4.Value()) { - // AddItemToInventory(RG_EMPTY_BOTTLE, 1); - // } - // AddItemToInventory(RG_RUTOS_LETTER, StartingRutoBottle.Value()); - 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); - AddItemToInventory(RG_SUNS_SONG, ctx->GetOption(RSK_STARTING_SUNS_SONG) ? 1 : 0); - AddItemToInventory(RG_SONG_OF_TIME, ctx->GetOption(RSK_STARTING_SONG_OF_TIME) ? 1 : 0); - AddItemToInventory(RG_SONG_OF_STORMS, ctx->GetOption(RSK_STARTING_SONG_OF_STORMS) ? 1 : 0); - AddItemToInventory(RG_MINUET_OF_FOREST, ctx->GetOption(RSK_STARTING_MINUET_OF_FOREST) ? 1 : 0); - AddItemToInventory(RG_BOLERO_OF_FIRE, ctx->GetOption(RSK_STARTING_BOLERO_OF_FIRE) ? 1 : 0); - AddItemToInventory(RG_SERENADE_OF_WATER, ctx->GetOption(RSK_STARTING_SERENADE_OF_WATER) ? 1 : 0); - AddItemToInventory(RG_REQUIEM_OF_SPIRIT, ctx->GetOption(RSK_STARTING_REQUIEM_OF_SPIRIT) ? 1 : 0); - AddItemToInventory(RG_NOCTURNE_OF_SHADOW, ctx->GetOption(RSK_STARTING_NOCTURNE_OF_SHADOW) ? 1 : 0); - AddItemToInventory(RG_PRELUDE_OF_LIGHT, ctx->GetOption(RSK_STARTING_PRELUDE_OF_LIGHT) ? 1 : 0); - AddItemToInventory(RG_KOKIRI_SWORD, ctx->GetOption(RSK_STARTING_KOKIRI_SWORD) ? 1 : 0); - // if (ProgressiveGoronSword) { - // AddItemToInventory(RG_PROGRESSIVE_GORONSWORD, StartingBiggoronSword.Value()); - // } else { - // AddItemToInventory(RG_GIANTS_KNIFE, (StartingBiggoronSword.Is(STARTINGBGS_GIANTS_KNIFE)) ? 1 : 0); - // AddItemToInventory(RG_BIGGORON_SWORD, (StartingBiggoronSword.Is(STARTINGBGS_BIGGORON_SWORD)) ? 1 : 0); - // } - AddItemToInventory(RG_MASTER_SWORD, ctx->GetOption(RSK_STARTING_MASTER_SWORD) ? 1 : 0); - AddItemToInventory(RG_DEKU_SHIELD, ctx->GetOption(RSK_STARTING_DEKU_SHIELD) ? 1 : 0); - // AddItemToInventory(RG_HYLIAN_SHIELD, StartingHylianShield.Value()); - // AddItemToInventory(RG_MIRROR_SHIELD, StartingMirrorShield.Value()); - // AddItemToInventory(RG_GORON_TUNIC, StartingGoronTunic.Value()); - // AddItemToInventory(RG_ZORA_TUNIC, StartingZoraTunic.Value()); - // AddItemToInventory(RG_PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); - // AddItemToInventory(RG_PROGRESSIVE_STRENGTH, StartingStrength.Value()); - // AddItemToInventory(RG_PROGRESSIVE_SCALE, StartingScale.Value()); - // AddItemToInventory(RG_PROGRESSIVE_WALLET, StartingWallet.Value()); - // AddItemToInventory(RG_STONE_OF_AGONY, StartingShardOfAgony.Value()); - // AddItemToInventory(RG_DOUBLE_DEFENSE, StartingDoubleDefense.Value()); - // AddItemToInventory(RG_KOKIRI_EMERALD, StartingKokiriEmerald.Value()); - // AddItemToInventory(RG_GORON_RUBY, StartingGoronRuby.Value()); - // AddItemToInventory(RG_ZORA_SAPPHIRE, StartingZoraSapphire.Value()); - // AddItemToInventory(RG_FOREST_MEDALLION, StartingForestMedallion.Value()); - // AddItemToInventory(RG_FIRE_MEDALLION, StartingFireMedallion.Value()); - // AddItemToInventory(RG_WATER_MEDALLION, StartingWaterMedallion.Value()); - // 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).Get()); - - 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).Get() == 0 || ctx->GetOption(RSK_ITEM_POOL).Get() == 3) { - AddItemToInventory(RG_TREASURE_GAME_HEART); + if (dungeon->GetCompass() != RG_NONE) { + AddItemToInventory(dungeon->GetCompass()); + } + } } - 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).Get()); - - if (hearts <= maxContainers) { - AddItemToInventory(RG_HEART_CONTAINER, hearts); - } else { - AddItemToInventory(RG_HEART_CONTAINER, maxContainers); - AddItemToInventory(RG_PIECE_OF_HEART, (hearts - maxContainers) * 4); + if (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + for (auto* dungeon : ctx->GetDungeons()->GetDungeonList()) { + if (dungeon->GetSmallKeyCount() > 0) { + AddItemToInventory(dungeon->GetSmallKey(), dungeon->GetSmallKeyCount()); + } + } + } else if (ctx->GetOption(RSK_KEYSANITY).Is(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 + // locked behind the keys, which is not always true in rando. + // We can resolve this by starting with some extra keys + // - OoT Randomizer + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { + AddItemToInventory(RG_SPIRIT_TEMPLE_SMALL_KEY, 3); + } } - if (hearts == 17) { - AddItemToInventory(RG_TREASURE_GAME_HEART); + if (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_STARTWITH)) { + AddItemToInventory(RG_FOREST_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_FIRE_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_WATER_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_SPIRIT_TEMPLE_BOSS_KEY); + AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY); + } + + // Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start. + // During save init, the boss key isn't actually given and it's instead given when completing the triforce. + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH) || ctx->GetOption(RSK_TRIFORCE_HUNT)) { + AddItemToInventory(RG_GANONS_CASTLE_BOSS_KEY); + } + + if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) && + !ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { + AddItemToInventory(RG_GERUDO_MEMBERSHIP_CARD); + } + + // Starting Inventory Menu + // Values are associated so that the count of items matches the index of + // the option selected. If None is selected, the value will be zero and + // zero of the item will be added to the starting inventory. + // TODO: Uncomment when these options are implemented. + // AddItemToInventory(RG_PROGRESSIVE_STICK_UPGRADE, StartingStickCapacity.Value()); + // AddItemToInventory(RG_PROGRESSIVE_NUT_UPGRADE, StartingNutCapacity.Value()); + // AddItemToInventory(RG_PROGRESSIVE_BOMB_BAG, StartingBombBag.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()); + // AddItemToInventory(RG_LIGHT_ARROWS, StartingLightArrows.Value()); + // AddItemToInventory(RG_DINS_FIRE, StartingDinsFire.Value()); + // AddItemToInventory(RG_FARORES_WIND, StartingFaroresWind.Value()); + // AddItemToInventory(RG_NAYRUS_LOVE, StartingNayrusLove.Value()); + // AddItemToInventory(RG_PROGRESSIVE_SLINGSHOT, StartingSlingshot.Value()); + // AddItemToInventory(RG_BOOMERANG, StartingBoomerang.Value()); + // AddItemToInventory(RG_LENS_OF_TRUTH, StartingLensOfTruth.Value()); + // AddItemToInventory(RG_MAGIC_BEAN_PACK, StartingMagicBean.Value()); + // AddItemToInventory(RG_MEGATON_HAMMER, StartingMegatonHammer.Value()); + // AddItemToInventory(RG_PROGRESSIVE_HOOKSHOT, StartingHookshot.Value()); + // AddItemToInventory(RG_IRON_BOOTS, StartingIronBoots.Value()); + // AddItemToInventory(RG_HOVER_BOOTS, StartingHoverBoots.Value()); + // For starting bottles, we need to check if they are a big poe and add that if so + // since a big poe bottle is not logically equivalent to an empty bottle. + // if (StartingBottle1.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle1.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // if (StartingBottle2.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle2.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // if (StartingBottle3.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle3.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // if (StartingBottle4.Value() == STARTINGBOTTLE_BIG_POE) { + // AddItemToInventory(RG_BOTTLE_WITH_BIG_POE, 1); + // } else if (StartingBottle4.Value()) { + // AddItemToInventory(RG_EMPTY_BOTTLE, 1); + // } + // AddItemToInventory(RG_RUTOS_LETTER, StartingRutoBottle.Value()); + 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); + AddItemToInventory(RG_SUNS_SONG, ctx->GetOption(RSK_STARTING_SUNS_SONG) ? 1 : 0); + AddItemToInventory(RG_SONG_OF_TIME, ctx->GetOption(RSK_STARTING_SONG_OF_TIME) ? 1 : 0); + AddItemToInventory(RG_SONG_OF_STORMS, ctx->GetOption(RSK_STARTING_SONG_OF_STORMS) ? 1 : 0); + AddItemToInventory(RG_MINUET_OF_FOREST, ctx->GetOption(RSK_STARTING_MINUET_OF_FOREST) ? 1 : 0); + AddItemToInventory(RG_BOLERO_OF_FIRE, ctx->GetOption(RSK_STARTING_BOLERO_OF_FIRE) ? 1 : 0); + AddItemToInventory(RG_SERENADE_OF_WATER, ctx->GetOption(RSK_STARTING_SERENADE_OF_WATER) ? 1 : 0); + AddItemToInventory(RG_REQUIEM_OF_SPIRIT, ctx->GetOption(RSK_STARTING_REQUIEM_OF_SPIRIT) ? 1 : 0); + AddItemToInventory(RG_NOCTURNE_OF_SHADOW, ctx->GetOption(RSK_STARTING_NOCTURNE_OF_SHADOW) ? 1 : 0); + AddItemToInventory(RG_PRELUDE_OF_LIGHT, ctx->GetOption(RSK_STARTING_PRELUDE_OF_LIGHT) ? 1 : 0); + AddItemToInventory(RG_KOKIRI_SWORD, ctx->GetOption(RSK_STARTING_KOKIRI_SWORD) ? 1 : 0); + // if (ProgressiveGoronSword) { + // AddItemToInventory(RG_PROGRESSIVE_GORONSWORD, StartingBiggoronSword.Value()); + // } else { + // AddItemToInventory(RG_GIANTS_KNIFE, (StartingBiggoronSword.Is(STARTINGBGS_GIANTS_KNIFE)) ? 1 : 0); + // AddItemToInventory(RG_BIGGORON_SWORD, (StartingBiggoronSword.Is(STARTINGBGS_BIGGORON_SWORD)) ? 1 : 0); + // } + AddItemToInventory(RG_MASTER_SWORD, ctx->GetOption(RSK_STARTING_MASTER_SWORD) ? 1 : 0); + AddItemToInventory(RG_DEKU_SHIELD, ctx->GetOption(RSK_STARTING_DEKU_SHIELD) ? 1 : 0); + // AddItemToInventory(RG_HYLIAN_SHIELD, StartingHylianShield.Value()); + // AddItemToInventory(RG_MIRROR_SHIELD, StartingMirrorShield.Value()); + // AddItemToInventory(RG_GORON_TUNIC, StartingGoronTunic.Value()); + // AddItemToInventory(RG_ZORA_TUNIC, StartingZoraTunic.Value()); + // AddItemToInventory(RG_PROGRESSIVE_MAGIC_METER, StartingMagicMeter.Value()); + // AddItemToInventory(RG_PROGRESSIVE_STRENGTH, StartingStrength.Value()); + // AddItemToInventory(RG_PROGRESSIVE_SCALE, StartingScale.Value()); + // AddItemToInventory(RG_PROGRESSIVE_WALLET, StartingWallet.Value()); + // AddItemToInventory(RG_STONE_OF_AGONY, StartingShardOfAgony.Value()); + // AddItemToInventory(RG_DOUBLE_DEFENSE, StartingDoubleDefense.Value()); + // AddItemToInventory(RG_KOKIRI_EMERALD, StartingKokiriEmerald.Value()); + // AddItemToInventory(RG_GORON_RUBY, StartingGoronRuby.Value()); + // AddItemToInventory(RG_ZORA_SAPPHIRE, StartingZoraSapphire.Value()); + // AddItemToInventory(RG_FOREST_MEDALLION, StartingForestMedallion.Value()); + // AddItemToInventory(RG_FIRE_MEDALLION, StartingFireMedallion.Value()); + // AddItemToInventory(RG_WATER_MEDALLION, StartingWaterMedallion.Value()); + // 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).Get()); + + 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).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).Get()); + + if (hearts <= maxContainers) { + AddItemToInventory(RG_HEART_CONTAINER, hearts); + } else { + AddItemToInventory(RG_HEART_CONTAINER, maxContainers); + AddItemToInventory(RG_PIECE_OF_HEART, (hearts - maxContainers) * 4); + } + + if (hearts == 17) { + AddItemToInventory(RG_TREASURE_GAME_HEART); + } } - } } bool StartingInventoryHasBottle() { - RandomizerGet bottle = RG_EMPTY_BOTTLE; - return ElementInContainer(bottle, StartingInventory); + RandomizerGet bottle = RG_EMPTY_BOTTLE; + return ElementInContainer(bottle, StartingInventory); } void ApplyStartingInventory() { for (RandomizerGet item : StartingInventory) { - if (item == RG_PIECE_OF_HEART || item == RG_HEART_CONTAINER || item == RG_TREASURE_GAME_HEART) - continue; + if (item == RG_PIECE_OF_HEART || item == RG_HEART_CONTAINER || item == RG_TREASURE_GAME_HEART) + continue; - Rando::StaticData::RetrieveItem(item).ApplyEffect(); - } + Rando::StaticData::RetrieveItem(item).ApplyEffect(); + } } diff --git a/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp index fcfa13d97..6c1db52f7 100644 --- a/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp +++ b/soh/soh/Enhancements/randomizer/ColoredMapsAndCompasses.cpp @@ -7,18 +7,20 @@ #include "objects/object_gi_map/object_gi_map.h" extern "C" { - extern SaveContext gSaveContext; - #include "variables.h" - #include "macros.h" - u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); +extern SaveContext gSaveContext; +#include "variables.h" +#include "macros.h" +u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey); } #define CVAR_COLORED_MAPS_AND_COMPASSES_NAME CVAR_RANDOMIZER_ENHANCEMENT("ColoredMapsAndCompasses") #define CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT 1 -#define CVAR_COLORED_MAPS_AND_COMPASSES_VALUE CVarGetInteger(CVAR_COLORED_MAPS_AND_COMPASSES_NAME, CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT) +#define CVAR_COLORED_MAPS_AND_COMPASSES_VALUE \ + CVarGetInteger(CVAR_COLORED_MAPS_AND_COMPASSES_NAME, CVAR_COLORED_MAPS_AND_COMPASSES_DEFAULT) void OnLoadFileColoredMapsAndCompasses(int32_t _) { - s8 mapsAndCompassesCanBeOutsideDungeon = IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); + s8 mapsAndCompassesCanBeOutsideDungeon = + IS_RANDO && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS); s8 isColoredMapsAndCompassesEnabled = mapsAndCompassesCanBeOutsideDungeon && CVAR_COLORED_MAPS_AND_COMPASSES_VALUE; if (isColoredMapsAndCompassesEnabled) { ResourceMgr_PatchGfxByName(gGiDungeonMapDL, "Map_PrimColor", 5, gsDPNoOp()); @@ -36,7 +38,7 @@ void OnLoadFileColoredMapsAndCompasses(int32_t _) { void RegisterColoredMapsAndCompasses() { COND_HOOK(OnLoadFile, CVAR_COLORED_MAPS_AND_COMPASSES_VALUE, OnLoadFileColoredMapsAndCompasses) - //Also need to call it directly to patch/unpatch on cvar change + // Also need to call it directly to patch/unpatch on cvar change OnLoadFileColoredMapsAndCompasses(0); } diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp index 2d9d34e2b..642fa7f42 100644 --- a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -70,7 +70,7 @@ static void OnDoorInit(void* actorRef) { EnDoor* enDoor = static_cast(actorRef); enDoor->randomizerInf = RAND_INF_MAX; - auto it = lookupTable.find({gPlayState->sceneNum, enDoor->actor.params}); + auto it = lookupTable.find({ gPlayState->sceneNum, enDoor->actor.params }); if (it != lookupTable.end()) { enDoor->randomizerInf = it->second; if (!Flags_GetRandomizerInf(enDoor->randomizerInf)) { @@ -93,7 +93,8 @@ void RegisterLockOverworldDoors() { 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) { + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && + enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { Flags_SetRandomizerInf(enDoor->randomizerInf); *should = false; } @@ -102,7 +103,8 @@ void RegisterLockOverworldDoors() { 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) { + if (enDoor->randomizerInf >= RAND_INF_GUARD_HOUSE_UNLOCKED && + enDoor->randomizerInf <= RAND_INF_FISHING_HOLE_KEY_OBTAINED) { *should = !Flags_GetRandomizerInf((RandomizerInf)(enDoor->randomizerInf + 1)); } }); @@ -110,21 +112,20 @@ void RegisterLockOverworldDoors() { 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) { + 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. + // 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 - )) { + if (!*should && (enDoor->actor.id == ACTOR_EN_DOOR && ((enDoor->actor.params >> 7) & 7) == 1 && + enDoor->randomizerInf != RAND_INF_MAX)) { *should = true; } }); diff --git a/soh/soh/Enhancements/randomizer/Plandomizer.cpp b/soh/soh/Enhancements/randomizer/Plandomizer.cpp index 39b20d876..dc32dc999 100644 --- a/soh/soh/Enhancements/randomizer/Plandomizer.cpp +++ b/soh/soh/Enhancements/randomizer/Plandomizer.cpp @@ -18,10 +18,10 @@ #include "soh/Enhancements/randomizer/3drando/shops.hpp" extern "C" { - #include "include/z64item.h" - #include "objects/gameplay_keep/gameplay_keep.h" - extern SaveContext gSaveContext; - extern PlayState* gPlayState; +#include "include/z64item.h" +#include "objects/gameplay_keep/gameplay_keep.h" +extern SaveContext gSaveContext; +extern PlayState* gPlayState; } const std::string randomizeButton = ICON_FA_RANDOM; @@ -34,14 +34,14 @@ std::string shortName = ""; std::string logTemp = ""; std::string lastLoadedSpoiler = ""; int32_t temporaryItemIndex = -1; -RandomizerCheckArea selectedArea = RCAREA_INVALID; +RandomizerCheckArea selectedArea = RCAREA_INVALID; -ImVec4 itemColor = ImVec4( 1.0f, 1.0f, 1.0f, 1.0f ); +ImVec4 itemColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); ImTextureID textureID; ImVec2 imageSize = ImVec2(32.0f, 32.0f); float imagePadding = 2.0f; -ImVec2 textureUV0 = ImVec2( 0, 0 ); -ImVec2 textureUV1 = ImVec2( 1, 1 ); +ImVec2 textureUV0 = ImVec2(0, 0); +ImVec2 textureUV1 = ImVec2(1, 1); bool shouldPopup = false; bool shouldTrapPopup = false; @@ -62,208 +62,196 @@ std::vector plandoHintData; extern std::map rcAreaNames; std::unordered_map bossKeyShortNames = { - { RG_FOREST_TEMPLE_BOSS_KEY, "Frst" }, - { RG_FIRE_TEMPLE_BOSS_KEY, "Fire" }, - { RG_WATER_TEMPLE_BOSS_KEY, "Watr" }, - { RG_SPIRIT_TEMPLE_BOSS_KEY, "Sprt" }, - { RG_SHADOW_TEMPLE_BOSS_KEY, "Shdw" }, - { RG_GANONS_CASTLE_BOSS_KEY, "Ganon" }, + { RG_FOREST_TEMPLE_BOSS_KEY, "Frst" }, { RG_FIRE_TEMPLE_BOSS_KEY, "Fire" }, + { RG_WATER_TEMPLE_BOSS_KEY, "Watr" }, { RG_SPIRIT_TEMPLE_BOSS_KEY, "Sprt" }, + { RG_SHADOW_TEMPLE_BOSS_KEY, "Shdw" }, { RG_GANONS_CASTLE_BOSS_KEY, "Ganon" }, }; std::unordered_map ocarinaButtonNames = { - { RG_OCARINA_A_BUTTON, "A" }, - { RG_OCARINA_C_UP_BUTTON, "C-UP" }, - { RG_OCARINA_C_DOWN_BUTTON, "C-DWN" }, - { RG_OCARINA_C_LEFT_BUTTON, "C-LFT" }, - { RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" }, + { RG_OCARINA_A_BUTTON, "A" }, { RG_OCARINA_C_UP_BUTTON, "C-UP" }, + { RG_OCARINA_C_DOWN_BUTTON, "C-DWN" }, { RG_OCARINA_C_LEFT_BUTTON, "C-LFT" }, + { RG_OCARINA_C_RIGHT_BUTTON, "C-RHT" }, }; 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 } }, - { RG_PHANTOM_GANON_SOUL, { 0.02f, 0.76f, 0.18f, 1.0f } }, - { RG_VOLVAGIA_SOUL, { 0.93f, 0.37f, 0.37f, 1.0f } }, - { RG_MORPHA_SOUL, { 0.33f, 0.71f, 0.87f, 1.0f } }, - { RG_BONGO_BONGO_SOUL, { 0.49f, 0.06f, 0.69f, 1.0f } }, - { RG_TWINROVA_SOUL, { 0.87f, 0.62f, 0.18f, 1.0f } }, - { RG_GANON_SOUL, { 0.31f, 0.31f, 0.31f, 1.0f } } + { 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 } }, { RG_PHANTOM_GANON_SOUL, { 0.02f, 0.76f, 0.18f, 1.0f } }, + { RG_VOLVAGIA_SOUL, { 0.93f, 0.37f, 0.37f, 1.0f } }, { RG_MORPHA_SOUL, { 0.33f, 0.71f, 0.87f, 1.0f } }, + { RG_BONGO_BONGO_SOUL, { 0.49f, 0.06f, 0.69f, 1.0f } }, { RG_TWINROVA_SOUL, { 0.87f, 0.62f, 0.18f, 1.0f } }, + { RG_GANON_SOUL, { 0.31f, 0.31f, 0.31f, 1.0f } } }; - std::vector infiniteItemList = { - RG_GREEN_RUPEE, RG_BLUE_RUPEE, RG_RED_RUPEE, RG_PURPLE_RUPEE, RG_HUGE_RUPEE, - RG_ARROWS_5, RG_ARROWS_10, RG_ARROWS_30, - RG_DEKU_STICK_1, RG_DEKU_SEEDS_30, RG_DEKU_NUTS_5, RG_DEKU_NUTS_10, - RG_BOMBS_5, RG_BOMBS_10, RG_BOMBS_20, RG_BOMBCHU_5, RG_BOMBCHU_10, RG_BOMBCHU_20, - RG_RECOVERY_HEART, RG_ICE_TRAP, RG_SOLD_OUT + RG_GREEN_RUPEE, RG_BLUE_RUPEE, RG_RED_RUPEE, RG_PURPLE_RUPEE, RG_HUGE_RUPEE, RG_ARROWS_5, RG_ARROWS_10, + RG_ARROWS_30, RG_DEKU_STICK_1, RG_DEKU_SEEDS_30, RG_DEKU_NUTS_5, RG_DEKU_NUTS_10, RG_BOMBS_5, RG_BOMBS_10, + RG_BOMBS_20, RG_BOMBCHU_5, RG_BOMBCHU_10, RG_BOMBCHU_20, RG_RECOVERY_HEART, RG_ICE_TRAP, RG_SOLD_OUT }; std::unordered_map itemImageMap = { - { RG_NONE, "ITEM_SOLD_OUT" }, - { RG_KOKIRI_SWORD, "ITEM_SWORD_KOKIRI" }, - { RG_GIANTS_KNIFE, "ITEM_SWORD_KNIFE" }, - { RG_BIGGORON_SWORD, "ITEM_SWORD_BGS" }, - { RG_DEKU_SHIELD, "ITEM_SHIELD_DEKU" }, - { RG_HYLIAN_SHIELD, "ITEM_SHIELD_HYLIAN" }, - { RG_MIRROR_SHIELD, "ITEM_SHIELD_MIRROR" }, - { RG_GORON_TUNIC, "ITEM_TUNIC_GORON" }, - { RG_ZORA_TUNIC, "ITEM_TUNIC_ZORA" }, - { RG_IRON_BOOTS, "ITEM_BOOTS_IRON" }, - { RG_HOVER_BOOTS, "ITEM_BOOTS_HOVER" }, - { RG_BOOMERANG, "ITEM_BOOMERANG" }, - { RG_LENS_OF_TRUTH, "ITEM_LENS" }, - { RG_MEGATON_HAMMER, "ITEM_HAMMER" }, - { RG_STONE_OF_AGONY, "ITEM_STONE_OF_AGONY" }, - { RG_DINS_FIRE, "ITEM_DINS_FIRE" }, - { RG_FARORES_WIND, "ITEM_FARORES_WIND" }, - { RG_NAYRUS_LOVE, "ITEM_NAYRUS_LOVE" }, - { RG_FIRE_ARROWS, "ITEM_ARROW_FIRE" }, - { RG_ICE_ARROWS, "ITEM_ARROW_ICE" }, - { RG_LIGHT_ARROWS, "ITEM_ARROW_LIGHT" }, - { RG_GERUDO_MEMBERSHIP_CARD, "ITEM_GERUDO_CARD" }, - { RG_MAGIC_BEAN, "ITEM_BEAN" }, - { RG_MAGIC_BEAN_PACK, "ITEM_BEAN" }, - { RG_DOUBLE_DEFENSE, "ITEM_HEART_CONTAINER" }, - { RG_WEIRD_EGG, "ITEM_WEIRD_EGG" }, - { RG_ZELDAS_LETTER, "ITEM_LETTER_ZELDA" }, - { RG_POCKET_EGG, "ITEM_POCKET_EGG" }, - { RG_COJIRO, "ITEM_COJIRO" }, - { RG_ODD_MUSHROOM, "ITEM_ODD_MUSHROOM" }, - { RG_ODD_POTION, "ITEM_ODD_POTION" }, - { RG_POACHERS_SAW, "ITEM_SAW" }, - { RG_BROKEN_SWORD, "ITEM_SWORD_BROKEN" }, - { RG_PRESCRIPTION, "ITEM_PRESCRIPTION" }, - { RG_EYEBALL_FROG, "ITEM_FROG" }, - { RG_EYEDROPS, "ITEM_EYEDROPS" }, - { RG_CLAIM_CHECK, "ITEM_CLAIM_CHECK" }, - { RG_GOLD_SKULLTULA_TOKEN, "ITEM_SKULL_TOKEN" }, - { RG_PROGRESSIVE_HOOKSHOT, "ITEM_HOOKSHOT" }, - { RG_PROGRESSIVE_STRENGTH, "ITEM_BRACELET" }, - { RG_PROGRESSIVE_BOMB_BAG, "ITEM_BOMB_BAG_30" }, - { RG_PROGRESSIVE_BOW, "ITEM_QUIVER_30" }, - { RG_PROGRESSIVE_SLINGSHOT, "ITEM_SLINGSHOT" }, - { RG_PROGRESSIVE_WALLET, "ITEM_WALLET_ADULT" }, - { RG_PROGRESSIVE_SCALE, "ITEM_SCALE_SILVER" }, - { RG_PROGRESSIVE_NUT_UPGRADE, "ITEM_NUT" }, - { RG_PROGRESSIVE_STICK_UPGRADE, "ITEM_STICK" }, - { RG_PROGRESSIVE_BOMBCHUS, "ITEM_BOMBCHU" }, - { RG_PROGRESSIVE_MAGIC_METER, "ITEM_MAGIC_SMALL" }, - { RG_MAGIC_SINGLE, "ITEM_MAGIC_SMALL" }, - { RG_MAGIC_DOUBLE, "ITEM_MAGIC_LARGE" }, - { RG_PROGRESSIVE_OCARINA, "ITEM_OCARINA_FAIRY" }, - { RG_PROGRESSIVE_GORONSWORD, "ITEM_SWORD_BGS" }, - { RG_EMPTY_BOTTLE, "ITEM_BOTTLE" }, - { RG_BOTTLE_WITH_MILK, "ITEM_MILK_BOTTLE" }, - { 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_RUTOS_LETTER, "ITEM_LETTER_RUTO" }, - { RG_BOTTLE_WITH_BIG_POE, "ITEM_BIG_POE" }, - { RG_ZELDAS_LULLABY, "ITEM_SONG_LULLABY" }, - { RG_EPONAS_SONG, "ITEM_SONG_EPONA" }, - { RG_SARIAS_SONG, "ITEM_SONG_SARIA" }, - { RG_SUNS_SONG, "ITEM_SONG_SUN" }, - { RG_SONG_OF_TIME, "ITEM_SONG_TIME" }, - { RG_SONG_OF_STORMS, "ITEM_SONG_STORMS" }, - { RG_MINUET_OF_FOREST, "ITEM_SONG_MINUET" }, - { RG_BOLERO_OF_FIRE, "ITEM_SONG_BOLERO" }, - { RG_SERENADE_OF_WATER, "ITEM_SONG_SERENADE" }, - { RG_REQUIEM_OF_SPIRIT, "ITEM_SONG_REQUIEM" }, - { RG_NOCTURNE_OF_SHADOW, "ITEM_SONG_NOCTURNE" }, - { RG_PRELUDE_OF_LIGHT, "ITEM_SONG_PRELUDE" }, - { RG_DEKU_TREE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_DODONGOS_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, - { RG_JABU_JABUS_BELLY_MAP, "ITEM_DUNGEON_MAP" }, - { RG_FOREST_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_FIRE_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_WATER_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_SPIRIT_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_SHADOW_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, - { RG_BOTTOM_OF_THE_WELL_MAP, "ITEM_DUNGEON_MAP" }, - { RG_ICE_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, - { RG_DEKU_TREE_COMPASS, "ITEM_COMPASS" }, - { RG_DODONGOS_CAVERN_COMPASS, "ITEM_COMPASS" }, - { RG_JABU_JABUS_BELLY_COMPASS, "ITEM_COMPASS" }, - { RG_FOREST_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_FIRE_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_WATER_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_SPIRIT_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_SHADOW_TEMPLE_COMPASS, "ITEM_COMPASS" }, - { RG_BOTTOM_OF_THE_WELL_COMPASS, "ITEM_COMPASS" }, - { RG_ICE_CAVERN_COMPASS, "ITEM_COMPASS" }, - { RG_FOREST_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_FIRE_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_WATER_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_SPIRIT_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_SHADOW_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_GANONS_CASTLE_BOSS_KEY, "ITEM_KEY_BOSS" }, - { RG_FOREST_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_FIRE_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_WATER_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_SPIRIT_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_SHADOW_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_NONE, "ITEM_SOLD_OUT" }, + { RG_KOKIRI_SWORD, "ITEM_SWORD_KOKIRI" }, + { RG_GIANTS_KNIFE, "ITEM_SWORD_KNIFE" }, + { RG_BIGGORON_SWORD, "ITEM_SWORD_BGS" }, + { RG_DEKU_SHIELD, "ITEM_SHIELD_DEKU" }, + { RG_HYLIAN_SHIELD, "ITEM_SHIELD_HYLIAN" }, + { RG_MIRROR_SHIELD, "ITEM_SHIELD_MIRROR" }, + { RG_GORON_TUNIC, "ITEM_TUNIC_GORON" }, + { RG_ZORA_TUNIC, "ITEM_TUNIC_ZORA" }, + { RG_IRON_BOOTS, "ITEM_BOOTS_IRON" }, + { RG_HOVER_BOOTS, "ITEM_BOOTS_HOVER" }, + { RG_BOOMERANG, "ITEM_BOOMERANG" }, + { RG_LENS_OF_TRUTH, "ITEM_LENS" }, + { RG_MEGATON_HAMMER, "ITEM_HAMMER" }, + { RG_STONE_OF_AGONY, "ITEM_STONE_OF_AGONY" }, + { RG_DINS_FIRE, "ITEM_DINS_FIRE" }, + { RG_FARORES_WIND, "ITEM_FARORES_WIND" }, + { RG_NAYRUS_LOVE, "ITEM_NAYRUS_LOVE" }, + { RG_FIRE_ARROWS, "ITEM_ARROW_FIRE" }, + { RG_ICE_ARROWS, "ITEM_ARROW_ICE" }, + { RG_LIGHT_ARROWS, "ITEM_ARROW_LIGHT" }, + { RG_GERUDO_MEMBERSHIP_CARD, "ITEM_GERUDO_CARD" }, + { RG_MAGIC_BEAN, "ITEM_BEAN" }, + { RG_MAGIC_BEAN_PACK, "ITEM_BEAN" }, + { RG_DOUBLE_DEFENSE, "ITEM_HEART_CONTAINER" }, + { RG_WEIRD_EGG, "ITEM_WEIRD_EGG" }, + { RG_ZELDAS_LETTER, "ITEM_LETTER_ZELDA" }, + { RG_POCKET_EGG, "ITEM_POCKET_EGG" }, + { RG_COJIRO, "ITEM_COJIRO" }, + { RG_ODD_MUSHROOM, "ITEM_ODD_MUSHROOM" }, + { RG_ODD_POTION, "ITEM_ODD_POTION" }, + { RG_POACHERS_SAW, "ITEM_SAW" }, + { RG_BROKEN_SWORD, "ITEM_SWORD_BROKEN" }, + { RG_PRESCRIPTION, "ITEM_PRESCRIPTION" }, + { RG_EYEBALL_FROG, "ITEM_FROG" }, + { RG_EYEDROPS, "ITEM_EYEDROPS" }, + { RG_CLAIM_CHECK, "ITEM_CLAIM_CHECK" }, + { RG_GOLD_SKULLTULA_TOKEN, "ITEM_SKULL_TOKEN" }, + { RG_PROGRESSIVE_HOOKSHOT, "ITEM_HOOKSHOT" }, + { RG_PROGRESSIVE_STRENGTH, "ITEM_BRACELET" }, + { RG_PROGRESSIVE_BOMB_BAG, "ITEM_BOMB_BAG_30" }, + { RG_PROGRESSIVE_BOW, "ITEM_QUIVER_30" }, + { RG_PROGRESSIVE_SLINGSHOT, "ITEM_SLINGSHOT" }, + { RG_PROGRESSIVE_WALLET, "ITEM_WALLET_ADULT" }, + { RG_PROGRESSIVE_SCALE, "ITEM_SCALE_SILVER" }, + { RG_PROGRESSIVE_NUT_UPGRADE, "ITEM_NUT" }, + { RG_PROGRESSIVE_STICK_UPGRADE, "ITEM_STICK" }, + { RG_PROGRESSIVE_BOMBCHUS, "ITEM_BOMBCHU" }, + { RG_PROGRESSIVE_MAGIC_METER, "ITEM_MAGIC_SMALL" }, + { RG_MAGIC_SINGLE, "ITEM_MAGIC_SMALL" }, + { RG_MAGIC_DOUBLE, "ITEM_MAGIC_LARGE" }, + { RG_PROGRESSIVE_OCARINA, "ITEM_OCARINA_FAIRY" }, + { RG_PROGRESSIVE_GORONSWORD, "ITEM_SWORD_BGS" }, + { RG_EMPTY_BOTTLE, "ITEM_BOTTLE" }, + { RG_BOTTLE_WITH_MILK, "ITEM_MILK_BOTTLE" }, + { 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_RUTOS_LETTER, "ITEM_LETTER_RUTO" }, + { RG_BOTTLE_WITH_BIG_POE, "ITEM_BIG_POE" }, + { RG_ZELDAS_LULLABY, "ITEM_SONG_LULLABY" }, + { RG_EPONAS_SONG, "ITEM_SONG_EPONA" }, + { RG_SARIAS_SONG, "ITEM_SONG_SARIA" }, + { RG_SUNS_SONG, "ITEM_SONG_SUN" }, + { RG_SONG_OF_TIME, "ITEM_SONG_TIME" }, + { RG_SONG_OF_STORMS, "ITEM_SONG_STORMS" }, + { RG_MINUET_OF_FOREST, "ITEM_SONG_MINUET" }, + { RG_BOLERO_OF_FIRE, "ITEM_SONG_BOLERO" }, + { RG_SERENADE_OF_WATER, "ITEM_SONG_SERENADE" }, + { RG_REQUIEM_OF_SPIRIT, "ITEM_SONG_REQUIEM" }, + { RG_NOCTURNE_OF_SHADOW, "ITEM_SONG_NOCTURNE" }, + { RG_PRELUDE_OF_LIGHT, "ITEM_SONG_PRELUDE" }, + { RG_DEKU_TREE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_DODONGOS_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, + { RG_JABU_JABUS_BELLY_MAP, "ITEM_DUNGEON_MAP" }, + { RG_FOREST_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_FIRE_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_WATER_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_SPIRIT_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_SHADOW_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, + { RG_BOTTOM_OF_THE_WELL_MAP, "ITEM_DUNGEON_MAP" }, + { RG_ICE_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, + { RG_DEKU_TREE_COMPASS, "ITEM_COMPASS" }, + { RG_DODONGOS_CAVERN_COMPASS, "ITEM_COMPASS" }, + { RG_JABU_JABUS_BELLY_COMPASS, "ITEM_COMPASS" }, + { RG_FOREST_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_FIRE_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_WATER_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_SPIRIT_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_SHADOW_TEMPLE_COMPASS, "ITEM_COMPASS" }, + { RG_BOTTOM_OF_THE_WELL_COMPASS, "ITEM_COMPASS" }, + { RG_ICE_CAVERN_COMPASS, "ITEM_COMPASS" }, + { RG_FOREST_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_FIRE_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_WATER_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_SPIRIT_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_SHADOW_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_GANONS_CASTLE_BOSS_KEY, "ITEM_KEY_BOSS" }, + { RG_FOREST_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_FIRE_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_WATER_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_SPIRIT_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_SHADOW_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_GERUDO_TRAINING_GROUND_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_GERUDO_FORTRESS_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_GANONS_CASTLE_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_TREASURE_GAME_SMALL_KEY, "ITEM_KEY_SMALL" }, - { RG_KOKIRI_EMERALD, "ITEM_KOKIRI_EMERALD" }, - { RG_GORON_RUBY, "ITEM_GORON_RUBY" }, - { RG_ZORA_SAPPHIRE, "ITEM_ZORA_SAPPHIRE" }, - { RG_FOREST_MEDALLION, "ITEM_MEDALLION_FOREST" }, - { RG_FIRE_MEDALLION, "ITEM_MEDALLION_FIRE" }, - { RG_WATER_MEDALLION, "ITEM_MEDALLION_WATER" }, - { RG_SPIRIT_MEDALLION, "ITEM_MEDALLION_SPIRIT" }, - { RG_SHADOW_MEDALLION, "ITEM_MEDALLION_SHADOW" }, - { RG_LIGHT_MEDALLION, "ITEM_MEDALLION_LIGHT" }, - { RG_RECOVERY_HEART, "ITEM_HEART_GRAYSCALE" }, - { RG_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_GREG_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_BLUE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_RED_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_PURPLE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_HUGE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_TREASURE_GAME_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, - { RG_PIECE_OF_HEART, "ITEM_HEART_PIECE" }, - { RG_HEART_CONTAINER, "ITEM_HEART_CONTAINER" }, - { RG_ICE_TRAP, "ITEM_ICE_TRAP" }, - { RG_MILK, "ITEM_MILK_BOTTLE"}, - { RG_BOMBS_5, "ITEM_BOMB" }, - { RG_BOMBS_10, "ITEM_BOMB" }, - { RG_BOMBS_20, "ITEM_BOMB" }, - { RG_BUY_BOMBS_525, "ITEM_BOMB" }, - { RG_BUY_BOMBS_535, "ITEM_BOMB" }, - { RG_BUY_BOMBS_10, "ITEM_BOMB" }, - { RG_BUY_BOMBS_20, "ITEM_BOMB" }, - { RG_BUY_BOMBS_30, "ITEM_BOMB" }, - { RG_DEKU_NUTS_5, "ITEM_NUT" }, - { RG_DEKU_NUTS_10, "ITEM_NUT" }, - { RG_BUY_DEKU_NUTS_5, "ITEM_NUT" }, - { RG_BUY_DEKU_NUTS_10, "ITEM_NUT" }, - { RG_BOMBCHU_5, "ITEM_BOMBCHU" }, - { RG_BOMBCHU_10, "ITEM_BOMBCHU" }, - { RG_BOMBCHU_20, "ITEM_BOMBCHU" }, - { RG_BUY_BOMBCHUS_20, "ITEM_BOMBCHU" }, - { RG_ARROWS_5, "ITEM_ARROWS_SMALL" }, - { RG_BUY_ARROWS_10, "ITEM_ARROWS_SMALL" }, - { RG_ARROWS_10, "ITEM_ARROWS_MEDIUM" }, - { RG_BUY_ARROWS_30, "ITEM_ARROWS_MEDIUM" }, - { RG_ARROWS_30, "ITEM_ARROWS_LARGE" }, - { RG_BUY_ARROWS_50, "ITEM_ARROWS_LARGE" }, - { RG_TREASURE_GAME_HEART, "ITEM_HEART_PIECE" }, - { RG_DEKU_SEEDS_30, "ITEM_SEEDS" }, - { RG_BUY_DEKU_SEEDS_30, "ITEM_SEEDS" }, - { RG_BUY_HEART, "ITEM_HEART_GRAYSCALE" }, - { RG_FISHING_POLE, "ITEM_FISHING_POLE" }, - { RG_SOLD_OUT, "ITEM_SOLD_OUT" }, - { RG_TRIFORCE_PIECE, "TRIFORCE_PIECE" }, - { RG_SKELETON_KEY, "ITEM_KEY_SMALL" } + { RG_GERUDO_FORTRESS_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_GANONS_CASTLE_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_TREASURE_GAME_SMALL_KEY, "ITEM_KEY_SMALL" }, + { RG_KOKIRI_EMERALD, "ITEM_KOKIRI_EMERALD" }, + { RG_GORON_RUBY, "ITEM_GORON_RUBY" }, + { RG_ZORA_SAPPHIRE, "ITEM_ZORA_SAPPHIRE" }, + { RG_FOREST_MEDALLION, "ITEM_MEDALLION_FOREST" }, + { RG_FIRE_MEDALLION, "ITEM_MEDALLION_FIRE" }, + { RG_WATER_MEDALLION, "ITEM_MEDALLION_WATER" }, + { RG_SPIRIT_MEDALLION, "ITEM_MEDALLION_SPIRIT" }, + { RG_SHADOW_MEDALLION, "ITEM_MEDALLION_SHADOW" }, + { RG_LIGHT_MEDALLION, "ITEM_MEDALLION_LIGHT" }, + { RG_RECOVERY_HEART, "ITEM_HEART_GRAYSCALE" }, + { RG_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_GREG_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_BLUE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_RED_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_PURPLE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_HUGE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_TREASURE_GAME_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, + { RG_PIECE_OF_HEART, "ITEM_HEART_PIECE" }, + { RG_HEART_CONTAINER, "ITEM_HEART_CONTAINER" }, + { RG_ICE_TRAP, "ITEM_ICE_TRAP" }, + { RG_MILK, "ITEM_MILK_BOTTLE" }, + { RG_BOMBS_5, "ITEM_BOMB" }, + { RG_BOMBS_10, "ITEM_BOMB" }, + { RG_BOMBS_20, "ITEM_BOMB" }, + { RG_BUY_BOMBS_525, "ITEM_BOMB" }, + { RG_BUY_BOMBS_535, "ITEM_BOMB" }, + { RG_BUY_BOMBS_10, "ITEM_BOMB" }, + { RG_BUY_BOMBS_20, "ITEM_BOMB" }, + { RG_BUY_BOMBS_30, "ITEM_BOMB" }, + { RG_DEKU_NUTS_5, "ITEM_NUT" }, + { RG_DEKU_NUTS_10, "ITEM_NUT" }, + { RG_BUY_DEKU_NUTS_5, "ITEM_NUT" }, + { RG_BUY_DEKU_NUTS_10, "ITEM_NUT" }, + { RG_BOMBCHU_5, "ITEM_BOMBCHU" }, + { RG_BOMBCHU_10, "ITEM_BOMBCHU" }, + { RG_BOMBCHU_20, "ITEM_BOMBCHU" }, + { RG_BUY_BOMBCHUS_20, "ITEM_BOMBCHU" }, + { RG_ARROWS_5, "ITEM_ARROWS_SMALL" }, + { RG_BUY_ARROWS_10, "ITEM_ARROWS_SMALL" }, + { RG_ARROWS_10, "ITEM_ARROWS_MEDIUM" }, + { RG_BUY_ARROWS_30, "ITEM_ARROWS_MEDIUM" }, + { RG_ARROWS_30, "ITEM_ARROWS_LARGE" }, + { RG_BUY_ARROWS_50, "ITEM_ARROWS_LARGE" }, + { RG_TREASURE_GAME_HEART, "ITEM_HEART_PIECE" }, + { RG_DEKU_SEEDS_30, "ITEM_SEEDS" }, + { RG_BUY_DEKU_SEEDS_30, "ITEM_SEEDS" }, + { RG_BUY_HEART, "ITEM_HEART_GRAYSCALE" }, + { RG_FISHING_POLE, "ITEM_FISHING_POLE" }, + { RG_SOLD_OUT, "ITEM_SOLD_OUT" }, + { RG_TRIFORCE_PIECE, "TRIFORCE_PIECE" }, + { RG_SKELETON_KEY, "ITEM_KEY_SMALL" } }; Rando::Item plandomizerRandoRetrieveItem(RandomizerGet randoGetItem) { @@ -271,70 +259,71 @@ Rando::Item plandomizerRandoRetrieveItem(RandomizerGet randoGetItem) { return randoGetItemEntry; } -void PlandoPushImageButtonStyle(){ +void PlandoPushImageButtonStyle() { ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 1.0f, 1.0f, 0.2f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 0.1f)); } -void PlandoPopImageButtonStyle(){ +void PlandoPopImageButtonStyle() { ImGui::PopStyleColor(3); } ImVec4 plandomizerGetItemColor(Rando::Item randoItem) { - itemColor = ImVec4( 1.0f, 1.0f, 1.0f, 1.0f ); - if (randoItem.GetItemType() == ITEMTYPE_SMALLKEY || randoItem.GetItemType() == ITEMTYPE_FORTRESS_SMALLKEY - || randoItem.GetItemType() == ITEMTYPE_BOSSKEY) { - if (randoItem.GetRandomizerGet() == RG_FOREST_TEMPLE_SMALL_KEY || + itemColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + if (randoItem.GetItemType() == ITEMTYPE_SMALLKEY || randoItem.GetItemType() == ITEMTYPE_FORTRESS_SMALLKEY || + randoItem.GetItemType() == ITEMTYPE_BOSSKEY) { + if (randoItem.GetRandomizerGet() == RG_FOREST_TEMPLE_SMALL_KEY || randoItem.GetRandomizerGet() == RG_FOREST_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.02f, 0.76f, 0.18f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.93f, 0.37f, 0.37f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.33f, 0.71f, 0.87f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.87f, 0.62f, 0.18f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_KEY_RING) { - itemColor = ImVec4( 0.49f, 0.06f, 0.69f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_KEY_RING) { - itemColor = ImVec4( 0.89f, 0.43f, 1.0f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_KEY_RING) { - itemColor = ImVec4( 1.0f, 1.0f, 0, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_KEY_RING) { - itemColor = ImVec4( 1.0f, 1.0f, 1.0f, 1.0f ); - } else if (randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_SMALL_KEY || - randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_KEY_RING) { - itemColor = ImVec4( 0.5f, 0.5f, 0.5f, 1.0f ); + itemColor = ImVec4(0.02f, 0.76f, 0.18f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_FIRE_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.93f, 0.37f, 0.37f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_WATER_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.33f, 0.71f, 0.87f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_SPIRIT_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.87f, 0.62f, 0.18f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_SHADOW_TEMPLE_KEY_RING) { + itemColor = ImVec4(0.49f, 0.06f, 0.69f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_BOTTOM_OF_THE_WELL_KEY_RING) { + itemColor = ImVec4(0.89f, 0.43f, 1.0f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_GERUDO_TRAINING_GROUND_KEY_RING) { + itemColor = ImVec4(1.0f, 1.0f, 0, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_GERUDO_FORTRESS_KEY_RING) { + itemColor = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + } else if (randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_SMALL_KEY || + randoItem.GetRandomizerGet() == RG_GANONS_CASTLE_KEY_RING) { + itemColor = ImVec4(0.5f, 0.5f, 0.5f, 1.0f); } return itemColor; } if (randoItem.GetItemType() == ITEMTYPE_SONG) { uint32_t questID = Rando::Logic::RandoGetToQuestItem[randoItem.GetRandomizerGet()]; - textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(songMapping.at((QuestItem)questID).name); + textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + songMapping.at((QuestItem)questID).name); itemColor = songMapping.at((QuestItem)questID).color; imageSize = ImVec2(24.0f, 32.0f); imagePadding = 6.0f; return itemColor; } if (randoItem.GetRandomizerGet() >= RG_GREEN_RUPEE && randoItem.GetRandomizerGet() <= RG_HUGE_RUPEE) { - if (randoItem.GetRandomizerGet() == RG_GREG_RUPEE || randoItem.GetRandomizerGet() == RG_GREEN_RUPEE - || randoItem.GetRandomizerGet() == RG_TREASURE_GAME_GREEN_RUPEE) { - itemColor = ImVec4( 0.02f, 0.76f, 0.18f, 1.0f ); + if (randoItem.GetRandomizerGet() == RG_GREG_RUPEE || randoItem.GetRandomizerGet() == RG_GREEN_RUPEE || + randoItem.GetRandomizerGet() == RG_TREASURE_GAME_GREEN_RUPEE) { + itemColor = ImVec4(0.02f, 0.76f, 0.18f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_BLUE_RUPEE) { - itemColor = ImVec4( 0.33f, 0.71f, 0.87f, 1.0f ); + itemColor = ImVec4(0.33f, 0.71f, 0.87f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_RED_RUPEE) { - itemColor = ImVec4( 0.93f, 0.37f, 0.37f, 1.0f ); + itemColor = ImVec4(0.93f, 0.37f, 0.37f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_PURPLE_RUPEE) { - itemColor = ImVec4( 0.89f, 0.43f, 1.0f, 1.0f ); + itemColor = ImVec4(0.89f, 0.43f, 1.0f, 1.0f); } else if (randoItem.GetRandomizerGet() == RG_HUGE_RUPEE) { - itemColor = ImVec4( 1.0f, 1.0f, 0, 1.0f ); + itemColor = ImVec4(1.0f, 1.0f, 0, 1.0f); } return itemColor; } @@ -342,18 +331,17 @@ ImVec4 plandomizerGetItemColor(Rando::Item randoItem) { if (randoItem.GetRandomizerGet() >= RG_GOHMA_SOUL && randoItem.GetRandomizerGet() <= RG_GANON_SOUL) { itemColor = bossSoulColorMapping.at(randoItem.GetRandomizerGet()); } - + return itemColor; } std::string plandomizerHintsTooltip() { std::string hintTootip; - hintTootip = - "The following options are available:\n" - "- Use \\n to create New Lines.\n" - "- Use %g to change the text color to Green,\n" - " - %r for Red, %y for Yellow, and %w for White\n" - " can also be used as color examples."; + hintTootip = "The following options are available:\n" + "- Use \\n to create New Lines.\n" + "- Use %g to change the text color to Green,\n" + " - %r for Red, %y for Yellow, and %w for White\n" + " can also be used as color examples."; return hintTootip; } @@ -383,11 +371,10 @@ void PlandomizerPopulateSeedList() { void PlandomizerItemImageCorrection(Rando::Item randoItem) { textureID = 0; - imageSize = ImVec2( 32.0f, 32.0f ); + imageSize = ImVec2(32.0f, 32.0f); imagePadding = 2.0f; - textureUV0 = ImVec2( 0, 0 ); - textureUV1 = ImVec2( 1, 1 ); - + textureUV0 = ImVec2(0, 0); + textureUV1 = ImVec2(1, 1); itemColor = plandomizerGetItemColor(randoItem); @@ -404,12 +391,12 @@ void PlandomizerItemImageCorrection(Rando::Item randoItem) { if (map.first == randoItem.GetRandomizerGet()) { textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(map.second.c_str()); if (map.second.find("ITEM_ARROWS") != std::string::npos) { - textureUV0 = ImVec2( 0, 1 ); - textureUV1 = ImVec2( 1, 0 ); + textureUV0 = ImVec2(0, 1); + textureUV1 = ImVec2(1, 0); } if (map.second == "ITEM_TRIFORCE" || map.first == RG_SKELETON_KEY) { - textureUV0 = ImVec2( 1, 1 ); - textureUV1 = ImVec2( 0, 0 ); + textureUV0 = ImVec2(1, 1); + textureUV1 = ImVec2(0, 0); } break; } @@ -419,21 +406,25 @@ void PlandomizerItemImageCorrection(Rando::Item randoItem) { textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("BOSS_SOUL"); } - if (randoItem.GetRandomizerGet() >= RG_OCARINA_A_BUTTON && randoItem.GetRandomizerGet() <= RG_OCARINA_C_RIGHT_BUTTON) { + if (randoItem.GetRandomizerGet() >= RG_OCARINA_A_BUTTON && + randoItem.GetRandomizerGet() <= RG_OCARINA_C_RIGHT_BUTTON) { textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("ITEM_OCARINA_TIME"); } if (textureID == 0) { - textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemMapping[randoItem.GetGIEntry()->itemId].name); + textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + itemMapping[randoItem.GetGIEntry()->itemId].name); } } void PlandomizerRandomizeHint(int32_t status, int32_t index) { if (status == HINT_SINGLE) { - plandoHintData[index].hintText = Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); + plandoHintData[index].hintText = + Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); } else { for (auto& hint : plandoHintData) { - hint.hintText = Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); + hint.hintText = + Rando::StaticData::hintTextTable[GetRandomJunkHint()].GetHintMessage().GetForCurrentLanguage(MF_ENCODE); } } } @@ -447,15 +438,14 @@ void PlandomizerRemoveAllHints() { } void PlandomizerSortDrawnItems() { - std::sort(drawnItemsList.begin(), drawnItemsList.end(), - [](const auto& a, const auto& b) { + std::sort(drawnItemsList.begin(), drawnItemsList.end(), [](const auto& a, const auto& b) { auto typeA = a.first.GetItemType(); auto typeB = b.first.GetItemType(); - if (typeA != typeB){ - return typeA < typeB; + if (typeA != typeB) { + return typeA < typeB; } return a.first.GetRandomizerGet() < b.first.GetRandomizerGet(); - }); + }); } void PlandomizerRemoveAllItems() { @@ -463,7 +453,8 @@ void PlandomizerRemoveAllItems() { drawnItemsList.clear(); } for (auto& remove : plandoLogData) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), remove.checkRewardItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), remove.checkRewardItem.GetRandomizerGet()) == + infiniteItemList.end()) { bool itemExists = false; for (auto& itemToCheck : drawnItemsList) { if (itemToCheck.first.GetRandomizerGet() == remove.checkRewardItem.GetRandomizerGet()) { @@ -482,7 +473,8 @@ void PlandomizerRemoveAllItems() { } void PlandomizerRemoveFromItemList(Rando::Item randoItem) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == + infiniteItemList.end()) { uint32_t index = 0; for (auto& itemToCheck : drawnItemsList) { if (itemToCheck.first.GetRandomizerGet() == randoItem.GetRandomizerGet()) { @@ -501,7 +493,8 @@ void PlandomizerRemoveFromItemList(Rando::Item randoItem) { } void PlandomizerAddToItemList(Rando::Item randoItem) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), randoItem.GetRandomizerGet()) == + infiniteItemList.end()) { bool itemExists = false; for (auto& itemToCheck : drawnItemsList) { if (itemToCheck.first.GetRandomizerGet() == randoItem.GetRandomizerGet()) { @@ -510,7 +503,7 @@ void PlandomizerAddToItemList(Rando::Item randoItem) { break; } } - + if (!itemExists) { drawnItemsList.push_back(std::make_pair(randoItem, 1)); } @@ -528,32 +521,24 @@ void PlandomizerSaveSpoilerLog() { inputFile.close(); } - spoilerSave["file_hash"] = { - plandoHash[0], plandoHash[1], plandoHash[2], plandoHash[3], plandoHash[4] - }; + spoilerSave["file_hash"] = { plandoHash[0], plandoHash[1], plandoHash[2], plandoHash[3], plandoHash[4] }; for (auto& import : plandoHintData) { - spoilerSave["Gossip Stone Hints"][import.hintName] = { - { "type", import.hintType.c_str() }, - { "message", import.hintText.c_str() } - }; + spoilerSave["Gossip Stone Hints"][import.hintName] = { { "type", import.hintType.c_str() }, + { "message", import.hintText.c_str() } }; } - + for (auto& import : plandoLogData) { if (import.checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { - spoilerSave["locations"][import.checkName] = { - { "item", import.checkRewardItem.GetName().english }, - { "model", import.iceTrapModel.GetName().english }, - { "trickName", import.iceTrapName.c_str() } - }; + spoilerSave["locations"][import.checkName] = { { "item", import.checkRewardItem.GetName().english }, + { "model", import.iceTrapModel.GetName().english }, + { "trickName", import.iceTrapName.c_str() } }; if (import.shopPrice > -1) { spoilerSave["locations"][import.checkName]["price"] = import.shopPrice; } } else if (import.shopPrice > -1) { - spoilerSave["locations"][import.checkName] = { - { "item", import.checkRewardItem.GetName().english }, - { "price", import.shopPrice } - }; + spoilerSave["locations"][import.checkName] = { { "item", import.checkRewardItem.GetName().english }, + { "price", import.shopPrice } }; } else { spoilerSave["locations"][import.checkName] = import.checkRewardItem.GetName().english; } @@ -563,7 +548,7 @@ void PlandomizerSaveSpoilerLog() { if (outputFile.is_open()) { outputFile << spoilerSave.dump(4); outputFile.close(); - } + } } void PlandomizerLoadSpoilerLog(std::string logFile) { @@ -621,21 +606,24 @@ void PlandomizerLoadSpoilerLog(std::string logFile) { checkObject.checkName = key; auto type = value; if (value.is_object()) { - checkObject.checkRewardItem = plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["item"]]); + checkObject.checkRewardItem = + plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["item"]]); if (value["price"].is_number()) { checkObject.shopPrice = value["price"]; } else { checkObject.shopPrice = -1; } if (checkObject.checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { - checkObject.iceTrapModel = plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["model"]]); + checkObject.iceTrapModel = + plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value["model"]]); checkObject.iceTrapName = value["trickName"]; } } else { - checkObject.checkRewardItem = plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value.get()]); + checkObject.checkRewardItem = + plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value.get()]); checkObject.shopPrice = -1; - if (checkObject.shopPrice == -1 - && checkObject.checkRewardItem.GetName().english.find("Buy") != std::string::npos) { + if (checkObject.shopPrice == -1 && + checkObject.checkRewardItem.GetName().english.find("Buy") != std::string::npos) { checkObject.shopPrice = checkObject.checkRewardItem.GetPrice(); } } @@ -651,7 +639,7 @@ void PlandomizerLoadSpoilerLog(std::string logFile) { lastLoadedSpoiler = spoilerStr; } -void PlandomizerOverlayText(std::pair drawObject ) { +void PlandomizerOverlayText(std::pair drawObject) { // Overlay the item count text on the existing button ImVec2 imageMin = ImGui::GetItemRectMin(); ImVec2 imageMax = ImGui::GetItemRectMax(); @@ -662,15 +650,15 @@ void PlandomizerOverlayText(std::pair drawObject ) { ImGui::Text(std::to_string(drawObject.second).c_str()); // Overlay item info - if (drawObject.first.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && + if (drawObject.first.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && drawObject.first.GetRandomizerGet() <= RG_PROGRESSIVE_GORONSWORD) { textPos = ImVec2(imageMin.x + 2, imageMin.y + 2); ImGui::SetCursorScreenPos(textPos); ImGui::Text("+"); } - if (extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "" && - extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "WINNER" && + if (extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "" && + extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "WINNER" && extractNumberInParentheses(drawObject.first.GetName().english.c_str()) != "LOSER") { textPos = ImVec2(imageMin.x + 2, imageMin.y + 2); @@ -679,7 +667,7 @@ void PlandomizerOverlayText(std::pair drawObject ) { overlayText += extractNumberInParentheses(drawObject.first.GetName().english.c_str()); ImGui::Text(overlayText.c_str()); } - if (drawObject.first.GetRandomizerGet() >= RG_FOREST_TEMPLE_BOSS_KEY && + if (drawObject.first.GetRandomizerGet() >= RG_FOREST_TEMPLE_BOSS_KEY && drawObject.first.GetRandomizerGet() <= RG_GANONS_CASTLE_BOSS_KEY) { textPos = ImVec2(imageMin.x + 1, imageMin.y + 1); ImGui::SetCursorScreenPos(textPos); @@ -718,10 +706,12 @@ void PlandomizerDrawItemPopup(uint32_t index) { PlandomizerItemImageCorrection(plandomizerRandoRetrieveItem(item)); auto name = plandomizerRandoRetrieveItem(item).GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, + ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { - if (std::find(infiniteItemList.begin(), infiniteItemList.end(), plandoLogData[index].checkRewardItem.GetRandomizerGet()) == infiniteItemList.end()) { + if (std::find(infiniteItemList.begin(), infiniteItemList.end(), + plandoLogData[index].checkRewardItem.GetRandomizerGet()) == infiniteItemList.end()) { PlandomizerAddToItemList(plandoLogData[index].checkRewardItem); } plandoLogData[index].checkRewardItem = plandomizerRandoRetrieveItem(item); @@ -731,8 +721,7 @@ void PlandomizerDrawItemPopup(uint32_t index) { PlandomizerOverlayText(std::make_pair(plandomizerRandoRetrieveItem(item), 1)); ImGui::PopID(); } - - + ImGui::EndTable(); ImGui::SeparatorText("Spoiler Log Rewards"); ImGui::BeginTable("Item Button Table", 8); @@ -747,10 +736,11 @@ void PlandomizerDrawItemPopup(uint32_t index) { PlandomizerItemImageCorrection(drawSlots.first); auto name = drawSlots.first.GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, + ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { - if (itemToDraw.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && + if (itemToDraw.GetRandomizerGet() >= RG_PROGRESSIVE_HOOKSHOT && itemToDraw.GetRandomizerGet() <= RG_PROGRESSIVE_GORONSWORD) { plandoLogData[index].checkRewardItem = drawSlots.first; } else { @@ -796,7 +786,8 @@ void PlandomizerDrawIceTrapPopUp(uint32_t index) { auto name = Rando::StaticData::RetrieveItem(items.first).GetName().english; PlandomizerItemImageCorrection(Rando::StaticData::RetrieveItem(items.first)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, + ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { plandoLogData[index].iceTrapModel = Rando::StaticData::RetrieveItem(items.first); @@ -821,7 +812,8 @@ void PlandomizerDrawItemSlots(uint32_t index) { PlandomizerItemImageCorrection(plandoLogData[index].checkRewardItem); auto name = plandoLogData[index].checkRewardItem.GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = + ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { shouldPopup = true; @@ -837,9 +829,15 @@ void PlandomizerDrawItemSlots(uint32_t index) { void PlandomizerDrawShopSlider(uint32_t index) { ImGui::PushID(index); - UIWidgets::SliderInt("Price:", &plandoLogData[index].shopPrice, UIWidgets::IntSliderOptions() - .Color(THEME_COLOR).Format("%d Rupees").Min(0).Max(999).LabelPosition(UIWidgets::LabelPositions::Near) - .ComponentAlignment(UIWidgets::ComponentAlignments::Right).Size(UIWidgets::Sizes::Inline)); + UIWidgets::SliderInt("Price:", &plandoLogData[index].shopPrice, + UIWidgets::IntSliderOptions() + .Color(THEME_COLOR) + .Format("%d Rupees") + .Min(0) + .Max(999) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Size(UIWidgets::Sizes::Inline)); ImGui::PopID(); } @@ -857,7 +855,8 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { PlandoPushImageButtonStyle(); auto name = plandoLogData[index].iceTrapModel.GetName().english; ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(imagePadding, imagePadding)); - auto ret = ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); + auto ret = + ImGui::ImageButton(name.c_str(), textureID, imageSize, textureUV0, textureUV1, ImVec4(0, 0, 0, 0), itemColor); ImGui::PopStyleVar(); if (ret) { shouldTrapPopup = true; @@ -870,23 +869,29 @@ void PlandomizerDrawIceTrapSetup(uint32_t index) { ImGui::TableNextColumn(); ImGui::Text("Name: "); ImGui::SameLine(); - if (plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_NONE && + if (plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_NONE && plandoLogData[index].iceTrapModel.GetRandomizerGet() != RG_SOLD_OUT) { - if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { - plandoLogData[index].iceTrapName = - GetIceTrapName(plandoLogData[index].iceTrapModel.GetRandomizerGet()).GetForLanguage(CVarGetInteger(CVAR_SETTING("Languages"), 0)).c_str(); + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.f, 6.f)))) { + plandoLogData[index].iceTrapName = GetIceTrapName(plandoLogData[index].iceTrapModel.GetRandomizerGet()) + .GetForLanguage(CVarGetInteger(CVAR_SETTING("Languages"), 0)) + .c_str(); } ImGui::SameLine(); } - if (UIWidgets::InputString("##TrapName", &trapTextInput, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None))) { - plandoLogData[index].iceTrapName = trapTextInput.c_str(); - } - + if (UIWidgets::InputString( + "##TrapName", &trapTextInput, + UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None))) { + plandoLogData[index].iceTrapName = trapTextInput.c_str(); + } + if (plandoLogData[index].shopPrice >= 0) { PlandomizerDrawShopSlider(index); } ImGui::EndTable(); - + ImGui::PopID(); } static std::unordered_map rcAreaNameMap = { @@ -933,9 +938,10 @@ void PlandomizerDrawOptions() { PlandomizerPopulateSeedList(); static size_t selectedList = 0; if (existingSeedList.size() != 0) { - UIWidgets::Combobox("##JsonFiles", &selectedList, existingSeedList, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None)); - } - else { + UIWidgets::Combobox( + "##JsonFiles", &selectedList, existingSeedList, + UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None)); + } else { ImGui::Text("No Spoiler Logs found."); } ImGui::BeginDisabled(existingSeedList.empty()); @@ -965,29 +971,32 @@ void PlandomizerDrawOptions() { PlandoPushImageButtonStyle(); for (auto& hash : plandoHash) { ImGui::PushID(index); - textureID = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(gSeedTextures[hash].tex); + textureID = + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(gSeedTextures[hash].tex); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 2.0f)); - auto upRet = ImGui::ImageButton("HASH_ARROW_UP", Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_UP"), - ImVec2(35.0f, 18.0f), ImVec2(1, 1), ImVec2(0, 0), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); + auto upRet = ImGui::ImageButton( + "HASH_ARROW_UP", + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_UP"), + ImVec2(35.0f, 18.0f), ImVec2(1, 1), ImVec2(0, 0), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); ImGui::PopStyleVar(); if (upRet) { if (hash + 1 >= gSeedTextures.size()) { hash = 0; - } - else { + } else { hash++; } } ImGui::Image(textureID, ImVec2(35.0f, 35.0f)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 2.0f)); - auto downRet = ImGui::ImageButton("HASH_ARROW_DWN", Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_DWN"), - ImVec2(35.0f, 18.0f), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); + auto downRet = ImGui::ImageButton( + "HASH_ARROW_DWN", + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("HASH_ARROW_DWN"), + ImVec2(35.0f, 18.0f), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)); ImGui::PopStyleVar(); if (downRet) { if (hash == 0) { hash = gSeedTextures.size() - 1; - } - else { + } else { hash--; } } @@ -1000,13 +1009,12 @@ void PlandomizerDrawOptions() { PlandoPopImageButtonStyle(); ImGui::EndTable(); } - } - else { + } else { ImGui::Text("No Spoiler Log Loaded"); } ImGui::EndTable(); } - + ImGui::SeparatorText("Options"); if (plandoLogData.size() == 0) { ImGui::Text("Please Load Spoiler Data..."); @@ -1014,19 +1022,28 @@ void PlandomizerDrawOptions() { } if (getTabID == TAB_HINTS) { - if (UIWidgets::Button("Clear All Hints", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Clear All Hints", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerRemoveAllHints(); } ImGui::SameLine(); - if (UIWidgets::Button("Randomize All Hints", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Randomize All Hints", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { PlandomizerRandomizeHint(HINT_ALL, 0); } } if (getTabID == TAB_LOCATIONS) { if (plandoLogData.size() > 0) { - UIWidgets::Combobox("Filter by Area:##AreaFilter", &selectedArea, rcAreaNameMap, UIWidgets::ComboboxOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::Near).ComponentAlignment(UIWidgets::ComponentAlignments::Right)); + UIWidgets::Combobox("Filter by Area:##AreaFilter", &selectedArea, rcAreaNameMap, + UIWidgets::ComboboxOptions() + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPositions::Near) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right)); ImGui::SameLine(); - if (UIWidgets::Button("Empty All Rewards", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { + if (UIWidgets::Button("Empty All Rewards", UIWidgets::ButtonOptions() + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline) + .Padding(ImVec2(10.f, 6.f)))) { PlandomizerRemoveAllItems(); } } @@ -1056,12 +1073,20 @@ void PlandomizerDrawHintsWindow() { } ImGui::Text("New Hint: "); ImGui::SameLine(); - if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions().Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)).Size(UIWidgets::Sizes::Inline).Tooltip("Randomize Hint"))) { + if (UIWidgets::Button(randomizeButton.c_str(), UIWidgets::ButtonOptions() + .Color(THEME_COLOR) + .Padding(ImVec2(10.f, 6.f)) + .Size(UIWidgets::Sizes::Inline) + .Tooltip("Randomize Hint"))) { PlandomizerRandomizeHint(HINT_SINGLE, index); } ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - 10); - if (UIWidgets::InputString("##HintMessage", &hintInputText, UIWidgets::InputOptions().Color(THEME_COLOR).LabelPosition(UIWidgets::LabelPositions::None).Tooltip(plandomizerHintsTooltip().c_str()))) { + if (UIWidgets::InputString("##HintMessage", &hintInputText, + UIWidgets::InputOptions() + .Color(THEME_COLOR) + .LabelPosition(UIWidgets::LabelPositions::None) + .Tooltip(plandomizerHintsTooltip().c_str()))) { plandoHintData[index].hintText = hintInputText.c_str(); } index++; @@ -1079,7 +1104,8 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { if (ImGui::BeginTable("Locations Window", 4, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_ScrollY)) { ImGui::TableSetupColumn("Spoiler Log Check Name", ImGuiTableColumnFlags_WidthFixed, 250.0f); ImGui::TableSetupColumn("Spoiler Log Reward", ImGuiTableColumnFlags_WidthFixed, 190.0f); - ImGui::TableSetupColumn("New Reward", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, 34.0f); + ImGui::TableSetupColumn("New Reward", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, + 34.0f); ImGui::TableSetupColumn("Additional Options"); ImGui::TableSetupScrollFreeze(0, 1); ImGui::TableHeadersRow(); @@ -1097,8 +1123,7 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { if (plandoLogData[index].checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { ImGui::TableNextColumn(); PlandomizerDrawIceTrapSetup(index); - } - else if (spoilerData.shopPrice != -1) { + } else if (spoilerData.shopPrice != -1) { ImGui::TableNextColumn(); ImGui::BeginTable("Shops", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInner); ImGui::TableSetupColumn("Shop Price"); @@ -1106,8 +1131,7 @@ void PlandomizerDrawLocationsWindow(RandomizerCheckArea rcArea) { ImGui::TableNextColumn(); PlandomizerDrawShopSlider(index); ImGui::EndTable(); - } - else { + } else { ImGui::TableNextColumn(); } } @@ -1145,15 +1169,25 @@ void PlandomizerWindow::DrawElement() { } void PlandomizerWindow::InitElement() { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_RUPEE_GRAYSCALE", gRupeeCounterIconTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_HEART_GRAYSCALE", gHeartFullTex, ImVec4(0.87f, 0.10f, 0.10f, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_SEEDS", gItemIconDekuSeedsTex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_SMALL", gDropArrows1Tex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_MEDIUM", gDropArrows2Tex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_LARGE", gDropArrows3Tex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ICE_TRAP", gMagicArrowEquipEffectTex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_UP", gEmptyCDownArrowTex, ImVec4( 1, 1, 1, 1 )); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_DWN", gEmptyCDownArrowTex, ImVec4( 1, 1, 1, 1 )); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_RUPEE_GRAYSCALE", gRupeeCounterIconTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_HEART_GRAYSCALE", gHeartFullTex, + ImVec4(0.87f, 0.10f, 0.10f, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_SEEDS", gItemIconDekuSeedsTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_SMALL", gDropArrows1Tex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_MEDIUM", gDropArrows2Tex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ARROWS_LARGE", gDropArrows3Tex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ITEM_ICE_TRAP", gMagicArrowEquipEffectTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_UP", gEmptyCDownArrowTex, + ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("HASH_ARROW_DWN", gEmptyCDownArrowTex, + ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("BOSS_SOUL", gBossSoulTex, ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("TRIFORCE_PIECE", gTriforcePieceTex, ImVec4(1, 1, 1, 1)); + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("TRIFORCE_PIECE", gTriforcePieceTex, + ImVec4(1, 1, 1, 1)); } diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp index 168dcee45..203981133 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -38,7 +38,8 @@ void RegisterShuffleCows() { COND_VB_SHOULD(VB_GIVE_ITEM_FROM_COW, shouldRegister, { EnCow* enCow = va_arg(args, EnCow*); - CowIdentity cowIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCow(gPlayState->sceneNum, enCow->actor.world.pos.x, enCow->actor.world.pos.z); + CowIdentity cowIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCow( + gPlayState->sceneNum, enCow->actor.world.pos.x, enCow->actor.world.pos.z); // Has this cow already rewarded an item? if (!Flags_GetRandomizerInf(cowIdentity.randomizerInf)) { Flags_SetRandomizerInf(cowIdentity.randomizerInf); @@ -60,7 +61,8 @@ static RegisterShipInitFunc initFunc(RegisterShuffleCows, { "IS_RANDO" }); void Rando::StaticData::RegisterCowLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW)); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp index 3c75c7c6c..3cb341980 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -25,63 +25,66 @@ extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); - int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + int isVanilla = + csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); if (isVanilla) { Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); return; - } - + } + GetItemEntry crateItem = Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); getItemCategory = crateItem.getItemCategory; - + // If they have bombchus, don't consider the bombchu item major if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && - ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || - (crateItem.modIndex == MOD_NONE && - (crateItem.getItemId == GI_BOMBCHUS_5 || crateItem.getItemId == GI_BOMBCHUS_10 || + ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOMBCHUS_5 || crateItem.getItemId == GI_BOMBCHUS_10 || crateItem.getItemId == GI_BOMBCHUS_20)))) { getItemCategory = ITEM_CATEGORY_JUNK; // If it's a bottle and they already have one, consider the item lesser - } else if ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && crateItem.getItemId <= RG_BOTTLE_WITH_POE) || - (crateItem.modIndex == MOD_NONE && (crateItem.getItemId == GI_BOTTLE || crateItem.getItemId == GI_MILK_BOTTLE))) { + } else if ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && + crateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOTTLE || crateItem.getItemId == GI_MILK_BOTTLE))) { if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { getItemCategory = ITEM_CATEGORY_LESSER; } } - // Change texture - switch (getItemCategory) { - case ITEM_CATEGORY_MAJOR: - Gfx_DrawDListOpa(play, (Gfx*)gLargeMajorCrateDL); - break; - case ITEM_CATEGORY_SKULLTULA_TOKEN: - Gfx_DrawDListOpa(play, (Gfx*)gLargeTokenCrateDL); - break; - case ITEM_CATEGORY_SMALL_KEY: - Gfx_DrawDListOpa(play, (Gfx*)gLargeSmallKeyCrateDL); - break; - case ITEM_CATEGORY_BOSS_KEY: - Gfx_DrawDListOpa(play, (Gfx*)gLargeBossKeyCrateDL); - break; - case ITEM_CATEGORY_LESSER: - switch (crateItem.itemId) { - case ITEM_HEART_PIECE: - case ITEM_HEART_PIECE_2: - case ITEM_HEART_CONTAINER: - Gfx_DrawDListOpa(play, (Gfx*)gLargeHeartCrateDL); - break; - default: - Gfx_DrawDListOpa(play, (Gfx*)gLargeMinorCrateDL); - break; - } - break; - case ITEM_CATEGORY_JUNK: - default: - Gfx_DrawDListOpa(play, (Gfx*)gLargeJunkCrateDL); - break; - } + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gLargeTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (crateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gLargeHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeJunkCrateDL); + break; + } } extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { @@ -90,62 +93,66 @@ extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); - int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); - + int isVanilla = + csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + if (isVanilla) { Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); return; - } + } - GetItemEntry smallCrateItem = Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + GetItemEntry smallCrateItem = Rando::Context::GetInstance()->GetFinalGIEntry( + smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); getItemCategory = smallCrateItem.getItemCategory; // If they have bombchus, don't consider the bombchu item major if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || (smallCrateItem.modIndex == MOD_NONE && - (smallCrateItem.getItemId == GI_BOMBCHUS_5 || smallCrateItem.getItemId == GI_BOMBCHUS_10 || smallCrateItem.getItemId == GI_BOMBCHUS_20)))) { + (smallCrateItem.getItemId == GI_BOMBCHUS_5 || smallCrateItem.getItemId == GI_BOMBCHUS_10 || + smallCrateItem.getItemId == GI_BOMBCHUS_20)))) { getItemCategory = ITEM_CATEGORY_JUNK; // If it's a bottle and they already have one, consider the item lesser } else if ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && smallCrateItem.getItemId <= RG_BOTTLE_WITH_POE) || - (smallCrateItem.modIndex == MOD_NONE && (smallCrateItem.getItemId == GI_BOTTLE || smallCrateItem.getItemId == GI_MILK_BOTTLE))) { + (smallCrateItem.modIndex == MOD_NONE && + (smallCrateItem.getItemId == GI_BOTTLE || smallCrateItem.getItemId == GI_MILK_BOTTLE))) { if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { getItemCategory = ITEM_CATEGORY_LESSER; } } // Change texture - switch (getItemCategory) { - case ITEM_CATEGORY_MAJOR: - Gfx_DrawDListOpa(play, (Gfx*)gSmallMajorCrateDL); - break; - case ITEM_CATEGORY_SKULLTULA_TOKEN: - Gfx_DrawDListOpa(play, (Gfx*)gSmallTokenCrateDL); - break; - case ITEM_CATEGORY_SMALL_KEY: - Gfx_DrawDListOpa(play, (Gfx*)gSmallSmallKeyCrateDL); - break; - case ITEM_CATEGORY_BOSS_KEY: - Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); - break; - case ITEM_CATEGORY_LESSER: - switch (smallCrateItem.itemId) { - case ITEM_HEART_PIECE: - case ITEM_HEART_PIECE_2: - case ITEM_HEART_CONTAINER: - Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); - break; - default: - Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); - break; - } - break; - case ITEM_CATEGORY_JUNK: - default: - Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); - break; - } + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gSmallTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (smallCrateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); + break; + } } uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { @@ -183,7 +190,8 @@ uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* pla void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* play) { EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &crateActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); item00->randoInf = crateActor->crateIdentity.randomizerInf; - item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -193,8 +201,8 @@ void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* pl void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* play) { EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &smallCrateActor->actor.world.pos, ITEM00_SOH_DUMMY); item00->randoInf = smallCrateActor->smallCrateIdentity.randomizerInf; - item00->itemEntry = - Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -207,29 +215,38 @@ void ObjKibako2_RandomizerInit(void* actorRef) { // don't shuffle two OOB crates in GF and don't shuffle child GV/GF crates when not in no logic if (actor->id != ACTOR_OBJ_KIBAKO2 || - (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4051 && (s16)actor->world.pos.z == -3429) || - (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4571 && (s16)actor->world.pos.z == -3429) || - (logicSetting != RO_LOGIC_NO_LOGIC && - ((gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == 3443 && (s16)actor->world.pos.z == -4876) || - (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -764 && (s16)actor->world.pos.z == 148) || - (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -125) || - (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -150) || - (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -90)))) + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4051 && + (s16)actor->world.pos.z == -3429) || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4571 && + (s16)actor->world.pos.z == -3429) || + (logicSetting != RO_LOGIC_NO_LOGIC && ((gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && + (s16)actor->world.pos.x == 3443 && (s16)actor->world.pos.z == -4876) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -764 && (s16)actor->world.pos.z == 148) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -125) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -150) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && + (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -90)))) return; ObjKibako2* crateActor = static_cast(actorRef); - crateActor->crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + crateActor->crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); } void ObjKibako_RandomizerInit(void* actorRef) { Actor* actor = static_cast(actorRef); - if (actor->id != ACTOR_OBJ_KIBAKO) return; + if (actor->id != ACTOR_OBJ_KIBAKO) + return; ObjKibako* smallCrateActor = static_cast(actorRef); - smallCrateActor->smallCrateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate(gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); + smallCrateActor->smallCrateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate( + gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); } void RegisterShuffleCrates() { @@ -274,12 +291,12 @@ void RegisterShuffleCrates() { *should = true; } }); - } void Rando::StaticData::RegisterCrateLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off // Overworld Crates diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.h b/soh/soh/Enhancements/randomizer/ShuffleCrates.h index 60cd51dc2..eb0325f89 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.h +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.h @@ -13,4 +13,4 @@ void ObjKibako_RandomizerInit(void* actorRef); }; #endif -#endif //ShuffleCrates_H +#endif // ShuffleCrates_H diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index a2b8015d4..41fd6d4e8 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -52,14 +52,16 @@ FairyIdentity ShuffleFairies_GetFairyIdentity(int32_t params) { sceneNum = SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY; } - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, sceneNum, params); + Rando::Location* location = + OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, sceneNum, params); if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { LUSLOG_WARN("FairyGetIdentity did not receive a valid RC value (%d).", location->GetRandomizerCheck()); assert(false); } else { fairyIdentity.randomizerInf = static_cast(location->GetCollectionCheck().flag); - fairyIdentity.itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + fairyIdentity.itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); } return fairyIdentity; @@ -91,44 +93,42 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, if (enElf->sohFairyIdentity.randomizerInf && enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); } - // Spawn fairies in fairy fountains + // Spawn fairies in fairy fountains } else if (id == VB_SPAWN_FOUNTAIN_FAIRIES) { bool fairySpawned = false; s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; for (s16 index = 0; index < 8; index++) { int32_t params = (grottoId << 8) | index; - if (ShuffleFairies_SpawnFairy(actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, - params)) { + if (ShuffleFairies_SpawnFairy(actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, params)) { fairySpawned = true; } } if (fairySpawned) { *should = false; } - // Spawn 3 fairies when playing Song of Storms next to a planted bean + // Spawn 3 fairies when playing Song of Storms next to a planted bean } else if (id == VB_SPAWN_BEAN_STALK_FAIRIES) { ObjBean* objBean = (ObjBean*)(actor); bool fairySpawned = false; for (s16 index = 0; index < 3; index++) { int32_t params = ((objBean->dyna.actor.params & 0x3F) << 8) | index; if (ShuffleFairies_SpawnFairy(objBean->dyna.actor.world.pos.x, objBean->dyna.actor.world.pos.y, - objBean->dyna.actor.world.pos.z, - params)) { + objBean->dyna.actor.world.pos.z, params)) { fairySpawned = true; } } if (fairySpawned) { *should = false; } - // Spawn a fairy from a ShotSun when playing the right song near it + // Spawn a fairy from a ShotSun when playing the right song near it } else if (id == VB_SPAWN_SONG_FAIRY) { ShotSun* shotSun = (ShotSun*)(actor); if (ShuffleFairies_SpawnFairy(shotSun->actor.world.pos.x, shotSun->actor.world.pos.y, - shotSun->actor.world.pos.z, - TWO_ACTOR_PARAMS(0x1000, (int32_t)shotSun->actor.world.pos.z))) { + shotSun->actor.world.pos.z, + TWO_ACTOR_PARAMS(0x1000, (int32_t)shotSun->actor.world.pos.z))) { *should = false; } - // Handle playing both misc songs and song of storms in front of a gossip stone. + // Handle playing both misc songs and song of storms in front of a gossip stone. } else if (id == VB_SPAWN_GOSSIP_STONE_FAIRY) { EnGs* gossipStone = (EnGs*)(actor); @@ -136,11 +136,9 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, // 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)) { + 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 @@ -159,7 +157,7 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, 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)) { + 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; @@ -175,7 +173,8 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, uint32_t onVanillaBehaviorHook = 0; void ShuffleFairies_RegisterHooks() { - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShuffleFairies_OnVanillaBehaviorHandler); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( + ShuffleFairies_OnVanillaBehaviorHandler); } void ShuffleFairies_UnregisterHooks() { @@ -186,7 +185,8 @@ void ShuffleFairies_UnregisterHooks() { void Rando::StaticData::RegisterFairyLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1)); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index 15a7df4db..03fd33981 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -20,17 +20,17 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh } uint32_t params = TWO_ACTOR_PARAMS((int32_t)item00->actor.world.pos.x, (int32_t)item00->actor.world.pos.z); - Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); + 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).Get(); + uint8_t freestandingSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_FREESTANDING).Get(); RandomizerCheck randomizerCheck = loc->GetRandomizerCheck(); bool checkObtained = Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained(); - + // Don't change to randomized item if current freestanding item isn't shuffled or already obtained. if ((freestandingSetting == RO_SHUFFLE_FREESTANDING_OVERWORLD && isDungeon) || - (freestandingSetting == RO_SHUFFLE_FREESTANDING_DUNGEONS && !isDungeon) || - checkObtained || randomizerCheck == RC_UNKNOWN_CHECK) { + (freestandingSetting == RO_SHUFFLE_FREESTANDING_DUNGEONS && !isDungeon) || checkObtained || + randomizerCheck == RC_UNKNOWN_CHECK) { return; } @@ -46,7 +46,8 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh void Rando::StaticData::RegisterFreestandingLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2)); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index 92eb1cb9c..f318ad948 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -25,18 +25,20 @@ void DrawTypeOfGrass(EnKusa* grassActor, Gfx* bushDList, Gfx* grassDList, PlaySt } extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { - //static Gfx* dLists[] = { (Gfx*)gRandoBushDL, (Gfx*)object_kusa_DL_000140, (Gfx*)object_kusa_DL_000140 }; + // static Gfx* dLists[] = { (Gfx*)gRandoBushDL, (Gfx*)object_kusa_DL_000140, (Gfx*)object_kusa_DL_000140 }; static Gfx* dLists[] = { (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, (Gfx*)gRandoCuttableGrassJunkDL }; auto grassActor = ((EnKusa*)thisx); OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - if (grassActor->grassIdentity.randomizerCheck != RC_MAX && Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { + if (grassActor->grassIdentity.randomizerCheck != RC_MAX && + Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); if (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) { - auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); + auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, + true, GI_NONE); GetItemCategory getItemCategory = itemEntry.getItemCategory; switch (getItemCategory) { @@ -48,10 +50,12 @@ extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { case ITEM_HEART_PIECE: case ITEM_HEART_PIECE_2: case ITEM_HEART_CONTAINER: - DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, play); + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, + play); break; default: - DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, play); + DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, + play); break; } break; @@ -155,10 +159,10 @@ void RegisterShuffleGrass() { }); } - void Rando::StaticData::RegisterGrassLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off // Overworld Grass diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.h b/soh/soh/Enhancements/randomizer/ShuffleGrass.h index e666f107e..bc9a130d4 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.h +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.h @@ -12,4 +12,4 @@ void EnKusa_RandomizerInit(void* actorRef); }; #endif -#endif //SHUFFLEGRASS_H +#endif // SHUFFLEGRASS_H diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 0d45df189..9e6f50f42 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -11,7 +11,6 @@ extern PlayState* gPlayState; extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); - extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { float potSize = 1.0f; @@ -19,7 +18,7 @@ extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); Matrix_Scale(potSize, potSize, potSize, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gRandoPotDL); CLOSE_DISPS(play->state.gfxCtx); @@ -44,7 +43,8 @@ uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { void ObjTsubo_RandomizerSpawnCollectible(ObjTsubo* potActor, PlayState* play) { EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &potActor->actor.world.pos, ITEM00_SOH_DUMMY); item00->randoInf = potActor->potIdentity.randomizerInf; - item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(potActor->potIdentity.randomizerCheck, true, GI_NONE); + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(potActor->potIdentity.randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -56,7 +56,8 @@ void ObjTsubo_RandomizerInit(void* actorRef) { ObjTsubo* potActor = static_cast(actorRef); - potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); } void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { @@ -96,7 +97,8 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va void Rando::StaticData::RegisterPotLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off // Overworld Pots diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.h b/soh/soh/Enhancements/randomizer/ShufflePots.h index 28c4e2f4a..cbe6ddaf5 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.h +++ b/soh/soh/Enhancements/randomizer/ShufflePots.h @@ -14,4 +14,4 @@ void ObjTsubo_RandomizerInit(void* actorRef); void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); -#endif //SHUFFLEPOTS_H +#endif // SHUFFLEPOTS_H diff --git a/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c index 62e0bc9f0..8b43884e4 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c +++ b/soh/soh/Enhancements/randomizer/ShuffleTradeItems.c @@ -8,7 +8,7 @@ u8 Randomizer_GetNextChildTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) { - return ITEM_WEIRD_EGG + tradeIndex; + return ITEM_WEIRD_EGG + tradeIndex; } } return ITEM_NONE; @@ -20,7 +20,7 @@ u8 Randomizer_GetPrevChildTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) { - return ITEM_WEIRD_EGG + tradeIndex; + return ITEM_WEIRD_EGG + tradeIndex; } } return ITEM_NONE; @@ -32,7 +32,7 @@ u8 Randomizer_GetNextAdultTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { - return ITEM_POCKET_EGG + tradeIndex; + return ITEM_POCKET_EGG + tradeIndex; } } return ITEM_NONE; @@ -44,7 +44,7 @@ u8 Randomizer_GetPrevAdultTradeItem() { for (int i = 0; i < numTradeItems; i++) { u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems; if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) { - return ITEM_POCKET_EGG + tradeIndex; + return ITEM_POCKET_EGG + tradeIndex; } } return ITEM_NONE; diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 1f50ad58d..fa755325e 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -88,7 +88,7 @@ Hint* Context::GetHint(const RandomizerHint hintKey) { } void Context::AddHint(const RandomizerHint hintId, const Hint hint) { - hintTable[hintId] = hint; //RANDOTODO this should probably be an rvalue + hintTable[hintId] = hint; // RANDOTODO this should probably be an rvalue } ItemLocation* Context::GetItemLocation(const RandomizerCheck locKey) { @@ -117,12 +117,14 @@ ItemOverride& Context::GetItemOverride(size_t locKey) { return overrides.at(static_cast(locKey)); } -void Context::PlaceItemInLocation(const RandomizerCheck locKey, const RandomizerGet item, const bool applyEffectImmediately, - const bool setHidden) { +void Context::PlaceItemInLocation(const RandomizerCheck locKey, const RandomizerGet item, + const bool applyEffectImmediately, const bool setHidden) { const auto loc = GetItemLocation(locKey); - SPDLOG_DEBUG(StaticData::RetrieveItem(item).GetName().GetEnglish() + " placed at " + StaticData::GetLocation(locKey)->GetName() + "\n"); - - if (applyEffectImmediately || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_GLITCHLESS) || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_VANILLA)) { + SPDLOG_DEBUG(StaticData::RetrieveItem(item).GetName().GetEnglish() + " placed at " + + StaticData::GetLocation(locKey)->GetName() + "\n"); + + if (applyEffectImmediately || mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_GLITCHLESS) || + mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_VANILLA)) { StaticData::RetrieveItem(item).ApplyEffect(); } @@ -152,8 +154,8 @@ void Context::AddLocations(const Container& locations, std::vectorGetQuest() == RCQUEST_BOTH || - loc->GetQuest() == RCQUEST_MQ && mDungeons->GetDungeonFromScene(loc->GetScene())->IsMQ() || - loc->GetQuest() == RCQUEST_VANILLA && mDungeons->GetDungeonFromScene(loc->GetScene())->IsVanilla(); + loc->GetQuest() == RCQUEST_MQ && mDungeons->GetDungeonFromScene(loc->GetScene())->IsMQ() || + loc->GetQuest() == RCQUEST_VANILLA && mDungeons->GetDungeonFromScene(loc->GetScene())->IsVanilla(); } void Context::GenerateLocationPool() { @@ -163,26 +165,29 @@ void Context::GenerateLocationPool() { // TODO: Exclude checks for some of the older shuffles from the pool too i.e. Frog Songs, Scrubs, etc.) if (location.GetRandomizerCheck() == RC_UNKNOWN_CHECK || location.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || // already in pool - (location.GetRandomizerCheck() == RC_MASTER_SWORD_PEDESTAL && mOptions[RSK_SHUFFLE_MASTER_SWORD].Is(RO_GENERIC_OFF)) || - (location.GetRandomizerCheck() == RC_KAK_100_GOLD_SKULLTULA_REWARD && mOptions[RSK_SHUFFLE_100_GS_REWARD].Is(RO_GENERIC_OFF)) || - location.GetRCType() == RCTYPE_CHEST_GAME || // not supported yet - location.GetRCType() == RCTYPE_STATIC_HINT || // can't have items - location.GetRCType() == RCTYPE_GOSSIP_STONE || // can't have items + (location.GetRandomizerCheck() == RC_MASTER_SWORD_PEDESTAL && + mOptions[RSK_SHUFFLE_MASTER_SWORD].Is(RO_GENERIC_OFF)) || + (location.GetRandomizerCheck() == RC_KAK_100_GOLD_SKULLTULA_REWARD && + mOptions[RSK_SHUFFLE_100_GS_REWARD].Is(RO_GENERIC_OFF)) || + location.GetRCType() == RCTYPE_CHEST_GAME || // not supported yet + location.GetRCType() == RCTYPE_STATIC_HINT || // can't have items + location.GetRCType() == RCTYPE_GOSSIP_STONE || // can't have items (location.GetRCType() == RCTYPE_FROG_SONG && mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_OFF)) || - (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_ONE_TIME_ONLY) && !( - location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || - location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || - location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO - )) || + (location.GetRCType() == RCTYPE_SCRUB && mOptions[RSK_SHUFFLE_SCRUBS].Is(RO_SCRUBS_ONE_TIME_ONLY) && + !(location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || + location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || + location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO)) || (location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) || (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || - (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || + (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && + mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || - (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || - (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || !mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || + (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || + !mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && @@ -193,13 +198,17 @@ void Context::GenerateLocationPool() { if (location.IsOverworld()) { // Skip stuff that is shuffled to dungeon only, i.e. tokens, pots, etc., or other checks that // should not have a shuffled item. - if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || + if ((location.GetRCType() == RCTYPE_FREESTANDING && + mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS)) || - (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || - (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || - (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { + (location.GetRCType() == RCTYPE_NLCRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && + mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -212,10 +221,15 @@ void Context::GenerateLocationPool() { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || - (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || - (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || - (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { + (location.GetRCType() == RCTYPE_GRASS && + mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_CRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_NLCRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && + mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && + mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { continue; } // also add to that dungeon's location list. @@ -229,15 +243,14 @@ void Context::GenerateLocationPool() { void Context::AddExcludedOptions() { for (auto& loc : StaticData::GetLocationTable()) { // Checks of these types don't have items, skip them. - if (loc.GetRandomizerCheck() == RC_UNKNOWN_CHECK || - loc.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || loc.GetRCType() == RCTYPE_CHEST_GAME || - loc.GetRCType() == RCTYPE_STATIC_HINT || loc.GetRCType() == RCTYPE_GOSSIP_STONE) { + if (loc.GetRandomizerCheck() == RC_UNKNOWN_CHECK || loc.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || + loc.GetRCType() == RCTYPE_CHEST_GAME || loc.GetRCType() == RCTYPE_STATIC_HINT || + loc.GetRCType() == RCTYPE_GOSSIP_STONE) { continue; } AddLocation(loc.GetRandomizerCheck(), &everyPossibleLocation); bool alreadyAdded = false; - for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc.GetArea())) - { + for (Option* location : Rando::Settings::GetInstance()->GetExcludeOptionsForArea(loc.GetArea())) { if (location->GetName() == loc.GetExcludedOption()->GetName()) { alreadyAdded = true; } @@ -248,7 +261,8 @@ void Context::AddExcludedOptions() { } } -std::vector Context::GetLocations(const std::vector& locationPool, const RandomizerCheckType checkType) { +std::vector Context::GetLocations(const std::vector& locationPool, + const RandomizerCheckType checkType) { std::vector locationsOfType; for (RandomizerCheck locKey : locationPool) { if (StaticData::GetLocation(locKey)->GetRCType() == checkType) { @@ -287,7 +301,7 @@ void Context::HintReset() { for (const RandomizerCheck il : StaticData::GetGossipStoneLocations()) { GetItemLocation(il)->ResetVariables(); } - for (Hint& hint : hintTable){ + for (Hint& hint : hintTable) { hint.ResetVariables(); } } @@ -330,7 +344,8 @@ void Context::SetSpoilerLoaded(const bool spoilerLoaded) { mSpoilerLoaded = spoilerLoaded; } -GetItemEntry Context::GetFinalGIEntry(const RandomizerCheck rc, const bool checkObtainability, const GetItemID ogItemId) { +GetItemEntry Context::GetFinalGIEntry(const RandomizerCheck rc, const bool checkObtainability, + const GetItemID ogItemId) { const auto itemLoc = GetItemLocation(rc); if (itemLoc->GetPlacedRandomizerGet() == RG_NONE) { if (ogItemId != GI_NONE) { @@ -391,9 +406,7 @@ void Context::ParseSpoiler(const char* spoilerFileName) { mTrials->ParseJson(spoilerFileJson); mSpoilerLoaded = true; mSeedGenerated = false; - } catch (...) { - LUSLOG_ERROR("Failed to load Spoiler File: %s", spoilerFileName); - } + } catch (...) { LUSLOG_ERROR("Failed to load Spoiler File: %s", spoilerFileName); } } void Context::ParseHashIconIndexesJson(nlohmann::json spoilerFileJson) { @@ -428,16 +441,16 @@ void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) { } } -void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson){ - for (Hint hint: hintTable){ +void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson) { + for (Hint hint : hintTable) { hint.logHint(spoilerFileJson); } } -nlohmann::json getValueForMessage(std::unordered_map map, CustomMessage message){ +nlohmann::json getValueForMessage(std::unordered_map map, CustomMessage message) { std::vector strings = message.GetAllMessages(); - for (uint8_t language = 0; language < LANGUAGE_MAX; language++){ - if (map.contains(strings[language])){ + for (uint8_t language = 0; language < LANGUAGE_MAX; language++) { + if (map.contains(strings[language])) { return strings[language]; } } @@ -445,11 +458,11 @@ nlohmann::json getValueForMessage(std::unordered_map* destination = nullptr); bool IsQuestOfLocationActive(RandomizerCheck rc); void GenerateLocationPool(); - static std::vector GetLocations(const std::vector& locationPool, const RandomizerCheckType checkType); + static std::vector GetLocations(const std::vector& locationPool, + const RandomizerCheckType checkType); void AddExcludedOptions(); void LocationReset(); void ClearItemLocations(); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 9c9cfd829..0403966b7 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -40,29 +40,19 @@ 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"), + 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"), + 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] = { @@ -85,16 +75,11 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn 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, + (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); @@ -117,7 +102,7 @@ extern "C" void Randomizer_DrawSmallKey(PlayState* play, GetItemEntry* getItemEn emblemColor = CVarGetColor24(SmallEmblemCvarValue[slot], emblemColor); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetEnvColor(POLY_XLU_DISP++, emblemColor.r, emblemColor.g, emblemColor.b, 255); gSPDisplayList(POLY_XLU_DISP++, customIconDLs[slot]); @@ -144,13 +129,14 @@ extern "C" void Randomizer_DrawMap(PlayState* play, GetItemEntry* getItemEntry) { 222, 158, 47 }, // Spirit Temple { 126, 16, 177 }, // Shadow Temple { 227, 110, 255 }, // Bottom of the Well - { 0, 255, 255 }, // Ice Cavern + { 0, 255, 255 }, // Ice Cavern }; OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); @@ -179,15 +165,18 @@ extern "C" void Randomizer_DrawCompass(PlayState* play, GetItemEntry* getItemEnt OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); - gDPSetEnvColor(POLY_OPA_DISP++, colors[color_slot][0] / 2, colors[color_slot][1] / 2, colors[color_slot][2] / 2, 255); + gDPSetEnvColor(POLY_OPA_DISP++, colors[color_slot][0] / 2, colors[color_slot][1] / 2, colors[color_slot][2] / 2, + 255); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiCompassDL); POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, 5); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiCompassGlassDL); CLOSE_DISPS(play->state.gfxCtx); @@ -198,21 +187,13 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt 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", + "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, + (Gfx*)gBossKeyIconForestTempleDL, (Gfx*)gBossKeyIconFireTempleDL, (Gfx*)gBossKeyIconWaterTempleDL, + (Gfx*)gBossKeyIconSpiritTempleDL, (Gfx*)gBossKeyIconShadowTempleDL, (Gfx*)gBossKeyIconGanonsCastleDL, }; OPEN_DISPS(play->state.gfxCtx); @@ -223,14 +204,14 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt G_MTX_MODELVIEW | G_MTX_LOAD); Color_RGB8 keyColor = { 255, 255, 0 }; - //Supposed to use CVAR_COSMETIC but I can't figure out the syntax + // Supposed to use CVAR_COSMETIC but I can't figure out the syntax keyColor = CVarGetColor24((CvarValue[slot] + "Body.Value").c_str(), keyColor); - - if (isCustomKeysEnabled){ + + 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)){ + 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); @@ -247,12 +228,12 @@ extern "C" void Randomizer_DrawBossKey(PlayState* play, GetItemEntry* getItemEnt Color_RGB8 gemColor = { 255, 0, 0 }; gemColor = CVarGetColor24((CvarValue[slot] + "Gem.Value").c_str(), gemColor); - - if (isCustomKeysEnabled){ + + 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)){ + 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); @@ -270,57 +251,38 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt 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*)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*)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, + (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 + // 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::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 + (Rando::DungeonKey)0, // Treasure Chest Game }; OPEN_DISPS(play->state.gfxCtx); @@ -332,12 +294,12 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt if (isCustomKeysEnabled) { gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetEnvColor(POLY_OPA_DISP++, keyColor.r, keyColor.g, keyColor.b, 255); - if (SlotToDungeon[slot] != 0 && Rando::Context::GetInstance()->GetDungeon(SlotToDungeon[slot])->IsMQ()){ + if (SlotToDungeon[slot] != 0 && Rando::Context::GetInstance()->GetDungeon(SlotToDungeon[slot])->IsMQ()) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)CustomKeysMQDLs[slot]); - } else { + } else { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)CustomKeysDLs[slot]); } @@ -351,7 +313,7 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), - G_MTX_MODELVIEW | G_MTX_LOAD); + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetEnvColor(POLY_OPA_DISP++, emblemColor.r, emblemColor.g, emblemColor.b, 255); gSPDisplayList(POLY_OPA_DISP++, CustomIconDLs[slot]); @@ -370,7 +332,7 @@ extern "C" void Randomizer_DrawKeyRing(PlayState* play, GetItemEntry* getItemEnt 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); + 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); @@ -387,8 +349,9 @@ extern "C" void Randomizer_DrawDoubleDefense(PlayState* play, GetItemEntry* getI OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); - - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetGrayscaleColor(POLY_XLU_DISP++, 255, 255, 255, 255); gSPGrayscale(POLY_XLU_DISP++, true); @@ -409,8 +372,8 @@ extern "C" void Randomizer_DrawMasterSword(PlayState* play, GetItemEntry* getIte gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 1), - 0 * (play->state.frames * 1), 32, 32, 1, 0 * (play->state.frames * 1), - 0 * (play->state.frames * 1), 32, 32)); + 0 * (play->state.frames * 1), 32, 32, 1, 0 * (play->state.frames * 1), + 0 * (play->state.frames * 1), 32, 32)); Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); Matrix_RotateZ(2.1f, MTXMODE_APPLY); @@ -419,7 +382,7 @@ extern "C" void Randomizer_DrawMasterSword(PlayState* play, GetItemEntry* getIte G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)object_toki_objects_DL_001BD0); - + CLOSE_DISPS(play->state.gfxCtx); } @@ -482,7 +445,7 @@ extern "C" void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry get } else if (triforcePieceScale < 0.035f) { triforcePieceScale += 0.0005f; } - } else if (triforcePieceScale > 0.00008f && triforcePieceScale < 0.035f) { + } else if (triforcePieceScale > 0.00008f && triforcePieceScale < 0.035f) { triforcePieceScale += 0.0005f; } @@ -514,7 +477,8 @@ extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getIte Gfx_SetupDL_25Xlu(play->state.gfxCtx); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetGrayscaleColor(POLY_XLU_DISP++, color.r, color.g, color.b, 255); gSPGrayscale(POLY_XLU_DISP++, true); @@ -619,7 +583,8 @@ extern "C" void DrawKingDodongo(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } -extern "C" s32 OverrideLimbDrawBarinade(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { +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; @@ -860,7 +825,8 @@ extern "C" void DrawBongoBongo(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } -extern "C" s32 OverrideLimbDrawKotake(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { +extern "C" s32 OverrideLimbDrawKotake(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, + void* thisx) { if (limbIndex == 21) { // Head *dList = (Gfx*)gTwinrovaKotakeHeadDL; } @@ -971,18 +937,18 @@ extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEn } else { slot = getItemEntry->drawItemId - RG_GOHMA_SOUL; } - + s16 flameColors[9][3] = { { 0, 255, 0 }, // Gohma { 255, 0, 100 }, // King Dodongo - { 50, 255, 255}, // Barinade + { 50, 255, 255 }, // Barinade { 4, 195, 46 }, // Phantom Ganon { 237, 95, 95 }, // Volvagia { 85, 180, 223 }, // Morpha { 126, 16, 177 }, // Bongo Bongo { 222, 158, 47 }, // Twinrova { 150, 150, 150 }, // Ganon/Dorf - }; + }; // Draw the blue fire DL but coloured to the boss soul. OPEN_DISPS(play->state.gfxCtx); @@ -1016,7 +982,7 @@ extern "C" void Randomizer_DrawBossSoul(PlayState* play, GetItemEntry* getItemEn } gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBossSoulSkullDL); CLOSE_DISPS(play->state.gfxCtx); - // Draw the boss' skeleton + // Draw the boss' skeleton } else { switch (slot) { case 0: // Gohma @@ -1084,26 +1050,20 @@ extern "C" void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getI s16 slot = getItemEntry->drawItemId - RG_OCARINA_A_BUTTON; Gfx* dLists[] = { - (Gfx*)gOcarinaAButtonDL, - (Gfx*)gOcarinaCUpButtonDL, - (Gfx*)gOcarinaCDownButtonDL, - (Gfx*)gOcarinaCLeftButtonDL, - (Gfx*)gOcarinaCRightButtonDL, + (Gfx*)gOcarinaAButtonDL, (Gfx*)gOcarinaCUpButtonDL, (Gfx*)gOcarinaCDownButtonDL, + (Gfx*)gOcarinaCLeftButtonDL, (Gfx*)gOcarinaCRightButtonDL, }; Color_RGB8 colors[] = { - aButtonColor, - cUpButtonColor, - cDownButtonColor, - cLeftButtonColor, - cRightButtonColor, + aButtonColor, cUpButtonColor, cDownButtonColor, cLeftButtonColor, cRightButtonColor, }; OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gDPSetGrayscaleColor(POLY_XLU_DISP++, colors[slot].r, colors[slot].g, colors[slot].b, 255); gSPGrayscale(POLY_XLU_DISP++, true); @@ -1135,11 +1095,12 @@ extern "C" void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getIte Gfx_SetupDL_25Xlu(play->state.gfxCtx); gSPSegment(POLY_XLU_DISP++, 0x08, - (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 2), - -1 * (play->state.frames * 2), 64, 64, 1, 1 * (play->state.frames * 4), - 1 * -(play->state.frames * 4), 32, 32)); + (uintptr_t)Gfx_TwoTexScroll(play->state.gfxCtx, 0, 1 * (play->state.frames * 2), + -1 * (play->state.frames * 2), 64, 64, 1, 1 * (play->state.frames * 4), + 1 * -(play->state.frames * 4), 32, 32)); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBronzeScaleColorDL); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiScaleDL); @@ -1198,7 +1159,6 @@ extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getI CLOSE_DISPS(play->state.gfxCtx); } - extern "C" void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); @@ -1215,7 +1175,7 @@ extern "C" void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getIte CLOSE_DISPS(play->state.gfxCtx); } -extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry){ +extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry) { OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_26Opa(play->state.gfxCtx); @@ -1237,13 +1197,13 @@ extern "C" void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItem } extern "C" void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry) { - if(IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOMBCHU_BAG)){ + 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); + G_MTX_MODELVIEW | G_MTX_LOAD); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBombchuDL); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 22d8466c6..8483a7bf9 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -28,8 +28,11 @@ void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntr 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 } +#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 \ + } #ifdef __cplusplus }; #endif diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 8b749faf8..1eb88ed73 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -6,15 +6,16 @@ namespace Rando { DungeonInfo::DungeonInfo(std::string name_, const RandomizerHintTextKey hintKey_, const RandomizerGet map_, - const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, - const RandomizerGet bossKey_, RandomizerArea area_, const uint8_t vanillaKeyCount_, const uint8_t mqKeyCount_, - const RandomizerSettingKey mqSetting_) + const RandomizerGet compass_, const RandomizerGet smallKey_, const RandomizerGet keyRing_, + const RandomizerGet bossKey_, RandomizerArea area_, const uint8_t vanillaKeyCount_, + const uint8_t mqKeyCount_, const RandomizerSettingKey mqSetting_) : name(std::move(name_)), hintKey(hintKey_), map(map_), compass(compass_), smallKey(smallKey_), keyRing(keyRing_), bossKey(bossKey_), area(area_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_), mqSetting(mqSetting_) { } -DungeonInfo::DungeonInfo() : hintKey(RHT_NONE), map(RG_NONE), compass(RG_NONE), smallKey(RG_NONE), keyRing(RG_NONE), - bossKey(RG_NONE) {} +DungeonInfo::DungeonInfo() + : hintKey(RHT_NONE), map(RG_NONE), compass(RG_NONE), smallKey(RG_NONE), keyRing(RG_NONE), bossKey(RG_NONE) { +} DungeonInfo::~DungeonInfo() = default; const std::string& DungeonInfo::GetName() const { @@ -145,35 +146,38 @@ std::vector DungeonInfo::GetDungeonLocations() const { } Dungeons::Dungeons() { - dungeonList[DEKU_TREE] = - DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE); - dungeonList[DODONGOS_CAVERN] = DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, - RG_DODONGOS_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, RSK_MQ_DODONGOS_CAVERN); - dungeonList[JABU_JABUS_BELLY] = DungeonInfo("Jabu Jabu's Belly", RHT_JABU_JABUS_BELLY, RG_JABU_JABUS_BELLY_MAP, - RG_JABU_JABUS_BELLY_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, RSK_MQ_JABU_JABU); - dungeonList[FOREST_TEMPLE] = - DungeonInfo("Forest Temple", RHT_FOREST_TEMPLE, RG_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_COMPASS, - RG_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, RSK_MQ_FOREST_TEMPLE); - dungeonList[FIRE_TEMPLE] = - DungeonInfo("Fire Temple", RHT_FIRE_TEMPLE, RG_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_COMPASS, - RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, RA_FIRE_TEMPLE, 8, 5, RSK_MQ_FIRE_TEMPLE); - dungeonList[WATER_TEMPLE] = - DungeonInfo("Water Temple", RHT_WATER_TEMPLE, RG_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_COMPASS, - RG_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, RSK_MQ_WATER_TEMPLE); - dungeonList[SPIRIT_TEMPLE] = - DungeonInfo("Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, - RG_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, RSK_MQ_SPIRIT_TEMPLE); - dungeonList[SHADOW_TEMPLE] = - DungeonInfo("Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, - RG_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE); - dungeonList[BOTTOM_OF_THE_WELL] = DungeonInfo( - "Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_COMPASS, - RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL); + dungeonList[DEKU_TREE] = DungeonInfo("Deku Tree", RHT_DEKU_TREE, RG_DEKU_TREE_MAP, RG_DEKU_TREE_COMPASS, RG_NONE, + RG_NONE, RG_NONE, RA_DEKU_TREE, 0, 0, RSK_MQ_DEKU_TREE); + dungeonList[DODONGOS_CAVERN] = + DungeonInfo("Dodongo's Cavern", RHT_DODONGOS_CAVERN, RG_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_COMPASS, + RG_NONE, RG_NONE, RG_NONE, RA_DODONGOS_CAVERN, 0, 0, RSK_MQ_DODONGOS_CAVERN); + dungeonList[JABU_JABUS_BELLY] = + DungeonInfo("Jabu Jabu's Belly", RHT_JABU_JABUS_BELLY, RG_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_COMPASS, + RG_NONE, RG_NONE, RG_NONE, RA_JABU_JABUS_BELLY, 0, 0, RSK_MQ_JABU_JABU); + dungeonList[FOREST_TEMPLE] = DungeonInfo( + "Forest Temple", RHT_FOREST_TEMPLE, RG_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_SMALL_KEY, + RG_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_BOSS_KEY, RA_FOREST_TEMPLE, 5, 6, RSK_MQ_FOREST_TEMPLE); + dungeonList[FIRE_TEMPLE] = DungeonInfo("Fire Temple", RHT_FIRE_TEMPLE, RG_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_COMPASS, + RG_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_BOSS_KEY, + RA_FIRE_TEMPLE, 8, 5, RSK_MQ_FIRE_TEMPLE); + dungeonList[WATER_TEMPLE] = DungeonInfo( + "Water Temple", RHT_WATER_TEMPLE, RG_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_SMALL_KEY, + RG_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_BOSS_KEY, RA_WATER_TEMPLE, 6, 2, RSK_MQ_WATER_TEMPLE); + dungeonList[SPIRIT_TEMPLE] = DungeonInfo( + "Spirit Temple", RHT_SPIRIT_TEMPLE, RG_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_SMALL_KEY, + RG_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_BOSS_KEY, RA_SPIRIT_TEMPLE, 5, 7, RSK_MQ_SPIRIT_TEMPLE); + dungeonList[SHADOW_TEMPLE] = DungeonInfo( + "Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_SMALL_KEY, + RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE); + dungeonList[BOTTOM_OF_THE_WELL] = + DungeonInfo("Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTTOM_OF_THE_WELL_MAP, + RG_BOTTOM_OF_THE_WELL_COMPASS, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_KEY_RING, + RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN); - dungeonList[GERUDO_TRAINING_GROUND] = - DungeonInfo("Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, - RG_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG); + dungeonList[GERUDO_TRAINING_GROUND] = DungeonInfo( + "Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, RG_GERUDO_TRAINING_GROUND_SMALL_KEY, + RG_GERUDO_TRAINING_GROUND_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG); dungeonList[GANONS_CASTLE] = DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE); diff --git a/soh/soh/Enhancements/randomizer/dungeon.h b/soh/soh/Enhancements/randomizer/dungeon.h index 5d26036eb..ba81d289d 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.h +++ b/soh/soh/Enhancements/randomizer/dungeon.h @@ -11,7 +11,7 @@ namespace Rando { class DungeonInfo { public: DungeonInfo(std::string name_, RandomizerHintTextKey hintKey_, RandomizerGet map_, RandomizerGet compass_, - RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, RandomizerArea area_, + RandomizerGet smallKey_, RandomizerGet keyRing_, RandomizerGet bossKey_, RandomizerArea area_, uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, RandomizerSettingKey mqSetting_); DungeonInfo(); ~DungeonInfo(); @@ -86,11 +86,12 @@ class Dungeons { /// this new array can be shuffled for the purposes of randomizing MQ dungeons. /// If you want an individual DungeonInfo entry you should use the GetDungeon /// function from either here or the Context class. - /// @return + /// @return std::array GetDungeonList(); size_t GetDungeonListSize() const; void ParseJson(nlohmann::json spoilerFileJson); + private: std::array dungeonList; }; -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 74eaaa50e..05638a2b3 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -11,7 +11,8 @@ namespace Rando { EntranceLinkInfo NO_RETURN_ENTRANCE = { EntranceType::None, RR_NONE, RR_NONE, -1 }; Entrance::Entrance(RandomizerRegion connectedRegion_, ConditionFn condition_function_, bool spreadsAreasWithPriority_) - : connectedRegion(connectedRegion_), condition_function(condition_function_), spreadsAreasWithPriority(spreadsAreasWithPriority_){ + : connectedRegion(connectedRegion_), condition_function(condition_function_), + spreadsAreasWithPriority(spreadsAreasWithPriority_) { originalConnectedRegion = connectedRegion_; } @@ -20,11 +21,11 @@ void Entrance::SetCondition(ConditionFn newCondition) { } bool Entrance::GetConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } - return true; + 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 { @@ -60,24 +61,24 @@ void Entrance::printAgeTimeAccess() { } bool Entrance::ConditionsMet(bool allAgeTimes) const { - auto ctx = Rando::Context::GetInstance(); - StartPerformanceTimer(PT_ENTRANCE_LOGIC); - Region* parent = RegionTable(parentRegion); - int conditionsMet = 0; + auto ctx = Rando::Context::GetInstance(); + StartPerformanceTimer(PT_ENTRANCE_LOGIC); + Region* parent = RegionTable(parentRegion); + int conditionsMet = 0; - if (allAgeTimes && !parent->AllAccess()) { - StopPerformanceTimer(PT_ENTRANCE_LOGIC); - return false; - } + if (allAgeTimes && !parent->AllAccess()) { + StopPerformanceTimer(PT_ENTRANCE_LOGIC); + return false; + } - // check all possible day/night condition combinations - conditionsMet = (parent->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay, allAgeTimes)) + - (parent->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight, allAgeTimes)) + - (parent->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay, allAgeTimes)) + - (parent->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight, allAgeTimes)); + // check all possible day/night condition combinations + conditionsMet = (parent->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay, allAgeTimes)) + + (parent->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight, allAgeTimes)) + + (parent->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay, allAgeTimes)) + + (parent->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight, allAgeTimes)); - StopPerformanceTimer(PT_ENTRANCE_LOGIC); - return conditionsMet && (!allAgeTimes || conditionsMet == 4); + StopPerformanceTimer(PT_ENTRANCE_LOGIC); + return conditionsMet && (!allAgeTimes || conditionsMet == 4); } uint32_t Entrance::Getuint32_t() const { @@ -227,13 +228,13 @@ Entrance* Entrance::AssumeReachable() { return assumed; } -bool Entrance::DoesSpreadAreas(){ - return spreadsAreasWithPriority; +bool Entrance::DoesSpreadAreas() { + return spreadsAreasWithPriority; } EntranceShuffler::EntranceShuffler() { - playthroughEntrances = {}; - entranceOverrides = {}; + playthroughEntrances = {}; + entranceOverrides = {}; } bool EntranceShuffler::HasNoRandomEntrances() { @@ -532,7 +533,8 @@ 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->GetOption(RSK_SELECTED_STARTING_AGE).Is(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->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_ADULT) && @@ -1574,7 +1576,7 @@ int EntranceShuffler::ShuffleAllEntrances() { void EntranceShuffler::CreateEntranceOverrides() { auto ctx = Rando::Context::GetInstance(); - entranceOverrides.fill({0, 0, 0, 0, 0}); + entranceOverrides.fill({ 0, 0, 0, 0, 0 }); if (mNoRandomEntrances) { return; } diff --git a/soh/soh/Enhancements/randomizer/entrance.h b/soh/soh/Enhancements/randomizer/entrance.h index 48a80c550..026da7426 100644 --- a/soh/soh/Enhancements/randomizer/entrance.h +++ b/soh/soh/Enhancements/randomizer/entrance.h @@ -96,8 +96,8 @@ class Entrance { bool addedToPool = false; bool decoupled = false; std::string name = ""; - //If this is false, areas only spread to interiors through this entrance if there is no other choice - //Set to false for owl drops, the windmill path between dampe's grave and windmill and blue warps + // If this is false, areas only spread to interiors through this entrance if there is no other choice + // Set to false for owl drops, the windmill path between dampe's grave and windmill and blue warps bool spreadsAreasWithPriority = true; }; @@ -128,6 +128,7 @@ class EntranceShuffler { void CreateEntranceOverrides(); void UnshuffleAllEntrances(); void ParseJson(nlohmann::json spoilerFileJson); + private: std::vector AssumeEntrancePool(std::vector& entrancePool); bool ShuffleOneWayPriorityEntrances(std::map& oneWayPriorities, @@ -150,7 +151,7 @@ class EntranceShuffler { extern "C" { #endif - EntranceOverride* Randomizer_GetEntranceOverrides(); +EntranceOverride* Randomizer_GetEntranceOverrides(); #ifdef __cplusplus } #endif diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index d6a76acc0..fe9b4c0f1 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -21,18 +21,18 @@ extern PlayState* gPlayState; /** * @brief Parallel list of pond fish checks for both ages -*/ + */ std::array, 17> Rando::StaticData::randomizerFishingPondFish = { { /* Child Check Adult Check */ - { RC_LH_CHILD_FISH_1, RC_LH_ADULT_FISH_1 }, - { RC_LH_CHILD_FISH_2, RC_LH_ADULT_FISH_2 }, - { RC_LH_CHILD_FISH_3, RC_LH_ADULT_FISH_3 }, - { RC_LH_CHILD_FISH_4, RC_LH_ADULT_FISH_4 }, - { RC_LH_CHILD_FISH_5, RC_LH_ADULT_FISH_5 }, - { RC_LH_CHILD_FISH_6, RC_LH_ADULT_FISH_6 }, - { RC_LH_CHILD_FISH_7, RC_LH_ADULT_FISH_7 }, - { RC_LH_CHILD_FISH_8, RC_LH_ADULT_FISH_8 }, - { RC_LH_CHILD_FISH_9, RC_LH_ADULT_FISH_9 }, + { RC_LH_CHILD_FISH_1, RC_LH_ADULT_FISH_1 }, + { RC_LH_CHILD_FISH_2, RC_LH_ADULT_FISH_2 }, + { RC_LH_CHILD_FISH_3, RC_LH_ADULT_FISH_3 }, + { RC_LH_CHILD_FISH_4, RC_LH_ADULT_FISH_4 }, + { RC_LH_CHILD_FISH_5, RC_LH_ADULT_FISH_5 }, + { RC_LH_CHILD_FISH_6, RC_LH_ADULT_FISH_6 }, + { RC_LH_CHILD_FISH_7, RC_LH_ADULT_FISH_7 }, + { RC_LH_CHILD_FISH_8, RC_LH_ADULT_FISH_8 }, + { RC_LH_CHILD_FISH_9, RC_LH_ADULT_FISH_9 }, { RC_LH_CHILD_FISH_10, RC_LH_ADULT_FISH_10 }, { RC_LH_CHILD_FISH_11, RC_LH_ADULT_FISH_11 }, { RC_LH_CHILD_FISH_12, RC_LH_ADULT_FISH_12 }, @@ -56,279 +56,284 @@ ActorFunc drawEnFish = NULL; Color_RGB8 fsPulseColor = { 30, 240, 200 }; namespace Rando { - const FishIdentity Fishsanity::defaultIdentity = { RAND_INF_MAX, RC_UNKNOWN_CHECK }; - bool Fishsanity::fishsanityHelpersInit = false; - s16 Fishsanity::fishGroupCounter = 0; - bool Fishsanity::enableAdvance = false; - std::unordered_map Fishsanity::pondFishAgeMap; - std::vector Fishsanity::childPondFish; - std::vector Fishsanity::adultPondFish; +const FishIdentity Fishsanity::defaultIdentity = { RAND_INF_MAX, RC_UNKNOWN_CHECK }; +bool Fishsanity::fishsanityHelpersInit = false; +s16 Fishsanity::fishGroupCounter = 0; +bool Fishsanity::enableAdvance = false; +std::unordered_map Fishsanity::pondFishAgeMap; +std::vector Fishsanity::childPondFish; +std::vector Fishsanity::adultPondFish; - Fishsanity::Fishsanity() { - InitializeHelpers(); - } +Fishsanity::Fishsanity() { + InitializeHelpers(); +} - Fishsanity::~Fishsanity() { - - } +Fishsanity::~Fishsanity() { +} - bool Fishsanity::GetFishLocationIncluded(Rando::Location* loc, - FishsanityOptionsSource optionsSource) { - auto [mode, numFish, ageSplit] = GetOptions(optionsSource); +bool Fishsanity::GetFishLocationIncluded(Rando::Location* loc, FishsanityOptionsSource optionsSource) { + auto [mode, numFish, ageSplit] = GetOptions(optionsSource); - if (loc->GetRCType() != RCTYPE_FISH || mode == RO_FISHSANITY_OFF) { - return false; - } - RandomizerCheck rc = loc->GetRandomizerCheck(); - // Are pond fish enabled, and is this a pond fish location? - if (mode != RO_FISHSANITY_OVERWORLD && numFish > 0 && loc->GetScene() == SCENE_FISHING_POND && - loc->GetActorID() == ACTOR_FISHING) { - // Is this a child fish location? If so, is it within the defined number of pond fish checks? - if (rc >= RC_LH_CHILD_FISH_1 && rc <= RC_LH_CHILD_LOACH_2 && numFish > (loc->GetActorParams() - 100)) { - return true; - } - // Are adult fish available, and is this an adult fish location? If so, is it within the defined number of pond - // fish checks? - if (ageSplit && rc >= RC_LH_ADULT_FISH_1 && rc <= RC_LH_ADULT_LOACH && numFish > (loc->GetActorParams() - 100)) { - return true; - } - } - // Are overworld fish enabled, and is this an overworld fish location? - if (mode != RO_FISHSANITY_POND && (loc->GetScene() == SCENE_GROTTOS || loc->GetScene() == SCENE_ZORAS_DOMAIN) - && loc->GetActorID() == ACTOR_EN_FISH && (loc->GetActorParams() >> 8)) { - return true; - } - // Must not be an included fish location! + if (loc->GetRCType() != RCTYPE_FISH || mode == RO_FISHSANITY_OFF) { return false; } - - std::pair, std::vector> - Fishsanity::GetFishingPondLocations(FishsanityOptionsSource optionsSource) { - auto [mode, numFish, ageSplit] = GetOptions(optionsSource); - std::vector activeFish; - std::vector remainingFish; - std::vector pondFish = Rando::StaticData::GetPondFishLocations(); - - // Fishsanity_InitializeHelpers(); - remainingFish.insert(remainingFish.end(), pondFish.begin(), pondFish.end()); - - // No pond fish shuffled - if (numFish == 0) { - return std::make_pair(activeFish, remainingFish); + RandomizerCheck rc = loc->GetRandomizerCheck(); + // Are pond fish enabled, and is this a pond fish location? + if (mode != RO_FISHSANITY_OVERWORLD && numFish > 0 && loc->GetScene() == SCENE_FISHING_POND && + loc->GetActorID() == ACTOR_FISHING) { + // Is this a child fish location? If so, is it within the defined number of pond fish checks? + if (rc >= RC_LH_CHILD_FISH_1 && rc <= RC_LH_CHILD_LOACH_2 && numFish > (loc->GetActorParams() - 100)) { + return true; } - // Every pond fish is shuffled, so we can save some time - if (numFish > 16) { - // Child and adult pond fish are both shuffled, set activeFish to remainingFish and return an empty vector for - // inactive fish. - if (ageSplit) { - return std::make_pair(remainingFish, activeFish); - } - // Activate all child fish only - activeFish = FilterAndEraseFromPool( - remainingFish, [](const RandomizerCheck loc) { return pondFishAgeMap[loc] == LINK_AGE_CHILD; }); - return std::make_pair(activeFish, remainingFish); + // Are adult fish available, and is this an adult fish location? If so, is it within the defined number of pond + // fish checks? + if (ageSplit && rc >= RC_LH_ADULT_FISH_1 && rc <= RC_LH_ADULT_LOACH && + numFish > (loc->GetActorParams() - 100)) { + return true; } - // Only some pond fish are shuffled, so we have to only activate the requested number. - activeFish.insert(activeFish.end(), childPondFish.begin(), childPondFish.begin() + numFish); - // If pond is split, also add the requested number of adult fish. + } + // Are overworld fish enabled, and is this an overworld fish location? + if (mode != RO_FISHSANITY_POND && (loc->GetScene() == SCENE_GROTTOS || loc->GetScene() == SCENE_ZORAS_DOMAIN) && + loc->GetActorID() == ACTOR_EN_FISH && (loc->GetActorParams() >> 8)) { + return true; + } + // Must not be an included fish location! + return false; +} + +std::pair, std::vector> +Fishsanity::GetFishingPondLocations(FishsanityOptionsSource optionsSource) { + auto [mode, numFish, ageSplit] = GetOptions(optionsSource); + std::vector activeFish; + std::vector remainingFish; + std::vector pondFish = Rando::StaticData::GetPondFishLocations(); + + // Fishsanity_InitializeHelpers(); + remainingFish.insert(remainingFish.end(), pondFish.begin(), pondFish.end()); + + // No pond fish shuffled + if (numFish == 0) { + return std::make_pair(activeFish, remainingFish); + } + // Every pond fish is shuffled, so we can save some time + if (numFish > 16) { + // Child and adult pond fish are both shuffled, set activeFish to remainingFish and return an empty vector for + // inactive fish. if (ageSplit) { - activeFish.insert(activeFish.end(), adultPondFish.begin(), - adultPondFish.begin() + std::min(numFish, 16)); + return std::make_pair(remainingFish, activeFish); } - // NOTE: This only works because we can assume activeFish is already sorted; changes that break this assumption will - // also break this - FilterAndEraseFromPool(remainingFish, - [&](uint32_t loc) { return std::binary_search(activeFish.begin(), activeFish.end(), loc); }); - + // Activate all child fish only + activeFish = FilterAndEraseFromPool( + remainingFish, [](const RandomizerCheck loc) { return pondFishAgeMap[loc] == LINK_AGE_CHILD; }); return std::make_pair(activeFish, remainingFish); } + // Only some pond fish are shuffled, so we have to only activate the requested number. + activeFish.insert(activeFish.end(), childPondFish.begin(), childPondFish.begin() + numFish); + // If pond is split, also add the requested number of adult fish. + if (ageSplit) { + activeFish.insert(activeFish.end(), adultPondFish.begin(), + adultPondFish.begin() + std::min(numFish, 16)); + } + // NOTE: This only works because we can assume activeFish is already sorted; changes that break this assumption will + // also break this + FilterAndEraseFromPool(remainingFish, + [&](uint32_t loc) { return std::binary_search(activeFish.begin(), activeFish.end(), loc); }); - std::pair, std::vector> - Fishsanity::GetFishsanityLocations(FishsanityOptionsSource optionsSource) { - auto [mode, numFish, ageSplit] = GetOptions(optionsSource); - std::vector activeFish; - std::vector remainingFish; + return std::make_pair(activeFish, remainingFish); +} - // Add pond fish - if (mode == RO_FISHSANITY_POND || mode == RO_FISHSANITY_BOTH) { - auto pondLocations = GetFishingPondLocations(optionsSource); - activeFish.insert(activeFish.end(), pondLocations.first.begin(), pondLocations.first.end()); - remainingFish.insert(remainingFish.end(), pondLocations.second.begin(), pondLocations.second.end()); - } +std::pair, std::vector> +Fishsanity::GetFishsanityLocations(FishsanityOptionsSource optionsSource) { + auto [mode, numFish, ageSplit] = GetOptions(optionsSource); + std::vector activeFish; + std::vector remainingFish; - // Add overworld fish - if (mode == RO_FISHSANITY_OVERWORLD || mode == RO_FISHSANITY_BOTH) { - std::vector overworldFish = Rando::StaticData::GetOverworldFishLocations(); - activeFish.insert(activeFish.end(), overworldFish.begin(), overworldFish.end()); - } - - return std::make_pair(activeFish, remainingFish); + // Add pond fish + if (mode == RO_FISHSANITY_POND || mode == RO_FISHSANITY_BOTH) { + auto pondLocations = GetFishingPondLocations(optionsSource); + activeFish.insert(activeFish.end(), pondLocations.first.begin(), pondLocations.first.end()); + remainingFish.insert(remainingFish.end(), pondLocations.second.begin(), pondLocations.second.end()); } - FishIdentity Fishsanity::IdentifyPondFish(u8 fishParams) { - auto [mode, pondCount, ageSplit] = GetOptions(); - FishIdentity identity = defaultIdentity; + // Add overworld fish + if (mode == RO_FISHSANITY_OVERWORLD || mode == RO_FISHSANITY_BOTH) { + std::vector overworldFish = Rando::StaticData::GetOverworldFishLocations(); + activeFish.insert(activeFish.end(), overworldFish.begin(), overworldFish.end()); + } - if (!GetPondFishShuffled()) { - return identity; - } + return std::make_pair(activeFish, remainingFish); +} - if (pondCount > 16) { - identity = GetPondFish(fishParams, IsAdultPond()); - } else { - identity = LINK_IS_ADULT ? mCurrPondFish.second : mCurrPondFish.first; - } +FishIdentity Fishsanity::IdentifyPondFish(u8 fishParams) { + auto [mode, pondCount, ageSplit] = GetOptions(); + FishIdentity identity = defaultIdentity; + if (!GetPondFishShuffled()) { return identity; } - FishsanityPondOptions Fishsanity::GetOptions(FishsanityOptionsSource optionsSource) { - FishsanityPondOptions options{}; - switch (optionsSource) { - // Used in check tracker - case FSO_SOURCE_CVARS: - options.mode = CVarGetInteger(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_OFF); - options.numFish = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), 0); - options.ageSplit = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), 0) == 1; - break; - case FSO_SOURCE_RANDO: - default: - options.mode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - options.numFish = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT); - options.ageSplit = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); - break; - } - return options; + if (pondCount > 16) { + identity = GetPondFish(fishParams, IsAdultPond()); + } else { + identity = LINK_IS_ADULT ? mCurrPondFish.second : mCurrPondFish.first; } - void Fishsanity::UpdateCurrentPondFish() { - auto [mode, pondCount, ageSplit] = GetOptions(); - mCurrPondFish = std::pair(); - mCurrPondFish.first = defaultIdentity; - mCurrPondFish.second = defaultIdentity; + return identity; +} - // Initialize mCurrPondFish if we're shuffling pond fish, but if all fish are shuffled, we don't need to use this. - if ((mode == RO_FISHSANITY_BOTH || mode == RO_FISHSANITY_POND) && pondCount < 17) { - // find the first inf that isn't set yet for each age - // but don't go past the max number - std::pair tableEntry; - for (s16 i = 0, params = 100; i < pondCount; i++, params++) { - tableEntry = Rando::StaticData::randomizerFishingPondFish[i]; - if (!Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.first)) || i == pondCount - 1) { - // Found first child check - if (!IsFish(&mCurrPondFish.first)) { - mCurrPondFish.first = GetPondFish(params, false); - } +FishsanityPondOptions Fishsanity::GetOptions(FishsanityOptionsSource optionsSource) { + FishsanityPondOptions options{}; + switch (optionsSource) { + // Used in check tracker + case FSO_SOURCE_CVARS: + options.mode = CVarGetInteger(CVAR_RANDOMIZER_SETTING("Fishsanity"), RO_FISHSANITY_OFF); + options.numFish = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), 0); + options.ageSplit = CVarGetInteger(CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), 0) == 1; + break; + case FSO_SOURCE_RANDO: + default: + options.mode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); + options.numFish = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT); + options.ageSplit = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); + break; + } + return options; +} - if (!ageSplit && !IsFish(&mCurrPondFish.second)) { - mCurrPondFish.second = GetPondFish(params, false); - // both ages are resolved! we can quit here - break; - } +void Fishsanity::UpdateCurrentPondFish() { + auto [mode, pondCount, ageSplit] = GetOptions(); + mCurrPondFish = std::pair(); + mCurrPondFish.first = defaultIdentity; + mCurrPondFish.second = defaultIdentity; + + // Initialize mCurrPondFish if we're shuffling pond fish, but if all fish are shuffled, we don't need to use this. + if ((mode == RO_FISHSANITY_BOTH || mode == RO_FISHSANITY_POND) && pondCount < 17) { + // find the first inf that isn't set yet for each age + // but don't go past the max number + std::pair tableEntry; + for (s16 i = 0, params = 100; i < pondCount; i++, params++) { + tableEntry = Rando::StaticData::randomizerFishingPondFish[i]; + if (!Flags_GetRandomizerInf( + OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.first)) || + i == pondCount - 1) { + // Found first child check + if (!IsFish(&mCurrPondFish.first)) { + mCurrPondFish.first = GetPondFish(params, false); } - if (ageSplit && !IsFish(&mCurrPondFish.second) && tableEntry.second != RC_UNKNOWN_CHECK && - (!Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.second)) || i == pondCount - 1)) { - mCurrPondFish.second = GetPondFish(params, true); + if (!ageSplit && !IsFish(&mCurrPondFish.second)) { + mCurrPondFish.second = GetPondFish(params, false); + // both ages are resolved! we can quit here + break; } } + + if (ageSplit && !IsFish(&mCurrPondFish.second) && tableEntry.second != RC_UNKNOWN_CHECK && + (!Flags_GetRandomizerInf( + OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(tableEntry.second)) || + i == pondCount - 1)) { + mCurrPondFish.second = GetPondFish(params, true); + } } } +} - void Fishsanity::InitializeFromSave() { - UpdateCurrentPondFish(); - } +void Fishsanity::InitializeFromSave() { + UpdateCurrentPondFish(); +} - bool Fishsanity::GetPondFishShuffled() { - u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - return OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT) > 0 && - (fsMode == RO_FISHSANITY_POND || fsMode == RO_FISHSANITY_BOTH); - } +bool Fishsanity::GetPondFishShuffled() { + u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); + return OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT) > 0 && + (fsMode == RO_FISHSANITY_POND || fsMode == RO_FISHSANITY_BOTH); +} - bool Fishsanity::GetOverworldFishShuffled() { - u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); - return fsMode == RO_FISHSANITY_OVERWORLD || fsMode == RO_FISHSANITY_BOTH; - } +bool Fishsanity::GetOverworldFishShuffled() { + u8 fsMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); + return fsMode == RO_FISHSANITY_OVERWORLD || fsMode == RO_FISHSANITY_BOTH; +} - bool Fishsanity::IsAdultPond() { - return LINK_IS_ADULT && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); - } +bool Fishsanity::IsAdultPond() { + return LINK_IS_ADULT && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); +} - bool Fishsanity::GetPondCleared() { - auto [mode, pondCount, ageSplit] = GetOptions(); - // no fish shuffled, so pond is always cleared :thumbsup: - if (pondCount == 0) { - return true; - } - - bool adultPond = LINK_IS_ADULT && ageSplit; - // if we've collected the final shuffled fish, pond is complete - if (pondCount <= 16) { - auto tableEntry = Rando::StaticData::randomizerFishingPondFish[pondCount - 1]; - return Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(adultPond ? tableEntry.second : tableEntry.first)); - } - - // the last two checks actually don't matter because logically they will never be true, but maybe one day they will - // if every fish is shuffled, check if we've collected every fish - for (auto tableEntry : Rando::StaticData::randomizerFishingPondFish) { - RandomizerCheck rc = adultPond ? tableEntry.second : tableEntry.first; - // if we haven't collected this fish, then we're not done yet! get back in there, soldier - if (rc != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc))) { - return false; - } - } +bool Fishsanity::GetPondCleared() { + auto [mode, pondCount, ageSplit] = GetOptions(); + // no fish shuffled, so pond is always cleared :thumbsup: + if (pondCount == 0) { return true; } - bool Fishsanity::GetDomainCleared() { - for (RandomizerInf i = RAND_INF_ZD_FISH_1; i <= RAND_INF_ZD_FISH_5; i = (RandomizerInf)(i + 1)) { - if (!Flags_GetRandomizerInf(i)) { - return false; - } - } - return true; + bool adultPond = LINK_IS_ADULT && ageSplit; + // if we've collected the final shuffled fish, pond is complete + if (pondCount <= 16) { + auto tableEntry = Rando::StaticData::randomizerFishingPondFish[pondCount - 1]; + return Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck( + adultPond ? tableEntry.second : tableEntry.first)); } - void Fishsanity::InitializeHelpers() { - if (fishsanityHelpersInit) { - return; - } - - for (auto pair : Rando::StaticData::randomizerFishingPondFish) { - pondFishAgeMap[pair.first] = LINK_AGE_CHILD; - pondFishAgeMap[pair.second] = LINK_AGE_ADULT; - childPondFish.push_back(pair.first); - adultPondFish.push_back(pair.second); + // the last two checks actually don't matter because logically they will never be true, but maybe one day they will + // if every fish is shuffled, check if we've collected every fish + for (auto tableEntry : Rando::StaticData::randomizerFishingPondFish) { + RandomizerCheck rc = adultPond ? tableEntry.second : tableEntry.first; + // if we haven't collected this fish, then we're not done yet! get back in there, soldier + if (rc != RC_UNKNOWN_CHECK && + !Flags_GetRandomizerInf(OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc))) { + return false; } } + return true; +} - FishIdentity Fishsanity::GetPondFish(s16 params, bool adultPond) { - auto pair = Rando::StaticData::randomizerFishingPondFish[params - 100]; - RandomizerCheck rc = adultPond ? pair.second : pair.first; - return { OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc), rc }; +bool Fishsanity::GetDomainCleared() { + for (RandomizerInf i = RAND_INF_ZD_FISH_1; i <= RAND_INF_ZD_FISH_5; i = (RandomizerInf)(i + 1)) { + if (!Flags_GetRandomizerInf(i)) { + return false; + } + } + return true; +} + +void Fishsanity::InitializeHelpers() { + if (fishsanityHelpersInit) { + return; } - FishIdentity Fishsanity::AdvancePond() { - auto [mode, pondCount, ageSplit] = GetOptions(); + for (auto pair : Rando::StaticData::randomizerFishingPondFish) { + pondFishAgeMap[pair.first] = LINK_AGE_CHILD; + pondFishAgeMap[pair.second] = LINK_AGE_ADULT; + childPondFish.push_back(pair.first); + adultPondFish.push_back(pair.second); + } +} - // No need to update state with full pond shuffle - if (pondCount > 16) { - return defaultIdentity; - } +FishIdentity Fishsanity::GetPondFish(s16 params, bool adultPond) { + auto pair = Rando::StaticData::randomizerFishingPondFish[params - 100]; + RandomizerCheck rc = adultPond ? pair.second : pair.first; + return { OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(rc), rc }; +} - UpdateCurrentPondFish(); +FishIdentity Fishsanity::AdvancePond() { + auto [mode, pondCount, ageSplit] = GetOptions(); - return IsAdultPond() ? mCurrPondFish.second : mCurrPondFish.first; + // No need to update state with full pond shuffle + if (pondCount > 16) { + return defaultIdentity; } - FishsanityCheckType Fishsanity::GetCheckType(RandomizerCheck rc) { - // if it's not RCTYPE_FISH, obviously it's not a fish - if (Rando::StaticData::GetLocation(rc)->GetRCType() != RCTYPE_FISH) { - return FSC_NONE; - } + UpdateCurrentPondFish(); - auto loc = Rando::StaticData::GetLocation(rc); - switch (loc->GetScene()) { + return IsAdultPond() ? mCurrPondFish.second : mCurrPondFish.first; +} + +FishsanityCheckType Fishsanity::GetCheckType(RandomizerCheck rc) { + // if it's not RCTYPE_FISH, obviously it's not a fish + if (Rando::StaticData::GetLocation(rc)->GetRCType() != RCTYPE_FISH) { + return FSC_NONE; + } + + auto loc = Rando::StaticData::GetLocation(rc); + switch (loc->GetScene()) { case SCENE_FISHING_POND: return FSC_POND; case SCENE_ZORAS_DOMAIN: @@ -337,251 +342,246 @@ namespace Rando { return FSC_GROTTO; default: return FSC_NONE; - } + } +} + +bool Fishsanity::IsFish(FishIdentity* fish) { + if (fish->randomizerCheck == RC_UNKNOWN_CHECK || fish->randomizerInf == RAND_INF_MAX) { + return false; } - bool Fishsanity::IsFish(FishIdentity* fish) { - if (fish->randomizerCheck == RC_UNKNOWN_CHECK || fish->randomizerInf == RAND_INF_MAX) { - return false; + return GetCheckType(fish->randomizerCheck) != FSC_NONE; +} + +void Fishsanity::OnActorInitHandler(void* refActor) { + Actor* actor = static_cast(refActor); + + auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); + FishIdentity fish; + + if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { + // Set fish ID for ZD fish + if (gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && actor->params == -1) { + actor->params ^= fishGroupCounter++; + } else if (gPlayState->sceneNum == SCENE_GROTTOS && actor->params == 1) { + actor->params = 0x100 | gSaveContext.respawn[RESPAWN_MODE_RETURN].data; } - return GetCheckType(fish->randomizerCheck) != FSC_NONE; - } - - void Fishsanity::OnActorInitHandler(void* refActor) { - Actor* actor = static_cast(refActor); - - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); - FishIdentity fish; - - if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { - // Set fish ID for ZD fish - if (gPlayState->sceneNum == SCENE_ZORAS_DOMAIN && actor->params == -1) { - actor->params ^= fishGroupCounter++; - } else if (gPlayState->sceneNum == SCENE_GROTTOS && actor->params == 1) { - actor->params = 0x100 | gSaveContext.respawn[RESPAWN_MODE_RETURN].data; + fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + // Render fish as randomized item + if (Rando::Fishsanity::IsFish(&fish) && !Flags_GetRandomizerInf(fish.randomizerInf)) { + if (!drawEnFish) { + drawEnFish = actor->draw; } + actor->draw = Fishsanity_DrawEnFish; + } + return; + } - fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - // Render fish as randomized item - if (Rando::Fishsanity::IsFish(&fish) && !Flags_GetRandomizerInf(fish.randomizerInf)) { - if (!drawEnFish) { - drawEnFish = actor->draw; + if (actor->id == ACTOR_FISHING && gPlayState->sceneNum == SCENE_FISHING_POND && actor->params >= 100 && + actor->params <= 117 && fs->GetPondFishShuffled()) { + // Initialize pond fish for fishsanity + // Initialize fishsanity metadata on this actor + Fishing* fishActor = static_cast(refActor); + // fishActor->fishsanityParams = actor->params; + fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + + // With every pond fish shuffled, caught fish will not spawn unless all fish have been caught. + if (RAND_GET_OPTION(RSK_FISHSANITY_POND_COUNT) > 16 && !fs->GetPondCleared()) { + // Create effect for uncaught fish + if (!Flags_GetRandomizerInf(fish.randomizerInf)) { + actor->shape.shadowDraw = Fishsanity_DrawEffShadow; + if (!drawFishing) { + drawFishing = actor->draw; } - actor->draw = Fishsanity_DrawEnFish; + actor->draw = Fishsanity_DrawFishing; } - return; } + } +} - if (actor->id == ACTOR_FISHING && gPlayState->sceneNum == SCENE_FISHING_POND && actor->params >= 100 && - actor->params <= 117 && fs->GetPondFishShuffled()) { - // Initialize pond fish for fishsanity - // Initialize fishsanity metadata on this actor - Fishing* fishActor = static_cast(refActor); - //fishActor->fishsanityParams = actor->params; - fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); +void Fishsanity::OnActorUpdateHandler(void* refActor) { + if (gPlayState->sceneNum != SCENE_GROTTOS && gPlayState->sceneNum != SCENE_ZORAS_DOMAIN && + gPlayState->sceneNum != SCENE_FISHING_POND) { + return; + } - // With every pond fish shuffled, caught fish will not spawn unless all fish have been caught. - if (RAND_GET_OPTION(RSK_FISHSANITY_POND_COUNT) > 16 && - !fs->GetPondCleared()) { - // Create effect for uncaught fish - if (!Flags_GetRandomizerInf(fish.randomizerInf)) { - actor->shape.shadowDraw = Fishsanity_DrawEffShadow; - if (!drawFishing) { - drawFishing = actor->draw; - } - actor->draw = Fishsanity_DrawFishing; + Actor* actor = static_cast(refActor); + auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); + + // Detect fish catch + if (actor->id == ACTOR_FISHING && fs->GetPondFishShuffled()) { + Fishing* fish = static_cast(refActor); + + // State 6 -> Fish caught and hoisted + if (fish->fishState == 6) { + FishIdentity identity = + OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + if (identity.randomizerCheck != RC_UNKNOWN_CHECK) { + Flags_SetRandomizerInf(identity.randomizerInf); + enableAdvance = true; + // Remove uncaught effect + if (actor->shape.shadowDraw != NULL) { + actor->shape.shadowDraw = NULL; + actor->draw = drawFishing; } } } } - void Fishsanity::OnActorUpdateHandler(void* refActor) { - if (gPlayState->sceneNum != SCENE_GROTTOS && gPlayState->sceneNum != SCENE_ZORAS_DOMAIN && gPlayState->sceneNum != SCENE_FISHING_POND) { - return; - } - - Actor* actor = static_cast(refActor); - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); - - // Detect fish catch - if (actor->id == ACTOR_FISHING && fs->GetPondFishShuffled()) { - Fishing* fish = static_cast(refActor); - - // State 6 -> Fish caught and hoisted - if (fish->fishState == 6) { - FishIdentity identity = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - if (identity.randomizerCheck != RC_UNKNOWN_CHECK) { - Flags_SetRandomizerInf(identity.randomizerInf); - enableAdvance = true; - // Remove uncaught effect - if (actor->shape.shadowDraw != NULL) { - actor->shape.shadowDraw = NULL; - actor->draw = drawFishing; - } - } + if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { + FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + EnFish* fishActor = static_cast(refActor); + if (Rando::Fishsanity::IsFish(&fish) && Flags_GetRandomizerInf(fish.randomizerInf)) { + // Reset draw method + if (actor->draw == Fishsanity_DrawEnFish) { + actor->draw = drawEnFish; } } - if (actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { - FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - EnFish* fishActor = static_cast(refActor); - if (Rando::Fishsanity::IsFish(&fish) && Flags_GetRandomizerInf(fish.randomizerInf)) { - // Reset draw method - if (actor->draw == Fishsanity_DrawEnFish) { - actor->draw = drawEnFish; - } - } - - if (((actor->params >> 8) > 0) && fishActor->respawnTimer > 0) { - Actor_Kill(actor); - } - } - - // 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_CULLING_DISABLED) && fs->GetOverworldFishShuffled()) { - fishGroupCounter = 0; + if (((actor->params >> 8) > 0) && fishActor->respawnTimer > 0) { + Actor_Kill(actor); } } - void Fishsanity::OnSceneInitHandler(int16_t sceneNum) { - if (sceneNum == SCENE_ZORAS_DOMAIN) { - fishGroupCounter = 0; + // 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_CULLING_DISABLED) && fs->GetOverworldFishShuffled()) { + fishGroupCounter = 0; + } +} + +void Fishsanity::OnSceneInitHandler(int16_t sceneNum) { + if (sceneNum == SCENE_ZORAS_DOMAIN) { + fishGroupCounter = 0; + } +} + +void Fishsanity::OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { + va_list args; + va_copy(args, originalArgs); + + Actor* actor = va_arg(args, Actor*); + auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); + + va_end(args); + + if (id == VB_BOTTLE_ACTOR && actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { + FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); + if (fish.randomizerCheck != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(fish.randomizerInf)) { + Flags_SetRandomizerInf(fish.randomizerInf); + actor->parent = &GET_PLAYER(gPlayState)->actor; + *should = false; } } +} - void Fishsanity::OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); - - Actor* actor = va_arg(args, Actor*); - auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); - - va_end(args); - - if (id == VB_BOTTLE_ACTOR && actor->id == ACTOR_EN_FISH && fs->GetOverworldFishShuffled()) { - FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(gPlayState->sceneNum, actor->params); - if (fish.randomizerCheck != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(fish.randomizerInf)) { - Flags_SetRandomizerInf(fish.randomizerInf); - actor->parent = &GET_PLAYER(gPlayState)->actor; - *should = false; - } - } - } - - void Fishsanity::OnItemReceiveHandler(GetItemEntry itemEntry) { - if (enableAdvance) { - enableAdvance = false; - OTRGlobals::Instance->gRandoContext->GetFishsanity()->AdvancePond(); - } +void Fishsanity::OnItemReceiveHandler(GetItemEntry itemEntry) { + if (enableAdvance) { + enableAdvance = false; + OTRGlobals::Instance->gRandoContext->GetFishsanity()->AdvancePond(); } +} } // namespace Rando // C interface extern "C" { - bool Randomizer_GetPondFishShuffled() { - return FSi->GetPondFishShuffled(); +bool Randomizer_GetPondFishShuffled() { + return FSi->GetPondFishShuffled(); +} + +bool Randomizer_GetOverworldFishShuffled() { + return FSi->GetOverworldFishShuffled(); +} + +bool Randomizer_IsAdultPond() { + return FSi->IsAdultPond(); +} + +void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play) { + Vec3f pos, ripplePos; + static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f accel = { 0.0f, 0.0f, 0.0f }; + Color_RGBA8 primColor; + Color_RGBA8 envColor; + + // Color of the circle for the particles + static Color_RGBA8 mainColors[5][4] = { { 240, 154, 137, 200 }, + { 240, 190, 137, 200 }, + { 240, 171, 137, 200 }, + { 240, 141, 146, 200 }, + { 240, 204, 137, 200 } }; + + // Color of the faded flares stretching off the particles + static Color_RGBA8 flareColors[5][3] = { + { 128, 85, 82, 200 }, { 128, 101, 82, 200 }, { 128, 93, 82, 200 }, { 128, 82, 98, 200 }, { 128, 108, 82, 200 } + }; + + Color_RGBA8_Copy(&primColor, mainColors[ABS(actor->params) % 5]); + Color_RGBA8_Copy(&envColor, flareColors[ABS(actor->params) % 5]); + + // Spawn sparkles + pos.x = Rand_CenteredFloat(23.0f) + actor->world.pos.x; + pos.y = (Rand_Centered() * 12.0f) + actor->world.pos.y; + pos.z = Rand_CenteredFloat(23.0f) + actor->world.pos.z; + velocity.y = 0.05f; + accel.y = 0.025f; + Math_Vec3f_Copy(&ripplePos, &pos); + ripplePos.y += actor->yDistToWater; + + if (Rand_ZeroOne() < 0.3f) { + EffectSsKiraKira_SpawnDispersed(play, &pos, &velocity, &accel, &primColor, &envColor, 1800, 10); } - bool Randomizer_GetOverworldFishShuffled() { - return FSi->GetOverworldFishShuffled(); + if (actor->bgCheckFlags & 0x20 && Rand_ZeroOne() < 0.15f) { + EffectSsGRipple_Spawn(play, &ripplePos, 100, 200, 2); + } +} + +void Fishsanity_DrawEnFish(struct Actor* actor, struct PlayState* play) { + FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(play->sceneNum, actor->params); + GetItemEntry randoItem = Rando::Context::GetInstance()->GetFinalGIEntry(fish.randomizerCheck, true, GI_FISH); + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { + randoItem = GET_ITEM_MYSTERY; } - bool Randomizer_IsAdultPond() { - return FSi->IsAdultPond(); - } + Matrix_Push(); + Matrix_Scale(30.0, 30.0, 30.0, MTXMODE_APPLY); - void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play) { - Vec3f pos, ripplePos; - static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; - static Vec3f accel = { 0.0f, 0.0f, 0.0f }; - Color_RGBA8 primColor; - Color_RGBA8 envColor; + func_8002EBCC(actor, play, 0); + func_8002ED80(actor, play, 0); + EnItem00_CustomItemsParticles(actor, play, randoItem); + GetItemEntry_Draw(play, randoItem); - // Color of the circle for the particles - static Color_RGBA8 mainColors[5][4] = { - { 240, 154, 137, 200 }, - { 240, 190, 137, 200 }, - { 240, 171, 137, 200 }, - { 240, 141, 146, 200 }, - { 240, 204, 137, 200 } - }; + Matrix_Pop(); +} - // Color of the faded flares stretching off the particles - static Color_RGBA8 flareColors[5][3] = { - { 128, 85, 82, 200 }, - { 128, 101, 82, 200 }, - { 128, 93, 82, 200 }, - { 128, 82, 98, 200 }, - { 128, 108, 82, 200 } - }; +void Fishsanity_DrawFishing(struct Actor* actor, struct PlayState* play) { + Fishsanity_OpenGreyscaleColor(play, &fsPulseColor, (actor->params - 100) * 20); + drawFishing(actor, play); + Fishsanity_CloseGreyscaleColor(play); +} - Color_RGBA8_Copy(&primColor, mainColors[ABS(actor->params) % 5]); - Color_RGBA8_Copy(&envColor, flareColors[ABS(actor->params) % 5]); +void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGB8* color, int16_t frameOffset) { + OPEN_DISPS(play->state.gfxCtx); + gDPSetGrayscaleColor(POLY_OPA_DISP++, color->r, color->g, color->b, + // Make color pulse, offset a bit by the actor params + ABS(255.0f * Math_CosS((play->gameplayFrames + frameOffset) * 1000))); + gSPGrayscale(POLY_OPA_DISP++, true); + CLOSE_DISPS(play->state.gfxCtx); +} - // Spawn sparkles - pos.x = Rand_CenteredFloat(23.0f) + actor->world.pos.x; - pos.y = (Rand_Centered() * 12.0f) + actor->world.pos.y; - pos.z = Rand_CenteredFloat(23.0f) + actor->world.pos.z; - velocity.y = 0.05f; - accel.y = 0.025f; - Math_Vec3f_Copy(&ripplePos, &pos); - ripplePos.y += actor->yDistToWater; - - if (Rand_ZeroOne() < 0.3f) { - EffectSsKiraKira_SpawnDispersed(play, &pos, &velocity, &accel, &primColor, &envColor, 1800, 10); - } - - if (actor->bgCheckFlags & 0x20 && Rand_ZeroOne() < 0.15f) { - EffectSsGRipple_Spawn(play, &ripplePos, 100, 200, 2); - } - } - - void Fishsanity_DrawEnFish(struct Actor* actor, struct PlayState* play) { - FishIdentity fish = OTRGlobals::Instance->gRandomizer->IdentifyFish(play->sceneNum, actor->params); - GetItemEntry randoItem = Rando::Context::GetInstance()->GetFinalGIEntry(fish.randomizerCheck, true, GI_FISH); - if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { - randoItem = GET_ITEM_MYSTERY; - } - - Matrix_Push(); - Matrix_Scale(30.0, 30.0, 30.0, MTXMODE_APPLY); - - func_8002EBCC(actor, play, 0); - func_8002ED80(actor, play, 0); - EnItem00_CustomItemsParticles(actor, play, randoItem); - GetItemEntry_Draw(play, randoItem); - - Matrix_Pop(); - } - - void Fishsanity_DrawFishing(struct Actor* actor, struct PlayState* play) { - Fishsanity_OpenGreyscaleColor(play, &fsPulseColor, (actor->params - 100) * 20); - drawFishing(actor, play); - Fishsanity_CloseGreyscaleColor(play); - } - - void Fishsanity_OpenGreyscaleColor(PlayState* play, Color_RGB8* color, int16_t frameOffset) { - OPEN_DISPS(play->state.gfxCtx); - gDPSetGrayscaleColor( - POLY_OPA_DISP++, color->r, color->g, color->b, - // Make color pulse, offset a bit by the actor params - ABS(255.0f * Math_CosS((play->gameplayFrames + frameOffset) * 1000))); - gSPGrayscale(POLY_OPA_DISP++, true); - CLOSE_DISPS(play->state.gfxCtx); - } - - void Fishsanity_CloseGreyscaleColor(PlayState* play) { - OPEN_DISPS(play->state.gfxCtx); - gSPGrayscale(POLY_OPA_DISP++, false); - CLOSE_DISPS(play->state.gfxCtx); - } +void Fishsanity_CloseGreyscaleColor(PlayState* play) { + OPEN_DISPS(play->state.gfxCtx); + gSPGrayscale(POLY_OPA_DISP++, false); + CLOSE_DISPS(play->state.gfxCtx); +} } void Rando::StaticData::RegisterFishLocations() { static bool registered = false; - if (registered) return; + if (registered) + return; registered = true; // clang-format off // Fishing Pond diff --git a/soh/soh/Enhancements/randomizer/fishsanity.h b/soh/soh/Enhancements/randomizer/fishsanity.h index 13ae86583..16271f28f 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.h +++ b/soh/soh/Enhancements/randomizer/fishsanity.h @@ -29,7 +29,7 @@ namespace Rando { /** * @brief Class to provide an interface for and direct Fishsanity features -*/ + */ class Fishsanity { public: Fishsanity(); @@ -47,110 +47,114 @@ class Fishsanity { /** * @brief Returns true if the given FishIdentity represents an actual fish * @param fish The fish to check - */ + */ static bool IsFish(FishIdentity* fish); /** * @brief Returns true if the given fish location is active - * + * * @param loc The Location to check * @param optionsSource Optionally declare from which source to pull settings - */ + */ bool GetFishLocationIncluded(Rando::Location* loc, FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); /** * @brief Get the active and inactive locations in the fishing pond. - * + * * @param optionsSource Optionally declare from which source to pull settings - * @return A pair of vectors, where the fist is all active pond fish checks, and the second is all inactive pond fish checks. - */ - std::pair, std::vector> GetFishingPondLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); + * @return A pair of vectors, where the fist is all active pond fish checks, and the second is all inactive pond + * fish checks. + */ + std::pair, std::vector> + GetFishingPondLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); /** * @brief Get all active fishsanity locations, and all inactive fishing pond locations. - * - * @param optionsSource Optionally declare from which source to pull settings - * @return A pair of vectors, where the first is all active fishsanity checks, and the second is all inactive fishsanity checks. - */ - std::pair, std::vector> GetFishsanityLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); + * + * @param optionsSource Optionally declare from which source to pull settings + * @return A pair of vectors, where the first is all active fishsanity checks, and the second is all inactive + * fishsanity checks. + */ + std::pair, std::vector> + GetFishsanityLocations(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); /** * @brief Returns the identity for a caught pond fish given its params. * Not for use externally from rando, use Randomizer::IdentifyFish or Randomizer_IdentifyFish for that - * + * * @param fishParams Actor parameters for the fish to identify - */ + */ FishIdentity IdentifyPondFish(u8 fishParams); /** * @brief Get fishsanity fishing pond options from the requested source - */ + */ FishsanityPondOptions GetOptions(FishsanityOptionsSource optionsSource = FSO_SOURCE_RANDO); - + /** * @brief Updates current pond fish according to save data - */ + */ void UpdateCurrentPondFish(); - + /** * @brief Initializes internal state from save - */ + */ void InitializeFromSave(); /** * @brief Returns true if the fishing pond is shuffled - */ + */ bool GetPondFishShuffled(); /** - * @brief Returns true if overworld fish are shuffled - */ + * @brief Returns true if overworld fish are shuffled + */ bool GetOverworldFishShuffled(); /** * @brief Returns true if the fishing pond is currently adult (i.e., age split is enabled and Link is adult) - */ + */ bool IsAdultPond(); /** * @brief Returns true if all available pond fish checks have been collected for the current age - */ + */ bool GetPondCleared(); /** * @brief Returns true if all available Zora's Domain fish checks have been collected - */ + */ bool GetDomainCleared(); /** * @brief Advances current fishing pond check; no effect if every fish is shuffled * @return The new FishIdentity for the current pond, or default identity if every fish is shuffled - */ + */ FishIdentity AdvancePond(); /** * @brief ActorInit hook handler for fishsanity - */ + */ static void OnActorInitHandler(void* refActor); /** * @brief PlayerUpdate hook handler for fishsanity - */ + */ static void OnPlayerUpdateHandler(); /** * @brief ActorUpdate hook handler for fishsanity - */ + */ static void OnActorUpdateHandler(void* refActor); /** * @brief SceneInit hook handler for fishsanity - */ + */ static void OnSceneInitHandler(int16_t sceneNum); /** * @brief VB hook handler for fishsanity - */ + */ static void OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); static void OnItemReceiveHandler(GetItemEntry itemEntry); @@ -158,26 +162,26 @@ class Fishsanity { private: /** * @brief Initialize helper statics if they have not been initialized yet - */ + */ void InitializeHelpers(); - + /** * @brief Resolves a pond fish's FishIdentity directly from params & pond age - * + * * @param params Params for Fishing actor * @param adultPond Whether to resolve this fish as an adult check * @return The FishIdentity for the described fish - */ + */ static FishIdentity GetPondFish(s16 params, bool adultPond); /** * @brief Current pond fish when all pond fish are not randomized - */ + */ std::pair mCurrPondFish; - + /** * @brief True if fishsanity helpers have been initialized - */ + */ static bool fishsanityHelpersInit; static s16 fishGroupCounter; @@ -189,20 +193,20 @@ class Fishsanity { /** * @brief Mapping from pond fish check to the age where that check can be collected - */ + */ static std::unordered_map pondFishAgeMap; /** * @brief List of child pond fish checks - */ + */ static std::vector childPondFish; /** * @brief List of adult pond fish checks - */ + */ static std::vector adultPondFish; }; -} +} // namespace Rando extern "C" { #endif diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp index 2648c4623..d81e94f2f 100644 --- a/soh/soh/Enhancements/randomizer/hint.cpp +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -6,639 +6,624 @@ #include "static_data.h" namespace Rando { -Hint::Hint(){} - -Hint::Hint(RandomizerHint ownKey_, - HintType hintType_, - std::string distribution_, - std::vector hintKeys_, - std::vector locations_, - std::vector areas_, - std::vector trials_) - : ownKey(ownKey_), hintType(hintType_), distribution(std::move(distribution_)), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_) { - FillGapsInData(); - SetLocationsAsHinted(); - NamesChosen(); - enabled = true; +Hint::Hint() { } -Hint::Hint(RandomizerHint ownKey_, - HintType hintType_, - std::vector hintKeys_, - std::vector locations_, - std::vector areas_, - std::vector trials_, - bool yourPocket_, - int num_) - : ownKey(ownKey_), hintType(hintType_), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_), yourPocket(yourPocket_), num(num_) { - FillGapsInData(); - SetLocationsAsHinted(); - NamesChosen(); - enabled = true; +Hint::Hint(RandomizerHint ownKey_, HintType hintType_, std::string distribution_, + std::vector hintKeys_, std::vector locations_, + std::vector areas_, std::vector trials_) + : ownKey(ownKey_), hintType(hintType_), distribution(std::move(distribution_)), hintKeys(hintKeys_), + locations(locations_), areas(areas_), trials(trials_) { + FillGapsInData(); + SetLocationsAsHinted(); + NamesChosen(); + enabled = true; } -Hint::Hint(RandomizerHint ownKey_, std::vector messages_) -: ownKey(ownKey_), messages(messages_){ - hintType = HINT_TYPE_MESSAGE; - enabled = true; +Hint::Hint(RandomizerHint ownKey_, HintType hintType_, std::vector hintKeys_, + std::vector locations_, std::vector areas_, std::vector trials_, + bool yourPocket_, int num_) + : ownKey(ownKey_), hintType(hintType_), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_), + yourPocket(yourPocket_), num(num_) { + FillGapsInData(); + SetLocationsAsHinted(); + NamesChosen(); + enabled = true; } -Hint::Hint(RandomizerHint ownKey_, nlohmann::json json_){ - ownKey = ownKey_; - if (json_.contains("enabled") && !json_["enabled"].get()){ - return; - } - enabled = true; - - if (json_.contains("type")){ - hintType = (HintType)StaticData::hintTypeNameToEnum[json_["type"].get()]; - } - - if (hintType == HINT_TYPE_MESSAGE){ - if (json_.contains("messages")){ - for (auto message: json_["messages"]){ - messages.push_back(CustomMessage(message.get())); - } - } else if (json_.contains("message")){ - messages.push_back(CustomMessage(json_["message"].get())); - } - } - - if (json_.contains("distribution")){ - distribution = json_["distribution"].get(); - } - - if (json_.contains("locations")){ - for (auto loc: json_["locations"]){ - locations.push_back(StaticData::locationNameToEnum[loc.get()]); - } - } else if (json_.contains("location")){ - locations.push_back(StaticData::locationNameToEnum[json_["location"].get()]); - } - - if (json_.contains("itemNamesChosen")){ - for (auto name: json_["itemNamesChosen"]){ - itemNamesChosen.push_back(name.get()); - } - } else if (json_.contains("itemNameChosen")){ - itemNamesChosen.push_back(json_["itemNameChosen"].get()); - } - - if (json_.contains("areas")){ - for (auto area: json_["areas"]){ - areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[area]); - } - } else if (json_.contains("area")){ - areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[json_["area"]]); - } - - if (json_.contains("areaNamesChosen")){ - for (auto name: json_["areaNamesChosen"]){ - areaNamesChosen.push_back(name.get()); - } - } else if (json_.contains("areaNameChosen")){ - areaNamesChosen.push_back(json_["areaNameChosen"].get()); - } - - if (json_.contains("trials")){ - for (auto trial: json_["trials"]){ - trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[trial]); - } - } else if (json_.contains("trial")){ - trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[json_["trial"]]); - } - - if (json_.contains("hintKeys")){ - for (auto hintKey: json_["hintKeys"]){ - hintKeys.push_back((RandomizerHintTextKey)hintKey.get()); - } - } else if (json_.contains("hintKey")){ - hintKeys.push_back((RandomizerHintTextKey)json_["hintKey"].get()); - } - - if (json_.contains("hintTextsChosen")){ - for (auto name: json_["hintTextsChosen"]){ - hintTextsChosen.push_back(name.get()); - } - } else if (json_.contains("hintTextChosen")){ - hintTextsChosen.push_back(json_["hintTextChosen"].get()); - } - - if (json_.contains("num")){ - num = json_["num"].get(); - } - - FillGapsInData(); - SetLocationsAsHinted(); +Hint::Hint(RandomizerHint ownKey_, std::vector messages_) : ownKey(ownKey_), messages(messages_) { + hintType = HINT_TYPE_MESSAGE; + enabled = true; } -void Hint::FillGapsInData(){ - auto ctx = Rando::Context::GetInstance(); - if (locations.size() == 0 && StaticData::staticHintInfoMap.contains(ownKey)){ - locations = StaticData::staticHintInfoMap[ownKey].targetChecks; - } - bool fillAreas = true; - bool fillItems = true; - if (areas.size() > 0){ - fillAreas = false; - } - if (items.size() > 0){ - fillItems = false; - } - for(uint8_t c = 0; c < locations.size(); c++){ - //if area matters for the hint, it should be specified and not left to this - if (fillAreas){ - areas.push_back(ctx->GetItemLocation(locations[c])->GetFirstArea()); +Hint::Hint(RandomizerHint ownKey_, nlohmann::json json_) { + ownKey = ownKey_; + if (json_.contains("enabled") && !json_["enabled"].get()) { + return; } - if (fillItems){ - items.push_back(ctx->GetItemLocation(locations[c])->GetPlacedRandomizerGet()); + enabled = true; + + if (json_.contains("type")) { + hintType = (HintType)StaticData::hintTypeNameToEnum[json_["type"].get()]; + } + + if (hintType == HINT_TYPE_MESSAGE) { + if (json_.contains("messages")) { + for (auto message : json_["messages"]) { + messages.push_back(CustomMessage(message.get())); + } + } else if (json_.contains("message")) { + messages.push_back(CustomMessage(json_["message"].get())); + } + } + + if (json_.contains("distribution")) { + distribution = json_["distribution"].get(); + } + + if (json_.contains("locations")) { + for (auto loc : json_["locations"]) { + locations.push_back(StaticData::locationNameToEnum[loc.get()]); + } + } else if (json_.contains("location")) { + locations.push_back(StaticData::locationNameToEnum[json_["location"].get()]); + } + + if (json_.contains("itemNamesChosen")) { + for (auto name : json_["itemNamesChosen"]) { + itemNamesChosen.push_back(name.get()); + } + } else if (json_.contains("itemNameChosen")) { + itemNamesChosen.push_back(json_["itemNameChosen"].get()); + } + + if (json_.contains("areas")) { + for (auto area : json_["areas"]) { + areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[area]); + } + } else if (json_.contains("area")) { + areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[json_["area"]]); + } + + if (json_.contains("areaNamesChosen")) { + for (auto name : json_["areaNamesChosen"]) { + areaNamesChosen.push_back(name.get()); + } + } else if (json_.contains("areaNameChosen")) { + areaNamesChosen.push_back(json_["areaNameChosen"].get()); + } + + if (json_.contains("trials")) { + for (auto trial : json_["trials"]) { + trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[trial]); + } + } else if (json_.contains("trial")) { + trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[json_["trial"]]); + } + + if (json_.contains("hintKeys")) { + for (auto hintKey : json_["hintKeys"]) { + hintKeys.push_back((RandomizerHintTextKey)hintKey.get()); + } + } else if (json_.contains("hintKey")) { + hintKeys.push_back((RandomizerHintTextKey)json_["hintKey"].get()); + } + + if (json_.contains("hintTextsChosen")) { + for (auto name : json_["hintTextsChosen"]) { + hintTextsChosen.push_back(name.get()); + } + } else if (json_.contains("hintTextChosen")) { + hintTextsChosen.push_back(json_["hintTextChosen"].get()); + } + + if (json_.contains("num")) { + num = json_["num"].get(); + } + + FillGapsInData(); + SetLocationsAsHinted(); +} + +void Hint::FillGapsInData() { + auto ctx = Rando::Context::GetInstance(); + if (locations.size() == 0 && StaticData::staticHintInfoMap.contains(ownKey)) { + locations = StaticData::staticHintInfoMap[ownKey].targetChecks; + } + bool fillAreas = true; + bool fillItems = true; + if (areas.size() > 0) { + fillAreas = false; + } + if (items.size() > 0) { + fillItems = false; + } + for (uint8_t c = 0; c < locations.size(); c++) { + // if area matters for the hint, it should be specified and not left to this + if (fillAreas) { + areas.push_back(ctx->GetItemLocation(locations[c])->GetFirstArea()); + } + if (fillItems) { + items.push_back(ctx->GetItemLocation(locations[c])->GetPlacedRandomizerGet()); + } } - } } void Hint::SetLocationsAsHinted() const { - auto ctx = Rando::Context::GetInstance(); - for (uint8_t count = 0; count < locations.size(); count++){ - ctx->GetItemLocation(locations[count])->AddHintedBy(ownKey); - } + auto ctx = Rando::Context::GetInstance(); + for (uint8_t count = 0; count < locations.size(); count++) { + ctx->GetItemLocation(locations[count])->AddHintedBy(ownKey); + } } -uint8_t GetRandomHintTextEntry(const HintText hintText){ - auto ctx = Rando::Context::GetInstance(); - uint8_t size = 0; - if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS)){ - size = hintText.GetAmbiguousSize(); - } else if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)){ - size = hintText.GetObscureSize(); - } - if (size > 0){ - return Random(0, size); - } - return 0; +uint8_t GetRandomHintTextEntry(const HintText hintText) { + auto ctx = Rando::Context::GetInstance(); + uint8_t size = 0; + if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS)) { + size = hintText.GetAmbiguousSize(); + } else if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)) { + size = hintText.GetObscureSize(); + } + if (size > 0) { + return Random(0, size); + } + return 0; } -void Hint::NamesChosen(){ - auto ctx = Rando::Context::GetInstance(); - std::vector namesTemp = {}; - bool saveNames = false; - uint8_t numMessages = GetNumberOfMessages(); - for (uint8_t c = 0; c < numMessages; c++){ - uint8_t selection = GetRandomHintTextEntry(GetHintText(c)); - if (selection > 0){ - saveNames = true; - } - namesTemp.push_back(selection); - } - if (saveNames) { - hintTextsChosen = namesTemp; - } - - if (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_ITEM_AREA){ - for(uint8_t c = 0; c < locations.size(); c++){ - namesTemp = {}; - saveNames = false; - uint8_t selection = GetRandomHintTextEntry(GetItemHintText(c)); - if (selection > 0){ - saveNames = true; - } - namesTemp.push_back(selection); +void Hint::NamesChosen() { + auto ctx = Rando::Context::GetInstance(); + std::vector namesTemp = {}; + bool saveNames = false; + uint8_t numMessages = GetNumberOfMessages(); + for (uint8_t c = 0; c < numMessages; c++) { + uint8_t selection = GetRandomHintTextEntry(GetHintText(c)); + if (selection > 0) { + saveNames = true; + } + namesTemp.push_back(selection); } if (saveNames) { - itemNamesChosen = namesTemp; + hintTextsChosen = namesTemp; } - } - if (hintType == HINT_TYPE_FOOLISH || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_WOTH || - hintType == HINT_TYPE_ALTAR_CHILD || hintType == HINT_TYPE_ALTAR_ADULT){ - namesTemp = {}; - saveNames = false; - for(uint8_t c = 0; c < areas.size(); c++){ - uint8_t selection = GetRandomHintTextEntry(GetAreaHintText(c)); - if (selection > 0){ - saveNames = true; - } - namesTemp.push_back(selection); + if (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_ITEM_AREA) { + for (uint8_t c = 0; c < locations.size(); c++) { + namesTemp = {}; + saveNames = false; + uint8_t selection = GetRandomHintTextEntry(GetItemHintText(c)); + if (selection > 0) { + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + itemNamesChosen = namesTemp; + } } - if (saveNames) { - areaNamesChosen = namesTemp; + + if (hintType == HINT_TYPE_FOOLISH || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_WOTH || + hintType == HINT_TYPE_ALTAR_CHILD || hintType == HINT_TYPE_ALTAR_ADULT) { + namesTemp = {}; + saveNames = false; + for (uint8_t c = 0; c < areas.size(); c++) { + uint8_t selection = GetRandomHintTextEntry(GetAreaHintText(c)); + if (selection > 0) { + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + areaNamesChosen = namesTemp; + } } - } } uint8_t Hint::GetNumberOfMessages() const { - size_t numMessages = std::max(messages.size(), hintKeys.size()); - if (StaticData::staticHintInfoMap.contains(ownKey)){ - numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages); - } - if (numMessages == 0){ - numMessages = 1; //RANDOTODO make std::max actually fucking work for 3 arguments - } - return numMessages; + size_t numMessages = std::max(messages.size(), hintKeys.size()); + if (StaticData::staticHintInfoMap.contains(ownKey)) { + numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages); + } + if (numMessages == 0) { + numMessages = 1; // RANDOTODO make std::max actually fucking work for 3 arguments + } + return numMessages; } const std::vector Hint::GetAllMessageStrings(MessageFormat format) const { - std::vector hintMessages = {}; - uint8_t numMessages = GetNumberOfMessages(); - for (int c = 0; c < numMessages; c++){ - hintMessages.push_back(GetHintMessage(format, c).GetForCurrentLanguage(format)); - } - return hintMessages; + std::vector hintMessages = {}; + uint8_t numMessages = GetNumberOfMessages(); + for (int c = 0; c < numMessages; c++) { + hintMessages.push_back(GetHintMessage(format, c).GetForCurrentLanguage(format)); + } + return hintMessages; } const HintText Hint::GetHintText(uint8_t id) const { - auto ctx = Rando::Context::GetInstance(); - if (hintKeys.size() > id){ - return StaticData::hintTextTable[hintKeys[id]]; - } -// If a static hint, load default from staticHintInfoMap - if (StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].hintKeys.size() > id){ - return StaticData::hintTextTable[StaticData::staticHintInfoMap[ownKey].hintKeys[id]]; - } + auto ctx = Rando::Context::GetInstance(); + if (hintKeys.size() > id) { + return StaticData::hintTextTable[hintKeys[id]]; + } + // If a static hint, load default from staticHintInfoMap + if (StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].hintKeys.size() > id) { + return StaticData::hintTextTable[StaticData::staticHintInfoMap[ownKey].hintKeys[id]]; + } - switch (hintType){ - case HINT_TYPE_HINT_KEY: - return StaticData::hintTextTable[0]; - break; - case HINT_TYPE_TRIAL: - if (ctx->GetTrial(trials[0])->IsRequired()) { - return StaticData::hintTextTable[RHT_TRIAL_ON]; - } else { - return StaticData::hintTextTable[RHT_TRIAL_OFF]; - } - case HINT_TYPE_WOTH: - return StaticData::hintTextTable[RHT_WAY_OF_THE_HERO]; - case HINT_TYPE_FOOLISH: - return StaticData::hintTextTable[RHT_FOOLISH]; - case HINT_TYPE_ITEM: - if (locations.size() > 0) { - return *StaticData::GetLocation(locations[0])->GetHint(); - } else { - return CustomMessage("ERROR: ITEM HINT WITH NO LOCATIONS OR HINT KEY"); - } - case HINT_TYPE_ITEM_AREA: - if (locations.size() > 0) { - if (StaticData::GetLocation(locations[0])->IsDungeon()) { - return StaticData::hintTextTable[RHT_HOARDS]; - } else { - return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT]; - } - } else { - return CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION"); //RANDOTODO get isDungeon from area? - } - default: - return CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT"); - } + switch (hintType) { + case HINT_TYPE_HINT_KEY: + return StaticData::hintTextTable[0]; + break; + case HINT_TYPE_TRIAL: + if (ctx->GetTrial(trials[0])->IsRequired()) { + return StaticData::hintTextTable[RHT_TRIAL_ON]; + } else { + return StaticData::hintTextTable[RHT_TRIAL_OFF]; + } + case HINT_TYPE_WOTH: + return StaticData::hintTextTable[RHT_WAY_OF_THE_HERO]; + case HINT_TYPE_FOOLISH: + return StaticData::hintTextTable[RHT_FOOLISH]; + case HINT_TYPE_ITEM: + if (locations.size() > 0) { + return *StaticData::GetLocation(locations[0])->GetHint(); + } else { + return CustomMessage("ERROR: ITEM HINT WITH NO LOCATIONS OR HINT KEY"); + } + case HINT_TYPE_ITEM_AREA: + if (locations.size() > 0) { + if (StaticData::GetLocation(locations[0])->IsDungeon()) { + return StaticData::hintTextTable[RHT_HOARDS]; + } else { + return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT]; + } + } else { + return CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION"); // RANDOTODO get isDungeon from area? + } + default: + return CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT"); + } } const CustomMessage Hint::GetHintMessage(MessageFormat format, uint8_t id) const { - auto ctx = Rando::Context::GetInstance(); - CustomMessage hintText = CustomMessage(""); + auto ctx = Rando::Context::GetInstance(); + CustomMessage hintText = CustomMessage(""); - uint8_t chosenMessage = 0; - if (hintTextsChosen.size() > id){ - chosenMessage = id; - } + uint8_t chosenMessage = 0; + if (hintTextsChosen.size() > id) { + chosenMessage = id; + } - if (hintType == HINT_TYPE_MESSAGE){ - if (id < messages.size()){ - hintText = messages[id]; - } - } else if (hintType == HINT_TYPE_ALTAR_CHILD){ - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)){ - hintText = StaticData::hintTextTable[RHT_CHILD_ALTAR_STONES].GetHintMessage(); - } - if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN)) { - hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN].GetHintMessage()); - } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY)) { - hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY].GetHintMessage()); + if (hintType == HINT_TYPE_MESSAGE) { + if (id < messages.size()) { + hintText = messages[id]; + } + } else if (hintType == HINT_TYPE_ALTAR_CHILD) { + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + hintText = StaticData::hintTextTable[RHT_CHILD_ALTAR_STONES].GetHintMessage(); + } + if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN)) { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN].GetHintMessage()); + } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY)) { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY].GetHintMessage()); + } else { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED].GetHintMessage()); + } + } else if (hintType == HINT_TYPE_ALTAR_ADULT) { + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + hintText = StaticData::hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS].GetHintMessage(); + } + hintText += GetBridgeReqsText() + GetGanonBossKeyText() + + StaticData::hintTextTable[RHT_ADULT_ALTAR_TEXT_END].GetHintMessage(); } else { - hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED].GetHintMessage()); + hintText = GetHintText(id).GetHintMessage(chosenMessage); } - } else if (hintType == HINT_TYPE_ALTAR_ADULT){ - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)){ - hintText = StaticData::hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS].GetHintMessage(); + + std::vector toInsert = {}; + + switch (hintType) { + case HINT_TYPE_ITEM: { + // if we write items + for (uint8_t b = 0; b < locations.size(); b++) { + toInsert.push_back(GetItemName(b)); + } + break; + } + case HINT_TYPE_TRIAL: { + // If we write trials + for (uint8_t b = 0; b < trials.size(); b++) { + toInsert.push_back(ctx->GetTrial(trials[b])->GetName()); + } + break; + } + case HINT_TYPE_ITEM_AREA: { + // If we write items and areas + for (uint8_t b = 0; b < items.size(); b++) { + toInsert.push_back(GetItemName(b)); + toInsert.push_back(GetAreaName(b)); + } + break; + } + case HINT_TYPE_ALTAR_CHILD: + case HINT_TYPE_ALTAR_ADULT: + case HINT_TYPE_AREA: + case HINT_TYPE_WOTH: + case HINT_TYPE_FOOLISH: { + // If we write areas + for (uint8_t b = 0; b < areas.size(); b++) { + toInsert.push_back(GetAreaName(b)); + } + break; + } + default: + break; } - hintText += GetBridgeReqsText() + GetGanonBossKeyText() + StaticData::hintTextTable[RHT_ADULT_ALTAR_TEXT_END].GetHintMessage(); - } else { - hintText = GetHintText(id).GetHintMessage(chosenMessage); - } - std::vector toInsert = {}; + hintText.InsertNames(toInsert); - switch (hintType){ - case HINT_TYPE_ITEM:{ - //if we write items - for(uint8_t b = 0; b < locations.size(); b++){ - toInsert.push_back(GetItemName(b)); - } - break;} - case HINT_TYPE_TRIAL:{ - //If we write trials - for(uint8_t b = 0; b < trials.size(); b++){ - toInsert.push_back(ctx->GetTrial(trials[b])->GetName()); - } - break;} - case HINT_TYPE_ITEM_AREA:{ - //If we write items and areas - for(uint8_t b = 0; b < items.size(); b++){ - toInsert.push_back(GetItemName(b)); - toInsert.push_back(GetAreaName(b)); - } - break;} - case HINT_TYPE_ALTAR_CHILD: - case HINT_TYPE_ALTAR_ADULT: - case HINT_TYPE_AREA: - case HINT_TYPE_WOTH: - case HINT_TYPE_FOOLISH:{ - //If we write areas - for(uint8_t b = 0; b < areas.size(); b++){ - toInsert.push_back(GetAreaName(b)); - } - break;} - default: - break; - } + if (num != 0) { + hintText.InsertNumber(num); + } - hintText.InsertNames(toInsert); + if (format == MF_FORMATTED) { + hintText.Format(); + } else if (format == MF_AUTO_FORMAT) { + hintText.AutoFormat(); + } else if (format == MF_CLEAN) { + hintText.Clean(); + } - if (num != 0){ - hintText.InsertNumber(num); - } - - if (format == MF_FORMATTED){ - hintText.Format(); - } else if (format == MF_AUTO_FORMAT){ - hintText.AutoFormat(); - } else if (format == MF_CLEAN){ - hintText.Clean(); - } - - return hintText; + return hintText; } oJson Hint::toJSON() { - auto ctx = Rando::Context::GetInstance(); - nlohmann::ordered_json log = {}; - if (enabled){ - log["type"] = StaticData::hintTypeNames[hintType].GetForCurrentLanguage(MF_CLEAN); - - std::vector hintMessages = GetAllMessageStrings(MF_CLEAN); - if (hintMessages.size() == 1){ - log["message"] = hintMessages[0]; - } else if (hintMessages.size() > 1){ - log["messages"] = hintMessages; - } + auto ctx = Rando::Context::GetInstance(); + nlohmann::ordered_json log = {}; + if (enabled) { + log["type"] = StaticData::hintTypeNames[hintType].GetForCurrentLanguage(MF_CLEAN); - if (distribution != ""){ - log["distribution"] = distribution; - } - - if (hintType != HINT_TYPE_FOOLISH){ - if (!(StaticData::staticHintInfoMap.contains(ownKey) && - StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)){ - if (locations.size() == 1){ - log["location"] = StaticData::GetLocation(locations[0])->GetName();//RANDOTODO change to CustomMessage when VB is done; - } else if (locations.size() > 1){ - //If we have defaults, no need to write more - std::vector locStrings = {}; - for (size_t c = 0; c < locations.size(); c++){ - locStrings.push_back(StaticData::GetLocation(locations[c])->GetName());//RANDOTODO change to CustomMessage when VB is done - } - log["locations"] = locStrings; + std::vector hintMessages = GetAllMessageStrings(MF_CLEAN); + if (hintMessages.size() == 1) { + log["message"] = hintMessages[0]; + } else if (hintMessages.size() > 1) { + log["messages"] = hintMessages; } - } - - if (!(StaticData::staticHintInfoMap.contains(ownKey) && - StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)){ - if (items.size() == 1){ - log["item"] = StaticData::GetItemTable()[items[0]].GetName().GetEnglish();//RANDOTODO change to CustomMessage; - } else if (items.size() > 1){ - std::vector itemStrings = {}; - for (size_t c = 0; c < items.size(); c++){ - itemStrings.push_back(StaticData::GetItemTable()[items[c]].GetName().GetEnglish());//RANDOTODO change to CustomMessage - } - log["items"] = itemStrings; + + if (distribution != "") { + log["distribution"] = distribution; } - } - if (itemNamesChosen.size() == 1){ - log["itemNameChosen"] = itemNamesChosen[0]; - } else if (itemNamesChosen.size() > 1){ - std::vector nameNums = {}; - for (size_t c = 0; c < itemNamesChosen.size(); c++){ - nameNums.push_back(itemNamesChosen[c]); + if (hintType != HINT_TYPE_FOOLISH) { + if (!(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)) { + if (locations.size() == 1) { + log["location"] = StaticData::GetLocation(locations[0]) + ->GetName(); // RANDOTODO change to CustomMessage when VB is done; + } else if (locations.size() > 1) { + // If we have defaults, no need to write more + std::vector locStrings = {}; + for (size_t c = 0; c < locations.size(); c++) { + locStrings.push_back(StaticData::GetLocation(locations[c]) + ->GetName()); // RANDOTODO change to CustomMessage when VB is done + } + log["locations"] = locStrings; + } + } + + if (!(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)) { + if (items.size() == 1) { + log["item"] = StaticData::GetItemTable()[items[0]] + .GetName() + .GetEnglish(); // RANDOTODO change to CustomMessage; + } else if (items.size() > 1) { + std::vector itemStrings = {}; + for (size_t c = 0; c < items.size(); c++) { + itemStrings.push_back(StaticData::GetItemTable()[items[c]] + .GetName() + .GetEnglish()); // RANDOTODO change to CustomMessage + } + log["items"] = itemStrings; + } + } + + if (itemNamesChosen.size() == 1) { + log["itemNameChosen"] = itemNamesChosen[0]; + } else if (itemNamesChosen.size() > 1) { + std::vector nameNums = {}; + for (size_t c = 0; c < itemNamesChosen.size(); c++) { + nameNums.push_back(itemNamesChosen[c]); + } + log["itemNamesChosen"] = nameNums; + } + } + if (areas.size() == 1) { + log["area"] = + StaticData::hintTextTable[StaticData::areaNames[areas[0]]].GetClear().GetForCurrentLanguage(MF_CLEAN); + } else if (areas.size() > 0 && !(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)) { + // If we got locations from defaults, areas are derived from them and don't need logging + std::vector areaStrings = {}; + for (size_t c = 0; c < areas.size(); c++) { + areaStrings.push_back( + StaticData::hintTextTable[StaticData::areaNames[areas[c]]].GetClear().GetForCurrentLanguage( + MF_CLEAN)); + } + log["areas"] = areaStrings; } - log["itemNamesChosen"] = nameNums; - } - } - if (areas.size() == 1){ - log["area"] = StaticData::hintTextTable[StaticData::areaNames[areas[0]]].GetClear().GetForCurrentLanguage(MF_CLEAN); - } else if (areas.size() > 0 && - !(StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)){ - // If we got locations from defaults, areas are derived from them and don't need logging - std::vector areaStrings = {}; - for (size_t c = 0; c < areas.size(); c++){ - areaStrings.push_back(StaticData::hintTextTable[StaticData::areaNames[areas[c]]].GetClear().GetForCurrentLanguage(MF_CLEAN)); - } - log["areas"] = areaStrings; - } - if (areaNamesChosen.size() == 1){ - log["areaNameChosen"] = areaNamesChosen[0]; - } else if (areaNamesChosen.size() > 1){ - std::vector nameNums = {}; - for (size_t c = 0; c < areaNamesChosen.size(); c++){ - nameNums.push_back(areaNamesChosen[c]); - } - log["areaNamesChosen"] = nameNums; - } + if (areaNamesChosen.size() == 1) { + log["areaNameChosen"] = areaNamesChosen[0]; + } else if (areaNamesChosen.size() > 1) { + std::vector nameNums = {}; + for (size_t c = 0; c < areaNamesChosen.size(); c++) { + nameNums.push_back(areaNamesChosen[c]); + } + log["areaNamesChosen"] = nameNums; + } - if (trials.size() == 1){ - log["trial"] = ctx->GetTrial(trials[0])->GetName().GetForCurrentLanguage(MF_CLEAN); - } else if (trials.size() > 0){ - std::vector trialStrings = {}; - for (size_t c = 0; c < trials.size(); c++){ - trialStrings.push_back(ctx->GetTrial(trials[c])->GetName().GetForCurrentLanguage(MF_CLEAN)); - } - log["trials"] = trialStrings; - } + if (trials.size() == 1) { + log["trial"] = ctx->GetTrial(trials[0])->GetName().GetForCurrentLanguage(MF_CLEAN); + } else if (trials.size() > 0) { + std::vector trialStrings = {}; + for (size_t c = 0; c < trials.size(); c++) { + trialStrings.push_back(ctx->GetTrial(trials[c])->GetName().GetForCurrentLanguage(MF_CLEAN)); + } + log["trials"] = trialStrings; + } - if (hintKeys.size() == 1){ - log["hintKey"] = hintKeys[0]; - } else if (hintKeys.size() > 1){ - std::vector hintKeyNums = {}; - for (size_t c = 0; c < hintKeys.size(); c++){ - hintKeyNums.push_back(hintKeys[c]); - } - log["hintKeys"] = hintKeyNums; - } + if (hintKeys.size() == 1) { + log["hintKey"] = hintKeys[0]; + } else if (hintKeys.size() > 1) { + std::vector hintKeyNums = {}; + for (size_t c = 0; c < hintKeys.size(); c++) { + hintKeyNums.push_back(hintKeys[c]); + } + log["hintKeys"] = hintKeyNums; + } - if (hintTextsChosen.size() == 1){ - log["hintTextChosen"] = hintTextsChosen[0]; - } else if (hintTextsChosen.size() > 1){ - std::vector nameNums = {}; - for (size_t c = 0; c < hintTextsChosen.size(); c++){ - nameNums.push_back(hintTextsChosen[c]); - } - log["hintTextsChosen"] = nameNums; - } + if (hintTextsChosen.size() == 1) { + log["hintTextChosen"] = hintTextsChosen[0]; + } else if (hintTextsChosen.size() > 1) { + std::vector nameNums = {}; + for (size_t c = 0; c < hintTextsChosen.size(); c++) { + nameNums.push_back(hintTextsChosen[c]); + } + log["hintTextsChosen"] = nameNums; + } - if (num != 0){ - log["num"] = num; + if (num != 0) { + log["num"] = num; + } } - - } - return log; + return log; } -void Hint::logHint(oJson& jsonData){ - auto ctx = Rando::Context::GetInstance(); - std::string logMap = "Static Hints"; - bool staticHint = true; - if (ownKey < RH_GANONDORF_HINT){ - logMap = "Gossip Stone Hints"; - staticHint = false; - } - if (enabled && - (!(staticHint && (hintType == HINT_TYPE_ITEM) && ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_CLEAR)))){ - //skip if not enabled or if a static hint with no possible variance - jsonData[logMap][Rando::StaticData::hintNames[ownKey].GetForCurrentLanguage(MF_CLEAN)] = toJSON(); - } +void Hint::logHint(oJson& jsonData) { + auto ctx = Rando::Context::GetInstance(); + std::string logMap = "Static Hints"; + bool staticHint = true; + if (ownKey < RH_GANONDORF_HINT) { + logMap = "Gossip Stone Hints"; + staticHint = false; + } + if (enabled && + (!(staticHint && (hintType == HINT_TYPE_ITEM) && ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_CLEAR)))) { + // skip if not enabled or if a static hint with no possible variance + jsonData[logMap][Rando::StaticData::hintNames[ownKey].GetForCurrentLanguage(MF_CLEAN)] = toJSON(); + } } const HintText Hint::GetItemHintText(uint8_t slot, bool mysterious) const { - //RANDOTODO make unreliant on locations, or make Hint accept ItemLocation - auto ctx = Rando::Context::GetInstance(); - RandomizerCheck hintedCheck = locations[slot]; - RandomizerGet targetRG = ctx->GetItemLocation(hintedCheck)->GetPlacedRandomizerGet(); - if (mysterious){ - return StaticData::hintTextTable[RHT_MYSTERIOUS_ITEM]; - } else if (!ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS) && targetRG == RG_ICE_TRAP) { //RANDOTODO store in item hint instead of item - return HintText(CustomMessage({ctx->overrides[hintedCheck].GetTrickName()})); - } else { - return ctx->GetItemLocation(hintedCheck)->GetPlacedItem().GetHint(); - } + // RANDOTODO make unreliant on locations, or make Hint accept ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck hintedCheck = locations[slot]; + RandomizerGet targetRG = ctx->GetItemLocation(hintedCheck)->GetPlacedRandomizerGet(); + if (mysterious) { + return StaticData::hintTextTable[RHT_MYSTERIOUS_ITEM]; + } else if (!ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS) && + targetRG == RG_ICE_TRAP) { // RANDOTODO store in item hint instead of item + return HintText(CustomMessage({ ctx->overrides[hintedCheck].GetTrickName() })); + } else { + return ctx->GetItemLocation(hintedCheck)->GetPlacedItem().GetHint(); + } } -const HintText Hint::GetAreaHintText(uint8_t slot) const { - CustomMessage areaText; - if (yourPocket && areas[slot] == RA_LINKS_POCKET){ - return StaticData::hintTextTable[RHT_YOUR_POCKET]; - } else { - return StaticData::hintTextTable[Rando::StaticData::areaNames[areas[slot]]]; - } +const HintText Hint::GetAreaHintText(uint8_t slot) const { + CustomMessage areaText; + if (yourPocket && areas[slot] == RA_LINKS_POCKET) { + return StaticData::hintTextTable[RHT_YOUR_POCKET]; + } else { + return StaticData::hintTextTable[Rando::StaticData::areaNames[areas[slot]]]; + } } - -const CustomMessage Hint::GetItemName(uint8_t slot, bool mysterious) const { - uint8_t nameNum = 0; - if (itemNamesChosen.size() > slot){ - nameNum = itemNamesChosen[slot]; - } - return GetItemHintText(slot, mysterious).GetHintMessage(nameNum); +const CustomMessage Hint::GetItemName(uint8_t slot, bool mysterious) const { + uint8_t nameNum = 0; + if (itemNamesChosen.size() > slot) { + nameNum = itemNamesChosen[slot]; + } + return GetItemHintText(slot, mysterious).GetHintMessage(nameNum); } -const CustomMessage Hint::GetAreaName(uint8_t slot) const { - uint8_t nameNum = 0; - if (areaNamesChosen.size() > slot){ - nameNum = areaNamesChosen[slot]; - } - return GetAreaHintText(slot).GetHintMessage(nameNum); +const CustomMessage Hint::GetAreaName(uint8_t slot) const { + uint8_t nameNum = 0; + if (areaNamesChosen.size() > slot) { + nameNum = areaNamesChosen[slot]; + } + return GetAreaHintText(slot).GetHintMessage(nameNum); } - CustomMessage Hint::GetBridgeReqsText() { - auto ctx = Rando::Context::GetInstance(); - CustomMessage bridgeMessage; + auto ctx = Rando::Context::GetInstance(); + CustomMessage bridgeMessage; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN)) { - return StaticData::hintTextTable[RHT_BRIDGE_OPEN_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA)) { - return StaticData::hintTextTable[RHT_BRIDGE_VANILLA_HINT].GetHintMessage(); - } - 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).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).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).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).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).Get()); - } - else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { - return StaticData::hintTextTable[RHT_BRIDGE_GREG_HINT].GetHintMessage(); - } - return bridgeMessage; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN)) { + return StaticData::hintTextTable[RHT_BRIDGE_OPEN_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA)) { + return StaticData::hintTextTable[RHT_BRIDGE_VANILLA_HINT].GetHintMessage(); + } 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).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).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).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).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).Get()); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { + return StaticData::hintTextTable[RHT_BRIDGE_GREG_HINT].GetHintMessage(); + } + return bridgeMessage; } CustomMessage Hint::GetGanonBossKeyText() { - auto ctx = Rando::Context::GetInstance(); - CustomMessage ganonBossKeyMessage; + auto ctx = Rando::Context::GetInstance(); + CustomMessage ganonBossKeyMessage; - if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { - return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); - } + if (ctx->GetOption(RSK_TRIFORCE_HUNT)) { + return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); + } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { - return StaticData::hintTextTable[RHT_GANON_BK_START_WITH_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { - return StaticData::hintTextTable[RHT_GANON_BK_VANILLA_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON)) { - return StaticData::hintTextTable[RHT_GANON_BK_OWN_DUNGEON_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { - return StaticData::hintTextTable[RHT_GANON_BK_ANY_DUNGEON_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - return StaticData::hintTextTable[RHT_GANON_BK_OVERWORLD_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE)) { - return StaticData::hintTextTable[RHT_GANON_BK_ANYWHERE_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { - return StaticData::hintTextTable[RHT_GANON_BK_SKULLTULA_HINT].GetHintMessage(); - } - else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_VANILLA)) { - return StaticData::hintTextTable[RHT_LACS_VANILLA_HINT].GetHintMessage(); - } - 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).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).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).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).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).Get()); - } - return ganonBossKeyMessage; + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { + return StaticData::hintTextTable[RHT_GANON_BK_START_WITH_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { + return StaticData::hintTextTable[RHT_GANON_BK_VANILLA_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON)) { + return StaticData::hintTextTable[RHT_GANON_BK_OWN_DUNGEON_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { + return StaticData::hintTextTable[RHT_GANON_BK_ANY_DUNGEON_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + return StaticData::hintTextTable[RHT_GANON_BK_OVERWORLD_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE)) { + return StaticData::hintTextTable[RHT_GANON_BK_ANYWHERE_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { + return StaticData::hintTextTable[RHT_GANON_BK_SKULLTULA_HINT].GetHintMessage(); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_VANILLA)) { + return StaticData::hintTextTable[RHT_LACS_VANILLA_HINT].GetHintMessage(); + } 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).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).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).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).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).Get()); + } + return ganonBossKeyMessage; } - void Hint::AddHintedLocation(RandomizerCheck location) { locations.push_back(location); } @@ -671,53 +656,53 @@ const std::string& Hint::GetDistribution() const { return distribution; } -bool Hint::IsEnabled() const{ - return enabled; +bool Hint::IsEnabled() const { + return enabled; } -std::vector Hint::GetHintTextKeys() const{ - return hintKeys; +std::vector Hint::GetHintTextKeys() const { + return hintKeys; } -std::vector Hint::GetHintedItems() const{ - return items; +std::vector Hint::GetHintedItems() const { + return items; } -std::vector Hint::GetItemNamesChosen() const{ - return itemNamesChosen; +std::vector Hint::GetItemNamesChosen() const { + return itemNamesChosen; } -std::vector Hint::GetHintTextsChosen() const{ - return hintTextsChosen; +std::vector Hint::GetHintTextsChosen() const { + return hintTextsChosen; } -std::vector Hint::GetAreaTextsChosen() const{ - return areaNamesChosen; +std::vector Hint::GetAreaTextsChosen() const { + return areaNamesChosen; } -std::vector Hint::GetHintedTrials() const{ - return trials; +std::vector Hint::GetHintedTrials() const { + return trials; } -int Hint::GetNum(){ - return num; +int Hint::GetNum() { + return num; } void Hint::ResetVariables() { - ownKey = RH_NONE; - num = 0; - yourPocket = false; - messages = {}; - hintKeys = {}; - locations = {}; - items = {}; - trials = {}; - hintType = HINT_TYPE_HINT_KEY; - areas = {}; - distribution = ""; - enabled = false; - itemNamesChosen = {}; - hintTextsChosen = {}; - areaNamesChosen = {}; + ownKey = RH_NONE; + num = 0; + yourPocket = false; + messages = {}; + hintKeys = {}; + locations = {}; + items = {}; + trials = {}; + hintType = HINT_TYPE_HINT_KEY; + areas = {}; + distribution = ""; + enabled = false; + itemNamesChosen = {}; + hintTextsChosen = {}; + areaNamesChosen = {}; } -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hint.h b/soh/soh/Enhancements/randomizer/hint.h index 03e1af850..e0e595395 100644 --- a/soh/soh/Enhancements/randomizer/hint.h +++ b/soh/soh/Enhancements/randomizer/hint.h @@ -10,73 +10,64 @@ using oJson = nlohmann::ordered_json; namespace Rando { class Hint { - public: - Hint(); - Hint(RandomizerHint ownKey_, - HintType hintType_, - std::string distributionName_, - std::vector hintKeys_, - std::vector locations_, - std::vector areas_ = {}, - std::vector trials_ = {}); - Hint(RandomizerHint ownKey_, - HintType hintType_, - std::vector hintKeys_, - std::vector locations_ = {}, - std::vector areas_ = {}, - std::vector trials_ = {}, - bool yourPocket_ = false, - int num_ = 0); - Hint(RandomizerHint ownKey_, std::vector messages_); - Hint(RandomizerHint ownKey_, nlohmann::json json_); - void FillGapsInData(); - void SetLocationsAsHinted() const; - void NamesChosen(); - uint8_t GetNumberOfMessages() const; - const std::vector GetAllMessageStrings(MessageFormat format = MF_AUTO_FORMAT) const ; - const CustomMessage GetHintMessage(MessageFormat format = MF_AUTO_FORMAT, uint8_t id = 0) const ; - const HintText GetHintText(uint8_t id = 0) const; - oJson toJSON(); - void logHint(oJson& jsonData); - const HintText GetItemHintText(uint8_t slot, bool mysterious = false) const; - const HintText GetAreaHintText(uint8_t slot) const; - const CustomMessage GetItemName(uint8_t slot, bool mysterious = false) const; - const CustomMessage GetAreaName(uint8_t slot) const; - static CustomMessage GetBridgeReqsText(); - static CustomMessage GetGanonBossKeyText(); - void AddHintedLocation (RandomizerCheck location); - std::vector GetHintedLocations() const; - void SetHintType (HintType type); - HintType GetHintType() const; - void AddHintedArea (RandomizerArea area); - std::vector GetHintedAreas() const; - void SetDistribution (std::string distribution); - const std::string& GetDistribution() const; - bool IsEnabled() const; - std::vector GetHintTextKeys() const; - std::vector GetHintedItems() const; - std::vector GetItemNamesChosen() const; - std::vector GetHintTextsChosen() const; - std::vector GetAreaTextsChosen() const; - std::vector GetHintedTrials() const; - int GetNum(); - void ResetVariables(); + public: + Hint(); + Hint(RandomizerHint ownKey_, HintType hintType_, std::string distributionName_, + std::vector hintKeys_, std::vector locations_, + std::vector areas_ = {}, std::vector trials_ = {}); + Hint(RandomizerHint ownKey_, HintType hintType_, std::vector hintKeys_, + std::vector locations_ = {}, std::vector areas_ = {}, + std::vector trials_ = {}, bool yourPocket_ = false, int num_ = 0); + Hint(RandomizerHint ownKey_, std::vector messages_); + Hint(RandomizerHint ownKey_, nlohmann::json json_); + void FillGapsInData(); + void SetLocationsAsHinted() const; + void NamesChosen(); + uint8_t GetNumberOfMessages() const; + const std::vector GetAllMessageStrings(MessageFormat format = MF_AUTO_FORMAT) const; + const CustomMessage GetHintMessage(MessageFormat format = MF_AUTO_FORMAT, uint8_t id = 0) const; + const HintText GetHintText(uint8_t id = 0) const; + oJson toJSON(); + void logHint(oJson& jsonData); + const HintText GetItemHintText(uint8_t slot, bool mysterious = false) const; + const HintText GetAreaHintText(uint8_t slot) const; + const CustomMessage GetItemName(uint8_t slot, bool mysterious = false) const; + const CustomMessage GetAreaName(uint8_t slot) const; + static CustomMessage GetBridgeReqsText(); + static CustomMessage GetGanonBossKeyText(); + void AddHintedLocation(RandomizerCheck location); + std::vector GetHintedLocations() const; + void SetHintType(HintType type); + HintType GetHintType() const; + void AddHintedArea(RandomizerArea area); + std::vector GetHintedAreas() const; + void SetDistribution(std::string distribution); + const std::string& GetDistribution() const; + bool IsEnabled() const; + std::vector GetHintTextKeys() const; + std::vector GetHintedItems() const; + std::vector GetItemNamesChosen() const; + std::vector GetHintTextsChosen() const; + std::vector GetAreaTextsChosen() const; + std::vector GetHintedTrials() const; + int GetNum(); + void ResetVariables(); - private: - RandomizerHint ownKey = RH_NONE; - HintType hintType = HINT_TYPE_HINT_KEY; - std::string distribution = ""; - std::vector hintKeys = {}; - std::vector locations = {}; - std::vector areas = {}; - std::vector trials = {}; - bool yourPocket = false; - int num = 0; - std::vector messages = {}; - std::vector items = {}; - bool enabled = false; - std::vector itemNamesChosen = {}; - std::vector hintTextsChosen = {}; - std::vector areaNamesChosen = {}; + private: + RandomizerHint ownKey = RH_NONE; + HintType hintType = HINT_TYPE_HINT_KEY; + std::string distribution = ""; + std::vector hintKeys = {}; + std::vector locations = {}; + std::vector areas = {}; + std::vector trials = {}; + bool yourPocket = false; + int num = 0; + std::vector messages = {}; + std::vector items = {}; + bool enabled = false; + std::vector itemNamesChosen = {}; + std::vector hintTextsChosen = {}; + std::vector areaNamesChosen = {}; }; -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index a3088aabc..5a803f39b 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -61,9 +61,10 @@ extern "C" { extern SaveContext gSaveContext; extern PlayState* gPlayState; extern void func_8084DFAC(PlayState* play, Player* player); -extern void Player_SetupActionPreserveAnimMovement(PlayState* play, Player* player, PlayerActionFunc actionFunc, s32 flags); +extern void Player_SetupActionPreserveAnimMovement(PlayState* play, Player* player, PlayerActionFunc actionFunc, + s32 flags); extern s32 Player_SetupWaitForPutAway(PlayState* play, Player* player, AfterPutAwayFunc func); -extern void Play_InitEnvironment(PlayState * play, s16 skyboxId); +extern void Play_InitEnvironment(PlayState* play, s16 skyboxId); extern void EnMk_Wait(EnMk* enMk, PlayState* play); extern void func_80ABA778(EnNiwLady* enNiwLady, PlayState* play); extern void EnGe1_Wait_Archery(EnGe1* enGe1, PlayState* play); @@ -77,20 +78,21 @@ bool LocMatchesQuest(Rando::Location loc) { return true; } else { auto dungeon = OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene()); - return (dungeon->IsMQ() && loc.GetQuest() == RCQUEST_MQ) || (dungeon->IsVanilla() && loc.GetQuest() == RCQUEST_VANILLA); + return (dungeon->IsMQ() && loc.GetQuest() == RCQUEST_MQ) || + (dungeon->IsVanilla() && loc.GetQuest() == RCQUEST_VANILLA); } } RandomizerCheck GetRandomizerCheckFromFlag(int16_t flagType, int16_t flag) { for (auto& loc : Rando::StaticData::GetLocationTable()) { - if ((loc.GetCollectionCheck().flag == flag && ( - (flagType == FLAG_INF_TABLE && loc.GetCollectionCheck().type == SPOILER_CHK_INF_TABLE) || - (flagType == FLAG_EVENT_CHECK_INF && loc.GetCollectionCheck().type == SPOILER_CHK_EVENT_CHK_INF) || - (flagType == FLAG_ITEM_GET_INF && loc.GetCollectionCheck().type == SPOILER_CHK_ITEM_GET_INF) || - (flagType == FLAG_RANDOMIZER_INF && loc.GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF) - ) || - (loc.GetActorParams() == flag && flagType == FLAG_GS_TOKEN && loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA) - ) && LocMatchesQuest(loc)) { + if ((loc.GetCollectionCheck().flag == flag && + ((flagType == FLAG_INF_TABLE && loc.GetCollectionCheck().type == SPOILER_CHK_INF_TABLE) || + (flagType == FLAG_EVENT_CHECK_INF && loc.GetCollectionCheck().type == SPOILER_CHK_EVENT_CHK_INF) || + (flagType == FLAG_ITEM_GET_INF && loc.GetCollectionCheck().type == SPOILER_CHK_ITEM_GET_INF) || + (flagType == FLAG_RANDOMIZER_INF && loc.GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF)) || + (loc.GetActorParams() == flag && flagType == FLAG_GS_TOKEN && + loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA)) && + LocMatchesQuest(loc)) { return loc.GetRandomizerCheck(); } } @@ -100,11 +102,11 @@ RandomizerCheck GetRandomizerCheckFromFlag(int16_t flagType, int16_t flag) { RandomizerCheck GetRandomizerCheckFromSceneFlag(int16_t sceneNum, int16_t flagType, int16_t flag) { for (auto& loc : Rando::StaticData::GetLocationTable()) { - if (loc.GetCollectionCheck().scene == sceneNum && loc.GetCollectionCheck().flag == flag && ( - (flagType == FLAG_SCENE_TREASURE && loc.GetCollectionCheck().type == SPOILER_CHK_CHEST) || - (flagType == FLAG_SCENE_COLLECTIBLE && loc.GetCollectionCheck().type == SPOILER_CHK_COLLECTABLE) || - (flagType == FLAG_GS_TOKEN && loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA) - ) && LocMatchesQuest(loc)) { + if (loc.GetCollectionCheck().scene == sceneNum && loc.GetCollectionCheck().flag == flag && + ((flagType == FLAG_SCENE_TREASURE && loc.GetCollectionCheck().type == SPOILER_CHK_CHEST) || + (flagType == FLAG_SCENE_COLLECTIBLE && loc.GetCollectionCheck().type == SPOILER_CHK_COLLECTABLE) || + (flagType == FLAG_GS_TOKEN && loc.GetCollectionCheck().type == SPOILER_CHK_GOLD_SKULLTULA)) && + LocMatchesQuest(loc)) { return loc.GetRandomizerCheck(); } } @@ -125,7 +127,8 @@ bool MeetsLACSRequirements() { } break; case RO_GANON_BOSS_KEY_LACS_REWARDS: - if ((CheckMedallionCount() + CheckStoneCount() + CheckLACSRewardCount()) >= RAND_GET_OPTION(RSK_LACS_REWARD_COUNT)) { + if ((CheckMedallionCount() + CheckStoneCount() + CheckLACSRewardCount()) >= + RAND_GET_OPTION(RSK_LACS_REWARD_COUNT)) { return true; } break; @@ -174,13 +177,15 @@ bool MeetsRainbowBridgeRequirements() { break; } case RO_BRIDGE_MEDALLIONS: { - if ((CheckMedallionCount() + CheckBridgeRewardCount()) >= RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT)) { + if ((CheckMedallionCount() + CheckBridgeRewardCount()) >= + RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT)) { return true; } break; } case RO_BRIDGE_DUNGEON_REWARDS: { - if ((CheckMedallionCount() + CheckStoneCount() + CheckBridgeRewardCount()) >= RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_REWARD_COUNT)) { + if ((CheckMedallionCount() + CheckStoneCount() + CheckBridgeRewardCount()) >= + RAND_GET_OPTION(RSK_RAINBOW_BRIDGE_REWARD_COUNT)) { return true; } break; @@ -232,7 +237,7 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { } if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_TALON_WOKEN_IN_CASTLE) { - //remove chicken as this is the only use for it + // remove chicken as this is the only use for it Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN); } @@ -245,11 +250,15 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { } RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag); - if (rc == RC_UNKNOWN_CHECK) return; + if (rc == RC_UNKNOWN_CHECK) + return; - if (flagType == FLAG_GS_TOKEN && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) return; + if (flagType == FLAG_GS_TOKEN && + Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_TOKENS).Is(RO_TOKENSANITY_OFF)) + return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; + if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) + return; SPDLOG_INFO("Queuing RC: {}", static_cast(rc)); randomizerQueuedChecks.push(rc); @@ -257,17 +266,17 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) { void RandomizerOnSceneFlagSetHandler(int16_t sceneNum, int16_t flagType, int16_t flag) { if (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && - sceneNum == SCENE_GERUDOS_FORTRESS && - flagType == FLAG_SCENE_SWITCH && - flag == 0x3A) { + sceneNum == SCENE_GERUDOS_FORTRESS && flagType == FLAG_SCENE_SWITCH && flag == 0x3A) { Flags_SetRandomizerInf(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN); } RandomizerCheck rc = GetRandomizerCheckFromSceneFlag(sceneNum, flagType, flag); - if (rc == RC_UNKNOWN_CHECK) return; + if (rc == RC_UNKNOWN_CHECK) + return; auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); - if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) return; + if (loc == nullptr || loc->HasObtained() || loc->GetPlacedRandomizerGet() == RG_NONE) + return; SPDLOG_INFO("Queuing RC: {}", static_cast(rc)); randomizerQueuedChecks.push(rc); @@ -277,14 +286,17 @@ static Vec3f spawnPos = { 0.0f, -999.0f, 0.0f }; void RandomizerOnPlayerUpdateForRCQueueHandler() { // If we're already queued, don't queue again - if (randomizerQueuedCheck != RC_UNKNOWN_CHECK) return; + if (randomizerQueuedCheck != RC_UNKNOWN_CHECK) + return; // If there's nothing to queue, don't queue - if (randomizerQueuedChecks.size() < 1) return; + if (randomizerQueuedChecks.size() < 1) + return; // If we're in a cutscene, don't queue Player* player = GET_PLAYER(gPlayState); - if (Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { + if (Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || + player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { return; } @@ -292,7 +304,8 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { auto loc = Rando::Context::GetInstance()->GetItemLocation(rc); 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); + GetItemEntry getItemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)vanillaRandomizerGet); if (loc->HasObtained()) { SPDLOG_INFO("RC {} already obtained, skipping", static_cast(rc)); @@ -300,32 +313,25 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { iceTrapScale = 0.0f; randomizerQueuedCheck = rc; randomizerQueuedItemEntry = getItemEntry; - SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId, static_cast(rc)); + SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId, + static_cast(rc)); if ( // Skipping ItemGet animation incompatible with checks that require closing a text box to finish - rc != RC_HF_OCARINA_OF_TIME_ITEM && - rc != RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && - rc != RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE && - rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE && + rc != RC_HF_OCARINA_OF_TIME_ITEM && rc != RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && + rc != RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE && rc != RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE && // Always show ItemGet animation for ice traps !(getItemEntry.modIndex == MOD_RANDOMIZER && getItemEntry.getItemId == RG_ICE_TRAP) && // Always show ItemGet animation outside of randomizer to keep behaviour consistent in vanilla IS_RANDO && - ( - CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_ALL || - ( - CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_JUNK && - ( - //crude fix to ensure map hints are readable. Ideally replace with better hint tracking. - !(getItemEntry.getItemId >= RG_DEKU_TREE_MAP && getItemEntry.getItemId <= RG_ICE_CAVERN_MAP && getItemEntry.modIndex == MOD_RANDOMIZER) && ( - getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || - getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || - getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER - ) - ) - ) - ) - ) { + (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_ALL || + (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK) == SGIA_JUNK && + ( + // crude fix to ensure map hints are readable. Ideally replace with better hint tracking. + !(getItemEntry.getItemId >= RG_DEKU_TREE_MAP && getItemEntry.getItemId <= RG_ICE_CAVERN_MAP && + getItemEntry.modIndex == MOD_RANDOMIZER) && + (getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || + getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || + getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER))))) { Item_DropCollectible(gPlayState, &spawnPos, ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000); } } @@ -334,14 +340,18 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() { } void RandomizerOnPlayerUpdateForItemQueueHandler() { - if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) return; + if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) + return; Player* player = GET_PLAYER(gPlayState); - if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { + if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || + player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || + player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { return; } - SPDLOG_INFO("Attempting to give Item mod {} item {} from RC {}", randomizerQueuedItemEntry.modIndex, randomizerQueuedItemEntry.itemId, static_cast(randomizerQueuedCheck)); + SPDLOG_INFO("Attempting to give Item mod {} item {} from RC {}", randomizerQueuedItemEntry.modIndex, + randomizerQueuedItemEntry.itemId, static_cast(randomizerQueuedCheck)); GiveItemEntryWithoutActor(gPlayState, randomizerQueuedItemEntry); if (player->stateFlags1 & PLAYER_STATE1_IN_WATER) { // Allow the player to receive the item while swimming @@ -351,11 +361,14 @@ void RandomizerOnPlayerUpdateForItemQueueHandler() { } void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { - if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) return; + if (randomizerQueuedCheck == RC_UNKNOWN_CHECK) + return; auto loc = Rando::Context::GetInstance()->GetItemLocation(randomizerQueuedCheck); - if (randomizerQueuedItemEntry.modIndex == receivedItemEntry.modIndex && randomizerQueuedItemEntry.itemId == receivedItemEntry.itemId) { - SPDLOG_INFO("Item received mod {} item {} from RC {}", receivedItemEntry.modIndex, receivedItemEntry.itemId, static_cast(randomizerQueuedCheck)); + if (randomizerQueuedItemEntry.modIndex == receivedItemEntry.modIndex && + randomizerQueuedItemEntry.itemId == receivedItemEntry.itemId) { + SPDLOG_INFO("Item received mod {} item {} from RC {}", receivedItemEntry.modIndex, receivedItemEntry.itemId, + static_cast(randomizerQueuedCheck)); loc->SetCheckStatus(RCSHOW_COLLECTED); CheckTracker::SpoilAreaFromCheck(randomizerQueuedCheck); CheckTracker::RecalculateAllAreaTotals(); @@ -365,13 +378,9 @@ void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { randomizerQueuedItemEntry = GET_ITEM_NONE; } - if ( - receivedItemEntry.modIndex == MOD_NONE && ( - receivedItemEntry.itemId == ITEM_HEART_PIECE || - receivedItemEntry.itemId == ITEM_HEART_PIECE_2 || - receivedItemEntry.itemId == ITEM_HEART_CONTAINER - ) - ) { + if (receivedItemEntry.modIndex == MOD_NONE && + (receivedItemEntry.itemId == ITEM_HEART_PIECE || receivedItemEntry.itemId == ITEM_HEART_PIECE_2 || + receivedItemEntry.itemId == ITEM_HEART_CONTAINER)) { gSaveContext.healthAccumulator = 0x140; // Refill 20 hearts if ((s32)(gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000) { gSaveContext.inventory.questItems ^= 0x40000000; @@ -380,11 +389,14 @@ void RandomizerOnItemReceiveHandler(GetItemEntry receivedItemEntry) { } } - if (loc->GetRandomizerCheck() == RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && !CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { + if (loc->GetRandomizerCheck() == RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST && + !CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { static uint32_t updateHook; updateHook = GameInteractor::Instance->RegisterGameHook([]() { Player* player = GET_PLAYER(gPlayState); - if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { + if (player == NULL || Player_InBlockingCsMode(gPlayState, player) || + player->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || player->stateFlags1 & PLAYER_STATE1_GETTING_ITEM || + player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { return; } @@ -415,7 +427,7 @@ void EnExItem_WaitForObjectRandomized(EnExItem* enExItem, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, enExItem->objectIdx)) { enExItem->actor.draw = (ActorFunc)EnExItem_DrawRandomizedItem; Actor_SetScale(&enExItem->actor, enExItem->scale); - + // for now we're just using this to not have items float // below the bowling counter, but it would be nice to use // this to not draw gigantic skull tokens etc. @@ -482,8 +494,7 @@ void ItemEtcetera_DrawRandomizedItemThroughLens(ItemEtcetera* itemEtcetera, Play } void ItemEtcetera_func_80B858B4_Randomized(ItemEtcetera* itemEtcetera, PlayState* play) { - if (itemEtcetera->actor.xzDistToPlayer < 30.0f && - fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { + if (itemEtcetera->actor.xzDistToPlayer < 30.0f && fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { if ((itemEtcetera->actor.params & 0xFF) == 1) { Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER); Flags_SetSwitch(play, 0xB); @@ -502,8 +513,7 @@ void ItemEtcetera_func_80B85824_Randomized(ItemEtcetera* itemEtcetera, PlayState return; } - if (itemEtcetera->actor.xzDistToPlayer < 30.0f && - fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { + if (itemEtcetera->actor.xzDistToPlayer < 30.0f && fabsf(itemEtcetera->actor.yDistToPlayer) < 50.0f) { Flags_SetTreasure(play, 0x1F); Actor_Kill(&itemEtcetera->actor); @@ -542,22 +552,21 @@ u8 EnDs_RandoCanGetGrannyItem() { // Traded odd mushroom when adult trade is on ((RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && Flags_GetItemGetInf(ITEMGETINF_30)) || // Found claim check when adult trade is off - (!RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && - INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)); + (!RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)); } u8 EnJs_RandoCanGetCarpetMerchantItem() { - return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || - RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && - // If the rando check has already been awarded, use vanilla behavior. - !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN); + return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || + RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && + // If the rando check has already been awarded, use vanilla behavior. + !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN); } u8 EnGm_RandoCanGetMedigoronItem() { - return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || - RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && - // If the rando check has already been awarded, use vanilla behavior. - !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); + return (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL || + RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) && + // If the rando check has already been awarded, use vanilla behavior. + !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); } void RandomizerSetChestGameRandomizerInf(RandomizerCheck rc) { @@ -608,44 +617,50 @@ void func_8083A434_override(PlayState* play, Player* player) { player->stateFlags1 |= PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_IN_CUTSCENE; } -bool ShouldGiveFishingPrize(f32 sFishOnHandLength){ +bool ShouldGiveFishingPrize(f32 sFishOnHandLength) { // RANDOTODO: update the enhancement sliders to not allow // values above rando fish weight values when rando'd - if(LINK_IS_CHILD) { - int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 10) : 10; + if (LINK_IS_CHILD) { + int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) + ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightChild"), 10) + : 10; f32 score = sqrt(((f32)weight - 0.5f) / 0.0036f); - return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_CHILD_FISHING) : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_CHILD)); - } else - { - int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 13) : 13; + return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_CHILD_FISHING) + : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_CHILD)); + } else { + int32_t weight = CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFishing"), 0) + ? CVarGetInteger(CVAR_ENHANCEMENT("MinimumFishWeightAdult"), 13) + : 13; f32 score = sqrt(((f32)weight - 0.5f) / 0.0036f); - return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING) : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_ADULT)); + return sFishOnHandLength >= score && (IS_RANDO ? !Flags_GetRandomizerInf(RAND_INF_ADULT_FISHING) + : !(HIGH_SCORE(HS_FISHING) & HS_FISH_PRIZE_ADULT)); } } void RandomizerOnDialogMessageHandler() { - MessageContext *msgCtx = &gPlayState->msgCtx; - Actor *actor = msgCtx->talkActor; + MessageContext* msgCtx = &gPlayState->msgCtx; + Actor* actor = msgCtx->talkActor; auto ctx = Rando::Context::GetInstance(); 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); + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); RandomizerCheck reveal = RC_UNKNOWN_CHECK; - if (ctx->GetOption(RSK_CHICKENS_HINT) && (msgCtx->textId >= TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK && msgCtx->textId <= TEXT_ANJU_PLEASE_BRING_1_CUCCO)) { + if (ctx->GetOption(RSK_CHICKENS_HINT) && + (msgCtx->textId >= TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK && msgCtx->textId <= TEXT_ANJU_PLEASE_BRING_1_CUCCO)) { reveal = RC_KAK_ANJU_AS_CHILD; } else { switch (msgCtx->textId) { case TEXT_SKULLTULA_PEOPLE_IM_CURSED: - if (actor->params == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)){ + if (actor->params == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)) { reveal = RC_KAK_10_GOLD_SKULLTULA_REWARD; - } else if (actor->params == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)){ + } else if (actor->params == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)) { reveal = RC_KAK_20_GOLD_SKULLTULA_REWARD; - } else if (actor->params == 3 && ctx->GetOption(RSK_KAK_30_SKULLS_HINT)){ + } else if (actor->params == 3 && ctx->GetOption(RSK_KAK_30_SKULLS_HINT)) { reveal = RC_KAK_30_GOLD_SKULLTULA_REWARD; - } else if (actor->params == 4 && ctx->GetOption(RSK_KAK_40_SKULLS_HINT)){ + } else if (actor->params == 4 && ctx->GetOption(RSK_KAK_40_SKULLS_HINT)) { reveal = RC_KAK_40_GOLD_SKULLTULA_REWARD; - } else if (ctx->GetOption(RSK_KAK_50_SKULLS_HINT)){ + } else if (ctx->GetOption(RSK_KAK_50_SKULLS_HINT)) { reveal = RC_KAK_50_GOLD_SKULLTULA_REWARD; } break; @@ -698,20 +713,21 @@ void RandomizerOnDialogMessageHandler() { case TEXT_SCRUB_RANDOM: if (ctx->GetOption(RSK_SCRUB_TEXT_HINT).Get() != RO_GENERIC_OFF) { EnDns* enDns = (EnDns*)actor; - reveal = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf((RandomizerInf)enDns->sohScrubIdentity.randomizerInf); + reveal = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf( + (RandomizerInf)enDns->sohScrubIdentity.randomizerInf); } break; case TEXT_BEAN_SALESMAN_BUY_FOR_10: if (revealMerchant && (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_BEANS_ONLY) || - ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { + ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))) { reveal = RC_ZR_MAGIC_BEAN_SALESMAN; } break; case TEXT_GRANNYS_SHOP: if (revealMerchant && nonBeanMerchants && - (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)) { - reveal = RC_KAK_GRANNYS_SHOP; - } + (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)) { + reveal = RC_KAK_GRANNYS_SHOP; + } break; case TEXT_MEDIGORON: if (revealMerchant && nonBeanMerchants) { @@ -734,7 +750,7 @@ void RandomizerOnDialogMessageHandler() { case TEXT_SHEIK_NEED_HOOK: case TEXT_SHEIK_HAVE_HOOK: if (ctx->GetOption(RSK_OOT_HINT) && gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME && - !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) { + !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) { auto itemoot_loc = ctx->GetItemLocation(RC_HF_OCARINA_OF_TIME_ITEM); if (itemoot_loc->GetCheckStatus() == RCSHOW_UNCHECKED) { itemoot_loc->SetCheckStatus(RCSHOW_IDENTIFIED); @@ -779,7 +795,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_PLAY_SLOW_CHEST_CS: { - // We force fast chests if SkipGetItemAnimation is enabled because the camera in the CS looks pretty wonky otherwise + // We force fast chests if SkipGetItemAnimation is enabled because the camera in the CS looks pretty wonky + // otherwise if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("TimeSavers.SkipGetItemAnimation"), SGIA_JUNK)) { *should = false; } @@ -787,7 +804,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_GIVE_ITEM_FROM_CHEST: { EnBox* chest = va_arg(args, EnBox*); - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(chest->dyna.actor.id, gPlayState->sceneNum, chest->dyna.actor.params); + RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor( + chest->dyna.actor.id, gPlayState->sceneNum, chest->dyna.actor.params); if (!OTRGlobals::Instance->gRandoContext->IsLocationShuffled(rc)) { break; } @@ -809,17 +827,21 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = false; break; case VB_SHIEK_PREPARE_TO_GIVE_SERENADE_OF_WATER: { - *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && !Flags_GetTreasure(gPlayState, 0x2); + *should = + !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && !Flags_GetTreasure(gPlayState, 0x2); break; } case VB_BE_ELIGIBLE_FOR_SERENADE_OF_WATER: - *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && Flags_GetTreasure(gPlayState, 0x2); + *should = + !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && Flags_GetTreasure(gPlayState, 0x2); break; case VB_BE_ELIGIBLE_FOR_PRELUDE_OF_LIGHT: - *should = !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST); + *should = + !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST); break; case VB_MIDO_SPAWN: - if (RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_OFF && !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD)) { + if (RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_OFF && + !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD)) { *should = true; } break; @@ -832,26 +854,22 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD); break; case VB_OPEN_KOKIRI_FOREST: - *should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD) || RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_ON; + *should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD) || + RAND_GET_OPTION(RSK_FOREST) != RO_CLOSED_FOREST_ON; break; case VB_BE_ELIGIBLE_FOR_DARUNIAS_JOY_REWARD: *should = !Flags_GetRandomizerInf(RAND_INF_DARUNIAS_JOY); break; case VB_BE_ELIGIBLE_FOR_LIGHT_ARROWS: - *should = - LINK_IS_ADULT && - (gEntranceTable[gSaveContext.entranceIndex].scene == SCENE_TEMPLE_OF_TIME) && - !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && - MeetsLACSRequirements(); + *should = LINK_IS_ADULT && (gEntranceTable[gSaveContext.entranceIndex].scene == SCENE_TEMPLE_OF_TIME) && + !Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) && + MeetsLACSRequirements(); break; case VB_BE_ELIGIBLE_FOR_NOCTURNE_OF_SHADOW: - *should = - !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) && - LINK_IS_ADULT && - gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_KAKARIKO_VILLAGE && - CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && - CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && - CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER); + *should = !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) && LINK_IS_ADULT && + gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_KAKARIKO_VILLAGE && + CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && + CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER); break; case VB_BE_ELIGIBLE_FOR_CHILD_ROLLING_GORON_REWARD: { // Don't require a bomb bag to get prize in rando @@ -861,7 +879,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_BE_ELIGIBLE_FOR_MAGIC_BEANS_PURCHASE: { if (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_BEANS_ONLY || RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL) { - *should = gSaveContext.rupees >= OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice(); + *should = gSaveContext.rupees >= + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice(); } break; } @@ -897,9 +916,11 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_ITEM_B_HEART_DESPAWN: { ItemBHeart* itemBHeart = va_arg(args, ItemBHeart*); - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(itemBHeart->actor.id, gPlayState->sceneNum, itemBHeart->actor.params); + RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor( + itemBHeart->actor.id, gPlayState->sceneNum, itemBHeart->actor.params); if (rc != RC_UNKNOWN_CHECK) { - itemBHeart->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + itemBHeart->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); itemBHeart->actor.draw = (ActorFunc)ItemBHeart_DrawRandomizedItem; itemBHeart->actor.update = (ActorFunc)ItemBHeart_UpdateRandomizedItem; *should = Rando::Context::GetInstance()->GetItemLocation(rc)->HasObtained(); @@ -962,7 +983,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_BIGGORON_CONSIDER_TRADE_COMPLETE: { // This being true will prevent other biggoron trades, there are already safegaurds in place to prevent - // claim check from being traded multiple times, so we don't really need the quest to ever be considered "complete" + // claim check from being traded multiple times, so we don't really need the quest to ever be considered + // "complete" *should = false; break; } @@ -989,7 +1011,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l Actor_Kill(&item00->actor); *should = false; } else if (item00->actor.params == ITEM00_SOH_GIVE_ITEM_ENTRY) { - Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); if (item00->itemEntry.modIndex == MOD_NONE) { if (item00->itemEntry.getItemId == GI_SWORD_BGS) { gSaveContext.bgsFlag = true; @@ -1012,7 +1035,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { Notification::Emit({ .message = "You found ", - .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId).GetName().english, + .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId) + .GetName() + .english, }); } @@ -1070,15 +1095,19 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN: { - if (EnJs_RandoCanGetCarpetMerchantItem()){ - *should = gSaveContext.rupees < OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice(); + if (EnJs_RandoCanGetCarpetMerchantItem()) { + *should = + gSaveContext.rupees < + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice(); } break; } case VB_GIVE_ITEM_FROM_CARPET_SALESMAN: { EnJs* enJs = va_arg(args, EnJs*); - if (EnJs_RandoCanGetCarpetMerchantItem()){ - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice() * -1); + if (EnJs_RandoCanGetCarpetMerchantItem()) { + Rupees_ChangeBy( + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice() * + -1); enJs->actor.parent = NULL; enJs->actor.textId = TEXT_CARPET_SALESMAN_ARMS_DEALER; enJs->actionFunc = (EnJsActionFunc)func_80A890C0; @@ -1093,8 +1122,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_CHECK_RANDO_PRICE_OF_MEDIGORON: { - if (EnGm_RandoCanGetMedigoronItem()){ - *should = gSaveContext.rupees < OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice(); + if (EnGm_RandoCanGetMedigoronItem()) { + *should = gSaveContext.rupees < + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice(); } break; } @@ -1108,7 +1138,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l Flags_SetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON); enGm->actor.parent = NULL; enGm->actionFunc = (EnGmActionFunc)func_80A3DC44; - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice() * -1); + Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice() * + -1); *should = false; } else { // Resets "Talked to Medigoron" flag in infTable to restore initial conversation state @@ -1122,7 +1153,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l EnMs* enMs = va_arg(args, EnMs*); if (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_BEANS_ONLY || RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL) { - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice() * -1); + Rupees_ChangeBy( + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPrice() * -1); BEANS_BOUGHT = 10; // Only set inf for buying rando check Flags_SetRandomizerInf(RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN); @@ -1134,10 +1166,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_FROGS_GO_TO_IDLE: { EnFr* enFr = va_arg(args, EnFr*); - if ( - (enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) || - (enFr->songIndex < FROG_STORMS && enFr->reward == GI_RUPEE_PURPLE) - ) { + if ((enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) || + (enFr->songIndex < FROG_STORMS && enFr->reward == GI_RUPEE_PURPLE)) { *should = true; } break; @@ -1225,7 +1255,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_BUSINESS_SCRUB_DESPAWN: { EnShopnuts* enShopnuts = va_arg(args, EnShopnuts*); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - ScrubIdentity scrubIdentity = OTRGlobals::Instance->gRandomizer->IdentifyScrub(gPlayState->sceneNum, enShopnuts->actor.params, respawnData); + ScrubIdentity scrubIdentity = OTRGlobals::Instance->gRandomizer->IdentifyScrub( + gPlayState->sceneNum, enShopnuts->actor.params, respawnData); if (scrubIdentity.isShuffled) { *should = Flags_GetRandomizerInf(scrubIdentity.randomizerInf); @@ -1280,16 +1311,18 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GRANNY_SAY_INSUFFICIENT_RUPEES: { - if (EnDs_RandoCanGetGrannyItem()){ - *should = gSaveContext.rupees < OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice(); + if (EnDs_RandoCanGetGrannyItem()) { + *should = gSaveContext.rupees < + OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice(); } break; } case VB_GRANNY_TAKE_MONEY: { - if (EnDs_RandoCanGetGrannyItem()){ - *should = false; - Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice() * -1); - } + if (EnDs_RandoCanGetGrannyItem()) { + *should = false; + Rupees_ChangeBy(OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice() * + -1); + } break; } case VB_NEED_BOTTLE_FOR_GRANNYS_ITEM: { @@ -1318,12 +1351,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_BE_ELIGIBLE_TO_OPEN_DOT: { - bool eligible = RAND_GET_OPTION(RSK_DOOR_OF_TIME) != RO_DOOROFTIME_CLOSED || ( - INV_CONTENT(ITEM_OCARINA_FAIRY) == ITEM_OCARINA_TIME && - CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && - CHECK_QUEST_ITEM(QUEST_GORON_RUBY) && - CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE) - ); + bool eligible = + RAND_GET_OPTION(RSK_DOOR_OF_TIME) != RO_DOOROFTIME_CLOSED || + (INV_CONTENT(ITEM_OCARINA_FAIRY) == ITEM_OCARINA_TIME && CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && + CHECK_QUEST_ITEM(QUEST_GORON_RUBY) && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)); *should = eligible; break; } @@ -1336,10 +1367,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l if (gSaveContext.minigameScore >= 1500) { Flags_SetItemGetInf(ITEMGETINF_0F); } - //move gerudo actor onto her wait loop + // move gerudo actor onto her wait loop enGe1->actionFunc = EnGe1_Wait_Archery; EnGe1_SetAnimationIdle(enGe1); - //skip the vanilla gives. + // skip the vanilla gives. *should = false; break; } @@ -1361,7 +1392,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l // we're giving the 100 GS rando reward! set the rando inf Flags_SetRandomizerInf(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD); - + // also set the actionfunc so this doesn't immediately get // called again (and lead to a vanilla+rando item give // because the flag check will pass next time) @@ -1388,7 +1419,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_GIVE_ITEM_FROM_BOMBCHU_BOWLING: { EnBomBowlPit* enBomBowlPit = va_arg(args, EnBomBowlPit*); - if (enBomBowlPit->prizeIndex == EXITEM_BOMB_BAG_BOWLING || enBomBowlPit->prizeIndex == EXITEM_HEART_PIECE_BOWLING) { + if (enBomBowlPit->prizeIndex == EXITEM_BOMB_BAG_BOWLING || + enBomBowlPit->prizeIndex == EXITEM_HEART_PIECE_BOWLING) { *should = false; } break; @@ -1424,17 +1456,17 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_DRAW_AMMO_COUNT: { s16 item = *va_arg(args, s16*); // don't draw ammo count if you have the infinite upgrade - if ( - (item == ITEM_NUT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) || + if ((item == ITEM_NUT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) || (item == ITEM_STICK && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE)) || (item == ITEM_BOMB && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG)) || - ( - (item == ITEM_BOW || item == ITEM_BOW_ARROW_FIRE || item == ITEM_BOW_ARROW_ICE || item == ITEM_BOW_ARROW_LIGHT) && - Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) && gPlayState->shootingGalleryStatus < 2 && gSaveContext.minigameState != 1 - ) || - (item == ITEM_SLINGSHOT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) && gPlayState->shootingGalleryStatus < 2) || - (item == ITEM_BOMBCHU && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS) && gPlayState->bombchuBowlingStatus < 1) - ) { + ((item == ITEM_BOW || item == ITEM_BOW_ARROW_FIRE || item == ITEM_BOW_ARROW_ICE || + item == ITEM_BOW_ARROW_LIGHT) && + Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) && gPlayState->shootingGalleryStatus < 2 && + gSaveContext.minigameState != 1) || + (item == ITEM_SLINGSHOT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) && + gPlayState->shootingGalleryStatus < 2) || + (item == ITEM_BOMBCHU && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS) && + gPlayState->bombchuBowlingStatus < 1)) { *should = false; } break; @@ -1520,7 +1552,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l case VB_SHOULD_SET_FISHING_RECORD: { VBFishingData* fishData = va_arg(args, VBFishingData*); *should = (s16)fishData->sFishingRecordLength < (s16)fishData->fishWeight; - if (!*should){ + if (!*should) { *fishData->sFishOnHandLength = 0.0f; } break; @@ -1531,19 +1563,20 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GIVE_RANDO_FISHING_PRIZE: { - if (IS_RANDO){ + if (IS_RANDO) { VBFishingData* fishData = va_arg(args, VBFishingData*); if (*fishData->sFishOnHandIsLoach) { if (!Flags_GetRandomizerInf(RAND_INF_CAUGHT_LOACH) && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH){ + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == + RO_FISHSANITY_HYRULE_LOACH) { Flags_SetRandomizerInf(RAND_INF_CAUGHT_LOACH); Message_StartTextbox(gPlayState, TEXT_FISHING_RELEASE_THIS_ONE, NULL); *should = true; fishData->actor->stateAndTimer = 20; } } else { - if (ShouldGiveFishingPrize(fishData->fishWeight)){ - if (LINK_IS_CHILD){ + if (ShouldGiveFishingPrize(fishData->fishWeight)) { + if (LINK_IS_CHILD) { Flags_SetRandomizerInf(RAND_INF_CHILD_FISHING); HIGH_SCORE(HS_FISHING) |= HS_FISH_PRIZE_CHILD; } else { @@ -1558,7 +1591,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } - case VB_TRADE_TIMER_EYEDROPS:{ + 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_TALK_OFFER_AUTO_ACCEPTED; @@ -1567,8 +1600,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = false; break; } - // We need to override the vanilla behavior here because the player might sequence break and get Ruto kidnapped before accessing other - // checks that require Ruto. So if she's kidnapped we allow her to spawn again + // We need to override the vanilla behavior here because the player might sequence break and get Ruto kidnapped + // before accessing other checks that require Ruto. So if she's kidnapped we allow her to spawn again case VB_RUTO_BE_CONSIDERED_NOT_KIDNAPPED: { *should = !Flags_GetInfTable(INFTABLE_145) || Flags_GetInfTable(INFTABLE_146); break; @@ -1590,7 +1623,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l if (*should == true && RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) { // Check for dungeon special entrances that are randomized to a new location if (std::find(entrPersistTempFlags.begin(), entrPersistTempFlags.end(), originalEntrance) != - entrPersistTempFlags.end() && originalEntrance != gPlayState->nextEntranceIndex) { + entrPersistTempFlags.end() && + originalEntrance != gPlayState->nextEntranceIndex) { // Normally dungeons use a special voidout between scenes so that entering/exiting a boss room, // or leaving via Spirit Hands and going back in persist temp flags across scenes. // For ER, the temp flags should be wiped out so that they aren't transferred to the new location. @@ -1615,7 +1649,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER: { if (*should) { - //remove zelda's letter as this is the only use for it + // remove zelda's letter as this is the only use for it Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA); } break; @@ -1661,25 +1695,45 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { // probably need to do something different when we implement shuffle if (sceneNum == SCENE_TREASURE_BOX_SHOP) { Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_1) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_2) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_3) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_4) + ->SetCheckStatus(RCSHOW_UNCHECKED); Flags_UnsetRandomizerInf(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5); - Rando::Context::GetInstance()->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5)->SetCheckStatus(RCSHOW_UNCHECKED); + Rando::Context::GetInstance() + ->GetItemLocation(RC_MARKET_TREASURE_CHEST_GAME_KEY_5) + ->SetCheckStatus(RCSHOW_UNCHECKED); CheckTracker::RecalculateAllAreaTotals(); } @@ -1714,17 +1768,16 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { updateHook = 0; } - // If we're not in the Temple of Time or we've already learned the Prelude of Light and received LACs, we don't need to do anything - if ( - sceneNum != SCENE_TEMPLE_OF_TIME || - ( - Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && - Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) - ) - ) return; + // If we're not in the Temple of Time or we've already learned the Prelude of Light and received LACs, we don't need + // to do anything + if (sceneNum != SCENE_TEMPLE_OF_TIME || + (Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && + Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS))) + return; updateHook = GameInteractor::Instance->RegisterGameHook([]() { - if (!Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && gPlayState->roomCtx.curRoom.num == 0) { + if (!Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && LINK_IS_ADULT && + CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && gPlayState->roomCtx.curRoom.num == 0) { Flags_SetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT); } @@ -1733,11 +1786,10 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) { Flags_SetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS); } - // If both awards have been given, we can unregister the hook, otherwise it will get unregistered when the player leaves the area - if ( - Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && - Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS) - ) { + // If both awards have been given, we can unregister the hook, otherwise it will get unregistered when the + // player leaves the area + if (Flags_GetEventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT) && + Flags_GetEventChkInf(EVENTCHKINF_RETURNED_TO_TEMPLE_OF_TIME_WITH_ALL_MEDALLIONS)) { GameInteractor::Instance->UnregisterGameHook(updateHook); updateHook = 0; } @@ -1773,13 +1825,11 @@ void EnDns_RandomizerPurchase(EnDns* enDns) { void ObjComb_RandomizerChooseItemDrop(ObjComb* objComb, PlayState* play) { s16 params = objComb->actor.params & 0x1F; - if ( - RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && - !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf) - ) { + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &objComb->actor.world.pos, ITEM00_SOH_DUMMY); item00->randoInf = objComb->beehiveIdentity.randomizerInf; - item00->itemEntry = OTRGlobals::Instance->gRandomizer->GetItemFromKnownCheck(objComb->beehiveIdentity.randomizerCheck, GI_NONE); + item00->itemEntry = + OTRGlobals::Instance->gRandomizer->GetItemFromKnownCheck(objComb->beehiveIdentity.randomizerCheck, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; return; } @@ -1804,10 +1854,7 @@ void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { s32 dmgFlags; objComb->unk_1B0 -= 50; - if ( - RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && - !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf) - ) { + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { if (objComb->unk_1B0 <= -5000) { objComb->unk_1B0 = 1500; } @@ -1831,17 +1878,19 @@ void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { if (objComb->actor.update != NULL) { CollisionCheck_SetOC(play, &play->colChkCtx, &objComb->collider.base); - } + } } void RandomizerOnActorInitHandler(void* actorRef) { Actor* actor = static_cast(actorRef); if (actor->id == ACTOR_EN_SI) { - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(actor->id, gPlayState->sceneNum, actor->params); + RandomizerCheck rc = + OTRGlobals::Instance->gRandomizer->GetCheckFromActor(actor->id, gPlayState->sceneNum, actor->params); if (rc != RC_UNKNOWN_CHECK) { EnSi* enSi = static_cast(actorRef); - enSi->sohGetItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + enSi->sohGetItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); actor->draw = (ActorFunc)EnSi_DrawRandomizedItem; } } @@ -1849,15 +1898,13 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (actor->id == ACTOR_EN_DNS) { EnDns* enDns = static_cast(actorRef); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - enDns->sohScrubIdentity = OTRGlobals::Instance->gRandomizer->IdentifyScrub(gPlayState->sceneNum, enDns->actor.params, respawnData); + enDns->sohScrubIdentity = + OTRGlobals::Instance->gRandomizer->IdentifyScrub(gPlayState->sceneNum, enDns->actor.params, respawnData); if (enDns->sohScrubIdentity.isShuffled) { // DNS uses pointers so we're creating our own entry instead of modifying the original enDns->sohDnsItemEntry = { - enDns->dnsItemEntry->itemPrice, - 1, - enDns->sohScrubIdentity.getItemId, - EnDns_RandomizerPurchaseableCheck, + enDns->dnsItemEntry->itemPrice, 1, enDns->sohScrubIdentity.getItemId, EnDns_RandomizerPurchaseableCheck, EnDns_RandomizerPurchase, }; enDns->dnsItemEntry = &enDns->sohDnsItemEntry; @@ -1871,30 +1918,34 @@ void RandomizerOnActorInitHandler(void* actorRef) { static uint32_t enDnsUpdateHook = 0; static uint32_t enDnsKillHook = 0; if (!enDnsUpdateHook) { - enDnsUpdateHook = GameInteractor::Instance->RegisterGameHook([](void* innerActorRef) { - Actor* innerActor = static_cast(innerActorRef); - if (innerActor->id == ACTOR_EN_DNS) { - EnDns* innerEnDns = static_cast(innerActorRef); - if (innerEnDns->sohScrubIdentity.isShuffled) { - innerActor->textId = TEXT_SCRUB_RANDOM; + enDnsUpdateHook = + GameInteractor::Instance->RegisterGameHook([](void* innerActorRef) { + Actor* innerActor = static_cast(innerActorRef); + if (innerActor->id == ACTOR_EN_DNS) { + EnDns* innerEnDns = static_cast(innerActorRef); + if (innerEnDns->sohScrubIdentity.isShuffled) { + innerActor->textId = TEXT_SCRUB_RANDOM; + } } - } - }); - enDnsKillHook = GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { - GameInteractor::Instance->UnregisterGameHook(enDnsUpdateHook); - GameInteractor::Instance->UnregisterGameHook(enDnsKillHook); - enDnsUpdateHook = 0; - enDnsKillHook = 0; - }); + }); + enDnsKillHook = + GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) { + GameInteractor::Instance->UnregisterGameHook(enDnsUpdateHook); + GameInteractor::Instance->UnregisterGameHook(enDnsKillHook); + enDnsUpdateHook = 0; + enDnsKillHook = 0; + }); } } } if (actor->id == ACTOR_ITEM_ETCETERA) { ItemEtcetera* itemEtcetera = static_cast(actorRef); - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(itemEtcetera->actor.id, gPlayState->sceneNum, itemEtcetera->actor.params); + RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor( + itemEtcetera->actor.id, gPlayState->sceneNum, itemEtcetera->actor.params); if (rc != RC_UNKNOWN_CHECK) { - itemEtcetera->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + itemEtcetera->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); itemEtcetera->drawFunc = (ActorFunc)ItemEtcetera_DrawRandomizedItem; } @@ -1925,13 +1976,14 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (actor->id == ACTOR_OBJ_COMB) { ObjComb* objComb = static_cast(actorRef); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - objComb->beehiveIdentity = OTRGlobals::Instance->gRandomizer->IdentifyBeehive(gPlayState->sceneNum, (s16)actor->world.pos.x, respawnData); + objComb->beehiveIdentity = OTRGlobals::Instance->gRandomizer->IdentifyBeehive( + gPlayState->sceneNum, (s16)actor->world.pos.x, respawnData); objComb->actionFunc = (ObjCombActionFunc)ObjComb_RandomizerWait; } if (actor->id == ACTOR_EN_EX_ITEM) { EnExItem* enExItem = static_cast(actorRef); - + RandomizerCheck rc = RC_UNKNOWN_CHECK; switch (enExItem->type) { case EXITEM_BOMB_BAG_COUNTER: @@ -1944,14 +1996,16 @@ void RandomizerOnActorInitHandler(void* actorRef) { break; case EXITEM_BOMBCHUS_COUNTER: case EXITEM_BOMBCHUS_BOWLING: - //RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS was removed as a 3DS holdover not in anyones near term plans due to being pretty useless. + // RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS was removed as a 3DS holdover not in anyones near term plans due + // to being pretty useless. break; case EXITEM_BULLET_BAG: rc = RC_LW_TARGET_IN_WOODS; break; } if (rc != RC_UNKNOWN_CHECK) { - enExItem->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); + enExItem->sohItemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); enExItem->actionFunc = (EnExItemActionFunc)EnExItem_WaitForObjectRandomized; } } @@ -1974,34 +2028,23 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT && RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && (RAND_GET_OPTION(RSK_FOREST) == RO_CLOSED_FOREST_OFF || - Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD))) { + Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD))) { BgTreemouth* bgTreemouth = static_cast(actorRef); bgTreemouth->unk_168 = 1.0f; } - //consumable bags - if ( - actor->id == ACTOR_EN_ITEM00 && - ( - ( - RAND_GET_OPTION(RSK_SHUFFLE_DEKU_STICK_BAG) && - CUR_UPG_VALUE(UPG_STICKS) == 0 && - actor->params == ITEM00_STICK - ) || - ( - RAND_GET_OPTION(RSK_SHUFFLE_DEKU_NUT_BAG) && - CUR_UPG_VALUE(UPG_NUTS) == 0 && - actor->params == ITEM00_NUTS - ) - ) - ) { + // consumable bags + if (actor->id == ACTOR_EN_ITEM00 && + ((RAND_GET_OPTION(RSK_SHUFFLE_DEKU_STICK_BAG) && CUR_UPG_VALUE(UPG_STICKS) == 0 && + actor->params == ITEM00_STICK) || + (RAND_GET_OPTION(RSK_SHUFFLE_DEKU_NUT_BAG) && CUR_UPG_VALUE(UPG_NUTS) == 0 && actor->params == ITEM00_NUTS))) { Actor_Kill(actor); } if (RAND_GET_OPTION(RSK_SHUFFLE_BOSS_SOULS)) { - //Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair + // Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair RandomizerInf currentBossSoulRandInf = RAND_INF_MAX; - switch (gPlayState->sceneNum){ + switch (gPlayState->sceneNum) { case SCENE_DEKU_TREE_BOSS: currentBossSoulRandInf = RAND_INF_GOHMA_SOUL; break; @@ -2037,16 +2080,16 @@ void RandomizerOnActorInitHandler(void* actorRef) { } // Deletes all actors in the boss category if the soul isn't found. - // Some actors, like Dark Link, Arwings, and Zora's Sapphire...?, are in this category despite not being actual bosses, - // so ignore any "boss" if `currentBossSoulRandInf` doesn't change from RAND_INF_MAX. - // Iron Knuckle (Nabooru) in Twinrova's room is a special exception, so exclude knuckles too. + // Some actors, like Dark Link, Arwings, and Zora's Sapphire...?, are in this category despite not being actual + // bosses, so ignore any "boss" if `currentBossSoulRandInf` doesn't change from RAND_INF_MAX. Iron Knuckle + // (Nabooru) in Twinrova's room is a special exception, so exclude knuckles too. if (currentBossSoulRandInf != RAND_INF_MAX) { if (!Flags_GetRandomizerInf(currentBossSoulRandInf) && actor->category == ACTORCAT_BOSS && actor->id != ACTOR_EN_IK) { Actor_Delete(&gPlayState->actorCtx, actor, gPlayState); } - //Special case for Phantom Ganon's horse (and fake), as they're considered "background actors", - //but still control the boss fight flow. + // Special case for Phantom Ganon's horse (and fake), as they're considered "background actors", + // but still control the boss fight flow. if (!Flags_GetRandomizerInf(RAND_INF_PHANTOM_GANON_SOUL) && actor->id == ACTOR_EN_FHG) { Actor_Delete(&gPlayState->actorCtx, actor, gPlayState); } @@ -2055,12 +2098,9 @@ void RandomizerOnActorInitHandler(void* actorRef) { // In MQ Spirit, remove the large silver block in the hole as child so the chest in the silver block hallway // can be guaranteed accessible - if ( - actor->id == ACTOR_OBJ_OSHIHIKI && - LINK_IS_CHILD && - ResourceMgr_IsGameMasterQuest() && + if (actor->id == ACTOR_OBJ_OSHIHIKI && LINK_IS_CHILD && ResourceMgr_IsGameMasterQuest() && gPlayState->sceneNum == SCENE_SPIRIT_TEMPLE && actor->room == 6 && // Spirit Temple silver block hallway - actor->params == 0x9C7 // Silver block that is marked as in the hole + actor->params == 0x9C7 // Silver block that is marked as in the hole ) { Actor_Kill(actor); return; @@ -2145,85 +2185,61 @@ void RandomizerOnActorUpdateHandler(void* refActor) { } // In ER, override the warp song locations. Also removes the warp song cutscene - if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES) && actor->id == ACTOR_DEMO_KANKYO && actor->params == 0x000F) { // Warp Song particles + if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES) && actor->id == ACTOR_DEMO_KANKYO && + actor->params == 0x000F) { // Warp Song particles Entrance_SetWarpSongEntrance(); } if (actor->id == ACTOR_OBJ_COMB) { ObjComb* combActor = reinterpret_cast(actor); - combActor->actor.shape.rot.x = Math_SinS(combActor->unk_1B2) * CLAMP_MIN(combActor->unk_1B0, 0) + combActor->actor.home.rot.x; + combActor->actor.shape.rot.x = + Math_SinS(combActor->unk_1B2) * CLAMP_MIN(combActor->unk_1B0, 0) + combActor->actor.home.rot.x; } } -//from z_player.c +// from z_player.c typedef struct { /* 0x00 */ Vec3f pos; /* 0x0C */ s16 yaw; } SpecialRespawnInfo; // size = 0x10 -//special respawns used when voided out without swim to prevent infinite loops +// special respawns used when voided out without swim to prevent infinite loops std::map swimSpecialRespawnInfo = { - { - ENTR_ZORAS_RIVER_3,//hf to zr in water - { { -1455.443, -20, 1384.826 }, 28761 } - }, - { - ENTR_HYRULE_FIELD_14,//zr to hf in water - { { 5730.209, -20, 3725.911 }, -20025 } - }, - { - ENTR_LOST_WOODS_UNDERWATER_SHORTCUT,//zr to lw - { { 1978.718, -36.908, -855 }, -16384 } - }, - { - ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT,//lw to zr - { { 4082.366, 860.442, -1018.949 }, -32768 } - }, - { - ENTR_LAKE_HYLIA_RIVER_EXIT,//gv to lh - { { -3276.416, -1033, 2908.421 }, 11228 } - }, - { - ENTR_WATER_TEMPLE_ENTRANCE,//lh to water temple - { { -182, 780, 759.5 }, -32768 } - }, - { - ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE,//water temple to lh - { { -955.028, -1306.9, 6768.954 }, -32768 } - }, - { - ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT,//lh to zd - { { -109.86, 11.396, -9.933 }, -29131 } - }, - { - ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT,//zd to lh - { { -912, -1326.967, 3391 }, 0 } - }, - { - ENTR_GERUDO_VALLEY_1,//caught by gerudos as child - { { -424, -2051, -74 }, 16384 } - }, - { - ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN,//mk to hf (can be a problem when it then turns night) - { { 0, 0, 1100 }, 0 } - }, - { - ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP,//jabu blue warp to zf - { { -1580, 150, 1670 }, 8000 } - }, + { ENTR_ZORAS_RIVER_3, // hf to zr in water + { { -1455.443, -20, 1384.826 }, 28761 } }, + { ENTR_HYRULE_FIELD_14, // zr to hf in water + { { 5730.209, -20, 3725.911 }, -20025 } }, + { ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, // zr to lw + { { 1978.718, -36.908, -855 }, -16384 } }, + { ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, // lw to zr + { { 4082.366, 860.442, -1018.949 }, -32768 } }, + { ENTR_LAKE_HYLIA_RIVER_EXIT, // gv to lh + { { -3276.416, -1033, 2908.421 }, 11228 } }, + { ENTR_WATER_TEMPLE_ENTRANCE, // lh to water temple + { { -182, 780, 759.5 }, -32768 } }, + { ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, // water temple to lh + { { -955.028, -1306.9, 6768.954 }, -32768 } }, + { ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, // lh to zd + { { -109.86, 11.396, -9.933 }, -29131 } }, + { ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, // zd to lh + { { -912, -1326.967, 3391 }, 0 } }, + { ENTR_GERUDO_VALLEY_1, // caught by gerudos as child + { { -424, -2051, -74 }, 16384 } }, + { ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, // mk to hf (can be a problem when it then turns night) + { { 0, 0, 1100 }, 0 } }, + { ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP, // jabu blue warp to zf + { { -1580, 150, 1670 }, 8000 } }, }; f32 triforcePieceScale; void RandomizerOnPlayerUpdateHandler() { - if ( - (GET_PLAYER(gPlayState)->stateFlags1 & PLAYER_STATE1_IN_WATER) && - !Flags_GetRandomizerInf(RAND_INF_CAN_SWIM) && - CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) != EQUIP_VALUE_BOOTS_IRON - ) { - //if you void out in water temple without swim you get instantly kicked out to prevent softlocks + if ((GET_PLAYER(gPlayState)->stateFlags1 & PLAYER_STATE1_IN_WATER) && !Flags_GetRandomizerInf(RAND_INF_CAN_SWIM) && + CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) != EQUIP_VALUE_BOOTS_IRON) { + // if you void out in water temple without swim you get instantly kicked out to prevent softlocks if (gPlayState->sceneNum == SCENE_WATER_TEMPLE) { - GameInteractor::RawAction::TeleportPlayer(Entrance_OverrideNextIndex(ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE));//lake hylia from water temple + GameInteractor::RawAction::TeleportPlayer( + Entrance_OverrideNextIndex(ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE)); // lake hylia from water temple } else { if (swimSpecialRespawnInfo.find(gSaveContext.entranceIndex) != swimSpecialRespawnInfo.end()) { SpecialRespawnInfo* respawnInfo = &swimSpecialRespawnInfo.at(gSaveContext.entranceIndex); @@ -2238,19 +2254,14 @@ void RandomizerOnPlayerUpdateHandler() { } // Triforce Hunt needs the check if the player isn't being teleported to the credits scene. - if ( - !GameInteractor::IsGameplayPaused() && - Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && + if (!GameInteractor::IsGameplayPaused() && Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && gPlayState->transitionTrigger != TRANS_TRIGGER_START && - (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0 - ) { - GiveItemEntryWithoutActor(gPlayState, *Rando::StaticData::GetItemTable().at(RG_GANONS_CASTLE_BOSS_KEY).GetGIEntry()); + (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { + GiveItemEntryWithoutActor(gPlayState, + *Rando::StaticData::GetItemTable().at(RG_GANONS_CASTLE_BOSS_KEY).GetGIEntry()); } - if ( - !GameInteractor::IsGameplayPaused() && - RAND_GET_OPTION(RSK_TRIFORCE_HUNT) - ) { + if (!GameInteractor::IsGameplayPaused() && RAND_GET_OPTION(RSK_TRIFORCE_HUNT)) { // Warp to credits if (GameInteractor::State::TriforceHuntCreditsWarpActive) { gPlayState->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0; @@ -2277,12 +2288,14 @@ void RandomizerOnSceneSpawnActorsHandler() { switch (gPlayState->sceneNum) { case SCENE_TEMPLE_OF_TIME: if (gPlayState->roomCtx.curRoom.num == 1) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, 0x8000, 0, SHEIK_TYPE_RANDO, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, 0x8000, 0, + SHEIK_TYPE_RANDO, false); } break; case SCENE_INSIDE_GANONS_CASTLE: if (gPlayState->roomCtx.curRoom.num == 1) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, SHEIK_TYPE_RANDO, false); + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, + SHEIK_TYPE_RANDO, false); } break; default: @@ -2387,13 +2400,16 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->UnregisterGameHook(fishsanityOnActorInitHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnActorUpdateHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnSceneInitHook); - GameInteractor::Instance->UnregisterGameHook(fishsanityOnVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHook( + fishsanityOnVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnItemReceiveHook); GameInteractor::Instance->UnregisterGameHookForID(shufflePotsOnActorInitHook); - GameInteractor::Instance->UnregisterGameHook(shufflePotsOnVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHook( + shufflePotsOnVanillaBehaviorHook); - GameInteractor::Instance->UnregisterGameHook(shuffleFreestandingOnVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHook( + shuffleFreestandingOnVanillaBehaviorHook); onFlagSetHook = 0; onSceneFlagSetHook = 0; @@ -2426,7 +2442,8 @@ void RandomizerRegisterHooks() { ShuffleFairies_UnregisterHooks(); - if (!IS_RANDO) return; + if (!IS_RANDO) + return; // ENTRTODO: Move all entrance rando handling to a dedicated file // Setup the modified entrance table and entrance shuffle table for rando @@ -2437,43 +2454,71 @@ void RandomizerRegisterHooks() { Entrance_SetSavewarpEntrance(); } - onFlagSetHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnFlagSetHandler); - onSceneFlagSetHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneFlagSetHandler); - onPlayerUpdateForRCQueueHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateForRCQueueHandler); - onPlayerUpdateForItemQueueHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateForItemQueueHandler); - onItemReceiveHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnItemReceiveHandler); - onDialogMessageHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnDialogMessageHandler); - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnVanillaBehaviorHandler); - onSceneInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler); - onActorInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler); - onActorUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnActorUpdateHandler); - onPlayerUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateHandler); - onGameFrameUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnGameFrameUpdateHandler); - onSceneSpawnActorsHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneSpawnActorsHandler); - onPlayDestroyHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayDestroyHandler); - onExitGameHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnExitGameHandler); - onKaleidoUpdateHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnKaleidoscopeUpdateHandler); - onCuccoOrChickenHatchHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnCuccoOrChickenHatch); + onFlagSetHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnFlagSetHandler); + onSceneFlagSetHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneFlagSetHandler); + onPlayerUpdateForRCQueueHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnPlayerUpdateForRCQueueHandler); + onPlayerUpdateForItemQueueHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnPlayerUpdateForItemQueueHandler); + onItemReceiveHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnItemReceiveHandler); + onDialogMessageHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnDialogMessageHandler); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnVanillaBehaviorHandler); + onSceneInitHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler); + onActorInitHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler); + onActorUpdateHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnActorUpdateHandler); + onPlayerUpdateHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayerUpdateHandler); + onGameFrameUpdateHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnGameFrameUpdateHandler); + onSceneSpawnActorsHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnSceneSpawnActorsHandler); + onPlayDestroyHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnPlayDestroyHandler); + onExitGameHook = + GameInteractor::Instance->RegisterGameHook(RandomizerOnExitGameHandler); + onKaleidoUpdateHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnKaleidoscopeUpdateHandler); + onCuccoOrChickenHatchHook = GameInteractor::Instance->RegisterGameHook( + RandomizerOnCuccoOrChickenHatch); if (RAND_GET_OPTION(RSK_FISHSANITY) != RO_FISHSANITY_OFF) { OTRGlobals::Instance->gRandoContext->GetFishsanity()->InitializeFromSave(); - fishsanityOnActorInitHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnActorInitHandler); - fishsanityOnActorUpdateHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnActorUpdateHandler); - fishsanityOnSceneInitHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnSceneInitHandler); - fishsanityOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnVanillaBehaviorHandler); - fishsanityOnItemReceiveHook = GameInteractor::Instance->RegisterGameHook(Rando::Fishsanity::OnItemReceiveHandler); + fishsanityOnActorInitHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnActorInitHandler); + fishsanityOnActorUpdateHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnActorUpdateHandler); + fishsanityOnSceneInitHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnSceneInitHandler); + fishsanityOnVanillaBehaviorHook = + GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnVanillaBehaviorHandler); + fishsanityOnItemReceiveHook = GameInteractor::Instance->RegisterGameHook( + Rando::Fishsanity::OnItemReceiveHandler); } if (RAND_GET_OPTION(RSK_SHUFFLE_POTS) != RO_SHUFFLE_POTS_OFF) { - shufflePotsOnActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_OBJ_TSUBO, ObjTsubo_RandomizerInit); - shufflePotsOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShufflePots_OnVanillaBehaviorHandler); + shufflePotsOnActorInitHook = GameInteractor::Instance->RegisterGameHookForID( + ACTOR_OBJ_TSUBO, ObjTsubo_RandomizerInit); + shufflePotsOnVanillaBehaviorHook = + GameInteractor::Instance->RegisterGameHook( + ShufflePots_OnVanillaBehaviorHandler); } if (RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING) != RO_SHUFFLE_FREESTANDING_OFF) { - shuffleFreestandingOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(ShuffleFreestanding_OnVanillaBehaviorHandler); + shuffleFreestandingOnVanillaBehaviorHook = + GameInteractor::Instance->RegisterGameHook( + ShuffleFreestanding_OnVanillaBehaviorHandler); } - + if (RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES)) { ShuffleFairies_RegisterHooks(); } diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index 1c315b47f..ee0dc9403 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -11,31 +11,38 @@ #include "../../OTRGlobals.h" namespace Rando { -Item::Item() : randomizerGet(RG_NONE), type(ITEMTYPE_ITEM), getItemId(GI_NONE), advancement(false), hintKey(RHT_NONE), - progressive(false), price(0) {} +Item::Item() + : randomizerGet(RG_NONE), type(ITEMTYPE_ITEM), getItemId(GI_NONE), advancement(false), hintKey(RHT_NONE), + progressive(false), price(0) { +} Item::Item(const RandomizerGet randomizerGet_, Text name_, const ItemType type_, const int16_t getItemId_, - const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t itemId_, - const uint16_t objectId_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, - const int16_t chestAnimation_, const GetItemCategory category_, const uint16_t modIndex_, - const bool progressive_, const uint16_t price_) + const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t itemId_, + const uint16_t objectId_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, + const int16_t chestAnimation_, const GetItemCategory category_, const uint16_t modIndex_, + const bool progressive_, const uint16_t price_) : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), - advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { + advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) { - giEntry = std::make_shared(GetItemEntry{ itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, objectId_, modIndex_, TABLE_RANDOMIZER, static_cast(randomizerGet_), gid_, true, ITEM_FROM_NPC, category_, static_cast(randomizerGet_), MOD_RANDOMIZER, NULL }); - } - else { - giEntry = std::make_shared(GetItemEntry{ itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, objectId_, modIndex_, TABLE_VANILLA, getItemId_, gid_, true, ITEM_FROM_NPC, category_, itemId_, modIndex_, NULL }); + giEntry = std::make_shared(GetItemEntry{ + itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, + objectId_, modIndex_, TABLE_RANDOMIZER, static_cast(randomizerGet_), gid_, true, ITEM_FROM_NPC, + category_, static_cast(randomizerGet_), MOD_RANDOMIZER, NULL }); + } else { + giEntry = std::make_shared(GetItemEntry{ + itemId_, field_, static_cast((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, + objectId_, modIndex_, TABLE_VANILLA, getItemId_, gid_, true, ITEM_FROM_NPC, category_, itemId_, modIndex_, + NULL }); } } Item::Item(const RandomizerGet randomizerGet_, Text name_, const ItemType type_, const int16_t getItemId_, - const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const bool progressive_, - const uint16_t price_) + const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const bool progressive_, + const uint16_t price_) : randomizerGet(randomizerGet_), name(std::move(name_)), type(type_), getItemId(getItemId_), - advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { + advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) { } - Item::~Item() = default; +Item::~Item() = default; void Item::ApplyEffect() const { auto ctx = Rando::Context::GetInstance(); @@ -283,11 +290,11 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_GIANT_WALLET; break; case 2: - if(tycoonWallet){ + if (tycoonWallet) { actual = RG_TYCOON_WALLET; break; } - //fallthrough + // fallthrough case 3: case 4: if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { @@ -338,8 +345,8 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio } break; case RG_PROGRESSIVE_GORONSWORD: // todo progressive? - actual = RG_BIGGORON_SWORD; - break; + actual = RG_BIGGORON_SWORD; + break; case RG_PROGRESSIVE_BOMBCHUS: if (logic->CurrentInventory(ITEM_BOMBCHU) == ITEM_NONE) { actual = RG_BOMBCHU_BAG; @@ -393,7 +400,8 @@ bool Item::IsMajorItem() const { return false; } - if (type == ITEMTYPE_DUNGEONREWARD && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + if (type == ITEMTYPE_DUNGEONREWARD && + ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { return false; } @@ -407,7 +415,8 @@ bool Item::IsMajorItem() const { return false; } - if (type == ITEMTYPE_SMALLKEY && (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { + if (type == ITEMTYPE_SMALLKEY && (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { return false; } @@ -416,11 +425,13 @@ bool Item::IsMajorItem() const { } if (type == ITEMTYPE_BOSSKEY && getItemId != 0xAD && - (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { + (ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) || + ctx->GetOption(RSK_BOSS_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) { return false; } // Ganons Castle Boss Key - if (getItemId == 0xAD && (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA) || ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON))) { + if (getItemId == 0xAD && (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA) || + ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON))) { return false; } @@ -446,4 +457,4 @@ bool Item::operator==(const Item& right) const { bool Item::operator!=(const Item& right) const { return !operator==(right); } -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/item.h b/soh/soh/Enhancements/randomizer/item.h index f0df0f1bf..da8632151 100644 --- a/soh/soh/Enhancements/randomizer/item.h +++ b/soh/soh/Enhancements/randomizer/item.h @@ -31,17 +31,16 @@ class Item { public: Item(); Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, - LogicVal logicVal_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, - uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, - bool progressive_ = false, uint16_t price_ = 0); + LogicVal logicVal_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, + uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, + bool progressive_ = false, uint16_t price_ = 0); Item(RandomizerGet randomizerGet_, Text name_, ItemType type_, int16_t getItemId_, bool advancement_, - LogicVal logicVal_, RandomizerHintTextKey hintKey_, bool progressive_ = false, uint16_t price_ = 0); + LogicVal logicVal_, RandomizerHintTextKey hintKey_, bool progressive_ = false, uint16_t price_ = 0); ~Item(); void ApplyEffect() const; void UndoEffect() const; - const Text& GetName() const; bool IsAdvancement() const; int GetItemID() const; @@ -75,4 +74,4 @@ class Item { bool playthrough = false; std::shared_ptr giEntry; }; -} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index cfdfb4204..f7587ec5e 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -3,8 +3,10 @@ #include "logic.h" namespace Rando { -ItemLocation::ItemLocation() : rc(RC_UNKNOWN_CHECK) {} -ItemLocation::ItemLocation(const RandomizerCheck rc_) : rc(rc_) {} +ItemLocation::ItemLocation() : rc(RC_UNKNOWN_CHECK) { +} +ItemLocation::ItemLocation(const RandomizerCheck rc_) : rc(rc_) { +} RandomizerCheck ItemLocation::GetRandomizerCheck() const { return rc; @@ -40,14 +42,14 @@ RandomizerGet ItemLocation::GetPlacedRandomizerGet() const { void ItemLocation::SetPlacedItem(const RandomizerGet item) { placedItem = item; - SetPrice (StaticData::RetrieveItem(placedItem).GetPrice()); + SetPrice(StaticData::RetrieveItem(placedItem).GetPrice()); } void ItemLocation::SetDelayedItem(const RandomizerGet item) { delayedItem = item; } -void ItemLocation::SaveDelayedItem () { +void ItemLocation::SaveDelayedItem() { placedItem = delayedItem; delayedItem = RG_NONE; } @@ -56,15 +58,16 @@ void ItemLocation::SetParentRegion(const RandomizerRegion region) { parentRegion = region; } -//RANDOTODO only used in tracker now, could possibly be removed +// RANDOTODO only used in tracker now, could possibly be removed RandomizerRegion ItemLocation::GetParentRegionKey() const { return parentRegion; } void ItemLocation::MergeAreas(std::set newAreas) { areas.merge(newAreas); - if (areas.size() >= 2){ - //if we have more than 1 area, remove any RA_NONE as that's not a real area. can happen if an entrance is in 2 regions and 1 is disconnected + if (areas.size() >= 2) { + // if we have more than 1 area, remove any RA_NONE as that's not a real area. can happen if an entrance is in 2 + // regions and 1 is disconnected areas.erase(RA_NONE); } } @@ -74,7 +77,7 @@ std::set ItemLocation::GetAreas() const { } RandomizerArea ItemLocation::GetFirstArea() const { - if (areas.empty()){ + if (areas.empty()) { assert(false); return RA_NONE; } else { @@ -83,7 +86,7 @@ RandomizerArea ItemLocation::GetFirstArea() const { } RandomizerArea ItemLocation::GetRandomArea() const { - if (areas.empty()){ + if (areas.empty()) { SPDLOG_DEBUG("Attempted to get random area of location with no areas: "); SPDLOG_DEBUG(Rando::StaticData::GetLocation(rc)->GetName()); assert(false); @@ -102,7 +105,7 @@ void ItemLocation::ApplyPlacedItemEffect() const { } uint16_t ItemLocation::GetPrice() const { - //RANDOTODO if we ever change price of shop items, this needs replacing with proper price assignment in Fill + // RANDOTODO if we ever change price of shop items, this needs replacing with proper price assignment in Fill if (StaticData::RetrieveItem(placedItem).GetItemType() == ITEMTYPE_SHOP) { return StaticData::RetrieveItem(placedItem).GetPrice(); } @@ -167,7 +170,7 @@ const std::vector& ItemLocation::GetHintedBy() const { void ItemLocation::AddHintedBy(const RandomizerHint hintKey) { hintedBy.push_back(hintKey); -} +} bool ItemLocation::IsHidden() const { return hidden; @@ -194,7 +197,6 @@ bool ItemLocation::IsVisible() const { } void ItemLocation::SetVisible(const bool visibleInImGui_) { visibleInImGui = visibleInImGui_; - } bool ItemLocation::IsWothCandidate() const { @@ -238,4 +240,4 @@ bool ItemLocation::IsAvailable() const { void ItemLocation::SetAvailable(bool isAvailable_) { isAvailable = isAvailable_; } -} \ No newline at end of file +} // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item_location.h b/soh/soh/Enhancements/randomizer/item_location.h index e60d358eb..a04f5c2cf 100644 --- a/soh/soh/Enhancements/randomizer/item_location.h +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -21,11 +21,11 @@ class ItemLocation { RandomizerGet& RefPlacedItem(); void SetDelayedItem(RandomizerGet item); RandomizerRegion GetParentRegionKey() const; - void SetParentRegion (RandomizerRegion region); + void SetParentRegion(RandomizerRegion region); std::set GetAreas() const; RandomizerArea GetFirstArea() const; RandomizerArea GetRandomArea() const; - void MergeAreas (std::set newAreas); + void MergeAreas(std::set newAreas); void PlaceVanillaItem(); void ApplyPlacedItemEffect() const; void SaveDelayedItem(); diff --git a/soh/soh/Enhancements/randomizer/item_override.cpp b/soh/soh/Enhancements/randomizer/item_override.cpp index 58789c579..cc25c8836 100644 --- a/soh/soh/Enhancements/randomizer/item_override.cpp +++ b/soh/soh/Enhancements/randomizer/item_override.cpp @@ -3,9 +3,11 @@ #include namespace Rando { -ItemOverride::ItemOverride() : mLocation(RC_UNKNOWN_CHECK), mLooksLike(RG_NONE) {} +ItemOverride::ItemOverride() : mLocation(RC_UNKNOWN_CHECK), mLooksLike(RG_NONE) { +} ItemOverride::ItemOverride(const RandomizerCheck location, const RandomizerGet looksLike) - : mLocation(location), mLooksLike(looksLike) {} + : mLocation(location), mLooksLike(looksLike) { +} RandomizerCheck ItemOverride::GetLocation() const { return mLocation; diff --git a/soh/soh/Enhancements/randomizer/item_override.h b/soh/soh/Enhancements/randomizer/item_override.h index 98a1f3d42..355d1e51e 100644 --- a/soh/soh/Enhancements/randomizer/item_override.h +++ b/soh/soh/Enhancements/randomizer/item_override.h @@ -14,7 +14,8 @@ class ItemOverride { RandomizerGet LooksLike() const; RandomizerGet& RefLooksLike(); Text& GetTrickName(); - void SetTrickName (Text trickName); + void SetTrickName(Text trickName); + private: RandomizerCheck mLocation; RandomizerGet mLooksLike; diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 9ac4cabfd..f474397aa 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -252,173 +252,339 @@ RandomizerCheckArea GetAreaFromScene(uint8_t scene) { } } - -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, - isVanillaCompletion_, collectionCheck, vanillaPrice_ }; -} - -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, vanillaPrice_ }; -} - -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + std::string&& spoilerName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck , vanillaPrice_ }; + return { rc, + quest_, + checkType_, + GetAreaFromScene(scene_), + actorId_, + scene_, + actorParams_, + std::move(shortName_), + std::move(spoilerName_), + hintKey, + vanillaItem, + isVanillaCompletion_, + collectionCheck, + vanillaPrice_ }; } -Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, uint16_t vanillaPrice_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, vanillaPrice_ }; +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, std::string&& spoilerName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, + uint16_t vanillaPrice_) { + return { rc, + quest_, + checkType_, + area_, + actorId_, + scene_, + actorParams_, + std::move(shortName_), + std::move(spoilerName_), + hintKey, + vanillaItem, + isVanillaCompletion_, + collectionCheck, + vanillaPrice_ }; } -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_, + uint16_t vanillaPrice_) { + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, + vanillaPrice_ }; } -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, + bool isVanillaCompletion_, uint16_t vanillaPrice_) { + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck, + vanillaPrice_ }; +} + +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, bool isVanillaCompletion_) { + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; +} + +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_CHEST, scene_, flag_) }; } -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, - bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; -} - -Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) }; +Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_) { + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, - SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) }; + return { + rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) + }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, - bool isVanillaCompletion_) { - return { rc, quest_, checkType_, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, bool isVanillaCompletion_) { + return { + rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, SpoilerCollectionCheck(SPOILER_CHK_COLLECTABLE, scene_, flag_) + }; } -Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_) { - return { rc, quest_, checkType_, area_, actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; + return { rc, quest_, checkType_, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; } -Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, +Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckType checkType_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, const RandomizerHintTextKey hintKey, + const RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, + bool isVanillaCompletion_) { + return { rc, quest_, checkType_, area_, + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, isVanillaCompletion_, collectionCheck }; +} + +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey) { - return { rc, quest_, RCTYPE_SKULL_TOKEN, GetAreaFromScene(scene_), ACTOR_EN_SI, scene_, actorParams_, std::move(shortName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, true, - SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, scene_, flag_) }; + return { rc, + quest_, + RCTYPE_SKULL_TOKEN, + GetAreaFromScene(scene_), + ACTOR_EN_SI, + scene_, + actorParams_, + std::move(shortName_), + hintKey, + RG_GOLD_SKULLTULA_TOKEN, + true, + SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, scene_, flag_) }; } -Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const uint8_t skullScene_) { - return { rc, quest_, RCTYPE_SKULL_TOKEN, GetAreaFromScene(scene_), ACTOR_EN_SI, scene_, actorParams_, std::move(shortName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, true, - SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; + return { rc, + quest_, + RCTYPE_SKULL_TOKEN, + GetAreaFromScene(scene_), + ACTOR_EN_SI, + scene_, + actorParams_, + std::move(shortName_), + hintKey, + RG_GOLD_SKULLTULA_TOKEN, + true, + SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; } -Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, const RandomizerHintTextKey hintKey, const uint8_t skullScene_) { - return { rc, quest_, RCTYPE_SKULL_TOKEN, area_, ACTOR_EN_SI, scene_, actorParams_, std::move(shortName_), hintKey, RG_GOLD_SKULLTULA_TOKEN, true, - SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; +Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, const uint8_t skullScene_) { + return { rc, + quest_, + RCTYPE_SKULL_TOKEN, + area_, + ACTOR_EN_SI, + scene_, + actorParams_, + std::move(shortName_), + hintKey, + RG_GOLD_SKULLTULA_TOKEN, + true, + SpoilerCollectionCheck(SPOILER_CHK_GOLD_SKULLTULA, skullScene_, flag_) }; } -Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, +Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_) { - return { rc, quest_, RCTYPE_STATIC_HINT, area_, actorId_, scene_, 0x00, std::move(shortName_), std::move(spoilerName_), RHT_NONE, RG_NONE, false }; + return { rc, + quest_, + RCTYPE_STATIC_HINT, + area_, + actorId_, + scene_, + 0x00, + std::move(shortName_), + std::move(spoilerName_), + RHT_NONE, + RG_NONE, + false }; } -Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_STATIC_HINT, GetAreaFromScene(scene_), actorId_, scene_, 0x00, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, + SceneID scene_, std::string&& shortName_) { + return { rc, + quest_, + RCTYPE_STATIC_HINT, + GetAreaFromScene(scene_), + actorId_, + scene_, + 0x00, + std::move(shortName_), + RHT_NONE, + RG_NONE, + false }; } -Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_STATIC_HINT, area_, actorId_, scene_, 0x00, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_) { + return { rc, quest_, RCTYPE_STATIC_HINT, area_, actorId_, scene_, 0x00, std::move(shortName_), RHT_NONE, + RG_NONE, false }; } -Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_GOSSIP_STONE, GetAreaFromScene(scene_), ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_) { + return { rc, + quest_, + RCTYPE_GOSSIP_STONE, + GetAreaFromScene(scene_), + ACTOR_EN_GS, + scene_, + actorParams_, + std::move(shortName_), + RHT_NONE, + RG_NONE, + false }; } -Rando::Location Rando::Location::Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, int32_t actorParams_, RandomizerInf flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem) { - return {rc, quest_, RCTYPE_FISH, GetAreaFromScene(scene_), actorId_, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, - SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_)}; +Rando::Location Rando::Location::Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem) { + return { rc, quest_, RCTYPE_FISH, GetAreaFromScene(scene_), + actorId_, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, false, SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_) }; } -Rando::Location Rando::Location::GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, int32_t actorParams_, RandomizerInf flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey) { - return {rc, quest_, RCTYPE_FISH, area_, ACTOR_EN_FISH, SCENE_GROTTOS, actorParams_, std::move(shortName_), hintKey, RG_FISH, false, - SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, SCENE_GROTTOS, flag_)}; +Rando::Location Rando::Location::GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey) { + return { rc, + quest_, + RCTYPE_FISH, + area_, + ACTOR_EN_FISH, + SCENE_GROTTOS, + actorParams_, + std::move(shortName_), + hintKey, + RG_FISH, + false, + SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, SCENE_GROTTOS, flag_) }; } Rando::Location Rando::Location::Pot(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_POT, area_, ACTOR_OBJ_TSUBO, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, - collectionCheck }; + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { + rc, quest_, RCTYPE_POT, area_, ACTOR_OBJ_TSUBO, scene_, actorParams_, std::move(shortName_), + hintKey, vanillaItem, false, collectionCheck + }; } Rando::Location Rando::Location::Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, - collectionCheck }; + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; } Rando::Location Rando::Location::NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, - collectionCheck }; + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; } Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, - collectionCheck }; + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; } -Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { - return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; +Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_) { + return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, + scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, + false }; } -Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, - RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { - return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, false, collectionCheck}; +Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), + hintKey, RG_NONE, false, collectionCheck }; } Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, - RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { - return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, collectionCheck }; + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, + scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, + false, collectionCheck }; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 1043cb3c5..f99499652 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -20,7 +20,9 @@ class SpoilerCollectionCheck { uint16_t flag = 0; SpoilerCollectionCheck() = default; - SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) : type(type_), scene(scene_), flag(flag_) {} + SpoilerCollectionCheck(const SpoilerCollectionCheckType type_, const uint8_t scene_, const uint16_t flag_) + : type(type_), scene(scene_), flag(flag_) { + } static auto ItemGetInf(const uint8_t slot) { return SpoilerCollectionCheck(SPOILER_CHK_ITEM_GET_INF, 0x00, slot); @@ -49,46 +51,52 @@ class SpoilerCollectionCheck { class Location { public: - //RANDOTODO fix wacky ordering - Location() : rc(RC_UNKNOWN_CHECK), quest(RCQUEST_BOTH), checkType(RCTYPE_STANDARD), area(RCAREA_INVALID), actorId(ACTOR_ID_MAX), scene(SCENE_ID_MAX), actorParams(0), - hintKey(RHT_NONE), vanillaItem(RG_NONE), isVanillaCompletion(false), collectionCheck(SpoilerCollectionCheck()) {} + // RANDOTODO fix wacky ordering + Location() + : rc(RC_UNKNOWN_CHECK), quest(RCQUEST_BOTH), checkType(RCTYPE_STANDARD), area(RCAREA_INVALID), + actorId(ACTOR_ID_MAX), scene(SCENE_ID_MAX), actorParams(0), hintKey(RHT_NONE), vanillaItem(RG_NONE), + isVanillaCompletion(false), collectionCheck(SpoilerCollectionCheck()) { + } - 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_, std::string spoilerName_, const RandomizerHintTextKey hintKey_, - const RandomizerGet vanillaItem_, const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), - const int vanillaPrice_ = 0) - : 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_) { - 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_, - const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), - 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_), + 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_, std::string spoilerName_, const RandomizerHintTextKey hintKey_, + const RandomizerGet vanillaItem_, const bool isVanillaCompletion_ = false, + const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const int vanillaPrice_ = 0) + : 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_) { - 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 "); + 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); - } + 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_, + const bool isVanillaCompletion_ = false, + const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), 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_) { + 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) { @@ -119,118 +127,143 @@ class Location { 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_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + 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_, RandomizerCheckArea area_, 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(), + bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, 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 Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false, uint16_t vanillaPrice_ = 0); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_ = false); + + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck, bool isVanillaCompletion_ = false); - static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck, - bool isVanillaCompletion_ = false); - - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); - - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, uint8_t flag_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, bool isVanillaCompletion_ = false); + + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + ActorID actorId_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false); - static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, - SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), bool isVanillaCompletion_ = false); + static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, + RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), + bool isVanillaCompletion_ = false); - static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, - RandomizerHintTextKey hintKey); + static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey); /// @brief For certain scenes, the sceneId and the "Scene" in spoiler collection check later used to check the - /// GS flags don't necessarily match. Use this constructor (or the next one) for those. scene_ should be the actual scene where - /// the GS is located, skullScene_ is the value passed to GET_GS_FLAGS to get the correct skulltula. It is normal - /// and expected that these don't always match, and the naming is a holdover from 3drando. - /// @param rc - /// @param quest_ - /// @param scene_ - /// @param actorParams_ - /// @param flag_ - /// @param shortName_ - /// @param hintKey - /// @param skullScene_ + /// GS flags don't necessarily match. Use this constructor (or the next one) for those. scene_ should be the actual + /// scene where the GS is located, skullScene_ is the value passed to GET_GS_FLAGS to get the correct skulltula. It + /// is normal and expected that these don't always match, and the naming is a holdover from 3drando. + /// @param rc + /// @param quest_ + /// @param scene_ + /// @param actorParams_ + /// @param flag_ + /// @param shortName_ + /// @param hintKey + /// @param skullScene_ /// @return - static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, + uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, + uint8_t skullScene_); + + static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, uint8_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, uint8_t skullScene_); - static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, uint8_t flag_, - std::string&& shortName_, RandomizerHintTextKey hintKey, uint8_t skullScene_); + static Location Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem); - static Location Fish(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, int32_t actorParams_, - RandomizerInf flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem); - - static Location GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, int32_t actorParams_, - RandomizerInf flag_, std::string&& shortName_, RandomizerHintTextKey hintKey); + static Location GrottoFish(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + RandomizerHintTextKey hintKey); static Location Pot(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck); + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck); + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); static Location Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck); + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); static Location NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck); + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); - static Location SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, - int32_t actorParams_, std::string&& shortName_, - RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, - SpoilerCollectionCheck collectionCheck); + static Location SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); - static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, - std::string&& spoilerName_); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); - static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, std::string&& shortName_); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, ActorID actorId_, SceneID scene_, + std::string&& shortName_); - static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + ActorID actorId_, SceneID scene_, std::string&& shortName_); - static Location Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck); + static Location Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + SpoilerCollectionCheck collectionCheck); - static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, std::string&& shortName_); + static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, SceneID scene_, int32_t actorParams_, + std::string&& shortName_); - static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_); + static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_); private: RandomizerCheck rc; diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index e2781e9fb..c06ca5d70 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -12,18 +12,18 @@ #include extern "C" { - extern SaveContext gSaveContext; - extern PlayState* gPlayState; +extern SaveContext gSaveContext; +extern PlayState* gPlayState; } -//generic grotto event list +// generic grotto event list std::vector grottoEvents; -//set the logic to be a specific age and time of day and see if the condition still holds +// set the logic to be a specific age and time of day and see if the condition still holds bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const { logic->IsChild = false; logic->IsAdult = false; - logic->AtDay = false; + logic->AtDay = false; logic->AtNight = false; time = true; @@ -33,21 +33,20 @@ bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const { } bool LocationAccess::ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const { - //WARNING enterance validation can run this after resetting the access for sphere 0 validation - //When refactoring ToD access, either fix the above or do not assume that we - //have any access at all just because this is being run + // WARNING enterance validation can run this after resetting the access for sphere 0 validation + // When refactoring ToD access, either fix the above or do not assume that we + // have any access at all just because this is being run bool conditionsMet = false; - if ( - (parentRegion->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || + if ((parentRegion->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || (parentRegion->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) || - (parentRegion->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || - (parentRegion->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) - ) { + (parentRegion->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || + (parentRegion->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight))) { conditionsMet = true; } - - return conditionsMet && (calculatingAvailableChecks || CanBuy()); // TODO: run CanBuy when price is known due to settings + + return conditionsMet && + (calculatingAvailableChecks || CanBuy()); // TODO: run CanBuy when price is known due to settings } bool LocationAccess::CanBuy() const { @@ -70,25 +69,16 @@ bool CanBuyAnother(RandomizerCheck rc) { } Region::Region() = default; -Region::Region( - std::string regionName_, - std::string scene_, - std::set areas, - bool timePass_, - std::vector events_, - std::vector locations_, - std::list exits_ -) : regionName(std::move(regionName_)), - scene(std::move(scene_)), - areas(areas), - timePass(timePass_), - events(std::move(events_)), - locations(std::move(locations_)), - exits(std::move(exits_)) {} +Region::Region(std::string regionName_, std::string scene_, std::set areas, bool timePass_, + std::vector events_, std::vector locations_, + std::list exits_) + : regionName(std::move(regionName_)), scene(std::move(scene_)), areas(areas), timePass(timePass_), + events(std::move(events_)), locations(std::move(locations_)), exits(std::move(exits_)) { +} Region::~Region() = default; -void Region::ApplyTimePass(){ +void Region::ApplyTimePass() { if (timePass) { StartPerformanceTimer(PT_TOD_ACCESS); if (Child()) { @@ -108,20 +98,18 @@ void Region::ApplyTimePass(){ } bool Region::UpdateEvents() { - bool eventsUpdated = false; + bool eventsUpdated = false; StartPerformanceTimer(PT_EVENT_ACCESS); for (EventAccess& event : events) { - //If the event has already happened, there's no reason to check it + // If the event has already happened, there's no reason to check it if (event.GetEvent()) { continue; } - if ( - (childDay && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || - (childNight && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) || - (adultDay && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || - (adultNight && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight)) - ) { + if ((childDay && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) || + (childNight && event.CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) || + (adultDay && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) || + (adultNight && event.CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight))) { event.EventOccurred(); eventsUpdated = true; } @@ -131,14 +119,14 @@ bool Region::UpdateEvents() { } void Region::AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition) { - Rando::Entrance newExit = Rando::Entrance(newExitKey, {condition}); + Rando::Entrance newExit = Rando::Entrance(newExitKey, { condition }); newExit.SetParentRegion(parentKey); exits.push_front(newExit); } -//The exit will be completely removed from this region +// The exit will be completely removed from this region void Region::RemoveExit(Rando::Entrance* exitToRemove) { - exits.remove_if([exitToRemove](const auto exit){return &exit == exitToRemove;}); + exits.remove_if([exitToRemove](const auto exit) { return &exit == exitToRemove; }); } void Region::SetAsPrimary(RandomizerRegion exitToBePrimary) { @@ -157,7 +145,8 @@ Rando::Entrance* Region::GetExit(RandomizerRegion exitToReturn) { } } - LUSLOG_ERROR("ERROR: EXIT \"%s\" DOES NOT EXIST IN \"%s\"", RegionTable(exitToReturn)->regionName.c_str(), this->regionName.c_str()); + LUSLOG_ERROR("ERROR: EXIT \"%s\" DOES NOT EXIST IN \"%s\"", RegionTable(exitToReturn)->regionName.c_str(), + this->regionName.c_str()); assert(false); return nullptr; } @@ -195,9 +184,9 @@ bool Region::CheckAllAccess(const RandomizerRegion exitKey) { for (Rando::Entrance& exit : exits) { if (exit.GetConnectedRegionKey() == exitKey) { - return exit.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay) && + return exit.CheckConditionAtAgeTime(logic->IsChild, logic->AtDay) && exit.CheckConditionAtAgeTime(logic->IsChild, logic->AtNight) && - exit.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay) && + exit.CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay) && exit.CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight); } } @@ -320,15 +309,15 @@ std::shared_ptr logic; void RegionTable_Init() { using namespace Rando; ctx = Context::GetInstance().get(); - logic = ctx->GetLogic(); //RANDOTODO do not hardcode, instead allow accepting a Logic class somehow + logic = ctx->GetLogic(); // RANDOTODO do not hardcode, instead allow accepting a Logic class somehow grottoEvents = { - EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), - EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS));}), - EventAccess(&logic->BugShrub, []{return logic->CanCutShrubs();}), - EventAccess(&logic->LoneFish, []{return true;}), + EventAccess(&logic->GossipStoneFairy, [] { return logic->CallGossipFairy(); }), + EventAccess(&logic->ButterflyFairy, [] { return logic->ButterflyFairy || (logic->CanUse(RG_STICKS)); }), + EventAccess(&logic->BugShrub, [] { return logic->CanCutShrubs(); }), + EventAccess(&logic->LoneFish, [] { return true; }), }; - //Clear the array from any previous playthrough attempts. This is important so that - //locations which appear in both MQ and Vanilla dungeons don't get set in both areas. + // Clear the array from any previous playthrough attempts. This is important so that + // locations which appear in both MQ and Vanilla dungeons don't get set in both areas. areaTable.fill(Region("Invalid Region", "Invalid Region", {}, NO_DAY_NIGHT_CYCLE, {}, {}, {})); // clang-format off @@ -438,7 +427,7 @@ void RegionTable_Init() { RegionTable_Init_GerudoTrainingGround(); RegionTable_Init_GanonsCastle(); - //Set parent regions + // Set parent regions for (uint32_t i = RR_ROOT; i <= RR_GANONS_CASTLE; i++) { for (LocationAccess& locPair : areaTable[i].locations) { RandomizerCheck location = locPair.GetLocation(); @@ -491,130 +480,131 @@ std::string CleanCheckConditionString(std::string condition) { } namespace Regions { - const auto GetAllRegions() { - static const size_t regionCount = RR_MAX - (RR_NONE + 1); +const auto GetAllRegions() { + static const size_t regionCount = RR_MAX - (RR_NONE + 1); - static std::array allRegions = {}; + static std::array allRegions = {}; - static bool intialized = false; - if (!intialized) { - for (size_t i = 0; i < regionCount; i++) { - allRegions[i] = (RandomizerRegion)((RR_NONE + 1) + i); - } - intialized = true; + static bool intialized = false; + if (!intialized) { + for (size_t i = 0; i < regionCount; i++) { + allRegions[i] = (RandomizerRegion)((RR_NONE + 1) + i); } - - return allRegions; + intialized = true; } - void AccessReset() { - auto ctx = Rando::Context::GetInstance(); - for (const RandomizerRegion region : GetAllRegions()) { - RegionTable(region)->ResetVariables(); - } + return allRegions; +} - if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childNight = true; - } else { - RegionTable(RR_ROOT)->adultNight = true; - } +void AccessReset() { + auto ctx = Rando::Context::GetInstance(); + for (const RandomizerRegion region : GetAllRegions()) { + RegionTable(region)->ResetVariables(); + } + + if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childNight = true; } else { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childDay = true; - } else { - RegionTable(RR_ROOT)->adultDay = true; - } + RegionTable(RR_ROOT)->adultNight = true; } - } - - //Reset exits and clear items from locations - void ResetAllLocations() { - auto ctx = Rando::Context::GetInstance(); - for (const RandomizerRegion region : GetAllRegions()) { - RegionTable(region)->ResetVariables(); - //Erase item from every location in this exit - for (LocationAccess& locPair : RegionTable(region)->locations) { - RandomizerCheck location = locPair.GetLocation(); - Rando::Context::GetInstance()->GetItemLocation(location)->ResetVariables(); - } - } - - if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { - 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->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childDay = true; } else { - if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { - RegionTable(RR_ROOT)->childDay = true; - } else { - RegionTable(RR_ROOT)->adultDay = true; - } + RegionTable(RR_ROOT)->adultDay = true; + } + } +} + +// Reset exits and clear items from locations +void ResetAllLocations() { + auto ctx = Rando::Context::GetInstance(); + for (const RandomizerRegion region : GetAllRegions()) { + RegionTable(region)->ResetVariables(); + // Erase item from every location in this exit + for (LocationAccess& locPair : RegionTable(region)->locations) { + RandomizerCheck location = locPair.GetLocation(); + Rando::Context::GetInstance()->GetItemLocation(location)->ResetVariables(); } } - bool HasTimePassAccess(uint8_t age) { - for (const RandomizerRegion regionKey : GetAllRegions()) { - auto region = RegionTable(regionKey); - if (region->timePass && ((age == RO_AGE_CHILD && region->Child()) || (age == RO_AGE_ADULT && region->Adult()))) { - return true; - } + if (/*Settings::HasNightStart TODO:: Randomize Starting Time*/ false) { + 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->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + RegionTable(RR_ROOT)->childDay = true; + } else { + RegionTable(RR_ROOT)->adultDay = true; } - return false; } +} - // Will dump a file which can be turned into a visual graph using graphviz - // https://graphviz.org/download/ - // Use command: dot -Tsvg -o world.svg - // Then open in a browser and CTRL + F to find the area of interest - void DumpWorldGraph(std::string str) { - std::ofstream worldGraph; - worldGraph.open (str + ".dot"); - worldGraph << "digraph {\n\tcenter=true;\n"; +bool HasTimePassAccess(uint8_t age) { + for (const RandomizerRegion regionKey : GetAllRegions()) { + auto region = RegionTable(regionKey); + if (region->timePass && + ((age == RO_AGE_CHILD && region->Child()) || (age == RO_AGE_ADULT && region->Adult()))) { + return true; + } + } + return false; +} - for (const RandomizerRegion regionKey : GetAllRegions()) { - auto region = RegionTable(regionKey); - for (auto exit : region->exits) { - if (exit.GetConnectedRegion()->regionName != "Invalid Region") { - std::string parent = exit.GetParentRegion()->regionName; - if (region->childDay) { - parent += " CD"; - } - if (region->childNight) { - parent += " CN"; - } - if (region->adultDay) { - parent += " AD"; - } - if (region->adultNight) { - parent += " AN"; - } - Region* connected = exit.GetConnectedRegion(); - auto connectedStr = connected->regionName; - if (connected->childDay) { - connectedStr += " CD"; - } - if (connected->childNight) { - connectedStr += " CN"; - } - if (connected->adultDay) { - connectedStr += " AD"; - } - if (connected->adultNight) { - connectedStr += " AN"; - } - worldGraph << "\t\"" + parent + "\"[shape=\"plain\"];\n"; - worldGraph << "\t\"" + connectedStr + "\"[shape=\"plain\"];\n"; - worldGraph << "\t\"" + parent + "\" -> \"" + connectedStr + "\"\n"; +// Will dump a file which can be turned into a visual graph using graphviz +// https://graphviz.org/download/ +// Use command: dot -Tsvg -o world.svg +// Then open in a browser and CTRL + F to find the area of interest +void DumpWorldGraph(std::string str) { + std::ofstream worldGraph; + worldGraph.open(str + ".dot"); + worldGraph << "digraph {\n\tcenter=true;\n"; + + for (const RandomizerRegion regionKey : GetAllRegions()) { + auto region = RegionTable(regionKey); + for (auto exit : region->exits) { + if (exit.GetConnectedRegion()->regionName != "Invalid Region") { + std::string parent = exit.GetParentRegion()->regionName; + if (region->childDay) { + parent += " CD"; } + if (region->childNight) { + parent += " CN"; + } + if (region->adultDay) { + parent += " AD"; + } + if (region->adultNight) { + parent += " AN"; + } + Region* connected = exit.GetConnectedRegion(); + auto connectedStr = connected->regionName; + if (connected->childDay) { + connectedStr += " CD"; + } + if (connected->childNight) { + connectedStr += " CN"; + } + if (connected->adultDay) { + connectedStr += " AD"; + } + if (connected->adultNight) { + connectedStr += " AN"; + } + worldGraph << "\t\"" + parent + "\"[shape=\"plain\"];\n"; + worldGraph << "\t\"" + connectedStr + "\"[shape=\"plain\"];\n"; + worldGraph << "\t\"" + parent + "\" -> \"" + connectedStr + "\"\n"; } } - worldGraph << "}"; - worldGraph.close(); } -} //namespace Regions + worldGraph << "}"; + worldGraph.close(); +} +} // namespace Regions Region* RegionTable(const RandomizerRegion regionKey) { if (regionKey > RR_MAX) { @@ -623,12 +613,13 @@ Region* RegionTable(const RandomizerRegion regionKey) { return &(areaTable[regionKey]); } -//Retrieve all the shuffable entrances of a specific type +// Retrieve all the shuffable entrances of a specific type std::vector GetShuffleableEntrances(Rando::EntranceType type, bool onlyPrimary /*= true*/) { std::vector entrancesToShuffle = {}; for (RandomizerRegion region : Regions::GetAllRegions()) { for (auto& exit : RegionTable(region)->exits) { - if ((exit.GetType() == type || type == Rando::EntranceType::All) && (exit.IsPrimary() || !onlyPrimary) && exit.GetType() != Rando::EntranceType::None) { + if ((exit.GetType() == type || type == Rando::EntranceType::All) && (exit.IsPrimary() || !onlyPrimary) && + exit.GetType() != Rando::EntranceType::None) { entrancesToShuffle.push_back(&exit); } } diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index ad7061963..828c31a08 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -18,287 +18,317 @@ extern std::shared_ptr logic; class Region; class EventAccess { - public: - explicit EventAccess(bool* event_, ConditionFn condition_function_) : event(event_), condition_function(condition_function_) {} + public: + explicit EventAccess(bool* event_, ConditionFn condition_function_) + : event(event_), condition_function(condition_function_) { + } - bool ConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } - return true; + bool ConditionsMet() const { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); } + return true; + } - bool CheckConditionAtAgeTime(bool& age, bool& time) { - logic->IsChild = false; - logic->IsAdult = false; - logic->AtDay = false; - logic->AtNight = false; + bool CheckConditionAtAgeTime(bool& age, bool& time) { + logic->IsChild = false; + logic->IsAdult = false; + logic->AtDay = false; + logic->AtNight = false; - time = true; - age = true; + time = true; + age = true; - return ConditionsMet(); - } + return ConditionsMet(); + } - void EventOccurred() { - *event = true; - } + void EventOccurred() { + *event = true; + } - bool GetEvent() const { - return *event; - } + bool GetEvent() const { + return *event; + } - private: - bool* event; - ConditionFn condition_function; + private: + bool* event; + ConditionFn condition_function; }; std::string CleanCheckConditionString(std::string condition); -#define LOCATION(check, condition) LocationAccess(check, []{return condition;}, CleanCheckConditionString(#condition)) +#define LOCATION(check, condition) \ + LocationAccess( \ + check, [] { return condition; }, CleanCheckConditionString(#condition)) -//this class is meant to hold an item location with a boolean function to determine its accessibility from a specific area +// this class is meant to hold an item location with a boolean function to determine its accessibility from a specific +// area class LocationAccess { - public: - explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_) : location(location_), condition_function(condition_function_), condition_str("") {} + public: + explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_) + : location(location_), condition_function(condition_function_), condition_str("") { + } - explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_, std::string condition_str_) : location(location_), condition_function(condition_function_), condition_str(condition_str_) {} + explicit LocationAccess(RandomizerCheck location_, ConditionFn condition_function_, std::string condition_str_) + : location(location_), condition_function(condition_function_), condition_str(condition_str_) { + } - bool GetConditionsMet() const { - auto ctx = Rando::Context::GetInstance(); - if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { - return condition_function(); - } - return true; + bool GetConditionsMet() const { + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_GLITCHLESS)) { + return condition_function(); } + return true; + } - bool CheckConditionAtAgeTime(bool& age, bool& time) const; + bool CheckConditionAtAgeTime(bool& age, bool& time) const; - bool ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const; + bool ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const; - RandomizerCheck GetLocation() const { - return location; - } + RandomizerCheck GetLocation() const { + return location; + } - std::string GetConditionStr() const { - return condition_str; - } + std::string GetConditionStr() const { + return condition_str; + } - protected: - RandomizerCheck location; - ConditionFn condition_function; - std::string condition_str; + protected: + RandomizerCheck location; + ConditionFn condition_function; + std::string condition_str; - //Makes sure shop locations are buyable - bool CanBuy() const; + // Makes sure shop locations are buyable + bool CanBuy() const; }; bool CanBuyAnother(RandomizerCheck rc); namespace Rando { - class Entrance; - enum class EntranceType; -} +class Entrance; +enum class EntranceType; +} // namespace Rando class Region { - public: - Region(); - Region( - std::string regionName_, - std::string scene_, - std::set areas, - bool timePass_, - std::vector events_, - std::vector locations_, - std::list exits_ - ); - ~Region(); + public: + Region(); + Region(std::string regionName_, std::string scene_, std::set areas, bool timePass_, + std::vector events_, std::vector locations_, std::list exits_); + ~Region(); - std::string regionName; - std::string scene; - std::set areas; - bool timePass; - std::vector events; - std::vector locations; - std::list exits; - std::list entrances; - //^ The above exits are now stored in a list instead of a vector because - //the entrance randomization algorithm plays around with pointers to these - //entrances a lot. By putting the entrances in a list, we don't have to - //worry about a vector potentially reallocating itself and invalidating all our - //entrance pointers. + std::string regionName; + std::string scene; + std::set areas; + bool timePass; + std::vector events; + std::vector locations; + std::list exits; + std::list entrances; + //^ The above exits are now stored in a list instead of a vector because + // the entrance randomization algorithm plays around with pointers to these + // entrances a lot. By putting the entrances in a list, we don't have to + // worry about a vector potentially reallocating itself and invalidating all our + // entrance pointers. - bool childDay = false; - bool childNight = false; - bool adultDay = false; - bool adultNight = false; - bool addedToPool = false;; + bool childDay = false; + bool childNight = false; + bool adultDay = false; + bool adultNight = false; + bool addedToPool = false; + ; - void ApplyTimePass(); + void ApplyTimePass(); - bool UpdateEvents(); + bool UpdateEvents(); - void AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition); + void AddExit(RandomizerRegion parentKey, RandomizerRegion newExitKey, ConditionFn condition); - void RemoveExit(Rando::Entrance* exitToRemove); + void RemoveExit(Rando::Entrance* exitToRemove); - void SetAsPrimary(RandomizerRegion exitToBePrimary); + void SetAsPrimary(RandomizerRegion exitToBePrimary); - Rando::Entrance* GetExit(RandomizerRegion exit); + Rando::Entrance* GetExit(RandomizerRegion exit); - bool Child() const { - return childDay || childNight; + bool Child() const { + return childDay || childNight; + } + + bool Adult() const { + return adultDay || adultNight; + } + + bool BothAgesCheck() const { + return Child() && Adult(); + } + + bool HasAccess() const { + return Child() || Adult(); + } + + bool AllAccess() const { + return childDay && childNight && adultDay && adultNight; + } + + // Check to see if an exit can be access as both ages at both times of day + bool CheckAllAccess(RandomizerRegion exitKey); + + std::set GetAllAreas() const { + return areas; + } + + RandomizerArea GetFirstArea() const { + if (areas.empty()) { + assert(false); + return RA_NONE; + } else { + return *areas.begin(); } + } - bool Adult() const { - return adultDay || adultNight; - } + void ReplaceAreas(std::set newAreas) { + areas = newAreas; + } - bool BothAgesCheck() const { - return Child() && Adult(); - } + // Here checks conditional access based on whether or not both ages have + // access to this area. For example: if there are rocks that block a path + // which both child and adult can access, adult having hammer can give + // both child and adult access to the path. + bool Here(ConditionFn condition) { + // store current age variables + bool pastAdult = logic->IsAdult; + bool pastChild = logic->IsChild; - bool HasAccess() const { - return Child() || Adult(); - } + // set age access as this areas ages + logic->IsChild = Child(); + logic->IsAdult = Adult(); - bool AllAccess() const { - return childDay && childNight && adultDay && adultNight; - } + // heck condition as well as having at least child or adult access + bool hereVal = condition() && (logic->IsAdult || logic->IsChild); - //Check to see if an exit can be access as both ages at both times of day - bool CheckAllAccess(RandomizerRegion exitKey); + // set back age variables + logic->IsChild = pastChild; + logic->IsAdult = pastAdult; - std::set GetAllAreas() const{ - return areas; - } + return hereVal; + } - RandomizerArea GetFirstArea() const{ - if (areas.empty()){ - assert(false); - return RA_NONE; - } else { - return *areas.begin(); + bool CanPlantBeanCheck() const; + bool AllAccountedFor() const; + + void ResetVariables(); + + void printAgeTimeAccess() const { + auto message = "Child Day: " + std::to_string(childDay) + + "\t" + "Child Night: " + + std::to_string(childNight) + + "\t" + "Adult Day: " + + std::to_string(adultDay) + + "\t" + "Adult Night: " + + std::to_string(adultNight); + } + + /* + * This logic covers checks that exist in the shared areas of MQ spirit from a glitchless standpoint. + * This room has Quantum logic that I am currently handling with this function, however this is NOT suitable for + glitch logic as it relies on specific ages + * In this chunk there are 3 possibilities for passing a check, but first I have to talk about parallel universes. + + * In MQ Spirit key logic, we mostly care about 2 possibilities for how the player can spend keys, creating 2 + Parralel universes + * In the first universe, the player did not enter spirit as adult until after climbing as child, thus child spends + keys linearly, only needing 2 to reach statue room. + * In the second universe, the player went in as adult, possibly out of logic, and started wasting the keys to lock + child out. + * These Universes converge when the player has 7 keys (meaning adult can no longer lock child out) and adult is + known to be able to reach Statue room. This creates "Certain Access", which is tracked seperatly for each age. + * Child Certain Access is simple, if we have 7 keys and child access, it's Certain Access. + * Adult Certain Access is also simple, adult is not key locked, so if they make it to a location, it's Certain + Access. + * Things get complicated when we handle the overlap of the 2 universes, + * though an important detail is that if we have Certain Access as either age, we don't need to checked the overlap + because overlap logic is strictly stricter than either Certain Access. + + * In order to track the first universe, the logic allows technical child access with the minimum number of keys, + and then checks in this function for if we have 7 keys to determine if that is Certain or not. + * This is for technical reasons, as areas with no access at all will simply not be checked. + * Normally we would need to do similar shenanigans to track the second universe, however adult must have go through + statue room to waste keys, + * so can go back there and get new keys for Child to use if they do, and the navigation logic for shared MQ spirit + from Statue Room is very simple for Adult. + * Additionally, we don't need to know if adult can actually reach spirit temple or climb to statue room, because if + the player can't do that, then universe 2 can't happen anyway, + * and if the player does so out of logic, they can do it again, as the only consumable used sets a permanent flag. + + * The Adult Navigation logic is as such: + * - Broken Wall room is 6 key locked, because if the player tries to spend 6 keys in a way that would block adults + access, they would have to give child access instead. + * - The child side hammer switch for the time travelling chest is 7 key locked for adult + * - Reaching gauntlets hand is 7 key locked + * - Going back into big block room is complex, but the only check there is child only so not a concern + * - Everything else is possible with basic adult movement, or is impossible for child to reach glitchlessly + * Anything 7 key locked does not need to be checked as shared, as all child access is Certain and because of this + workaround we don't need to fake Adult access, meaning that is also Certain. + * All of this combined means that when checking if adult can reach a location in universe 2, we only have to ask if + it is a 6 key locked location or not. + + * Knowing all of this this, we can confirm things are logical in 3 different ways: + * - If we have Adult Access, we know it is Certain Access, so they can get checks alone. + * - If we have 7 keys, child has Certain Access as we know they cannot be locked out, so can get checks alone, + otherwise we check the logical overlap + * - If Child and Adult can get the check (ignoring actual adult access to the location), and the location is either + not 6 key locked or we have 6 keys, we can get the check with the overlap + */ + bool MQSpiritShared(ConditionFn condition, bool IsBrokenWall, bool anyAge = false) { + // if we have Certain Access as child, we can check anyAge and if true, resolve a condition with Here as if + // adult is here it's also Certain Access + if (logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)) { + if (anyAge) { + return Here(condition); } - } - - void ReplaceAreas(std::set newAreas) { - areas = newAreas; - } - - //Here checks conditional access based on whether or not both ages have - //access to this area. For example: if there are rocks that block a path - //which both child and adult can access, adult having hammer can give - //both child and adult access to the path. - bool Here(ConditionFn condition) { - //store current age variables + return condition(); + // else, if we are here as adult, we have Certain Access from that and don't need special handling for + // checking adult + } else if (Adult() && logic->IsAdult) { + return condition(); + // if we do not have Certain Access, we need to check the overlap by seeing if we are both here as child and + // meet the adult universe's access condition We only need to do it as child, as only child access matters + // for this check, as adult access is assumed based on keys + } else if (Child() && logic->IsChild && (!IsBrokenWall || logic->SmallKeys(RR_SPIRIT_TEMPLE, 6))) { + bool result = false; + // store current age variables bool pastAdult = logic->IsAdult; bool pastChild = logic->IsChild; - //set age access as this areas ages - logic->IsChild = Child(); - logic->IsAdult = Adult(); + // First check if the check is possible as child + logic->IsChild = true; + logic->IsAdult = false; + result = condition(); + // If so, check again as adult. both have to be true for result to be true + if (result) { + logic->IsChild = false; + logic->IsAdult = true; + result = condition(); + } - //heck condition as well as having at least child or adult access - bool hereVal = condition() && (logic->IsAdult || logic->IsChild); - - //set back age variables + // set back age variables logic->IsChild = pastChild; logic->IsAdult = pastAdult; - - return hereVal; - } - - bool CanPlantBeanCheck() const; - bool AllAccountedFor() const; - - void ResetVariables(); - - void printAgeTimeAccess() const { - auto message = "Child Day: " + std::to_string(childDay) + "\t" - "Child Night: " + std::to_string(childNight) + "\t" - "Adult Day: " + std::to_string(adultDay) + "\t" - "Adult Night: " + std::to_string(adultNight); - } - - /* - * This logic covers checks that exist in the shared areas of MQ spirit from a glitchless standpoint. - * This room has Quantum logic that I am currently handling with this function, however this is NOT suitable for glitch logic as it relies on specific ages - * In this chunk there are 3 possibilities for passing a check, but first I have to talk about parallel universes. - - * In MQ Spirit key logic, we mostly care about 2 possibilities for how the player can spend keys, creating 2 Parralel universes - * In the first universe, the player did not enter spirit as adult until after climbing as child, thus child spends keys linearly, only needing 2 to reach statue room. - * In the second universe, the player went in as adult, possibly out of logic, and started wasting the keys to lock child out. - * These Universes converge when the player has 7 keys (meaning adult can no longer lock child out) and adult is known to be able to reach Statue room. This creates "Certain Access", which is tracked seperatly for each age. - * Child Certain Access is simple, if we have 7 keys and child access, it's Certain Access. - * Adult Certain Access is also simple, adult is not key locked, so if they make it to a location, it's Certain Access. - * Things get complicated when we handle the overlap of the 2 universes, - * though an important detail is that if we have Certain Access as either age, we don't need to checked the overlap because overlap logic is strictly stricter than either Certain Access. - - * In order to track the first universe, the logic allows technical child access with the minimum number of keys, and then checks in this function for if we have 7 keys to determine if that is Certain or not. - * This is for technical reasons, as areas with no access at all will simply not be checked. - * Normally we would need to do similar shenanigans to track the second universe, however adult must have go through statue room to waste keys, - * so can go back there and get new keys for Child to use if they do, and the navigation logic for shared MQ spirit from Statue Room is very simple for Adult. - * Additionally, we don't need to know if adult can actually reach spirit temple or climb to statue room, because if the player can't do that, then universe 2 can't happen anyway, - * and if the player does so out of logic, they can do it again, as the only consumable used sets a permanent flag. - - * The Adult Navigation logic is as such: - * - Broken Wall room is 6 key locked, because if the player tries to spend 6 keys in a way that would block adults access, they would have to give child access instead. - * - The child side hammer switch for the time travelling chest is 7 key locked for adult - * - Reaching gauntlets hand is 7 key locked - * - Going back into big block room is complex, but the only check there is child only so not a concern - * - Everything else is possible with basic adult movement, or is impossible for child to reach glitchlessly - * Anything 7 key locked does not need to be checked as shared, as all child access is Certain and because of this workaround we don't need to fake Adult access, meaning that is also Certain. - * All of this combined means that when checking if adult can reach a location in universe 2, we only have to ask if it is a 6 key locked location or not. - - * Knowing all of this this, we can confirm things are logical in 3 different ways: - * - If we have Adult Access, we know it is Certain Access, so they can get checks alone. - * - If we have 7 keys, child has Certain Access as we know they cannot be locked out, so can get checks alone, otherwise we check the logical overlap - * - If Child and Adult can get the check (ignoring actual adult access to the location), and the location is either not 6 key locked or we have 6 keys, we can get the check with the overlap - */ - bool MQSpiritShared(ConditionFn condition, bool IsBrokenWall, bool anyAge = false) { - //if we have Certain Access as child, we can check anyAge and if true, resolve a condition with Here as if adult is here it's also Certain Access - if (logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)){ - if (anyAge){ - return Here(condition); - } - return condition(); - //else, if we are here as adult, we have Certain Access from that and don't need special handling for checking adult - } else if (Adult() && logic->IsAdult){ - return condition(); - //if we do not have Certain Access, we need to check the overlap by seeing if we are both here as child and meet the adult universe's access condition - //We only need to do it as child, as only child access matters for this check, as adult access is assumed based on keys - } else if (Child() && logic->IsChild && (!IsBrokenWall || logic->SmallKeys(RR_SPIRIT_TEMPLE, 6))) { - bool result = false; - //store current age variables - bool pastAdult = logic->IsAdult; - bool pastChild = logic->IsChild; - - //First check if the check is possible as child - logic->IsChild = true; - logic->IsAdult = false; - result = condition(); - //If so, check again as adult. both have to be true for result to be true - if (result) { - logic->IsChild = false; - logic->IsAdult = true; - result = condition(); - } - - //set back age variables - logic->IsChild = pastChild; - logic->IsAdult = pastAdult; - return result; - } - return false; + return result; } + return false; + } }; extern std::array areaTable; extern std::vector grottoEvents; -bool Here(const RandomizerRegion region, ConditionFn condition); //RANDOTODO make a less stupid way to check own at either age than self referencing with this +bool Here(const RandomizerRegion region, + ConditionFn + condition); // RANDOTODO make a less stupid way to check own at either age than self referencing with this bool MQSpiritSharedStatueRoom(const RandomizerRegion region, ConditionFn condition, bool anyAge = false); bool MQSpiritSharedBrokenWallRoom(const RandomizerRegion region, ConditionFn condition, bool anyAge = false); bool CanPlantBean(const RandomizerRegion region); @@ -311,13 +341,13 @@ bool HasAccessTo(const RandomizerRegion region); #define NO_DAY_NIGHT_CYCLE false namespace Regions { - extern void AccessReset(); - extern void ResetAllLocations(); - extern bool HasTimePassAccess(uint8_t age); - extern void DumpWorldGraph(std::string str); -} //namespace Exits +extern void AccessReset(); +extern void ResetAllLocations(); +extern bool HasTimePassAccess(uint8_t age); +extern void DumpWorldGraph(std::string str); +} // namespace Regions -void RegionTable_Init(); +void RegionTable_Init(); Region* RegionTable(const RandomizerRegion regionKey); std::vector GetShuffleableEntrances(Rando::EntranceType type, bool onlyPrimary = true); Rando::Entrance* GetEntrance(const std::string name); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 2fb191a11..7b671994a 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -8,8 +8,7 @@ std::multimap, RandomizerCheck> Rando::StaticData::Che std::vector Rando::StaticData::dungeonRewardLocations = { // Bosses - RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, - RC_PHANTOM_GANON, RC_VOLVAGIA, RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, + RC_QUEEN_GOHMA, RC_KING_DODONGO, RC_BARINADE, RC_PHANTOM_GANON, RC_VOLVAGIA, RC_MORPHA, RC_TWINROVA, RC_BONGO_BONGO, }; using namespace Rando; @@ -17,7 +16,8 @@ using namespace Rando; std::vector Rando::StaticData::GetPondFishLocations() { std::vector pondFishLocations = {}; for (Location& location : locationTable) { - if (location.GetRCType() == RCTYPE_FISH && location.GetScene() == SCENE_FISHING_POND && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (location.GetRCType() == RCTYPE_FISH && location.GetScene() == SCENE_FISHING_POND && + location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { pondFishLocations.push_back(location.GetRandomizerCheck()); } } @@ -26,7 +26,8 @@ std::vector Rando::StaticData::GetPondFishLocations() { std::vector Rando::StaticData::GetOverworldFishLocations() { std::vector overworldFishLocations = {}; for (Location& location : locationTable) { - if (location.GetRCType() == RCTYPE_FISH && location.GetScene() != SCENE_FISHING_POND && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (location.GetRCType() == RCTYPE_FISH && location.GetScene() != SCENE_FISHING_POND && + location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) { overworldFishLocations.push_back(location.GetRandomizerCheck()); } } diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index a567cd789..4a1ede8e7 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -21,794 +21,857 @@ namespace Rando { - bool Logic::HasItem(RandomizerGet itemName) { - switch (itemName) { - case RG_FAIRY_OCARINA: - return CheckInventory(ITEM_OCARINA_FAIRY, false); - case RG_OCARINA_OF_TIME: - return CheckInventory(ITEM_OCARINA_TIME, true); - case RG_DINS_FIRE: - return CheckInventory(ITEM_DINS_FIRE, true); - case RG_FARORES_WIND: - return CheckInventory(ITEM_FARORES_WIND, true); - case RG_NAYRUS_LOVE: - return CheckInventory(ITEM_NAYRUS_LOVE, true); - case RG_LENS_OF_TRUTH: - return CheckInventory(ITEM_LENS, true); - case RG_FAIRY_BOW: - return CheckInventory(ITEM_BOW, true); - case RG_MEGATON_HAMMER: - return CheckInventory(ITEM_HAMMER, true); - case RG_HOOKSHOT: - return CheckInventory(ITEM_HOOKSHOT, false); - case RG_LONGSHOT: - return CheckInventory(ITEM_LONGSHOT, true); - case RG_PROGRESSIVE_STICK_UPGRADE: - case RG_STICKS: - return CurrentUpgrade(UPG_STICKS); - case RG_FIRE_ARROWS: - return CheckInventory(ITEM_ARROW_FIRE, true); - case RG_ICE_ARROWS: - return CheckInventory(ITEM_ARROW_ICE, true); - case RG_LIGHT_ARROWS: - return CheckInventory(ITEM_ARROW_LIGHT, true); - case RG_PROGRESSIVE_BOMBCHUS: - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - return (BombchusEnabled() && (GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant)) || CheckInventory(ITEM_BOMBCHU, true); - case RG_FAIRY_SLINGSHOT: - return CheckInventory(ITEM_SLINGSHOT, true); - case RG_BOOMERANG: - return CheckInventory(ITEM_BOOMERANG, true); - case RG_PROGRESSIVE_NUT_UPGRADE: - case RG_NUTS: - return CurrentUpgrade(UPG_NUTS); - //RANDOTODO handle cases where the scarecrow is persistent between age better when OI is added - case RG_SCARECROW: - return ScarecrowsSong() && CanUse(RG_HOOKSHOT); - case RG_DISTANT_SCARECROW: - return ScarecrowsSong() && CanUse(RG_LONGSHOT); - case RG_MAGIC_BEAN: - return GetAmmo(ITEM_BEAN) > 0; - case RG_KOKIRI_SWORD: - case RG_DEKU_SHIELD: - case RG_GORON_TUNIC: - case RG_ZORA_TUNIC: - case RG_HYLIAN_SHIELD: - case RG_MIRROR_SHIELD: - case RG_MASTER_SWORD: - case RG_BIGGORON_SWORD: - case RG_IRON_BOOTS: - case RG_HOVER_BOOTS: - return CheckEquipment(RandoGetToEquipFlag.at(itemName)); - case RG_GORONS_BRACELET: - return CurrentUpgrade(UPG_STRENGTH); - case RG_SILVER_GAUNTLETS: - return CurrentUpgrade(UPG_STRENGTH) >= 2; - case RG_GOLDEN_GAUNTLETS: - return CurrentUpgrade(UPG_STRENGTH) >= 3; - case RG_PROGRESSIVE_BOMB_BAG: - case RG_BOMB_BAG: - return CurrentUpgrade(UPG_BOMB_BAG); - case RG_MAGIC_SINGLE: - return GetSaveContext()->magicLevel >= 1 || GetSaveContext()->isMagicAcquired; - // Songs - case RG_ZELDAS_LULLABY: - case RG_EPONAS_SONG: - case RG_SARIAS_SONG: - case RG_SUNS_SONG: - case RG_SONG_OF_TIME: - case RG_SONG_OF_STORMS: - case RG_MINUET_OF_FOREST: - case RG_BOLERO_OF_FIRE: - case RG_SERENADE_OF_WATER: - case RG_REQUIEM_OF_SPIRIT: - case RG_NOCTURNE_OF_SHADOW: - case RG_PRELUDE_OF_LIGHT: - // Dungeon Rewards - case RG_KOKIRI_EMERALD: - case RG_GORON_RUBY: - case RG_ZORA_SAPPHIRE: - case RG_FOREST_MEDALLION: - case RG_FIRE_MEDALLION: - case RG_WATER_MEDALLION: - case RG_SPIRIT_MEDALLION: - case RG_SHADOW_MEDALLION: - case RG_LIGHT_MEDALLION: - // Misc Quest Items - case RG_STONE_OF_AGONY: - case RG_GERUDO_MEMBERSHIP_CARD: - return CheckQuestItem(RandoGetToQuestItem.at(itemName)); - case RG_RUTOS_LETTER: - return CheckEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER); - case RG_DOUBLE_DEFENSE: - return GetSaveContext()->isDoubleDefenseAcquired; - case RG_FISHING_POLE: - case RG_ZELDAS_LETTER: - case RG_WEIRD_EGG: - case RG_GREG_RUPEE: - // Ocarina Buttons - case RG_OCARINA_A_BUTTON: - case RG_OCARINA_C_LEFT_BUTTON: - case RG_OCARINA_C_RIGHT_BUTTON: - case RG_OCARINA_C_DOWN_BUTTON: - case RG_OCARINA_C_UP_BUTTON: - // Boss Souls - case RG_GOHMA_SOUL: - case RG_KING_DODONGO_SOUL: - case RG_BARINADE_SOUL: - case RG_PHANTOM_GANON_SOUL: - case RG_VOLVAGIA_SOUL: - case RG_MORPHA_SOUL: - case RG_BONGO_BONGO_SOUL: - 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: - return FreedEpona; - case RG_FOREST_TEMPLE_BOSS_KEY: - case RG_FIRE_TEMPLE_BOSS_KEY: - case RG_WATER_TEMPLE_BOSS_KEY: - case RG_SPIRIT_TEMPLE_BOSS_KEY: - case RG_SHADOW_TEMPLE_BOSS_KEY: - case RG_GANONS_CASTLE_BOSS_KEY: - return CheckDungeonItem(DUNGEON_KEY_BOSS, RandoGetToDungeonScene.at(itemName)); - // Maps - case RG_DEKU_TREE_MAP: - case RG_DODONGOS_CAVERN_MAP: - case RG_JABU_JABUS_BELLY_MAP: - case RG_FOREST_TEMPLE_MAP: - case RG_FIRE_TEMPLE_MAP: - case RG_WATER_TEMPLE_MAP: - case RG_SPIRIT_TEMPLE_MAP: - case RG_SHADOW_TEMPLE_MAP: - case RG_BOTTOM_OF_THE_WELL_MAP: - case RG_ICE_CAVERN_MAP: - return CheckDungeonItem(DUNGEON_MAP, RandoGetToDungeonScene.at(itemName)); - // Compasses - case RG_DEKU_TREE_COMPASS: - case RG_DODONGOS_CAVERN_COMPASS: - case RG_JABU_JABUS_BELLY_COMPASS: - case RG_FOREST_TEMPLE_COMPASS: - case RG_FIRE_TEMPLE_COMPASS: - case RG_WATER_TEMPLE_COMPASS: - case RG_SPIRIT_TEMPLE_COMPASS: - case RG_SHADOW_TEMPLE_COMPASS: - case RG_BOTTOM_OF_THE_WELL_COMPASS: - case RG_ICE_CAVERN_COMPASS: - return CheckDungeonItem(DUNGEON_COMPASS, RandoGetToDungeonScene.at(itemName)); - // Wallets - case RG_CHILD_WALLET: - return CheckRandoInf(RAND_INF_HAS_WALLET); - case RG_ADULT_WALLET: - return CurrentUpgrade(UPG_WALLET) >= 1; - case RG_GIANT_WALLET: - return CurrentUpgrade(UPG_WALLET) >= 2; - case RG_TYCOON_WALLET: - return CurrentUpgrade(UPG_WALLET) >= 3; - // Scales - case RG_BRONZE_SCALE: - return CheckRandoInf(RAND_INF_CAN_SWIM); - case RG_SILVER_SCALE: - return CurrentUpgrade(UPG_SCALE) >= 1; - case RG_GOLDEN_SCALE: - return CurrentUpgrade(UPG_SCALE) >= 2; - case RG_POCKET_EGG: - return CheckRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); - case RG_COJIRO: - case RG_ODD_MUSHROOM: - case RG_ODD_POTION: - case RG_POACHERS_SAW: - case RG_BROKEN_SWORD: - case RG_PRESCRIPTION: - case RG_EYEBALL_FROG: - case RG_EYEDROPS: - case RG_CLAIM_CHECK: - return CheckRandoInf(itemName - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO); - case RG_BOTTLE_WITH_BIG_POE: - case RG_BOTTLE_WITH_BLUE_FIRE: - case RG_BOTTLE_WITH_BLUE_POTION: - case RG_BOTTLE_WITH_BUGS: - case RG_BOTTLE_WITH_FAIRY: - case RG_BOTTLE_WITH_FISH: - case RG_BOTTLE_WITH_GREEN_POTION: - case RG_BOTTLE_WITH_MILK: - case RG_BOTTLE_WITH_POE: - case RG_BOTTLE_WITH_RED_POTION: - case RG_EMPTY_BOTTLE: - return HasBottle(); - default: - break; - } - SPDLOG_ERROR("HasItem reached `return false;`. Missing case for RandomizerGet of {}", static_cast(itemName)); - assert(false); - return false; - } - - //Can the passed in item be used? - //RANDOTODO catch magic items explicitly and add an assert on miss. - bool Logic::CanUse(RandomizerGet itemName) { - if (!HasItem(itemName)) - return false; - - switch (itemName) { - // Magic items - case RG_MAGIC_SINGLE: - return AmmoCanDrop || (HasBottle() && GetInLogic(LOGIC_BUY_MAGIC_POTION)); - case RG_DINS_FIRE: - case RG_FARORES_WIND: - case RG_NAYRUS_LOVE: - case RG_LENS_OF_TRUTH: - return CanUse(RG_MAGIC_SINGLE); - case RG_FIRE_ARROWS: - case RG_ICE_ARROWS: - case RG_LIGHT_ARROWS: - return CanUse(RG_MAGIC_SINGLE) && CanUse(RG_FAIRY_BOW); - - // Adult items - // TODO: Uncomment those if we ever implement more item usability settings - case RG_FAIRY_BOW: - return IsAdult && (AmmoCanDrop || GetInLogic(LOGIC_BUY_ARROW));// || BowAsChild; - case RG_MEGATON_HAMMER: - return IsAdult;// || HammerAsChild; - case RG_IRON_BOOTS: - return IsAdult;// || IronBootsAsChild; - case RG_HOVER_BOOTS: - return IsAdult;// || HoverBootsAsChild; - case RG_HOOKSHOT: - case RG_LONGSHOT: - case RG_SCARECROW: - case RG_DISTANT_SCARECROW: - return IsAdult;// || HookshotAsChild; - case RG_GORON_TUNIC: - return IsAdult;// || GoronTunicAsChild; - case RG_ZORA_TUNIC: - return IsAdult;// || ZoraTunicAsChild; - case RG_MIRROR_SHIELD: - return IsAdult;// || MirrorShieldAsChild; - case RG_MASTER_SWORD: - return IsAdult;// || MasterSwordAsChild; - case RG_BIGGORON_SWORD: - return IsAdult;// || BiggoronSwordAsChild; - case RG_SILVER_GAUNTLETS: - case RG_GOLDEN_GAUNTLETS: - // Adult Trade - case RG_POCKET_EGG: - case RG_COJIRO: - case RG_ODD_MUSHROOM: - case RG_ODD_POTION: - case RG_POACHERS_SAW: - case RG_BROKEN_SWORD: - case RG_PRESCRIPTION: - case RG_EYEBALL_FROG: - case RG_EYEDROPS: - case RG_CLAIM_CHECK: - return IsAdult; - - // Child items - case RG_FAIRY_SLINGSHOT: - return IsChild && (AmmoCanDrop || GetInLogic(LOGIC_BUY_SEED));// || SlingshotAsAdult; - case RG_BOOMERANG: - return IsChild;// || BoomerangAsAdult; - case RG_KOKIRI_SWORD: - return IsChild;// || KokiriSwordAsAdult; - case RG_NUTS: - return (NutPot || NutCrate || DekuBabaNuts) && AmmoCanDrop; //RANDOTODO BuyNuts currently mixed in with Nuts, should be seperate as BuyNuts are also a Nuts source - case RG_STICKS: - return IsChild /* || StickAsAdult;*/&& (StickPot || DekuBabaSticks); - case RG_DEKU_SHIELD: - return IsChild;// || DekuShieldAsAdult; - case RG_PROGRESSIVE_BOMB_BAG: - case RG_BOMB_BAG: - return AmmoCanDrop || GetInLogic(LOGIC_BUY_BOMB); - case RG_PROGRESSIVE_BOMBCHUS: - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - return BombchuRefill() && BombchusEnabled(); - case RG_WEIRD_EGG: - case RG_RUTOS_LETTER: - return IsChild; - case RG_MAGIC_BEAN: - return IsChild; - +bool Logic::HasItem(RandomizerGet itemName) { + switch (itemName) { + case RG_FAIRY_OCARINA: + return CheckInventory(ITEM_OCARINA_FAIRY, false); + case RG_OCARINA_OF_TIME: + return CheckInventory(ITEM_OCARINA_TIME, true); + case RG_DINS_FIRE: + return CheckInventory(ITEM_DINS_FIRE, true); + case RG_FARORES_WIND: + return CheckInventory(ITEM_FARORES_WIND, true); + case RG_NAYRUS_LOVE: + return CheckInventory(ITEM_NAYRUS_LOVE, true); + case RG_LENS_OF_TRUTH: + return CheckInventory(ITEM_LENS, true); + case RG_FAIRY_BOW: + return CheckInventory(ITEM_BOW, true); + case RG_MEGATON_HAMMER: + return CheckInventory(ITEM_HAMMER, true); + case RG_HOOKSHOT: + return CheckInventory(ITEM_HOOKSHOT, false); + case RG_LONGSHOT: + return CheckInventory(ITEM_LONGSHOT, true); + case RG_PROGRESSIVE_STICK_UPGRADE: + case RG_STICKS: + return CurrentUpgrade(UPG_STICKS); + case RG_FIRE_ARROWS: + return CheckInventory(ITEM_ARROW_FIRE, true); + case RG_ICE_ARROWS: + return CheckInventory(ITEM_ARROW_ICE, true); + case RG_LIGHT_ARROWS: + return CheckInventory(ITEM_ARROW_LIGHT, true); + case RG_PROGRESSIVE_BOMBCHUS: + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + return (BombchusEnabled() && (GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant)) || + CheckInventory(ITEM_BOMBCHU, true); + case RG_FAIRY_SLINGSHOT: + return CheckInventory(ITEM_SLINGSHOT, true); + case RG_BOOMERANG: + return CheckInventory(ITEM_BOOMERANG, true); + case RG_PROGRESSIVE_NUT_UPGRADE: + case RG_NUTS: + return CurrentUpgrade(UPG_NUTS); + // RANDOTODO handle cases where the scarecrow is persistent between age better when OI is added + case RG_SCARECROW: + return ScarecrowsSong() && CanUse(RG_HOOKSHOT); + case RG_DISTANT_SCARECROW: + return ScarecrowsSong() && CanUse(RG_LONGSHOT); + case RG_MAGIC_BEAN: + return GetAmmo(ITEM_BEAN) > 0; + case RG_KOKIRI_SWORD: + case RG_DEKU_SHIELD: + case RG_GORON_TUNIC: + case RG_ZORA_TUNIC: + case RG_HYLIAN_SHIELD: + case RG_MIRROR_SHIELD: + case RG_MASTER_SWORD: + case RG_BIGGORON_SWORD: + case RG_IRON_BOOTS: + case RG_HOVER_BOOTS: + return CheckEquipment(RandoGetToEquipFlag.at(itemName)); + case RG_GORONS_BRACELET: + return CurrentUpgrade(UPG_STRENGTH); + case RG_SILVER_GAUNTLETS: + return CurrentUpgrade(UPG_STRENGTH) >= 2; + case RG_GOLDEN_GAUNTLETS: + return CurrentUpgrade(UPG_STRENGTH) >= 3; + case RG_PROGRESSIVE_BOMB_BAG: + case RG_BOMB_BAG: + return CurrentUpgrade(UPG_BOMB_BAG); + case RG_MAGIC_SINGLE: + return GetSaveContext()->magicLevel >= 1 || GetSaveContext()->isMagicAcquired; // Songs - case RG_ZELDAS_LULLABY: - case RG_EPONAS_SONG: - case RG_PRELUDE_OF_LIGHT: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); - case RG_SARIAS_SONG: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_SUNS_SONG: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_SONG_OF_TIME: - case RG_BOLERO_OF_FIRE: - case RG_REQUIEM_OF_SPIRIT: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_SONG_OF_STORMS: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - case RG_MINUET_OF_FOREST: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); - case RG_SERENADE_OF_WATER: - case RG_NOCTURNE_OF_SHADOW: - return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); - - // Misc. Items - case RG_FISHING_POLE: - return HasItem(RG_CHILD_WALLET); // as long as you have enough rubies - case RG_EPONA: - return IsAdult && CanUse(RG_EPONAS_SONG); - - // Bottle Items - case RG_BOTTLE_WITH_BUGS: - return BugShrub || WanderingBugs || BugRock || GetInLogic(LOGIC_BUGS_ACCESS); - case RG_BOTTLE_WITH_FISH: - return LoneFish || FishGroup || GetInLogic(LOGIC_FISH_ACCESS); //is there any need to care about lone vs group? - case RG_BOTTLE_WITH_BLUE_FIRE: //RANDOTODO should probably be better named - return BlueFireAccess || GetInLogic(LOGIC_BLUE_FIRE_ACCESS); - case RG_BOTTLE_WITH_FAIRY: - return FairyPot || GossipStoneFairy || BeanPlantFairy || ButterflyFairy || FreeFairies || FairyPond || GetInLogic(LOGIC_FAIRY_ACCESS); - - default: - SPDLOG_ERROR("CanUse reached `default` for {}. Assuming intention is no extra requirements for use so returning true, but HasItem should be used instead.", static_cast(itemName)); - assert(false); - return true; - } + case RG_ZELDAS_LULLABY: + case RG_EPONAS_SONG: + case RG_SARIAS_SONG: + case RG_SUNS_SONG: + case RG_SONG_OF_TIME: + case RG_SONG_OF_STORMS: + case RG_MINUET_OF_FOREST: + case RG_BOLERO_OF_FIRE: + case RG_SERENADE_OF_WATER: + case RG_REQUIEM_OF_SPIRIT: + case RG_NOCTURNE_OF_SHADOW: + case RG_PRELUDE_OF_LIGHT: + // Dungeon Rewards + case RG_KOKIRI_EMERALD: + case RG_GORON_RUBY: + case RG_ZORA_SAPPHIRE: + case RG_FOREST_MEDALLION: + case RG_FIRE_MEDALLION: + case RG_WATER_MEDALLION: + case RG_SPIRIT_MEDALLION: + case RG_SHADOW_MEDALLION: + case RG_LIGHT_MEDALLION: + // Misc Quest Items + case RG_STONE_OF_AGONY: + case RG_GERUDO_MEMBERSHIP_CARD: + return CheckQuestItem(RandoGetToQuestItem.at(itemName)); + case RG_RUTOS_LETTER: + return CheckEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER); + case RG_DOUBLE_DEFENSE: + return GetSaveContext()->isDoubleDefenseAcquired; + case RG_FISHING_POLE: + case RG_ZELDAS_LETTER: + case RG_WEIRD_EGG: + case RG_GREG_RUPEE: + // Ocarina Buttons + case RG_OCARINA_A_BUTTON: + case RG_OCARINA_C_LEFT_BUTTON: + case RG_OCARINA_C_RIGHT_BUTTON: + case RG_OCARINA_C_DOWN_BUTTON: + case RG_OCARINA_C_UP_BUTTON: + // Boss Souls + case RG_GOHMA_SOUL: + case RG_KING_DODONGO_SOUL: + case RG_BARINADE_SOUL: + case RG_PHANTOM_GANON_SOUL: + case RG_VOLVAGIA_SOUL: + case RG_MORPHA_SOUL: + case RG_BONGO_BONGO_SOUL: + 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: + return FreedEpona; + case RG_FOREST_TEMPLE_BOSS_KEY: + case RG_FIRE_TEMPLE_BOSS_KEY: + case RG_WATER_TEMPLE_BOSS_KEY: + case RG_SPIRIT_TEMPLE_BOSS_KEY: + case RG_SHADOW_TEMPLE_BOSS_KEY: + case RG_GANONS_CASTLE_BOSS_KEY: + return CheckDungeonItem(DUNGEON_KEY_BOSS, RandoGetToDungeonScene.at(itemName)); + // Maps + case RG_DEKU_TREE_MAP: + case RG_DODONGOS_CAVERN_MAP: + case RG_JABU_JABUS_BELLY_MAP: + case RG_FOREST_TEMPLE_MAP: + case RG_FIRE_TEMPLE_MAP: + case RG_WATER_TEMPLE_MAP: + case RG_SPIRIT_TEMPLE_MAP: + case RG_SHADOW_TEMPLE_MAP: + case RG_BOTTOM_OF_THE_WELL_MAP: + case RG_ICE_CAVERN_MAP: + return CheckDungeonItem(DUNGEON_MAP, RandoGetToDungeonScene.at(itemName)); + // Compasses + case RG_DEKU_TREE_COMPASS: + case RG_DODONGOS_CAVERN_COMPASS: + case RG_JABU_JABUS_BELLY_COMPASS: + case RG_FOREST_TEMPLE_COMPASS: + case RG_FIRE_TEMPLE_COMPASS: + case RG_WATER_TEMPLE_COMPASS: + case RG_SPIRIT_TEMPLE_COMPASS: + case RG_SHADOW_TEMPLE_COMPASS: + case RG_BOTTOM_OF_THE_WELL_COMPASS: + case RG_ICE_CAVERN_COMPASS: + return CheckDungeonItem(DUNGEON_COMPASS, RandoGetToDungeonScene.at(itemName)); + // Wallets + case RG_CHILD_WALLET: + return CheckRandoInf(RAND_INF_HAS_WALLET); + case RG_ADULT_WALLET: + return CurrentUpgrade(UPG_WALLET) >= 1; + case RG_GIANT_WALLET: + return CurrentUpgrade(UPG_WALLET) >= 2; + case RG_TYCOON_WALLET: + return CurrentUpgrade(UPG_WALLET) >= 3; + // Scales + case RG_BRONZE_SCALE: + return CheckRandoInf(RAND_INF_CAN_SWIM); + case RG_SILVER_SCALE: + return CurrentUpgrade(UPG_SCALE) >= 1; + case RG_GOLDEN_SCALE: + return CurrentUpgrade(UPG_SCALE) >= 2; + case RG_POCKET_EGG: + return CheckRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG); + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + return CheckRandoInf(itemName - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO); + case RG_BOTTLE_WITH_BIG_POE: + case RG_BOTTLE_WITH_BLUE_FIRE: + case RG_BOTTLE_WITH_BLUE_POTION: + case RG_BOTTLE_WITH_BUGS: + case RG_BOTTLE_WITH_FAIRY: + case RG_BOTTLE_WITH_FISH: + case RG_BOTTLE_WITH_GREEN_POTION: + case RG_BOTTLE_WITH_MILK: + case RG_BOTTLE_WITH_POE: + case RG_BOTTLE_WITH_RED_POTION: + case RG_EMPTY_BOTTLE: + return HasBottle(); + default: + break; } + SPDLOG_ERROR("HasItem reached `return false;`. Missing case for RandomizerGet of {}", + static_cast(itemName)); + assert(false); + return false; +} - bool Logic::HasProjectile(HasProjectileAge age) { - return HasExplosives() || - (age == HasProjectileAge::Child && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))) || - (age == HasProjectileAge::Adult && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) )) || - (age == HasProjectileAge::Both && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG)) && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || - (age == HasProjectileAge::Either && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))); - } - - bool Logic::HasBossSoul(RandomizerGet itemName) { - if (!ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { - return true; - } - switch(itemName) { - case RG_GOHMA_SOUL: - case RG_KING_DODONGO_SOUL: - case RG_BARINADE_SOUL: - case RG_PHANTOM_GANON_SOUL: - case RG_VOLVAGIA_SOUL: - case RG_MORPHA_SOUL: - case RG_BONGO_BONGO_SOUL: - case RG_TWINROVA_SOUL: - return HasItem(itemName); - case RG_GANON_SOUL: - return ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON) ? HasItem(RG_GANON_SOUL) : true; - default: - return false; - } - } - - //RANDOMISERTODO intergrate into HasItem - 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; - } - - //todo rewrite glitch section - - bool Logic::CanEquipSwap(RandomizerGet itemName) { - if (!HasItem(itemName)) - return false; - - if (CanDoGlitch(GlitchType::EquipSwapDins) || CanDoGlitch(GlitchType::EquipSwap)) - return true; - +// Can the passed in item be used? +// RANDOTODO catch magic items explicitly and add an assert on miss. +bool Logic::CanUse(RandomizerGet itemName) { + if (!HasItem(itemName)) return false; - } - bool Logic::CanDoGlitch(GlitchType glitch) { - // TODO: Uncomment when glitches are implemented - switch(glitch) { - case GlitchType::EquipSwapDins: - return ((IsAdult && HasItem(RG_DINS_FIRE)) || (IsChild && (HasItem(RG_STICKS) || HasItem(RG_DINS_FIRE)))) && false; //GlitchEquipSwapDins; - case GlitchType::EquipSwap: // todo: add bunny hood to adult item equippable list and child trade item to child item equippable list - return ((IsAdult && (HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE))) || (IsChild && (HasItem(RG_STICKS) || - HasItem(RG_FAIRY_SLINGSHOT) || HasItem(RG_BOOMERANG) || HasBottle() || CanUse(RG_NUTS) || HasItem(RG_FAIRY_OCARINA) || HasItem(RG_LENS_OF_TRUTH) || HasExplosives() || - GetAmmo(ITEM_BEAN) > 0 || HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE)))) && false; //GlitchEquipSwap; - } + switch (itemName) { + // Magic items + case RG_MAGIC_SINGLE: + return AmmoCanDrop || (HasBottle() && GetInLogic(LOGIC_BUY_MAGIC_POTION)); + case RG_DINS_FIRE: + case RG_FARORES_WIND: + case RG_NAYRUS_LOVE: + case RG_LENS_OF_TRUTH: + return CanUse(RG_MAGIC_SINGLE); + case RG_FIRE_ARROWS: + case RG_ICE_ARROWS: + case RG_LIGHT_ARROWS: + return CanUse(RG_MAGIC_SINGLE) && CanUse(RG_FAIRY_BOW); - //Shouldn't be reached - return false; - } + // Adult items + // TODO: Uncomment those if we ever implement more item usability settings + case RG_FAIRY_BOW: + return IsAdult && (AmmoCanDrop || GetInLogic(LOGIC_BUY_ARROW)); // || BowAsChild; + case RG_MEGATON_HAMMER: + return IsAdult; // || HammerAsChild; + case RG_IRON_BOOTS: + return IsAdult; // || IronBootsAsChild; + case RG_HOVER_BOOTS: + return IsAdult; // || HoverBootsAsChild; + case RG_HOOKSHOT: + case RG_LONGSHOT: + case RG_SCARECROW: + case RG_DISTANT_SCARECROW: + return IsAdult; // || HookshotAsChild; + case RG_GORON_TUNIC: + return IsAdult; // || GoronTunicAsChild; + case RG_ZORA_TUNIC: + return IsAdult; // || ZoraTunicAsChild; + case RG_MIRROR_SHIELD: + return IsAdult; // || MirrorShieldAsChild; + case RG_MASTER_SWORD: + return IsAdult; // || MasterSwordAsChild; + case RG_BIGGORON_SWORD: + return IsAdult; // || BiggoronSwordAsChild; + case RG_SILVER_GAUNTLETS: + case RG_GOLDEN_GAUNTLETS: + // Adult Trade + case RG_POCKET_EGG: + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + return IsAdult; -//RANDOTODO quantity is a placeholder for proper ammo use calculation logic. in time will want updating to account for ammo capacity -//Can we kill this enemy - bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor, uint8_t quantity, bool timer, bool inWater) { - bool killed = false; - switch(enemy) { - case RE_GOLD_SKULLTULA: - switch (distance){ - case ED_CLOSE: - //hammer jumpslash cannot damage these, but hammer swing can - killed = CanUse(RG_MEGATON_HAMMER); - [[fallthrough]]; - case ED_SHORT_JUMPSLASH: - killed = killed || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - killed = killed || CanUse(RG_BOMB_BAG); - [[fallthrough]]; - case ED_BOOMERANG: - killed = killed || CanUse(RG_BOOMERANG) || CanUse(RG_DINS_FIRE); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_GOHMA_LARVA: - case RE_MAD_SCRUB: - case RE_DEKU_BABA: - return CanAttack(); - case RE_BIG_SKULLTULA: - switch (distance){ - case ED_CLOSE: - //hammer jumpslash cannot damage these, but hammer swing can - killed = CanUse(RG_MEGATON_HAMMER); - [[fallthrough]]; - case ED_SHORT_JUMPSLASH: - killed = killed || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - killed = killed || CanUse(RG_BOMB_BAG); - [[fallthrough]]; - case ED_BOOMERANG: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_DINS_FIRE); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_DODONGO: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - case RE_LIZALFOS: - return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - case RE_KEESE: - case RE_FIRE_KEESE: - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - //RANDOTODO test dins and chu range in a practical example - killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - //RANDOTODO test dins and chu range in a practical example - killed = killed || CanUse(RG_BOOMERANG); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test dins, bomb and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_BLUE_BUBBLE: - //RANDOTODO Trick to use shield hylian shield as child to stun these guys - //RANDOTODO check hammer damage - return BlastOrSmash() || CanUse(RG_FAIRY_BOW) || ((CanJumpslashExceptHammer() || CanUse(RG_FAIRY_SLINGSHOT)) && (CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield())); - case RE_DEAD_HAND: - //RANDOTODO change Dead Hand trick to be sticks Dead Hand - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND)); - case RE_WITHERED_DEKU_BABA: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG); - case RE_LIKE_LIKE: - case RE_FLOORMASTER: - return CanDamage(); - case RE_STALFOS: - //RANDOTODO Add trick to kill stalfos with sticks, and a second one for bombs without stunning. Higher ammo logic for bombs is also plausible - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || (quantity <= 1 && CanUse(RG_STICKS)); - [[fallthrough]]; - case ED_BOMB_THROW: - killed = killed || (quantity <= 2 && !timer && !inWater && (CanUse(RG_NUTS) || HookshotOrBoomerang()) && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - case ED_HOOKSHOT: - //RANDOTODO test dins and chu range in a practical example - killed = killed || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - //Needs 16 bombs, but is in default logic in N64, probably because getting the hits is quite easy. - //bow and sling can wake them and damage after they shed their armour, so could reduce ammo requirements for explosives to 10. - //requires 8 sticks to kill so would be a trick unless we apply higher stick bag logic - case RE_IRON_KNUCKLE: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || HasExplosives(); - //To stun flare dancer with chus, you have to hit the flame under it while it is spinning. It should eventually return to spinning after dashing for a while if you miss the window - //it is possible to damage the core with explosives, but difficult to get all 4 hits in even with chus, and if it reconstructs the core heals, so it would be a trick. - //the core takes damage from hookshot even if it doesn't show - //Dins killing isn't hard, but is obscure and tight on single magic, so is a trick - case RE_FLARE_DANCER: - return CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT) || (HasExplosives() && (CanJumpslashExceptHammer() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))); - case RE_WOLFOS: - case RE_WHITE_WOLFOS: - case RE_WALLMASTER: - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5) || CanUse(RG_DINS_FIRE) || (CanUse(RG_BOMB_BAG) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG))); - case RE_GERUDO_WARRIOR: - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || (ctx->GetTrickOption(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON) && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5))); - case RE_GIBDO: - case RE_REDEAD: - return CanJumpslash() || CanUse(RG_DINS_FIRE); - case RE_MEG: - return CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || HasExplosives(); - case RE_ARMOS: - return BlastOrSmash() || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS) || CanUse(RG_FAIRY_BOW) || ((CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG)) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_FAIRY_SLINGSHOT))); - case RE_GREEN_BUBBLE: - //does not technically need to be stunned to kill with dins, but the flame must be off and timing it is awkward - //Also they don't trigger the kill room in ganons MQ if they die from dins? Vanilla bug? - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || HasExplosives()/* || (CanUse(RG_DINS_FIRE) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG)))*/; - case RE_DINOLFOS: - //stunning + bombs is possible but painful, as it loves to dodge the bombs and hookshot. it also dodges chus but if you cook it so it detonates under the dodge it usually gets caught on landing - return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || (!timer && CanUse(RG_BOMBCHU_5)); - case RE_TORCH_SLUG: - return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_BOW); - case RE_FREEZARD: - return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); - case RE_SHELL_BLADE: - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); - case RE_SPIKE: - return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); - case RE_STINGER: - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - killed = killed || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - //RANDOTODO test dins and chu range in a practical example - killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - case ED_HOOKSHOT: - //RANDOTODO test dins, bomb and chu range in a practical example - killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - [[fallthrough]]; - case ED_LONGSHOT: - killed = killed || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return killed; - case RE_BIG_OCTO: - //If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room without shenanigans anyway. Bunny makes it free - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS) || CanUse(RG_MASTER_SWORD); - case RE_GOHMA: - return HasBossSoul(RG_GOHMA_SOUL) && CanJumpslash() && - (CanUse(RG_NUTS) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang()); - case RE_KING_DODONGO: - return HasBossSoul(RG_KING_DODONGO_SOUL) && CanJumpslash() && - (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET)); - case RE_BARINADE: - return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); - case RE_PHANTOM_GANON: - return HasBossSoul(RG_PHANTOM_GANON_SOUL) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && - (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT)); - case RE_VOLVAGIA: - return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); - case RE_MORPHA: - return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER)); - case RE_BONGO_BONGO: - return HasBossSoul(RG_BONGO_BONGO_SOUL) && - (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && - (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || ctx->GetTrickOption(RT_SHADOW_BONGO)); - case RE_TWINROVA: - return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) && - (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER)); - case RE_GANONDORF: - // RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the energy ball - // and either of them regardless of jumpslashing to damage and kill ganondorf + // Child items + case RG_FAIRY_SLINGSHOT: + return IsChild && (AmmoCanDrop || GetInLogic(LOGIC_BUY_SEED)); // || SlingshotAsAdult; + case RG_BOOMERANG: + return IsChild; // || BoomerangAsAdult; + case RG_KOKIRI_SWORD: + return IsChild; // || KokiriSwordAsAdult; + case RG_NUTS: + return (NutPot || NutCrate || DekuBabaNuts) && + AmmoCanDrop; // RANDOTODO BuyNuts currently mixed in with Nuts, should be seperate as BuyNuts are + // also a Nuts source + case RG_STICKS: + return IsChild /* || StickAsAdult;*/ && (StickPot || DekuBabaSticks); + case RG_DEKU_SHIELD: + return IsChild; // || DekuShieldAsAdult; + case RG_PROGRESSIVE_BOMB_BAG: + case RG_BOMB_BAG: + return AmmoCanDrop || GetInLogic(LOGIC_BUY_BOMB); + case RG_PROGRESSIVE_BOMBCHUS: + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + return BombchuRefill() && BombchusEnabled(); + case RG_WEIRD_EGG: + case RG_RUTOS_LETTER: + return IsChild; + case RG_MAGIC_BEAN: + return IsChild; - // Bottle is not taken into account since a sword, hammer or stick are required - // for killing ganondorf and all of those can reflect the energy ball - // This will not be the case once ammo logic in taken into account as - // sticks are limited and using a bottle might become a requirement in that case - return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)); - case RE_GANON: - return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD); - case RE_DARK_LINK: - //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 their attack - return HasFireSource(); - case RE_BEAMOS: - return HasExplosives(); - case RE_PURPLE_LEEVER: - //dies on it's own, so this is the conditions to spawn it (killing 10 normal leevers) - //Sticks and Ice arrows work but will need ammo capacity logic - //other methods can damage them but not kill them, and they run when hit, making them impractical - return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); - case RE_TENTACLE: - return CanUse(RG_BOOMERANG); - case RE_BARI: - return HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || (TakeDamage() && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))); - case RE_SHABOM: - //RANDOTODO when you add better damage logic, you can kill this by taking hits - return CanUse(RG_BOOMERANG) || CanUse(RG_NUTS) || CanJumpslash() || CanUse(RG_DINS_FIRE) || CanUse(RG_ICE_ARROWS); - case RE_OCTOROK: - return CanReflectNuts() || HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMB_BAG) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); - default: - SPDLOG_ERROR("CanKillEnemy reached `default`."); - assert(false); - return false; - } - } + // Songs + case RG_ZELDAS_LULLABY: + case RG_EPONAS_SONG: + case RG_PRELUDE_OF_LIGHT: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); + case RG_SARIAS_SONG: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_SUNS_SONG: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && + HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_SONG_OF_TIME: + case RG_BOLERO_OF_FIRE: + case RG_REQUIEM_OF_SPIRIT: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && + HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_SONG_OF_STORMS: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON) && + HasItem(RG_OCARINA_C_DOWN_BUTTON); + case RG_MINUET_OF_FOREST: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); + case RG_SERENADE_OF_WATER: + case RG_NOCTURNE_OF_SHADOW: + return HasItem(RG_FAIRY_OCARINA) && HasItem(RG_OCARINA_A_BUTTON) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && + HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_DOWN_BUTTON); -//It is rare for Pass Enemy to need distance, this only happens when the enemy blocks a platform and you can't reach it before it blocks you -//an example is the Big Skulltula in water room of MQ deku, which is out of sword swing height but blocks off the whole SoT block -//Can we get past this enemy in a tight space? - bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor) { - if (CanKillEnemy(enemy, distance, wallOrFloor)){ + // Misc. Items + case RG_FISHING_POLE: + return HasItem(RG_CHILD_WALLET); // as long as you have enough rubies + case RG_EPONA: + return IsAdult && CanUse(RG_EPONAS_SONG); + + // Bottle Items + case RG_BOTTLE_WITH_BUGS: + return BugShrub || WanderingBugs || BugRock || GetInLogic(LOGIC_BUGS_ACCESS); + case RG_BOTTLE_WITH_FISH: + return LoneFish || FishGroup || + GetInLogic(LOGIC_FISH_ACCESS); // is there any need to care about lone vs group? + case RG_BOTTLE_WITH_BLUE_FIRE: // RANDOTODO should probably be better named + return BlueFireAccess || GetInLogic(LOGIC_BLUE_FIRE_ACCESS); + case RG_BOTTLE_WITH_FAIRY: + return FairyPot || GossipStoneFairy || BeanPlantFairy || ButterflyFairy || FreeFairies || FairyPond || + GetInLogic(LOGIC_FAIRY_ACCESS); + + default: + SPDLOG_ERROR("CanUse reached `default` for {}. Assuming intention is no extra requirements for use so " + "returning true, but HasItem should be used instead.", + static_cast(itemName)); + assert(false); return true; - } - switch(enemy) { - case RE_GOLD_SKULLTULA: - case RE_GOHMA_LARVA: - case RE_LIZALFOS: - case RE_DODONGO: //RANDOTODO do dodongos block the way in tight corridors? - case RE_MAD_SCRUB: - case RE_KEESE: - case RE_FIRE_KEESE: - case RE_BLUE_BUBBLE: - case RE_DEAD_HAND: - case RE_DEKU_BABA: - case RE_WITHERED_DEKU_BABA: - case RE_STALFOS: - case RE_FLARE_DANCER: - case RE_WOLFOS: - case RE_WHITE_WOLFOS: - case RE_FLOORMASTER: - case RE_MEG: - case RE_ARMOS: - case RE_FREEZARD: - case RE_SPIKE: - case RE_DARK_LINK: - case RE_ANUBIS: - case RE_WALLMASTER: - case RE_PURPLE_LEEVER: - case RE_OCTOROK: - return true; - case RE_BIG_SKULLTULA: - //hammer jumpslash can pass, but only on flat land where you can kill with hammer swing - return CanUse(RG_NUTS) || CanUse(RG_BOOMERANG); - case RE_LIKE_LIKE: - return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); - case RE_GIBDO: - case RE_REDEAD: - // we need a way to check if suns won't force a reload - return CanUse(RG_HOOKSHOT) || CanUse(RG_SUNS_SONG); - case RE_IRON_KNUCKLE: - case RE_BIG_OCTO: - return false; - case RE_GREEN_BUBBLE: - return TakeDamage() || CanUse(RG_NUTS) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); - default: - SPDLOG_ERROR("CanPassEnemy reached `default`."); - assert(false); - return false; - } } +} -//Can we avoid this enemy while climbing up a wall, or doing a difficult platforming challenge? -//use grounded if the challenge is such that the enemy interfears even if it cannot hit link out of the air - bool Logic::CanAvoidEnemy(RandomizerEnemy enemy, bool grounded, uint8_t quantity) { - //DISTANCE AND WALL ASSUMED, add more arguments later if needed - if (CanKillEnemy(enemy, ED_CLOSE, true, quantity)){ +bool Logic::HasProjectile(HasProjectileAge age) { + return HasExplosives() || + (age == HasProjectileAge::Child && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))) || + (age == HasProjectileAge::Adult && (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || + (age == HasProjectileAge::Both && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))) || + (age == HasProjectileAge::Either && + (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW))); +} + +bool Logic::HasBossSoul(RandomizerGet itemName) { + if (!ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) { return true; - } - switch(enemy) { - case RE_GOLD_SKULLTULA: + } + switch (itemName) { + case RG_GOHMA_SOUL: + case RG_KING_DODONGO_SOUL: + case RG_BARINADE_SOUL: + case RG_PHANTOM_GANON_SOUL: + case RG_VOLVAGIA_SOUL: + case RG_MORPHA_SOUL: + case RG_BONGO_BONGO_SOUL: + case RG_TWINROVA_SOUL: + return HasItem(itemName); + case RG_GANON_SOUL: + return ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON) ? HasItem(RG_GANON_SOUL) + : true; + default: + return false; + } +} + +// RANDOMISERTODO intergrate into HasItem +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; +} + +// todo rewrite glitch section + +bool Logic::CanEquipSwap(RandomizerGet itemName) { + if (!HasItem(itemName)) + return false; + + if (CanDoGlitch(GlitchType::EquipSwapDins) || CanDoGlitch(GlitchType::EquipSwap)) + return true; + + return false; +} + +bool Logic::CanDoGlitch(GlitchType glitch) { + // TODO: Uncomment when glitches are implemented + switch (glitch) { + case GlitchType::EquipSwapDins: + return ((IsAdult && HasItem(RG_DINS_FIRE)) || (IsChild && (HasItem(RG_STICKS) || HasItem(RG_DINS_FIRE)))) && + false; // GlitchEquipSwapDins; + case GlitchType::EquipSwap: // todo: add bunny hood to adult item equippable list and child trade item to child + // item equippable list + return ((IsAdult && (HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE))) || + (IsChild && (HasItem(RG_STICKS) || HasItem(RG_FAIRY_SLINGSHOT) || HasItem(RG_BOOMERANG) || + HasBottle() || CanUse(RG_NUTS) || HasItem(RG_FAIRY_OCARINA) || + HasItem(RG_LENS_OF_TRUTH) || HasExplosives() || GetAmmo(ITEM_BEAN) > 0 || + HasItem(RG_DINS_FIRE) || HasItem(RG_FARORES_WIND) || HasItem(RG_NAYRUS_LOVE)))) && + false; // GlitchEquipSwap; + } + + // Shouldn't be reached + return false; +} + +// RANDOTODO quantity is a placeholder for proper ammo use calculation logic. in time will want updating to account for +// ammo capacity Can we kill this enemy +bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor, uint8_t quantity, bool timer, + bool inWater) { + bool killed = false; + switch (enemy) { + case RE_GOLD_SKULLTULA: + switch (distance) { + case ED_CLOSE: + // hammer jumpslash cannot damage these, but hammer swing can + killed = CanUse(RG_MEGATON_HAMMER); + [[fallthrough]]; + case ED_SHORT_JUMPSLASH: + killed = killed || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + killed = killed || CanUse(RG_BOMB_BAG); + [[fallthrough]]; + case ED_BOOMERANG: + killed = killed || CanUse(RG_BOOMERANG) || CanUse(RG_DINS_FIRE); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_GOHMA_LARVA: + case RE_MAD_SCRUB: + case RE_DEKU_BABA: + return CanAttack(); + case RE_BIG_SKULLTULA: + switch (distance) { + case ED_CLOSE: + // hammer jumpslash cannot damage these, but hammer swing can + killed = CanUse(RG_MEGATON_HAMMER); + [[fallthrough]]; + case ED_SHORT_JUMPSLASH: + killed = killed || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + killed = killed || CanUse(RG_BOMB_BAG); + [[fallthrough]]; + case ED_BOOMERANG: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_DINS_FIRE); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_DODONGO: + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + CanUse(RG_MEGATON_HAMMER) || (quantity <= 5 && CanUse(RG_STICKS)) || HasExplosives() || + CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + case RE_LIZALFOS: + return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + case RE_KEESE: + case RE_FIRE_KEESE: + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + // RANDOTODO test dins and chu range in a practical example + killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + // RANDOTODO test dins and chu range in a practical example + killed = killed || CanUse(RG_BOOMERANG); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test dins, bomb and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_BLUE_BUBBLE: + // RANDOTODO Trick to use shield hylian shield as child to stun these guys + // RANDOTODO check hammer damage + return BlastOrSmash() || CanUse(RG_FAIRY_BOW) || + ((CanJumpslashExceptHammer() || CanUse(RG_FAIRY_SLINGSHOT)) && + (CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield())); + case RE_DEAD_HAND: + // RANDOTODO change Dead Hand trick to be sticks Dead Hand + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + (CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_CHILD_DEADHAND)); + case RE_WITHERED_DEKU_BABA: + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + CanUse(RG_BOOMERANG); + case RE_LIKE_LIKE: + case RE_FLOORMASTER: + return CanDamage(); + case RE_STALFOS: + // RANDOTODO Add trick to kill stalfos with sticks, and a second one for bombs without stunning. Higher ammo + // logic for bombs is also plausible + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || (quantity <= 1 && CanUse(RG_STICKS)); + [[fallthrough]]; + case ED_BOMB_THROW: + killed = killed || (quantity <= 2 && !timer && !inWater && + (CanUse(RG_NUTS) || HookshotOrBoomerang()) && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + case ED_HOOKSHOT: + // RANDOTODO test dins and chu range in a practical example + killed = killed || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + // Needs 16 bombs, but is in default logic in N64, probably because getting the hits is quite easy. + // bow and sling can wake them and damage after they shed their armour, so could reduce ammo requirements for + // explosives to 10. requires 8 sticks to kill so would be a trick unless we apply higher stick bag logic + case RE_IRON_KNUCKLE: + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + CanUse(RG_MEGATON_HAMMER) || HasExplosives(); + // To stun flare dancer with chus, you have to hit the flame under it while it is spinning. It should eventually + // return to spinning after dashing for a while if you miss the window it is possible to damage the core with + // explosives, but difficult to get all 4 hits in even with chus, and if it reconstructs the core heals, so it + // would be a trick. the core takes damage from hookshot even if it doesn't show Dins killing isn't hard, but is + // obscure and tight on single magic, so is a trick + case RE_FLARE_DANCER: + return CanUse(RG_MEGATON_HAMMER) || CanUse(RG_HOOKSHOT) || + (HasExplosives() && (CanJumpslashExceptHammer() || CanUse(RG_FAIRY_BOW) || + CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG))); + case RE_WOLFOS: + case RE_WHITE_WOLFOS: + case RE_WALLMASTER: + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5) || + CanUse(RG_DINS_FIRE) || + (CanUse(RG_BOMB_BAG) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG))); + case RE_GERUDO_WARRIOR: + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || + (ctx->GetTrickOption(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON) && + (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5))); + case RE_GIBDO: + case RE_REDEAD: + return CanJumpslash() || CanUse(RG_DINS_FIRE); + case RE_MEG: + return CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || HasExplosives(); + case RE_ARMOS: + return BlastOrSmash() || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS) || + CanUse(RG_FAIRY_BOW) || + ((CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG)) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_FAIRY_SLINGSHOT))); + case RE_GREEN_BUBBLE: + // does not technically need to be stunned to kill with dins, but the flame must be off and timing it is + // awkward Also they don't trigger the kill room in ganons MQ if they die from dins? Vanilla bug? + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + HasExplosives() /* || (CanUse(RG_DINS_FIRE) && (CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || + CanUse(RG_BOOMERANG)))*/ + ; + case RE_DINOLFOS: + // stunning + bombs is possible but painful, as it loves to dodge the bombs and hookshot. it also dodges + // chus but if you cook it so it detonates under the dodge it usually gets caught on landing + return CanJumpslash() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + (!timer && CanUse(RG_BOMBCHU_5)); + case RE_TORCH_SLUG: + return CanJumpslash() || HasExplosives() || CanUse(RG_FAIRY_BOW); + case RE_FREEZARD: + return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || + CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE) || + CanUse(RG_FIRE_ARROWS); + case RE_SHELL_BLADE: + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + CanUse(RG_MEGATON_HAMMER) || CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || + CanUse(RG_FAIRY_BOW) || CanUse(RG_DINS_FIRE); + case RE_SPIKE: + return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_MEGATON_HAMMER) || + CanUse(RG_STICKS) || HasExplosives() || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || + CanUse(RG_DINS_FIRE); + case RE_STINGER: + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + killed = CanUse(RG_MEGATON_HAMMER) || CanUse(RG_KOKIRI_SWORD); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + killed = killed || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + killed = killed || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + // RANDOTODO test dins and chu range in a practical example + killed = killed || (!inWater && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + case ED_HOOKSHOT: + // RANDOTODO test dins, bomb and chu range in a practical example + killed = killed || CanUse(RG_HOOKSHOT) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + [[fallthrough]]; + case ED_LONGSHOT: + killed = killed || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + killed = killed || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return killed; + case RE_BIG_OCTO: + // If chasing octo is annoying but with rolls you can catch him, and you need rang to get into this room + // without shenanigans anyway. Bunny makes it free + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_STICKS) || CanUse(RG_MASTER_SWORD); + case RE_GOHMA: + return HasBossSoul(RG_GOHMA_SOUL) && CanJumpslash() && + (CanUse(RG_NUTS) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang()); + case RE_KING_DODONGO: + return HasBossSoul(RG_KING_DODONGO_SOUL) && CanJumpslash() && + (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET)); + case RE_BARINADE: + return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); + case RE_PHANTOM_GANON: + return HasBossSoul(RG_PHANTOM_GANON_SOUL) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT)); + case RE_VOLVAGIA: + return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); + case RE_MORPHA: + return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + CanUse(RG_MEGATON_HAMMER)); + case RE_BONGO_BONGO: + return HasBossSoul(RG_BONGO_BONGO_SOUL) && + (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)) && + (CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + ctx->GetTrickOption(RT_SHADOW_BONGO)); + case RE_TWINROVA: + return HasBossSoul(RG_TWINROVA_SOUL) && CanUse(RG_MIRROR_SHIELD) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || + CanUse(RG_MEGATON_HAMMER)); + case RE_GANONDORF: + // RANDOTODO: Trick to use hammer (no jumpslash) or stick (only jumpslash) instead of a sword to reflect the + // energy ball and either of them regardless of jumpslashing to damage and kill ganondorf + + // Bottle is not taken into account since a sword, hammer or stick are required + // for killing ganondorf and all of those can reflect the energy ball + // This will not be the case once ammo logic in taken into account as + // sticks are limited and using a bottle might become a requirement in that case + return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && + (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD)); + case RE_GANON: + return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD); + case RE_DARK_LINK: + // 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 their attack + return HasFireSource(); + case RE_BEAMOS: + return HasExplosives(); + case RE_PURPLE_LEEVER: + // dies on it's own, so this is the conditions to spawn it (killing 10 normal leevers) + // Sticks and Ice arrows work but will need ammo capacity logic + // other methods can damage them but not kill them, and they run when hit, making them impractical + return CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); + case RE_TENTACLE: + return CanUse(RG_BOOMERANG); + case RE_BARI: + return HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_MEGATON_HAMMER) || + CanUse(RG_STICKS) || CanUse(RG_DINS_FIRE) || + (TakeDamage() && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD))); + case RE_SHABOM: + // RANDOTODO when you add better damage logic, you can kill this by taking hits + return CanUse(RG_BOOMERANG) || CanUse(RG_NUTS) || CanJumpslash() || CanUse(RG_DINS_FIRE) || + CanUse(RG_ICE_ARROWS); + case RE_OCTOROK: + return CanReflectNuts() || HookshotOrBoomerang() || CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT) || + CanUse(RG_BOMB_BAG) || (wallOrFloor && CanUse(RG_BOMBCHU_5)); + default: + SPDLOG_ERROR("CanKillEnemy reached `default`."); + assert(false); + return false; + } +} + +// It is rare for Pass Enemy to need distance, this only happens when the enemy blocks a platform and you can't reach it +// before it blocks you an example is the Big Skulltula in water room of MQ deku, which is out of sword swing height but +// blocks off the whole SoT block Can we get past this enemy in a tight space? +bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wallOrFloor) { + if (CanKillEnemy(enemy, distance, wallOrFloor)) { + return true; + } + switch (enemy) { + case RE_GOLD_SKULLTULA: + case RE_GOHMA_LARVA: + case RE_LIZALFOS: + case RE_DODONGO: // RANDOTODO do dodongos block the way in tight corridors? + case RE_MAD_SCRUB: + case RE_KEESE: + case RE_FIRE_KEESE: + case RE_BLUE_BUBBLE: + case RE_DEAD_HAND: + case RE_DEKU_BABA: + case RE_WITHERED_DEKU_BABA: + case RE_STALFOS: + case RE_FLARE_DANCER: + case RE_WOLFOS: + case RE_WHITE_WOLFOS: + case RE_FLOORMASTER: + case RE_MEG: + case RE_ARMOS: + case RE_FREEZARD: + case RE_SPIKE: + case RE_DARK_LINK: + case RE_ANUBIS: + case RE_WALLMASTER: + case RE_PURPLE_LEEVER: + case RE_OCTOROK: + return true; + case RE_BIG_SKULLTULA: + // hammer jumpslash can pass, but only on flat land where you can kill with hammer swing + return CanUse(RG_NUTS) || CanUse(RG_BOOMERANG); + case RE_LIKE_LIKE: + return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); + case RE_GIBDO: + case RE_REDEAD: + // we need a way to check if suns won't force a reload + return CanUse(RG_HOOKSHOT) || CanUse(RG_SUNS_SONG); + case RE_IRON_KNUCKLE: + case RE_BIG_OCTO: + return false; + case RE_GREEN_BUBBLE: + return TakeDamage() || CanUse(RG_NUTS) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); + default: + SPDLOG_ERROR("CanPassEnemy reached `default`."); + assert(false); + return false; + } +} + +// Can we avoid this enemy while climbing up a wall, or doing a difficult platforming challenge? +// use grounded if the challenge is such that the enemy interfears even if it cannot hit link out of the air +bool Logic::CanAvoidEnemy(RandomizerEnemy enemy, bool grounded, uint8_t quantity) { + // DISTANCE AND WALL ASSUMED, add more arguments later if needed + if (CanKillEnemy(enemy, ED_CLOSE, true, quantity)) { + return true; + } + switch (enemy) { + case RE_GOLD_SKULLTULA: case RE_GOHMA_LARVA: case RE_LIZALFOS: case RE_DODONGO: @@ -836,971 +899,991 @@ namespace Rando { case RE_WALLMASTER: case RE_ANUBIS: case RE_PURPLE_LEEVER: - return true; + return true; case RE_BEAMOS: - return !grounded || CanUse(RG_NUTS) || (quantity == 1 && (CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT))); + return !grounded || CanUse(RG_NUTS) || + (quantity == 1 && (CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT))); case RE_MAD_SCRUB: - return !grounded || CanUse(RG_NUTS); + return !grounded || CanUse(RG_NUTS); case RE_KEESE: case RE_FIRE_KEESE: - return CanUse(RG_NUTS); + return CanUse(RG_NUTS); case RE_BLUE_BUBBLE: - //RANDOTODO Trick to use shield hylian shield as child to stun these guys - return !grounded || CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield(); + // RANDOTODO Trick to use shield hylian shield as child to stun these guys + return !grounded || CanUse(RG_NUTS) || HookshotOrBoomerang() || CanStandingShield(); default: - SPDLOG_ERROR("CanPassEnemy reached `default`."); - assert(false); - return false; - } - } - - bool Logic::CanGetEnemyDrop(RandomizerEnemy enemy, EnemyDistance distance, bool aboveLink) { - if (!CanKillEnemy(enemy, distance)){ + SPDLOG_ERROR("CanPassEnemy reached `default`."); + assert(false); return false; - } - if (distance <= ED_MASTER_SWORD_JUMPSLASH){ - return true; - } - bool drop = false; - switch(enemy) { - case RE_GOLD_SKULLTULA: - switch(distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - case ED_MASTER_SWORD_JUMPSLASH: - case ED_LONG_JUMPSLASH: - case ED_BOMB_THROW: - case ED_BOOMERANG: - drop = drop || CanUse(RG_BOOMERANG); - [[fallthrough]]; - case ED_HOOKSHOT: - drop = drop || CanUse(RG_HOOKSHOT); - [[fallthrough]]; - case ED_LONGSHOT: - drop = drop || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - break; - //RANDOTODO double check all jumpslash kills that might be out of jump/backflip range - } - return drop; - break; - case RE_KEESE: - case RE_FIRE_KEESE: - return true; - default: - return aboveLink || (distance <= ED_BOOMERANG && CanUse(RG_BOOMERANG)); - } } +} - bool Logic::CanBreakMudWalls() { - return BlastOrSmash() || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && BlueFire()); - } - - bool Logic::CanGetDekuBabaSticks() { - return (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG)); - } - - bool Logic::CanGetDekuBabaNuts() { - return CanJumpslash() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_DINS_FIRE); - } - - bool Logic::CanHitEyeTargets() { - return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT); - } - - bool Logic::CanDetonateBombFlowers() { - return CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_DINS_FIRE); - } - - bool Logic::CanDetonateUprightBombFlower() { - return CanDetonateBombFlowers() || HasItem(RG_GORONS_BRACELET); - } - - bool Logic::MQWaterLevel(RandoWaterLevel level) { - //For ease of reading, I will call the triforce emblem that sets the water to WL_LOW the "Low Emblem", the one that sets it to WL_MID the "Mid Emblem", and the one that sets it to WL_HIGH the "High Emblem" - switch(level){ - //While you have to go through WL_LOW to get to Mid, the requirements for WL_LOW are stricter than WL_MID because you can always go up to WL_MID and then could need to go back to WL_HIGH to reach the Low Emblem again - //Thanks to this caveat you need to be able to reach and play ZL to both the High and Low Emblems to have WL_LOW in logic. - //Alternativly a way to reach WL_LOW from WL_MID could exist, but all glitchless methods need you to do a Low-locked action - case WL_LOW: - return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); - case WL_LOW_OR_MID: - return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || (CanWaterTempleLowFromHigh && CanWaterTempleMiddle) || (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); - //If we can set it to High out of logic we can just repeat what we did to lower the water in the first place as High is the default. - //Because of this you only need to be able to use the Low and Mid Emblems, WL_LOW could be skipped if it was ever possible to play ZL underwater. - case WL_MID: - return CanWaterTempleLowFromHigh && CanWaterTempleMiddle; - //Despite being the initial state of water temple, WL_HIGH has the extra requirement of making sure that, if we were to lower the water out of logic, we could put it back to WL_HIGH - //However because it is the default state, we do not need to check if we can actually change the water level, only to make sure we can return to WL_HIGH if we found the means to play ZL out of logic. - //There are 2 methods to lock yourself out after playing ZL already: Not being able to reach the High Emblem and being unable to replay ZL. (I will be ignoring other-age-access shenanigains) - //The former check would simply be a check to see if we can reach High Emblem, but we assume the water is WL_MID (as if we can set it to WL_LOW, we can set it to WL_MID, as Mid Emblem has no requirements) - //The latter check can be assumed for now but will want a revisit once OI tricks are added. - case WL_HIGH: - return ReachedWaterHighEmblem; - case WL_HIGH_OR_MID: - return ReachedWaterHighEmblem || (CanWaterTempleLowFromHigh && CanWaterTempleMiddle); - } - SPDLOG_ERROR("MQWaterLevel reached `return false;`. Missing case for a Water Level"); - assert(false); +bool Logic::CanGetEnemyDrop(RandomizerEnemy enemy, EnemyDistance distance, bool aboveLink) { + if (!CanKillEnemy(enemy, distance)) { return false; } - - Logic::Logic() { - + if (distance <= ED_MASTER_SWORD_JUMPSLASH) { + return true; } - - uint8_t Logic::BottleCount() { - uint8_t count = 0; - if (CouldEmptyBigPoes && !AreCheckingBigPoes){ - 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; - } + bool drop = false; + switch (enemy) { + case RE_GOLD_SKULLTULA: + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + case ED_MASTER_SWORD_JUMPSLASH: + case ED_LONG_JUMPSLASH: + case ED_BOMB_THROW: + case ED_BOOMERANG: + drop = drop || CanUse(RG_BOOMERANG); + [[fallthrough]]; + case ED_HOOKSHOT: + drop = drop || CanUse(RG_HOOKSHOT); + [[fallthrough]]; + case ED_LONGSHOT: + drop = drop || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + break; + // RANDOTODO double check all jumpslash kills that might be out of jump/backflip range } - } - return count; - } - - uint8_t Logic::OcarinaButtons(){ - return HasItem(RG_OCARINA_A_BUTTON) + HasItem(RG_OCARINA_C_LEFT_BUTTON) + HasItem(RG_OCARINA_C_RIGHT_BUTTON) + HasItem(RG_OCARINA_C_UP_BUTTON) + HasItem(RG_OCARINA_C_DOWN_BUTTON); - } - - bool Logic::HasBottle(){ - return BottleCount() >= 1; - } - - bool Logic::CanJumpslashExceptHammer() { - // Not including hammer as hammer jump attacks can be weird; - return CanUse(RG_STICKS) || CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); - } - - bool Logic::CanJumpslash() { - return CanJumpslashExceptHammer() || CanUse(RG_MEGATON_HAMMER); - } - - bool Logic::CanHitSwitch(EnemyDistance distance, bool inWater) { - bool hit = false; - switch (distance){ - case ED_CLOSE: - case ED_SHORT_JUMPSLASH: - hit = CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MEGATON_HAMMER); - [[fallthrough]]; - case ED_MASTER_SWORD_JUMPSLASH: - hit = hit || CanUse(RG_MASTER_SWORD); - [[fallthrough]]; - case ED_LONG_JUMPSLASH: - hit = hit || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); - [[fallthrough]]; - case ED_BOMB_THROW: - hit = hit || (!inWater && CanUse(RG_BOMB_BAG)); - [[fallthrough]]; - case ED_BOOMERANG: - hit = hit || CanUse(RG_BOOMERANG); - [[fallthrough]]; - case ED_HOOKSHOT: - //RANDOTODO test chu range in a practical example - hit = hit || CanUse(RG_HOOKSHOT) || CanUse(RG_BOMBCHU_5) ; - [[fallthrough]]; - case ED_LONGSHOT: - hit = hit || CanUse(RG_LONGSHOT); - [[fallthrough]]; - case ED_FAR: - hit = hit || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); - break; - } - return hit; - } - - bool Logic::CanDamage() { - return CanUse(RG_FAIRY_SLINGSHOT) || CanJumpslash() || HasExplosives() || CanUse(RG_DINS_FIRE) || CanUse(RG_FAIRY_BOW); - } - - bool Logic::CanAttack() { - return CanDamage() || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); - } - - bool Logic::BombchusEnabled(){ - return ctx->GetOption(RSK_BOMBCHU_BAG) ? CheckInventory(ITEM_BOMBCHU, true) : HasItem(RG_BOMB_BAG); - } - - // TODO: Implement Ammo Drop Setting in place of bombchu drops - bool Logic::BombchuRefill(){ - return GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant || (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON/*_PLUS_BOMBCHU*/)); - } - - bool Logic::HookshotOrBoomerang(){ - return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); - } - - bool Logic::ScarecrowsSong(){ - return (ctx->GetOption(RSK_SKIP_SCARECROWS_SONG) && HasItem(RG_FAIRY_OCARINA) && OcarinaButtons() >= 2) - || (ChildScarecrow && AdultScarecrow); - } - - bool Logic::BlueFire(){ - return CanUse(RG_BOTTLE_WITH_BLUE_FIRE) || (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && CanUse(RG_ICE_ARROWS)); - } - - bool Logic::CanBreakPots(){ - return true; - } - - bool Logic::CanBreakCrates() { - return true; - } - - bool Logic::CanBreakSmallCrates() { - return true; - } - - bool Logic::HasExplosives(){ - return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); - } - - bool Logic::BlastOrSmash(){ - return HasExplosives() || CanUse(RG_MEGATON_HAMMER); - } - - bool Logic::CanSpawnSoilSkull(){ - return IsChild && CanUse(RG_BOTTLE_WITH_BUGS); - } - - bool Logic::CanReflectNuts(){ - return CanUse(RG_DEKU_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)); - } - - bool Logic::CanCutShrubs(){ - return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_BOOMERANG) || HasExplosives() || CanUse(RG_MASTER_SWORD) || CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD) || HasItem(RG_GORONS_BRACELET); - } - - bool Logic::CanStunDeku(){ - return CanAttack() || CanUse(RG_NUTS) || CanReflectNuts(); - } - - bool Logic::CanLeaveForest(){ - return ctx->GetOption(RSK_FOREST).IsNot(RO_CLOSED_FOREST_ON) || IsAdult || DekuTreeClear || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); - } - - bool Logic::CallGossipFairyExceptSuns(){ - return CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); - } - - bool Logic::CallGossipFairy(){ - return CallGossipFairyExceptSuns() || CanUse(RG_SUNS_SONG); - } - - //the number returned by this is in half heart hits taken. - //RANDOTODO work in OoT side health instead for greater applicability (16 per heart) - uint8_t Logic::EffectiveHealth(){ - /* Multiplier will be: - 0 for half daamge - 1 for normal damage - 2 for double damage - 3 for quad damage - 4 for 8* damage - 5 for 16* damage - 10 for OHKO. - This is the number of shifts to apply, not a real multiplier - */ - 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) + - //As 1 is a quarter heart, (1 << Multiplier) is effectivly half-hearts of unmodified damage - //Adds an extra hit if the damage is not exact lethal - ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) % (1 << Multiplier) > 0); - } - - uint8_t Logic::Hearts(){ - return GetSaveContext()->healthCapacity / 16; - } - - uint8_t Logic::DungeonCount(){ - return DekuTreeClear + DodongosCavernClear + JabuJabusBellyClear + ForestTempleClear + FireTempleClear + WaterTempleClear + SpiritTempleClear + ShadowTempleClear; - } - - uint8_t Logic::StoneCount(){ - return HasItem(RG_KOKIRI_EMERALD) + HasItem(RG_GORON_RUBY) + HasItem(RG_ZORA_SAPPHIRE); - } - - uint8_t Logic::MedallionCount(){ - return HasItem(RG_FOREST_MEDALLION) + HasItem(RG_FIRE_MEDALLION) + HasItem(RG_WATER_MEDALLION) + HasItem(RG_SPIRIT_MEDALLION) + HasItem(RG_SHADOW_MEDALLION) + HasItem(RG_LIGHT_MEDALLION); - } - - uint8_t Logic::FireTimer(){ - return CanUse(RG_GORON_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; - } - - //Tunic is not required if you are using irons to do something that a simple gold scale dive could do, and you are not in water temple. (celing swimming and long walks through water do not count) - uint8_t Logic::WaterTimer(){ - return CanUse(RG_ZORA_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; - } - - bool Logic::TakeDamage(){ - return CanUse(RG_BOTTLE_WITH_FAIRY) || EffectiveHealth() != 1 || CanUse(RG_NAYRUS_LOVE); - } - - bool Logic::CanOpenBombGrotto(){ - return BlastOrSmash() && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); - } - - bool Logic::CanOpenStormsGrotto(){ - return CanUse(RG_SONG_OF_STORMS) && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); - } - - bool Logic::CanGetNightTimeGS(){ - return AtNight && (CanUse(RG_SUNS_SONG) || !ctx->GetOption(RSK_SKULLS_SUNS_SONG)); - } - - bool Logic::CanBreakUpperBeehives(){ - return HookshotOrBoomerang() || (ctx->GetTrickOption(RT_BOMBCHU_BEEHIVES) && CanUse(RG_BOMBCHU_5)); - } - - bool Logic::CanBreakLowerBeehives(){ - return CanBreakUpperBeehives() || CanUse(RG_BOMB_BAG); - } - - bool Logic::HasFireSource(){ - return CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); - } - - bool Logic::HasFireSourceWithTorch(){ - return HasFireSource() || CanUse(RG_STICKS); - } - -//Is this best off signaling what you have already traded, or what step you are currently on? - bool Logic::TradeQuestStep(RandomizerGet rg){ - if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)){ - return false; //This does not apply when we are shuffling trade items - } - bool hasState = false; - //Falling through each case to test each possibility - switch (rg){ - case RG_POCKET_EGG: - hasState = hasState || HasItem(RG_POCKET_EGG); - [[fallthrough]]; - case RG_COJIRO: - hasState = hasState || HasItem(RG_COJIRO); - [[fallthrough]]; - case RG_ODD_MUSHROOM: - hasState = hasState || HasItem(RG_ODD_MUSHROOM); - [[fallthrough]]; - case RG_ODD_POTION: - hasState = hasState || HasItem(RG_ODD_POTION); - [[fallthrough]]; - case RG_POACHERS_SAW: - hasState = hasState || HasItem(RG_POACHERS_SAW); - [[fallthrough]]; - case RG_BROKEN_SWORD: - hasState = hasState || HasItem(RG_BROKEN_SWORD); - [[fallthrough]]; - case RG_PRESCRIPTION: - hasState = hasState || HasItem(RG_PRESCRIPTION); - [[fallthrough]]; - case RG_EYEDROPS: - hasState = hasState || HasItem(RG_EYEDROPS); - [[fallthrough]]; - case RG_CLAIM_CHECK: - hasState = hasState || HasItem(RG_CLAIM_CHECK); - break; - default: - SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", static_cast(rg)); - assert(false); - return false; - } - return hasState; - } - - bool Logic::CanFinishGerudoFortress(){ - return (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && SmallKeys(RR_GERUDO_FORTRESS, 4) && CanKillEnemy(RE_GERUDO_WARRIOR) && (HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN))) || - (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST) && SmallKeys(RR_GERUDO_FORTRESS, 1) && CanKillEnemy(RE_GERUDO_WARRIOR)) || - ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE); - } - - bool Logic::CanStandingShield(){ - return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); - } - - bool Logic::CanShield(){ - return CanUse(RG_MIRROR_SHIELD) || HasItem(RG_HYLIAN_SHIELD) || CanUse(RG_DEKU_SHIELD); - } - - bool Logic::CanUseProjectile(){ - return HasExplosives() || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG); - } - - 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).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->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) { - return SmallKeys(dungeon, requiredAmount, requiredAmount); - } - - bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched) { - if (HasItem(RG_SKELETON_KEY)) { + return drop; + break; + case RE_KEESE: + case RE_FIRE_KEESE: return true; - } - switch (dungeon) { - case RR_FOREST_TEMPLE: - /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotJump_Boots) >= static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHoverBoost) >= static_cast(GlitchDifficulty::NOVICE) || - (GetDifficultyValueFromString(GlitchHover) >= static_cast(GlitchDifficulty::NOVICE) && GetDifficultyValueFromString(GlitchISG) >= static_cast(GlitchDifficulty::INTERMEDIATE)))) { - return ForestTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_FOREST_TEMPLE) >= requiredAmountGlitchless; - - case RR_FIRE_TEMPLE: - /*if (IsGlitched && (GetDifficultyValueFromString(GlitchLedgeClip) >= static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHover) >= static_cast(GlitchDifficulty::INTERMEDIATE))) { - return FireTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_FIRE_TEMPLE) >= requiredAmountGlitchless; - - case RR_WATER_TEMPLE: - /*if (IsGlitched && (false)) { - return WaterTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_WATER_TEMPLE) >= requiredAmountGlitchless; - - case RR_SPIRIT_TEMPLE: - /*if (IsGlitched && (false)) { - return SpiritTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_SPIRIT_TEMPLE) >= requiredAmountGlitchless; - - case RR_SHADOW_TEMPLE: - /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotClip) >= static_cast(GlitchDifficulty::NOVICE))) { - return ShadowTempleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_SHADOW_TEMPLE) >= requiredAmountGlitchless; - - case RR_BOTTOM_OF_THE_WELL: - /*if (IsGlitched && (false)) { - return BottomOfTheWellKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_BOTTOM_OF_THE_WELL) >= requiredAmountGlitchless; - - case RR_GERUDO_TRAINING_GROUND: - /*if (IsGlitched && (false)) { - return GerudoTrainingGroundsKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_GERUDO_TRAINING_GROUND) >= requiredAmountGlitchless; - - case RR_GANONS_CASTLE: - /*if (IsGlitched && (false)) { - return GanonsCastleKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_INSIDE_GANONS_CASTLE) >= requiredAmountGlitchless; - - case RR_MARKET_TREASURE_CHEST_GAME: - /*if (IsGlitched && (false)) { - return TreasureGameKeys >= requiredAmountGlitched; - }*/ - return GetSmallKeyCount(SCENE_TREASURE_BOX_SHOP) >= requiredAmountGlitchless; - - case RR_GERUDO_FORTRESS: - return GetSmallKeyCount(SCENE_THIEVES_HIDEOUT) >= requiredAmountGlitchless; - - default: - return false; - } + default: + return aboveLink || (distance <= ED_BOOMERANG && CanUse(RG_BOOMERANG)); } +} - std::map Logic::RandoGetToEquipFlag = { - { RG_KOKIRI_SWORD, EQUIP_FLAG_SWORD_KOKIRI }, - { RG_MASTER_SWORD, EQUIP_FLAG_SWORD_MASTER }, - { RG_BIGGORON_SWORD, EQUIP_FLAG_SWORD_BGS }, - { RG_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, - { RG_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, - { RG_MIRROR_SHIELD, EQUIP_FLAG_SHIELD_MIRROR }, - { RG_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, - { RG_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, - { RG_BUY_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, - { RG_BUY_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, - { RG_BUY_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, - { RG_BUY_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, - { RG_IRON_BOOTS, EQUIP_FLAG_BOOTS_IRON }, - { RG_HOVER_BOOTS, EQUIP_FLAG_BOOTS_HOVER } - }; +bool Logic::CanBreakMudWalls() { + return BlastOrSmash() || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && BlueFire()); +} - std::map Logic::RandoGetToRandInf = { - { RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER }, - { RG_WEIRD_EGG, RAND_INF_WEIRD_EGG }, - { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, - { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, - { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, - { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, - { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, - { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, - { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, - { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, - { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, - { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, - { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, - { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, - { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, - { 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_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 }, - }; +bool Logic::CanGetDekuBabaSticks() { + return (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_BOOMERANG)); +} - std::map Logic::RandoGetToDungeonScene = { - { RG_FOREST_TEMPLE_SMALL_KEY, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_SMALL_KEY, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_SMALL_KEY, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_SMALL_KEY, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_SMALL_KEY, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, SCENE_BOTTOM_OF_THE_WELL }, - { RG_GERUDO_TRAINING_GROUND_SMALL_KEY, SCENE_GERUDO_TRAINING_GROUND }, - { RG_GERUDO_FORTRESS_SMALL_KEY, SCENE_THIEVES_HIDEOUT }, - { RG_GANONS_CASTLE_SMALL_KEY, SCENE_INSIDE_GANONS_CASTLE }, - { RG_FOREST_TEMPLE_KEY_RING, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_KEY_RING, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_KEY_RING, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_KEY_RING, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_KEY_RING, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_KEY_RING, SCENE_BOTTOM_OF_THE_WELL }, - { RG_GERUDO_TRAINING_GROUND_KEY_RING, SCENE_GERUDO_TRAINING_GROUND }, - { RG_GERUDO_FORTRESS_KEY_RING, SCENE_THIEVES_HIDEOUT }, - { RG_GANONS_CASTLE_KEY_RING, SCENE_INSIDE_GANONS_CASTLE }, - { RG_FOREST_TEMPLE_BOSS_KEY, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_BOSS_KEY, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_BOSS_KEY, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_BOSS_KEY, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_BOSS_KEY, SCENE_SHADOW_TEMPLE }, - { RG_GANONS_CASTLE_BOSS_KEY, SCENE_INSIDE_GANONS_CASTLE }, - { RG_DEKU_TREE_MAP, SCENE_DEKU_TREE }, - { RG_DODONGOS_CAVERN_MAP, SCENE_DODONGOS_CAVERN }, - { RG_JABU_JABUS_BELLY_MAP, SCENE_JABU_JABU }, - { RG_FOREST_TEMPLE_MAP, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_MAP, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_MAP, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_MAP, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_MAP, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_MAP, SCENE_BOTTOM_OF_THE_WELL }, - { RG_ICE_CAVERN_MAP, SCENE_ICE_CAVERN }, - { RG_DEKU_TREE_COMPASS, SCENE_DEKU_TREE }, - { RG_DODONGOS_CAVERN_COMPASS, SCENE_DODONGOS_CAVERN }, - { RG_JABU_JABUS_BELLY_COMPASS, SCENE_JABU_JABU }, - { RG_FOREST_TEMPLE_COMPASS, SCENE_FOREST_TEMPLE }, - { RG_FIRE_TEMPLE_COMPASS, SCENE_FIRE_TEMPLE }, - { RG_WATER_TEMPLE_COMPASS, SCENE_WATER_TEMPLE }, - { RG_SPIRIT_TEMPLE_COMPASS, SCENE_SPIRIT_TEMPLE }, - { RG_SHADOW_TEMPLE_COMPASS, SCENE_SHADOW_TEMPLE }, - { RG_BOTTOM_OF_THE_WELL_COMPASS, SCENE_BOTTOM_OF_THE_WELL }, - { RG_ICE_CAVERN_COMPASS, SCENE_ICE_CAVERN }, - { RG_TREASURE_GAME_SMALL_KEY, SCENE_TREASURE_BOX_SHOP } - }; +bool Logic::CanGetDekuBabaNuts() { + return CanJumpslash() || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HasExplosives() || + CanUse(RG_DINS_FIRE); +} - std::map Logic::RandoGetToQuestItem = { - { RG_FOREST_MEDALLION, QUEST_MEDALLION_FOREST }, - { RG_FIRE_MEDALLION, QUEST_MEDALLION_FIRE }, - { RG_WATER_MEDALLION, QUEST_MEDALLION_WATER }, - { RG_SPIRIT_MEDALLION, QUEST_MEDALLION_SPIRIT }, - { RG_SHADOW_MEDALLION, QUEST_MEDALLION_SHADOW }, - { RG_LIGHT_MEDALLION, QUEST_MEDALLION_LIGHT }, - { RG_MINUET_OF_FOREST, QUEST_SONG_MINUET }, - { RG_BOLERO_OF_FIRE, QUEST_SONG_BOLERO }, - { RG_SERENADE_OF_WATER, QUEST_SONG_SERENADE }, - { RG_REQUIEM_OF_SPIRIT, QUEST_SONG_REQUIEM }, - { RG_NOCTURNE_OF_SHADOW, QUEST_SONG_NOCTURNE }, - { RG_PRELUDE_OF_LIGHT, QUEST_SONG_PRELUDE }, - { RG_ZELDAS_LULLABY, QUEST_SONG_LULLABY }, - { RG_EPONAS_SONG, QUEST_SONG_EPONA }, - { RG_SARIAS_SONG, QUEST_SONG_SARIA }, - { RG_SUNS_SONG, QUEST_SONG_SUN }, - { RG_SONG_OF_TIME, QUEST_SONG_TIME }, - { RG_SONG_OF_STORMS, QUEST_SONG_STORMS }, - { RG_KOKIRI_EMERALD, QUEST_KOKIRI_EMERALD }, - { RG_GORON_RUBY, QUEST_GORON_RUBY }, - { RG_ZORA_SAPPHIRE, QUEST_ZORA_SAPPHIRE }, - { RG_STONE_OF_AGONY, QUEST_STONE_OF_AGONY }, - { RG_GERUDO_MEMBERSHIP_CARD, QUEST_GERUDO_CARD }, - }; +bool Logic::CanHitEyeTargets() { + return CanUse(RG_FAIRY_BOW) || CanUse(RG_FAIRY_SLINGSHOT); +} - 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 }, - }; +bool Logic::CanDetonateBombFlowers() { + return CanUse(RG_FAIRY_BOW) || HasExplosives() || CanUse(RG_DINS_FIRE); +} - uint32_t HookshotLookup[3] = { ITEM_NONE, ITEM_HOOKSHOT, ITEM_LONGSHOT }; - uint32_t OcarinaLookup[3] = { ITEM_NONE, ITEM_OCARINA_FAIRY, ITEM_OCARINA_TIME }; +bool Logic::CanDetonateUprightBombFlower() { + return CanDetonateBombFlowers() || HasItem(RG_GORONS_BRACELET); +} - void Logic::ApplyItemEffect(Item& item, bool state) { - auto randoGet = item.GetRandomizerGet(); - if (item.GetGIEntry()->objectId == OBJECT_GI_STICK) { - SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); - } - if (item.GetGIEntry()->objectId == OBJECT_GI_NUTS) { - SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); - } - switch (item.GetItemType()) { - case ITEMTYPE_ITEM: - { - switch (randoGet) { - case RG_STONE_OF_AGONY: - case RG_GERUDO_MEMBERSHIP_CARD: - SetQuestItem(RandoGetToQuestItem.at(randoGet), state); - break; - case RG_WEIRD_EGG: - SetRandoInf(RAND_INF_WEIRD_EGG, state); - break; - case RG_ZELDAS_LETTER: - SetRandoInf(RAND_INF_ZELDAS_LETTER, state); - break; - case RG_DOUBLE_DEFENSE: - mSaveContext->isDoubleDefenseAcquired = state; - break; - case RG_POCKET_EGG: - SetRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); - break; - case RG_COJIRO: - case RG_ODD_MUSHROOM: - case RG_ODD_POTION: - case RG_POACHERS_SAW: - case RG_BROKEN_SWORD: - case RG_PRESCRIPTION: - case RG_EYEBALL_FROG: - case RG_EYEDROPS: - case RG_CLAIM_CHECK: - SetRandoInf(randoGet - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO, state); - break; - case RG_PROGRESSIVE_HOOKSHOT: - { - uint8_t i; - for (i = 0; i < 3; i++) { - if (CurrentInventory(ITEM_HOOKSHOT) == HookshotLookup[i]) { - break; +bool Logic::MQWaterLevel(RandoWaterLevel level) { + // For ease of reading, I will call the triforce emblem that sets the water to WL_LOW the "Low Emblem", the one that + // sets it to WL_MID the "Mid Emblem", and the one that sets it to WL_HIGH the "High Emblem" + switch (level) { + // While you have to go through WL_LOW to get to Mid, the requirements for WL_LOW are stricter than WL_MID + // because you can always go up to WL_MID and then could need to go back to WL_HIGH to reach the Low Emblem + // again Thanks to this caveat you need to be able to reach and play ZL to both the High and Low Emblems to have + // WL_LOW in logic. Alternativly a way to reach WL_LOW from WL_MID could exist, but all glitchless methods need + // you to do a Low-locked action + case WL_LOW: + return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || + (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); + case WL_LOW_OR_MID: + return (CanWaterTempleHigh && CanWaterTempleLowFromHigh) || + (CanWaterTempleLowFromHigh && CanWaterTempleMiddle) || + (CanWaterTempleLowFromMid && CanWaterTempleLowFromHigh); + // If we can set it to High out of logic we can just repeat what we did to lower the water in the first place as + // High is the default. Because of this you only need to be able to use the Low and Mid Emblems, WL_LOW could be + // skipped if it was ever possible to play ZL underwater. + case WL_MID: + return CanWaterTempleLowFromHigh && CanWaterTempleMiddle; + // Despite being the initial state of water temple, WL_HIGH has the extra requirement of making sure that, if we + // were to lower the water out of logic, we could put it back to WL_HIGH However because it is the default + // state, we do not need to check if we can actually change the water level, only to make sure we can return to + // WL_HIGH if we found the means to play ZL out of logic. There are 2 methods to lock yourself out after playing + // ZL already: Not being able to reach the High Emblem and being unable to replay ZL. (I will be ignoring + // other-age-access shenanigains) The former check would simply be a check to see if we can reach High Emblem, + // but we assume the water is WL_MID (as if we can set it to WL_LOW, we can set it to WL_MID, as Mid Emblem has + // no requirements) The latter check can be assumed for now but will want a revisit once OI tricks are added. + case WL_HIGH: + return ReachedWaterHighEmblem; + case WL_HIGH_OR_MID: + return ReachedWaterHighEmblem || (CanWaterTempleLowFromHigh && CanWaterTempleMiddle); + } + SPDLOG_ERROR("MQWaterLevel reached `return false;`. Missing case for a Water Level"); + assert(false); + return false; +} + +Logic::Logic() { +} + +uint8_t Logic::BottleCount() { + uint8_t count = 0; + if (CouldEmptyBigPoes && !AreCheckingBigPoes) { + 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++; } - } - auto newItem = i + (!state ? -1 : 1); - if (newItem < 0) { - newItem = 0; - } - else if (newItem > 2) { - newItem = 2; - } - SetInventory(ITEM_HOOKSHOT, HookshotLookup[newItem]); - } break; - case RG_PROGRESSIVE_STRENGTH: - { - auto currentLevel = CurrentUpgrade(UPG_STRENGTH); - auto newLevel = currentLevel + (!state ? -1 : 1); - SetUpgrade(UPG_STRENGTH, newLevel); - } break; - case RG_PROGRESSIVE_BOMB_BAG: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_BOMB_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_BOMB_BAG, true); break; - } - auto currentLevel = CurrentUpgrade(UPG_BOMB_BAG); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_BOMB, (!state ? ITEM_NONE : ITEM_BOMB)); - } - SetUpgrade(UPG_BOMB_BAG, newLevel); - } break; - case RG_PROGRESSIVE_BOW: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_QUIVER_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_QUIVER, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_QUIVER); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_BOW, (!state ? ITEM_NONE : ITEM_BOW)); - } - SetUpgrade(UPG_QUIVER, newLevel); - } break; - case RG_PROGRESSIVE_SLINGSHOT: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_BULLET_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_BULLET_BAG, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_BULLET_BAG); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_SLINGSHOT, (!state ? ITEM_NONE : ITEM_SLINGSHOT)); - } - SetUpgrade(UPG_BULLET_BAG, newLevel); - } break; - case RG_PROGRESSIVE_WALLET: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_WALLET_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_MONEY, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_WALLET); - if (!CheckRandoInf(RAND_INF_HAS_WALLET) && state) { - SetRandoInf(RAND_INF_HAS_WALLET, true); - } - else if (currentLevel == 0 && !state) { - SetRandoInf(RAND_INF_HAS_WALLET, false); - } - else { - auto newLevel = currentLevel + (!state ? -1 : 1); - SetUpgrade(UPG_WALLET, newLevel); - } - } break; - case RG_PROGRESSIVE_SCALE: - { - auto currentLevel = CurrentUpgrade(UPG_SCALE); - if (!CheckRandoInf(RAND_INF_CAN_SWIM) && state) { - SetRandoInf(RAND_INF_CAN_SWIM, true); - } - else if (currentLevel == 0 && !state) { - SetRandoInf(RAND_INF_CAN_SWIM, false); - } - else { - auto newLevel = currentLevel + (!state ? -1 : 1); - SetUpgrade(UPG_SCALE, newLevel); - } - } break; - case RG_PROGRESSIVE_NUT_UPGRADE: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_NUT_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_NUTS); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); - } - SetUpgrade(UPG_NUTS, newLevel); - } break; - case RG_PROGRESSIVE_STICK_UPGRADE: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_STICK_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE, true); - break; - } - auto currentLevel = CurrentUpgrade(UPG_STICKS); - auto newLevel = currentLevel + (!state ? -1 : 1); - if (currentLevel == 0 && state || currentLevel == 1 && !state) { - SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); - } - SetUpgrade(UPG_STICKS, newLevel); - } break; - case RG_PROGRESSIVE_BOMBCHUS: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_BOMBCHU_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_BOMBCHUS, true); - break; - } - SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); - } break; - case RG_PROGRESSIVE_MAGIC_METER: - { - auto realGI = item.GetGIEntry(); - if (realGI->itemId == RG_MAGIC_INF && realGI->modIndex == MOD_RANDOMIZER) { - SetRandoInf(RAND_INF_HAS_INFINITE_MAGIC_METER, true); - break; - } - mSaveContext->magicLevel += (!state ? -1 : 1); - } break; - case RG_PROGRESSIVE_OCARINA: - { - uint8_t i; - for (i = 0; i < 3; i++) { - if (CurrentInventory(ITEM_OCARINA_FAIRY) == OcarinaLookup[i]) { - break; + case ITEM_BIG_POE: + if (CanEmptyBigPoes) { + count++; } - } - i += (!state ? -1 : 1); - if (i < 0) { - i = 0; - } - else if (i > 2) { - i = 2; - } - SetInventory(ITEM_OCARINA_FAIRY, OcarinaLookup[i]); - } break; - case RG_HEART_CONTAINER: - mSaveContext->healthCapacity += (!state ? -16 : 16); - break; - case RG_PIECE_OF_HEART: - mSaveContext->healthCapacity += (!state ? -4 : 4); - break; - case RG_BOOMERANG: - case RG_LENS_OF_TRUTH: - case RG_MEGATON_HAMMER: - case RG_DINS_FIRE: - case RG_FARORES_WIND: - case RG_NAYRUS_LOVE: - case RG_FIRE_ARROWS: - case RG_ICE_ARROWS: - case RG_LIGHT_ARROWS: - SetInventory(item.GetGIEntry()->itemId, (!state ? ITEM_NONE : item.GetGIEntry()->itemId)); - break; - case RG_MAGIC_BEAN: - case RG_MAGIC_BEAN_PACK: - { - auto change = (item.GetRandomizerGet() == RG_MAGIC_BEAN ? 1 : 10); - auto current = GetAmmo(ITEM_BEAN); - SetAmmo(ITEM_BEAN, current + (!state ? -change : change)); - } break; - case RG_EMPTY_BOTTLE: - case RG_BOTTLE_WITH_MILK: - case RG_BOTTLE_WITH_RED_POTION: - case RG_BOTTLE_WITH_GREEN_POTION: - case RG_BOTTLE_WITH_BLUE_POTION: - case RG_BOTTLE_WITH_FAIRY: - case RG_BOTTLE_WITH_FISH: - case RG_BOTTLE_WITH_BLUE_FIRE: - case RG_BOTTLE_WITH_BUGS: - case RG_BOTTLE_WITH_POE: - case RG_BOTTLE_WITH_BIG_POE: - { - uint8_t slot = SLOT_BOTTLE_1; - while (slot != SLOT_BOTTLE_4) { - if (mSaveContext->inventory.items[slot] == ITEM_NONE) { - break; - } - slot++; - } - uint16_t itemId = item.GetGIEntry()->itemId; - if (BottleRandomizerGetToItemID.contains(randoGet)) { - itemId = BottleRandomizerGetToItemID[randoGet]; - } - if (randoGet == RG_BOTTLE_WITH_BIG_POE) { - BigPoes++; - } - mSaveContext->inventory.items[slot] = itemId; - } break; - case RG_RUTOS_LETTER: - SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER, state); - break; - case RG_GOHMA_SOUL: - case RG_KING_DODONGO_SOUL: - case RG_BARINADE_SOUL: - case RG_PHANTOM_GANON_SOUL: - case RG_VOLVAGIA_SOUL: - case RG_MORPHA_SOUL: - case RG_BONGO_BONGO_SOUL: - case RG_TWINROVA_SOUL: - case RG_GANON_SOUL: - case RG_OCARINA_A_BUTTON: - case RG_OCARINA_C_UP_BUTTON: - case RG_OCARINA_C_DOWN_BUTTON: - case RG_OCARINA_C_LEFT_BUTTON: - 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->ship.quest.data.randomizer.triforcePiecesCollected += (!state ? -1 : 1); - break; - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); - break; - default: - break; + break; + case ITEM_NONE: + break; + default: + count++; + break; } } - break; - case ITEMTYPE_EQUIP: - { + } + return count; +} + +uint8_t Logic::OcarinaButtons() { + return HasItem(RG_OCARINA_A_BUTTON) + HasItem(RG_OCARINA_C_LEFT_BUTTON) + HasItem(RG_OCARINA_C_RIGHT_BUTTON) + + HasItem(RG_OCARINA_C_UP_BUTTON) + HasItem(RG_OCARINA_C_DOWN_BUTTON); +} + +bool Logic::HasBottle() { + return BottleCount() >= 1; +} + +bool Logic::CanJumpslashExceptHammer() { + // Not including hammer as hammer jump attacks can be weird; + return CanUse(RG_STICKS) || CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD); +} + +bool Logic::CanJumpslash() { + return CanJumpslashExceptHammer() || CanUse(RG_MEGATON_HAMMER); +} + +bool Logic::CanHitSwitch(EnemyDistance distance, bool inWater) { + bool hit = false; + switch (distance) { + case ED_CLOSE: + case ED_SHORT_JUMPSLASH: + hit = CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MEGATON_HAMMER); + [[fallthrough]]; + case ED_MASTER_SWORD_JUMPSLASH: + hit = hit || CanUse(RG_MASTER_SWORD); + [[fallthrough]]; + case ED_LONG_JUMPSLASH: + hit = hit || CanUse(RG_BIGGORON_SWORD) || CanUse(RG_STICKS); + [[fallthrough]]; + case ED_BOMB_THROW: + hit = hit || (!inWater && CanUse(RG_BOMB_BAG)); + [[fallthrough]]; + case ED_BOOMERANG: + hit = hit || CanUse(RG_BOOMERANG); + [[fallthrough]]; + case ED_HOOKSHOT: + // RANDOTODO test chu range in a practical example + hit = hit || CanUse(RG_HOOKSHOT) || CanUse(RG_BOMBCHU_5); + [[fallthrough]]; + case ED_LONGSHOT: + hit = hit || CanUse(RG_LONGSHOT); + [[fallthrough]]; + case ED_FAR: + hit = hit || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW); + break; + } + return hit; +} + +bool Logic::CanDamage() { + return CanUse(RG_FAIRY_SLINGSHOT) || CanJumpslash() || HasExplosives() || CanUse(RG_DINS_FIRE) || + CanUse(RG_FAIRY_BOW); +} + +bool Logic::CanAttack() { + return CanDamage() || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT); +} + +bool Logic::BombchusEnabled() { + return ctx->GetOption(RSK_BOMBCHU_BAG) ? CheckInventory(ITEM_BOMBCHU, true) : HasItem(RG_BOMB_BAG); +} + +// TODO: Implement Ammo Drop Setting in place of bombchu drops +bool Logic::BombchuRefill() { + return GetInLogic(LOGIC_BUY_BOMBCHUS) || CouldPlayBowling || CarpetMerchant || + (ctx->GetOption(RSK_ENABLE_BOMBCHU_DROPS).Is(RO_AMMO_DROPS_ON /*_PLUS_BOMBCHU*/)); +} + +bool Logic::HookshotOrBoomerang() { + return CanUse(RG_HOOKSHOT) || CanUse(RG_BOOMERANG); +} + +bool Logic::ScarecrowsSong() { + return (ctx->GetOption(RSK_SKIP_SCARECROWS_SONG) && HasItem(RG_FAIRY_OCARINA) && OcarinaButtons() >= 2) || + (ChildScarecrow && AdultScarecrow); +} + +bool Logic::BlueFire() { + return CanUse(RG_BOTTLE_WITH_BLUE_FIRE) || (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && CanUse(RG_ICE_ARROWS)); +} + +bool Logic::CanBreakPots() { + return true; +} + +bool Logic::CanBreakCrates() { + return true; +} + +bool Logic::CanBreakSmallCrates() { + return true; +} + +bool Logic::HasExplosives() { + return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); +} + +bool Logic::BlastOrSmash() { + return HasExplosives() || CanUse(RG_MEGATON_HAMMER); +} + +bool Logic::CanSpawnSoilSkull() { + return IsChild && CanUse(RG_BOTTLE_WITH_BUGS); +} + +bool Logic::CanReflectNuts() { + return CanUse(RG_DEKU_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)); +} + +bool Logic::CanCutShrubs() { + return CanUse(RG_KOKIRI_SWORD) || CanUse(RG_BOOMERANG) || HasExplosives() || CanUse(RG_MASTER_SWORD) || + CanUse(RG_MEGATON_HAMMER) || CanUse(RG_BIGGORON_SWORD) || HasItem(RG_GORONS_BRACELET); +} + +bool Logic::CanStunDeku() { + return CanAttack() || CanUse(RG_NUTS) || CanReflectNuts(); +} + +bool Logic::CanLeaveForest() { + return ctx->GetOption(RSK_FOREST).IsNot(RO_CLOSED_FOREST_ON) || IsAdult || DekuTreeClear || + ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); +} + +bool Logic::CallGossipFairyExceptSuns() { + return CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); +} + +bool Logic::CallGossipFairy() { + return CallGossipFairyExceptSuns() || CanUse(RG_SUNS_SONG); +} + +// the number returned by this is in half heart hits taken. +// RANDOTODO work in OoT side health instead for greater applicability (16 per heart) +uint8_t Logic::EffectiveHealth() { + /* Multiplier will be: + 0 for half daamge + 1 for normal damage + 2 for double damage + 3 for quad damage + 4 for 8* damage + 5 for 16* damage + 10 for OHKO. + This is the number of shifts to apply, not a real multiplier + */ + 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) + + // As 1 is a quarter heart, (1 << Multiplier) is effectivly half-hearts of unmodified damage + // Adds an extra hit if the damage is not exact lethal + ((Hearts() << (2 + HasItem(RG_DOUBLE_DEFENSE))) % (1 << Multiplier) > 0); +} + +uint8_t Logic::Hearts() { + return GetSaveContext()->healthCapacity / 16; +} + +uint8_t Logic::DungeonCount() { + return DekuTreeClear + DodongosCavernClear + JabuJabusBellyClear + ForestTempleClear + FireTempleClear + + WaterTempleClear + SpiritTempleClear + ShadowTempleClear; +} + +uint8_t Logic::StoneCount() { + return HasItem(RG_KOKIRI_EMERALD) + HasItem(RG_GORON_RUBY) + HasItem(RG_ZORA_SAPPHIRE); +} + +uint8_t Logic::MedallionCount() { + return HasItem(RG_FOREST_MEDALLION) + HasItem(RG_FIRE_MEDALLION) + HasItem(RG_WATER_MEDALLION) + + HasItem(RG_SPIRIT_MEDALLION) + HasItem(RG_SHADOW_MEDALLION) + HasItem(RG_LIGHT_MEDALLION); +} + +uint8_t Logic::FireTimer() { + return CanUse(RG_GORON_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; +} + +// Tunic is not required if you are using irons to do something that a simple gold scale dive could do, and you are not +// in water temple. (celing swimming and long walks through water do not count) +uint8_t Logic::WaterTimer() { + return CanUse(RG_ZORA_TUNIC) ? 255 : (ctx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS)) ? (Hearts() * 8) : 0; +} + +bool Logic::TakeDamage() { + return CanUse(RG_BOTTLE_WITH_FAIRY) || EffectiveHealth() != 1 || CanUse(RG_NAYRUS_LOVE); +} + +bool Logic::CanOpenBombGrotto() { + return BlastOrSmash() && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); +} + +bool Logic::CanOpenStormsGrotto() { + return CanUse(RG_SONG_OF_STORMS) && (HasItem(RG_STONE_OF_AGONY) || ctx->GetTrickOption(RT_GROTTOS_WITHOUT_AGONY)); +} + +bool Logic::CanGetNightTimeGS() { + return AtNight && (CanUse(RG_SUNS_SONG) || !ctx->GetOption(RSK_SKULLS_SUNS_SONG)); +} + +bool Logic::CanBreakUpperBeehives() { + return HookshotOrBoomerang() || (ctx->GetTrickOption(RT_BOMBCHU_BEEHIVES) && CanUse(RG_BOMBCHU_5)); +} + +bool Logic::CanBreakLowerBeehives() { + return CanBreakUpperBeehives() || CanUse(RG_BOMB_BAG); +} + +bool Logic::HasFireSource() { + return CanUse(RG_DINS_FIRE) || CanUse(RG_FIRE_ARROWS); +} + +bool Logic::HasFireSourceWithTorch() { + return HasFireSource() || CanUse(RG_STICKS); +} + +// Is this best off signaling what you have already traded, or what step you are currently on? +bool Logic::TradeQuestStep(RandomizerGet rg) { + if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { + return false; // This does not apply when we are shuffling trade items + } + bool hasState = false; + // Falling through each case to test each possibility + switch (rg) { + case RG_POCKET_EGG: + hasState = hasState || HasItem(RG_POCKET_EGG); + [[fallthrough]]; + case RG_COJIRO: + hasState = hasState || HasItem(RG_COJIRO); + [[fallthrough]]; + case RG_ODD_MUSHROOM: + hasState = hasState || HasItem(RG_ODD_MUSHROOM); + [[fallthrough]]; + case RG_ODD_POTION: + hasState = hasState || HasItem(RG_ODD_POTION); + [[fallthrough]]; + case RG_POACHERS_SAW: + hasState = hasState || HasItem(RG_POACHERS_SAW); + [[fallthrough]]; + case RG_BROKEN_SWORD: + hasState = hasState || HasItem(RG_BROKEN_SWORD); + [[fallthrough]]; + case RG_PRESCRIPTION: + hasState = hasState || HasItem(RG_PRESCRIPTION); + [[fallthrough]]; + case RG_EYEDROPS: + hasState = hasState || HasItem(RG_EYEDROPS); + [[fallthrough]]; + case RG_CLAIM_CHECK: + hasState = hasState || HasItem(RG_CLAIM_CHECK); + break; + default: + SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", + static_cast(rg)); + assert(false); + return false; + } + return hasState; +} + +bool Logic::CanFinishGerudoFortress() { + return (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && SmallKeys(RR_GERUDO_FORTRESS, 4) && + CanKillEnemy(RE_GERUDO_WARRIOR) && + (HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || + CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN))) || + (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST) && SmallKeys(RR_GERUDO_FORTRESS, 1) && + CanKillEnemy(RE_GERUDO_WARRIOR)) || + ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE); +} + +bool Logic::CanStandingShield() { + return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); +} + +bool Logic::CanShield() { + return CanUse(RG_MIRROR_SHIELD) || HasItem(RG_HYLIAN_SHIELD) || CanUse(RG_DEKU_SHIELD); +} + +bool Logic::CanUseProjectile() { + return HasExplosives() || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_SLINGSHOT) || + CanUse(RG_BOOMERANG); +} + +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).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->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) { + return SmallKeys(dungeon, requiredAmount, requiredAmount); +} + +bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched) { + if (HasItem(RG_SKELETON_KEY)) { + return true; + } + switch (dungeon) { + case RR_FOREST_TEMPLE: + /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotJump_Boots) >= + static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHoverBoost) >= + static_cast(GlitchDifficulty::NOVICE) || (GetDifficultyValueFromString(GlitchHover) >= + static_cast(GlitchDifficulty::NOVICE) && GetDifficultyValueFromString(GlitchISG) >= + static_cast(GlitchDifficulty::INTERMEDIATE)))) { return ForestTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_FOREST_TEMPLE) >= requiredAmountGlitchless; + + case RR_FIRE_TEMPLE: + /*if (IsGlitched && (GetDifficultyValueFromString(GlitchLedgeClip) >= + static_cast(GlitchDifficulty::INTERMEDIATE) || GetDifficultyValueFromString(GlitchHover) >= + static_cast(GlitchDifficulty::INTERMEDIATE))) { return FireTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_FIRE_TEMPLE) >= requiredAmountGlitchless; + + case RR_WATER_TEMPLE: + /*if (IsGlitched && (false)) { + return WaterTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_WATER_TEMPLE) >= requiredAmountGlitchless; + + case RR_SPIRIT_TEMPLE: + /*if (IsGlitched && (false)) { + return SpiritTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_SPIRIT_TEMPLE) >= requiredAmountGlitchless; + + case RR_SHADOW_TEMPLE: + /*if (IsGlitched && (GetDifficultyValueFromString(GlitchHookshotClip) >= + static_cast(GlitchDifficulty::NOVICE))) { return ShadowTempleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_SHADOW_TEMPLE) >= requiredAmountGlitchless; + + case RR_BOTTOM_OF_THE_WELL: + /*if (IsGlitched && (false)) { + return BottomOfTheWellKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_BOTTOM_OF_THE_WELL) >= requiredAmountGlitchless; + + case RR_GERUDO_TRAINING_GROUND: + /*if (IsGlitched && (false)) { + return GerudoTrainingGroundsKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_GERUDO_TRAINING_GROUND) >= requiredAmountGlitchless; + + case RR_GANONS_CASTLE: + /*if (IsGlitched && (false)) { + return GanonsCastleKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_INSIDE_GANONS_CASTLE) >= requiredAmountGlitchless; + + case RR_MARKET_TREASURE_CHEST_GAME: + /*if (IsGlitched && (false)) { + return TreasureGameKeys >= requiredAmountGlitched; + }*/ + return GetSmallKeyCount(SCENE_TREASURE_BOX_SHOP) >= requiredAmountGlitchless; + + case RR_GERUDO_FORTRESS: + return GetSmallKeyCount(SCENE_THIEVES_HIDEOUT) >= requiredAmountGlitchless; + + default: + return false; + } +} + +std::map Logic::RandoGetToEquipFlag = { + { RG_KOKIRI_SWORD, EQUIP_FLAG_SWORD_KOKIRI }, { RG_MASTER_SWORD, EQUIP_FLAG_SWORD_MASTER }, + { RG_BIGGORON_SWORD, EQUIP_FLAG_SWORD_BGS }, { RG_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, + { RG_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, { RG_MIRROR_SHIELD, EQUIP_FLAG_SHIELD_MIRROR }, + { RG_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, { RG_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, + { RG_BUY_DEKU_SHIELD, EQUIP_FLAG_SHIELD_DEKU }, { RG_BUY_HYLIAN_SHIELD, EQUIP_FLAG_SHIELD_HYLIAN }, + { RG_BUY_GORON_TUNIC, EQUIP_FLAG_TUNIC_GORON }, { RG_BUY_ZORA_TUNIC, EQUIP_FLAG_TUNIC_ZORA }, + { RG_IRON_BOOTS, EQUIP_FLAG_BOOTS_IRON }, { RG_HOVER_BOOTS, EQUIP_FLAG_BOOTS_HOVER } +}; + +std::map Logic::RandoGetToRandInf = { + { RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER }, + { RG_WEIRD_EGG, RAND_INF_WEIRD_EGG }, + { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, + { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, + { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, + { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, + { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, + { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, + { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, + { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, + { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, + { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, + { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, + { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, + { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, + { 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_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 = { + { RG_FOREST_TEMPLE_SMALL_KEY, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_SMALL_KEY, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_SMALL_KEY, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_SMALL_KEY, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_SMALL_KEY, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_SMALL_KEY, SCENE_BOTTOM_OF_THE_WELL }, + { RG_GERUDO_TRAINING_GROUND_SMALL_KEY, SCENE_GERUDO_TRAINING_GROUND }, + { RG_GERUDO_FORTRESS_SMALL_KEY, SCENE_THIEVES_HIDEOUT }, + { RG_GANONS_CASTLE_SMALL_KEY, SCENE_INSIDE_GANONS_CASTLE }, + { RG_FOREST_TEMPLE_KEY_RING, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_KEY_RING, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_KEY_RING, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_KEY_RING, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_KEY_RING, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_KEY_RING, SCENE_BOTTOM_OF_THE_WELL }, + { RG_GERUDO_TRAINING_GROUND_KEY_RING, SCENE_GERUDO_TRAINING_GROUND }, + { RG_GERUDO_FORTRESS_KEY_RING, SCENE_THIEVES_HIDEOUT }, + { RG_GANONS_CASTLE_KEY_RING, SCENE_INSIDE_GANONS_CASTLE }, + { RG_FOREST_TEMPLE_BOSS_KEY, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_BOSS_KEY, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_BOSS_KEY, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_BOSS_KEY, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_BOSS_KEY, SCENE_SHADOW_TEMPLE }, + { RG_GANONS_CASTLE_BOSS_KEY, SCENE_INSIDE_GANONS_CASTLE }, + { RG_DEKU_TREE_MAP, SCENE_DEKU_TREE }, + { RG_DODONGOS_CAVERN_MAP, SCENE_DODONGOS_CAVERN }, + { RG_JABU_JABUS_BELLY_MAP, SCENE_JABU_JABU }, + { RG_FOREST_TEMPLE_MAP, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_MAP, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_MAP, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_MAP, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_MAP, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_MAP, SCENE_BOTTOM_OF_THE_WELL }, + { RG_ICE_CAVERN_MAP, SCENE_ICE_CAVERN }, + { RG_DEKU_TREE_COMPASS, SCENE_DEKU_TREE }, + { RG_DODONGOS_CAVERN_COMPASS, SCENE_DODONGOS_CAVERN }, + { RG_JABU_JABUS_BELLY_COMPASS, SCENE_JABU_JABU }, + { RG_FOREST_TEMPLE_COMPASS, SCENE_FOREST_TEMPLE }, + { RG_FIRE_TEMPLE_COMPASS, SCENE_FIRE_TEMPLE }, + { RG_WATER_TEMPLE_COMPASS, SCENE_WATER_TEMPLE }, + { RG_SPIRIT_TEMPLE_COMPASS, SCENE_SPIRIT_TEMPLE }, + { RG_SHADOW_TEMPLE_COMPASS, SCENE_SHADOW_TEMPLE }, + { RG_BOTTOM_OF_THE_WELL_COMPASS, SCENE_BOTTOM_OF_THE_WELL }, + { RG_ICE_CAVERN_COMPASS, SCENE_ICE_CAVERN }, + { RG_TREASURE_GAME_SMALL_KEY, SCENE_TREASURE_BOX_SHOP } +}; + +std::map Logic::RandoGetToQuestItem = { + { RG_FOREST_MEDALLION, QUEST_MEDALLION_FOREST }, + { RG_FIRE_MEDALLION, QUEST_MEDALLION_FIRE }, + { RG_WATER_MEDALLION, QUEST_MEDALLION_WATER }, + { RG_SPIRIT_MEDALLION, QUEST_MEDALLION_SPIRIT }, + { RG_SHADOW_MEDALLION, QUEST_MEDALLION_SHADOW }, + { RG_LIGHT_MEDALLION, QUEST_MEDALLION_LIGHT }, + { RG_MINUET_OF_FOREST, QUEST_SONG_MINUET }, + { RG_BOLERO_OF_FIRE, QUEST_SONG_BOLERO }, + { RG_SERENADE_OF_WATER, QUEST_SONG_SERENADE }, + { RG_REQUIEM_OF_SPIRIT, QUEST_SONG_REQUIEM }, + { RG_NOCTURNE_OF_SHADOW, QUEST_SONG_NOCTURNE }, + { RG_PRELUDE_OF_LIGHT, QUEST_SONG_PRELUDE }, + { RG_ZELDAS_LULLABY, QUEST_SONG_LULLABY }, + { RG_EPONAS_SONG, QUEST_SONG_EPONA }, + { RG_SARIAS_SONG, QUEST_SONG_SARIA }, + { RG_SUNS_SONG, QUEST_SONG_SUN }, + { RG_SONG_OF_TIME, QUEST_SONG_TIME }, + { RG_SONG_OF_STORMS, QUEST_SONG_STORMS }, + { RG_KOKIRI_EMERALD, QUEST_KOKIRI_EMERALD }, + { RG_GORON_RUBY, QUEST_GORON_RUBY }, + { RG_ZORA_SAPPHIRE, QUEST_ZORA_SAPPHIRE }, + { RG_STONE_OF_AGONY, QUEST_STONE_OF_AGONY }, + { 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 }; + +void Logic::ApplyItemEffect(Item& item, bool state) { + auto randoGet = item.GetRandomizerGet(); + if (item.GetGIEntry()->objectId == OBJECT_GI_STICK) { + SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); + } + if (item.GetGIEntry()->objectId == OBJECT_GI_NUTS) { + SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); + } + switch (item.GetItemType()) { + case ITEMTYPE_ITEM: { + switch (randoGet) { + case RG_STONE_OF_AGONY: + case RG_GERUDO_MEMBERSHIP_CARD: + SetQuestItem(RandoGetToQuestItem.at(randoGet), state); + break; + case RG_WEIRD_EGG: + SetRandoInf(RAND_INF_WEIRD_EGG, state); + break; + case RG_ZELDAS_LETTER: + SetRandoInf(RAND_INF_ZELDAS_LETTER, state); + break; + case RG_DOUBLE_DEFENSE: + mSaveContext->isDoubleDefenseAcquired = state; + break; + case RG_POCKET_EGG: + SetRandoInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state); + break; + case RG_COJIRO: + case RG_ODD_MUSHROOM: + case RG_ODD_POTION: + case RG_POACHERS_SAW: + case RG_BROKEN_SWORD: + case RG_PRESCRIPTION: + case RG_EYEBALL_FROG: + case RG_EYEDROPS: + case RG_CLAIM_CHECK: + SetRandoInf(randoGet - RG_COJIRO + RAND_INF_ADULT_TRADES_HAS_COJIRO, state); + break; + case RG_PROGRESSIVE_HOOKSHOT: { + uint8_t i; + for (i = 0; i < 3; i++) { + if (CurrentInventory(ITEM_HOOKSHOT) == HookshotLookup[i]) { + break; + } + } + auto newItem = i + (!state ? -1 : 1); + if (newItem < 0) { + newItem = 0; + } else if (newItem > 2) { + newItem = 2; + } + SetInventory(ITEM_HOOKSHOT, HookshotLookup[newItem]); + } break; + case RG_PROGRESSIVE_STRENGTH: { + auto currentLevel = CurrentUpgrade(UPG_STRENGTH); + auto newLevel = currentLevel + (!state ? -1 : 1); + SetUpgrade(UPG_STRENGTH, newLevel); + } break; + case RG_PROGRESSIVE_BOMB_BAG: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_BOMB_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_BOMB_BAG, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_BOMB_BAG); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_BOMB, (!state ? ITEM_NONE : ITEM_BOMB)); + } + SetUpgrade(UPG_BOMB_BAG, newLevel); + } break; + case RG_PROGRESSIVE_BOW: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_QUIVER_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_QUIVER, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_QUIVER); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_BOW, (!state ? ITEM_NONE : ITEM_BOW)); + } + SetUpgrade(UPG_QUIVER, newLevel); + } break; + case RG_PROGRESSIVE_SLINGSHOT: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_BULLET_BAG_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_BULLET_BAG, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_BULLET_BAG); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_SLINGSHOT, (!state ? ITEM_NONE : ITEM_SLINGSHOT)); + } + SetUpgrade(UPG_BULLET_BAG, newLevel); + } break; + case RG_PROGRESSIVE_WALLET: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_WALLET_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_MONEY, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_WALLET); + if (!CheckRandoInf(RAND_INF_HAS_WALLET) && state) { + SetRandoInf(RAND_INF_HAS_WALLET, true); + } else if (currentLevel == 0 && !state) { + SetRandoInf(RAND_INF_HAS_WALLET, false); + } else { + auto newLevel = currentLevel + (!state ? -1 : 1); + SetUpgrade(UPG_WALLET, newLevel); + } + } break; + case RG_PROGRESSIVE_SCALE: { + auto currentLevel = CurrentUpgrade(UPG_SCALE); + if (!CheckRandoInf(RAND_INF_CAN_SWIM) && state) { + SetRandoInf(RAND_INF_CAN_SWIM, true); + } else if (currentLevel == 0 && !state) { + SetRandoInf(RAND_INF_CAN_SWIM, false); + } else { + auto newLevel = currentLevel + (!state ? -1 : 1); + SetUpgrade(UPG_SCALE, newLevel); + } + } break; + case RG_PROGRESSIVE_NUT_UPGRADE: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_NUT_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_NUTS); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); + } + SetUpgrade(UPG_NUTS, newLevel); + } break; + case RG_PROGRESSIVE_STICK_UPGRADE: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_STICK_UPGRADE_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE, true); + break; + } + auto currentLevel = CurrentUpgrade(UPG_STICKS); + auto newLevel = currentLevel + (!state ? -1 : 1); + if (currentLevel == 0 && state || currentLevel == 1 && !state) { + SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); + } + SetUpgrade(UPG_STICKS, newLevel); + } break; + case RG_PROGRESSIVE_BOMBCHUS: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_BOMBCHU_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_BOMBCHUS, true); + break; + } + SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); + } break; + case RG_PROGRESSIVE_MAGIC_METER: { + auto realGI = item.GetGIEntry(); + if (realGI->itemId == RG_MAGIC_INF && realGI->modIndex == MOD_RANDOMIZER) { + SetRandoInf(RAND_INF_HAS_INFINITE_MAGIC_METER, true); + break; + } + mSaveContext->magicLevel += (!state ? -1 : 1); + } break; + case RG_PROGRESSIVE_OCARINA: { + uint8_t i; + for (i = 0; i < 3; i++) { + if (CurrentInventory(ITEM_OCARINA_FAIRY) == OcarinaLookup[i]) { + break; + } + } + i += (!state ? -1 : 1); + if (i < 0) { + i = 0; + } else if (i > 2) { + i = 2; + } + SetInventory(ITEM_OCARINA_FAIRY, OcarinaLookup[i]); + } break; + case RG_HEART_CONTAINER: + mSaveContext->healthCapacity += (!state ? -16 : 16); + break; + case RG_PIECE_OF_HEART: + mSaveContext->healthCapacity += (!state ? -4 : 4); + break; + case RG_BOOMERANG: + case RG_LENS_OF_TRUTH: + case RG_MEGATON_HAMMER: + case RG_DINS_FIRE: + case RG_FARORES_WIND: + case RG_NAYRUS_LOVE: + case RG_FIRE_ARROWS: + case RG_ICE_ARROWS: + case RG_LIGHT_ARROWS: + SetInventory(item.GetGIEntry()->itemId, (!state ? ITEM_NONE : item.GetGIEntry()->itemId)); + break; + case RG_MAGIC_BEAN: + case RG_MAGIC_BEAN_PACK: { + auto change = (item.GetRandomizerGet() == RG_MAGIC_BEAN ? 1 : 10); + auto current = GetAmmo(ITEM_BEAN); + SetAmmo(ITEM_BEAN, current + (!state ? -change : change)); + } break; + case RG_EMPTY_BOTTLE: + case RG_BOTTLE_WITH_MILK: + case RG_BOTTLE_WITH_RED_POTION: + case RG_BOTTLE_WITH_GREEN_POTION: + case RG_BOTTLE_WITH_BLUE_POTION: + case RG_BOTTLE_WITH_FAIRY: + case RG_BOTTLE_WITH_FISH: + case RG_BOTTLE_WITH_BLUE_FIRE: + case RG_BOTTLE_WITH_BUGS: + case RG_BOTTLE_WITH_POE: + case RG_BOTTLE_WITH_BIG_POE: { + uint8_t slot = SLOT_BOTTLE_1; + while (slot != SLOT_BOTTLE_4) { + if (mSaveContext->inventory.items[slot] == ITEM_NONE) { + break; + } + slot++; + } + uint16_t itemId = item.GetGIEntry()->itemId; + if (BottleRandomizerGetToItemID.contains(randoGet)) { + itemId = BottleRandomizerGetToItemID[randoGet]; + } + if (randoGet == RG_BOTTLE_WITH_BIG_POE) { + BigPoes++; + } + mSaveContext->inventory.items[slot] = itemId; + } break; + case RG_RUTOS_LETTER: + SetEventChkInf(EVENTCHKINF_OBTAINED_RUTOS_LETTER, state); + break; + case RG_GOHMA_SOUL: + case RG_KING_DODONGO_SOUL: + case RG_BARINADE_SOUL: + case RG_PHANTOM_GANON_SOUL: + case RG_VOLVAGIA_SOUL: + case RG_MORPHA_SOUL: + case RG_BONGO_BONGO_SOUL: + case RG_TWINROVA_SOUL: + case RG_GANON_SOUL: + case RG_OCARINA_A_BUTTON: + case RG_OCARINA_C_UP_BUTTON: + case RG_OCARINA_C_DOWN_BUTTON: + case RG_OCARINA_C_LEFT_BUTTON: + 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->ship.quest.data.randomizer.triforcePiecesCollected += (!state ? -1 : 1); + break; + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); + break; + default: + break; + } + } break; + case ITEMTYPE_EQUIP: { RandomizerGet itemRG = item.GetRandomizerGet(); if (itemRG == RG_GIANTS_KNIFE || itemRG == RG_DEKU_SHIELD || itemRG == RG_HYLIAN_SHIELD) { return; @@ -1811,15 +1894,13 @@ namespace Rando { if (equipId == EQUIP_FLAG_SWORD_BGS) { mSaveContext->bgsFlag = false; } - } - else { + } else { mSaveContext->inventory.equipment |= equipId; if (equipId == EQUIP_FLAG_SWORD_BGS) { mSaveContext->bgsFlag = true; } } - } - break; + } break; case ITEMTYPE_DUNGEONREWARD: case ITEMTYPE_SONG: SetQuestItem(RandoGetToQuestItem.find(item.GetRandomizerGet())->second, state); @@ -1834,8 +1915,7 @@ namespace Rando { SetDungeonItem(DUNGEON_KEY_BOSS, RandoGetToDungeonScene.find(item.GetRandomizerGet())->second, state); break; case ITEMTYPE_FORTRESS_SMALLKEY: - case ITEMTYPE_SMALLKEY: - { + case ITEMTYPE_SMALLKEY: { auto randoGet = item.GetRandomizerGet(); auto keyring = randoGet >= RG_FOREST_TEMPLE_KEY_RING && randoGet <= RG_GANONS_CASTLE_KEY_RING; auto dungeonIndex = RandoGetToDungeonScene.find(randoGet)->second; @@ -1843,16 +1923,13 @@ namespace Rando { if (!state) { if (keyring) { count = 0; - } - else { + } else { count -= 1; } - } - else { + } else { if (keyring) { count = 10; - } - else { + } else { count += 1; } } @@ -1865,589 +1942,590 @@ namespace Rando { break; case ITEMTYPE_DROP: case ITEMTYPE_REFILL: - case ITEMTYPE_SHOP: - { + case ITEMTYPE_SHOP: { RandomizerGet itemRG = item.GetRandomizerGet(); - if (itemRG == RG_BUY_HYLIAN_SHIELD || itemRG == RG_BUY_DEKU_SHIELD || itemRG == RG_BUY_GORON_TUNIC || itemRG == RG_BUY_ZORA_TUNIC) { + if (itemRG == RG_BUY_HYLIAN_SHIELD || itemRG == RG_BUY_DEKU_SHIELD || itemRG == RG_BUY_GORON_TUNIC || + itemRG == RG_BUY_ZORA_TUNIC) { uint32_t equipId = RandoGetToEquipFlag.find(itemRG)->second; if (!state) { mSaveContext->inventory.equipment &= ~equipId; - } - else { + } else { mSaveContext->inventory.equipment |= equipId; } } switch (itemRG) { - case RG_DEKU_NUTS_5: - case RG_DEKU_NUTS_10: - case RG_BUY_DEKU_NUTS_5: - case RG_BUY_DEKU_NUTS_10: - SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); - break; - case RG_DEKU_STICK_1: - case RG_BUY_DEKU_STICK_1: - case RG_STICKS: - SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); - break; - case RG_BOMBCHU_5: - case RG_BOMBCHU_10: - case RG_BOMBCHU_20: - SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); - break; - default: - break; + case RG_DEKU_NUTS_5: + case RG_DEKU_NUTS_10: + case RG_BUY_DEKU_NUTS_5: + case RG_BUY_DEKU_NUTS_10: + SetInventory(ITEM_NUT, (!state ? ITEM_NONE : ITEM_NUT)); + break; + case RG_DEKU_STICK_1: + case RG_BUY_DEKU_STICK_1: + case RG_STICKS: + SetInventory(ITEM_STICK, (!state ? ITEM_NONE : ITEM_STICK)); + break; + case RG_BOMBCHU_5: + case RG_BOMBCHU_10: + case RG_BOMBCHU_20: + SetInventory(ITEM_BOMBCHU, (!state ? ITEM_NONE : ITEM_BOMBCHU)); + break; + default: + break; } } break; - } - } - - SaveContext* Logic::GetSaveContext() { - if (mSaveContext == nullptr) { - NewSaveContext(); - } - return mSaveContext; - } - - void Logic::SetSaveContext(SaveContext* context) { - mSaveContext = context; - } - - void Logic::InitSaveContext() { - mSaveContext->totalDays = 0; - mSaveContext->bgsDayCount = 0; - - mSaveContext->deaths = 0; - for (int i = 0; i < ARRAY_COUNT(mSaveContext->playerName); i++) { - mSaveContext->playerName[i] = 0x3E; - } - mSaveContext->n64ddFlag = 0; - mSaveContext->healthCapacity = 0x30; - mSaveContext->health = 0x30; - mSaveContext->magicLevel = 0; - mSaveContext->magic = 0x30; - mSaveContext->rupees = 0; - mSaveContext->swordHealth = 0; - mSaveContext->naviTimer = 0; - mSaveContext->isMagicAcquired = 0; - mSaveContext->isDoubleMagicAcquired = 0; - mSaveContext->isDoubleDefenseAcquired = 0; - mSaveContext->bgsFlag = 0; - mSaveContext->ocarinaGameRoundNum = 0; - for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.buttonItems); button++) { - mSaveContext->childEquips.buttonItems[button] = ITEM_NONE; - } - for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.cButtonSlots); button++) { - mSaveContext->childEquips.cButtonSlots[button] = SLOT_NONE; - } - mSaveContext->childEquips.equipment = 0; - for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.buttonItems); button++) { - mSaveContext->adultEquips.buttonItems[button] = ITEM_NONE; - } - for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.cButtonSlots); button++) { - mSaveContext->adultEquips.cButtonSlots[button] = SLOT_NONE; - } - mSaveContext->adultEquips.equipment = 0; - mSaveContext->unk_54 = 0; - mSaveContext->savedSceneNum = SCENE_LINKS_HOUSE; - - // Equipment - for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.buttonItems); button++) { - mSaveContext->equips.buttonItems[button] = ITEM_NONE; - } - for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.cButtonSlots); button++) { - mSaveContext->equips.cButtonSlots[button] = SLOT_NONE; - } - mSaveContext->equips.equipment = 0; - - // Inventory - for (int item = 0; item < ARRAY_COUNT(mSaveContext->inventory.items); item++) { - mSaveContext->inventory.items[item] = ITEM_NONE; - } - for (int ammo = 0; ammo < ARRAY_COUNT(mSaveContext->inventory.ammo); ammo++) { - mSaveContext->inventory.ammo[ammo] = 0; - } - mSaveContext->inventory.equipment = 0; - mSaveContext->inventory.upgrades = 0; - mSaveContext->inventory.questItems = 0; - for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonItems); dungeon++) { - mSaveContext->inventory.dungeonItems[dungeon] = 0; - } - for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonKeys); dungeon++) { - mSaveContext->inventory.dungeonKeys[dungeon] = 0x0; - } - mSaveContext->inventory.defenseHearts = 0; - mSaveContext->inventory.gsTokens = 0; - for (int scene = 0; scene < ARRAY_COUNT(mSaveContext->sceneFlags); scene++) { - mSaveContext->sceneFlags[scene].chest = 0; - mSaveContext->sceneFlags[scene].swch = 0; - mSaveContext->sceneFlags[scene].clear = 0; - mSaveContext->sceneFlags[scene].collect = 0; - mSaveContext->sceneFlags[scene].unk = 0; - mSaveContext->sceneFlags[scene].rooms = 0; - mSaveContext->sceneFlags[scene].floors = 0; - } - mSaveContext->fw.pos.x = 0; - mSaveContext->fw.pos.y = 0; - mSaveContext->fw.pos.z = 0; - mSaveContext->fw.yaw = 0; - mSaveContext->fw.playerParams = 0; - mSaveContext->fw.entranceIndex = 0; - mSaveContext->fw.roomIndex = 0; - mSaveContext->fw.set = 0; - mSaveContext->fw.tempSwchFlags = 0; - mSaveContext->fw.tempCollectFlags = 0; - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->gsFlags); flag++) { - mSaveContext->gsFlags[flag] = 0; - } - for (int highscore = 0; highscore < ARRAY_COUNT(mSaveContext->highScores); highscore++) { - mSaveContext->highScores[highscore] = 0; - } - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->eventChkInf); flag++) { - mSaveContext->eventChkInf[flag] = 0; - } - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->itemGetInf); flag++) { - mSaveContext->itemGetInf[flag] = 0; - } - for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->infTable); flag++) { - mSaveContext->infTable[flag] = 0; - } - mSaveContext->worldMapAreaData = 0; - mSaveContext->scarecrowLongSongSet = 0; - for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowLongSong); i++) { - mSaveContext->scarecrowLongSong[i].noteIdx = 0; - mSaveContext->scarecrowLongSong[i].unk_01 = 0; - mSaveContext->scarecrowLongSong[i].unk_02 = 0; - mSaveContext->scarecrowLongSong[i].volume = 0; - mSaveContext->scarecrowLongSong[i].vibrato = 0; - mSaveContext->scarecrowLongSong[i].tone = 0; - mSaveContext->scarecrowLongSong[i].semitone = 0; - } - mSaveContext->scarecrowSpawnSongSet = 0; - for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowSpawnSong); i++) { - mSaveContext->scarecrowSpawnSong[i].noteIdx = 0; - mSaveContext->scarecrowSpawnSong[i].unk_01 = 0; - mSaveContext->scarecrowSpawnSong[i].unk_02 = 0; - mSaveContext->scarecrowSpawnSong[i].volume = 0; - mSaveContext->scarecrowSpawnSong[i].vibrato = 0; - mSaveContext->scarecrowSpawnSong[i].tone = 0; - mSaveContext->scarecrowSpawnSong[i].semitone = 0; - } - - mSaveContext->horseData.scene = SCENE_HYRULE_FIELD; - mSaveContext->horseData.pos.x = -1840; - mSaveContext->horseData.pos.y = 72; - mSaveContext->horseData.pos.z = 5497; - mSaveContext->horseData.angle = -0x6AD9; - mSaveContext->magicLevel = 0; - mSaveContext->infTable[29] = 1; - mSaveContext->sceneFlags[5].swch = 0x40000000; - - // SoH specific - 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->ship.quest.id = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; - - //RANDOTODO (ADD ITEMLOCATIONS TO GSAVECONTEXT) - } - - void Logic::NewSaveContext() { - if (mSaveContext != nullptr && mSaveContext != &gSaveContext) { - free(mSaveContext); - } - mSaveContext = new SaveContext(); - InitSaveContext(); - } - - uint8_t Logic::InventorySlot(uint32_t item) { - return gItemSlots[item]; - } - - uint32_t Logic::CurrentUpgrade(uint32_t upgrade) { - return (mSaveContext->inventory.upgrades & gUpgradeMasks[upgrade]) >> gUpgradeShifts[upgrade]; - } - - uint32_t Logic::CurrentInventory(uint32_t item) { - return mSaveContext->inventory.items[InventorySlot(item)]; - } - - void Logic::SetUpgrade(uint32_t upgrade, uint8_t level) { - mSaveContext->inventory.upgrades &= gUpgradeNegMasks[upgrade]; - mSaveContext->inventory.upgrades |= level << gUpgradeShifts[upgrade]; - } - - bool Logic::CheckInventory(uint32_t item, bool exact) { - auto current = mSaveContext->inventory.items[InventorySlot(item)]; - return exact ? (current == item) : (current != ITEM_NONE); - } - - void Logic::SetInventory(uint32_t itemSlot, uint32_t item) { - mSaveContext->inventory.items[InventorySlot(itemSlot)] = item; - } - - bool Logic::CheckEquipment(uint32_t equipFlag) { - return (equipFlag & mSaveContext->inventory.equipment); - } - - bool Logic::CheckQuestItem(uint32_t item) { - return ((1 << item) & mSaveContext->inventory.questItems); - } - - void Logic::SetQuestItem(uint32_t item, bool state) { - if (!state) { - mSaveContext->inventory.questItems &= ~(1 << item); - } else { - mSaveContext->inventory.questItems |= (1 << item); - } - } - - // Get the swch bit positions for the dungeon - const std::vector& GetDungeonSmallKeyDoors(SceneID sceneId) { - static const std::vector emptyVector; - - auto dungeonInfo = Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(sceneId); - if (dungeonInfo == nullptr) { - return emptyVector; - } - - bool masterQuest = dungeonInfo->IsMQ(); - - // Create a unique key for the dungeon and master quest - uint8_t key = sceneId | (masterQuest << 7); - - static std::unordered_map> dungeonSmallKeyDoors; - auto foundEntry = dungeonSmallKeyDoors.find(key); - if (foundEntry != dungeonSmallKeyDoors.end()) { - return foundEntry->second; - } - dungeonSmallKeyDoors[key] = {}; - - // Get the scene path - SceneTableEntry* sceneTableEntry = &gSceneTable[sceneId]; - std::string scenePath = StringHelper::Sprintf("scenes/%s/%s/%s", masterQuest ? "mq" : "nonmq", - sceneTableEntry->sceneFile.fileName, sceneTableEntry->sceneFile.fileName); - - // Load the scene - std::shared_ptr scene = std::dynamic_pointer_cast( - Ship::Context::GetInstance()->GetResourceManager()->LoadResource(scenePath)); - if (scene == nullptr) { - return emptyVector; - } - - // Find the SetTransitionActorList command - std::shared_ptr transitionActorListCommand = nullptr; - for (auto& command : scene->commands) { - if (command->cmdId == SOH::SceneCommandID::SetTransitionActorList) { - transitionActorListCommand = std::dynamic_pointer_cast(command); - break; - } - } - if (transitionActorListCommand == nullptr) { - return emptyVector; - } - - // Find the bit position for the small key doors - for (auto& transitionActor : transitionActorListCommand->transitionActorList) { - if (transitionActor.id == ACTOR_EN_DOOR) { - uint8_t doorType = (transitionActor.params >> 7) & 7; - if (doorType == DOOR_LOCKED) { - dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); - } - } else if (transitionActor.id == ACTOR_DOOR_SHUTTER) { - uint8_t doorType = (transitionActor.params >> 7) & 15; - if (doorType == SHUTTER_BACK_LOCKED || doorType == SHUTTER_BOSS || doorType == SHUTTER_KEY_LOCKED) { - dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); - } - } - } - - return dungeonSmallKeyDoors[key]; - } - - int8_t GetUsedSmallKeyCount(SceneID sceneId) { - const auto& smallKeyDoors = GetDungeonSmallKeyDoors(sceneId); - - // Get the swch value for the scene - uint32_t swch; - if (gPlayState != nullptr && gPlayState->sceneNum == sceneId) { - swch = gPlayState->actorCtx.flags.swch; - } else { - swch = gSaveContext.sceneFlags[sceneId].swch; - } - - // Count the number of small keys doors unlocked - int8_t unlockedSmallKeyDoors = 0; - for (auto& smallKeyDoor : smallKeyDoors) { - unlockedSmallKeyDoors += swch >> smallKeyDoor & 1; - } - - // RANDOTODO: Account for MQ Water trick that causes the basement lock to unlock when the player clears the stalfos pit. - return unlockedSmallKeyDoors; - } - - uint8_t Logic::GetSmallKeyCount(uint32_t dungeonIndex) { - int8_t dungeonKeys = mSaveContext->inventory.dungeonKeys[dungeonIndex]; - if (dungeonKeys == -1) { - // never got keys, so can't have used keys - return 0; - } - return dungeonKeys + GetUsedSmallKeyCount(SceneID(dungeonIndex)); - } - - void Logic::SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count) { - mSaveContext->inventory.dungeonKeys[dungeonIndex] = count; - } - - bool Logic::CheckDungeonItem(uint32_t item, uint32_t dungeonIndex) { - return mSaveContext->inventory.dungeonItems[dungeonIndex] & gBitFlags[item]; - } - - void Logic::SetDungeonItem(uint32_t item, uint32_t dungeonIndex, bool state) { - if (!state) { - mSaveContext->inventory.dungeonItems[dungeonIndex] &= ~gBitFlags[item]; - } else { - mSaveContext->inventory.dungeonItems[dungeonIndex] |= gBitFlags[item]; - } - } - - bool Logic::CheckRandoInf(uint32_t flag) { - return mSaveContext->ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); - } - - void Logic::SetRandoInf(uint32_t flag, bool state) { - if (!state) { - mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); - } else { - mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); - } - } - - bool Logic::CheckEventChkInf(int32_t flag) { - return mSaveContext->eventChkInf[flag >> 4] & (1 << (flag & 0xF)); - } - - void Logic::SetEventChkInf(int32_t flag, bool state) { - if (!state) { - mSaveContext->eventChkInf[flag >> 4] &= ~(1 << (flag & 0xF)); - } else { - mSaveContext->eventChkInf[flag >> 4] |= (1 << (flag & 0xF)); - } - } - - uint8_t Logic::GetGSCount() { - return mSaveContext->inventory.gsTokens; - } - - uint8_t Logic::GetAmmo(uint32_t item) { - return mSaveContext->inventory.ammo[gItemSlots[item]]; - } - - void Logic::SetAmmo(uint32_t item, uint8_t count) { - mSaveContext->inventory.ammo[gItemSlots[item]] = count; - } - - void Logic::SetContext(std::shared_ptr _ctx) { - ctx = _ctx; - } - - bool Logic::GetInLogic(LogicVal logicVal) { - return inLogic[logicVal]; - } - - void Logic::SetInLogic(LogicVal logicVal, bool value) { - inLogic[logicVal] = value; - } - - void Logic::Reset() { - NewSaveContext(); - StartPerformanceTimer(PT_LOGIC_RESET); - memset(inLogic, false, sizeof(inLogic)); - //Settings-dependent variables - IsKeysanity = ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || - ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || - ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE); - - //AmmoCanDrop = /*AmmoDrops.IsNot(AMMODROPS_NONE)*/ false; TODO: AmmoDrop setting - - //Child item logic - SkullMask = false; - MaskOfTruth = false; - - //Adult logic - FreedEpona = false; - //BigPoe = false; - - //Trade Quest Events - WakeUpAdultTalon = false; - - //Dungeon Clears - DekuTreeClear = false; - DodongosCavernClear = false; - JabuJabusBellyClear = false; - ForestTempleClear = false; - FireTempleClear = false; - WaterTempleClear = false; - SpiritTempleClear = false; - ShadowTempleClear = false; - - //Trial Clears - ForestTrialClear = false; - FireTrialClear = false; - WaterTrialClear = false; - SpiritTrialClear = false; - ShadowTrialClear = false; - LightTrialClear = false; - - //Ocarina C Buttons - bool ocBtnShuffle = ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS).Is(true); - SetRandoInf(RAND_INF_HAS_OCARINA_A, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_UP, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_DOWN, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_LEFT, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_RIGHT, !ocBtnShuffle); - - //Progressive Items - SetUpgrade(UPG_STICKS, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Is(true) ? 0 : 1); - SetUpgrade(UPG_NUTS, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Is(true) ? 0 : 1); - - //If we're not shuffling swim, we start with it - if (ctx->GetOption(RSK_SHUFFLE_SWIM).Is(false)) { - SetRandoInf(RAND_INF_CAN_SWIM, true); - } - - //If we're not shuffling child's wallet, we start with it - if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET).Is(false)) { - SetRandoInf(RAND_INF_HAS_WALLET, true); - } - - //If we're not shuffling fishing pole, we start with it - if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE).Is(false)) { - SetRandoInf(RAND_INF_FISHING_POLE_FOUND, true); - } - - //If not keysanity, start with 1 logical key to account for automatically unlocking the basement door in vanilla FiT - if (!IsKeysanity && ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla()) { - SetSmallKeyCount(SCENE_FIRE_TEMPLE, 1); - } - - //Bottle Count - Bottles = 0; - NumBottles = 0; - CanEmptyBigPoes = false; - CouldEmptyBigPoes = false; - - //Drops and Bottle Contents Access - NutPot = false; - NutCrate = false; - DekuBabaNuts = false; - StickPot = false; - DekuBabaSticks = false; - BugShrub = false; - WanderingBugs = false; - BugRock = false; - BlueFireAccess = false; - FishGroup = false; - LoneFish = false; - GossipStoneFairy = false; - BeanPlantFairy = false; - ButterflyFairy = false; - FairyPot = false; - FreeFairies = false; - FairyPond = false; - - PieceOfHeart = 0; - HeartContainer = 0; - - /* --- HELPERS, EVENTS, AND LOCATION ACCESS --- */ - /* These are used to simplify reading the logic, but need to be updated - / every time a base value is updated. */ - - ChildScarecrow = false; - AdultScarecrow = false; - - CouldPlayBowling = false; - IsChild = false; - IsAdult = false; - //CanPlantBean = false; - BigPoeKill = false; - BigPoes = 0; - - BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() + 1; - - - //Bridge Requirements - BuiltRainbowBridge = false; - - //Other - AtDay = false; - AtNight = false; - GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); - - //Events - ShowedMidoSwordAndShield = false; - CarpenterRescue = false; - GF_GateOpen = false; - GtG_GateOpen = false; - DampesWindmillAccess = false; - DrainWell = false; - GoronCityChildFire = false; - GCWoodsWarpOpen = false; - GCDaruniasDoorOpenChild = false; - StopGCRollingGoronAsAdult = false; - CanWaterTempleLowFromHigh = false; - CanWaterTempleLowFromMid = false; - CanWaterTempleMiddle = false; - CanWaterTempleHigh = false; - KakarikoVillageGateOpen = false; - KingZoraThawed = false; - ForestTempleJoelle = false; - ForestTempleBeth = false; - ForestTempleAmy = false; - ForestTempleMeg = false; - FireLoopSwitch = false; - LinksCow = false; - DeliverLetter = false; - ClearMQDCUpperLobbyRocks = false; - LoweredWaterInsideBotw = false; - OpenedWestRoomMQBotw = false; - OpenedMiddleHoleMQBotw = false; - BrokeDeku1FWeb = false; - ClearedMQDekuSERoom = false; - MQDekuWaterRoomTorches = false; - PushedDekuBasementBlock = false; - OpenedLowestGoronCage = false; - OpenedUpperFireShortcut = false; - HitFireTemplePlatform = false; - OpenedFireMQFireMazeDoor = false; - MQForestBlockRoomTargets = false; - ForestCanTwistHallway = false; - ForestClearBelowBowChest = false; - ForestOpenBossCorridor = false; - ShadowTrialFirstChest = false; - MQGTGMazeSwitch = false; - GTGPlatformSilverRupees = false; - MQJabuHolesRoomDoor = false; - JabuWestTentacle = false; - JabuEastTentacle = false; - JabuNorthTentacle = false; - LoweredJabuPath = false; - MQJabuLiftRoomCow = false; - MQShadowFloorSpikeRupees = false; - ShadowShortcutBlock = false; - MQWaterStalfosPit = false; - MQWaterDragonTorches = false; - MQWaterB1Switch = false; - //MQWaterPillarSoTBlock = false; - MQWaterOpenedPillarB1 = false; - MQSpiritCrawlBoulder = false; - MQSpiritMapRoomEnemies = false; - MQSpirit3SunsEnemies = false; - Spirit1FSilverRupees = false; - JabuRutoIn1F = false; - - StopPerformanceTimer(PT_LOGIC_RESET); } } + +SaveContext* Logic::GetSaveContext() { + if (mSaveContext == nullptr) { + NewSaveContext(); + } + return mSaveContext; +} + +void Logic::SetSaveContext(SaveContext* context) { + mSaveContext = context; +} + +void Logic::InitSaveContext() { + mSaveContext->totalDays = 0; + mSaveContext->bgsDayCount = 0; + + mSaveContext->deaths = 0; + for (int i = 0; i < ARRAY_COUNT(mSaveContext->playerName); i++) { + mSaveContext->playerName[i] = 0x3E; + } + mSaveContext->n64ddFlag = 0; + mSaveContext->healthCapacity = 0x30; + mSaveContext->health = 0x30; + mSaveContext->magicLevel = 0; + mSaveContext->magic = 0x30; + mSaveContext->rupees = 0; + mSaveContext->swordHealth = 0; + mSaveContext->naviTimer = 0; + mSaveContext->isMagicAcquired = 0; + mSaveContext->isDoubleMagicAcquired = 0; + mSaveContext->isDoubleDefenseAcquired = 0; + mSaveContext->bgsFlag = 0; + mSaveContext->ocarinaGameRoundNum = 0; + for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.buttonItems); button++) { + mSaveContext->childEquips.buttonItems[button] = ITEM_NONE; + } + for (int button = 0; button < ARRAY_COUNT(mSaveContext->childEquips.cButtonSlots); button++) { + mSaveContext->childEquips.cButtonSlots[button] = SLOT_NONE; + } + mSaveContext->childEquips.equipment = 0; + for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.buttonItems); button++) { + mSaveContext->adultEquips.buttonItems[button] = ITEM_NONE; + } + for (int button = 0; button < ARRAY_COUNT(mSaveContext->adultEquips.cButtonSlots); button++) { + mSaveContext->adultEquips.cButtonSlots[button] = SLOT_NONE; + } + mSaveContext->adultEquips.equipment = 0; + mSaveContext->unk_54 = 0; + mSaveContext->savedSceneNum = SCENE_LINKS_HOUSE; + + // Equipment + for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.buttonItems); button++) { + mSaveContext->equips.buttonItems[button] = ITEM_NONE; + } + for (int button = 0; button < ARRAY_COUNT(mSaveContext->equips.cButtonSlots); button++) { + mSaveContext->equips.cButtonSlots[button] = SLOT_NONE; + } + mSaveContext->equips.equipment = 0; + + // Inventory + for (int item = 0; item < ARRAY_COUNT(mSaveContext->inventory.items); item++) { + mSaveContext->inventory.items[item] = ITEM_NONE; + } + for (int ammo = 0; ammo < ARRAY_COUNT(mSaveContext->inventory.ammo); ammo++) { + mSaveContext->inventory.ammo[ammo] = 0; + } + mSaveContext->inventory.equipment = 0; + mSaveContext->inventory.upgrades = 0; + mSaveContext->inventory.questItems = 0; + for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonItems); dungeon++) { + mSaveContext->inventory.dungeonItems[dungeon] = 0; + } + for (int dungeon = 0; dungeon < ARRAY_COUNT(mSaveContext->inventory.dungeonKeys); dungeon++) { + mSaveContext->inventory.dungeonKeys[dungeon] = 0x0; + } + mSaveContext->inventory.defenseHearts = 0; + mSaveContext->inventory.gsTokens = 0; + for (int scene = 0; scene < ARRAY_COUNT(mSaveContext->sceneFlags); scene++) { + mSaveContext->sceneFlags[scene].chest = 0; + mSaveContext->sceneFlags[scene].swch = 0; + mSaveContext->sceneFlags[scene].clear = 0; + mSaveContext->sceneFlags[scene].collect = 0; + mSaveContext->sceneFlags[scene].unk = 0; + mSaveContext->sceneFlags[scene].rooms = 0; + mSaveContext->sceneFlags[scene].floors = 0; + } + mSaveContext->fw.pos.x = 0; + mSaveContext->fw.pos.y = 0; + mSaveContext->fw.pos.z = 0; + mSaveContext->fw.yaw = 0; + mSaveContext->fw.playerParams = 0; + mSaveContext->fw.entranceIndex = 0; + mSaveContext->fw.roomIndex = 0; + mSaveContext->fw.set = 0; + mSaveContext->fw.tempSwchFlags = 0; + mSaveContext->fw.tempCollectFlags = 0; + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->gsFlags); flag++) { + mSaveContext->gsFlags[flag] = 0; + } + for (int highscore = 0; highscore < ARRAY_COUNT(mSaveContext->highScores); highscore++) { + mSaveContext->highScores[highscore] = 0; + } + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->eventChkInf); flag++) { + mSaveContext->eventChkInf[flag] = 0; + } + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->itemGetInf); flag++) { + mSaveContext->itemGetInf[flag] = 0; + } + for (int flag = 0; flag < ARRAY_COUNT(mSaveContext->infTable); flag++) { + mSaveContext->infTable[flag] = 0; + } + mSaveContext->worldMapAreaData = 0; + mSaveContext->scarecrowLongSongSet = 0; + for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowLongSong); i++) { + mSaveContext->scarecrowLongSong[i].noteIdx = 0; + mSaveContext->scarecrowLongSong[i].unk_01 = 0; + mSaveContext->scarecrowLongSong[i].unk_02 = 0; + mSaveContext->scarecrowLongSong[i].volume = 0; + mSaveContext->scarecrowLongSong[i].vibrato = 0; + mSaveContext->scarecrowLongSong[i].tone = 0; + mSaveContext->scarecrowLongSong[i].semitone = 0; + } + mSaveContext->scarecrowSpawnSongSet = 0; + for (int i = 0; i < ARRAY_COUNT(mSaveContext->scarecrowSpawnSong); i++) { + mSaveContext->scarecrowSpawnSong[i].noteIdx = 0; + mSaveContext->scarecrowSpawnSong[i].unk_01 = 0; + mSaveContext->scarecrowSpawnSong[i].unk_02 = 0; + mSaveContext->scarecrowSpawnSong[i].volume = 0; + mSaveContext->scarecrowSpawnSong[i].vibrato = 0; + mSaveContext->scarecrowSpawnSong[i].tone = 0; + mSaveContext->scarecrowSpawnSong[i].semitone = 0; + } + + mSaveContext->horseData.scene = SCENE_HYRULE_FIELD; + mSaveContext->horseData.pos.x = -1840; + mSaveContext->horseData.pos.y = 72; + mSaveContext->horseData.pos.z = 5497; + mSaveContext->horseData.angle = -0x6AD9; + mSaveContext->magicLevel = 0; + mSaveContext->infTable[29] = 1; + mSaveContext->sceneFlags[5].swch = 0x40000000; + + // SoH specific + 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->ship.quest.id = OTRGlobals::Instance->HasOriginal() ? QUEST_NORMAL : QUEST_MASTER; + + // RANDOTODO (ADD ITEMLOCATIONS TO GSAVECONTEXT) +} + +void Logic::NewSaveContext() { + if (mSaveContext != nullptr && mSaveContext != &gSaveContext) { + free(mSaveContext); + } + mSaveContext = new SaveContext(); + InitSaveContext(); +} + +uint8_t Logic::InventorySlot(uint32_t item) { + return gItemSlots[item]; +} + +uint32_t Logic::CurrentUpgrade(uint32_t upgrade) { + return (mSaveContext->inventory.upgrades & gUpgradeMasks[upgrade]) >> gUpgradeShifts[upgrade]; +} + +uint32_t Logic::CurrentInventory(uint32_t item) { + return mSaveContext->inventory.items[InventorySlot(item)]; +} + +void Logic::SetUpgrade(uint32_t upgrade, uint8_t level) { + mSaveContext->inventory.upgrades &= gUpgradeNegMasks[upgrade]; + mSaveContext->inventory.upgrades |= level << gUpgradeShifts[upgrade]; +} + +bool Logic::CheckInventory(uint32_t item, bool exact) { + auto current = mSaveContext->inventory.items[InventorySlot(item)]; + return exact ? (current == item) : (current != ITEM_NONE); +} + +void Logic::SetInventory(uint32_t itemSlot, uint32_t item) { + mSaveContext->inventory.items[InventorySlot(itemSlot)] = item; +} + +bool Logic::CheckEquipment(uint32_t equipFlag) { + return (equipFlag & mSaveContext->inventory.equipment); +} + +bool Logic::CheckQuestItem(uint32_t item) { + return ((1 << item) & mSaveContext->inventory.questItems); +} + +void Logic::SetQuestItem(uint32_t item, bool state) { + if (!state) { + mSaveContext->inventory.questItems &= ~(1 << item); + } else { + mSaveContext->inventory.questItems |= (1 << item); + } +} + +// Get the swch bit positions for the dungeon +const std::vector& GetDungeonSmallKeyDoors(SceneID sceneId) { + static const std::vector emptyVector; + + auto dungeonInfo = Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(sceneId); + if (dungeonInfo == nullptr) { + return emptyVector; + } + + bool masterQuest = dungeonInfo->IsMQ(); + + // Create a unique key for the dungeon and master quest + uint8_t key = sceneId | (masterQuest << 7); + + static std::unordered_map> dungeonSmallKeyDoors; + auto foundEntry = dungeonSmallKeyDoors.find(key); + if (foundEntry != dungeonSmallKeyDoors.end()) { + return foundEntry->second; + } + dungeonSmallKeyDoors[key] = {}; + + // Get the scene path + SceneTableEntry* sceneTableEntry = &gSceneTable[sceneId]; + std::string scenePath = + StringHelper::Sprintf("scenes/%s/%s/%s", masterQuest ? "mq" : "nonmq", sceneTableEntry->sceneFile.fileName, + sceneTableEntry->sceneFile.fileName); + + // Load the scene + std::shared_ptr scene = std::dynamic_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResource(scenePath)); + if (scene == nullptr) { + return emptyVector; + } + + // Find the SetTransitionActorList command + std::shared_ptr transitionActorListCommand = nullptr; + for (auto& command : scene->commands) { + if (command->cmdId == SOH::SceneCommandID::SetTransitionActorList) { + transitionActorListCommand = std::dynamic_pointer_cast(command); + break; + } + } + if (transitionActorListCommand == nullptr) { + return emptyVector; + } + + // Find the bit position for the small key doors + for (auto& transitionActor : transitionActorListCommand->transitionActorList) { + if (transitionActor.id == ACTOR_EN_DOOR) { + uint8_t doorType = (transitionActor.params >> 7) & 7; + if (doorType == DOOR_LOCKED) { + dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); + } + } else if (transitionActor.id == ACTOR_DOOR_SHUTTER) { + uint8_t doorType = (transitionActor.params >> 7) & 15; + if (doorType == SHUTTER_BACK_LOCKED || doorType == SHUTTER_BOSS || doorType == SHUTTER_KEY_LOCKED) { + dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); + } + } + } + + return dungeonSmallKeyDoors[key]; +} + +int8_t GetUsedSmallKeyCount(SceneID sceneId) { + const auto& smallKeyDoors = GetDungeonSmallKeyDoors(sceneId); + + // Get the swch value for the scene + uint32_t swch; + if (gPlayState != nullptr && gPlayState->sceneNum == sceneId) { + swch = gPlayState->actorCtx.flags.swch; + } else { + swch = gSaveContext.sceneFlags[sceneId].swch; + } + + // Count the number of small keys doors unlocked + int8_t unlockedSmallKeyDoors = 0; + for (auto& smallKeyDoor : smallKeyDoors) { + unlockedSmallKeyDoors += swch >> smallKeyDoor & 1; + } + + // RANDOTODO: Account for MQ Water trick that causes the basement lock to unlock when the player clears the stalfos + // pit. + return unlockedSmallKeyDoors; +} + +uint8_t Logic::GetSmallKeyCount(uint32_t dungeonIndex) { + int8_t dungeonKeys = mSaveContext->inventory.dungeonKeys[dungeonIndex]; + if (dungeonKeys == -1) { + // never got keys, so can't have used keys + return 0; + } + return dungeonKeys + GetUsedSmallKeyCount(SceneID(dungeonIndex)); +} + +void Logic::SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count) { + mSaveContext->inventory.dungeonKeys[dungeonIndex] = count; +} + +bool Logic::CheckDungeonItem(uint32_t item, uint32_t dungeonIndex) { + return mSaveContext->inventory.dungeonItems[dungeonIndex] & gBitFlags[item]; +} + +void Logic::SetDungeonItem(uint32_t item, uint32_t dungeonIndex, bool state) { + if (!state) { + mSaveContext->inventory.dungeonItems[dungeonIndex] &= ~gBitFlags[item]; + } else { + mSaveContext->inventory.dungeonItems[dungeonIndex] |= gBitFlags[item]; + } +} + +bool Logic::CheckRandoInf(uint32_t flag) { + return mSaveContext->ship.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); +} + +void Logic::SetRandoInf(uint32_t flag, bool state) { + if (!state) { + mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF)); + } else { + mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); + } +} + +bool Logic::CheckEventChkInf(int32_t flag) { + return mSaveContext->eventChkInf[flag >> 4] & (1 << (flag & 0xF)); +} + +void Logic::SetEventChkInf(int32_t flag, bool state) { + if (!state) { + mSaveContext->eventChkInf[flag >> 4] &= ~(1 << (flag & 0xF)); + } else { + mSaveContext->eventChkInf[flag >> 4] |= (1 << (flag & 0xF)); + } +} + +uint8_t Logic::GetGSCount() { + return mSaveContext->inventory.gsTokens; +} + +uint8_t Logic::GetAmmo(uint32_t item) { + return mSaveContext->inventory.ammo[gItemSlots[item]]; +} + +void Logic::SetAmmo(uint32_t item, uint8_t count) { + mSaveContext->inventory.ammo[gItemSlots[item]] = count; +} + +void Logic::SetContext(std::shared_ptr _ctx) { + ctx = _ctx; +} + +bool Logic::GetInLogic(LogicVal logicVal) { + return inLogic[logicVal]; +} + +void Logic::SetInLogic(LogicVal logicVal, bool value) { + inLogic[logicVal] = value; +} + +void Logic::Reset() { + NewSaveContext(); + StartPerformanceTimer(PT_LOGIC_RESET); + memset(inLogic, false, sizeof(inLogic)); + // Settings-dependent variables + IsKeysanity = ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE) || + ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_ANYWHERE); + + // AmmoCanDrop = /*AmmoDrops.IsNot(AMMODROPS_NONE)*/ false; TODO: AmmoDrop setting + + // Child item logic + SkullMask = false; + MaskOfTruth = false; + + // Adult logic + FreedEpona = false; + // BigPoe = false; + + // Trade Quest Events + WakeUpAdultTalon = false; + + // Dungeon Clears + DekuTreeClear = false; + DodongosCavernClear = false; + JabuJabusBellyClear = false; + ForestTempleClear = false; + FireTempleClear = false; + WaterTempleClear = false; + SpiritTempleClear = false; + ShadowTempleClear = false; + + // Trial Clears + ForestTrialClear = false; + FireTrialClear = false; + WaterTrialClear = false; + SpiritTrialClear = false; + ShadowTrialClear = false; + LightTrialClear = false; + + // Ocarina C Buttons + bool ocBtnShuffle = ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS).Is(true); + SetRandoInf(RAND_INF_HAS_OCARINA_A, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_UP, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_DOWN, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_LEFT, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_RIGHT, !ocBtnShuffle); + + // Progressive Items + SetUpgrade(UPG_STICKS, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Is(true) ? 0 : 1); + SetUpgrade(UPG_NUTS, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Is(true) ? 0 : 1); + + // If we're not shuffling swim, we start with it + if (ctx->GetOption(RSK_SHUFFLE_SWIM).Is(false)) { + SetRandoInf(RAND_INF_CAN_SWIM, true); + } + + // If we're not shuffling child's wallet, we start with it + if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET).Is(false)) { + SetRandoInf(RAND_INF_HAS_WALLET, true); + } + + // If we're not shuffling fishing pole, we start with it + if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE).Is(false)) { + SetRandoInf(RAND_INF_FISHING_POLE_FOUND, true); + } + + // If not keysanity, start with 1 logical key to account for automatically unlocking the basement door in vanilla + // FiT + if (!IsKeysanity && ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla()) { + SetSmallKeyCount(SCENE_FIRE_TEMPLE, 1); + } + + // Bottle Count + Bottles = 0; + NumBottles = 0; + CanEmptyBigPoes = false; + CouldEmptyBigPoes = false; + + // Drops and Bottle Contents Access + NutPot = false; + NutCrate = false; + DekuBabaNuts = false; + StickPot = false; + DekuBabaSticks = false; + BugShrub = false; + WanderingBugs = false; + BugRock = false; + BlueFireAccess = false; + FishGroup = false; + LoneFish = false; + GossipStoneFairy = false; + BeanPlantFairy = false; + ButterflyFairy = false; + FairyPot = false; + FreeFairies = false; + FairyPond = false; + + PieceOfHeart = 0; + HeartContainer = 0; + + /* --- HELPERS, EVENTS, AND LOCATION ACCESS --- */ + /* These are used to simplify reading the logic, but need to be updated + / every time a base value is updated. */ + + ChildScarecrow = false; + AdultScarecrow = false; + + CouldPlayBowling = false; + IsChild = false; + IsAdult = false; + // CanPlantBean = false; + BigPoeKill = false; + BigPoes = 0; + + BaseHearts = ctx->GetOption(RSK_STARTING_HEARTS).Get() + 1; + + // Bridge Requirements + BuiltRainbowBridge = false; + + // Other + AtDay = false; + AtNight = false; + GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); + + // Events + ShowedMidoSwordAndShield = false; + CarpenterRescue = false; + GF_GateOpen = false; + GtG_GateOpen = false; + DampesWindmillAccess = false; + DrainWell = false; + GoronCityChildFire = false; + GCWoodsWarpOpen = false; + GCDaruniasDoorOpenChild = false; + StopGCRollingGoronAsAdult = false; + CanWaterTempleLowFromHigh = false; + CanWaterTempleLowFromMid = false; + CanWaterTempleMiddle = false; + CanWaterTempleHigh = false; + KakarikoVillageGateOpen = false; + KingZoraThawed = false; + ForestTempleJoelle = false; + ForestTempleBeth = false; + ForestTempleAmy = false; + ForestTempleMeg = false; + FireLoopSwitch = false; + LinksCow = false; + DeliverLetter = false; + ClearMQDCUpperLobbyRocks = false; + LoweredWaterInsideBotw = false; + OpenedWestRoomMQBotw = false; + OpenedMiddleHoleMQBotw = false; + BrokeDeku1FWeb = false; + ClearedMQDekuSERoom = false; + MQDekuWaterRoomTorches = false; + PushedDekuBasementBlock = false; + OpenedLowestGoronCage = false; + OpenedUpperFireShortcut = false; + HitFireTemplePlatform = false; + OpenedFireMQFireMazeDoor = false; + MQForestBlockRoomTargets = false; + ForestCanTwistHallway = false; + ForestClearBelowBowChest = false; + ForestOpenBossCorridor = false; + ShadowTrialFirstChest = false; + MQGTGMazeSwitch = false; + GTGPlatformSilverRupees = false; + MQJabuHolesRoomDoor = false; + JabuWestTentacle = false; + JabuEastTentacle = false; + JabuNorthTentacle = false; + LoweredJabuPath = false; + MQJabuLiftRoomCow = false; + MQShadowFloorSpikeRupees = false; + ShadowShortcutBlock = false; + MQWaterStalfosPit = false; + MQWaterDragonTorches = false; + MQWaterB1Switch = false; + // MQWaterPillarSoTBlock = false; + MQWaterOpenedPillarB1 = false; + MQSpiritCrawlBoulder = false; + MQSpiritMapRoomEnemies = false; + MQSpirit3SunsEnemies = false; + Spirit1FSilverRupees = false; + JabuRutoIn1F = false; + + StopPerformanceTimer(PT_LOGIC_RESET); +} +} // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 5b0922d6e..4549c9952 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -64,12 +64,13 @@ class Logic { // Bottle Count uint8_t Bottles = 0; uint8_t NumBottles = 0; - //this event covers if the player can currently empty big poes in logic + // this event covers if the player can currently empty big poes in logic bool CanEmptyBigPoes = false; - //this event covers if the player could, if they filled their bottle with big poes in field, empty them at the poe merchant. - //Works in tandem with the big poes safety check during entrance validation + // this event covers if the player could, if they filled their bottle with big poes in field, empty them at the poe + // merchant. Works in tandem with the big poes safety check during entrance validation bool CouldEmptyBigPoes = false; - //this check is used to tell logic that we are checking big poes accessibility in logic, to ensure it's not bottle-locked. + // this check is used to tell logic that we are checking big poes accessibility in logic, to ensure it's not + // bottle-locked. bool AreCheckingBigPoes = false; // Drops and Bottle Contents Access @@ -154,7 +155,7 @@ class Logic { bool OpenedFireMQFireMazeDoor = false; bool MQForestBlockRoomTargets = false; bool ForestCanTwistHallway = false; - bool ForestClearBelowBowChest = false; //a better name that covers both versions would be nice + bool ForestClearBelowBowChest = false; // a better name that covers both versions would be nice bool ForestOpenBossCorridor = false; bool ShadowTrialFirstChest = false; bool MQGTGMazeSwitch = false; @@ -171,7 +172,7 @@ class Logic { bool MQWaterStalfosPit = false; bool MQWaterDragonTorches = false; bool MQWaterB1Switch = false; - //bool MQWaterPillarSoTBlock = false; should be irrelevant. SHOULD. + // bool MQWaterPillarSoTBlock = false; should be irrelevant. SHOULD. bool MQWaterOpenedPillarB1 = false; bool MQSpiritCrawlBoulder = false; bool MQSpiritMapRoomEnemies = false; @@ -193,7 +194,8 @@ class Logic { bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); bool CanDoGlitch(GlitchType glitch); bool CanEquipSwap(RandomizerGet itemName); - bool CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true, uint8_t quantity = 1, bool timer = false, bool inWater = false); + bool CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true, + uint8_t quantity = 1, bool timer = false, bool inWater = false); bool CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true); bool CanAvoidEnemy(RandomizerEnemy enemy, bool grounded = false, uint8_t quantity = 1); bool CanGetEnemyDrop(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool aboveLink = false); diff --git a/soh/soh/Enhancements/randomizer/option.cpp b/soh/soh/Enhancements/randomizer/option.cpp index 84fc4c28b..43fcc2f65 100644 --- a/soh/soh/Enhancements/randomizer/option.cpp +++ b/soh/soh/Enhancements/randomizer/option.cpp @@ -10,29 +10,30 @@ namespace Rando { 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_}; + return { static_cast(key_), 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::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_), + return Option(key_, std::move(name_), { "Off", "On" }, OptionCategory::Setting, std::move(cvarName_), std::move(description_), widgetType_, defaultOption_, false, imFlags_); } 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_}; + return { static_cast(key_), std::move(name_), std::move(options_), category_, std::move(cvarName_), + std::move(description_), widgetType_, defaultOption_, defaultHidden_, imFlags_ }; } Option Option::LogicTrick(RandomizerTrick rt_, std::string name_) { - return Option(rt_, std::move(name_), { "Disabled", "Enabled" }, OptionCategory::Setting, "", - "", WidgetType::Checkbox, 0, false, IMFLAG_NONE); + return Option(rt_, std::move(name_), { "Disabled", "Enabled" }, OptionCategory::Setting, "", "", + WidgetType::Checkbox, 0, false, IMFLAG_NONE); } -OptionValue::OptionValue(uint8_t val) : mVal(val) {} +OptionValue::OptionValue(uint8_t val) : mVal(val) { +} uint8_t OptionValue::Get() { return mVal; @@ -169,7 +170,7 @@ uint8_t Option::GetValueFromText(const std::string text) { } void Option::SetContextIndexFromText(const std::string text) { - if (optionsTextToVar.contains(text)){ + if (optionsTextToVar.contains(text)) { SetContextIndex(optionsTextToVar[text]); } else { SPDLOG_ERROR("Option {} does not have a var named {}.", name, text); @@ -191,7 +192,8 @@ Option::Option(size_t key_, std::string name_, std::vector options_ bool Option::RenderCheckbox() { bool changed = false; bool val = static_cast(CVarGetInteger(cvarName.c_str(), defaultOption)); - UIWidgets::CheckboxOptions widgetOptions = static_cast(UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip(description.c_str())); + UIWidgets::CheckboxOptions widgetOptions = static_cast( + UIWidgets::CheckboxOptions().Color(THEME_COLOR).Tooltip(description.c_str())); widgetOptions.disabled = disabled; if (UIWidgets::Checkbox(name.c_str(), &val, widgetOptions)) { CVarSetInteger(cvarName.c_str(), val); @@ -210,12 +212,14 @@ bool Option::RenderCombobox() { changed = true; Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - UIWidgets::ComboboxOptions widgetOptions = UIWidgets::ComboboxOptions().Color(THEME_COLOR).Tooltip(description.c_str()); + UIWidgets::ComboboxOptions widgetOptions = + UIWidgets::ComboboxOptions().Color(THEME_COLOR).Tooltip(description.c_str()); if (this->GetKey() == RSK_LOGIC_RULES) { - widgetOptions = widgetOptions.LabelPosition(UIWidgets::LabelPositions::None).ComponentAlignment(UIWidgets::ComponentAlignments::Right); + widgetOptions = widgetOptions.LabelPosition(UIWidgets::LabelPositions::None) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right); } widgetOptions.disabled = disabled; - if(UIWidgets::Combobox(name.c_str(), &selected, options, widgetOptions)) { + if (UIWidgets::Combobox(name.c_str(), &selected, options, widgetOptions)) { CVarSetInteger(cvarName.c_str(), static_cast(selected)); changed = true; Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -230,7 +234,13 @@ bool Option::RenderSlider() { val = options.size() - 1; changed = true; } - UIWidgets::IntSliderOptions widgetOptions = UIWidgets::IntSliderOptions().Color(THEME_COLOR).Min(0).Max(options.size() - 1).Tooltip(description.c_str()).Format(options[val].c_str()).DefaultValue(defaultOption); + UIWidgets::IntSliderOptions widgetOptions = UIWidgets::IntSliderOptions() + .Color(THEME_COLOR) + .Min(0) + .Max(options.size() - 1) + .Tooltip(description.c_str()) + .Format(options[val].c_str()) + .DefaultValue(defaultOption); widgetOptions.disabled = disabled; if (UIWidgets::SliderInt(name.c_str(), &val, widgetOptions)) { changed = true; @@ -250,27 +260,31 @@ bool Option::RenderSlider() { return changed; } -void Option::PopulateTextToNum(){ - for (uint8_t count = 0; count < options.size(); count++){ +void Option::PopulateTextToNum() { + for (uint8_t count = 0; count < options.size(); count++) { optionsTextToVar[options[count]] = count; } } -LocationOption::LocationOption(RandomizerCheck key_, const std::string& name_) : - Option(key_, name_, {"Included", "Excluded"}, OptionCategory::Setting, "", "", WidgetType::Checkbox, - RO_LOCATION_INCLUDE, false, IMFLAG_NONE) {} +LocationOption::LocationOption(RandomizerCheck key_, const std::string& name_) + : Option(key_, name_, { "Included", "Excluded" }, OptionCategory::Setting, "", "", WidgetType::Checkbox, + RO_LOCATION_INCLUDE, false, IMFLAG_NONE) { +} 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(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(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_)}; +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_) }; } RandomizerTrick TrickOption::GetKey() const { @@ -295,8 +309,8 @@ const std::set& TrickOption::GetTags() const { OptionGroup::OptionGroup(std::string name, std::vector options, const OptionGroupType groupType, const WidgetContainerType containerType, std::string description) - : mName(std::move(name)), mOptions(std::move(options)), mGroupType(groupType), - mContainerType(containerType), mDescription(std::move(description)) { + : mName(std::move(name)), mOptions(std::move(options)), mGroupType(groupType), mContainerType(containerType), + mDescription(std::move(description)) { } OptionGroup::OptionGroup(std::string name, std::vector subGroups, const OptionGroupType groupType, @@ -307,14 +321,12 @@ OptionGroup::OptionGroup(std::string name, std::vector subGroups, OptionGroup OptionGroup::SubGroup(std::string name, std::vector options, const WidgetContainerType containerType, std::string description) { - return {std::move(name), std::move(options), OptionGroupType::SUBGROUP, containerType, - std::move(description)}; + return { std::move(name), std::move(options), OptionGroupType::SUBGROUP, containerType, std::move(description) }; } OptionGroup OptionGroup::SubGroup(std::string name, std::vector subGroups, const WidgetContainerType containerType, std::string description) { - return {std::move(name), std::move(subGroups), OptionGroupType::SUBGROUP, containerType, - std::move(description)}; + return { std::move(name), std::move(subGroups), OptionGroupType::SUBGROUP, containerType, std::move(description) }; } const std::string& OptionGroup::GetName() const { @@ -358,7 +370,8 @@ bool OptionGroup::RenderImGui() const { // NOLINT(*-no-recursion) bool changed = false; ImGui::BeginDisabled(mDisabled); if (mContainerType == WidgetContainerType::TABLE) { - if (ImGui::BeginTable(mName.c_str(), static_cast(mSubGroups.size()), ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { + if (ImGui::BeginTable(mName.c_str(), static_cast(mSubGroups.size()), + ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { for (const auto column : mSubGroups) { if (column->GetContainerType() == WidgetContainerType::COLUMN) { ImGui::TableSetupColumn(column->GetName().c_str(), ImGuiTableColumnFlags_WidthStretch, 200.0f); diff --git a/soh/soh/Enhancements/randomizer/option.h b/soh/soh/Enhancements/randomizer/option.h index 3b1ae8521..d92fa4473 100644 --- a/soh/soh/Enhancements/randomizer/option.h +++ b/soh/soh/Enhancements/randomizer/option.h @@ -16,28 +16,31 @@ namespace Rando { enum ImGuiMenuFlags { - IMFLAG_NONE = 0, - IMFLAG_SEPARATOR_BOTTOM = 1 << 0, /** Adds a padded separator below the widget. */ - IMFLAG_SEPARATOR_TOP = 1 << 1, /** Adds a padded separator above the widget. */ - IMFLAG_INDENT = 1 << 2, /** Indents this widget and all proceeding widgets. */ - IMFLAG_UNINDENT = 1 << 3, /** Unindents this widget and all proceeding widgets. */ + IMFLAG_NONE = 0, + IMFLAG_SEPARATOR_BOTTOM = 1 << 0, /** Adds a padded separator below the widget. */ + IMFLAG_SEPARATOR_TOP = 1 << 1, /** Adds a padded separator above the widget. */ + IMFLAG_INDENT = 1 << 2, /** Indents this widget and all proceeding widgets. */ + IMFLAG_UNINDENT = 1 << 3, /** Unindents this widget and all proceeding widgets. */ }; /** * @brief Affects how options are handled when writing a spoiler/patch file */ enum class OptionCategory { - Setting, /** An option that typically affects the logic/item pool/etc. of the seed. Typically gets written out to the spoiler file. */ - Toggle, /** An option that typically affects other options rather than affecting the seed directly. i.e. A toggle for randomizing the values of other options. */ + Setting, /** An option that typically affects the logic/item pool/etc. of the seed. Typically gets written out to + the spoiler file. */ + Toggle, /** An option that typically affects other options rather than affecting the seed directly. i.e. A toggle + for randomizing the values of other options. */ }; /** * @brief Controls how this option is rendered in the menu. */ enum class WidgetType { - Checkbox, /** Default for Bools, not compatible if options.size() > 2. */ - Combobox, /** Default for U8s, works with U8s and Bools. */ - 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. */ + Checkbox, /** Default for Bools, not compatible if options.size() > 2. */ + Combobox, /** Default for U8s, works with U8s and Bools. */ + 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 { @@ -47,15 +50,15 @@ class OptionValue { /** * @brief Returns the value of the OptionValue's mVal - * - * @return uint8_t + * + * @return uint8_t */ uint8_t Get(); /** * @brief Set the OptionValue's mVal to the provided val. - * - * @param val + * + * @param val */ void Set(uint8_t val); @@ -146,8 +149,8 @@ class Option { * @return Option */ 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); + std::string description_ = "", int imFlags_ = IMFLAG_SEPARATOR_BOTTOM, + WidgetType widgetType_ = WidgetType::Checkbox, bool defaultOption_ = false); /** * @brief Constructs a U8 Option. @@ -192,8 +195,8 @@ class Option { /** * @brief Get the Key Option - * - * @return const RandomizerSettingKey + * + * @return const RandomizerSettingKey */ RandomizerSettingKey GetKey() const; @@ -207,9 +210,9 @@ class Option { /** * @brief Get the text of the Option value of the selected index. - * - * @param index - * @return const std::string& + * + * @param index + * @return const std::string& */ const std::string& GetOptionText(size_t index) const; @@ -279,7 +282,7 @@ class Option { * "Enable" in this context refers to the ability to change the option in the * settings menu. The actual value of the option is not decided by whether or not * the option is "Enabled". - */ + */ void Enable(); /** @@ -312,7 +315,7 @@ class Option { uint8_t GetValueFromText(std::string text); void SetContextIndexFromText(std::string text); -protected: + protected: 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_); @@ -341,14 +344,14 @@ protected: }; class LocationOption : public Option { -public: - LocationOption() = default; - LocationOption(RandomizerCheck key_, const std::string& name_); - RandomizerCheck GetKey() const; + public: + LocationOption() = default; + LocationOption(RandomizerCheck key_, const std::string& name_); + RandomizerCheck GetKey() const; }; class TrickOption : public Option { -public: + public: TrickOption() = default; /** * @brief A convenience function for constructing the Option for a trick. @@ -361,7 +364,8 @@ public: * @param description_ A brief description of the trick. * @return Option */ - static TrickOption LogicTrick(RandomizerTrick key_, 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_); RandomizerTrick GetKey() const; @@ -389,8 +393,9 @@ public: const std::set& GetTags() const; -private: - TrickOption(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, const std::string& name_, std::string description_); + private: + TrickOption(RandomizerTrick key_, RandomizerCheckQuest quest_, RandomizerArea area_, std::set tags_, + const std::string& name_, std::string description_); RandomizerCheckQuest mQuest; RandomizerArea mArea; std::set mTags; @@ -402,11 +407,11 @@ enum class OptionGroupType { }; enum class WidgetContainerType { - BASIC, /** Barebones container, just lists the options within. */ - SECTION, /** Similar to Barebones, but has a header with the section name. */ - COLUMN, /** Signifies the container should be the start of new column within a table. */ - TABLE, /** Signifies the container is a table (should contain other subgroups with type column)*/ - TABBED, /** Signifies this container's contents should be contained within a tabbed interface. */ + BASIC, /** Barebones container, just lists the options within. */ + SECTION, /** Similar to Barebones, but has a header with the section name. */ + COLUMN, /** Signifies the container should be the start of new column within a table. */ + TABLE, /** Signifies the container is a table (should contain other subgroups with type column)*/ + TABBED, /** Signifies this container's contents should be contained within a tabbed interface. */ }; class OptionGroup { @@ -436,7 +441,8 @@ class OptionGroup { * @param containerType Specifies the type of container this widget should render as in ImGui. * @param description A description that can appear in a tooltip in ImGui. */ - OptionGroup(std::string name, std::vector subGroups, OptionGroupType groupType = OptionGroupType::DEFAULT, + OptionGroup(std::string name, std::vector subGroups, + OptionGroupType groupType = OptionGroupType::DEFAULT, WidgetContainerType containerType = WidgetContainerType::BASIC, std::string description = ""); /** @@ -449,7 +455,8 @@ class OptionGroup { * @param description A description that can appear in a tooltip in ImGui. * @return OptionGroup */ - static OptionGroup SubGroup(std::string name, std::vector options, WidgetContainerType containerType = WidgetContainerType::BASIC, + static OptionGroup SubGroup(std::string name, std::vector options, + WidgetContainerType containerType = WidgetContainerType::BASIC, std::string description = ""); /** @@ -462,7 +469,8 @@ class OptionGroup { * @param description A description that can appear in a tooltip in ImGui. * @return OptionGroup */ - static OptionGroup SubGroup(std::string name, std::vector subGroups, WidgetContainerType containerType = WidgetContainerType::BASIC, + static OptionGroup SubGroup(std::string name, std::vector subGroups, + WidgetContainerType containerType = WidgetContainerType::BASIC, std::string description = ""); /** @@ -526,4 +534,4 @@ class OptionGroup { }; } // namespace Rando -#endif //RANDOPTION_H \ No newline at end of file +#endif // RANDOPTION_H \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index fed7e033f..8dc07ce7a 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -2,18 +2,19 @@ namespace Rando { void Settings::CreateOptionDescriptions() { - mOptionDescriptions[RSK_FOREST] = "Determines if Kokiri forest can be left for the Lost Woods bridge or the Deku Tree.\n" - "\n" - "On - Kokiri Sword & Deku Shield are required to access " - "the Deku Tree, and completing the Deku Tree is required to " - "access the Lost Woods Bridge Exit.\n" - "\n" - "Deku Only - Kokiri boy no longer blocks the path to the Bridge " - "but Mido still requires the Kokiri Sword and Deku Shield " - "to access the tree.\n" - "\n" - "Off - Mido no longer blocks the path to the Deku Tree. Kokiri " - "boy no longer blocks the path out of the forest."; + mOptionDescriptions[RSK_FOREST] = + "Determines if Kokiri forest can be left for the Lost Woods bridge or the Deku Tree.\n" + "\n" + "On - Kokiri Sword & Deku Shield are required to access " + "the Deku Tree, and completing the Deku Tree is required to " + "access the Lost Woods Bridge Exit.\n" + "\n" + "Deku Only - Kokiri boy no longer blocks the path to the Bridge " + "but Mido still requires the Kokiri Sword and Deku Shield " + "to access the tree.\n" + "\n" + "Off - Mido no longer blocks the path to the Deku Tree. Kokiri " + "boy no longer blocks the path out of the forest."; mOptionDescriptions[RSK_KAK_GATE] = "Closed - The gate will remain closed until Zelda's Letter " "is shown to the guard.\n" "\n" @@ -41,22 +42,24 @@ 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_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" "The child option is forcefully set if it would conflict with other options."; - mOptionDescriptions[RSK_GERUDO_FORTRESS] = "Sets the state of the carpenters captured by Gerudo " - "in Gerudo Fortress, and with it the number of guards that spawn.\n" - "\n" - "Normal - All 4 carpenters are required to be saved.\n" - "\n" - "Fast - Only the bottom left carpenter requires rescuing.\n" - "\n" - "Free - The bridge is repaired from the start, and Nabooru cannot spawn.\n" - "If the Gerudo Membership Card isn't shuffled, you start with it.\n" - "\n" - "Only \"Normal\" is compatible with Gerudo Fortress Key Rings."; + mOptionDescriptions[RSK_GERUDO_FORTRESS] = + "Sets the state of the carpenters captured by Gerudo " + "in Gerudo Fortress, and with it the number of guards that spawn.\n" + "\n" + "Normal - All 4 carpenters are required to be saved.\n" + "\n" + "Fast - Only the bottom left carpenter requires rescuing.\n" + "\n" + "Free - The bridge is repaired from the start, and Nabooru cannot spawn.\n" + "If the Gerudo Membership Card isn't shuffled, you start with it.\n" + "\n" + "Only \"Normal\" is compatible with Gerudo Fortress Key Rings."; mOptionDescriptions[RSK_RAINBOW_BRIDGE] = "Alters the requirements to open the bridge to Ganon's Castle.\n" "\n" @@ -111,13 +114,13 @@ void Settings::CreateOptionDescriptions() { "Selection Only - Specify which dungeons are Vanilla, Master Quest or a 50/50 between the two.\n" "Differs from Random Number in that they are rolled individually, making the exact total a bell curve."; mOptionDescriptions[RSK_MQ_DUNGEON_SET] = - "Choose specific Dungeons to be Master Quest or Vanilla.\n" - "\n" - "If Master Quest Dungeons is set to Set Number or Random, the dungeons chosen " - "to be Master Quest here will count towards that total. Any Dungeons set to Vanilla " - "here will be guaranteed to be Vanilla. If Set Number is higher than the amount of dungeons " - "set to either MQ or Random here, you will have fewer MQ Dungeons than the number you " - "set."; + "Choose specific Dungeons to be Master Quest or Vanilla.\n" + "\n" + "If Master Quest Dungeons is set to Set Number or Random, the dungeons chosen " + "to be Master Quest here will count towards that total. Any Dungeons set to Vanilla " + "here will be guaranteed to be Vanilla. If Set Number is higher than the amount of dungeons " + "set to either MQ or Random here, you will have fewer MQ Dungeons than the number you " + "set."; mOptionDescriptions[RSK_TRIFORCE_HUNT] = "Pieces of the Triforce of Courage have been scattered across the world. Find them all to finish the game!\n\n" "When the required amount of pieces have been found, the game is saved and Ganon's Boss key is given " @@ -224,12 +227,11 @@ void Settings::CreateOptionDescriptions() { "\n" "Adult Link will start with a second free item instead of the Master Sword.\n" "If you haven't found the Master Sword before facing Ganon, you won't receive it during the fight."; - mOptionDescriptions[RSK_SHUFFLE_CHILD_WALLET] = - "Enabling this shuffles the Child's Wallet into the item pool.\n" - "\n" - "You will not be able to carry any rupees until you find a wallet."; - mOptionDescriptions[RSK_INCLUDE_TYCOON_WALLET] = - "Enabling this adds an extra Progressive Wallet to the pool and adds a new 999 capacity tier after Giant's Wallet.\n"; + mOptionDescriptions[RSK_SHUFFLE_CHILD_WALLET] = "Enabling this shuffles the Child's Wallet into the item pool.\n" + "\n" + "You will not be able to carry any rupees until you find a wallet."; + mOptionDescriptions[RSK_INCLUDE_TYCOON_WALLET] = "Enabling this adds an extra Progressive Wallet to the pool and " + "adds a new 999 capacity tier after Giant's Wallet.\n"; mOptionDescriptions[RSK_SHUFFLE_OCARINA] = "Enabling this shuffles the Fairy Ocarina and the Ocarina of Time into the item pool.\n" "\n" @@ -259,72 +261,79 @@ void Settings::CreateOptionDescriptions() { "\n" "The Gerudo Card is required to enter the Gerudo Training Ground, opening " "the gate to Haunted Wasteland and the Horseback Archery minigame."; - mOptionDescriptions[RSK_SHUFFLE_POTS] = "Pots will drop a randomized item the first time they're broken and collected. This does not include the flying pots." - " Pots will have a different appearance when they hold a randomized item.\n" - "With this option enabled, Ganon's boss key door is moved further up the stairs to\n" - "allow access to the pots before obtaining Ganon's Boss Key.\n" - "\n" - "Off - Pots will not be shuffled.\n" - "\n" - "Dungeons - Only shuffle pots that are within dungeons.\n" - "\n" - "Overworld - Only shuffle pots that are outside of dungeons.\n" - "\n" - "All pots - Shuffle all pots."; - mOptionDescriptions[RSK_SHUFFLE_CRATES] = "Crates will drop a randomized item the first time they're broken and collected. " - "Crates will have a different appearance when they hold a randomized item.\n" - "\n" - "Off - Crates will not be shuffled.\n" - "\n" - "Dungeons - Only shuffle crates that are within dungeons.\n" - "\n" - "Overworld - Only shuffle crates that are outside of dungeons.\n" - "\n" - "All Crates - Shuffle all crates."; - mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" + mOptionDescriptions[RSK_SHUFFLE_POTS] = + "Pots will drop a randomized item the first time they're broken and collected. This does not include the " + "flying pots." + " Pots will have a different appearance when they hold a randomized item.\n" + "With this option enabled, Ganon's boss key door is moved further up the stairs to\n" + "allow access to the pots before obtaining Ganon's Boss Key.\n" "\n" - "The fishing pole is required to play the fishing pond minigame."; - mOptionDescriptions[RSK_INFINITE_UPGRADES] = "Adds upgrades that hold infinite quantities of items (bombs, arrows, etc.).\n" + "Off - Pots will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle pots that are within dungeons.\n" + "\n" + "Overworld - Only shuffle pots that are outside of dungeons.\n" + "\n" + "All pots - Shuffle all pots."; + mOptionDescriptions[RSK_SHUFFLE_CRATES] = + "Crates will drop a randomized item the first time they're broken and collected. " + "Crates will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Crates will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle crates that are within dungeons.\n" + "\n" + "Overworld - Only shuffle crates that are outside of dungeons.\n" + "\n" + "All Crates - Shuffle all crates."; + mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" + "\n" + "The fishing pole is required to play the fishing pond minigame."; + mOptionDescriptions[RSK_INFINITE_UPGRADES] = + "Adds upgrades that hold infinite quantities of items (bombs, arrows, etc.).\n" "\n" "Progressive - The infinite upgrades are obtained after getting the last normal capacity upgrade.\n" "\n" - "Condensed Progressive - The infinite upgrades are obtained as the first capacity upgrade (doesn't apply to the infinite wallet or to infinite magic)."; + "Condensed Progressive - The infinite upgrades are obtained as the first capacity upgrade (doesn't apply to " + "the infinite wallet or to infinite magic)."; mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG] = "Shuffles the Deku Stick bag into the item pool.\n" - "\n" - "The Deku Stick bag is required to hold Deku Sticks."; + "\n" + "The Deku Stick bag is required to hold Deku Sticks."; mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG] = "Shuffles the Deku Nut bag into the item pool.\n" + "\n" + "The Deku Nut bag is required to hold Deku Nuts."; + mOptionDescriptions[RSK_SHOPSANITY] = + "Off - All shop items will be the same as vanilla.\n" "\n" - "The Deku Nut bag is required to hold Deku Nuts."; - mOptionDescriptions[RSK_SHOPSANITY] = "Off - All shop items will be the same as vanilla.\n" - "\n" - "Specific Count - Vanilla shop items will be shuffled among different shops, and " - "each shop will contain a specific number (0-7) of non-vanilla shop items.\n" - "\n" - "Random - Vanilla shop items will be shuffled among different shops, and " - "each shop will contain a random number (1-7) of non-vanilla shop items."; - mOptionDescriptions[RSK_SHOPSANITY_COUNT] = "0 Items - Vanilla shop items will be shuffled among different shops.\n" - "\n" - "1-7 Items - Vanilla shop items will be shuffled among different shops, and " - "each shop will contain 1-7 non-vanilla shop items.\n" - /* - "\n" - "8 Items - All shops will contain 8 non-vanilla shop items.\n" - */; + "Specific Count - Vanilla shop items will be shuffled among different shops, and " + "each shop will contain a specific number (0-7) of non-vanilla shop items.\n" + "\n" + "Random - Vanilla shop items will be shuffled among different shops, and " + "each shop will contain a random number (1-7) of non-vanilla shop items."; + mOptionDescriptions[RSK_SHOPSANITY_COUNT] = + "0 Items - Vanilla shop items will be shuffled among different shops.\n" + "\n" + "1-7 Items - Vanilla shop items will be shuffled among different shops, and " + "each shop will contain 1-7 non-vanilla shop items.\n" + /* + "\n" + "8 Items - All shops will contain 8 non-vanilla shop items.\n" + */ + ; mOptionDescriptions[RSK_SHOPSANITY_PRICES] = "Vanilla - The same price as the item it replaced.\n" "Cheap Balanced - Prices will range between 0 to 95 rupees, favoring lower numbers.\n" "Balanced - Prices will range between 0 to 300 rupees, favoring lower numbers.\n" "Fixed - A fixed number.\n" "Range - A random point between specific ranges.\n" - "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if that wallet is chosen."; - mOptionDescriptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE] = - "The price for Shopsanity checks."; + "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if " + "that wallet is chosen."; + mOptionDescriptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE] = "The price for Shopsanity checks."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_1] = "The first part of the inclusive range of prices to allow for Shopsanity checks."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_RANGE_2] = "The second part of the inclusive range of prices to allow for Shopsanity checks."; - mOptionDescriptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT] = - "The chance for Shopsanity checks to be free."; + mOptionDescriptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT] = "The chance for Shopsanity checks to be free."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT] = "The chance for Shopsanity checks to be purchasable with Child's Wallet (1-99)."; mOptionDescriptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT] = @@ -337,16 +346,24 @@ void Settings::CreateOptionDescriptions() { "After choosing a price, set it to the affordable amount based on the wallet required.\n\n" "Affordable prices per tier: starter = 1, adult = 100, giant = 201, tycoon = 501\n\n" "Use this to enable wallet tier locking, but make shop items not as expensive as they could be."; - mOptionDescriptions[RSK_FISHSANITY] = "Off - Fish will not be shuffled. No changes will be made to fishing behavior.\n\n" - "Shuffle only Hyrule Loach - Allows you to earn an item by catching the Hyrule Loach at the fishing pond and giving it to the owner.\n\n" - "Shuffle Fishing Pond - The fishing pond's fish will be shuffled. Catching a fish in the fishing pond will grant a reward.\n\n" - "Shuffle Overworld Fish - Fish in generic grottos and Zora's Domain will be shuffled. Catching a fish in a bottle will give a reward.\n\n" + mOptionDescriptions[RSK_FISHSANITY] = + "Off - Fish will not be shuffled. No changes will be made to fishing behavior.\n\n" + "Shuffle only Hyrule Loach - Allows you to earn an item by catching the Hyrule Loach at the fishing pond and " + "giving it to the owner.\n\n" + "Shuffle Fishing Pond - The fishing pond's fish will be shuffled. Catching a fish in the fishing pond will " + "grant a reward.\n\n" + "Shuffle Overworld Fish - Fish in generic grottos and Zora's Domain will be shuffled. Catching a fish in a " + "bottle will give a reward.\n\n" "Shuffle Both - Both overworld fish and fish in the fishing pond will be shuffled."; - mOptionDescriptions[RSK_FISHSANITY_POND_COUNT] = "The number of fish to randomize in the fishing pool.\n\n" - "If set to maximum, each fish will have a unique check, including a Hyrule Loach which appears only as child, and " + mOptionDescriptions[RSK_FISHSANITY_POND_COUNT] = + "The number of fish to randomize in the fishing pool.\n\n" + "If set to maximum, each fish will have a unique check, including a Hyrule Loach which appears only as child, " + "and " "uncaught fish will be given a visual indicator to distinguish from already-caught fish.\n\n" "Otherwise, any fish caught in the pond will give a reward, until all rewards have been given."; - mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT] = "Enabling this will split the fishing pond fish by age, making fishing pond fish grant different rewards as child and adult.\n\n" + mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT] = + "Enabling this will split the fishing pond fish by age, making fishing pond fish grant different rewards as " + "child and adult.\n\n" "If disabled, then the child pond will be shuffled and shared between both ages.\n\n" "Note that, as child, there is a second loach available in the pond!"; mOptionDescriptions[RSK_SHUFFLE_SCRUBS] = @@ -363,15 +380,14 @@ void Settings::CreateOptionDescriptions() { "Balanced - Prices will range between 0 to 300 rupees, favoring lower numbers.\n" "Fixed - A fixed number.\n" "Range - A random point between specific ranges.\n" - "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if that wallet is chosen."; - mOptionDescriptions[RSK_SCRUBS_PRICES_FIXED_PRICE] = - "The price for Scrub checks."; + "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if " + "that wallet is chosen."; + mOptionDescriptions[RSK_SCRUBS_PRICES_FIXED_PRICE] = "The price for Scrub checks."; mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_1] = "The first part of the inclusive range of prices to allow for Scrub checks."; mOptionDescriptions[RSK_SCRUBS_PRICES_RANGE_2] = "The second part of the inclusive range of prices to allow for Scrub checks."; - mOptionDescriptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT] = - "The chance for Scrub checks to be free."; + mOptionDescriptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT] = "The chance for Scrub checks to be free."; mOptionDescriptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT] = "The chance for Scrub checks to be purchasable with Child's Wallet (1-99)."; mOptionDescriptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT] = @@ -384,8 +400,7 @@ void Settings::CreateOptionDescriptions() { "After choosing a price, set it to the affordable amount based on the wallet required.\n\n" "Affordable prices per tier: starter = 1, adult = 100, giant = 201, tycoon = 501\n\n" "Use this to enable wallet tier locking, but make scrub items not as expensive as they could be."; - mOptionDescriptions[RSK_SHUFFLE_BEEHIVES] = - "Beehives give a randomized item from the pool when broken."; + mOptionDescriptions[RSK_SHUFFLE_BEEHIVES] = "Beehives give a randomized item from the pool when broken."; mOptionDescriptions[RSK_SHUFFLE_COWS] = "Cows give a randomized item from the pool upon performing Epona's Song in front of them."; mOptionDescriptions[RSK_SHUFFLE_MERCHANTS] = @@ -407,15 +422,14 @@ void Settings::CreateOptionDescriptions() { "Balanced - Prices will range between 0 to 300 rupees, favoring lower numbers.\n" "Fixed - A fixed number.\n" "Range - A random point between specific ranges.\n" - "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if that wallet is chosen."; - mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE] = - "The price for Merchant checks."; + "Set By Wallet - Set weights that decide the choice of each wallet, and get a random price in that range if " + "that wallet is chosen."; + mOptionDescriptions[RSK_MERCHANT_PRICES_FIXED_PRICE] = "The price for Merchant checks."; mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_1] = "The first part of the inclusive range of prices to allow for Merchant checks."; mOptionDescriptions[RSK_MERCHANT_PRICES_RANGE_2] = "The second part of the inclusive range of prices to allow for Merchant checks."; - mOptionDescriptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT] = - "The chance for Merchant checks to be free."; + mOptionDescriptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT] = "The chance for Merchant checks to be free."; mOptionDescriptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT] = "The chance for Merchant checks to be purchasable with Child's Wallet (1-99)."; mOptionDescriptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT] = @@ -447,18 +461,18 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; - mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = "Freestanding rupees & hearts are shuffles to random items. " - "Freestanding heart pieces and small keys are already shuffled by default.\n" - "\n" - "Off - freestanding rupees & hearts will not be shuffled.\n" - "\n" - "Dungeons - Only freestanding rupees & hearts that are within dungeons.\n" - "\n" - "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" - "\n" - "All Items - Shuffle all freestanding rupees & hearts."; - mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = - "Shuffle fairy locations."; + mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = + "Freestanding rupees & hearts are shuffles to random items. " + "Freestanding heart pieces and small keys are already shuffled by default.\n" + "\n" + "Off - freestanding rupees & hearts will not be shuffled.\n" + "\n" + "Dungeons - Only freestanding rupees & hearts that are within dungeons.\n" + "\n" + "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" + "\n" + "All Items - Shuffle all freestanding rupees & hearts."; + mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations."; mOptionDescriptions[RSK_SHUFFLE_GRASS] = "Grass/Bushes will drop a randomized item the first time they're cut and collected. " "Grass/Bushes will have a different appearance when they hold a randomized item.\n" @@ -653,7 +667,8 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_GANONDORF_HINT] = "Talking to Ganondorf in his boss room will tell you the location of the Light Arrows and Master Sword." "If this option is enabled and Ganondorf is reachable without these items, Gossip Stones will never hint the " - "appropriate items.";//RANDOTODO make this hint text about no dupe hints a global hint for static hints. Add to navi? + "appropriate items."; // RANDOTODO make this hint text about no dupe hints a global hint for static hints. Add + // to navi? mOptionDescriptions[RSK_SHEIK_LA_HINT] = "Talking to Sheik inside Ganon's Castle will tell you the location of the Light Arrows." "If this option is enabled and Sheik is reachable without Light Arrows, Gossip Stones will never hint the " @@ -662,29 +677,46 @@ void Settings::CreateOptionDescriptions() { "Reading the diary of Dampé the gravekeeper as adult will tell you the location of one of the Hookshots."; mOptionDescriptions[RSK_GREG_HINT] = "Talking to the chest game owner after buying a key will tell you the location of Greg the Green Rupee."; - mOptionDescriptions[RSK_LOACH_HINT] = - "Talking to the fishing pond owner and asking to talk about something will tell you what's the reward for the Hyrule Loach."; + mOptionDescriptions[RSK_LOACH_HINT] = "Talking to the fishing pond owner and asking to talk about something will " + "tell you what's the reward for the Hyrule Loach."; mOptionDescriptions[RSK_SARIA_HINT] = "Talking to Saria either in person or through Saria's Song will tell you the " "location of a progressive magic meter."; - mOptionDescriptions[RSK_FISHING_POLE_HINT] = "Talking to the fishing pond owner without the fishing pole will tell you its location."; - mOptionDescriptions[RSK_OOT_HINT] = "Sheik in the Temple of Time will tell you the item and song on the Ocarina of Time."; + mOptionDescriptions[RSK_FISHING_POLE_HINT] = + "Talking to the fishing pond owner without the fishing pole will tell you its location."; + mOptionDescriptions[RSK_OOT_HINT] = + "Sheik in the Temple of Time will tell you the item and song on the Ocarina of Time."; mOptionDescriptions[RSK_FROGS_HINT] = "Standing near the pedestal for the frogs in Zora's River will tell you the " "reward for the frogs' Ocarina game."; - mOptionDescriptions[RSK_BIGGORON_HINT] = "Talking to Biggoron will tell you the item he will give you in exchange for the Claim Check."; - mOptionDescriptions[RSK_BIG_POES_HINT] = "Talking to the Poe Collector in the Market Guardhouse while adult will tell you what you receive for handing in Big Poes."; - mOptionDescriptions[RSK_CHICKENS_HINT] = "Talking to Anju as a child will tell you the item she will give you for delivering her cuccos to the pen."; - mOptionDescriptions[RSK_MALON_HINT] = "Talking to Malon as adult will tell you the item on \"Link's cow\", the cow you win from beating her time on the Lon Lon Obstacle Course."; - mOptionDescriptions[RSK_HBA_HINT] = "Talking to the Horseback Archery gerudo in Gerudo Fortress, or the nearby sign, will tell you what you win for scoring 1000 and 1500 points on Horseback Archery."; - mOptionDescriptions[RSK_WARP_SONG_HINTS] = "Playing a warp song will tell you where it leads. (If warp song destinations are vanilla, this is always enabled.)"; + mOptionDescriptions[RSK_BIGGORON_HINT] = + "Talking to Biggoron will tell you the item he will give you in exchange for the Claim Check."; + mOptionDescriptions[RSK_BIG_POES_HINT] = "Talking to the Poe Collector in the Market Guardhouse while adult will " + "tell you what you receive for handing in Big Poes."; + mOptionDescriptions[RSK_CHICKENS_HINT] = + "Talking to Anju as a child will tell you the item she will give you for delivering her cuccos to the pen."; + mOptionDescriptions[RSK_MALON_HINT] = "Talking to Malon as adult will tell you the item on \"Link's cow\", the cow " + "you win from beating her time on the Lon Lon Obstacle Course."; + mOptionDescriptions[RSK_HBA_HINT] = + "Talking to the Horseback Archery gerudo in Gerudo Fortress, or the nearby sign, will tell you what you win " + "for scoring 1000 and 1500 points on Horseback Archery."; + mOptionDescriptions[RSK_WARP_SONG_HINTS] = "Playing a warp song will tell you where it leads. (If warp song " + "destinations are vanilla, this is always enabled.)"; mOptionDescriptions[RSK_SCRUB_TEXT_HINT] = "Business scrubs will reveal the identity of what they're selling."; - mOptionDescriptions[RSK_MERCHANT_TEXT_HINT] = "Merchants will reveal the identity of what they're selling (Shops are not affected by this setting)."; - mOptionDescriptions[RSK_KAK_10_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 10 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_20_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 20 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_30_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 30 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_40_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 40 tokens will tell you the reward."; - mOptionDescriptions[RSK_KAK_50_SKULLS_HINT] = "Talking to the Cursed Resident in the Skulltula House who is saved after 50 tokens will tell you the reward."; - 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_MERCHANT_TEXT_HINT] = + "Merchants will reveal the identity of what they're selling (Shops are not affected by this setting)."; + mOptionDescriptions[RSK_KAK_10_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 10 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_20_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 20 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_30_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 30 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_40_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 40 tokens will tell you the reward."; + mOptionDescriptions[RSK_KAK_50_SKULLS_HINT] = + "Talking to the Cursed Resident in the Skulltula House who is saved after 50 tokens will tell you the reward."; + 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_BOMBCHU_BAG] = "Bombchus require their own bag to be found before use. Without this setting, any Bombchu requirement " @@ -702,7 +734,8 @@ void Settings::CreateOptionDescriptions() { 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."; - mOptionDescriptions[RSK_SKELETON_KEY] = "Adds a new item called the \"Skeleton Key\", it unlocks every dungeon door locked by a small key."; + mOptionDescriptions[RSK_SKELETON_KEY] = + "Adds a new item called the \"Skeleton Key\", it unlocks every dungeon door locked by a small key."; mOptionDescriptions[RSK_SUNLIGHT_ARROWS] = "Light Arrows can be used to light up the sun switches instead of using the Mirror Shield. " "Item placement logic will respect this option, so it might be required to use this to progress."; @@ -720,7 +753,9 @@ void Settings::CreateOptionDescriptions() { "location is reachable. When disabled, only " "required items and locations to beat the game " "will be guaranteed reachable."; - 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."; + 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."; } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 5b1a7fc55..d567a3d8e 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -66,68 +66,201 @@ const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; static const char* englishRupeeNames[175] = { - "[P]", "Bad RNG Rolls", "Bananas", "Beanbean Coins", "Beans", - "Beli", "Bells", "Berries", "Bison Dollars", "Bitcoin", - "Blue Essence", "Bolts", "Bones", "Boondollars", "Bottle Caps", - "Bratwürste", "Bucks", "BugFrags", "Canadian Dollars", "Cards", - "Chaos Orbs", "Clams", "Coal", "Cocoa Beans", "Coins", - "Cookies", "Copper", "Cor", "Cornflakes", "Credits", - "Crimebucks", "Crystal Shards", "Cubits", "Cucumbers", "Dalmations", - "Dampécoin", "Dark Elixir", "Darseks", "Dead Memes", "Diamonds", - "DNA", "Doge", "Dogecoin", "Doll Hairs", "Dollars", - "Dollarydoos", "Dosh", "Doubloons", "Dwarfbucks", "Elexit", - "Emeralds", "Energon", "Eris", "Ether", "Euro", - "Experience", "Extinction Points", "Floopies", "Flurbos", "FPS", - "Friends", "Frog Coins", "Gald", "Gekz", "Gems", - "Geo", "Gil", "Glimmer", "Glitches", "Gold", - "Gold Dragons", "Goober Dollars", "Green Herbs", "Greg Siblings", "Grouses", - "Gummybears", "Hell", "Hyrule Loaches", "Ice Traps", "ISK", - "Jiggies", "KF7 Ammo", "Kinstones", "Kremcoins", "Kroner", - "Leaves", "Lemmings", "Lien", "Lira", "Lumber", - "Lungmen Dollars", "Macca", "Mana", "Mann Co. Keys", "Meat", - "Meat Stacks", "Medaparts", "Meseta", "Mesetas", "Minerals", - "Monopoly Money", "Moons", "Mora", "Mumbo Tokens", "Munny", - "Mushrooms", "Mysteries", "Neopoints", "Notes", "Nuyen", - "Orbs", "Ore", "Pix", "Pixels", "Plastyks", - "Platinum", "Pokédollars", "Pokémon", "Poko", "Pokos", - "Potch", "Pounds", "Power Pellets", "Primogems", "Réals", - "Refined Metal", "Remote Mines", "Retweets", "Rhinu", "Rings", - "Riot Points", "Robux", "Rubies", "Rubles", "Runite Ore", - "Rupees", "Saint Quartz", "Septims", "Shekels", "Shillings", - "Silver", "Simoleons", "Smackaroos", "Social Credit", "Souls", - "Spent Casings", "Spice", "Spondulicks", "Spoons", "Star Bits", - "Star Chips", "Stars", "Stones of Jordan", "Store Credit", "Strawbs", - "Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals", - "Tiberium", "TokKul", "Toys", "Turnips", "Upvotes", - "V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs", - "World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids", + "[P]", + "Bad RNG Rolls", + "Bananas", + "Beanbean Coins", + "Beans", + "Beli", + "Bells", + "Berries", + "Bison Dollars", + "Bitcoin", + "Blue Essence", + "Bolts", + "Bones", + "Boondollars", + "Bottle Caps", + "Bratwürste", + "Bucks", + "BugFrags", + "Canadian Dollars", + "Cards", + "Chaos Orbs", + "Clams", + "Coal", + "Cocoa Beans", + "Coins", + "Cookies", + "Copper", + "Cor", + "Cornflakes", + "Credits", + "Crimebucks", + "Crystal Shards", + "Cubits", + "Cucumbers", + "Dalmations", + "Dampécoin", + "Dark Elixir", + "Darseks", + "Dead Memes", + "Diamonds", + "DNA", + "Doge", + "Dogecoin", + "Doll Hairs", + "Dollars", + "Dollarydoos", + "Dosh", + "Doubloons", + "Dwarfbucks", + "Elexit", + "Emeralds", + "Energon", + "Eris", + "Ether", + "Euro", + "Experience", + "Extinction Points", + "Floopies", + "Flurbos", + "FPS", + "Friends", + "Frog Coins", + "Gald", + "Gekz", + "Gems", + "Geo", + "Gil", + "Glimmer", + "Glitches", + "Gold", + "Gold Dragons", + "Goober Dollars", + "Green Herbs", + "Greg Siblings", + "Grouses", + "Gummybears", + "Hell", + "Hyrule Loaches", + "Ice Traps", + "ISK", + "Jiggies", + "KF7 Ammo", + "Kinstones", + "Kremcoins", + "Kroner", + "Leaves", + "Lemmings", + "Lien", + "Lira", + "Lumber", + "Lungmen Dollars", + "Macca", + "Mana", + "Mann Co. Keys", + "Meat", + "Meat Stacks", + "Medaparts", + "Meseta", + "Mesetas", + "Minerals", + "Monopoly Money", + "Moons", + "Mora", + "Mumbo Tokens", + "Munny", + "Mushrooms", + "Mysteries", + "Neopoints", + "Notes", + "Nuyen", + "Orbs", + "Ore", + "Pix", + "Pixels", + "Plastyks", + "Platinum", + "Pokédollars", + "Pokémon", + "Poko", + "Pokos", + "Potch", + "Pounds", + "Power Pellets", + "Primogems", + "Réals", + "Refined Metal", + "Remote Mines", + "Retweets", + "Rhinu", + "Rings", + "Riot Points", + "Robux", + "Rubies", + "Rubles", + "Runite Ore", + "Rupees", + "Saint Quartz", + "Septims", + "Shekels", + "Shillings", + "Silver", + "Simoleons", + "Smackaroos", + "Social Credit", + "Souls", + "Spent Casings", + "Spice", + "Spondulicks", + "Spoons", + "Star Bits", + "Star Chips", + "Stars", + "Stones of Jordan", + "Store Credit", + "Strawbs", + "Studs", + "Super Sea Snails", + "Talent", + "Teef", + "Telecrystals", + "Tiberium", + "TokKul", + "Toys", + "Turnips", + "Upvotes", + "V-Bucks", + "Vespene Gas", + "Watts", + "Widgets", + "Woolongs", + "World Dollars", + "Wumpa Fruit", + "Yen", + "Zenny", + "Zorkmids", }; static const char* germanRupeeNames[65] = { - "Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", - "Brötchen", "Cent", "Diamanten", "Diridari", "Dogecoin", - "ECU", "Elexit", "Erz", "Erzbrocken", "Euro", - "EXP", "Forint", "Franken", "Freunde", "Gil", - "Gold", "Groschen", "Gulden", "Gummibären", "Heller", - "Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete", - "Knochen", "Kohle", "Kraniche", "Kreuzer", "Kronen", - "Kronkorken", "Kröten", "Mark", "Mäuse", "Monde", - "Moorhühner", "Moos", "Münzen", "Penunze", "Pesa", - "Pfandflaschen", "Pfennig", "Pfund", "Pilze", "Plastiks", - "Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire", - "Schilling", "Seelen", "Smaragde", "Steine", "Sterne", - "Sternis", "Tael", "Taler", "Wagenchips", "Zenny" + "Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", "Brötchen", "Cent", "Diamanten", + "Diridari", "Dogecoin", "ECU", "Elexit", "Erz", "Erzbrocken", "Euro", "EXP", + "Forint", "Franken", "Freunde", "Gil", "Gold", "Groschen", "Gulden", "Gummibären", + "Heller", "Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete", "Knochen", "Kohle", + "Kraniche", "Kreuzer", "Kronen", "Kronkorken", "Kröten", "Mark", "Mäuse", "Monde", + "Moorhühner", "Moos", "Münzen", "Penunze", "Pesa", "Pfandflaschen", "Pfennig", "Pfund", + "Pilze", "Plastiks", "Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire", "Schilling", + "Seelen", "Smaragde", "Steine", "Sterne", "Sternis", "Tael", "Taler", "Wagenchips", + "Zenny" }; static const char* frenchRupeeNames[40] = { - "Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", - "Blés", "Bling", "Capsules", "Centimes", "Champignons", - "Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin", - "Dollars", "Émeraudes", "Éthers", "Étoiles", "Euros", - "Florens", "Francs", "Galds", "Gils", "Grouses", - "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", - "Orbes", "Orens", "Pépètes", "Pièces", "Plastyks", - "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies" + "Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", "Blés", "Bling", "Capsules", + "Centimes", "Champignons", "Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin", "Dollars", + "Émeraudes", "Éthers", "Étoiles", "Euros", "Florens", "Francs", "Galds", "Gils", + "Grouses", "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", "Orbes", "Orens", + "Pépètes", "Pièces", "Plastyks", "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies" }; Randomizer::Randomizer() { @@ -166,7 +299,7 @@ std::unordered_map spoilerFileDungeonToScene = { { "Ganon's Castle", SCENE_INSIDE_GANONS_CASTLE } }; -std::unordered_map getItemIdToItemId = { +std::unordered_map getItemIdToItemId = { { GI_BOW, ITEM_BOW }, { GI_ARROW_FIRE, ITEM_ARROW_FIRE }, { GI_DINS_FIRE, ITEM_DINS_FIRE }, @@ -210,7 +343,7 @@ std::unordered_map getItemIdToItemId = { #pragma optimize("", off) #pragma GCC push_options -#pragma GCC optimize ("O0") +#pragma GCC optimize("O0") bool Randomizer::SpoilerFileExists(const char* spoilerFileName) { if (strcmp(spoilerFileName, "") != 0) { std::ifstream spoilerFileStream(SohUtils::Sanitize(spoilerFileName)); @@ -232,65 +365,69 @@ void Randomizer::LoadHintMessages() { CustomMessageManager::Instance->ClearMessageTable(Randomizer::hintMessageTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::hintMessageTableID); - //Extra Hints + // Extra Hints CustomMessageManager::Instance->ClearMessageTable(Randomizer::randoMiscHintsTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::randoMiscHintsTableID); - // Bow Shooting Gallery reminder - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW, + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW, CustomMessage("Come back when you have your own bow and you'll get a #different prize#!", - "Komm wieder sobald Du Deinen eigenen Bogen hast, um einen #speziellen Preis# zu erhalten!", - "J'aurai #une autre récompense# pour toi lorsque tu auras ton propre arc.", - {QM_RED})); + "Komm wieder sobald Du Deinen eigenen Bogen hast, um einen #speziellen Preis# zu erhalten!", + "J'aurai #une autre récompense# pour toi lorsque tu auras ton propre arc.", { QM_RED })); // Warp Song Mysterious text - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST, + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST, CustomMessage("Warp to&#a mysterious place?#&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", - "Zu&#einem mysteriösen Ort#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", - "Se téléporter vers&#un endroit mystérieux#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK!&Non#", - {QM_RED, QM_GREEN})); + "Zu&#einem mysteriösen Ort#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", + "Se téléporter vers&#un endroit mystérieux#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK!&Non#", + { QM_RED, QM_GREEN })); // Lake Hylia water level system - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN, - CustomMessage("Water level control system.&Keep away!", - "Wasserstand Kontrollsystem&Finger weg!", - "Système de contrôle du niveau&d'eau.&Ne pas toucher!")); - CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI, - CustomMessage("%cThis switch is rustier than you think.^%cSomething must be wrong with the pipe system in the %bWater Temple%c.", - "%cDieser Schalter scheint rostiger zu sein als er aussieht.^%cEtwas muss mit dem Leitungssystem im %bWassertempel%c nicht stimmen.", - "%cCet interrupteur est très rouillé.^%cIl doit y avoir un problème avec la tuyauterie du %bTemple de l'Eau%c.")); + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN, + CustomMessage("Water level control system.&Keep away!", "Wasserstand Kontrollsystem&Finger weg!", + "Système de contrôle du niveau&d'eau.&Ne pas toucher!")); + CustomMessageManager::Instance->CreateMessage( + Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI, + CustomMessage("%cThis switch is rustier than you think.^%cSomething must be wrong with the pipe system in the " + "%bWater Temple%c.", + "%cDieser Schalter scheint rostiger zu sein als er aussieht.^%cEtwas muss mit dem Leitungssystem " + "im %bWassertempel%c nicht stimmen.", + "%cCet interrupteur est très rouillé.^%cIl doit y avoir un problème avec la tuyauterie du " + "%bTemple de l'Eau%c.")); } // Reference soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.h std::unordered_map randomizerGetToEnGirlShopItem = { - { RG_BUY_DEKU_NUTS_5, SI_DEKU_NUTS_5 }, - { RG_BUY_ARROWS_30, SI_ARROWS_30 }, - { RG_BUY_ARROWS_50, SI_ARROWS_50 }, - { RG_BUY_BOMBS_525, SI_BOMBS_5_R25 }, - { RG_BUY_DEKU_NUTS_10, SI_DEKU_NUTS_10 }, - { RG_BUY_DEKU_STICK_1, SI_DEKU_STICK }, - { RG_BUY_BOMBS_10, SI_BOMBS_10 }, - { RG_BUY_FISH, SI_FISH }, + { RG_BUY_DEKU_NUTS_5, SI_DEKU_NUTS_5 }, + { RG_BUY_ARROWS_30, SI_ARROWS_30 }, + { RG_BUY_ARROWS_50, SI_ARROWS_50 }, + { RG_BUY_BOMBS_525, SI_BOMBS_5_R25 }, + { RG_BUY_DEKU_NUTS_10, SI_DEKU_NUTS_10 }, + { RG_BUY_DEKU_STICK_1, SI_DEKU_STICK }, + { RG_BUY_BOMBS_10, SI_BOMBS_10 }, + { RG_BUY_FISH, SI_FISH }, { RG_BUY_RED_POTION_30, SI_RED_POTION_R30 }, - { RG_BUY_GREEN_POTION, SI_GREEN_POTION }, - { RG_BUY_BLUE_POTION, SI_BLUE_POTION }, + { RG_BUY_GREEN_POTION, SI_GREEN_POTION }, + { RG_BUY_BLUE_POTION, SI_BLUE_POTION }, { RG_BUY_HYLIAN_SHIELD, SI_HYLIAN_SHIELD }, - { RG_BUY_DEKU_SHIELD, SI_DEKU_SHIELD }, - { RG_BUY_GORON_TUNIC, SI_GORON_TUNIC }, - { RG_BUY_ZORA_TUNIC, SI_ZORA_TUNIC }, - { RG_BUY_HEART, SI_RECOVERY_HEART }, - { RG_BUY_BOMBCHUS_10, SI_BOMBCHU_10_1 }, - { RG_BUY_BOMBCHUS_20, SI_BOMBCHU_20_1 }, + { RG_BUY_DEKU_SHIELD, SI_DEKU_SHIELD }, + { RG_BUY_GORON_TUNIC, SI_GORON_TUNIC }, + { RG_BUY_ZORA_TUNIC, SI_ZORA_TUNIC }, + { RG_BUY_HEART, SI_RECOVERY_HEART }, + { RG_BUY_BOMBCHUS_10, SI_BOMBCHU_10_1 }, + { RG_BUY_BOMBCHUS_20, SI_BOMBCHU_20_1 }, { RG_BUY_DEKU_SEEDS_30, SI_DEKU_SEEDS_30 }, - { RG_BUY_BLUE_FIRE, SI_BLUE_FIRE }, - { RG_BUY_BOTTLE_BUG, SI_BUGS }, - { RG_BUY_POE, SI_POE }, + { RG_BUY_BLUE_FIRE, SI_BLUE_FIRE }, + { RG_BUY_BOTTLE_BUG, SI_BUGS }, + { RG_BUY_POE, SI_POE }, { RG_BUY_FAIRYS_SPIRIT, SI_FAIRY }, - { RG_BUY_ARROWS_10, SI_ARROWS_10 }, - { RG_BUY_BOMBS_20, SI_BOMBS_20 }, - { RG_BUY_BOMBS_30, SI_BOMBS_30 }, - { RG_BUY_BOMBS_535, SI_BOMBS_5_R35 }, + { RG_BUY_ARROWS_10, SI_ARROWS_10 }, + { RG_BUY_BOMBS_20, SI_BOMBS_20 }, + { RG_BUY_BOMBS_30, SI_BOMBS_30 }, + { RG_BUY_BOMBS_535, SI_BOMBS_5_R35 }, { RG_BUY_RED_POTION_40, SI_RED_POTION_R40 }, { RG_BUY_RED_POTION_50, SI_RED_POTION_R50 }, }; @@ -300,112 +437,137 @@ void Randomizer::LoadMerchantMessages() { CustomMessageManager::Instance->ClearMessageTable(Randomizer::merchantMessageTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::merchantMessageTableID); - // Prices have a chance of being 0, and the "sell" message below doesn't really make sense for a free item, so adding a "free" variation here - CustomMessageManager::Instance->CreateMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM_FREE, - CustomMessage("\x12\x38\x82" "All right! You win! In return for sparing me, I will give you a #[[1]]#!&Please, take it!\x07\x10\xA3", - "\x12\x38\x82" "In Ordnung! Du gewinnst! Im Austausch dafür, dass Du mich verschont hast, werde ich Dir einen #[[1]]# geben!\x07\x10\xA3", - "\x12\x38\x82" "J'me rends! Laisse-moi partir et en échange, je te donne un #[[1]]#! Vas-y prends le!\x07\x10\xA3", - {QM_GREEN})); - CustomMessageManager::Instance->CreateMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM, - CustomMessage("\x12\x38\x82" "All right! You win! In return for sparing me, I will sell you a #[[1]]#! #[[2]] Rupees# it is!\x07\x10\xA3", - "\x12\x38\x82" "Ich gebe auf! Ich verkaufe Dir einen #[[1]]# für #[[2]] Rubine#!\x07\x10\xA3", - "\x12\x38\x82" "J'abandonne! Tu veux bien m'acheter un #[[1]]#? Ça fera #[[2]] Rubis#!\x07\x10\xA3", - {QM_GREEN, QM_YELLOW})); + // Prices have a chance of being 0, and the "sell" message below doesn't really make sense for a free item, so + // adding a "free" variation here + CustomMessageManager::Instance->CreateMessage( + Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM_FREE, + CustomMessage( + "\x12\x38\x82" + "All right! You win! In return for sparing me, I will give you a #[[1]]#!&Please, take it!\x07\x10\xA3", + "\x12\x38\x82" + "In Ordnung! Du gewinnst! Im Austausch dafür, dass Du mich verschont hast, werde ich Dir einen #[[1]]# " + "geben!\x07\x10\xA3", + "\x12\x38\x82" + "J'me rends! Laisse-moi partir et en échange, je te donne un #[[1]]#! Vas-y prends le!\x07\x10\xA3", + { QM_GREEN })); + CustomMessageManager::Instance->CreateMessage( + Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM, + CustomMessage("\x12\x38\x82" + "All right! You win! In return for sparing me, I will sell you a #[[1]]#! #[[2]] Rupees# it " + "is!\x07\x10\xA3", + "\x12\x38\x82" + "Ich gebe auf! Ich verkaufe Dir einen #[[1]]# für #[[2]] Rubine#!\x07\x10\xA3", + "\x12\x38\x82" + "J'abandonne! Tu veux bien m'acheter un #[[1]]#? Ça fera #[[2]] Rubis#!\x07\x10\xA3", + { QM_GREEN, QM_YELLOW })); - //Carpet Salesman + // Carpet Salesman CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_ARMS_DEALER, CustomMessage("Finally! Now I can go back to being an #arms dealer#!", - /*german*/"Endlich! Schon bald kann ich wieder #Krabbelminen-Händler# sein!", - /*french*/"Squalala! Je vais enfin pouvoir #prendre des vacances#!", - {QM_RED})); + /*german*/ "Endlich! Schon bald kann ich wieder #Krabbelminen-Händler# sein!", + /*french*/ "Squalala! Je vais enfin pouvoir #prendre des vacances#!", { QM_RED })); // Each shop item has two messages, one for when the cursor is over it, and one for when you select it and are // prompted buy/don't buy CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM, - CustomMessage("\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", + CustomMessage( + "\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", "\x08#[[1]]# #[[2]]_Rubine#&Sonderangebot! #NUR NOCH EINES VERFÜGBAR#!&Beeilen Sie sich!\x0A\x02", "\x08#[[1]]# #[[2]]_Rubis#&Offre spéciale! #DERNIER EN STOCK#!&Faites vite!\x0A\x02", - {QM_GREEN, QM_YELLOW, QM_RED})); + { QM_GREEN, QM_YELLOW, QM_RED })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM_CONFIRM, CustomMessage("\x08#[[1]]# #[[2]]_Rupees#\x09\x1B#Buy&Don't buy#\x09\x02", - "\x08#[[1]]# #[[2]]_Rubine#\x09\x1B#Kaufen&Nicht kaufen#\x09\x02", - "\x08#[[1]]# #[[2]]_Rubis#\x09\x1B#Acheter&Ne pas acheter#\x09\x02", - {QM_GREEN, QM_YELLOW, QM_GREEN})); - + "\x08#[[1]]# #[[2]]_Rubine#\x09\x1B#Kaufen&Nicht kaufen#\x09\x02", + "\x08#[[1]]# #[[2]]_Rubis#\x09\x1B#Acheter&Ne pas acheter#\x09\x02", + { QM_GREEN, QM_YELLOW, QM_GREEN })); + CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_10, - CustomMessage("I tried to be a #magic bean# salesman, but it turns out my marketing skills weren't worth " - "beans!^Anyway, want to buy #[[1]]# for #[[2]] Rupees#?\x1B#Yes&No#", - /*german*/ "Möchten Sie #[[1]]# für #[[2]] Rubine# kaufen?\x1B#Ja&Nein#", - /*french*/ "J'ai essayé d'être un vendeur de #haricots magiques#, mais j'étais mauvais au niveau du marketing et ça " - "me courait sur le haricot...^Enfin bref, ça te dirait de m'acheter #[[1]]# pour #[[2]] Rubis#?\x1B#Oui&Non#", - {QM_RED, QM_GREEN, QM_YELLOW, QM_GREEN})); + CustomMessage( + "I tried to be a #magic bean# salesman, but it turns out my marketing skills weren't worth " + "beans!^Anyway, want to buy #[[1]]# for #[[2]] Rupees#?\x1B#Yes&No#", + /*german*/ "Möchten Sie #[[1]]# für #[[2]] Rubine# kaufen?\x1B#Ja&Nein#", + /*french*/ + "J'ai essayé d'être un vendeur de #haricots magiques#, mais j'étais mauvais au niveau du marketing et ça " + "me courait sur le haricot...^Enfin bref, ça te dirait de m'acheter #[[1]]# pour #[[2]] " + "Rubis#?\x1B#Oui&Non#", + { QM_RED, QM_GREEN, QM_YELLOW, QM_GREEN })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_100, - CustomMessage("I never thought I'd say this, but I'm selling the last #Magic Bean#.^#99 Rupees#, no less.\x1B#Yes&No#", - "Ich hätte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^#Wundererbse# für #99 Rubine#.\x1B&#Ja&Nein#", - "Je te vends mon dernier #Haricot&magique# pour #99 Rubis#.\x1B&#AcheterNe pas acheter#", - {QM_RED, QM_YELLOW, QM_GREEN})); + CustomMessage( + "I never thought I'd say this, but I'm selling the last #Magic Bean#.^#99 Rupees#, no less.\x1B#Yes&No#", + "Ich hätte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^#Wundererbse# für #99 " + "Rubine#.\x1B&#Ja&Nein#", + "Je te vends mon dernier #Haricot&magique# pour #99 Rubis#.\x1B&#AcheterNe pas acheter#", + { QM_RED, QM_YELLOW, QM_GREEN })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_MEDIGORON, CustomMessage("How about buying #[[1]]# for #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "Möchtest Du #[[1]]# für #[[2]] Rubine# kaufen?\x1B#Klar!&Nie im Leben!#", - /*french*/ "Veux-tu acheter #[[1]]# pour #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", - {QM_GREEN, QM_YELLOW, QM_GREEN})); - /*spanish*/ // ¿Me compras #[[1]]# por #[[2]] rupias#?\x1B#Comprar&No comprar# + /*german*/ "Möchtest Du #[[1]]# für #[[2]] Rubine# kaufen?\x1B#Klar!&Nie im Leben!#", + /*french*/ "Veux-tu acheter #[[1]]# pour #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", + { QM_GREEN, QM_YELLOW, QM_GREEN })); + /*spanish*/ // ¿Me compras #[[1]]# por #[[2]] rupias#?\x1B#Comprar&No comprar# + + CustomMessage firstCarpet = CustomMessage( + "Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special is...^", + /*german*/ + "Sei gegrüßt!^Ich verkaufe allerlei Kuriositäten. Stets sonderliche und seltene Ware aus " + "aller Welt für jedermann. Das heutige Angebot bleibt...^", + /*french*/ "Bienvenue!^Je vends des objets rares et merveilleux du monde entier. En spécial aujourd'hui...^"); + /*spanish*/ // ¡Acércate!^Vendo productos extraños y difíciles de encontrar... De todo el mundo a todo el mundo. La + // oferta de hoy es...^#¡ - CustomMessage firstCarpet = CustomMessage("Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special is...^", - /*german*/ "Sei gegrüßt!^Ich verkaufe allerlei Kuriositäten. Stets sonderliche und seltene Ware aus " - "aller Welt für jedermann. Das heutige Angebot bleibt...^", - /*french*/ "Bienvenue!^Je vends des objets rares et merveilleux du monde entier. En spécial aujourd'hui...^"); - /*spanish*/ // ¡Acércate!^Vendo productos extraños y difíciles de encontrar... De todo el mundo a todo el mundo. La oferta de hoy es...^#¡ - CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_MYSTERIOUS, firstCarpet + - CustomMessage("Terrifying! I won't tell you what it is until I see the #money#...^How about #[[2]] Rupees#?&&" - "\x1B#Buy&Don't buy#", - /*german*/ "Furchterregend, oder? Ich erzähle Euch mehr, wenn ich #Geld# sehe...^Wie wär's mit #[[2]] Rubinen#?&&" - "\x1B#Aber sicher!&Ich bin weg!#", - /*french*/ "Terrible! Mais montre tes #rubis# avant que je te dise ce que c'est...^Disons #[[2]] " - "rubis#?&&\x1B#Acheter&Ne pas acheter#", - {QM_RED, QM_YELLOW, QM_GREEN})); - /*spanish*/ // ¡Terrorífico! No te revelaré su nombre hasta que vea el #dinero#...^#[[2]] rupias#, ¿qué te parece?&&" - // "\x1B#Comprar&No comprar# + CustomMessage( + "Terrifying! I won't tell you what it is until I see the #money#...^How about #[[2]] Rupees#?&&" + "\x1B#Buy&Don't buy#", + /*german*/ + "Furchterregend, oder? Ich erzähle Euch mehr, wenn ich #Geld# sehe...^Wie wär's mit #[[2]] Rubinen#?&&" + "\x1B#Aber sicher!&Ich bin weg!#", + /*french*/ + "Terrible! Mais montre tes #rubis# avant que je te dise ce que c'est...^Disons #[[2]] " + "rubis#?&&\x1B#Acheter&Ne pas acheter#", + { QM_RED, QM_YELLOW, QM_GREEN })); + /*spanish*/ // ¡Terrorífico! No te revelaré su nombre hasta que vea el #dinero#...^#[[2]] rupias#, ¿qué te + // parece?&&" + // "\x1B#Comprar&No comprar# CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_1, firstCarpet + - CustomMessage("#[[1]]!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" - "How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "#[[1]]#! Ich kann versichern, es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich würde Dich doch " - "nicht #anlügen#, oder?^Wie wär's mit #[[2]] Rubinen#?\x1B#Aber sicher!&Ich bin weg!#", - /*french*/ "#[[1]]!# C'est vrai! J'te jure! Un gars comme moi ne te #mentirai# pas tu ne crois pas?^Disons #[[2]] " - "rubis#?\x1B#Acheter&Ne pas acheter#", - {QM_GREEN, QM_RED, QM_YELLOW})); + CustomMessage( + "#[[1]]!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" + "How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", + /*german*/ + "#[[1]]#! Ich kann versichern, es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich würde Dich " + "doch " + "nicht #anlügen#, oder?^Wie wär's mit #[[2]] Rubinen#?\x1B#Aber sicher!&Ich bin weg!#", + /*french*/ + "#[[1]]!# C'est vrai! J'te jure! Un gars comme moi ne te #mentirai# pas tu ne crois pas?^Disons #[[2]] " + "rubis#?\x1B#Acheter&Ne pas acheter#", + { QM_GREEN, QM_RED, QM_YELLOW })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_GRANNYS_SHOP, CustomMessage("#[[1]]#! How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "#[[1]]#! Sagen wir #[[2]] Rubine#?\x1B#Gerne!&Auf keinen Fall!#", - /*french*/ "#[[1]]#! Que dis-tu de #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", - {QM_GREEN, QM_YELLOW, QM_GREEN}, {true})); - // /*spanish*/#[[1]]#. Vendo por #[[2]] rupias#.&\x1B#Comprar&No comprar# + /*german*/ "#[[1]]#! Sagen wir #[[2]] Rubine#?\x1B#Gerne!&Auf keinen Fall!#", + /*french*/ "#[[1]]#! Que dis-tu de #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", + { QM_GREEN, QM_YELLOW, QM_GREEN }, { true })); + // /*spanish*/#[[1]]#. Vendo por #[[2]] rupias#.&\x1B#Comprar&No comprar# } std::map trialFlagToTrialKey = { - { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL }, - { EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL }, - { EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL }, - { EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL }, - { EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL }, - { EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL }, + { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL }, { EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL }, + { EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL }, { EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL }, + { EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL }, { EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL }, }; bool Randomizer::IsTrialRequired(s32 trialFlag) { @@ -455,9 +617,11 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_HYLIAN_SHIELD: case RG_BUY_HYLIAN_SHIELD: - return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN) ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_MIRROR_SHIELD: - return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_MIRROR) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_MIRROR) ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GORON_TUNIC: case RG_BUY_GORON_TUNIC: return !CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; @@ -471,27 +635,34 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // Inventory Items case RG_PROGRESSIVE_STICK_UPGRADE: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (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).Get() - ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; + 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 ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_NUTS_5: 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).Get() - ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; + 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 ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_BOMB_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_BOMB_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_BOMBS_5: case RG_BOMBS_10: case RG_BOMBS_20: @@ -502,9 +673,9 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BUY_BOMBS_30: return CUR_UPG_VALUE(UPG_BOMB_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_BOW: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_QUIVER) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_QUIVER) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_ARROWS_5: case RG_ARROWS_10: case RG_ARROWS_30: @@ -513,9 +684,10 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BUY_ARROWS_50: return CUR_UPG_VALUE(UPG_QUIVER) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_SLINGSHOT: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (CUR_UPG_VALUE(UPG_BULLET_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (CUR_UPG_VALUE(UPG_BULLET_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_SEEDS_30: case RG_BUY_DEKU_SEEDS_30: return CUR_UPG_VALUE(UPG_BULLET_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; @@ -533,7 +705,8 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BOMBCHU_20: case RG_BUY_BOMBCHUS_10: case RG_BUY_BOMBCHUS_20: - case RG_PROGRESSIVE_BOMBCHUS: //RANDOTODO Do we want bombchu refills to exist seperatly from bombchu bags? If so, this needs changing. + case RG_PROGRESSIVE_BOMBCHUS: // RANDOTODO Do we want bombchu refills to exist seperatly from bombchu bags? If + // so, this needs changing. return CAN_OBTAIN; case RG_PROGRESSIVE_HOOKSHOT: switch (INV_CONTENT(ITEM_HOOKSHOT)) { @@ -634,9 +807,10 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_PROGRESSIVE_MAGIC_METER: case RG_MAGIC_SINGLE: case RG_MAGIC_DOUBLE: - return infiniteUpgrades != RO_INF_UPGRADES_OFF ? - (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : - (gSaveContext.magicLevel < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); + return infiniteUpgrades != RO_INF_UPGRADES_OFF + ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER) ? CANT_OBTAIN_ALREADY_HAVE + : CAN_OBTAIN) + : (gSaveContext.magicLevel < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_FISHING_POLE: return !Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; @@ -704,7 +878,8 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_SHADOW_TEMPLE_COMPASS: return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_SHADOW_TEMPLE) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_BOTTOM_OF_THE_WELL_COMPASS: - return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_BOTTOM_OF_THE_WELL) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_BOTTOM_OF_THE_WELL) ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_ICE_CAVERN_COMPASS: return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_ICE_CAVERN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_FOREST_TEMPLE_BOSS_KEY: @@ -720,25 +895,46 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_GANONS_CASTLE_BOSS_KEY: return !CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_FOREST_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] < FOREST_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_FOREST_TEMPLE] < FOREST_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_FIRE_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] < FIRE_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_FIRE_TEMPLE] < FIRE_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_WATER_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] < WATER_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_WATER_TEMPLE] < WATER_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_SPIRIT_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] < SPIRIT_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_SPIRIT_TEMPLE] < SPIRIT_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_SHADOW_TEMPLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] < SHADOW_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] < SHADOW_TEMPLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_BOTTOM_OF_THE_WELL_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] < BOTTOM_OF_THE_WELL_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] < BOTTOM_OF_THE_WELL_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GERUDO_TRAINING_GROUND_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] < GERUDO_TRAINING_GROUND_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] < + GERUDO_TRAINING_GROUND_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GERUDO_FORTRESS_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] < GERUDO_FORTRESS_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] < GERUDO_FORTRESS_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_GANONS_CASTLE_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] < GANONS_CASTLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] < GANONS_CASTLE_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; case RG_TREASURE_GAME_SMALL_KEY: - return gSaveContext.inventory.dungeonKeys[SCENE_TREASURE_BOX_SHOP] < TREASURE_GAME_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + return gSaveContext.inventory.dungeonKeys[SCENE_TREASURE_BOX_SHOP] < TREASURE_GAME_SMALL_KEY_MAX + ? CAN_OBTAIN + : CANT_OBTAIN_ALREADY_HAVE; // Dungeon Rewards case RG_KOKIRI_EMERALD: @@ -794,469 +990,474 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // There has been some talk about potentially just using the RC identifier to store flags rather than randomizer inf, so // for now we're not going to store randomzierInf in the randomizer check objects, we're just going to map them 1:1 here std::map rcToRandomizerInf = { - { RC_KF_LINKS_HOUSE_COW, RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW }, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT }, - { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT }, - { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE }, - { RC_LW_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR }, - { RC_LW_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT }, - { RC_SFM_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR }, - { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT }, - { RC_HF_DEKU_SCRUB_GROTTO, RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO }, - { RC_HF_COW_GROTTO_COW, RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW }, - { RC_LH_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT }, - { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_LH_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER }, - { RC_GV_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR }, - { RC_GV_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT }, - { RC_GV_COW, RAND_INF_COWS_MILKED_GV_COW }, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR }, - { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT }, - { RC_KAK_IMPAS_HOUSE_COW, RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW }, - { RC_DMT_COW_GROTTO_COW, RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW }, - { RC_GC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT }, - { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_GC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER }, - { RC_DMC_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB }, - { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT }, - { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER }, - { RC_ZR_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR }, - { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT }, - { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT }, - { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT }, - { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER }, - { RC_LLR_STABLES_LEFT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW }, - { RC_LLR_STABLES_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW }, - { RC_LLR_TOWER_LEFT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW }, - { RC_LLR_TOWER_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW }, - { RC_DEKU_TREE_MQ_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT }, - { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE }, - { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS }, - { RC_JABU_JABUS_BELLY_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB }, - { RC_JABU_JABUS_BELLY_MQ_COW, RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW }, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT }, - { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT }, - { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT }, - { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT }, - { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT }, - { RC_KF_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1 }, - { RC_KF_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2 }, - { RC_KF_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3 }, - { RC_KF_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4 }, - { RC_KF_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5 }, - { RC_KF_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6 }, - { RC_KF_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7 }, - { RC_KF_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8 }, - { RC_GC_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1 }, - { RC_GC_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2 }, - { RC_GC_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3 }, - { RC_GC_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4 }, - { RC_GC_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5 }, - { RC_GC_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6 }, - { RC_GC_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7 }, - { RC_GC_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8 }, - { RC_ZD_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1 }, - { RC_ZD_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2 }, - { RC_ZD_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3 }, - { RC_ZD_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4 }, - { RC_ZD_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5 }, - { RC_ZD_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6 }, - { RC_ZD_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7 }, - { RC_ZD_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8 }, - { RC_KAK_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1 }, - { RC_KAK_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2 }, - { RC_KAK_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3 }, - { RC_KAK_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4 }, - { RC_KAK_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5 }, - { RC_KAK_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6 }, - { RC_KAK_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7 }, - { RC_KAK_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8 }, - { RC_KAK_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1 }, - { RC_KAK_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2 }, - { RC_KAK_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3 }, - { RC_KAK_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4 }, - { RC_KAK_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5 }, - { RC_KAK_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6 }, - { RC_KAK_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7 }, - { RC_KAK_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8 }, - { RC_MARKET_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1 }, - { RC_MARKET_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2 }, - { RC_MARKET_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3 }, - { RC_MARKET_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4 }, - { RC_MARKET_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5 }, - { RC_MARKET_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6 }, - { RC_MARKET_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7 }, - { RC_MARKET_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8 }, - { RC_MARKET_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1 }, - { RC_MARKET_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2 }, - { RC_MARKET_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3 }, - { RC_MARKET_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4 }, - { RC_MARKET_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5 }, - { RC_MARKET_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6 }, - { RC_MARKET_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7 }, - { RC_MARKET_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7 }, - { RC_MARKET_BOMBCHU_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8 }, - { RC_TOT_MASTER_SWORD, RAND_INF_TOT_MASTER_SWORD }, - { RC_GC_MEDIGORON, RAND_INF_MERCHANTS_MEDIGORON }, - { RC_KAK_GRANNYS_SHOP, RAND_INF_MERCHANTS_GRANNYS_SHOP }, - { RC_WASTELAND_BOMBCHU_SALESMAN, RAND_INF_MERCHANTS_CARPET_SALESMAN }, - { RC_ZR_MAGIC_BEAN_SALESMAN, RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN }, - { RC_LW_TRADE_COJIRO, RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO }, - { RC_GV_TRADE_SAW, RAND_INF_ADULT_TRADES_GV_TRADE_SAW }, - { RC_DMT_TRADE_BROKEN_SWORD, RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD }, - { RC_LH_TRADE_FROG, RAND_INF_ADULT_TRADES_LH_TRADE_FROG }, - { RC_DMT_TRADE_EYEDROPS, RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS }, - { RC_LH_CHILD_FISHING, RAND_INF_CHILD_FISHING }, - { RC_LH_ADULT_FISHING, RAND_INF_ADULT_FISHING }, - { RC_MARKET_10_BIG_POES, RAND_INF_10_BIG_POES }, - { RC_KAK_100_GOLD_SKULLTULA_REWARD, RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD }, - { RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT }, - { RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT }, - { RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO }, - { RC_SFM_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_SFM_STORMS_GROTTO }, - { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT }, - { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT }, - { RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT }, - { RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT }, - { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT }, - { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT }, - { RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO }, - { RC_LLR_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LLR_GROTTO }, - { RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT }, - { RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT }, - { RC_DMT_COW_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMT_COW_GROTTO }, - { RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT }, - { RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT }, - { RC_GC_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GC_GROTTO }, - { RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT }, - { RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT }, - { RC_DMC_HAMMER_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO }, - { RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT }, - { RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT }, - { RC_ZR_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_ZR_STORMS_GROTTO }, - { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT }, - { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT }, - { RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA }, - { RC_LH_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LH_GROTTO }, - { RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO }, - { RC_COLOSSUS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_COLOSSUS_GROTTO }, - { RC_LH_CHILD_FISH_1, RAND_INF_CHILD_FISH_1 }, - { RC_LH_CHILD_FISH_2, RAND_INF_CHILD_FISH_2 }, - { RC_LH_CHILD_FISH_3, RAND_INF_CHILD_FISH_3 }, - { RC_LH_CHILD_FISH_4, RAND_INF_CHILD_FISH_4 }, - { RC_LH_CHILD_FISH_5, RAND_INF_CHILD_FISH_5 }, - { RC_LH_CHILD_FISH_6, RAND_INF_CHILD_FISH_6 }, - { RC_LH_CHILD_FISH_7, RAND_INF_CHILD_FISH_7 }, - { RC_LH_CHILD_FISH_8, RAND_INF_CHILD_FISH_8 }, - { RC_LH_CHILD_FISH_9, RAND_INF_CHILD_FISH_9 }, - { RC_LH_CHILD_FISH_10, RAND_INF_CHILD_FISH_10 }, - { RC_LH_CHILD_FISH_11, RAND_INF_CHILD_FISH_11 }, - { RC_LH_CHILD_FISH_12, RAND_INF_CHILD_FISH_12 }, - { RC_LH_CHILD_FISH_13, RAND_INF_CHILD_FISH_13 }, - { RC_LH_CHILD_FISH_14, RAND_INF_CHILD_FISH_14 }, - { RC_LH_CHILD_FISH_15, RAND_INF_CHILD_FISH_15 }, - { RC_LH_CHILD_LOACH_1, RAND_INF_CHILD_LOACH_1 }, - { RC_LH_CHILD_LOACH_2, RAND_INF_CHILD_LOACH_2 }, - { RC_LH_ADULT_FISH_1, RAND_INF_ADULT_FISH_1 }, - { RC_LH_ADULT_FISH_2, RAND_INF_ADULT_FISH_2 }, - { RC_LH_ADULT_FISH_3, RAND_INF_ADULT_FISH_3 }, - { RC_LH_ADULT_FISH_4, RAND_INF_ADULT_FISH_4 }, - { RC_LH_ADULT_FISH_5, RAND_INF_ADULT_FISH_5 }, - { RC_LH_ADULT_FISH_6, RAND_INF_ADULT_FISH_6 }, - { RC_LH_ADULT_FISH_7, RAND_INF_ADULT_FISH_7 }, - { RC_LH_ADULT_FISH_8, RAND_INF_ADULT_FISH_8 }, - { RC_LH_ADULT_FISH_9, RAND_INF_ADULT_FISH_9 }, - { RC_LH_ADULT_FISH_10, RAND_INF_ADULT_FISH_10 }, - { RC_LH_ADULT_FISH_11, RAND_INF_ADULT_FISH_11 }, - { RC_LH_ADULT_FISH_12, RAND_INF_ADULT_FISH_12 }, - { RC_LH_ADULT_FISH_13, RAND_INF_ADULT_FISH_13 }, - { RC_LH_ADULT_FISH_14, RAND_INF_ADULT_FISH_14 }, - { RC_LH_ADULT_FISH_15, RAND_INF_ADULT_FISH_15 }, - { RC_LH_ADULT_LOACH, RAND_INF_ADULT_LOACH }, - { RC_ZR_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO }, - { RC_DMC_UPPER_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO }, - { RC_DMT_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO }, - { RC_KAK_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO }, - { RC_HF_NEAR_MARKET_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO }, - { RC_HF_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO }, - { RC_HF_SOUTHEAST_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO }, - { RC_KF_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO }, - { RC_ZD_FISH_1, RAND_INF_ZD_FISH_1 }, - { RC_ZD_FISH_2, RAND_INF_ZD_FISH_2 }, - { RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 }, - { RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 }, - { RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 }, + { RC_KF_LINKS_HOUSE_COW, RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW }, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT }, + { RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT }, + { RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE }, + { RC_LW_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR }, + { RC_LW_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT }, + { RC_SFM_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR }, + { RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT }, + { RC_HF_DEKU_SCRUB_GROTTO, RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO }, + { RC_HF_COW_GROTTO_COW, RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW }, + { RC_LH_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT }, + { RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_LH_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER }, + { RC_GV_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR }, + { RC_GV_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT }, + { RC_GV_COW, RAND_INF_COWS_MILKED_GV_COW }, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR }, + { RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT }, + { RC_KAK_IMPAS_HOUSE_COW, RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW }, + { RC_DMT_COW_GROTTO_COW, RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW }, + { RC_GC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT }, + { RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_GC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER }, + { RC_DMC_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB }, + { RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT }, + { RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER }, + { RC_ZR_DEKU_SCRUB_GROTTO_REAR, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR }, + { RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT }, + { RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT }, + { RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT }, + { RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER }, + { RC_LLR_STABLES_LEFT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW }, + { RC_LLR_STABLES_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW }, + { RC_LLR_TOWER_LEFT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW }, + { RC_LLR_TOWER_RIGHT_COW, RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW }, + { RC_DEKU_TREE_MQ_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT }, + { RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE }, + { RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS }, + { RC_JABU_JABUS_BELLY_DEKU_SCRUB, RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB }, + { RC_JABU_JABUS_BELLY_MQ_COW, RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW }, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT }, + { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT }, + { RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT }, + { RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT }, + { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT }, + { RC_KF_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1 }, + { RC_KF_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2 }, + { RC_KF_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3 }, + { RC_KF_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4 }, + { RC_KF_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5 }, + { RC_KF_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6 }, + { RC_KF_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7 }, + { RC_KF_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8 }, + { RC_GC_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1 }, + { RC_GC_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2 }, + { RC_GC_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3 }, + { RC_GC_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4 }, + { RC_GC_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5 }, + { RC_GC_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6 }, + { RC_GC_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7 }, + { RC_GC_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8 }, + { RC_ZD_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1 }, + { RC_ZD_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2 }, + { RC_ZD_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3 }, + { RC_ZD_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4 }, + { RC_ZD_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5 }, + { RC_ZD_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6 }, + { RC_ZD_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7 }, + { RC_ZD_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8 }, + { RC_KAK_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1 }, + { RC_KAK_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2 }, + { RC_KAK_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3 }, + { RC_KAK_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4 }, + { RC_KAK_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5 }, + { RC_KAK_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6 }, + { RC_KAK_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7 }, + { RC_KAK_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8 }, + { RC_KAK_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1 }, + { RC_KAK_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2 }, + { RC_KAK_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3 }, + { RC_KAK_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4 }, + { RC_KAK_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5 }, + { RC_KAK_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6 }, + { RC_KAK_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7 }, + { RC_KAK_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8 }, + { RC_MARKET_BAZAAR_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1 }, + { RC_MARKET_BAZAAR_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2 }, + { RC_MARKET_BAZAAR_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3 }, + { RC_MARKET_BAZAAR_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4 }, + { RC_MARKET_BAZAAR_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5 }, + { RC_MARKET_BAZAAR_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6 }, + { RC_MARKET_BAZAAR_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7 }, + { RC_MARKET_BAZAAR_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8 }, + { RC_MARKET_POTION_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1 }, + { RC_MARKET_POTION_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2 }, + { RC_MARKET_POTION_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3 }, + { RC_MARKET_POTION_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4 }, + { RC_MARKET_POTION_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5 }, + { RC_MARKET_POTION_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6 }, + { RC_MARKET_POTION_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7 }, + { RC_MARKET_POTION_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_1, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_2, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_3, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_4, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_5, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_6, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_7, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7 }, + { RC_MARKET_BOMBCHU_SHOP_ITEM_8, RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8 }, + { RC_TOT_MASTER_SWORD, RAND_INF_TOT_MASTER_SWORD }, + { RC_GC_MEDIGORON, RAND_INF_MERCHANTS_MEDIGORON }, + { RC_KAK_GRANNYS_SHOP, RAND_INF_MERCHANTS_GRANNYS_SHOP }, + { RC_WASTELAND_BOMBCHU_SALESMAN, RAND_INF_MERCHANTS_CARPET_SALESMAN }, + { RC_ZR_MAGIC_BEAN_SALESMAN, RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN }, + { RC_LW_TRADE_COJIRO, RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO }, + { RC_GV_TRADE_SAW, RAND_INF_ADULT_TRADES_GV_TRADE_SAW }, + { RC_DMT_TRADE_BROKEN_SWORD, RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD }, + { RC_LH_TRADE_FROG, RAND_INF_ADULT_TRADES_LH_TRADE_FROG }, + { RC_DMT_TRADE_EYEDROPS, RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS }, + { RC_LH_CHILD_FISHING, RAND_INF_CHILD_FISHING }, + { RC_LH_ADULT_FISHING, RAND_INF_ADULT_FISHING }, + { RC_MARKET_10_BIG_POES, RAND_INF_10_BIG_POES }, + { RC_KAK_100_GOLD_SKULLTULA_REWARD, RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD }, + { RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT }, + { RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT }, + { RC_LW_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO }, + { RC_SFM_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_SFM_STORMS_GROTTO }, + { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT }, + { RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT }, + { RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT }, + { RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT }, + { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT }, + { RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT }, + { RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO }, + { RC_LLR_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LLR_GROTTO }, + { RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT }, + { RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT }, + { RC_DMT_COW_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMT_COW_GROTTO }, + { RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT }, + { RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT }, + { RC_GC_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GC_GROTTO }, + { RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT }, + { RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT }, + { RC_DMC_HAMMER_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO }, + { RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT }, + { RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT }, + { RC_ZR_STORMS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_ZR_STORMS_GROTTO }, + { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT }, + { RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT }, + { RC_ZD_BEHIND_KING_ZORA_BEEHIVE, RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA }, + { RC_LH_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_LH_GROTTO }, + { RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO }, + { RC_COLOSSUS_GROTTO_BEEHIVE, RAND_INF_BEEHIVE_COLOSSUS_GROTTO }, + { RC_LH_CHILD_FISH_1, RAND_INF_CHILD_FISH_1 }, + { RC_LH_CHILD_FISH_2, RAND_INF_CHILD_FISH_2 }, + { RC_LH_CHILD_FISH_3, RAND_INF_CHILD_FISH_3 }, + { RC_LH_CHILD_FISH_4, RAND_INF_CHILD_FISH_4 }, + { RC_LH_CHILD_FISH_5, RAND_INF_CHILD_FISH_5 }, + { RC_LH_CHILD_FISH_6, RAND_INF_CHILD_FISH_6 }, + { RC_LH_CHILD_FISH_7, RAND_INF_CHILD_FISH_7 }, + { RC_LH_CHILD_FISH_8, RAND_INF_CHILD_FISH_8 }, + { RC_LH_CHILD_FISH_9, RAND_INF_CHILD_FISH_9 }, + { RC_LH_CHILD_FISH_10, RAND_INF_CHILD_FISH_10 }, + { RC_LH_CHILD_FISH_11, RAND_INF_CHILD_FISH_11 }, + { RC_LH_CHILD_FISH_12, RAND_INF_CHILD_FISH_12 }, + { RC_LH_CHILD_FISH_13, RAND_INF_CHILD_FISH_13 }, + { RC_LH_CHILD_FISH_14, RAND_INF_CHILD_FISH_14 }, + { RC_LH_CHILD_FISH_15, RAND_INF_CHILD_FISH_15 }, + { RC_LH_CHILD_LOACH_1, RAND_INF_CHILD_LOACH_1 }, + { RC_LH_CHILD_LOACH_2, RAND_INF_CHILD_LOACH_2 }, + { RC_LH_ADULT_FISH_1, RAND_INF_ADULT_FISH_1 }, + { RC_LH_ADULT_FISH_2, RAND_INF_ADULT_FISH_2 }, + { RC_LH_ADULT_FISH_3, RAND_INF_ADULT_FISH_3 }, + { RC_LH_ADULT_FISH_4, RAND_INF_ADULT_FISH_4 }, + { RC_LH_ADULT_FISH_5, RAND_INF_ADULT_FISH_5 }, + { RC_LH_ADULT_FISH_6, RAND_INF_ADULT_FISH_6 }, + { RC_LH_ADULT_FISH_7, RAND_INF_ADULT_FISH_7 }, + { RC_LH_ADULT_FISH_8, RAND_INF_ADULT_FISH_8 }, + { RC_LH_ADULT_FISH_9, RAND_INF_ADULT_FISH_9 }, + { RC_LH_ADULT_FISH_10, RAND_INF_ADULT_FISH_10 }, + { RC_LH_ADULT_FISH_11, RAND_INF_ADULT_FISH_11 }, + { RC_LH_ADULT_FISH_12, RAND_INF_ADULT_FISH_12 }, + { RC_LH_ADULT_FISH_13, RAND_INF_ADULT_FISH_13 }, + { RC_LH_ADULT_FISH_14, RAND_INF_ADULT_FISH_14 }, + { RC_LH_ADULT_FISH_15, RAND_INF_ADULT_FISH_15 }, + { RC_LH_ADULT_LOACH, RAND_INF_ADULT_LOACH }, + { RC_ZR_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO }, + { RC_DMC_UPPER_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO }, + { RC_DMT_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO }, + { RC_KAK_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO }, + { RC_HF_NEAR_MARKET_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO }, + { RC_HF_OPEN_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO }, + { RC_HF_SOUTHEAST_GROTTO_FISH, RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO }, + { RC_KF_STORMS_GROTTO_FISH, RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO }, + { RC_ZD_FISH_1, RAND_INF_ZD_FISH_1 }, + { RC_ZD_FISH_2, RAND_INF_ZD_FISH_2 }, + { RC_ZD_FISH_3, RAND_INF_ZD_FISH_3 }, + { RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 }, + { RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 }, // Grass - { RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 }, - { RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 }, - { RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 }, - { RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 }, - { RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 }, - { RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 }, - { RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 }, - { RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 }, - { RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 }, - { RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 }, - { RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 }, - { RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 }, - { RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 }, - { RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 }, - { RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 }, - { RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 }, - { RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 }, - { RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 }, - { RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 }, - { RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 }, - { RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 }, - { RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 }, - { RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 }, - { RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 }, - { RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 }, - { RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 }, - { RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 }, - { RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 }, - { RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 }, - { RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 }, - { RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 }, - { RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 }, - { RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 }, - { RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 }, - { RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 }, - { RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 }, - { RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 }, - { RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 }, - { RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 }, - { RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 }, - { RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 }, - { RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 }, - { RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 }, - { RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 }, - { RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 }, - { RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 }, - { RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 }, - { RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 }, - { RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 }, - { RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 }, - { RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 }, - { RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 }, - { RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 }, - { RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 }, - { RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 }, - { RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 }, - { RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 }, - { RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 }, - { RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 }, - { RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 }, - { RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 }, - { RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 }, - { RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 }, - { RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 }, - { RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 }, - { RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 }, - { RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 }, - { RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 }, - { RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 }, - { RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 }, - { RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 }, - { RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 }, - { RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 }, - { RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 }, - { RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 }, - { RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 }, - { RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 }, - { RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 }, - { RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 }, - { RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 }, - { RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 }, - { RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 }, - { RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 }, - { RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 }, - { RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 }, - { RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 }, - { RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 }, - { RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 }, - { RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 }, - { RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 }, - { RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 }, - { RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 }, - { RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 }, - { RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 }, - { RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 }, - { RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 }, - { RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 }, - { RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 }, - { RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 }, - { RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 }, - { RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 }, - { RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 }, - { RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 }, - { RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 }, - { RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 }, - { RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 }, - { RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 }, - { RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 }, - { RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 }, - { RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 }, - { RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 }, - { RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 }, - { RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 }, - { RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 }, - { RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 }, - { RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 }, - { RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 }, - { RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 }, - { RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 }, - { RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 }, - { RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 }, - { RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 }, - { RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 }, - { RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 }, - { RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 }, - { RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 }, - { RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 }, - { RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 }, - { RC_HF_NEAR_MARKET_GRASS_1, RAND_INF_HF_NEAR_MARKET_GRASS_1 }, - { RC_HF_NEAR_MARKET_GRASS_2, RAND_INF_HF_NEAR_MARKET_GRASS_2 }, - { RC_HF_NEAR_MARKET_GRASS_3, RAND_INF_HF_NEAR_MARKET_GRASS_3 }, - { RC_HF_NEAR_MARKET_GRASS_4, RAND_INF_HF_NEAR_MARKET_GRASS_4 }, - { RC_HF_NEAR_MARKET_GRASS_5, RAND_INF_HF_NEAR_MARKET_GRASS_5 }, - { RC_HF_NEAR_MARKET_GRASS_6, RAND_INF_HF_NEAR_MARKET_GRASS_6 }, - { RC_HF_NEAR_MARKET_GRASS_7, RAND_INF_HF_NEAR_MARKET_GRASS_7 }, - { RC_HF_NEAR_MARKET_GRASS_8, RAND_INF_HF_NEAR_MARKET_GRASS_8 }, - { RC_HF_NEAR_MARKET_GRASS_9, RAND_INF_HF_NEAR_MARKET_GRASS_9 }, - { RC_HF_NEAR_MARKET_GRASS_10, RAND_INF_HF_NEAR_MARKET_GRASS_10 }, - { RC_HF_NEAR_MARKET_GRASS_11, RAND_INF_HF_NEAR_MARKET_GRASS_11 }, - { RC_HF_NEAR_MARKET_GRASS_12, RAND_INF_HF_NEAR_MARKET_GRASS_12 }, - { RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 }, - { RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 }, - { RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 }, - { RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 }, - { RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 }, - { RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 }, - { RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 }, - { RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 }, - { RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 }, - { RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 }, - { RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 }, - { RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 }, - { RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 }, - { RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 }, - { RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 }, - { RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 }, - { RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 }, - { RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 }, - { RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 }, - { RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 }, - { RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 }, - { RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 }, - { RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 }, - { RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 }, - { RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 }, - { RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 }, - { RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 }, - { RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 }, - { RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 }, - { RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 }, - { RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 }, - { RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 }, - { RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 }, - { RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 }, - { RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 }, - { RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 }, - { RC_ZR_NEAR_FREESTANDING_POH_GRASS, RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS }, + { RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 }, + { RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 }, + { RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 }, + { RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 }, + { RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 }, + { RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 }, + { RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 }, + { RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 }, + { RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 }, + { RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 }, + { RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 }, + { RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 }, + { RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 }, + { RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 }, + { RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 }, + { RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 }, + { RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 }, + { RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 }, + { RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 }, + { RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 }, + { RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 }, + { RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 }, + { RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 }, + { RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 }, + { RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 }, + { RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 }, + { RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 }, + { RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 }, + { RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 }, + { RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 }, + { RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 }, + { RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 }, + { RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 }, + { RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 }, + { RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 }, + { RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 }, + { RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 }, + { RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 }, + { RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 }, + { RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 }, + { RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 }, + { RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 }, + { RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 }, + { RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 }, + { RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 }, + { RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 }, + { RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 }, + { RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 }, + { RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 }, + { RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 }, + { RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 }, + { RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 }, + { RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 }, + { RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 }, + { RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 }, + { RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 }, + { RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 }, + { RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 }, + { RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 }, + { RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 }, + { RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 }, + { RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 }, + { RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 }, + { RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 }, + { RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 }, + { RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 }, + { RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 }, + { RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 }, + { RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 }, + { RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 }, + { RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 }, + { RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 }, + { RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 }, + { RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 }, + { RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 }, + { RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 }, + { RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 }, + { RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 }, + { RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 }, + { RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 }, + { RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 }, + { RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 }, + { RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 }, + { RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 }, + { RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 }, + { RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 }, + { RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 }, + { RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 }, + { RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 }, + { RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 }, + { RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 }, + { RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 }, + { RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 }, + { RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 }, + { RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 }, + { RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 }, + { RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 }, + { RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 }, + { RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 }, + { RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 }, + { RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 }, + { RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 }, + { RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 }, + { RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 }, + { RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 }, + { RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 }, + { RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 }, + { RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 }, + { RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 }, + { RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 }, + { RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 }, + { RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 }, + { RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 }, + { RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 }, + { RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 }, + { RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 }, + { RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 }, + { RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 }, + { RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 }, + { RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 }, + { RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 }, + { RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 }, + { RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 }, + { RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 }, + { RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 }, + { RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 }, + { RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 }, + { RC_HF_NEAR_MARKET_GRASS_1, RAND_INF_HF_NEAR_MARKET_GRASS_1 }, + { RC_HF_NEAR_MARKET_GRASS_2, RAND_INF_HF_NEAR_MARKET_GRASS_2 }, + { RC_HF_NEAR_MARKET_GRASS_3, RAND_INF_HF_NEAR_MARKET_GRASS_3 }, + { RC_HF_NEAR_MARKET_GRASS_4, RAND_INF_HF_NEAR_MARKET_GRASS_4 }, + { RC_HF_NEAR_MARKET_GRASS_5, RAND_INF_HF_NEAR_MARKET_GRASS_5 }, + { RC_HF_NEAR_MARKET_GRASS_6, RAND_INF_HF_NEAR_MARKET_GRASS_6 }, + { RC_HF_NEAR_MARKET_GRASS_7, RAND_INF_HF_NEAR_MARKET_GRASS_7 }, + { RC_HF_NEAR_MARKET_GRASS_8, RAND_INF_HF_NEAR_MARKET_GRASS_8 }, + { RC_HF_NEAR_MARKET_GRASS_9, RAND_INF_HF_NEAR_MARKET_GRASS_9 }, + { RC_HF_NEAR_MARKET_GRASS_10, RAND_INF_HF_NEAR_MARKET_GRASS_10 }, + { RC_HF_NEAR_MARKET_GRASS_11, RAND_INF_HF_NEAR_MARKET_GRASS_11 }, + { RC_HF_NEAR_MARKET_GRASS_12, RAND_INF_HF_NEAR_MARKET_GRASS_12 }, + { RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 }, + { RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 }, + { RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 }, + { RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 }, + { RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 }, + { RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 }, + { RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 }, + { RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 }, + { RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 }, + { RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 }, + { RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 }, + { RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 }, + { RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 }, + { RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 }, + { RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 }, + { RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 }, + { RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 }, + { RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 }, + { RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 }, + { RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 }, + { RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 }, + { RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 }, + { RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 }, + { RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 }, + { RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 }, + { RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 }, + { RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 }, + { RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 }, + { RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 }, + { RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 }, + { RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 }, + { RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 }, + { RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 }, + { RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 }, + { RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 }, + { RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 }, + { RC_ZR_NEAR_FREESTANDING_POH_GRASS, RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS }, // Grotto Grass - { RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 }, - { RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 }, - { RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 }, - { RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1 }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2 }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3 }, - { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4 }, - { RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1 }, - { RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2 }, - { RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3 }, - { RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4 }, - { RC_HF_OPEN_GROTTO_GRASS_1, RAND_INF_HF_OPEN_GROTTO_GRASS_1 }, - { RC_HF_OPEN_GROTTO_GRASS_2, RAND_INF_HF_OPEN_GROTTO_GRASS_2 }, - { RC_HF_OPEN_GROTTO_GRASS_3, RAND_INF_HF_OPEN_GROTTO_GRASS_3 }, - { RC_HF_OPEN_GROTTO_GRASS_4, RAND_INF_HF_OPEN_GROTTO_GRASS_4 }, - { RC_HF_SOUTHEAST_GROTTO_GRASS_1, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1 }, - { RC_HF_SOUTHEAST_GROTTO_GRASS_2, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2 }, - { RC_HF_SOUTHEAST_GROTTO_GRASS_3, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3 }, - { RC_HF_SOUTHEAST_GROTTO_GRASS_4, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4 }, - { RC_HF_COW_GROTTO_GRASS_1, RAND_INF_HF_COW_GROTTO_GRASS_1 }, - { RC_HF_COW_GROTTO_GRASS_2, RAND_INF_HF_COW_GROTTO_GRASS_2 }, - { RC_KAK_OPEN_GROTTO_GRASS_1, RAND_INF_KAK_OPEN_GROTTO_GRASS_1 }, - { RC_KAK_OPEN_GROTTO_GRASS_2, RAND_INF_KAK_OPEN_GROTTO_GRASS_2 }, - { RC_KAK_OPEN_GROTTO_GRASS_3, RAND_INF_KAK_OPEN_GROTTO_GRASS_3 }, - { RC_KAK_OPEN_GROTTO_GRASS_4, RAND_INF_KAK_OPEN_GROTTO_GRASS_4 }, - { RC_DMT_STORMS_GROTTO_GRASS_1, RAND_INF_DMT_STORMS_GROTTO_GRASS_1 }, - { RC_DMT_STORMS_GROTTO_GRASS_2, RAND_INF_DMT_STORMS_GROTTO_GRASS_2 }, - { RC_DMT_STORMS_GROTTO_GRASS_3, RAND_INF_DMT_STORMS_GROTTO_GRASS_3 }, - { RC_DMT_STORMS_GROTTO_GRASS_4, RAND_INF_DMT_STORMS_GROTTO_GRASS_4 }, - { RC_DMT_COW_GROTTO_GRASS_1, RAND_INF_DMT_COW_GROTTO_GRASS_1 }, - { RC_DMT_COW_GROTTO_GRASS_2, RAND_INF_DMT_COW_GROTTO_GRASS_2 }, - { RC_DMC_UPPER_GROTTO_GRASS_1, RAND_INF_DMC_UPPER_GROTTO_GRASS_1 }, - { RC_DMC_UPPER_GROTTO_GRASS_2, RAND_INF_DMC_UPPER_GROTTO_GRASS_2 }, - { RC_DMC_UPPER_GROTTO_GRASS_3, RAND_INF_DMC_UPPER_GROTTO_GRASS_3 }, - { RC_DMC_UPPER_GROTTO_GRASS_4, RAND_INF_DMC_UPPER_GROTTO_GRASS_4 }, - { RC_ZR_OPEN_GROTTO_GRASS_1, RAND_INF_ZR_OPEN_GROTTO_GRASS_1 }, - { RC_ZR_OPEN_GROTTO_GRASS_2, RAND_INF_ZR_OPEN_GROTTO_GRASS_2 }, - { RC_ZR_OPEN_GROTTO_GRASS_3, RAND_INF_ZR_OPEN_GROTTO_GRASS_3 }, - { RC_ZR_OPEN_GROTTO_GRASS_4, RAND_INF_ZR_OPEN_GROTTO_GRASS_4 }, + { RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 }, + { RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 }, + { RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 }, + { RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3 }, + { RC_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_1, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_2, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_3, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3 }, + { RC_HF_NEAR_MARKET_GROTTO_GRASS_4, RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4 }, + { RC_HF_OPEN_GROTTO_GRASS_1, RAND_INF_HF_OPEN_GROTTO_GRASS_1 }, + { RC_HF_OPEN_GROTTO_GRASS_2, RAND_INF_HF_OPEN_GROTTO_GRASS_2 }, + { RC_HF_OPEN_GROTTO_GRASS_3, RAND_INF_HF_OPEN_GROTTO_GRASS_3 }, + { RC_HF_OPEN_GROTTO_GRASS_4, RAND_INF_HF_OPEN_GROTTO_GRASS_4 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_1, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_2, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_3, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3 }, + { RC_HF_SOUTHEAST_GROTTO_GRASS_4, RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4 }, + { RC_HF_COW_GROTTO_GRASS_1, RAND_INF_HF_COW_GROTTO_GRASS_1 }, + { RC_HF_COW_GROTTO_GRASS_2, RAND_INF_HF_COW_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_1, RAND_INF_KAK_OPEN_GROTTO_GRASS_1 }, + { RC_KAK_OPEN_GROTTO_GRASS_2, RAND_INF_KAK_OPEN_GROTTO_GRASS_2 }, + { RC_KAK_OPEN_GROTTO_GRASS_3, RAND_INF_KAK_OPEN_GROTTO_GRASS_3 }, + { RC_KAK_OPEN_GROTTO_GRASS_4, RAND_INF_KAK_OPEN_GROTTO_GRASS_4 }, + { RC_DMT_STORMS_GROTTO_GRASS_1, RAND_INF_DMT_STORMS_GROTTO_GRASS_1 }, + { RC_DMT_STORMS_GROTTO_GRASS_2, RAND_INF_DMT_STORMS_GROTTO_GRASS_2 }, + { RC_DMT_STORMS_GROTTO_GRASS_3, RAND_INF_DMT_STORMS_GROTTO_GRASS_3 }, + { RC_DMT_STORMS_GROTTO_GRASS_4, RAND_INF_DMT_STORMS_GROTTO_GRASS_4 }, + { RC_DMT_COW_GROTTO_GRASS_1, RAND_INF_DMT_COW_GROTTO_GRASS_1 }, + { RC_DMT_COW_GROTTO_GRASS_2, RAND_INF_DMT_COW_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_1, RAND_INF_DMC_UPPER_GROTTO_GRASS_1 }, + { RC_DMC_UPPER_GROTTO_GRASS_2, RAND_INF_DMC_UPPER_GROTTO_GRASS_2 }, + { RC_DMC_UPPER_GROTTO_GRASS_3, RAND_INF_DMC_UPPER_GROTTO_GRASS_3 }, + { RC_DMC_UPPER_GROTTO_GRASS_4, RAND_INF_DMC_UPPER_GROTTO_GRASS_4 }, + { RC_ZR_OPEN_GROTTO_GRASS_1, RAND_INF_ZR_OPEN_GROTTO_GRASS_1 }, + { RC_ZR_OPEN_GROTTO_GRASS_2, RAND_INF_ZR_OPEN_GROTTO_GRASS_2 }, + { RC_ZR_OPEN_GROTTO_GRASS_3, RAND_INF_ZR_OPEN_GROTTO_GRASS_3 }, + { RC_ZR_OPEN_GROTTO_GRASS_4, RAND_INF_ZR_OPEN_GROTTO_GRASS_4 }, // Dungeon Grass - { RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 }, - { RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 }, - { RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 }, - { RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 }, - { RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 }, - { RC_DEKU_TREE_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1 }, - { RC_DEKU_TREE_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2 }, - { RC_DEKU_TREE_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3 }, - { RC_DEKU_TREE_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4 }, - { RC_DEKU_TREE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_COMPASS_GRASS_1 }, - { RC_DEKU_TREE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_COMPASS_GRASS_2 }, - { RC_DEKU_TREE_BASEMENT_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_GRASS_1 }, - { RC_DEKU_TREE_BASEMENT_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_GRASS_2 }, - { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1 }, - { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2 }, - { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3 }, - { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4 }, - { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1 }, - { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2 }, - { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1 }, - { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2 }, - { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1 }, - { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2 }, - { RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1 }, - { RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2 }, - { RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3 }, - { RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS }, - { RC_DODONGOS_CAVERN_BLADE_GRASS, RAND_INF_DODONGOS_CAVERN_BLADE_GRASS }, - { RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS }, - { RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS }, + { RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3 }, + { RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS }, + { RC_DODONGOS_CAVERN_BLADE_GRASS, RAND_INF_DODONGOS_CAVERN_BLADE_GRASS }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_GRASS, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS }, + { RC_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS }, { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1 }, { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2 }, { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3 }, @@ -1266,894 +1467,1647 @@ std::map rcToRandomizerInf = { { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7 }, { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8 }, { RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3 }, // MQ Dungeon Grass - { RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1 }, - { RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2 }, - { RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3 }, - { RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4 }, - { RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5 }, - { RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6 }, - { RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7 }, - { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1 }, - { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2 }, - { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3 }, - { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6 }, - { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7 }, - { RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1 }, - { RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2 }, - { RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3 }, - { RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4 }, - { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3 }, - { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4 }, - { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_6, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6 }, + { RC_DEKU_TREE_MQ_LOBBY_GRASS_7, RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3 }, + { RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6 }, + { RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_1, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_2, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_3, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3 }, + { RC_DEKU_TREE_MQ_COMPASS_GRASS_4, RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3 }, { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1 }, { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2 }, { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3 }, - { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3 }, - { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4 }, - { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3 }, - { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4 }, - { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5 }, - { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1 }, - { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2 }, - { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3 }, - { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1 }, - { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2 }, - { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3 }, - { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1 }, - { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2 }, - { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3 }, - { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS }, - { RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS }, - { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1 }, - { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2 }, - { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1 }, - { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2 }, - { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1 }, - { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2 }, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1 }, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2 }, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3 }, - { RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS }, - { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1 }, - { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2 }, - { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS }, - { RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS }, - { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1 }, - { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1 }, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3 }, - { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4 }, + { RC_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2 }, + { RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3 }, + { RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS }, + { RC_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1 }, + { RC_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3 }, + { RC_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_WIGGLERS_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2 }, + { RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1 }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4 }, // Shared Dungeon Grass - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7 }, - { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8 }, - // End Grass - - { RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT }, - { RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 }, - { RC_KF_TWINS_HOUSE_POT_2, RAND_INF_KF_TWINS_HOUSE_POT_2 }, - { RC_KF_BROTHERS_HOUSE_POT_1, RAND_INF_KF_BROTHERS_HOUSE_POT_1 }, - { RC_KF_BROTHERS_HOUSE_POT_2, RAND_INF_KF_BROTHERS_HOUSE_POT_2 }, - { RC_GF_BREAK_ROOM_POT_1, RAND_INF_GF_BREAK_ROOM_POT_1 }, - { RC_GF_BREAK_ROOM_POT_2, RAND_INF_GF_BREAK_ROOM_POT_2 }, - { RC_GF_KITCHEN_POT_1, RAND_INF_GF_KITCHEN_POT_1 }, - { RC_GF_KITCHEN_POT_2, RAND_INF_GF_KITCHEN_POT_2 }, - { RC_GF_NORTH_F1_CARPENTER_POT_1, RAND_INF_GF_NORTH_F1_CARPENTER_POT_1 }, - { RC_GF_NORTH_F1_CARPENTER_POT_2, RAND_INF_GF_NORTH_F1_CARPENTER_POT_2 }, - { RC_GF_NORTH_F1_CARPENTER_POT_3, RAND_INF_GF_NORTH_F1_CARPENTER_POT_3 }, - { RC_GF_NORTH_F2_CARPENTER_POT_1, RAND_INF_GF_NORTH_F2_CARPENTER_POT_1 }, - { RC_GF_NORTH_F2_CARPENTER_POT_2, RAND_INF_GF_NORTH_F2_CARPENTER_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4 }, - { RC_WASTELAND_NEAR_GS_POT_1, RAND_INF_WASTELAND_NEAR_GS_POT_1 }, - { RC_WASTELAND_NEAR_GS_POT_2, RAND_INF_WASTELAND_NEAR_GS_POT_2 }, - { RC_WASTELAND_NEAR_GS_POT_3, RAND_INF_WASTELAND_NEAR_GS_POT_3 }, - { RC_WASTELAND_NEAR_GS_POT_4, RAND_INF_WASTELAND_NEAR_GS_POT_4 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_1, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_2, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_3, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_4, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_5, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_6, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_7, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_8, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_9, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_10, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_11, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_12, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_13, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_14, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_15, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_16, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_17, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_18, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_19, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_20, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_21, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_22, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_23, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_24, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_25, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_26, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_27, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_28, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_29, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_30, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_31, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_32, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_33, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_34, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_35, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_36, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_37, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_38, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_39, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_40, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_41, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_42, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_43, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43 }, - { RC_MK_GUARD_HOUSE_CHILD_POT_44, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_1, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_2, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_3, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_4, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_5, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_6, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_7, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_8, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_9, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_10, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10 }, - { RC_MK_GUARD_HOUSE_ADULT_POT_11, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11 }, - { RC_MK_BACK_ALLEY_HOUSE_POT_1, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1 }, - { RC_MK_BACK_ALLEY_HOUSE_POT_2, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2 }, - { RC_MK_BACK_ALLEY_HOUSE_POT_3, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3 }, - { RC_KAK_NEAR_POTION_SHOP_POT_1, RAND_INF_KAK_NEAR_POTION_SHOP_POT_1 }, - { RC_KAK_NEAR_POTION_SHOP_POT_2, RAND_INF_KAK_NEAR_POTION_SHOP_POT_2 }, - { RC_KAK_NEAR_POTION_SHOP_POT_3, RAND_INF_KAK_NEAR_POTION_SHOP_POT_3 }, - { RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1 }, - { RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2 }, - { RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3 }, - { RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1 }, - { RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2 }, - { RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3 }, - { RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1 }, - { RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2 }, - { RC_GY_DAMPES_GRAVE_POT_1, RAND_INF_GY_DAMPES_GRAVE_POT_1 }, - { RC_GY_DAMPES_GRAVE_POT_2, RAND_INF_GY_DAMPES_GRAVE_POT_2 }, - { RC_GY_DAMPES_GRAVE_POT_3, RAND_INF_GY_DAMPES_GRAVE_POT_3 }, - { RC_GY_DAMPES_GRAVE_POT_4, RAND_INF_GY_DAMPES_GRAVE_POT_4 }, - { RC_GY_DAMPES_GRAVE_POT_5, RAND_INF_GY_DAMPES_GRAVE_POT_5 }, - { RC_GY_DAMPES_GRAVE_POT_6, RAND_INF_GY_DAMPES_GRAVE_POT_6 }, - { RC_GC_LOWER_STAIRCASE_POT_1, RAND_INF_GC_LOWER_STAIRCASE_POT_1 }, - { RC_GC_LOWER_STAIRCASE_POT_2, RAND_INF_GC_LOWER_STAIRCASE_POT_2 }, - { RC_GC_UPPER_STAIRCASE_POT_1, RAND_INF_GC_UPPER_STAIRCASE_POT_1 }, - { RC_GC_UPPER_STAIRCASE_POT_2, RAND_INF_GC_UPPER_STAIRCASE_POT_2 }, - { RC_GC_UPPER_STAIRCASE_POT_3, RAND_INF_GC_UPPER_STAIRCASE_POT_3 }, - { RC_GC_MEDIGORON_POT_1, RAND_INF_GC_MEDIGORON_POT_1 }, - { RC_GC_DARUNIA_POT_1, RAND_INF_GC_DARUNIA_POT_1 }, - { RC_GC_DARUNIA_POT_2, RAND_INF_GC_DARUNIA_POT_2 }, - { RC_GC_DARUNIA_POT_3, RAND_INF_GC_DARUNIA_POT_3 }, - { RC_DMC_NEAR_GC_POT_1, RAND_INF_DMC_NEAR_GC_POT_1 }, - { RC_DMC_NEAR_GC_POT_2, RAND_INF_DMC_NEAR_GC_POT_2 }, - { RC_DMC_NEAR_GC_POT_3, RAND_INF_DMC_NEAR_GC_POT_3 }, - { RC_DMC_NEAR_GC_POT_4, RAND_INF_DMC_NEAR_GC_POT_4 }, - { RC_ZD_NEAR_SHOP_POT_1, RAND_INF_ZD_NEAR_SHOP_POT_1 }, - { RC_ZD_NEAR_SHOP_POT_2, RAND_INF_ZD_NEAR_SHOP_POT_2 }, - { RC_ZD_NEAR_SHOP_POT_3, RAND_INF_ZD_NEAR_SHOP_POT_3 }, - { RC_ZD_NEAR_SHOP_POT_4, RAND_INF_ZD_NEAR_SHOP_POT_4 }, - { RC_ZD_NEAR_SHOP_POT_5, RAND_INF_ZD_NEAR_SHOP_POT_5 }, - { RC_ZF_HIDDEN_CAVE_POT_1, RAND_INF_ZF_HIDDEN_CAVE_POT_1 }, - { RC_ZF_HIDDEN_CAVE_POT_2, RAND_INF_ZF_HIDDEN_CAVE_POT_2 }, - { RC_ZF_HIDDEN_CAVE_POT_3, RAND_INF_ZF_HIDDEN_CAVE_POT_3 }, - { RC_ZF_NEAR_JABU_POT_1, RAND_INF_ZF_NEAR_JABU_POT_1 }, - { RC_ZF_NEAR_JABU_POT_2, RAND_INF_ZF_NEAR_JABU_POT_2 }, - { RC_ZF_NEAR_JABU_POT_3, RAND_INF_ZF_NEAR_JABU_POT_3 }, - { RC_ZF_NEAR_JABU_POT_4, RAND_INF_ZF_NEAR_JABU_POT_4 }, - { RC_LLR_FRONT_POT_1, RAND_INF_LLR_FRONT_POT_1 }, - { RC_LLR_FRONT_POT_2, RAND_INF_LLR_FRONT_POT_2 }, - { RC_LLR_FRONT_POT_3, RAND_INF_LLR_FRONT_POT_3 }, - { RC_LLR_FRONT_POT_4, RAND_INF_LLR_FRONT_POT_4 }, - { RC_LLR_RAIN_SHED_POT_1, RAND_INF_LLR_RAIN_SHED_POT_1 }, - { RC_LLR_RAIN_SHED_POT_2, RAND_INF_LLR_RAIN_SHED_POT_2 }, - { RC_LLR_RAIN_SHED_POT_3, RAND_INF_LLR_RAIN_SHED_POT_3 }, - { RC_LLR_TALONS_HOUSE_POT_1, RAND_INF_LLR_TALONS_HOUSE_POT_1 }, - { RC_LLR_TALONS_HOUSE_POT_2, RAND_INF_LLR_TALONS_HOUSE_POT_2 }, - { RC_LLR_TALONS_HOUSE_POT_3, RAND_INF_LLR_TALONS_HOUSE_POT_3 }, - { RC_HF_COW_GROTTO_POT_1, RAND_INF_HF_COW_GROTTO_POT_1 }, - { RC_HF_COW_GROTTO_POT_2, RAND_INF_HF_COW_GROTTO_POT_2 }, - { RC_HC_STORMS_GROTTO_POT_1, RAND_INF_HC_STORMS_GROTTO_POT_1 }, - { RC_HC_STORMS_GROTTO_POT_2, RAND_INF_HC_STORMS_GROTTO_POT_2 }, - { RC_HC_STORMS_GROTTO_POT_3, RAND_INF_HC_STORMS_GROTTO_POT_3 }, - { RC_HC_STORMS_GROTTO_POT_4, RAND_INF_HC_STORMS_GROTTO_POT_4 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3 }, - { RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5 }, - { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3 }, - { RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4 }, - { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1 }, - { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2 }, - { RC_DODONGOS_CAVERN_BLADE_POT_1, RAND_INF_DODONGOS_CAVERN_BLADE_POT_1 }, - { RC_DODONGOS_CAVERN_BLADE_POT_2, RAND_INF_DODONGOS_CAVERN_BLADE_POT_2 }, - { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1 }, - { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4 }, - { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1 }, - { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2 }, - { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_1, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_2, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_3, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_4, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_5, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5 }, - { RC_JABU_JABUS_BELLY_BARINADE_POT_6, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6 }, - { RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1 }, - { RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2 }, - { RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4 }, - { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5 }, - { RC_FOREST_TEMPLE_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_LOBBY_POT_1 }, - { RC_FOREST_TEMPLE_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_LOBBY_POT_2 }, - { RC_FOREST_TEMPLE_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_LOBBY_POT_3 }, - { RC_FOREST_TEMPLE_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_LOBBY_POT_4 }, - { RC_FOREST_TEMPLE_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_LOBBY_POT_5 }, - { RC_FOREST_TEMPLE_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_LOBBY_POT_6 }, - { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1 }, - { RC_FOREST_TEMPLE_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3 }, - { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4 }, - { RC_FOREST_TEMPLE_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1 }, - { RC_FOREST_TEMPLE_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2 }, - { RC_FOREST_TEMPLE_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3 }, - { RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1 }, - { RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3 }, - { RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4 }, - { RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1 }, - { RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2 }, - { RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3 }, - { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1 }, - { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2 }, - { RC_WATER_TEMPLE_TORCH_POT_1, RAND_INF_WATER_TEMPLE_TORCH_POT_1 }, - { RC_WATER_TEMPLE_TORCH_POT_2, RAND_INF_WATER_TEMPLE_TORCH_POT_2 }, - { RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1 }, - { RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2 }, - { RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3 }, - { RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1 }, - { RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3 }, - { RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4 }, - { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1 }, - { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2 }, - { RC_WATER_TEMPLE_RIVER_POT_1, RAND_INF_WATER_TEMPLE_RIVER_POT_1 }, - { RC_WATER_TEMPLE_RIVER_POT_2, RAND_INF_WATER_TEMPLE_RIVER_POT_2 }, - { RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1 }, - { RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2 }, - { RC_WATER_TEMPLE_BOSS_KEY_POT_1, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1 }, - { RC_WATER_TEMPLE_BOSS_KEY_POT_2, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2 }, - { RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4 }, - { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5 }, - { RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1 }, - { RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3 }, - { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4 }, - { RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1 }, - { RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2 }, - { RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1 }, - { RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1 }, - { RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3 }, - { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4 }, - { RC_SPIRIT_TEMPLE_LOBBY_POT_1, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1 }, - { RC_SPIRIT_TEMPLE_LOBBY_POT_2, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3 }, - { RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4 }, - { RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1 }, - { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1 }, - { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5 }, - { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6 }, - { RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1 }, - { RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3 }, - { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4 }, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1 }, - { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17 }, - { RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11 }, - { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12 }, - { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3 }, - { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT }, - { RC_ICE_CAVERN_HALL_POT_1, RAND_INF_ICE_CAVERN_HALL_POT_1 }, - { RC_ICE_CAVERN_HALL_POT_2, RAND_INF_ICE_CAVERN_HALL_POT_2 }, - { RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1 }, - { RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2 }, - { RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3 }, - { RC_ICE_CAVERN_NEAR_END_POT_1, RAND_INF_ICE_CAVERN_NEAR_END_POT_1 }, - { RC_ICE_CAVERN_NEAR_END_POT_2, RAND_INF_ICE_CAVERN_NEAR_END_POT_2 }, - { RC_ICE_CAVERN_FROZEN_POT_1, RAND_INF_ICE_CAVERN_FROZEN_POT_1 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_1, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_2, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_3, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_4, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_5, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_6, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7 }, + { RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8 }, + // End Grass - { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1 }, - { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2 }, - { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5 }, - { RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6 }, - { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3 }, - { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4 }, - { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1 }, - { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2 }, - { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3 }, - { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1 }, - { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3 }, - { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3 }, - { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4 }, - { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2 }, - { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1 }, - { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2 }, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2 }, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1 }, - { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3 }, - { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2 }, - { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3 }, - { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4 }, - { RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT }, - { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1 }, - { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3 }, - { RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT }, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1 }, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2 }, - { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3 }, - { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1 }, - { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2 }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1 }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2 }, - { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1 }, - { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2 }, - { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3 }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1 }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2 }, - { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1 }, - { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2 }, - { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3 }, - { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1 }, - { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2 }, - { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1 }, - { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2 }, - { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3 }, - { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4 }, - { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5 }, - { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7 }, - { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8 }, - { RC_ICE_CAVERN_MQ_ENTRANCE_POT, RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT }, - { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1 }, - { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3 }, - { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4 }, - { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1 }, - { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2 }, - { RC_ICE_CAVERN_MQ_COMPASS_POT_1, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1 }, - { RC_ICE_CAVERN_MQ_COMPASS_POT_2, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5 }, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3 }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4 }, - { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2 }, - { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1 }, - { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4 }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3 }, - { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1 }, - { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2 }, - { RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3 }, - { RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4 }, - { RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5 }, - { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1 }, - { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2 }, - { RC_WATER_TEMPLE_MQ_RIVER_POT_1, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1 }, - { RC_WATER_TEMPLE_MQ_RIVER_POT_2, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2 }, - { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1 }, - { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1 }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2 }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1 }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2 }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3 }, - { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1 }, - { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3 }, - { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4 }, - { RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1 }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, - { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, + { RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT }, + { RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 }, + { RC_KF_TWINS_HOUSE_POT_2, RAND_INF_KF_TWINS_HOUSE_POT_2 }, + { RC_KF_BROTHERS_HOUSE_POT_1, RAND_INF_KF_BROTHERS_HOUSE_POT_1 }, + { RC_KF_BROTHERS_HOUSE_POT_2, RAND_INF_KF_BROTHERS_HOUSE_POT_2 }, + { RC_GF_BREAK_ROOM_POT_1, RAND_INF_GF_BREAK_ROOM_POT_1 }, + { RC_GF_BREAK_ROOM_POT_2, RAND_INF_GF_BREAK_ROOM_POT_2 }, + { RC_GF_KITCHEN_POT_1, RAND_INF_GF_KITCHEN_POT_1 }, + { RC_GF_KITCHEN_POT_2, RAND_INF_GF_KITCHEN_POT_2 }, + { RC_GF_NORTH_F1_CARPENTER_POT_1, RAND_INF_GF_NORTH_F1_CARPENTER_POT_1 }, + { RC_GF_NORTH_F1_CARPENTER_POT_2, RAND_INF_GF_NORTH_F1_CARPENTER_POT_2 }, + { RC_GF_NORTH_F1_CARPENTER_POT_3, RAND_INF_GF_NORTH_F1_CARPENTER_POT_3 }, + { RC_GF_NORTH_F2_CARPENTER_POT_1, RAND_INF_GF_NORTH_F2_CARPENTER_POT_1 }, + { RC_GF_NORTH_F2_CARPENTER_POT_2, RAND_INF_GF_NORTH_F2_CARPENTER_POT_2 }, + { RC_GF_SOUTH_F1_CARPENTER_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1 }, + { RC_GF_SOUTH_F1_CARPENTER_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2 }, + { RC_GF_SOUTH_F1_CARPENTER_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3 }, + { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1 }, + { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2 }, + { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3 }, + { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4 }, + { RC_WASTELAND_NEAR_GS_POT_1, RAND_INF_WASTELAND_NEAR_GS_POT_1 }, + { RC_WASTELAND_NEAR_GS_POT_2, RAND_INF_WASTELAND_NEAR_GS_POT_2 }, + { RC_WASTELAND_NEAR_GS_POT_3, RAND_INF_WASTELAND_NEAR_GS_POT_3 }, + { RC_WASTELAND_NEAR_GS_POT_4, RAND_INF_WASTELAND_NEAR_GS_POT_4 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_1, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_2, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_3, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_4, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_5, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_6, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_7, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_8, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_9, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_10, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_11, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_12, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_13, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_14, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_15, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_16, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_17, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_18, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_19, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_20, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_21, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_22, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_23, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_24, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_25, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_26, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_27, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_28, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_29, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_30, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_31, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_32, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_33, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_34, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_35, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_36, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_37, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_38, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_39, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_40, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_41, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_42, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_43, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43 }, + { RC_MK_GUARD_HOUSE_CHILD_POT_44, RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_1, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_2, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_3, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_4, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_5, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_6, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_7, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_8, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_9, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_10, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10 }, + { RC_MK_GUARD_HOUSE_ADULT_POT_11, RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11 }, + { RC_MK_BACK_ALLEY_HOUSE_POT_1, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1 }, + { RC_MK_BACK_ALLEY_HOUSE_POT_2, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2 }, + { RC_MK_BACK_ALLEY_HOUSE_POT_3, RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3 }, + { RC_KAK_NEAR_POTION_SHOP_POT_1, RAND_INF_KAK_NEAR_POTION_SHOP_POT_1 }, + { RC_KAK_NEAR_POTION_SHOP_POT_2, RAND_INF_KAK_NEAR_POTION_SHOP_POT_2 }, + { RC_KAK_NEAR_POTION_SHOP_POT_3, RAND_INF_KAK_NEAR_POTION_SHOP_POT_3 }, + { RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1 }, + { RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2 }, + { RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3 }, + { RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1 }, + { RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2 }, + { RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3 }, + { RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1 }, + { RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2 }, + { RC_GY_DAMPES_GRAVE_POT_1, RAND_INF_GY_DAMPES_GRAVE_POT_1 }, + { RC_GY_DAMPES_GRAVE_POT_2, RAND_INF_GY_DAMPES_GRAVE_POT_2 }, + { RC_GY_DAMPES_GRAVE_POT_3, RAND_INF_GY_DAMPES_GRAVE_POT_3 }, + { RC_GY_DAMPES_GRAVE_POT_4, RAND_INF_GY_DAMPES_GRAVE_POT_4 }, + { RC_GY_DAMPES_GRAVE_POT_5, RAND_INF_GY_DAMPES_GRAVE_POT_5 }, + { RC_GY_DAMPES_GRAVE_POT_6, RAND_INF_GY_DAMPES_GRAVE_POT_6 }, + { RC_GC_LOWER_STAIRCASE_POT_1, RAND_INF_GC_LOWER_STAIRCASE_POT_1 }, + { RC_GC_LOWER_STAIRCASE_POT_2, RAND_INF_GC_LOWER_STAIRCASE_POT_2 }, + { RC_GC_UPPER_STAIRCASE_POT_1, RAND_INF_GC_UPPER_STAIRCASE_POT_1 }, + { RC_GC_UPPER_STAIRCASE_POT_2, RAND_INF_GC_UPPER_STAIRCASE_POT_2 }, + { RC_GC_UPPER_STAIRCASE_POT_3, RAND_INF_GC_UPPER_STAIRCASE_POT_3 }, + { RC_GC_MEDIGORON_POT_1, RAND_INF_GC_MEDIGORON_POT_1 }, + { RC_GC_DARUNIA_POT_1, RAND_INF_GC_DARUNIA_POT_1 }, + { RC_GC_DARUNIA_POT_2, RAND_INF_GC_DARUNIA_POT_2 }, + { RC_GC_DARUNIA_POT_3, RAND_INF_GC_DARUNIA_POT_3 }, + { RC_DMC_NEAR_GC_POT_1, RAND_INF_DMC_NEAR_GC_POT_1 }, + { RC_DMC_NEAR_GC_POT_2, RAND_INF_DMC_NEAR_GC_POT_2 }, + { RC_DMC_NEAR_GC_POT_3, RAND_INF_DMC_NEAR_GC_POT_3 }, + { RC_DMC_NEAR_GC_POT_4, RAND_INF_DMC_NEAR_GC_POT_4 }, + { RC_ZD_NEAR_SHOP_POT_1, RAND_INF_ZD_NEAR_SHOP_POT_1 }, + { RC_ZD_NEAR_SHOP_POT_2, RAND_INF_ZD_NEAR_SHOP_POT_2 }, + { RC_ZD_NEAR_SHOP_POT_3, RAND_INF_ZD_NEAR_SHOP_POT_3 }, + { RC_ZD_NEAR_SHOP_POT_4, RAND_INF_ZD_NEAR_SHOP_POT_4 }, + { RC_ZD_NEAR_SHOP_POT_5, RAND_INF_ZD_NEAR_SHOP_POT_5 }, + { RC_ZF_HIDDEN_CAVE_POT_1, RAND_INF_ZF_HIDDEN_CAVE_POT_1 }, + { RC_ZF_HIDDEN_CAVE_POT_2, RAND_INF_ZF_HIDDEN_CAVE_POT_2 }, + { RC_ZF_HIDDEN_CAVE_POT_3, RAND_INF_ZF_HIDDEN_CAVE_POT_3 }, + { RC_ZF_NEAR_JABU_POT_1, RAND_INF_ZF_NEAR_JABU_POT_1 }, + { RC_ZF_NEAR_JABU_POT_2, RAND_INF_ZF_NEAR_JABU_POT_2 }, + { RC_ZF_NEAR_JABU_POT_3, RAND_INF_ZF_NEAR_JABU_POT_3 }, + { RC_ZF_NEAR_JABU_POT_4, RAND_INF_ZF_NEAR_JABU_POT_4 }, + { RC_LLR_FRONT_POT_1, RAND_INF_LLR_FRONT_POT_1 }, + { RC_LLR_FRONT_POT_2, RAND_INF_LLR_FRONT_POT_2 }, + { RC_LLR_FRONT_POT_3, RAND_INF_LLR_FRONT_POT_3 }, + { RC_LLR_FRONT_POT_4, RAND_INF_LLR_FRONT_POT_4 }, + { RC_LLR_RAIN_SHED_POT_1, RAND_INF_LLR_RAIN_SHED_POT_1 }, + { RC_LLR_RAIN_SHED_POT_2, RAND_INF_LLR_RAIN_SHED_POT_2 }, + { RC_LLR_RAIN_SHED_POT_3, RAND_INF_LLR_RAIN_SHED_POT_3 }, + { RC_LLR_TALONS_HOUSE_POT_1, RAND_INF_LLR_TALONS_HOUSE_POT_1 }, + { RC_LLR_TALONS_HOUSE_POT_2, RAND_INF_LLR_TALONS_HOUSE_POT_2 }, + { RC_LLR_TALONS_HOUSE_POT_3, RAND_INF_LLR_TALONS_HOUSE_POT_3 }, + { RC_HF_COW_GROTTO_POT_1, RAND_INF_HF_COW_GROTTO_POT_1 }, + { RC_HF_COW_GROTTO_POT_2, RAND_INF_HF_COW_GROTTO_POT_2 }, + { RC_HC_STORMS_GROTTO_POT_1, RAND_INF_HC_STORMS_GROTTO_POT_1 }, + { RC_HC_STORMS_GROTTO_POT_2, RAND_INF_HC_STORMS_GROTTO_POT_2 }, + { RC_HC_STORMS_GROTTO_POT_3, RAND_INF_HC_STORMS_GROTTO_POT_3 }, + { RC_HC_STORMS_GROTTO_POT_4, RAND_INF_HC_STORMS_GROTTO_POT_4 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3 }, + { RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5 }, + { RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3 }, + { RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4 }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1 }, + { RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2 }, + { RC_DODONGOS_CAVERN_BLADE_POT_1, RAND_INF_DODONGOS_CAVERN_BLADE_POT_1 }, + { RC_DODONGOS_CAVERN_BLADE_POT_2, RAND_INF_DODONGOS_CAVERN_BLADE_POT_2 }, + { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1 }, + { RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4 }, + { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1 }, + { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2 }, + { RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_1, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_2, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_3, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_4, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_5, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5 }, + { RC_JABU_JABUS_BELLY_BARINADE_POT_6, RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6 }, + { RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1 }, + { RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2 }, + { RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4 }, + { RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5 }, + { RC_FOREST_TEMPLE_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_LOBBY_POT_1 }, + { RC_FOREST_TEMPLE_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_LOBBY_POT_2 }, + { RC_FOREST_TEMPLE_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_LOBBY_POT_3 }, + { RC_FOREST_TEMPLE_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_LOBBY_POT_4 }, + { RC_FOREST_TEMPLE_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_LOBBY_POT_5 }, + { RC_FOREST_TEMPLE_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_LOBBY_POT_6 }, + { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1 }, + { RC_FOREST_TEMPLE_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3 }, + { RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4 }, + { RC_FOREST_TEMPLE_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1 }, + { RC_FOREST_TEMPLE_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2 }, + { RC_FOREST_TEMPLE_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3 }, + { RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1 }, + { RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3 }, + { RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4 }, + { RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1 }, + { RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2 }, + { RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3 }, + { RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1 }, + { RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2 }, + { RC_WATER_TEMPLE_TORCH_POT_1, RAND_INF_WATER_TEMPLE_TORCH_POT_1 }, + { RC_WATER_TEMPLE_TORCH_POT_2, RAND_INF_WATER_TEMPLE_TORCH_POT_2 }, + { RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1 }, + { RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2 }, + { RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3 }, + { RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1 }, + { RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3 }, + { RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4 }, + { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1 }, + { RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2 }, + { RC_WATER_TEMPLE_RIVER_POT_1, RAND_INF_WATER_TEMPLE_RIVER_POT_1 }, + { RC_WATER_TEMPLE_RIVER_POT_2, RAND_INF_WATER_TEMPLE_RIVER_POT_2 }, + { RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1 }, + { RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2 }, + { RC_WATER_TEMPLE_BOSS_KEY_POT_1, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1 }, + { RC_WATER_TEMPLE_BOSS_KEY_POT_2, RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2 }, + { RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4 }, + { RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5 }, + { RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1 }, + { RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3 }, + { RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4 }, + { RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1 }, + { RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2 }, + { RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1 }, + { RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1 }, + { RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3 }, + { RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4 }, + { RC_SPIRIT_TEMPLE_LOBBY_POT_1, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1 }, + { RC_SPIRIT_TEMPLE_LOBBY_POT_2, RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3 }, + { RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4 }, + { RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1 }, + { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1 }, + { RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5 }, + { RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6 }, + { RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1 }, + { RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3 }, + { RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4 }, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1 }, + { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17 }, + { RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11 }, + { RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12 }, + { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3 }, + { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT }, + { RC_ICE_CAVERN_HALL_POT_1, RAND_INF_ICE_CAVERN_HALL_POT_1 }, + { RC_ICE_CAVERN_HALL_POT_2, RAND_INF_ICE_CAVERN_HALL_POT_2 }, + { RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1 }, + { RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2 }, + { RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3 }, + { RC_ICE_CAVERN_NEAR_END_POT_1, RAND_INF_ICE_CAVERN_NEAR_END_POT_1 }, + { RC_ICE_CAVERN_NEAR_END_POT_2, RAND_INF_ICE_CAVERN_NEAR_END_POT_2 }, + { RC_ICE_CAVERN_FROZEN_POT_1, RAND_INF_ICE_CAVERN_FROZEN_POT_1 }, + + { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1 }, + { RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2 }, + { RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5 }, + { RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6 }, + { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3 }, + { RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4 }, + { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1 }, + { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2 }, + { RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3 }, + { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1 }, + { RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3 }, + { RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3 }, + { RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4 }, + { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2 }, + { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1 }, + { RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2 }, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2 }, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1 }, + { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3 }, + { RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2 }, + { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3 }, + { RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4 }, + { RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT }, + { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1 }, + { RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3 }, + { RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT }, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1 }, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2 }, + { RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3 }, + { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1 }, + { RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2 }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1 }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2 }, + { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1 }, + { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2 }, + { RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3 }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1 }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2 }, + { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1 }, + { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2 }, + { RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3 }, + { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1 }, + { RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2 }, + { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1 }, + { RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2 }, + { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3 }, + { RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4 }, + { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5 }, + { RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7 }, + { RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8 }, + { RC_ICE_CAVERN_MQ_ENTRANCE_POT, RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT }, + { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1 }, + { RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3 }, + { RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4 }, + { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1 }, + { RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2 }, + { RC_ICE_CAVERN_MQ_COMPASS_POT_1, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1 }, + { RC_ICE_CAVERN_MQ_COMPASS_POT_2, RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5 }, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3 }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4 }, + { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2 }, + { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1 }, + { RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4 }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3 }, + { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1 }, + { RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2 }, + { RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3 }, + { RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4 }, + { RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5 }, + { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1 }, + { RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2 }, + { RC_WATER_TEMPLE_MQ_RIVER_POT_1, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1 }, + { RC_WATER_TEMPLE_MQ_RIVER_POT_2, RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2 }, + { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1 }, + { RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1 }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2 }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1 }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2 }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3 }, + { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1 }, + { RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3 }, + { RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4 }, + { RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, // Crates - { RC_GV_FREESTANDING_POH_CRATE, RAND_INF_GV_FREESTANDING_POH_CRATE, }, - { RC_GV_NEAR_COW_CRATE, RAND_INF_GV_NEAR_COW_CRATE, }, - { RC_GV_CRATE_BRIDGE_1, RAND_INF_GV_CRATE_BRIDGE_1, }, - { RC_GV_CRATE_BRIDGE_2, RAND_INF_GV_CRATE_BRIDGE_2, }, - { RC_GV_CRATE_BRIDGE_3, RAND_INF_GV_CRATE_BRIDGE_3, }, - { RC_GV_CRATE_BRIDGE_4, RAND_INF_GV_CRATE_BRIDGE_4, }, - { RC_GF_ABOVE_JAIL_CRATE, RAND_INF_GF_ABOVE_JAIL_CRATE, }, - { RC_GF_OUTSIDE_CENTER_CRATE_1, RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, }, - { RC_GF_OUTSIDE_CENTER_CRATE_2, RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, }, - { RC_GF_OUTSIDE_CENTER_CRATE_3, RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, }, - { RC_GF_OUTSIDE_CENTER_CRATE_4, RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, }, - { RC_GF_OUTSIDE_LEFT_CRATE_1, RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, }, - { RC_GF_OUTSIDE_LEFT_CRATE_2, RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, }, - { RC_GF_ARCHERY_RANGE_CRATE_1, RAND_INF_GF_ARCHERY_RANGE_CRATE_1, }, - { RC_GF_ARCHERY_RANGE_CRATE_2, RAND_INF_GF_ARCHERY_RANGE_CRATE_2, }, - { RC_GF_ARCHERY_RANGE_CRATE_3, RAND_INF_GF_ARCHERY_RANGE_CRATE_3, }, - { RC_GF_ARCHERY_RANGE_CRATE_4, RAND_INF_GF_ARCHERY_RANGE_CRATE_4, }, - { RC_GF_ARCHERY_RANGE_CRATE_5, RAND_INF_GF_ARCHERY_RANGE_CRATE_5, }, - { RC_GF_ARCHERY_RANGE_CRATE_6, RAND_INF_GF_ARCHERY_RANGE_CRATE_6, }, - { RC_GF_ARCHERY_RANGE_CRATE_7, RAND_INF_GF_ARCHERY_RANGE_CRATE_7, }, - { RC_GF_ARCHERY_START_CRATE_1, RAND_INF_GF_ARCHERY_START_CRATE_1, }, - { RC_GF_ARCHERY_START_CRATE_2, RAND_INF_GF_ARCHERY_START_CRATE_2, }, - { RC_GF_ARCHERY_LEFT_END_CRATE_1, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, }, - { RC_GF_ARCHERY_LEFT_END_CRATE_2, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, }, - { RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, }, - { RC_GF_ARCHERY_RIGHT_END_CRATE_1, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, }, - { RC_GF_ARCHERY_RIGHT_END_CRATE_2, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, }, - { RC_GF_KITCHEN_CRATE_1, RAND_INF_GF_KITCHEN_CRATE_1, }, - { RC_GF_KITCHEN_CRATE_2, RAND_INF_GF_KITCHEN_CRATE_2, }, - { RC_GF_KITCHEN_CRATE_3, RAND_INF_GF_KITCHEN_CRATE_3, }, - { RC_GF_KITCHEN_CRATE_4, RAND_INF_GF_KITCHEN_CRATE_4, }, - { RC_GF_KITCHEN_CRATE_5, RAND_INF_GF_KITCHEN_CRATE_5, }, - { RC_GF_BREAK_ROOM_CRATE_1, RAND_INF_GF_BREAK_ROOM_CRATE_1, }, - { RC_GF_BREAK_ROOM_CRATE_2, RAND_INF_GF_BREAK_ROOM_CRATE_2, }, - { RC_GF_BREAK_ROOM_CRATE_3, RAND_INF_GF_BREAK_ROOM_CRATE_3, }, - { RC_GF_BREAK_ROOM_CRATE_4, RAND_INF_GF_BREAK_ROOM_CRATE_4, }, - { RC_GF_NORTH_F1_CARPENTER_CRATE, RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, }, - { RC_GF_NORTH_F3_CARPENTER_CRATE, RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, }, - { RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, }, - { RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, }, - { RC_HW_BEFORE_QUICKSAND_CRATE, RAND_INF_HW_BEFORE_QUICKSAND_CRATE, }, - { RC_HW_AFTER_QUICKSAND_CRATE_1, RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, }, - { RC_HW_AFTER_QUICKSAND_CRATE_2, RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, }, - { RC_HW_AFTER_QUICKSAND_CRATE_3, RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, }, - { RC_HW_NEAR_COLOSSUS_CRATE, RAND_INF_HW_NEAR_COLOSSUS_CRATE, }, - { RC_MK_NEAR_BAZAAR_CRATE_1, RAND_INF_MK_NEAR_BAZAAR_CRATE_1, }, - { RC_MK_NEAR_BAZAAR_CRATE_2, RAND_INF_MK_NEAR_BAZAAR_CRATE_2, }, - { RC_MK_SHOOTING_GALLERY_CRATE_1, RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, }, - { RC_MK_SHOOTING_GALLERY_CRATE_2, RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, }, - { RC_MK_LOST_DOG_HOUSE_CRATE, RAND_INF_MK_LOST_DOG_HOUSE_CRATE, }, - { RC_MK_GUARD_HOUSE_CRATE_1, RAND_INF_MK_GUARD_HOUSE_CRATE_1, }, - { RC_MK_GUARD_HOUSE_CRATE_2, RAND_INF_MK_GUARD_HOUSE_CRATE_2, }, - { RC_MK_GUARD_HOUSE_CRATE_3, RAND_INF_MK_GUARD_HOUSE_CRATE_3, }, - { RC_MK_GUARD_HOUSE_CRATE_4, RAND_INF_MK_GUARD_HOUSE_CRATE_4, }, - { RC_MK_GUARD_HOUSE_CRATE_5, RAND_INF_MK_GUARD_HOUSE_CRATE_5, }, - { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, }, - { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, }, - { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, }, - { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, }, - { RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, }, - { RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, }, - { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, }, - { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, }, - { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, }, - { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, }, - { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, }, - { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, }, - { RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, }, - { RC_KAK_NEAR_GY_CHILD_CRATE, RAND_INF_KAK_NEAR_GY_CHILD_CRATE, }, - { RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, }, - { RC_KAK_NEAR_FENCE_CHILD_CRATE, RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, }, - { RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, }, - { RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, }, - { RC_GRAVEYARD_CRATE, RAND_INF_GRAVEYARD_CRATE, }, - { RC_GC_MAZE_CRATE, RAND_INF_GC_MAZE_CRATE, }, - { RC_DMC_CRATE, RAND_INF_DMC_CRATE, }, - { RC_LLR_NEAR_TREE_CRATE, RAND_INF_LLR_NEAR_TREE_CRATE, }, - { RC_LH_LAB_CRATE, RAND_INF_LH_LAB_CRATE, }, + { + RC_GV_FREESTANDING_POH_CRATE, + RAND_INF_GV_FREESTANDING_POH_CRATE, + }, + { + RC_GV_NEAR_COW_CRATE, + RAND_INF_GV_NEAR_COW_CRATE, + }, + { + RC_GV_CRATE_BRIDGE_1, + RAND_INF_GV_CRATE_BRIDGE_1, + }, + { + RC_GV_CRATE_BRIDGE_2, + RAND_INF_GV_CRATE_BRIDGE_2, + }, + { + RC_GV_CRATE_BRIDGE_3, + RAND_INF_GV_CRATE_BRIDGE_3, + }, + { + RC_GV_CRATE_BRIDGE_4, + RAND_INF_GV_CRATE_BRIDGE_4, + }, + { + RC_GF_ABOVE_JAIL_CRATE, + RAND_INF_GF_ABOVE_JAIL_CRATE, + }, + { + RC_GF_OUTSIDE_CENTER_CRATE_1, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, + }, + { + RC_GF_OUTSIDE_CENTER_CRATE_2, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, + }, + { + RC_GF_OUTSIDE_CENTER_CRATE_3, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, + }, + { + RC_GF_OUTSIDE_CENTER_CRATE_4, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, + }, + { + RC_GF_OUTSIDE_LEFT_CRATE_1, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, + }, + { + RC_GF_OUTSIDE_LEFT_CRATE_2, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_1, + RAND_INF_GF_ARCHERY_RANGE_CRATE_1, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_2, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_3, + RAND_INF_GF_ARCHERY_RANGE_CRATE_3, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_4, + RAND_INF_GF_ARCHERY_RANGE_CRATE_4, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_5, + RAND_INF_GF_ARCHERY_RANGE_CRATE_5, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_6, + RAND_INF_GF_ARCHERY_RANGE_CRATE_6, + }, + { + RC_GF_ARCHERY_RANGE_CRATE_7, + RAND_INF_GF_ARCHERY_RANGE_CRATE_7, + }, + { + RC_GF_ARCHERY_START_CRATE_1, + RAND_INF_GF_ARCHERY_START_CRATE_1, + }, + { + RC_GF_ARCHERY_START_CRATE_2, + RAND_INF_GF_ARCHERY_START_CRATE_2, + }, + { + RC_GF_ARCHERY_LEFT_END_CRATE_1, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, + }, + { + RC_GF_ARCHERY_LEFT_END_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, + }, + { + RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, + }, + { + RC_GF_ARCHERY_RIGHT_END_CRATE_1, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, + }, + { + RC_GF_ARCHERY_RIGHT_END_CRATE_2, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, + }, + { + RC_GF_KITCHEN_CRATE_1, + RAND_INF_GF_KITCHEN_CRATE_1, + }, + { + RC_GF_KITCHEN_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_2, + }, + { + RC_GF_KITCHEN_CRATE_3, + RAND_INF_GF_KITCHEN_CRATE_3, + }, + { + RC_GF_KITCHEN_CRATE_4, + RAND_INF_GF_KITCHEN_CRATE_4, + }, + { + RC_GF_KITCHEN_CRATE_5, + RAND_INF_GF_KITCHEN_CRATE_5, + }, + { + RC_GF_BREAK_ROOM_CRATE_1, + RAND_INF_GF_BREAK_ROOM_CRATE_1, + }, + { + RC_GF_BREAK_ROOM_CRATE_2, + RAND_INF_GF_BREAK_ROOM_CRATE_2, + }, + { + RC_GF_BREAK_ROOM_CRATE_3, + RAND_INF_GF_BREAK_ROOM_CRATE_3, + }, + { + RC_GF_BREAK_ROOM_CRATE_4, + RAND_INF_GF_BREAK_ROOM_CRATE_4, + }, + { + RC_GF_NORTH_F1_CARPENTER_CRATE, + RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, + }, + { + RC_GF_NORTH_F3_CARPENTER_CRATE, + RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, + }, + { + RC_GF_SOUTH_F2_CARPENTER_CRATE_1, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, + }, + { + RC_GF_SOUTH_F2_CARPENTER_CRATE_2, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, + }, + { + RC_HW_BEFORE_QUICKSAND_CRATE, + RAND_INF_HW_BEFORE_QUICKSAND_CRATE, + }, + { + RC_HW_AFTER_QUICKSAND_CRATE_1, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, + }, + { + RC_HW_AFTER_QUICKSAND_CRATE_2, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, + }, + { + RC_HW_AFTER_QUICKSAND_CRATE_3, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, + }, + { + RC_HW_NEAR_COLOSSUS_CRATE, + RAND_INF_HW_NEAR_COLOSSUS_CRATE, + }, + { + RC_MK_NEAR_BAZAAR_CRATE_1, + RAND_INF_MK_NEAR_BAZAAR_CRATE_1, + }, + { + RC_MK_NEAR_BAZAAR_CRATE_2, + RAND_INF_MK_NEAR_BAZAAR_CRATE_2, + }, + { + RC_MK_SHOOTING_GALLERY_CRATE_1, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, + }, + { + RC_MK_SHOOTING_GALLERY_CRATE_2, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, + }, + { + RC_MK_LOST_DOG_HOUSE_CRATE, + RAND_INF_MK_LOST_DOG_HOUSE_CRATE, + }, + { + RC_MK_GUARD_HOUSE_CRATE_1, + RAND_INF_MK_GUARD_HOUSE_CRATE_1, + }, + { + RC_MK_GUARD_HOUSE_CRATE_2, + RAND_INF_MK_GUARD_HOUSE_CRATE_2, + }, + { + RC_MK_GUARD_HOUSE_CRATE_3, + RAND_INF_MK_GUARD_HOUSE_CRATE_3, + }, + { + RC_MK_GUARD_HOUSE_CRATE_4, + RAND_INF_MK_GUARD_HOUSE_CRATE_4, + }, + { + RC_MK_GUARD_HOUSE_CRATE_5, + RAND_INF_MK_GUARD_HOUSE_CRATE_5, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + }, + { + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + }, + { + RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + }, + { + RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + }, + { + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + }, + { + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + }, + { + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + }, + { + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + }, + { + RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + }, + { + RC_KAK_NEAR_GY_CHILD_CRATE, + RAND_INF_KAK_NEAR_GY_CHILD_CRATE, + }, + { + RC_KAK_NEAR_WINDMILL_CHILD_CRATE, + RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, + }, + { + RC_KAK_NEAR_FENCE_CHILD_CRATE, + RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, + }, + { + RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + }, + { + RC_KAK_NEAR_BAZAAR_CHILD_CRATE, + RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, + }, + { + RC_GRAVEYARD_CRATE, + RAND_INF_GRAVEYARD_CRATE, + }, + { + RC_GC_MAZE_CRATE, + RAND_INF_GC_MAZE_CRATE, + }, + { + RC_DMC_CRATE, + RAND_INF_DMC_CRATE, + }, + { + RC_LLR_NEAR_TREE_CRATE, + RAND_INF_LLR_NEAR_TREE_CRATE, + }, + { + RC_LH_LAB_CRATE, + RAND_INF_LH_LAB_CRATE, + }, - { RC_DEKU_TREE_MQ_LOBBY_CRATE, RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, }, - { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, }, - { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, }, - { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, }, - { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, }, - { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, }, - { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, }, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, }, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, }, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, }, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, }, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, }, - { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, }, - { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, }, - { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, }, - { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, }, - { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, }, - { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, }, - { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, }, - { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, }, - { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, }, - { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, }, - { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, }, + { + RC_DEKU_TREE_MQ_LOBBY_CRATE, + RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, + }, + { + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + }, + { + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + }, + { + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + }, + { + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + }, + { + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + }, + { + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + }, + { + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + }, + { + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + }, + { + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + }, + { + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + }, + { + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + }, + { + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + }, + { + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + }, - { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, }, - { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, }, - { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, }, - { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, }, - { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, }, - { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, }, + { + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + }, + { + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + }, + { + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + }, + { + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + }, + { + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + }, + { + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + }, - { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, }, - { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, }, - { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, }, - { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, }, - { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, }, - { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, }, - { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, }, - { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, }, - { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, }, - { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, }, - { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, }, - { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, }, - { RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, }, - { RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, }, + { + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + }, + { + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + }, + { + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + }, + { + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + }, + { + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + }, + { + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + }, + { + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + }, + { + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + }, + { + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + }, + { + RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + }, + { + RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + }, }; BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -2182,9 +3136,10 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, auto fs = OTRGlobals::Instance->gRandoContext->GetFishsanity(); RandomizerCheck specialRc = RC_UNKNOWN_CHECK; // TODO: Migrate these special cases into table, or at least document why they are special - switch(sceneNum) { + switch (sceneNum) { case SCENE_TREASURE_BOX_SHOP: { - if ((actorId == ACTOR_EN_BOX && actorParams == 20170) || (actorId == ACTOR_ITEM_ETCETERA && actorParams == 2572)) { + if ((actorId == ACTOR_EN_BOX && actorParams == 20170) || + (actorId == ACTOR_ITEM_ETCETERA && actorParams == 2572)) { specialRc = RC_MARKET_TREASURE_CHEST_GAME_REWARD; } @@ -2231,11 +3186,21 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, case SCENE_HOUSE_OF_SKULLTULA: if (actorId == ACTOR_EN_SSH) { switch (actorParams) { // actor params are used to differentiate between textboxes - case 1: specialRc = RC_KAK_10_GOLD_SKULLTULA_REWARD; break; - case 2: specialRc = RC_KAK_20_GOLD_SKULLTULA_REWARD; break; - case 3: specialRc = RC_KAK_30_GOLD_SKULLTULA_REWARD; break; - case 4: specialRc = RC_KAK_40_GOLD_SKULLTULA_REWARD; break; - case 5: specialRc = RC_KAK_50_GOLD_SKULLTULA_REWARD; break; + case 1: + specialRc = RC_KAK_10_GOLD_SKULLTULA_REWARD; + break; + case 2: + specialRc = RC_KAK_20_GOLD_SKULLTULA_REWARD; + break; + case 3: + specialRc = RC_KAK_30_GOLD_SKULLTULA_REWARD; + break; + case 4: + specialRc = RC_KAK_40_GOLD_SKULLTULA_REWARD; + break; + case 5: + specialRc = RC_KAK_50_GOLD_SKULLTULA_REWARD; + break; } } break; @@ -2293,11 +3258,10 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, auto range = Rando::StaticData::CheckFromActorMultimap.equal_range(std::make_tuple(actorId, sceneNum, actorParams)); for (auto it = range.first; it != range.second; ++it) { - if ( - Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_BOTH || - (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_VANILLA && !ResourceMgr_IsGameMasterQuest()) || - (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_MQ && ResourceMgr_IsGameMasterQuest()) - ) { + if (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_BOTH || + (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_VANILLA && + !ResourceMgr_IsGameMasterQuest()) || + (Rando::StaticData::GetLocation(it->second)->GetQuest() == RCQUEST_MQ && ResourceMgr_IsGameMasterQuest())) { return Rando::StaticData::GetLocation(it->second); } } @@ -2315,7 +3279,8 @@ ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respa scrubIdentity.isShuffled = false; // Scrubs that are 0x06 are loaded as 0x03 when child, switching from selling arrows to seeds - if (actorParams == 0x06) actorParams = 0x03; + if (actorParams == 0x06) + actorParams = 0x03; if (sceneNum == SCENE_GROTTOS) { actorParams = TWO_ACTOR_PARAMS(actorParams, respawnData); @@ -2329,11 +3294,14 @@ ScrubIdentity Randomizer::IdentifyScrub(s32 sceneNum, s32 actorParams, s32 respa scrubIdentity.getItemId = (GetItemID)Rando::StaticData::RetrieveItem(location->GetVanillaItem()).GetItemID(); scrubIdentity.isShuffled = GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_ALL; - if (location->GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) { + if (location->GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || + location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_GROTTO_FRONT || + location->GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) { scrubIdentity.isShuffled = GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF; } - scrubIdentity.itemPrice = OTRGlobals::Instance->gRandoContext->GetItemLocation(scrubIdentity.randomizerCheck)->GetPrice(); + scrubIdentity.itemPrice = + OTRGlobals::Instance->gRandoContext->GetItemLocation(scrubIdentity.randomizerCheck)->GetPrice(); } return scrubIdentity; @@ -2352,9 +3320,11 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { return shopItemIdentity; } - Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_GIRLA, + Rando::Location* location = GetCheckObjectFromActor( + ACTOR_EN_GIRLA, // Bazaar (SHOP1) scene is reused, so if entering from Kak use debug scene to identify - (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == ENTR_BAZAAR_0) ? SCENE_TEST01 : sceneNum, slotIndex - 1); + (sceneNum == SCENE_BAZAAR && gSaveContext.entranceIndex == ENTR_BAZAAR_0) ? SCENE_TEST01 : sceneNum, + slotIndex - 1); if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { shopItemIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; @@ -2367,7 +3337,8 @@ ShopItemIdentity Randomizer::IdentifyShopItem(s32 sceneNum, u8 slotIndex) { shopItemIdentity.enGirlAShopItem = randomizerGetToEnGirlShopItem[randoGet]; } - shopItemIdentity.itemPrice = OTRGlobals::Instance->gRandoContext->GetItemLocation(shopItemIdentity.randomizerCheck)->GetPrice(); + shopItemIdentity.itemPrice = + OTRGlobals::Instance->gRandoContext->GetItemLocation(shopItemIdentity.randomizerCheck)->GetPrice(); } return shopItemIdentity; @@ -2501,7 +3472,6 @@ GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 re } return grassIdentity; - } CrateIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { @@ -2512,11 +3482,11 @@ CrateIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { if (sceneNum == SCENE_MARKET_NIGHT) { crateSceneNum = SCENE_MARKET_DAY; } else if (sceneNum == SCENE_GERUDOS_FORTRESS && gPlayState->linkAgeOnLoad == 1 && posX == 310) { - if (posZ == -1830) { - posZ = -1842.0f; - } else if (posZ == -1770) { - posZ = -1782.0f; - } + if (posZ == -1830) { + posZ = -1842.0f; + } else if (posZ == -1770) { + posZ = -1782.0f; + } } crateIdentity.randomizerInf = RAND_INF_MAX; @@ -2563,7 +3533,8 @@ u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } -GetItemEntry Randomizer::GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability) { +GetItemEntry Randomizer::GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, + bool checkObtainability) { return Rando::Context::GetInstance()->GetFinalGIEntry(randomizerCheck, checkObtainability); } @@ -2575,13 +3546,14 @@ RandomizerInf Randomizer::GetRandomizerInfFromCheck(RandomizerCheck rc) { auto rcIt = rcToRandomizerInf.find(rc); if (rcIt == rcToRandomizerInf.end()) return RAND_INF_MAX; - + return rcIt->second; } RandomizerCheck Randomizer::GetCheckFromRandomizerInf(RandomizerInf randomizerInf) { for (auto const& [key, value] : rcToRandomizerInf) { - if (value == randomizerInf) return key; + if (value == randomizerInf) + return key; } return RC_UNKNOWN_CHECK; @@ -2593,9 +3565,9 @@ void GenerateRandomizerImgui(std::string seed = "") { CVarSetInteger(CVAR_GENERAL("RandoGenerating"), 1); CVarSave(); auto ctx = Rando::Context::GetInstance(); - //RANDOTODO proper UI for selecting if a spoiler loaded should be used for settings + // RANDOTODO proper UI for selecting if a spoiler loaded should be used for settings Rando::Settings::GetInstance()->SetAllToContext(); - + // todo: this efficently when we build out cvar array support std::set excludedLocations; std::stringstream excludedLocationStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "")); @@ -2605,14 +3577,13 @@ void GenerateRandomizerImgui(std::string seed = "") { } // todo: better way to sort out linking tricks rather than name - + std::set enabledTricks; std::stringstream enabledTrickStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), "")); std::string enabledTrickString; while (getline(enabledTrickStringStream, enabledTrickString, ',')) { enabledTricks.insert((RandomizerTrick)std::stoi(enabledTrickString)); } - // Update the visibilitiy before removing conflicting excludes (in case the locations tab wasn't viewed) RandomizerCheckObjects::UpdateImGuiVisibility(); @@ -2662,32 +3633,36 @@ void RandomizerSettingsWindow::DrawElement() { } static bool locationsTabOpen = false; static bool tricksTabOpen = false; - bool disableEditingRandoSettings = CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); + bool disableEditingRandoSettings = + CVarGetInteger(CVAR_GENERAL("RandoGenerating"), 0) || CVarGetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 0); ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0) || disableEditingRandoSettings); const PresetTypeDefinition presetTypeDef = presetTypes.at(PRESET_TYPE_RANDOMIZER); std::string comboboxTooltip = ""; for (auto iter = presetTypeDef.presets.begin(); iter != presetTypeDef.presets.end(); ++iter) { - if (iter->first != 0) comboboxTooltip += "\n\n"; + if (iter->first != 0) + comboboxTooltip += "\n\n"; comboboxTooltip += std::string(iter->second.label) + " - " + std::string(iter->second.description); } const std::string presetTypeCvar = CVAR_GENERAL("SelectedPresets.") + std::to_string(PRESET_TYPE_RANDOMIZER); randomizerPresetSelected = CVarGetInteger(presetTypeCvar.c_str(), RANDOMIZER_PRESET_DEFAULT); - if (UIWidgets::Combobox("Randomizer Presets", &randomizerPresetSelected, randomizerPresetList, UIWidgets::ComboboxOptions() - .DefaultIndex(RANDOMIZER_PRESET_DEFAULT) - .Tooltip(comboboxTooltip.c_str()) - .Color(THEME_COLOR)) - ) { + if (UIWidgets::Combobox("Randomizer Presets", &randomizerPresetSelected, randomizerPresetList, + UIWidgets::ComboboxOptions() + .DefaultIndex(RANDOMIZER_PRESET_DEFAULT) + .Tooltip(comboboxTooltip.c_str()) + .Color(THEME_COLOR))) { CVarSetInteger(presetTypeCvar.c_str(), randomizerPresetSelected); } ImGui::SameLine(); ImGui::SetCursorPosY(ImGui::GetCursorPos().y + 35.f); - if (UIWidgets::Button("Apply Preset##Randomizer", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { + if (UIWidgets::Button( + "Apply Preset##Randomizer", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline).Padding(ImVec2(10.f, 6.f)))) { if (randomizerPresetSelected >= presetTypeDef.presets.size()) { randomizerPresetSelected = 0; } const PresetDefinition selectedPresetDef = presetTypeDef.presets.at(randomizerPresetSelected); - for(const char* block : presetTypeDef.blocksToClear) { + for (const char* block : presetTypeDef.blocksToClear) { CVarClearBlock(block); } if (randomizerPresetSelected != 0) { @@ -2702,22 +3677,29 @@ void RandomizerSettingsWindow::DrawElement() { } UIWidgets::Spacer(0); - UIWidgets::CVarCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Manual seed entry", CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0)) { UIWidgets::PushStyleInput(THEME_COLOR); - ImGui::InputText("##RandomizerSeed", seedString, MAX_SEED_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, UIWidgets::TextFilters::FilterAlphaNum); - UIWidgets::Tooltip( - "Characters from a-z, A-Z, and 0-9 are supported.\n" - "Character limit is 1023, after which the seed will be truncated.\n" - ); + ImGui::InputText("##RandomizerSeed", seedString, MAX_SEED_STRING_SIZE, ImGuiInputTextFlags_CallbackCharFilter, + UIWidgets::TextFilters::FilterAlphaNum); + UIWidgets::Tooltip("Characters from a-z, A-Z, and 0-9 are supported.\n" + "Character limit is 1023, after which the seed will be truncated.\n"); ImGui::SameLine(); - if (UIWidgets::Button(ICON_FA_RANDOM, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)).Tooltip( - "Creates a new random seed value to be used when generating a randomizer" - ))) { + if (UIWidgets::Button( + ICON_FA_RANDOM, + UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Color(THEME_COLOR) + .Padding(ImVec2(10.f, 6.f)) + .Tooltip("Creates a new random seed value to be used when generating a randomizer"))) { SohUtils::CopyStringToCharArray(seedString, std::to_string(rand() & 0xFFFFFFFF), MAX_SEED_STRING_SIZE); } ImGui::SameLine(); - if (UIWidgets::Button(ICON_FA_ERASER, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline).Color(THEME_COLOR).Padding(ImVec2(10.f, 6.f)))) { + if (UIWidgets::Button(ICON_FA_ERASER, UIWidgets::ButtonOptions() + .Size(UIWidgets::Sizes::Inline) + .Color(THEME_COLOR) + .Padding(ImVec2(10.f, 6.f)))) { memset(seedString, 0, MAX_SEED_STRING_SIZE); } if (strnlen(seedString, MAX_SEED_STRING_SIZE) == 0) { @@ -2728,9 +3710,11 @@ void RandomizerSettingsWindow::DrawElement() { } UIWidgets::Spacer(0); - ImGui::BeginDisabled((CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0) && gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || - GameInteractor::IsSaveLoaded()); - if (UIWidgets::Button("Generate Randomizer", UIWidgets::ButtonOptions().Size(ImVec2(250.f, 0.f)).Color(THEME_COLOR))) { + ImGui::BeginDisabled((CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0) && + gSaveContext.gameMode != GAMEMODE_FILE_SELECT) || + GameInteractor::IsSaveLoaded()); + if (UIWidgets::Button("Generate Randomizer", + UIWidgets::ButtonOptions().Size(ImVec2(250.f, 0.f)).Color(THEME_COLOR))) { ctx->SetSpoilerLoaded(false); GenerateRandomizer(CVarGetInteger(CVAR_RANDOMIZER_SETTING("ManualSeedEntry"), 0) ? seedString : ""); } @@ -2763,10 +3747,12 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::EndTabItem(); } - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Items")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); if (mSettings->GetOptionGroup(RSG_ITEMS_IMGUI_TABLE).RenderImGui()) { mNeedsUpdate = true; } @@ -2776,7 +3762,8 @@ void RandomizerSettingsWindow::DrawElement() { } ImGui::EndDisabled(); - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Gameplay")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (mSettings->GetOptionGroup(RSG_GAMEPLAY_IMGUI_TABLE).RenderImGui()) { @@ -2787,14 +3774,16 @@ void RandomizerSettingsWindow::DrawElement() { } ImGui::EndDisabled(); - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); if (ImGui::BeginTabItem("Locations")) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (!locationsTabOpen) { locationsTabOpen = true; RandomizerCheckObjects::UpdateImGuiVisibility(); // todo: this efficently when we build out cvar array support - std::stringstream excludedLocationStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "")); + std::stringstream excludedLocationStringStream( + CVarGetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), "")); std::string excludedLocationString; excludedLocations.clear(); while (getline(excludedLocationStringStream, excludedLocationString, ',')) { @@ -2836,7 +3825,8 @@ void RandomizerSettingsWindow::DrawElement() { if (ImGui::TreeNode(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str())) { for (auto& location : locations) { if (ctx->GetItemLocation(location)->IsVisible() && !excludedLocations.count(location) && - locationSearch.PassFilter(Rando::StaticData::GetLocation(location)->GetName().c_str())) { + locationSearch.PassFilter( + Rando::StaticData::GetLocation(location)->GetName().c_str())) { UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(location).c_str(), ImGuiDir_Right)) { excludedLocations.insert(location); @@ -2846,8 +3836,12 @@ void RandomizerSettingsWindow::DrawElement() { excludedLocationString += std::to_string(excludedLocationIt); excludedLocationString += ","; } - CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), excludedLocationString.c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), + excludedLocationString.c_str()); + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } UIWidgets::PopStyleButton(); ImGui::SameLine(); @@ -2892,9 +3886,13 @@ void RandomizerSettingsWindow::DrawElement() { if (excludedLocationString == "") { CVarClear(CVAR_RANDOMIZER_SETTING("ExcludedLocations")); } else { - CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), excludedLocationString.c_str()); + CVarSetString(CVAR_RANDOMIZER_SETTING("ExcludedLocations"), + excludedLocationString.c_str()); } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } UIWidgets::PopStyleButton(); ImGui::SameLine(); @@ -2919,15 +3917,16 @@ void RandomizerSettingsWindow::DrawElement() { if (ImGui::BeginTabItem("Tricks/Glitches")) { if (!tricksTabOpen) { tricksTabOpen = true; - //RandomizerTricks::UpdateImGuiVisibility(); - // todo: this efficently when we build out cvar array support + // RandomizerTricks::UpdateImGuiVisibility(); + // todo: this efficently when we build out cvar array support std::stringstream enabledTrickStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), "")); std::string enabledTrickString; enabledTricks.clear(); while (getline(enabledTrickStringStream, enabledTrickString, ',')) { enabledTricks.insert((RandomizerTrick)std::stoi(enabledTrickString)); } - std::stringstream enabledGlitchStringStream(CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledGlitches"), "")); + std::stringstream enabledGlitchStringStream( + CVarGetString(CVAR_RANDOMIZER_SETTING("EnabledGlitches"), "")); std::string enabledGlitchString; enabledGlitches.clear(); while (getline(enabledGlitchStringStream, enabledGlitchString, ',')) { @@ -2953,93 +3952,93 @@ void RandomizerSettingsWindow::DrawElement() { } if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA) { 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"); + 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"); } ImGui::PopItemWidth(); ImGui::EndTable(); } - ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == RO_LOGIC_VANILLA); + ImGui::BeginDisabled(CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) == + RO_LOGIC_VANILLA); // Tricks - static std::unordered_map areaTreeDisabled { - {RA_NONE, true}, - {RA_KOKIRI_FOREST, true}, - {RA_THE_LOST_WOODS, true}, - {RA_SACRED_FOREST_MEADOW, true}, - {RA_HYRULE_FIELD, true}, - {RA_LAKE_HYLIA, true}, - {RA_GERUDO_VALLEY, true}, - {RA_GERUDO_FORTRESS, true}, - {RA_HAUNTED_WASTELAND, true}, - {RA_DESERT_COLOSSUS, true}, - {RA_THE_MARKET, true}, - {RA_HYRULE_CASTLE, true}, - {RA_KAKARIKO_VILLAGE, true}, - {RA_THE_GRAVEYARD, true}, - {RA_DEATH_MOUNTAIN_TRAIL, true}, - {RA_GORON_CITY, true}, - {RA_DEATH_MOUNTAIN_CRATER, true}, - {RA_ZORAS_RIVER, true}, - {RA_ZORAS_DOMAIN, true}, - {RA_ZORAS_FOUNTAIN, true}, - {RA_LON_LON_RANCH, true}, - {RA_DEKU_TREE, true}, - {RA_DODONGOS_CAVERN, true}, - {RA_JABU_JABUS_BELLY, true}, - {RA_FOREST_TEMPLE, true}, - {RA_FIRE_TEMPLE, true}, - {RA_WATER_TEMPLE, true}, - {RA_SPIRIT_TEMPLE, true}, - {RA_SHADOW_TEMPLE, true}, - {RA_BOTTOM_OF_THE_WELL, true}, - {RA_ICE_CAVERN, true}, - {RA_GERUDO_TRAINING_GROUND, true}, - {RA_GANONS_CASTLE, true}, + static std::unordered_map areaTreeDisabled{ + { RA_NONE, true }, + { RA_KOKIRI_FOREST, true }, + { RA_THE_LOST_WOODS, true }, + { RA_SACRED_FOREST_MEADOW, true }, + { RA_HYRULE_FIELD, true }, + { RA_LAKE_HYLIA, true }, + { RA_GERUDO_VALLEY, true }, + { RA_GERUDO_FORTRESS, true }, + { RA_HAUNTED_WASTELAND, true }, + { RA_DESERT_COLOSSUS, true }, + { RA_THE_MARKET, true }, + { RA_HYRULE_CASTLE, true }, + { RA_KAKARIKO_VILLAGE, true }, + { RA_THE_GRAVEYARD, true }, + { RA_DEATH_MOUNTAIN_TRAIL, true }, + { RA_GORON_CITY, true }, + { RA_DEATH_MOUNTAIN_CRATER, true }, + { RA_ZORAS_RIVER, true }, + { RA_ZORAS_DOMAIN, true }, + { RA_ZORAS_FOUNTAIN, true }, + { RA_LON_LON_RANCH, true }, + { RA_DEKU_TREE, true }, + { RA_DODONGOS_CAVERN, true }, + { RA_JABU_JABUS_BELLY, true }, + { RA_FOREST_TEMPLE, true }, + { RA_FIRE_TEMPLE, true }, + { RA_WATER_TEMPLE, true }, + { RA_SPIRIT_TEMPLE, true }, + { RA_SHADOW_TEMPLE, true }, + { RA_BOTTOM_OF_THE_WELL, true }, + { RA_ICE_CAVERN, true }, + { RA_GERUDO_TRAINING_GROUND, true }, + { RA_GANONS_CASTLE, true }, }; - static std::unordered_map areaTreeEnabled { - {RA_NONE, true}, - {RA_KOKIRI_FOREST, true}, - {RA_THE_LOST_WOODS, true}, - {RA_SACRED_FOREST_MEADOW, true}, - {RA_HYRULE_FIELD, true}, - {RA_LAKE_HYLIA, true}, - {RA_GERUDO_VALLEY, true}, - {RA_GERUDO_FORTRESS, true}, - {RA_HAUNTED_WASTELAND, true}, - {RA_DESERT_COLOSSUS, true}, - {RA_THE_MARKET, true}, - {RA_HYRULE_CASTLE, true}, - {RA_KAKARIKO_VILLAGE, true}, - {RA_THE_GRAVEYARD, true}, - {RA_DEATH_MOUNTAIN_TRAIL, true}, - {RA_GORON_CITY, true}, - {RA_DEATH_MOUNTAIN_CRATER, true}, - {RA_ZORAS_RIVER, true}, - {RA_ZORAS_DOMAIN, true}, - {RA_ZORAS_FOUNTAIN, true}, - {RA_LON_LON_RANCH, true}, - {RA_DEKU_TREE, true}, - {RA_DODONGOS_CAVERN, true}, - {RA_JABU_JABUS_BELLY, true}, - {RA_FOREST_TEMPLE, true}, - {RA_FIRE_TEMPLE, true}, - {RA_WATER_TEMPLE, true}, - {RA_SPIRIT_TEMPLE, true}, - {RA_SHADOW_TEMPLE, true}, - {RA_BOTTOM_OF_THE_WELL, true}, - {RA_ICE_CAVERN, true}, - {RA_GERUDO_TRAINING_GROUND, true}, - {RA_GANONS_CASTLE, true}, + static std::unordered_map areaTreeEnabled{ + { RA_NONE, true }, + { RA_KOKIRI_FOREST, true }, + { RA_THE_LOST_WOODS, true }, + { RA_SACRED_FOREST_MEADOW, true }, + { RA_HYRULE_FIELD, true }, + { RA_LAKE_HYLIA, true }, + { RA_GERUDO_VALLEY, true }, + { RA_GERUDO_FORTRESS, true }, + { RA_HAUNTED_WASTELAND, true }, + { RA_DESERT_COLOSSUS, true }, + { RA_THE_MARKET, true }, + { RA_HYRULE_CASTLE, true }, + { RA_KAKARIKO_VILLAGE, true }, + { RA_THE_GRAVEYARD, true }, + { RA_DEATH_MOUNTAIN_TRAIL, true }, + { RA_GORON_CITY, true }, + { RA_DEATH_MOUNTAIN_CRATER, true }, + { RA_ZORAS_RIVER, true }, + { RA_ZORAS_DOMAIN, true }, + { RA_ZORAS_FOUNTAIN, true }, + { RA_LON_LON_RANCH, true }, + { RA_DEKU_TREE, true }, + { RA_DODONGOS_CAVERN, true }, + { RA_JABU_JABUS_BELLY, true }, + { RA_FOREST_TEMPLE, true }, + { RA_FIRE_TEMPLE, true }, + { RA_WATER_TEMPLE, true }, + { RA_SPIRIT_TEMPLE, true }, + { RA_SHADOW_TEMPLE, true }, + { RA_BOTTOM_OF_THE_WELL, true }, + { RA_ICE_CAVERN, true }, + { RA_GERUDO_TRAINING_GROUND, true }, + { RA_GANONS_CASTLE, true }, }; - static std::map showTag { - { Rando::Tricks::Tag::NOVICE, true }, - { Rando::Tricks::Tag::INTERMEDIATE, true }, - { Rando::Tricks::Tag::ADVANCED, true }, - { Rando::Tricks::Tag::EXPERT, true }, - { Rando::Tricks::Tag::EXTREME, true }, - { Rando::Tricks::Tag::EXPERIMENTAL, true }, + static std::map showTag{ + { Rando::Tricks::Tag::NOVICE, true }, { Rando::Tricks::Tag::INTERMEDIATE, true }, + { Rando::Tricks::Tag::ADVANCED, true }, { Rando::Tricks::Tag::EXPERT, true }, + { Rando::Tricks::Tag::EXTREME, true }, { Rando::Tricks::Tag::EXPERIMENTAL, true }, //{ Rando::Tricks::Tag::GLITCH, false }, }; static ImGuiTextFilter trickSearch; @@ -3048,7 +4047,8 @@ void RandomizerSettingsWindow::DrawElement() { UIWidgets::PopStyleInput(); if (CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) != RO_LOGIC_NO_LOGIC) { ImGui::SameLine(); - if (UIWidgets::Button("Disable All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { + if (UIWidgets::Button("Disable All", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto etfound = enabledTricks.find(static_cast(i)); if (etfound != enabledTricks.end()) { @@ -3064,7 +4064,8 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } ImGui::SameLine(); - if (UIWidgets::Button("Enable All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { + if (UIWidgets::Button("Enable All", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(250.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { if (!enabledTricks.count(static_cast(i))) { enabledTricks.insert(static_cast(i)); @@ -3079,7 +4080,9 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } } - if (ImGui::BeginTable("trickTags", showTag.size(), ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) { + if (ImGui::BeginTable("trickTags", showTag.size(), + ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | + ImGuiTableFlags_Borders)) { for (auto [rtTag, isShown] : showTag) { ImGui::TableNextColumn(); if (isShown) { @@ -3107,19 +4110,22 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - if (UIWidgets::Button("Collapse All##disabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { + if (UIWidgets::Button("Collapse All##disabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeDisabled[static_cast(i)] = false; } } ImGui::SameLine(); - if (UIWidgets::Button("Open All##disabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { + if (UIWidgets::Button("Open All##disabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeDisabled[static_cast(i)] = true; } } ImGui::SameLine(); - if (UIWidgets::Button("Enable Visible", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { + if (UIWidgets::Button("Enable Visible", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto option = mSettings->GetTrickOption(static_cast(i)); if (!enabledTricks.count(static_cast(i)) && @@ -3138,7 +4144,8 @@ void RandomizerSettingsWindow::DrawElement() { Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } - ImGui::BeginChild("ChildTricksDisabled", ImVec2(0, -8), false, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::BeginChild("ChildTricksDisabled", ImVec2(0, -8), false, + ImGuiWindowFlags_HorizontalScrollbar); for (auto [area, trickIds] : mSettings->mTricksByArea) { bool hasTricks = false; @@ -3151,14 +4158,20 @@ void RandomizerSettingsWindow::DrawElement() { } } if (hasTricks) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##disabled").c_str()), areaTreeDisabled[area]); + ImGui::TreeNodeSetOpen( + ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##disabled").c_str()), + areaTreeDisabled[area]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode((Rando::Tricks::GetAreaName(area) + "##disabled").c_str())) { for (auto rt : trickIds) { auto option = mSettings->GetTrickOption(rt); if (!option.IsHidden() && trickSearch.PassFilter(option.GetName().c_str()) && - !enabledTricks.count(rt) && Rando::Tricks::CheckTags(showTag, option.GetTags())) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(option.GetArea()) + "##disabled").c_str()), areaTreeDisabled[option.GetArea()]); + !enabledTricks.count(rt) && + Rando::Tricks::CheckTags(showTag, option.GetTags())) { + ImGui::TreeNodeSetOpen( + ImGui::GetID( + (Rando::Tricks::GetAreaName(option.GetArea()) + "##disabled").c_str()), + areaTreeDisabled[option.GetArea()]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(rt).c_str(), ImGuiDir_Right)) { @@ -3168,8 +4181,12 @@ void RandomizerSettingsWindow::DrawElement() { enabledTrickString += std::to_string(enabledTrickIt); enabledTrickString += ","; } - CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), enabledTrickString.c_str()); - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); + CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), + enabledTrickString.c_str()); + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } UIWidgets::PopStyleButton(); Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); @@ -3191,24 +4208,26 @@ void RandomizerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; - if (UIWidgets::Button("Collapse All##enabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { + if (UIWidgets::Button("Collapse All##enabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeEnabled[static_cast(i)] = false; } } ImGui::SameLine(); - if (UIWidgets::Button("Open All##enabled", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { + if (UIWidgets::Button("Open All##enabled", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RA_MAX; i++) { areaTreeEnabled[static_cast(i)] = true; } } ImGui::SameLine(); - if (UIWidgets::Button("Disable Visible", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { + if (UIWidgets::Button("Disable Visible", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(ImVec2(0.f, 0.f)))) { for (int i = 0; i < RT_MAX; i++) { auto option = mSettings->GetTrickOption(static_cast(i)); if (enabledTricks.count(static_cast(i)) && - trickSearch.PassFilter(option.GetName().c_str()) && - areaTreeEnabled[option.GetArea()] && + trickSearch.PassFilter(option.GetName().c_str()) && areaTreeEnabled[option.GetArea()] && Rando::Tricks::CheckTags(showTag, option.GetTags())) { enabledTricks.erase(static_cast(i)); } @@ -3239,14 +4258,20 @@ void RandomizerSettingsWindow::DrawElement() { } } if (hasTricks) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##enabled").c_str()), areaTreeEnabled[area]); + ImGui::TreeNodeSetOpen( + ImGui::GetID((Rando::Tricks::GetAreaName(area) + "##enabled").c_str()), + areaTreeEnabled[area]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); if (ImGui::TreeNode((Rando::Tricks::GetAreaName(area) + "##enabled").c_str())) { for (auto rt : trickIds) { auto option = mSettings->GetTrickOption(rt); if (!option.IsHidden() && trickSearch.PassFilter(option.GetName().c_str()) && - enabledTricks.count(rt) && Rando::Tricks::CheckTags(showTag, option.GetTags())) { - ImGui::TreeNodeSetOpen(ImGui::GetID((Rando::Tricks::GetAreaName(option.GetArea()) + "##enabled").c_str()), areaTreeEnabled[option.GetArea()]); + enabledTricks.count(rt) && + Rando::Tricks::CheckTags(showTag, option.GetTags())) { + ImGui::TreeNodeSetOpen( + ImGui::GetID( + (Rando::Tricks::GetAreaName(option.GetArea()) + "##enabled").c_str()), + areaTreeEnabled[option.GetArea()]); ImGui::SetNextItemOpen(true, ImGuiCond_Once); UIWidgets::PushStyleButton(THEME_COLOR, ImVec2(7.f, 5.f)); if (ImGui::ArrowButton(std::to_string(rt).c_str(), ImGuiDir_Left)) { @@ -3255,19 +4280,23 @@ void RandomizerSettingsWindow::DrawElement() { for (auto enabledTrickIt : enabledTricks) { enabledTrickString += std::to_string(enabledTrickIt); enabledTrickString += ","; + } + if (enabledTrickString == "") { + CVarClear(CVAR_RANDOMIZER_SETTING("EnabledTricks")); + } else { + CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), + enabledTrickString.c_str()); + } + Ship::Context::GetInstance() + ->GetWindow() + ->GetGui() + ->SaveConsoleVariablesNextFrame(); } - if (enabledTrickString == "") { - CVarClear(CVAR_RANDOMIZER_SETTING("EnabledTricks")); - } else { - CVarSetString(CVAR_RANDOMIZER_SETTING("EnabledTricks"), enabledTrickString.c_str()); - } - Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); - } - UIWidgets::PopStyleButton(); - Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); - ImGui::SameLine(); - ImGui::Text("%s", option.GetName().c_str()); - UIWidgets::Tooltip(option.GetDescription().c_str()); + UIWidgets::PopStyleButton(); + Rando::Tricks::DrawTagChips(option.GetTags(), option.GetName()); + ImGui::SameLine(); + ImGui::Text("%s", option.GetName().c_str()); + UIWidgets::Tooltip(option.GetDescription().c_str()); } } areaTreeEnabled[area] = true; @@ -3326,41 +4355,48 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { CustomMessage messageEntry; switch (scene) { case SCENE_TEMPLE_OF_TIME: - if (ctx->GetOption(RSK_OOT_HINT) && !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()){ + if (ctx->GetOption(RSK_OOT_HINT) && !ctx->GetItemLocation(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) { messageEntry = ctx->GetHint(RH_OOT_HINT)->GetHintMessage(MF_RAW); } else if (!CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER)) { messageEntry = CustomMessage( - "@, meet me at %gGanon's Castle%w once you obtain the %rkey to his lair%w.", - "@, wir treffen uns bei %gGanons Schloß%w, sobald Du den %rSchlüssel zu seinem Verlies%w hast.", - "Retrouve-moi au %gChâteau de Ganon%w une fois que tu auras obtenu la %rclé de son repaire%w."); + "@, meet me at %gGanon's Castle%w once you obtain the %rkey to his lair%w.", + "@, wir treffen uns bei %gGanons Schloß%w, sobald Du den %rSchlüssel zu seinem Verlies%w hast.", + "Retrouve-moi au %gChâteau de Ganon%w une fois que tu auras obtenu la %rclé de son repaire%w."); } else { - messageEntry = CustomMessage( - "The time has come. Prepare yourself.", - "Die Zeit ist gekommen.&Mach Dich bereit.", - "Le moment est venu @.&Tu ferais bien de te préparer."); + messageEntry = + CustomMessage("The time has come. Prepare yourself.", "Die Zeit ist gekommen.&Mach Dich bereit.", + "Le moment est venu @.&Tu ferais bien de te préparer."); } break; case SCENE_INSIDE_GANONS_CASTLE: if (ctx->GetOption(RSK_SHEIK_LA_HINT) && INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) { messageEntry = ctx->GetHint(RH_SHEIK_HINT)->GetHintMessage(MF_RAW); - } else if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && - CUR_CAPACITY(UPG_QUIVER) >= 30 && gSaveContext.isMagicAcquired)) { - messageEntry = CustomMessage("You are still ill-equipped to face %rGanondorf%w." - "^Seek out the %cMaster Sword%w, %rsomething to hold your arrows%w, and %gmagic%w to summon the %ylight%w.", + } else if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && + INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CUR_CAPACITY(UPG_QUIVER) >= 30 && + gSaveContext.isMagicAcquired)) { + messageEntry = CustomMessage( + "You are still ill-equipped to face %rGanondorf%w." + "^Seek out the %cMaster Sword%w, %rsomething to hold your arrows%w, and %gmagic%w to summon the " + "%ylight%w.", "Du bist noch nicht gewappnet um Dich %rGanondorf%w stellen zu können.^" - "Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu geben%w,^sowie %gdie Magie%w, um das %yLicht%w herauf beschwören zu können.", + "Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu " + "geben%w,^sowie %gdie Magie%w, um das %yLicht%w herauf beschwören zu können.", "@, tu n'es toujours pas prêt à affronter %rGanondorf%w.^" - "Cherche l'%cÉpée de Légende%w, %rquelque chose pour ranger tes flèches%w et de la %gmagie%w pour invoquer la %ylumière%w."); - } else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER) && !ctx->GetOption(RSK_TRIAL_COUNT).Is(0)){ + "Cherche l'%cÉpée de Légende%w, %rquelque chose pour ranger tes flèches%w et de la %gmagie%w pour " + "invoquer la %ylumière%w."); + } else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER) && + !ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { messageEntry = CustomMessage( - "You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still stands.^Complete the remaining %gtrials%w to destroy it.", - "Du magst das haben, was Du brauchst um %rden bösen König%w zu besiegen, aber die %cBarriere%w steht noch.^Absolviere die verbleibenden %gPrüfungen%w um sie zu zerstören.", - "@, tu as peut-être ce qu'il te faut pour vaincre %rle Malin%w, mais les barrières sont toujours actives.^Termine les épreuves restantes pour les détruire."); + "You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still " + "stands.^Complete the remaining %gtrials%w to destroy it.", + "Du magst das haben, was Du brauchst um %rden bösen König%w zu besiegen, aber die %cBarriere%w " + "steht noch.^Absolviere die verbleibenden %gPrüfungen%w um sie zu zerstören.", + "@, tu as peut-être ce qu'il te faut pour vaincre %rle Malin%w, mais les barrières sont toujours " + "actives.^Termine les épreuves restantes pour les détruire."); } else { - messageEntry = CustomMessage( - "If you're ready, then proceed.^Good luck.", - "Wenn Du bereit bist, so schreite&voran.^Viel Glück.", - "Si tu es prêt, tu peux y aller.^Bonne chance."); + messageEntry = CustomMessage("If you're ready, then proceed.^Good luck.", + "Wenn Du bereit bist, so schreite&voran.^Viel Glück.", + "Si tu es prêt, tu peux y aller.^Bonne chance."); } break; } @@ -3371,10 +4407,10 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { auto ctx = Rando::Context::GetInstance(); CustomMessage messageEntry = CustomMessage( - "Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!", - "Entschuldigung, aber der Teich ist zu.&Ich habe meine gute %rAngelrute%w verloren.&Ohne kann ich nicht fischen!", - "Désolé, mais l'étang est fermé.&J'ai perdu ma bonne %rCanne à Pêche%w...&Impossible de pêcher sans elle!" - ); + "Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!", + "Entschuldigung, aber der Teich ist zu.&Ich habe meine gute %rAngelrute%w verloren.&Ohne kann ich nicht " + "fischen!", + "Désolé, mais l'étang est fermé.&J'ai perdu ma bonne %rCanne à Pêche%w...&Impossible de pêcher sans elle!"); if (Rando::Context::GetInstance()->GetOption(RSK_FISHING_POLE_HINT)) { messageEntry = messageEntry + CustomMessage(ctx->GetHint(RH_FISHING_POLE)->GetHintMessage()); @@ -3382,14 +4418,13 @@ CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { // if the fishing pond guy doesnt remember me i will cry :( if (originalTextId == TEXT_FISHING_POND_START_MET) { - messageEntry = CustomMessage( - "Hey, mister! I remember you!&It's been a long time!^", - "Hallo, mein Herr! Ich erinnere mich an Sie!&Lang ist's her!", - "Hé, monsieur! Je me souviens de toi!&Ça fait longtemps!" - ) + messageEntry; + messageEntry = CustomMessage("Hey, mister! I remember you!&It's been a long time!^", + "Hallo, mein Herr! Ich erinnere mich an Sie!&Lang ist's her!", + "Hé, monsieur! Je me souviens de toi!&Ça fait longtemps!") + + messageEntry; } - messageEntry.Format(); //RANDOTODO why is this needed when it's not elsewhere.... + messageEntry.Format(); // RANDOTODO why is this needed when it's not elsewhere.... return messageEntry; } @@ -3406,24 +4441,27 @@ CustomMessage Randomizer::GetMerchantMessage(RandomizerCheck rc, TextIDs textId, } else if (shopItemGet == RG_ICE_TRAP) { shopItemGet = ctx->overrides[rc].LooksLike(); shopItemName = CustomMessage(ctx->overrides[rc].GetTrickName()); - } else { - auto shopItem = Rando::StaticData::RetrieveItem(shopItemGet); - shopItemName = {shopItem.GetName()}; - } - - if (freeTextId != TEXT_NONE && shopItemPrice == 0) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, freeTextId, MF_RAW); } else { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId, MF_RAW); + auto shopItem = Rando::StaticData::RetrieveItem(shopItemGet); + shopItemName = { shopItem.GetName() }; } - messageEntry.InsertNames({shopItemName, {std::to_string(shopItemPrice)}}); + if (freeTextId != TEXT_NONE && shopItemPrice == 0) { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, freeTextId, MF_RAW); + } else { + messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId, MF_RAW); + } + + messageEntry.InsertNames({ shopItemName, { std::to_string(shopItemPrice) } }); messageEntry.AutoFormat(); return messageEntry; } CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, itemEntry.getItemId); + CustomMessage messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, itemEntry.getItemId); int sceneNum; switch (itemEntry.getItemId) { case RG_DEKU_TREE_MAP: @@ -3460,8 +4498,7 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { if (GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || (GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12) - ) { + GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12)) { messageEntry.Replace("[[typeHint]]", ""); } else if (ResourceMgr_IsSceneMasterQuest(sceneNum)) { messageEntry.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_MASTERFUL].GetHintMessage()); @@ -3472,8 +4509,7 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { return messageEntry; } -template -void CreateGetItemMessages(const std::array& messageEntries) { +template void CreateGetItemMessages(const std::array& messageEntries) { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::getItemMessageTableID); for (const GetItemMessage& messageEntry : messageEntries) { @@ -3506,17 +4542,15 @@ void CreateRupeeMessages() { } customMessageManager->CreateMessage( Randomizer::rupeeMessageTableID, rupee, - CustomMessage( - "You found" + rupeeText + " !", - "Du hast" + rupeeText + " gefunden!", - "Vous obtenez" + rupeeText + " !", TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM)); + CustomMessage("You found" + rupeeText + " !", "Du hast" + rupeeText + " gefunden!", + "Vous obtenez" + rupeeText + " !", TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM)); } } CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) { - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId, MF_AUTO_FORMAT); - messageEntry.Replace("[[rupee]]", CustomMessage(RandomElement(englishRupeeNames), - RandomElement(germanRupeeNames), + CustomMessage messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId, MF_AUTO_FORMAT); + messageEntry.Replace("[[rupee]]", CustomMessage(RandomElement(englishRupeeNames), RandomElement(germanRupeeNames), RandomElement(frenchRupeeNames))); return messageEntry; } @@ -3526,19 +4560,24 @@ void CreateTriforcePieceMessages() { { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!", "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est un début!" }, + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. C'est un début!" }, { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!", "Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Ça avance!" }, + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. Ça avance!" }, { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!", - "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die Hälfte!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Il en reste un&peu moins que la moitié!" }, + "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die " + "Hälfte!", + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. Il en reste un&peu moins que la moitié!" }, { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!", "Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!", - "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est presque&terminé!" }, + "Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à " + "trouver. C'est presque&terminé!" }, { "You completed the %yTriforce of&Courage%w! %gGG%w!", "Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!", @@ -3546,7 +4585,8 @@ void CreateTriforcePieceMessages() { { "You found a spare %yTriforce Piece%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!", "Ein übriger %yTriforce-Splitter%w! Du&hast nun %g[[current]]%w von %c[[required]]%w nötigen gefunden.", - "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais vous en avez %g[[current]]%w en&tout!" }, + "Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais " + "vous en avez %g[[current]]%w en&tout!" }, }; CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::triforcePieceMessageTableID); @@ -3648,7 +4688,8 @@ void CreateNaviRandoMessages() { "%cMême un adulte ne peut pas pousser&de grands blocs sans un petit %wgain&de force%c!" }, { "%cI've heard that %rFlare Dancer&%cis weak to the %wMaster Sword%c!&Have you tried it?", - "%cIch habe gehört, daß der&%rFlammenderwisch %ceine Schwäche für&das %wMaster-Schwert %caufweist. Hast Du&es " + "%cIch habe gehört, daß der&%rFlammenderwisch %ceine Schwäche für&das %wMaster-Schwert %caufweist. Hast " + "Du&es " "schon einmal versucht einzusetzen?", "%cJ'ai entendu dire que les %rDanse-&Flammes %csont faîbles face à l'%wÉpée de&Légende%c! Est-ce que tu as " "essayé?" }, @@ -3672,12 +4713,14 @@ void CreateNaviRandoMessages() { "trop apprécier&le fait que tu %wportes un masque%c!" }, { "%cIf you get trapped somewhere, you&might have to %wsave your game %cand&%wreset%c!", - "%cSolltest Du irgendwo eingeschlossen&sein, mußt Du vielleicht Dein %wSpiel&speichern %cund %wneu starten%c!", + "%cSolltest Du irgendwo eingeschlossen&sein, mußt Du vielleicht Dein %wSpiel&speichern %cund %wneu " + "starten%c!", "%cSi tu es coincé quelque part, tu&devrais %wsauvegarder ta partie %cet&faire un %wreset%c!" }, { "%cSheik will meet you in a %rburning&village %conce you have %gForest%c,&%rFire%c, and %bWater " "%cMedallions!", - "%cShiek wird Dich in einem %rbrennenden&Dorf %ctreffen, sobald Du das Amulett&des %gWaldes%c, %rFeuers %cund " + "%cShiek wird Dich in einem %rbrennenden&Dorf %ctreffen, sobald Du das Amulett&des %gWaldes%c, %rFeuers " + "%cund " "%bWassers&%cbesitzt.", "%cSheik t'attendra dans un %rvillage&en feu %clorsque tu auras récupéré&les médaillons de la %gForêt%c, du " "%rFeu&%cet de l'%bEau%c!" }, @@ -3692,9 +4735,7 @@ void CreateNaviRandoMessages() { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::NaviRandoMessageTableID); for (unsigned int i = 0; i <= (NUM_NAVI_MESSAGES - 1); i++) { - customMessageManager->CreateMessage( - Randomizer::NaviRandoMessageTableID, i, - NaviMessages[i]); + customMessageManager->CreateMessage(Randomizer::NaviRandoMessageTableID, i, NaviMessages[i]); } } @@ -3744,7 +4785,7 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Would you like #ice# with that?", "You have obtained the #Ice# Medallion!", "Quick, do a #Zora# impression!", - "One item #on the rocks#!",//would be better if it could display the name of the item + "One item #on the rocks#!", // would be better if it could display the name of the item "How much does a polar bear weigh?&Enough to break the #ice#.", "You got Din's #Ice#!", "You got Nayru's #Cold#!", @@ -3807,12 +4848,13 @@ CustomMessage Randomizer::GetIceTrapMessage() { "STOP!&You violated the #Thaw#!", "I wanted to give you a treasure, but it looks like you got #cold feet#.", "You told me you wanted to deliver #just ice# to Ganondorf!", - "You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice trap. My bad.", + "You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice " + "trap. My bad.", "Time to #cool off#!", "The #Ice Cavern# sends its regards.", "Loading item, please #wait#...", "Mash A+B to not #die#.", - "Sorry, your item is in another location.", //would be better if it could have the name of the item + "Sorry, your item is in another location.", // would be better if it could have the name of the item "You only wish this was %gGreg%w.", "Do you want to drink a hot chocolate?", "The #cold# never bothered me anyway.", @@ -3833,7 +4875,8 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Remember, there may be some momentary #discomfort#.", "In a perfect world #ice traps# like me would not exist, but this is not a perfect world.", "Gee, it sure is #cold# around here.", - "You tested the item with your #ice detector#, it beeped.", //would be better if it could have the name of the item + "You tested the item with your #ice detector#, it beeped.", // would be better if it could have the name of the + // item "You have found the way of the zero. The #sub-zero#.", "Mweep... mweep... mweep...", "Scum, #freezebag#! I mean #freeze#, scumbag!", @@ -3852,19 +4895,22 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Hydration break! Hey, who #froze# my water?", "Oops, wrong #item model#.", "Whoops! You have to put the item #in your inventory#.", - "You dropped the item, shattering it into #shards of ice#!", //would be better if it could have the name of the item + "You dropped the item, shattering it into #shards of ice#!", // would be better if it could have the name of the + // item "Is this... golden age Simpsons?&BECAUSE I'M ABOUT TO #CHOKE A CHILD#.", "You are the weakest @, #goodbye#!", "Ugh... Why did we even randomize #this item#?", "The #Frost Moon# is rising...", - "According to all known laws of physics and biology, there is no way that @ should be able to survive #getting fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a video game, so @ survives anyway... #Probably#.", + "According to all known laws of physics and biology, there is no way that @ should be able to survive #getting " + "fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a " + "video game, so @ survives anyway... #Probably#.", "Okay, so stop me if you've heard this one - a gamer and a bottle of #liquid nitrogen# walk into a milk bar...", "Lástima, es una #trampa de hielo#...&&Nobody expects the Spanish #ice trap#!", "Gee, it sure is #BURR#ing around here.", "Navi? Oh! I thought she was called #Névé#!", "It's fine, @ knew this was a #trap#, they're just using it to take damage intentionally to manipulate RNG.", - "Unfortunately, the item has #stopped#.", //would be better if it could have the name of the item - "This item is #not available# in your country.", //would be better if it could have the name of the item + "Unfortunately, the item has #stopped#.", // would be better if it could have the name of the item + "This item is #not available# in your country.", // would be better if it could have the name of the item "#Ice# try. #;)#", "D'oh, I #missed#!", "Where is my #super suit#?", @@ -3923,12 +4969,13 @@ CustomMessage Randomizer::GetIceTrapMessage() { "J'espère que ça ne te fait ni chaud, ni #froid#.", "Je voulais t'offrir un trésor, mais il semble que tu aies eu #froid aux pieds#", "Tu m'as dit que tu voulais livrer #de la glace# à Ganondorf!", - "Tu as obtenu la Triforce!&Cet ancien artefact divin peut exaucer n'importe quel... ah non, désolé, c'est juste un piège de glace.", + "Tu as obtenu la Triforce!&Cet ancien artefact divin peut exaucer n'importe quel... ah non, désolé, c'est " + "juste un piège de glace.", "Il est temps de #te rafraîchir#!", "La #Caverne Polaire# te passe le bonjour.", "Chargement de l'objet, veuillez #patienter#...", "Martèle A+B pour ne pas #mourir#.", - "Désolé, ton objet est à un autre endroit.", //would be better if it could have the name of the item + "Désolé, ton objet est à un autre endroit.", // would be better if it could have the name of the item "Tu espérais que ce soit %gGreg%w.", "Tu veux boire un chocolat chaud?", "Le #froid# ne m'a jamais dérangé, de toute façon.", @@ -3947,9 +4994,11 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Commence à marteler.", "Cet objet va #s'autodétruire# dans 5 secondes...", "Souviens-toi, il pourrait y avoir un léger #inconfort#.", - "Dans un monde parfait, les #pièges de glace# comme moi n'existeraient pas, mais ce n'est pas un monde parfait.", + "Dans un monde parfait, les #pièges de glace# comme moi n'existeraient pas, mais ce n'est pas un monde " + "parfait.", "Mon dieu qu'il fait #froid# ici.", - "Tu as testé l'objet avec ton #détecteur de glace#, il a bipé.", //would be better if it could have the name of the item + "Tu as testé l'objet avec ton #détecteur de glace#, il a bipé.", // would be better if it could have the name of + // the item "Tu as découvert le chemin du zéro. Le #sub-zéro#.", "Mweep... mweep... mweep...", "Gelé, #sac à glace#! Je veux dire #gèle-toi#, racaille!", @@ -3968,16 +5017,21 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Pause hydratation ! Hé, qui a #gelé# mon eau?", "Oups, mauvais #modèle d'objet#.", "Oups! Tu dois mettre l'objet #dans ton inventaire#.", - "Tu as fait tomber l'objet, le brisant en #éclats de glace#!", //would be better if it could have the name of the item + "Tu as fait tomber l'objet, le brisant en #éclats de glace#!", // would be better if it could have the name of + // the item "Tu es le maillon faible @, #au revoir#!", "Ugh... Pourquoi avons-nous même randomisé #cet objet#?", "La #Lune de Givre# se lève...", - "Selon toutes les lois connues de la physique et de la biologie, @ ne devrait pas survivre à #être complètement enfermé dans la glace#. Les cellules de @ mourraient avant qu'elles ne #dégèlent#. Mais c'est un jeu vidéo, alors @ survit... #Probablement#.", - "OK, arrête-moi si tu l'as déjà entendue - un joueur et une bouteille de #nitrogène liquide# entrent dans un bar à lait...", + "Selon toutes les lois connues de la physique et de la biologie, @ ne devrait pas survivre à #être " + "complètement enfermé dans la glace#. Les cellules de @ mourraient avant qu'elles ne #dégèlent#. Mais c'est un " + "jeu vidéo, alors @ survit... #Probablement#.", + "OK, arrête-moi si tu l'as déjà entendue - un joueur et une bouteille de #nitrogène liquide# entrent dans un " + "bar à lait...", "Lástima, c'est un #piège de glace#...&&Personne ne s'attend à un #piège de glace espagnol#!", "Mon dieu qu'il fait #GLAGLA# ici.", - "C'est bon, @ savait que c'était un #piège#, il l'utilise juste pour prendre des dégâts intentionnellement et manipuler la RNG.", - "Cet objet n'est #pas disponible# dans votre pays.", //would be better if it could have the name of the item + "C'est bon, @ savait que c'était un #piège#, il l'utilise juste pour prendre des dégâts intentionnellement et " + "manipuler la RNG.", + "Cet objet n'est #pas disponible# dans votre pays.", // would be better if it could have the name of the item "#Bonne# tentative. #;)#", "Où est mon #Super Costume#?", "#La revanche du Titanic#.", @@ -3988,17 +5042,11 @@ CustomMessage Randomizer::GetIceTrapMessage() { if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { msg = CustomMessage( /*english*/ "This year for Christmas, all you get is #COAL#!", - /*german*/ "This year for Christmas, all you get is #COAL#!", - /*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!", - { QM_BLUE } - ); + /*german*/ "This year for Christmas, all you get is #COAL#!", + /*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!", { QM_BLUE }); } else { - msg = CustomMessage( - RandomElement(englishIceTrapMessages), - RandomElement(germanIceTrapMessages), - RandomElement(frenchIceTrapMessages), - { QM_BLUE, QM_BLUE, QM_BLUE } - ); + msg = CustomMessage(RandomElement(englishIceTrapMessages), RandomElement(germanIceTrapMessages), + RandomElement(frenchIceTrapMessages), { QM_BLUE, QM_BLUE, QM_BLUE }); } msg.AutoFormat(); @@ -4013,7 +5061,7 @@ static int goronIDs[9] = { TEXT_FIRE_TEMPLE_GORON_OWE_YOU_BIG_TIME, TEXT_FIRE_TEMPLE_GORON_OCARINA_SECRET, TEXT_FIRE_TEMPLE_GORON_PILLAR_SECRET, TEXT_FIRE_TEMPLE_GORON_HIDDEN_DOOR_SECRET, - TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET}; + TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET }; void CreateFireTempleGoronMessages() { CustomMessage FireTempleGoronMessages[NUM_GORON_MESSAGES] = { @@ -4108,461 +5156,374 @@ 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, - "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, - "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, - "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!", + 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, "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, "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!"), - GIMESSAGE(RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, - "You got a %rBig Poe in a Bottle%w!&Sell it to the Ghost Shop!", - "Du hast einen %rNachtschwärmer%w&in einer Flasche gefangen!&Gehe zum %rGespenstermarkt%w&und verkaufe ihn!", - "Vous obtenez une %rBouteille avec&une Âme%w! Vendez-la au Marchand&d'Âme"), - GIMESSAGE(RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, - "You got a %rBottle of Blue Potion%w!&Drink it to replenish your&%ghealth%w and %bmagic%w!", - "Du erhältst ein %rBlaues Elixier%w!&Nutze es, um Deine %rMagie- und&Energieleiste%w komplett&aufzufüllen!", - "Vous obtenez une %rBouteille avec&une Potion Bleue%w! Buvez-la pour&restaurer votre %rénergie vitale%w&ainsi que votre %gmagie%w!"), + GIMESSAGE(RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE, "You got a %rBig Poe in a Bottle%w!&Sell it to the Ghost Shop!", + "Du hast einen %rNachtschwärmer%w&in einer Flasche gefangen!&Gehe zum %rGespenstermarkt%w&und " + "verkaufe ihn!", + "Vous obtenez une %rBouteille avec&une Âme%w! Vendez-la au Marchand&d'Âme"), + GIMESSAGE( + RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, + "You got a %rBottle of Blue Potion%w!&Drink it to replenish your&%ghealth%w and %bmagic%w!", + "Du erhältst ein %rBlaues Elixier%w!&Nutze es, um Deine %rMagie- und&Energieleiste%w komplett&aufzufüllen!", + "Vous obtenez une %rBouteille avec&une Potion Bleue%w! Buvez-la pour&restaurer votre %rénergie " + "vitale%w&ainsi que votre %gmagie%w!"), GIMESSAGE(RG_BOTTLE_WITH_FISH, ITEM_FISH, - "You got a %rFish in a Bottle%w!&It looks fresh and delicious!&They say Jabu-Jabu loves them!", - "Du hast jetzt einen %rFisch in&einer Flasche%w! Er sieht richtig&frisch aus! Man sagt,&Lord Jabu-Jabu liebt Fische!", - "Vous obtenez une %rBouteille avec&un Poisson%w! Il a l'air délicieux!&Il paraîtrait que %bJabu-Jabu %wen&serait friand!"), - GIMESSAGE(RG_BOTTLE_WITH_BUGS, ITEM_BUG, - "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!", - "Du hast jetzt %rKäfer in einer&Flasche&%w!&Sie graben gerne&in Erdlöchern.", - "Vous obtenez une %rBouteille avec&des Insectes%w! Ils adorent creuser&dans la terre meuble!"), - GIMESSAGE(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, - "You got a %rFairy in a Bottle%w!&Use it wisely!", - "Du hast jetzt eine %rFee in einer&Flasche%w! Nutze sie weise!", - "Vous obtenez une %rBouteille avec&une Fée%w! Faites-en bon usage!"), - GIMESSAGE(RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, + "You got a %rFish in a Bottle%w!&It looks fresh and delicious!&They say Jabu-Jabu loves them!", + "Du hast jetzt einen %rFisch in&einer Flasche%w! Er sieht richtig&frisch aus! Man sagt,&Lord " + "Jabu-Jabu liebt Fische!", + "Vous obtenez une %rBouteille avec&un Poisson%w! Il a l'air délicieux!&Il paraîtrait que %bJabu-Jabu " + "%wen&serait friand!"), + GIMESSAGE(RG_BOTTLE_WITH_BUGS, ITEM_BUG, "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!", + "Du hast jetzt %rKäfer in einer&Flasche&%w!&Sie graben gerne&in Erdlöchern.", + "Vous obtenez une %rBouteille avec&des Insectes%w! Ils adorent creuser&dans la terre meuble!"), + GIMESSAGE(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!", + "Du hast jetzt eine %rFee in einer&Flasche%w! Nutze sie weise!", + "Vous obtenez une %rBouteille avec&une Fée%w! Faites-en bon usage!"), + GIMESSAGE( + RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, "You got a %rBottle of Red Potion%w!&Drink it to replenish your&%ghealth%w!", - "Du erhältst ein %rRotes Elixier%w!&Nutze es, um Deine %rEnergieleiste&%weinmalig komplett aufzufüllen!", + "Du erhältst ein %rRotes Elixier%w!&Nutze es, um Deine %rEnergieleiste&%weinmalig komplett aufzufüllen!", "Vous obtenez une %rBouteille avec&une Potion Rouge%w! Buvez-la pour&restaurer votre %rénergie vitale%w!"), - GIMESSAGE(RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, + GIMESSAGE( + RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN, "You got a %rBottle of Green Potion%w!&Drink it to replenish your&%bmagic%w!", - "Du erhältst ein %rGrünes Elixier%w!&Nutze es, um Deine %bMagieleiste&%weinmalig komplett aufzufüllen!", + "Du erhältst ein %rGrünes Elixier%w!&Nutze es, um Deine %bMagieleiste&%weinmalig komplett aufzufüllen!", "Vous obtenez une %rBouteille avec&une Potion Verte%w! Buvez-la pour&restaurer votre %gmagie%w!"), GIMESSAGE(RG_BOTTLE_WITH_POE, ITEM_POE, - "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this...", - "Du hast jetzt ein %rIrrlicht in einer&Flasche%w! Der %rGespenstermarkt%w&interessiert sich für vielleicht&dafür...", - "Vous obtenez une %rBouteille avec&un Esprit%w! Ça intéresserait&peut-être le vendeur d'Âme "), + "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this...", + "Du hast jetzt ein %rIrrlicht in einer&Flasche%w! Der %rGespenstermarkt%w&interessiert sich für " + "vielleicht&dafür...", + "Vous obtenez une %rBouteille avec&un Esprit%w! Ça intéresserait&peut-être le vendeur d'Âme "), - 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!", - "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!", - "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!", - "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!", - "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!", - "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!", - "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!", - "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), + 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!", + "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!", + "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!", + "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!", + "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!", + "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!", + "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!", + "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL, - "You found a %yGerudo Training &Ground %wSmall Key!", - "Du erhältst einen %rkleinen&Schlüssel%w für das %yGerudo-Trainingsgelände%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!", - "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 la %rClé %wde 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 la %rClé %wdu %gBazar&de la Place du Marché%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 la %rClé %wde la&%gPlace du Marché%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 la %rClé %wde la&%gFoire aux Masques%w!"), + "You found a %yGerudo Training &Ground %wSmall Key!", + "Du erhältst einen %rkleinen&Schlüssel%w für das %yGerudo-Trainingsgelände%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!", + "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 la %rClé %wde 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 la %rClé %wdu %gBazar&de la Place du Marché%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 la %rClé %wde la&%gPlace du Marché%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 la %rClé %wde la&%gFoire aux 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 la %rClé %wdu %gStand de&Tir de la Place du Marché%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 la %rClé %wdu %gBowling&Teigneux%w!"), + "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 la %rClé %wdu %gStand de&Tir de la Place du Marché%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 la %rClé %wdu %gBowling&Teigneux%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 la %rClé %wdu %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 la %rClé %wdu %gMagasin&de Missiles%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 la %rClé %wde la %gMaison&de Kiki%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 la %rClé %wde 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 la %rClé %wdu %gBazar&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 la %rClé %wdu %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 la %rClé %wde la %gMaison&du chef des ouvriers%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 la %rClé %wde&l'%gApothicaire%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 la %rClé %wde la %gMaison&des Araignées%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 la %rClé %wde 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 la %rClé %w du %gMoulin%w!"), + "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 la %rClé %wdu %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 la %rClé %wdu %gMagasin&de Missiles%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 la %rClé %wde la %gMaison&de Kiki%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 la %rClé %wde 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 la %rClé %wdu %gBazar&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 la %rClé %wdu %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 la %rClé %wde la %gMaison&du chef des ouvriers%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 la %rClé %wde&l'%gApothicaire%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 la %rClé %wde la %gMaison&des Araignées%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 la %rClé %wde 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 la %rClé %w du %gMoulin%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 la %rClé %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 la %rClé %wde la %gCabane&d'Igor%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 la %rClé %wde 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 la %rClé %wdes %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 la %rClé %wdu %gSilo%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 la %rClé %wdu %gLaboratoire&du Lac Hylia%w!"), - GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, - "You found the key to the&%gPond%w!", - "Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!", - "Vous obtenez la %rClé %wde l'%gÉtang%w!"), + "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 la %rClé %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 la %rClé %wde la %gCabane&d'Igor%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 la %rClé %wde 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 la %rClé %wdes %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 la %rClé %wdu %gSilo%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 la %rClé %wdu %gLaboratoire&du Lac Hylia%w!"), + GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gPond%w!", + "Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!", + "Vous obtenez la %rClé %wde l'%gÉtang%w!"), - GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, - "You found a %yThieves Hideout&%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für das %yDiebesversteck%w!", - "Vous obtenez le trousseau de&clés du %yRepaire des Voleurs%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %gForest Temple&%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %gWaldtempel%w!", - "Vous obtenez le trousseau de&clés du %gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %rFire Temple&%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %rFeuertempel%w!", - "Vous obtenez le trousseau de&clés du %rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %bWater Temple&%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %bWassertempel%w!", - "Vous obtenez le trousseau de&clés du %bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %ySpirit Temple&%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %yGeistertempel%w!", - "Vous obtenez le trousseau de&clés du %yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, - "You found a %pShadow Temple&%wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %pSchattentempel%w!", - "Vous obtenez le trousseau de&clés du %pTemple de l'Ombre%w!"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_KEY_RING, ITEM_KEY_SMALL, - "You found a %pBottom of the&Well %wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", - "Vous obtenez le trousseau de&clés du %pPuits%w!"), - GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, - "You found a %yGerudo Training&Ground %wKeyring!", - "Du erhältst ein %rSchlüsselbund%w&für das %yGerudo-Trainingsgelände%w!", - "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"), - 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 le 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!", - "Du erhältst ein %rSchlüsselbund%w& für das %rSchatztruhen-Poker&%w!", - "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"), + GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, "You found a %yThieves Hideout&%wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für das %yDiebesversteck%w!", + "Vous obtenez le trousseau de&clés du %yRepaire des Voleurs%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %gForest Temple&%wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für den %gWaldtempel%w!", + "Vous obtenez le trousseau de&clés du %gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rFire Temple&%wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für den %rFeuertempel%w!", + "Vous obtenez le trousseau de&clés du %rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %bWater Temple&%wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für den %bWassertempel%w!", + "Vous obtenez le trousseau de&clés du %bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %ySpirit Temple&%wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für den %yGeistertempel%w!", + "Vous obtenez le trousseau de&clés du %yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %pShadow Temple&%wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für den %pSchattentempel%w!", + "Vous obtenez le trousseau de&clés du %pTemple de l'Ombre%w!"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_KEY_RING, ITEM_KEY_SMALL, "You found a %pBottom of the&Well %wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", + "Vous obtenez le trousseau de&clés du %pPuits%w!"), + GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, "You found a %yGerudo Training&Ground %wKeyring!", + "Du erhältst ein %rSchlüsselbund%w&für das %yGerudo-Trainingsgelände%w!", + "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"), + 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 le 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!", + "Du erhältst ein %rSchlüsselbund%w& für das %rSchatztruhen-Poker&%w!", + "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %gForest Temple&%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %gWaldtempel%w!", - "Vous obtenez la %rClé d'or %wdu&%gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %rFire Temple&%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %rFeuertempel%w!", - "Vous obtenez la %rClé d'or %wdu&%rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %bWater Temple&%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %bWassertempel%w!", - "Vous obtenez la %rClé d'or %wdu&%bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %ySpirit Temple&%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %yGeistertempel%w!", - "Vous obtenez la %rClé d'or %wdu&%yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %pShadow Temple&%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für den %pSchattentempel%w!", - "Vous obtenez la %rClé d'or %wdu&%pTemple de l'Ombre%w!"), - GIMESSAGE(RG_GANONS_CASTLE_BOSS_KEY, ITEM_KEY_BOSS, - "You found the %rGanon's Castle&%wBoss Key!", - "Du erhältst den %rMaster-Schlüssel%w&für %rGanons Schloß%w!", - "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %gForest Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&für den %gWaldtempel%w!", + "Vous obtenez la %rClé d'or %wdu&%gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %rFire Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&für den %rFeuertempel%w!", + "Vous obtenez la %rClé d'or %wdu&%rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %bWater Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&für den %bWassertempel%w!", + "Vous obtenez la %rClé d'or %wdu&%bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %ySpirit Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&für den %yGeistertempel%w!", + "Vous obtenez la %rClé d'or %wdu&%yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %pShadow Temple&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&für den %pSchattentempel%w!", + "Vous obtenez la %rClé d'or %wdu&%pTemple de l'Ombre%w!"), + GIMESSAGE(RG_GANONS_CASTLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %rGanon's Castle&%wBoss Key!", + "Du erhältst den %rMaster-Schlüssel%w&für %rGanons Schloß%w!", + "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), - GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, - "You found the %gDeku Tree&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]", - "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), - GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %rDodongo's Cavern&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]", - "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), - GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, - "You found the %bJabu Jabu's Belly&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"), - GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %gForest Temple&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%gTemple de la Forêt%w![[typeHint]]"), - GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %rFire Temple&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"), - GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %bWater Temple&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%bWassertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"), - GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %ySpirit Temple&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"), - GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %pShadow Temple&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%pSchattentempel%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%pTemple de l'Ombre%w![[typeHint]]"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, - "You found the %pBottom of the&Well %wMap![[typeHint]]", - "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w![[typeHint]]", - "Vous obtenez la %rCarte %wdu&%pPuits%w![[typeHint]]"), - GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %cIce Cavern&%wMap![[typeHint]]", - "Du erhältst die %rKarte%w für die&%cEishöhle%w![[typeHint]]", - "Vous obtenez la %rCarte %wde&la %cCaverne Polaire%w![[typeHint]]"), + GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, "You found the %gDeku Tree&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]", + "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), + GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %rDodongo's Cavern&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]", + "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), + GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, "You found the %bJabu Jabu's Belly&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"), + GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %gForest Temple&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%gTemple de la Forêt%w![[typeHint]]"), + GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %rFire Temple&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"), + GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %bWater Temple&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%bWassertempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"), + GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %ySpirit Temple&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"), + GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %pShadow Temple&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%pSchattentempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%pTemple de l'Ombre%w![[typeHint]]"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, "You found the %pBottom of the&Well %wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu&%pPuits%w![[typeHint]]"), + GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %cIce Cavern&%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für die&%cEishöhle%w![[typeHint]]", + "Vous obtenez la %rCarte %wde&la %cCaverne Polaire%w![[typeHint]]"), - GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, - "You found the %gDeku Tree&%wCompass!", - "Du erhältst den %rKompaß%w für den&%gDeku-Baum%w!", - "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), - GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, - "You found the %rDodongo's Cavern&%wCompass!", - "Du erhältst den %rKompaß%w für&%rDodongos Höhle%w!", - "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), - GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, - "You found the %bJabu Jabu's Belly&%wCompass!", - "Du erhältst den %rKompaß%w für den&%bJabu-Jabus Bauch%w!", - "Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"), - GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %gForest Temple&%wCompass!", - "Du erhältst den %rKompaß%w für den&%gWaldtempel%w!", - "Vous obtenez la %rBoussole %wdu&%gTemple de la Forêt%w!"), - GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %rFire Temple&%wCompass!", - "Du erhältst den %rKompaß%w für den&%rFeuertempel%w!", - "Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"), - GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %bWater Temple&%wCompass!", - "Du erhältst den %rKompaß%w für den&%bWassertempel%w!", - "Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"), - GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %ySpirit Temple&%wCompass!", - "Du erhältst den %rKompaß%w für den&%yGeistertempel%w!", - "Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"), - GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, - "You found the %pShadow Temple&%wCompass!", - "Du erhältst den %rKompaß%w für den&%pSchattentempel%w!", - "Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"), - GIMESSAGE(RG_BOTTOM_OF_THE_WELL_COMPASS, ITEM_COMPASS, - "You found the %pBottom of the&Well %wCompass!", - "Du erhältst den %rKompaß%w für den&%pGrund des Brunnens%w!", - "Vous obtenez la %rBoussole %wdu&%pPuits%w!"), - GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, - "You found the %cIce Cavern&%wCompass!", - "Du erhältst den %rKompaß%w für die&%cEishöhle%w!", - "Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"), + GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, "You found the %gDeku Tree&%wCompass!", + "Du erhältst den %rKompaß%w für den&%gDeku-Baum%w!", + "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), + GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, "You found the %rDodongo's Cavern&%wCompass!", + "Du erhältst den %rKompaß%w für&%rDodongos Höhle%w!", + "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), + GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, "You found the %bJabu Jabu's Belly&%wCompass!", + "Du erhältst den %rKompaß%w für den&%bJabu-Jabus Bauch%w!", + "Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"), + GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %gForest Temple&%wCompass!", + "Du erhältst den %rKompaß%w für den&%gWaldtempel%w!", + "Vous obtenez la %rBoussole %wdu&%gTemple de la Forêt%w!"), + GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %rFire Temple&%wCompass!", + "Du erhältst den %rKompaß%w für den&%rFeuertempel%w!", + "Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"), + GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %bWater Temple&%wCompass!", + "Du erhältst den %rKompaß%w für den&%bWassertempel%w!", + "Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"), + GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %ySpirit Temple&%wCompass!", + "Du erhältst den %rKompaß%w für den&%yGeistertempel%w!", + "Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"), + GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %pShadow Temple&%wCompass!", + "Du erhältst den %rKompaß%w für den&%pSchattentempel%w!", + "Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"), + GIMESSAGE(RG_BOTTOM_OF_THE_WELL_COMPASS, ITEM_COMPASS, "You found the %pBottom of the&Well %wCompass!", + "Du erhältst den %rKompaß%w für den&%pGrund des Brunnens%w!", + "Vous obtenez la %rBoussole %wdu&%pPuits%w!"), + GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, "You found the %cIce Cavern&%wCompass!", + "Du erhältst den %rKompaß%w für die&%cEishöhle%w!", + "Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"), GIMESSAGE(RG_MAGIC_BEAN_PACK, ITEM_BEAN, - "You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait for&something fun to happen!", - "Du erhältst eine %rPackung&Wundererbsen%w! Suche nach einer&Stelle um sie einzupflanzen.&Warte ab, was passiert!", - "Vous obtenez un %rPaquet de&Haricots Magiques%w! Trouvez&un endroit approprié pour un&jardin et plantez-les.^Attendez ensuite que quelque&chose d'amusant se produise!"), + "You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait " + "for&something fun to happen!", + "Du erhältst eine %rPackung&Wundererbsen%w! Suche nach einer&Stelle um sie einzupflanzen.&Warte ab, " + "was passiert!", + "Vous obtenez un %rPaquet de&Haricots Magiques%w! Trouvez&un endroit approprié pour un&jardin et " + "plantez-les.^Attendez ensuite que quelque&chose d'amusant se produise!"), GIMESSAGE(RG_TYCOON_WALLET, ITEM_WALLET_GIANT, - "You got a %rTycoon's Wallet%w!&It's gigantic! Now you can carry&up to %y999 rupees%w!", - "Du erhältst die %rGoldene&Geldbörse%w! Die größte aller&Geldbörsen! Jetzt kannst Du bis&zu %y999 Rubine%w mit Dir führen!", - "Vous obtenez la %rBourse de Magnat%w!&Elle peut contenir jusqu'à %y999 rubis%w!&C'est gigantesque!"), + "You got a %rTycoon's Wallet%w!&It's gigantic! Now you can carry&up to %y999 rupees%w!", + "Du erhältst die %rGoldene&Geldbörse%w! Die größte aller&Geldbörsen! Jetzt kannst Du bis&zu %y999 " + "Rubine%w mit Dir führen!", + "Vous obtenez la %rBourse de Magnat%w!&Elle peut contenir jusqu'à %y999 rubis%w!&C'est gigantesque!"), GIMESSAGE(RG_CHILD_WALLET, ITEM_WALLET_ADULT, - "You got a %rChild's Wallet%w!&Now you can carry&up to %y99 rupees%w!", - "Du erhältst die %rKindergeldbörse%w!&Jetzt kannst Du bis&zu %y99 Rubine%w mit Dir führen!", - "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'à %y99 rubis%w!"), + "You got a %rChild's Wallet%w!&Now you can carry&up to %y99 rupees%w!", + "Du erhältst die %rKindergeldbörse%w!&Jetzt kannst Du bis&zu %y99 Rubine%w mit Dir führen!", + "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'à %y99 rubis%w!"), - GIMESSAGE(RG_GOHMA_SOUL, ITEM_BIG_POE, - "You found the soul for %gGohma%w!", - "Du hast die Seele von %gGohma%w gefunden!", - "Vous obtenez l'âme de %gGohma%w!"), - GIMESSAGE(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, - "You found the soul for %rKing&Dodongo%w!", - "Du hast die Seele von %rKönig&Dodongo%w gefunden!", - "Vous obtenez l'âme du %rRoi Dodongo%w!"), - GIMESSAGE(RG_BARINADE_SOUL, ITEM_BIG_POE, - "You found the soul for %bBarinade%w!", - "Du hast die Seele von %bBarinade%w gefunden!", - "Vous obtenez l'âme de %bBarinade%w!"), - GIMESSAGE(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, - "You found the soul for %gPhantom&Ganon%w!", - "Du hast die Seele von %gPhantom-&Ganon%w gefunden!", - "Vous obtenez l'âme de %gGanon&Spectral%w!"), - GIMESSAGE(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, - "You found the soul for %rVolvagia%w!", - "Du hast die Seele von %rVolvagia%w gefunden!", - "Vous obtenez l'âme de %rVolcania%w!"), - GIMESSAGE(RG_MORPHA_SOUL, ITEM_BIG_POE, - "You found the soul for %bMorpha%w!", - "Du hast die Seele von %bMorpha%w gefunden!", - "Vous obtenez l'âme de %bMorpha%w!"), - GIMESSAGE(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, - "You found the soul for %pBongo&Bongo%w!", - "Du hast die Seele von %pBongo&Bongo%w gefunden!", - "Vous obtenez l'âme de %pBongo&Bongo%w!"), - GIMESSAGE(RG_TWINROVA_SOUL, ITEM_BIG_POE, - "You found the soul for %yTwinrova%w!", - "Du hast die Seele von %yTwinrova%w gefunden!", - "Vous obtenez l'âme du %yDuo&Maléfique%w!"), - GIMESSAGE(RG_GANON_SOUL, ITEM_BIG_POE, - "You found the soul for %cGanon%w!", - "Du hast die Seele von %cGanon%w gefunden!", - "Vous obtenez l'âme de %cGanon%w!"), + GIMESSAGE(RG_GOHMA_SOUL, ITEM_BIG_POE, "You found the soul for %gGohma%w!", + "Du hast die Seele von %gGohma%w gefunden!", "Vous obtenez l'âme de %gGohma%w!"), + GIMESSAGE(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, "You found the soul for %rKing&Dodongo%w!", + "Du hast die Seele von %rKönig&Dodongo%w gefunden!", "Vous obtenez l'âme du %rRoi Dodongo%w!"), + GIMESSAGE(RG_BARINADE_SOUL, ITEM_BIG_POE, "You found the soul for %bBarinade%w!", + "Du hast die Seele von %bBarinade%w gefunden!", "Vous obtenez l'âme de %bBarinade%w!"), + GIMESSAGE(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %gPhantom&Ganon%w!", + "Du hast die Seele von %gPhantom-&Ganon%w gefunden!", "Vous obtenez l'âme de %gGanon&Spectral%w!"), + GIMESSAGE(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, "You found the soul for %rVolvagia%w!", + "Du hast die Seele von %rVolvagia%w gefunden!", "Vous obtenez l'âme de %rVolcania%w!"), + GIMESSAGE(RG_MORPHA_SOUL, ITEM_BIG_POE, "You found the soul for %bMorpha%w!", + "Du hast die Seele von %bMorpha%w gefunden!", "Vous obtenez l'âme de %bMorpha%w!"), + GIMESSAGE(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, "You found the soul for %pBongo&Bongo%w!", + "Du hast die Seele von %pBongo&Bongo%w gefunden!", "Vous obtenez l'âme de %pBongo&Bongo%w!"), + GIMESSAGE(RG_TWINROVA_SOUL, ITEM_BIG_POE, "You found the soul for %yTwinrova%w!", + "Du hast die Seele von %yTwinrova%w gefunden!", "Vous obtenez l'âme du %yDuo&Maléfique%w!"), + GIMESSAGE(RG_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %cGanon%w!", + "Du hast die Seele von %cGanon%w gefunden!", "Vous obtenez l'âme de %cGanon%w!"), GIMESSAGE(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, - "You got the %b\x9f%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %b\x9f%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous obtenez la %rtouche %b\x9f%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %b\x9f%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %b\x9f%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %b\x9f%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa7%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa7%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous obtenez la %rtouche %y\xa7%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %y\xa7%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa7%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa7%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa8%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa8%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous obtenez la %rtouche %y\xa8%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %y\xa8%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa8%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa8%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa5%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa5%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous obtenez la %rtouche %y\xa5%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), + "You got the %y\xa5%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa5%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa5%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), GIMESSAGE(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, - "You got the %y\xa6%r button for the&Ocarina%w! You can now use it&while playing songs!", - "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", - "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"), - - GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, - "You got the %rBronze Scale%w!&The power of buoyancy is yours!", - "Du hast die %rBronzene Schuppe%w erhalten!&Die Macht der Schwungkraft ist dein!", - "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), - GIMESSAGE(RG_FISHING_POLE, ITEM_FISHING_POLE, - "You found a lost %rFishing Pole%w!&Time to hit the pond!", - "Du hast eine verlorene %rAngelrute%w gefunden!&Zeit, im Teich zu angeln!", - "Vous obtenez une %rCanne à pêche%w&perdue!&Il est temps d'aller à %gl'étang%w!"), - GIMESSAGE(RG_BOMBCHU_BAG, ITEM_BOMBCHU, - "You found the %rBombchu Bag%w!", - "Du hast die %rKrabbelminentasche%w&gefunden!", - "Vous obtenez un %rSac de Missiles&Teigneux%w!"), - GIMESSAGE(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, - "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", - "Du hast eine %runendliche Bombentasche%w&gefunden! Nun hast Du &%yunendliche Bomben%w!", + "You got the %y\xa6%r button for the&Ocarina%w! You can now use it&while playing songs!", + "Der %y\xa6%r Knopf%w!&Du kannst ihn nun zum Spielen&von Liedern auf der %rOkarina%w&verwenden!", + "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " + "jouez!"), + + GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", + "Du hast die %rBronzene Schuppe%w erhalten!&Die Macht der Schwungkraft ist dein!", + "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), + GIMESSAGE(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!", + "Du hast eine verlorene %rAngelrute%w gefunden!&Zeit, im Teich zu angeln!", + "Vous obtenez une %rCanne à pêche%w&perdue!&Il est temps d'aller à %gl'étang%w!"), + GIMESSAGE(RG_BOMBCHU_BAG, ITEM_BOMBCHU, "You found the %rBombchu Bag%w!", + "Du hast die %rKrabbelminentasche%w&gefunden!", "Vous obtenez un %rSac de Missiles&Teigneux%w!"), + GIMESSAGE( + RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", + "Du hast eine %runendliche Bombentasche%w&gefunden! Nun hast Du &%yunendliche Bomben%w!", "Vous obtenez un %rSac de Bombes&sans fond%w!&Vous avez maintenant des %ybombes&en quantité illimitée%w!"), - GIMESSAGE(RG_QUIVER_INF, ITEM_QUIVER_50, - "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", - "Du hast einen %runendlichen Köcher%w&gefunden! Nun hast Du &%yunendliche Pfeile%w!", - "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflèches&de manière illimitée%w!"), + GIMESSAGE(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", + "Du hast einen %runendlichen Köcher%w&gefunden! Nun hast Du &%yunendliche Pfeile%w!", + "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflèches&de manière illimitée%w!"), GIMESSAGE(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, - "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", - "Du hast eine %runendliche Samentasche%w&gefunden! Nun hast Du &%yunendliche Samen%w!", - "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres à l'infini%w!"), - GIMESSAGE(RG_STICK_UPGRADE_INF, ITEM_STICK, - "You now have %yinfinite%w %rDeku Sticks%w!", - "Du hast nun %yrunendliche%w %rDeku-Stäbe%w!", - "Vous avez maintenant des %yBâtons&Mojo de manière illimitée%w!"), - GIMESSAGE(RG_NUT_UPGRADE_INF, ITEM_NUT, - "You now have %yinfinite%w %rDeku Nuts%w!", - "Du hast nun %yunendliche%w %rDeku-Nüsse%w!", - "Vous avez maintenant des %yNoix&Mojo de manière illimitée%w!"), - GIMESSAGE(RG_MAGIC_INF, ITEM_MAGIC_LARGE, - "You now have %yinfinite%w %rMagic%w!", - "Du hast nun %yunendliche%w %rMagiew!", - "Vous avez maintenant une quantité&de %ymagie illimitée%w!"), - GIMESSAGE(RG_BOMBCHU_INF, ITEM_BOMBCHU, - "You now have %yinfinite%w %rBombchus%w!", - "Du hast nun %yunendliche%w %rKrabbelminen%w!", - "Vous avez maintenant des %yMissiles&Teigneux en quantité illimités%w!"), - GIMESSAGE(RG_WALLET_INF, ITEM_WALLET_GIANT, - "You now have %yinfinite%w %rmoney%w!", - "Du hast nun %yunendliche%w %rRubinew!", - "Vous avez maintenant des %yRubis en& quantité illimitée%w!"), - GIMESSAGE(RG_SKELETON_KEY, ITEM_KEY_SMALL, - "You found the %rSkeleton Key%w!", - "Du hast den %rSkelettschlüssel%w gefunden!", - "Vous avez trouvé la %rClé Squelette%w!"), - GIMESSAGE(RG_DEKU_STICK_BAG, ITEM_STICK, - "You found the %rDeku Stick Bag%w!&You can now hold Deku Sticks!", - "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-Stäbe%w halten!", - "Vous avez trouvé le %rSac de Bâtons&Mojo%w!&Vous pouvez maintenant porter des&Bâtons Mojo!"), - GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, - "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", - "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-Nüsse%w halten!", - "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), - }}; + "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", + "Du hast eine %runendliche Samentasche%w&gefunden! Nun hast Du &%yunendliche Samen%w!", + "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres à " + "l'infini%w!"), + GIMESSAGE(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!", + "Du hast nun %yrunendliche%w %rDeku-Stäbe%w!", + "Vous avez maintenant des %yBâtons&Mojo de manière illimitée%w!"), + GIMESSAGE(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!", + "Du hast nun %yunendliche%w %rDeku-Nüsse%w!", + "Vous avez maintenant des %yNoix&Mojo de manière illimitée%w!"), + GIMESSAGE(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!", + "Du hast nun %yunendliche%w %rMagiew!", "Vous avez maintenant une quantité&de %ymagie illimitée%w!"), + GIMESSAGE(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!", + "Du hast nun %yunendliche%w %rKrabbelminen%w!", + "Vous avez maintenant des %yMissiles&Teigneux en quantité illimités%w!"), + GIMESSAGE(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!", + "Du hast nun %yunendliche%w %rRubinew!", + "Vous avez maintenant des %yRubis en& quantité illimitée%w!"), + GIMESSAGE(RG_SKELETON_KEY, ITEM_KEY_SMALL, "You found the %rSkeleton Key%w!", + "Du hast den %rSkelettschlüssel%w gefunden!", "Vous avez trouvé la %rClé Squelette%w!"), + GIMESSAGE(RG_DEKU_STICK_BAG, ITEM_STICK, "You found the %rDeku Stick Bag%w!&You can now hold Deku Sticks!", + "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-Stäbe%w halten!", + "Vous avez trouvé le %rSac de Bâtons&Mojo%w!&Vous pouvez maintenant porter des&Bâtons Mojo!"), + GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", + "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-Nüsse%w halten!", + "Vous avez trouvé le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), + } }; CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); CreateTriforcePieceMessages(); @@ -4570,16 +5531,17 @@ void Randomizer::CreateCustomMessages() { CreateFireTempleGoronMessages(); } -class ExtendedVanillaTableInvalidItemIdException: public std::exception { - private: +class ExtendedVanillaTableInvalidItemIdException : public std::exception { + private: s16 itemID; - public: - ExtendedVanillaTableInvalidItemIdException(s16 itemID): itemID(itemID) {} - std::string what() { + public: + ExtendedVanillaTableInvalidItemIdException(s16 itemID) : itemID(itemID) { + } + std::string what() { return itemID + " is not a valid ItemID for the extendedVanillaGetItemTable. If you are adding a new" - "item, try adding it to randoGetItemTable instead."; - } + "item, try adding it to randoGetItemTable instead."; + } }; void RandomizerSettingsWindow::InitElement() { @@ -4631,36 +5593,38 @@ extern "C" u8 Return_Item_Entry(GetItemEntry itemEntry, u8 returnItem); // used for items that only set a rand inf when obtained std::map randomizerGetToRandInf = { - { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, - { RG_BRONZE_SCALE, RAND_INF_CAN_SWIM }, - { RG_QUIVER_INF, RAND_INF_HAS_INFINITE_QUIVER }, - { RG_BOMB_BAG_INF, RAND_INF_HAS_INFINITE_BOMB_BAG }, - { RG_BULLET_BAG_INF, RAND_INF_HAS_INFINITE_BULLET_BAG }, - { RG_STICK_UPGRADE_INF, RAND_INF_HAS_INFINITE_STICK_UPGRADE }, - { RG_NUT_UPGRADE_INF, RAND_INF_HAS_INFINITE_NUT_UPGRADE }, - { RG_MAGIC_INF, RAND_INF_HAS_INFINITE_MAGIC_METER }, - { RG_BOMBCHU_INF, RAND_INF_HAS_INFINITE_BOMBCHUS }, - { RG_WALLET_INF, RAND_INF_HAS_INFINITE_MONEY }, - { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, - { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, - { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, - { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, - { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, + { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, + { RG_BRONZE_SCALE, RAND_INF_CAN_SWIM }, + { RG_QUIVER_INF, RAND_INF_HAS_INFINITE_QUIVER }, + { RG_BOMB_BAG_INF, RAND_INF_HAS_INFINITE_BOMB_BAG }, + { RG_BULLET_BAG_INF, RAND_INF_HAS_INFINITE_BULLET_BAG }, + { RG_STICK_UPGRADE_INF, RAND_INF_HAS_INFINITE_STICK_UPGRADE }, + { RG_NUT_UPGRADE_INF, RAND_INF_HAS_INFINITE_NUT_UPGRADE }, + { RG_MAGIC_INF, RAND_INF_HAS_INFINITE_MAGIC_METER }, + { RG_BOMBCHU_INF, RAND_INF_HAS_INFINITE_BOMBCHUS }, + { RG_WALLET_INF, RAND_INF_HAS_INFINITE_MONEY }, + { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, + { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, + { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, + { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, + { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, - { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, - { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, - { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, - { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, - { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, - { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, - { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, - { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, - { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, + { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, + { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, + { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, + { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, + { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, + { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, + { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, + { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, + { RG_GANON_SOUL, RAND_INF_GANON_SOUL }, }; extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { if (giEntry.modIndex != MOD_RANDOMIZER) { - LUSLOG_WARN("Randomizer_Item_Give was called with a GetItemEntry with a mod index different from MOD_RANDOMIZER (%d)", giEntry.modIndex); + LUSLOG_WARN( + "Randomizer_Item_Give was called with a GetItemEntry with a mod index different from MOD_RANDOMIZER (%d)", + giEntry.modIndex); assert(false); return -1; } @@ -4670,13 +5634,13 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { // Gameplay stats: Update the time the item was obtained Randomizer_GameplayStats_SetTimestamp(item); - //if it's an item that just sets a randomizerInf, set it + // if it's an item that just sets a randomizerInf, set it if (randomizerGetToRandInf.find(item) != randomizerGetToRandInf.end()) { Flags_SetRandomizerInf(randomizerGetToRandInf.find(item)->second); return Return_Item_Entry(giEntry, RG_NONE); } - //bottle items + // bottle items if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) { for (u16 i = 0; i < 4; i++) { if (gSaveContext.inventory.items[SLOT_BOTTLE_1 + i] == ITEM_NONE) { @@ -4719,14 +5683,12 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { } } - //dungeon items - if ( - (item >= RG_FOREST_TEMPLE_SMALL_KEY && item <= RG_GANONS_CASTLE_SMALL_KEY) || + // dungeon items + if ((item >= RG_FOREST_TEMPLE_SMALL_KEY && item <= RG_GANONS_CASTLE_SMALL_KEY) || (item >= RG_FOREST_TEMPLE_KEY_RING && item <= RG_GANONS_CASTLE_KEY_RING) || (item >= RG_FOREST_TEMPLE_BOSS_KEY && item <= RG_GANONS_CASTLE_BOSS_KEY) || (item >= RG_DEKU_TREE_MAP && item <= RG_ICE_CAVERN_MAP) || - (item >= RG_DEKU_TREE_COMPASS && item <= RG_ICE_CAVERN_COMPASS) - ) { + (item >= RG_DEKU_TREE_COMPASS && item <= RG_ICE_CAVERN_COMPASS)) { u16 mapIndex = gSaveContext.mapIndex; u8 numOfKeysOnKeyring = 0; switch (item) { @@ -4843,7 +5805,8 @@ 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)); + Flags_SetRandomizerInf( + (RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); return Return_Item_Entry(giEntry, RG_NONE); } @@ -4895,7 +5858,8 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { GameInteractor_SetTriforceHuntPieceGiven(true); // Teleport to credits when goal is reached. - if (gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected == (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) + 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); diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 50bf6636c..78f48b01c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -57,13 +57,16 @@ class Randomizer { GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); - GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); - GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); + GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, + bool checkObtainability = true); + GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, + bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); ItemObtainability GetItemObtainabilityFromRandomizerGet(RandomizerGet randomizerCheck); CustomMessage GetSheikMessage(s16 scene, u16 originalTextId); CustomMessage GetFishingPondOwnerMessage(u16 originalTextId); - CustomMessage GetMerchantMessage(RandomizerCheck rc, TextIDs textId, TextIDs freeTextId = TEXT_NONE, bool mysterious = false); + CustomMessage GetMerchantMessage(RandomizerCheck rc, TextIDs textId, TextIDs freeTextId = TEXT_NONE, + bool mysterious = false); RandomizerCheck GetCheckFromActor(s16 actorId, s16 sceneNum, s16 actorParams); CustomMessage GetGoronMessage(u16 index); CustomMessage GetMapGetItemMessageWithHint(GetItemEntry itemEntry); @@ -82,4 +85,3 @@ bool GenerateRandomizer(std::string seed = ""); #ifdef __cplusplus } #endif - diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 8378f25fb..34bddd0a5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -209,7 +209,7 @@ typedef enum { LOGIC_OCARINA_C_UP_BUTTON, LOGIC_OCARINA_C_DOWN_BUTTON, LOGIC_OCARINA_C_LEFT_BUTTON, - LOGIC_OCARINA_C_RIGHT_BUTTON, + LOGIC_OCARINA_C_RIGHT_BUTTON, LOGIC_TRIFORCE_PIECES, LOGIC_MAX } LogicVal; @@ -2336,7 +2336,7 @@ typedef enum { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, // End Pots - + // Overworld Crates RC_GV_FREESTANDING_POH_CRATE, RC_GV_NEAR_COW_CRATE, @@ -3467,12 +3467,13 @@ typedef enum { RC_MAX } RandomizerCheck; -// Randomizer tricks and glitches (beta) based on knowledge of what is achievable in Ship of Harkinian randomizer, excludes Item manipulation (e.g. RBA/GIM/SRM) and Wrong Warping and Ganon BK Skip -// TODO Fill and alphabetize (area based tricks must have area in name and come alphetized after general tricks) +// Randomizer tricks and glitches (beta) based on knowledge of what is achievable in Ship of Harkinian randomizer, +// excludes Item manipulation (e.g. RBA/GIM/SRM) and Wrong Warping and Ganon BK Skip +// TODO Fill and alphabetize (area based tricks must have area in name and come alphetized after general tricks) // TODO test commented out tricks to see if consistent with console on SoH // TODO add area specific tricks typedef enum { - RT_VISIBLE_COLLISION, // -- general tricks + RT_VISIBLE_COLLISION, // -- general tricks RT_GROTTOS_WITHOUT_AGONY, RT_FEWER_TUNIC_REQUIREMENTS, RT_RUSTED_SWITCHES, @@ -3482,7 +3483,7 @@ typedef enum { RT_HOVER_BOOST_SIMPLE, RT_BOMBCHU_BEEHIVES, RT_BLUE_FIRE_MUD_WALLS, - RT_KF_ADULT_GS, // -- location tricks + RT_KF_ADULT_GS, // -- location tricks RT_LW_BRIDGE, RT_LW_MIDO_BACKFLIP, RT_LW_GS_BEAN, @@ -3490,7 +3491,7 @@ typedef enum { RT_KAK_MAN_ON_ROOF, RT_KAK_TOWER_GS, RT_KAK_ADULT_WINDMILL_POH, - RT_KAK_CHILD_WINDMILL_POH, + RT_KAK_CHILD_WINDMILL_POH, RT_KAK_ROOFTOP_GS, RT_GY_POH, RT_GY_CHILD_DAMPE_RACE_POH, @@ -3649,7 +3650,7 @@ typedef enum { RT_GANON_MQ_FIRE_TRIAL, RT_GANON_MQ_SHADOW_TRIAL, RT_GANON_MQ_LIGHT_TRIAL, - //RT_ROCS_FEATHER --if implemented with main branch + // RT_ROCS_FEATHER --if implemented with main branch RT_FOREST_TEMPLE_BK_SKIP, RT_FIRE_TEMPLE_BK_SKIP, RT_WATER_TEMPLE_BK_SKIP, @@ -3704,11 +3705,11 @@ typedef enum { RT_WEIRDSHOT, RT_WEIRDSHOT_CHU, RT_WEIRDSHOT_ENEMY, - //RT_FW_VOID_WARP_FAST_TEXT, --untested tricks: - //RT_ACTION_SWAP, - //RT_ACTOR_GLITCH, - //RT_ADULT_TRADE_TTG, - RT_TOT_DOT_SKIP_SWORDLESS, //AREA SPECIFIC GLITCHES + // RT_FW_VOID_WARP_FAST_TEXT, --untested tricks: + // RT_ACTION_SWAP, + // RT_ACTOR_GLITCH, + // RT_ADULT_TRADE_TTG, + RT_TOT_DOT_SKIP_SWORDLESS, // AREA SPECIFIC GLITCHES RT_TOT_DOT_SKIP_SWORD, RT_LLR_STEAL_EPONA, RT_KF_POKEY_SKIP, @@ -3724,7 +3725,7 @@ typedef enum { RT_ZF_JABU_ADULT_HOVERBOOT_BOMB, RT_FOREST_TEMPLE_FOUR_POE_SKIP, RT_FOREST_TEMPLE_JUNGLE_JUMP, - //RT_DARUNIA_CUTSCENE, + // RT_DARUNIA_CUTSCENE, RT_BOTTOM_OF_THE_WELL_SKULL_PUSH, RT_GANONS_CASTLE_BARRIER_SKIP_HOVER, RT_GANONS_CASTLE_GOLD_GAUNTLET_SKIP, @@ -3985,7 +3986,7 @@ typedef enum { RG_LONGSHOT, RG_SCARECROW, - //Overworld keys + // Overworld keys RG_GUARD_HOUSE_KEY, RG_MARKET_BAZAAR_KEY, RG_MARKET_POTION_SHOP_KEY, @@ -5405,7 +5406,7 @@ typedef enum { RHT_CRATE_WATER_TEMPLE, RHT_CRATE_SPIRIT_TEMPLE, RHT_CRATE_SHADOW_TEMPLE, - RHT_CRATE_GERUDO_TRAINING_GROUND, + RHT_CRATE_GERUDO_TRAINING_GROUND, // Ganon Line RHT_GANON_JOKE01, RHT_GANON_JOKE02, @@ -5589,7 +5590,6 @@ typedef enum { RHT_MAX, } RandomizerHintTextKey; - typedef struct { RandomizerGet rgID; RandomizerGet fakeRgID; @@ -5698,16 +5698,16 @@ typedef enum { RSK_STARTING_KOKIRI_SWORD, RSK_STARTING_MASTER_SWORD, RSK_STARTING_ZELDAS_LULLABY, - RSK_STARTING_EPONAS_SONG, - RSK_STARTING_SARIAS_SONG, + RSK_STARTING_EPONAS_SONG, + RSK_STARTING_SARIAS_SONG, RSK_STARTING_SUNS_SONG, RSK_STARTING_SONG_OF_TIME, RSK_STARTING_SONG_OF_STORMS, - RSK_STARTING_MINUET_OF_FOREST, + RSK_STARTING_MINUET_OF_FOREST, RSK_STARTING_BOLERO_OF_FIRE, RSK_STARTING_SERENADE_OF_WATER, - RSK_STARTING_REQUIEM_OF_SPIRIT, - RSK_STARTING_NOCTURNE_OF_SHADOW, + RSK_STARTING_REQUIEM_OF_SPIRIT, + RSK_STARTING_NOCTURNE_OF_SHADOW, RSK_STARTING_PRELUDE_OF_LIGHT, RSK_SHUFFLE_KOKIRI_SWORD, RSK_SHUFFLE_MASTER_SWORD, @@ -5882,8 +5882,8 @@ typedef enum { RSK_MAX } RandomizerSettingKey; -//Generic Settings (any binary option can use this) -// off/on +// Generic Settings (any binary option can use this) +// off/on typedef enum { RO_GENERIC_OFF, RO_GENERIC_ON, @@ -5901,54 +5901,54 @@ typedef enum { RO_GENERIC_SKIP, } RandoOptionGenericSkip; -//Closed Forest settings (On, Deku Only, Off) +// Closed Forest settings (On, Deku Only, Off) typedef enum { RO_CLOSED_FOREST_ON, RO_CLOSED_FOREST_DEKU_ONLY, RO_CLOSED_FOREST_OFF, } RandoOptionForest; -//Door of Time settings (closed, song only, open) +// Door of Time settings (closed, song only, open) typedef enum { RO_DOOROFTIME_CLOSED, RO_DOOROFTIME_SONGONLY, RO_DOOROFTIME_OPEN, } RandoOptionDoorOfTime; -//Zora's Fountain settings (closed, closed as child, open) +// Zora's Fountain settings (closed, closed as child, open) typedef enum { RO_ZF_CLOSED, RO_ZF_CLOSED_CHILD, RO_ZF_OPEN, } RandoOptionZorasFountain; -//Sleeping Waterfall settings (closed, open) +// Sleeping Waterfall settings (closed, open) typedef enum { RO_WATERFALL_CLOSED, RO_WATERFALL_OPEN, } RandoOptionSleepingWaterfall; -//Starting Age settings (child, adult, random) +// Starting Age settings (child, adult, random) typedef enum { RO_AGE_CHILD, RO_AGE_ADULT, RO_AGE_RANDOM, } RandoOptionStartingAge; -//Fortress Carpenters settings (normal, fast, free) +// Fortress Carpenters settings (normal, fast, free) typedef enum { RO_GF_CARPENTERS_NORMAL, RO_GF_CARPENTERS_FAST, RO_GF_CARPENTERS_FREE, } RandoOptionGerudoFortress; -//Kakariko Gate settings (closed/open) +// Kakariko Gate settings (closed/open) typedef enum { RO_KAK_GATE_CLOSED, RO_KAK_GATE_OPEN, } RandoOptionKakarikoGate; -//Rainbow Bridge settings (vanilla, always open, stones, medallions, dungeon rewards, dungeons, tokens) +// Rainbow Bridge settings (vanilla, always open, stones, medallions, dungeon rewards, dungeons, tokens) typedef enum { RO_BRIDGE_VANILLA = 0, RO_BRIDGE_ALWAYS_OPEN, @@ -5967,14 +5967,14 @@ typedef enum { RO_BRIDGE_WILDCARD_REWARD, } RandoOptionBridgeRewards; -//Shopsanity settings (off, specific count, random) +// Shopsanity settings (off, specific count, random) typedef enum { RO_SHOPSANITY_OFF, RO_SHOPSANITY_SPECIFIC_COUNT, RO_SHOPSANITY_RANDOM, } RandoOptionShopsanity; -//Shopsanity count settings (0-7 items) +// Shopsanity count settings (0-7 items) typedef enum { RO_SHOPSANITY_COUNT_ZERO_ITEMS, RO_SHOPSANITY_COUNT_ONE_ITEM, @@ -5987,27 +5987,27 @@ typedef enum { RO_SHOPSANITY_COUNT_EIGHT_ITEMS, } RandoOptionShopsanityCount; -//Shopsanity price ranges +// Shopsanity price ranges typedef enum { RO_PRICE_VANILLA, - RO_PRICE_CHEAP_BALANCED, //Balanced random from 0-95, favoring lower numbers - RO_PRICE_BALANCED, //Random from 0-300, favoring lower numbers + RO_PRICE_CHEAP_BALANCED, // Balanced random from 0-95, favoring lower numbers + RO_PRICE_BALANCED, // Random from 0-300, favoring lower numbers RO_PRICE_FIXED, RO_PRICE_RANGE, RO_PRICE_SET_BY_WALLET, } RandoOptionPrices; -//Scrubsanity settings (off, affordable, expensive, random) +// Scrubsanity settings (off, affordable, expensive, random) typedef enum { RO_SCRUBS_OFF, RO_SCRUBS_ONE_TIME_ONLY, RO_SCRUBS_ALL, } RandoOptionScrubsanity; -//Ammo drop settings (on, "on+bombchu", off) +// Ammo drop settings (on, "on+bombchu", off) typedef enum { RO_AMMO_DROPS_OFF, - //RO_AMMO_DROPS_ON_PLUS_BOMBCHU, + // RO_AMMO_DROPS_ON_PLUS_BOMBCHU, RO_AMMO_DROPS_ON, } RandoOptionAmmoDrops; @@ -6017,7 +6017,7 @@ typedef enum { RO_BOSS_SOULS_ON_PLUS_GANON, } RandoOptionBossSouls; -//Fishsanity settings (off, loach only, pond only, grottos only, both) +// Fishsanity settings (off, loach only, pond only, grottos only, both) typedef enum { RO_FISHSANITY_OFF, RO_FISHSANITY_HYRULE_LOACH, @@ -6026,15 +6026,15 @@ typedef enum { RO_FISHSANITY_BOTH } RandoOptionsFishsanity; -//Infinite Upgrades settings (off, progressive, condensed progressive) +// Infinite Upgrades settings (off, progressive, condensed progressive) typedef enum { RO_INF_UPGRADES_OFF, RO_INF_UPGRADES_PROGRESSIVE, RO_INF_UPGRADES_CONDENSED_PROGRESSIVE, } RandoOptionInfiniteUpgrades; -//Any Dungeon Item (start with, vanilla, own dungeon, any dungeon, -//overworld, anywhere) +// Any Dungeon Item (start with, vanilla, own dungeon, any dungeon, +// overworld, anywhere) typedef enum { RO_DUNGEON_ITEM_LOC_STARTWITH, RO_DUNGEON_ITEM_LOC_VANILLA, @@ -6044,7 +6044,7 @@ typedef enum { RO_DUNGEON_ITEM_LOC_ANYWHERE, } RandoOptionDungeonItemLocation; -//Dungeon reward settings +// Dungeon reward settings typedef enum { RO_DUNGEON_REWARDS_VANILLA, RO_DUNGEON_REWARDS_END_OF_DUNGEON, @@ -6053,7 +6053,7 @@ typedef enum { RO_DUNGEON_REWARDS_ANYWHERE, } RandoOptionDungeonRewards; -//Keyring Settings +// Keyring Settings typedef enum { RO_KEYRINGS_OFF, RO_KEYRINGS_RANDOM, @@ -6067,8 +6067,8 @@ typedef enum { RO_KEYRING_FOR_DUNGEON_ON, } RandoOptionKeyringForDungeon; -//Ganon's Boss Key Settings (vanilla, own dungeon, start with, -//overworld, anywhere, 100 GS reward) +// Ganon's Boss Key Settings (vanilla, own dungeon, start with, +// overworld, anywhere, 100 GS reward) typedef enum { RO_GANON_BOSS_KEY_VANILLA, RO_GANON_BOSS_KEY_OWN_DUNGEON, @@ -6101,42 +6101,42 @@ typedef enum { RO_LACS_WILDCARD_REWARD, } RandoOptionLACSRewards; -//Ganon's Trials +// Ganon's Trials typedef enum { RO_GANONS_TRIALS_SKIP, RO_GANONS_TRIALS_SET_NUMBER, RO_GANONS_TRIALS_RANDOM_NUMBER, } RandoOptionGanonsTrials; -//Shuffle Dungeon Entrance Settings (Off, on, plus ganon) +// Shuffle Dungeon Entrance Settings (Off, on, plus ganon) typedef enum { RO_DUNGEON_ENTRANCE_SHUFFLE_OFF, RO_DUNGEON_ENTRANCE_SHUFFLE_ON, RO_DUNGEON_ENTRANCE_SHUFFLE_ON_PLUS_GANON, } RandoOptionDungeonEntranceShuffle; -//Shuffle Boss Room Entrance Settings (Off, Age Restricted, Full) +// Shuffle Boss Room Entrance Settings (Off, Age Restricted, Full) typedef enum { RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_AGE_RESTRICTED, RO_BOSS_ROOM_ENTRANCE_SHUFFLE_FULL, } RandoOptionBossRoomEntranceShuffle; -//Shuffle Interior Entrance Settings (Off, simple, all) +// Shuffle Interior Entrance Settings (Off, simple, all) typedef enum { RO_INTERIOR_ENTRANCE_SHUFFLE_OFF, RO_INTERIOR_ENTRANCE_SHUFFLE_SIMPLE, RO_INTERIOR_ENTRANCE_SHUFFLE_ALL, } RandoOptionInteriorEntranceShuffle; -//Song shuffle Settings (Song locations, Dungeon rewards, anywhere) +// Song shuffle Settings (Song locations, Dungeon rewards, anywhere) typedef enum { RO_SONG_SHUFFLE_SONG_LOCATIONS, RO_SONG_SHUFFLE_DUNGEON_REWARDS, RO_SONG_SHUFFLE_ANYWHERE, } RandoOptionSongShuffle; -//Shuffle Merchants Settings (Off, Beans Only, All but Beans, All) +// Shuffle Merchants Settings (Off, Beans Only, All but Beans, All) typedef enum { RO_SHUFFLE_MERCHANTS_OFF, RO_SHUFFLE_MERCHANTS_BEANS_ONLY, @@ -6144,14 +6144,14 @@ typedef enum { RO_SHUFFLE_MERCHANTS_ALL } RandoOptionShuffleMerchants; -//Starting Ocarina Settings (off, fairy) +// Starting Ocarina Settings (off, fairy) typedef enum { RO_STARTING_OCARINA_OFF, RO_STARTING_OCARINA_FAIRY, RO_STARTING_OCARINA_TIME, } RandoOptionStartingOcarina; -//Item Pool Settings +// Item Pool Settings typedef enum { RO_ITEM_POOL_PLENTIFUL, RO_ITEM_POOL_BALANCED, @@ -6159,7 +6159,7 @@ typedef enum { RO_ITEM_POOL_MINIMAL, } RandoOptionItemPool; -//Ice Trap Settings +// Ice Trap Settings typedef enum { RO_ICE_TRAPS_OFF, RO_ICE_TRAPS_NORMAL, @@ -6168,8 +6168,8 @@ typedef enum { RO_ICE_TRAPS_ONSLAUGHT, } RandoOptionIceTraps; -//Gossip Stone Hint Settings (no hints, needs nothing, -//needs mask of truth, needs stone of agony) +// Gossip Stone Hint Settings (no hints, needs nothing, +// needs mask of truth, needs stone of agony) typedef enum { RO_GOSSIP_STONES_NONE, RO_GOSSIP_STONES_NEED_NOTHING, @@ -6177,14 +6177,14 @@ typedef enum { RO_GOSSIP_STONES_NEED_STONE, } RandoOptionGossipStones; -//Hint Clarity Settings (obscure, ambiguous, clear) +// Hint Clarity Settings (obscure, ambiguous, clear) typedef enum { RO_HINT_CLARITY_OBSCURE, RO_HINT_CLARITY_AMBIGUOUS, RO_HINT_CLARITY_CLEAR, } RandoOptionHintClarity; -//Hint Distribution Settings (useless, balanced, strong, very strong) +// Hint Distribution Settings (useless, balanced, strong, very strong) typedef enum { RO_HINT_DIST_USELESS, RO_HINT_DIST_BALANCED, @@ -6192,8 +6192,8 @@ typedef enum { RO_HINT_DIST_VERY_STRONG, } RandoOptionHintDistribution; -//Gerudo Fortress Key Settings (vanilla, any dungeon, overworld, -//anywhere) +// Gerudo Fortress Key Settings (vanilla, any dungeon, overworld, +// anywhere) typedef enum { RO_GERUDO_KEYS_VANILLA, RO_GERUDO_KEYS_ANY_DUNGEON, @@ -6201,7 +6201,7 @@ typedef enum { RO_GERUDO_KEYS_ANYWHERE, } RandoOptionGerudoKeys; -//Tokensanity settings (off, dungeons, overworld, all) +// Tokensanity settings (off, dungeons, overworld, all) typedef enum { RO_TOKENSANITY_OFF, RO_TOKENSANITY_DUNGEONS, @@ -6209,7 +6209,7 @@ typedef enum { RO_TOKENSANITY_ALL, } RandoOptionTokensanity; -//Freestanding Hearts/Rupees settings (off, dungeons, overworld, all) +// Freestanding Hearts/Rupees settings (off, dungeons, overworld, all) typedef enum { RO_SHUFFLE_FREESTANDING_OFF, RO_SHUFFLE_FREESTANDING_DUNGEONS, @@ -6241,7 +6241,7 @@ typedef enum { RO_SHUFFLE_CRATES_ALL, } RandoOptionShuffleCrates; -//Link's Pocket Settings (dungeon reward, advancement, anything, nothing) +// Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, RO_LINKS_POCKET_ADVANCEMENT, @@ -6441,13 +6441,13 @@ typedef enum { RE_OCTOROK, } RandomizerEnemy; -//RANDOTODO compare child long jumpslash range with adult short +// RANDOTODO compare child long jumpslash range with adult short typedef enum { ED_CLOSE, - //hammer or kokiri sword + // hammer or kokiri sword ED_SHORT_JUMPSLASH, ED_MASTER_SWORD_JUMPSLASH, - //sticks or BGS + // sticks or BGS ED_LONG_JUMPSLASH, ED_BOMB_THROW, ED_BOOMERANG, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 55a8deaa7..4d7d7a59a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -113,23 +113,20 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) && (location.GetQuest() == RCQUEST_BOTH || location.GetQuest() == RCQUEST_MQ && - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_SET_NUMBER && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == + RO_MQ_DUNGEONS_SET_NUMBER && (CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeonCount"), 12) > 0) || // at least one MQ dungeon - CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == RO_MQ_DUNGEONS_RANDOM_NUMBER)) || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) == + RO_MQ_DUNGEONS_RANDOM_NUMBER)) || location.GetQuest() == RCQUEST_VANILLA && - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) != RO_MQ_DUNGEONS_SET_NUMBER || + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeons"), RO_MQ_DUNGEONS_NONE) != + RO_MQ_DUNGEONS_SET_NUMBER || CVarGetInteger(CVAR_RANDOMIZER_SETTING("MQDungeonCount"), 12) < 12) // at least one vanilla dungeon ) && - ( - location.GetRCType() != RCTYPE_SHOP || - !( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || - ( - ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && - ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS) - ) - ) - ) && + (location.GetRCType() != RCTYPE_SHOP || + !(ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF) || + (ctx->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_SPECIFIC_COUNT) && + ctx->GetOption(RSK_SHOPSANITY_COUNT).Is(RO_SHOPSANITY_COUNT_ZERO_ITEMS)))) && (location.GetRCType() != RCTYPE_SCRUB || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleScrubs"), RO_SCRUBS_OFF) != RO_SCRUBS_OFF || location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO || @@ -137,7 +134,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE) && // The 3 scrubs that are always randomized (location.GetRCType() != RCTYPE_MERCHANT || - CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_OFF) != RO_SHUFFLE_MERCHANTS_OFF) && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_OFF) != + RO_SHUFFLE_MERCHANTS_OFF) && (location.GetRCType() != RCTYPE_SONG_LOCATION || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != RO_SONG_SHUFFLE_SONG_LOCATIONS) && // song locations @@ -152,31 +150,45 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_OCARINA || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleOcarinas"), RO_GENERIC_NO)) && // ocarina locations (location.GetRandomizerCheck() != RC_HC_ZELDAS_LETTER) && // don't show until we support shuffling letter - (location.GetRCType() != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) - (location.GetRCType() != RCTYPE_STATIC_HINT) && // don't show static hints + (location.GetRCType() != + RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?) + (location.GetRCType() != RCTYPE_STATIC_HINT) && // don't show static hints (location.GetRCType() != RCTYPE_LINKS_POCKET) && // links pocket can be set to nothing if needed (location.GetRCType() != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them (location.GetRCType() != RCTYPE_SKULL_TOKEN || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == RO_TOKENSANITY_ALL) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == RO_TOKENSANITY_OVERWORLD) && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == + RO_TOKENSANITY_OVERWORLD) && RandomizerCheckObjects::AreaIsOverworld(location.GetArea())) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == RO_TOKENSANITY_DUNGEONS) && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTokens"), RO_TOKENSANITY_OFF) == + RO_TOKENSANITY_DUNGEONS) && RandomizerCheckObjects::AreaIsDungeon(location.GetArea()))) && (location.GetRCType() != RCTYPE_FREESTANDING || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == RO_SHUFFLE_FREESTANDING_ALL) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == RO_SHUFFLE_FREESTANDING_OVERWORLD) && + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == + RO_SHUFFLE_FREESTANDING_ALL) || + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == + RO_SHUFFLE_FREESTANDING_OVERWORLD) && RandomizerCheckObjects::AreaIsOverworld(location.GetArea())) || - ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == RO_SHUFFLE_FREESTANDING_DUNGEONS) && + ((CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), RO_SHUFFLE_FREESTANDING_OFF) == + RO_SHUFFLE_FREESTANDING_DUNGEONS) && RandomizerCheckObjects::AreaIsDungeon(location.GetArea()))) && - (location.GetRCType() != RCTYPE_BEEHIVE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_NLCRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_SMALL_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && - (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && + (location.GetRCType() != RCTYPE_BEEHIVE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_COW || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_POT || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_GRASS || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_CRATE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_NLCRATE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_SMALL_CRATE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_FISH || + ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && (location.GetRandomizerCheck() != RC_KF_KOKIRI_SWORD_CHEST || @@ -195,7 +207,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && (location.GetRCType() != RCTYPE_SMALL_KEY || - CVarGetInteger(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("Keysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != + RO_DUNGEON_ITEM_LOC_VANILLA) && (location.GetRCType() != RCTYPE_BOSS_KEY || CVarGetInteger(CVAR_RANDOMIZER_SETTING("BossKeysanity"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && @@ -219,17 +232,22 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_KAK_TOKENS) && // 100 skull reward ganon boss key (location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_FREE && + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == + RO_GF_CARPENTERS_FREE && location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD) || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_FAST && + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == + RO_GF_CARPENTERS_FAST && ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_NO) == RO_GENERIC_YES) || (location.GetRandomizerCheck() == RC_GF_NORTH_F1_CARPENTER && - CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))) || - (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_NORMAL && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != + RO_GERUDO_KEYS_VANILLA))) || + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == + RO_GF_CARPENTERS_NORMAL && ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_NO) == RO_GENERIC_YES) || (location.GetRCType() == RCTYPE_GF_KEY && - CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))))); + CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != + RO_GERUDO_KEYS_VANILLA))))); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h index 6ab5b8314..7a7e605bb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.h @@ -7,11 +7,11 @@ #include namespace RandomizerCheckObjects { - bool AreaIsDungeon(RandomizerCheckArea area); - bool AreaIsOverworld(RandomizerCheckArea area); - std::string GetRCAreaName(RandomizerCheckArea area); - std::map> GetAllRCObjectsByArea(); - std::map GetAllRCAreaBySceneID(); - RandomizerCheckArea GetRCAreaBySceneID(SceneID sceneId); - void UpdateImGuiVisibility(); -} +bool AreaIsDungeon(RandomizerCheckArea area); +bool AreaIsOverworld(RandomizerCheckArea area); +std::string GetRCAreaName(RandomizerCheckArea area); +std::map> GetAllRCObjectsByArea(); +std::map GetAllRCAreaBySceneID(); +RandomizerCheckArea GetRCAreaBySceneID(SceneID sceneId); +void UpdateImGuiVisibility(); +} // namespace RandomizerCheckObjects diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 270bdbb7f..eb935146a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -90,27 +90,29 @@ bool previousShowHidden = false; bool hideShopUnshuffledChecks = false; bool alwaysShowGS = false; -std::map startingShopItem = { { SCENE_KOKIRI_SHOP, RC_KF_SHOP_ITEM_1 }, - { SCENE_BAZAAR, RC_MARKET_BAZAAR_ITEM_1 }, - { SCENE_POTION_SHOP_MARKET, RC_MARKET_POTION_SHOP_ITEM_1 }, - { SCENE_BOMBCHU_SHOP, RC_MARKET_BOMBCHU_SHOP_ITEM_1 }, - { SCENE_POTION_SHOP_KAKARIKO, RC_KAK_POTION_SHOP_ITEM_1 }, - { SCENE_ZORA_SHOP, RC_ZD_SHOP_ITEM_1 }, - { SCENE_GORON_SHOP, RC_GC_SHOP_ITEM_1 }, }; +std::map startingShopItem = { + { SCENE_KOKIRI_SHOP, RC_KF_SHOP_ITEM_1 }, + { SCENE_BAZAAR, RC_MARKET_BAZAAR_ITEM_1 }, + { SCENE_POTION_SHOP_MARKET, RC_MARKET_POTION_SHOP_ITEM_1 }, + { SCENE_BOMBCHU_SHOP, RC_MARKET_BOMBCHU_SHOP_ITEM_1 }, + { SCENE_POTION_SHOP_KAKARIKO, RC_KAK_POTION_SHOP_ITEM_1 }, + { SCENE_ZORA_SHOP, RC_ZD_SHOP_ITEM_1 }, + { SCENE_GORON_SHOP, RC_GC_SHOP_ITEM_1 }, +}; std::map DungeonRCAreasBySceneID = { - {SCENE_DEKU_TREE, RCAREA_DEKU_TREE}, - {SCENE_DODONGOS_CAVERN, RCAREA_DODONGOS_CAVERN}, - {SCENE_JABU_JABU, RCAREA_JABU_JABUS_BELLY}, - {SCENE_FOREST_TEMPLE, RCAREA_FOREST_TEMPLE}, - {SCENE_FIRE_TEMPLE, RCAREA_FIRE_TEMPLE}, - {SCENE_WATER_TEMPLE, RCAREA_WATER_TEMPLE}, - {SCENE_SHADOW_TEMPLE, RCAREA_SHADOW_TEMPLE}, - {SCENE_SPIRIT_TEMPLE, RCAREA_SPIRIT_TEMPLE}, - {SCENE_BOTTOM_OF_THE_WELL, RCAREA_BOTTOM_OF_THE_WELL}, - {SCENE_ICE_CAVERN, RCAREA_ICE_CAVERN}, - {SCENE_GERUDO_TRAINING_GROUND, RCAREA_GERUDO_TRAINING_GROUND}, - {SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE}, + { SCENE_DEKU_TREE, RCAREA_DEKU_TREE }, + { SCENE_DODONGOS_CAVERN, RCAREA_DODONGOS_CAVERN }, + { SCENE_JABU_JABU, RCAREA_JABU_JABUS_BELLY }, + { SCENE_FOREST_TEMPLE, RCAREA_FOREST_TEMPLE }, + { SCENE_FIRE_TEMPLE, RCAREA_FIRE_TEMPLE }, + { SCENE_WATER_TEMPLE, RCAREA_WATER_TEMPLE }, + { SCENE_SHADOW_TEMPLE, RCAREA_SHADOW_TEMPLE }, + { SCENE_SPIRIT_TEMPLE, RCAREA_SPIRIT_TEMPLE }, + { SCENE_BOTTOM_OF_THE_WELL, RCAREA_BOTTOM_OF_THE_WELL }, + { SCENE_ICE_CAVERN, RCAREA_ICE_CAVERN }, + { SCENE_GERUDO_TRAINING_GROUND, RCAREA_GERUDO_TRAINING_GROUND }, + { SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE }, }; // Dungeon entrances with obvious visual differences between MQ and vanilla qualifying as spoiling on sight @@ -141,7 +143,7 @@ uint16_t totalChecks = 0; uint16_t totalChecksAvailable = 0; uint16_t totalChecksGotten = 0; bool optCollapseAll; // A bool that will collapse all checks once -bool optExpandAll; // A bool that will expand all checks once +bool optExpandAll; // A bool that will expand all checks once RandomizerCheck lastLocationChecked = RC_UNKNOWN_CHECK; RandomizerCheckArea previousArea = RCAREA_INVALID; RandomizerCheckArea currentArea = RCAREA_INVALID; @@ -176,55 +178,68 @@ bool onlyShowAvailable = false; SceneID DungeonSceneLookupByArea(RandomizerCheckArea area) { switch (area) { - case RCAREA_DEKU_TREE: return SCENE_DEKU_TREE; - case RCAREA_DODONGOS_CAVERN: return SCENE_DODONGOS_CAVERN; - case RCAREA_JABU_JABUS_BELLY: return SCENE_JABU_JABU; - case RCAREA_FOREST_TEMPLE: return SCENE_FOREST_TEMPLE; - case RCAREA_FIRE_TEMPLE: return SCENE_FIRE_TEMPLE; - case RCAREA_WATER_TEMPLE: return SCENE_WATER_TEMPLE; - case RCAREA_SPIRIT_TEMPLE: return SCENE_SPIRIT_TEMPLE; - case RCAREA_SHADOW_TEMPLE: return SCENE_SHADOW_TEMPLE; - case RCAREA_BOTTOM_OF_THE_WELL: return SCENE_BOTTOM_OF_THE_WELL; - case RCAREA_ICE_CAVERN: return SCENE_ICE_CAVERN; - case RCAREA_GERUDO_TRAINING_GROUND: return SCENE_GERUDO_TRAINING_GROUND; - case RCAREA_GANONS_CASTLE: return SCENE_INSIDE_GANONS_CASTLE; - default: return SCENE_ID_MAX; + case RCAREA_DEKU_TREE: + return SCENE_DEKU_TREE; + case RCAREA_DODONGOS_CAVERN: + return SCENE_DODONGOS_CAVERN; + case RCAREA_JABU_JABUS_BELLY: + return SCENE_JABU_JABU; + case RCAREA_FOREST_TEMPLE: + return SCENE_FOREST_TEMPLE; + case RCAREA_FIRE_TEMPLE: + return SCENE_FIRE_TEMPLE; + case RCAREA_WATER_TEMPLE: + return SCENE_WATER_TEMPLE; + case RCAREA_SPIRIT_TEMPLE: + return SCENE_SPIRIT_TEMPLE; + case RCAREA_SHADOW_TEMPLE: + return SCENE_SHADOW_TEMPLE; + case RCAREA_BOTTOM_OF_THE_WELL: + return SCENE_BOTTOM_OF_THE_WELL; + case RCAREA_ICE_CAVERN: + return SCENE_ICE_CAVERN; + case RCAREA_GERUDO_TRAINING_GROUND: + return SCENE_GERUDO_TRAINING_GROUND; + case RCAREA_GANONS_CASTLE: + return SCENE_INSIDE_GANONS_CASTLE; + default: + return SCENE_ID_MAX; } } -Color_RGBA8 Color_Bg_Default = { 0, 0, 0, 255 }; // Black -Color_RGBA8 Color_Main_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Incomplete_Extra_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Complete_Extra_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Unchecked_Extra_Default = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Skipped_Main_Default = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Skipped_Extra_Default = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Seen_Extra_Default = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Hinted_Extra_Default = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Collected_Extra_Default = { 242, 101, 34, 255 }; // Orange -Color_RGBA8 Color_Scummed_Extra_Default = { 0, 174, 239, 255 }; // Blue -Color_RGBA8 Color_Saved_Extra_Default = { 0, 185, 0, 255 }; // Green +Color_RGBA8 Color_Bg_Default = { 0, 0, 0, 255 }; // Black +Color_RGBA8 Color_Main_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Incomplete_Extra_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Complete_Extra_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Unchecked_Extra_Default = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Skipped_Main_Default = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Skipped_Extra_Default = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Seen_Extra_Default = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Hinted_Extra_Default = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Collected_Extra_Default = { 242, 101, 34, 255 }; // Orange +Color_RGBA8 Color_Scummed_Extra_Default = { 0, 174, 239, 255 }; // Blue +Color_RGBA8 Color_Saved_Extra_Default = { 0, 185, 0, 255 }; // Green Color_RGBA8 Color_Background = { 0, 0, 0, 255 }; -Color_RGBA8 Color_Area_Incomplete_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Incomplete_Main = { 255, 255, 255, 255 }; // White Color_RGBA8 Color_Area_Incomplete_Extra = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Complete_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Area_Complete_Extra = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Unchecked_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Unchecked_Extra = { 255, 255, 255, 255 }; // Useless -Color_RGBA8 Color_Skipped_Main = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Skipped_Extra = { 160, 160, 160, 255 }; // Grey -Color_RGBA8 Color_Seen_Main = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Seen_Extra = { 160, 160, 160, 255 }; // TODO -Color_RGBA8 Color_Hinted_Main = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Hinted_Extra = { 255, 255, 255, 255 }; // TODO -Color_RGBA8 Color_Collected_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Collected_Extra = { 242, 101, 34, 255 }; // Orange -Color_RGBA8 Color_Scummed_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Scummed_Extra = { 0, 174, 239, 255 }; // Blue -Color_RGBA8 Color_Saved_Main = { 255, 255, 255, 255 }; // White -Color_RGBA8 Color_Saved_Extra = { 0, 185, 0, 255 }; // Green +Color_RGBA8 Color_Area_Complete_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Area_Complete_Extra = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Unchecked_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Unchecked_Extra = { 255, 255, 255, 255 }; // Useless +Color_RGBA8 Color_Skipped_Main = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Skipped_Extra = { 160, 160, 160, 255 }; // Grey +Color_RGBA8 Color_Seen_Main = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Seen_Extra = { 160, 160, 160, 255 }; // TODO +Color_RGBA8 Color_Hinted_Main = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Hinted_Extra = { 255, 255, 255, 255 }; // TODO +Color_RGBA8 Color_Collected_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Collected_Extra = { 242, 101, 34, 255 }; // Orange +Color_RGBA8 Color_Scummed_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Scummed_Extra = { 0, 174, 239, 255 }; // Blue +Color_RGBA8 Color_Saved_Main = { 255, 255, 255, 255 }; // White +Color_RGBA8 Color_Saved_Extra = { 0, 185, 0, 255 }; // Green std::vector buttons = { BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L, BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT }; @@ -270,12 +285,8 @@ bool IsCheckHidden(RandomizerCheck rc) { bool scummed = status == RCSHOW_SCUMMED; bool unchecked = status == RCSHOW_UNCHECKED; - return !showHidden && ( - (skipped && hideSkipped) || - (seen && hideSeen) || - (scummed && hideScummed) || - (unchecked && hideUnchecked) - ); + return !showHidden && + ((skipped && hideSkipped) || (seen && hideSeen) || (scummed && hideScummed) || (unchecked && hideUnchecked)); } void RecalculateAreaTotals(RandomizerCheckArea rcArea) { @@ -302,7 +313,7 @@ void RecalculateAreaTotals(RandomizerCheckArea rcArea) { } std::map MapRGtoRandomizerCheckArea = { - { RG_DEKU_TREE_MAP, RCAREA_DEKU_TREE}, + { RG_DEKU_TREE_MAP, RCAREA_DEKU_TREE }, { RG_DODONGOS_CAVERN_MAP, RCAREA_DODONGOS_CAVERN }, { RG_JABU_JABUS_BELLY_MAP, RCAREA_JABU_JABUS_BELLY }, { RG_FOREST_TEMPLE_MAP, RCAREA_FOREST_TEMPLE }, @@ -405,33 +416,19 @@ bool IsAreaScene(SceneID sceneNum) { } RandomizerCheckArea AreaFromEntranceGroup[] = { - RCAREA_INVALID, - RCAREA_KOKIRI_FOREST, - RCAREA_LOST_WOODS, - RCAREA_SACRED_FOREST_MEADOW, - RCAREA_KAKARIKO_VILLAGE, - RCAREA_GRAVEYARD, - RCAREA_DEATH_MOUNTAIN_TRAIL, - RCAREA_DEATH_MOUNTAIN_CRATER, - RCAREA_GORON_CITY, - RCAREA_ZORAS_RIVER, - RCAREA_ZORAS_DOMAIN, - RCAREA_ZORAS_FOUNTAIN, - RCAREA_HYRULE_FIELD, - RCAREA_LON_LON_RANCH, - RCAREA_LAKE_HYLIA, - RCAREA_GERUDO_VALLEY, - RCAREA_GERUDO_FORTRESS, - RCAREA_WASTELAND, - RCAREA_DESERT_COLOSSUS, - RCAREA_MARKET, + RCAREA_INVALID, RCAREA_KOKIRI_FOREST, RCAREA_LOST_WOODS, RCAREA_SACRED_FOREST_MEADOW, + RCAREA_KAKARIKO_VILLAGE, RCAREA_GRAVEYARD, RCAREA_DEATH_MOUNTAIN_TRAIL, RCAREA_DEATH_MOUNTAIN_CRATER, + RCAREA_GORON_CITY, RCAREA_ZORAS_RIVER, RCAREA_ZORAS_DOMAIN, RCAREA_ZORAS_FOUNTAIN, + RCAREA_HYRULE_FIELD, RCAREA_LON_LON_RANCH, RCAREA_LAKE_HYLIA, RCAREA_GERUDO_VALLEY, + RCAREA_GERUDO_FORTRESS, RCAREA_WASTELAND, RCAREA_DESERT_COLOSSUS, RCAREA_MARKET, RCAREA_HYRULE_CASTLE, }; RandomizerCheckArea GetCheckArea() { auto scene = static_cast(gPlayState->sceneNum); bool grottoScene = (scene == SCENE_GROTTOS || scene == SCENE_FAIRYS_FOUNTAIN); - const EntranceData* ent = GetEntranceData(grottoScene ? ENTRANCE_GROTTO_EXIT_START + GetCurrentGrottoId() : gSaveContext.entranceIndex); + const EntranceData* ent = + GetEntranceData(grottoScene ? ENTRANCE_GROTTO_EXIT_START + GetCurrentGrottoId() : gSaveContext.entranceIndex); RandomizerCheckArea area = RCAREA_INVALID; if (ent != nullptr && !IsAreaScene(scene) && ent->type != ENTRANCE_TYPE_DUNGEON) { if (ent->source == "Desert Colossus" || ent->destination == "Desert Colossus") { @@ -441,7 +438,8 @@ RandomizerCheckArea GetCheckArea() { } } if (area == RCAREA_INVALID) { - if (grottoScene && (GetCurrentGrottoId() == -1) && (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) == RO_GENERIC_OFF)) { + if (grottoScene && (GetCurrentGrottoId() == -1) && + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) == RO_GENERIC_OFF)) { area = previousArea; } else { area = RandomizerCheckObjects::GetRCAreaBySceneID(scene); @@ -454,7 +452,13 @@ bool vector_contains_scene(std::vector vec, const int16_t scene) { return std::any_of(vec.begin(), vec.end(), [&](const auto& x) { return x == scene; }); } -std::vector skipScenes = {SCENE_GANON_BOSS, SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, SCENE_GANON_BOSS, SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, SCENE_GANONS_TOWER_COLLAPSE_INTERIOR,}; +std::vector skipScenes = { + SCENE_GANON_BOSS, + SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, + SCENE_GANON_BOSS, + SCENE_INSIDE_GANONS_CASTLE_COLLAPSE, + SCENE_GANONS_TOWER_COLLAPSE_INTERIOR, +}; void ClearAreaChecksAndTotals() { for (auto& [rcArea, vec] : checksByArea) { @@ -518,7 +522,8 @@ void CheckTrackerLoadGame(int32_t fileNum) { } // Create check name overrides for child pond fish if age split is disabled - if (fishsanityMode != RO_FISHSANITY_OFF && fishsanityMode != RO_FISHSANITY_OVERWORLD && entry.GetRCType() == RCTYPE_FISH && entry.GetScene() == SCENE_FISHING_POND && + if (fishsanityMode != RO_FISHSANITY_OFF && fishsanityMode != RO_FISHSANITY_OVERWORLD && + entry.GetRCType() == RCTYPE_FISH && entry.GetScene() == SCENE_FISHING_POND && entry.GetActorParams() != 116 && !fishsanityAgeSplit) { if (entry.GetShortName().starts_with("Child")) { checkNameOverrides[rc] = entry.GetShortName().substr(6); @@ -526,19 +531,25 @@ void CheckTrackerLoadGame(int32_t fileNum) { } } for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) { - if (!IsAreaSpoiled(static_cast(i)) && (RandomizerCheckObjects::AreaIsOverworld(static_cast(i)) || !IS_RANDO || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SELECTION && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_SET) == RO_GENERIC_ON && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12 || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 0)))) { + if (!IsAreaSpoiled(static_cast(i)) && + (RandomizerCheckObjects::AreaIsOverworld(static_cast(i)) || !IS_RANDO || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_NONE || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == + RO_MQ_DUNGEONS_SELECTION && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_SET) == RO_GENERIC_ON && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + static_cast(RSK_MQ_DEKU_TREE + (i - RCAREA_DEKU_TREE))) != RO_MQ_SET_RANDOM) || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == + RO_MQ_DUNGEONS_SET_NUMBER && + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12 || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 0)))) { SetAreaSpoiled(static_cast(i)); } } - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { + if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && + IS_RANDO) { uint8_t startingAge = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SELECTED_STARTING_AGE).Get(); RandomizerCheckArea startingArea; switch (startingAge) { @@ -558,9 +569,11 @@ void CheckTrackerLoadGame(int32_t fileNum) { areaCheckTotals[startingArea]++; } - showVOrMQ = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_RANDOM_NUMBER || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) < 12)); + showVOrMQ = + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == + RO_MQ_DUNGEONS_RANDOM_NUMBER || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) < 12)); initialized = true; UpdateAllOrdering(); UpdateInventoryChecks(); @@ -603,7 +616,9 @@ void CheckTrackerTransition(uint32_t sceneNum) { SetShopSeen(sceneNum, false); break; } - if (!IsAreaSpoiled(currentArea) && (RandomizerCheckObjects::AreaIsOverworld(currentArea) || std::find(spoilingEntrances.begin(), spoilingEntrances.end(), gPlayState->nextEntranceIndex) != spoilingEntrances.end())) { + if (!IsAreaSpoiled(currentArea) && (RandomizerCheckObjects::AreaIsOverworld(currentArea) || + std::find(spoilingEntrances.begin(), spoilingEntrances.end(), + gPlayState->nextEntranceIndex) != spoilingEntrances.end())) { SetAreaSpoiled(currentArea); } } @@ -618,7 +633,7 @@ void CheckTrackerItemReceive(GetItemEntry giEntry) { if (giEntry.itemId == ITEM_SHIELD_DEKU) { SetCheckCollected(RC_KF_SHOP_ITEM_1); return; - }else if (giEntry.itemId == ITEM_KOKIRI_EMERALD) { + } else if (giEntry.itemId == ITEM_KOKIRI_EMERALD) { SetCheckCollected(RC_QUEEN_GOHMA); return; } else if (giEntry.itemId == ITEM_GORON_RUBY) { @@ -657,34 +672,34 @@ void CheckTrackerItemReceive(GetItemEntry giEntry) { } else if (giEntry.itemId == ITEM_BRACELET) { SetCheckCollected(RC_GC_DARUNIAS_JOY); return; - }/* else if (giEntry.itemId == ITEM_SONG_SUN) { - SetCheckCollected(RC_SONG_FROM_ROYAL_FAMILYS_TOMB); - return; - } else if (giEntry.itemId == ITEM_SONG_TIME) { - SetCheckCollected(RC_SONG_FROM_OCARINA_OF_TIME); - return; - } else if (giEntry.itemId == ITEM_SONG_STORMS) { - SetCheckCollected(RC_SONG_FROM_WINDMILL); - return; - } else if (giEntry.itemId == ITEM_SONG_MINUET) { - SetCheckCollected(RC_SHEIK_IN_FOREST); - return; - } else if (giEntry.itemId == ITEM_SONG_BOLERO) { - SetCheckCollected(RC_SHEIK_IN_CRATER); - return; - } else if (giEntry.itemId == ITEM_SONG_SERENADE) { - SetCheckCollected(RC_SHEIK_IN_ICE_CAVERN); - return; - } else if (giEntry.itemId == ITEM_SONG_NOCTURNE) { - SetCheckCollected(RC_SHEIK_IN_KAKARIKO); - return; - } else if (giEntry.itemId == ITEM_SONG_REQUIEM) { - SetCheckCollected(RC_SHEIK_AT_COLOSSUS); - return; - } else if (giEntry.itemId == ITEM_SONG_PRELUDE) { - SetCheckCollected(RC_SHEIK_AT_TEMPLE); - return; - }*/ + } /* else if (giEntry.itemId == ITEM_SONG_SUN) { + SetCheckCollected(RC_SONG_FROM_ROYAL_FAMILYS_TOMB); + return; + } else if (giEntry.itemId == ITEM_SONG_TIME) { + SetCheckCollected(RC_SONG_FROM_OCARINA_OF_TIME); + return; + } else if (giEntry.itemId == ITEM_SONG_STORMS) { + SetCheckCollected(RC_SONG_FROM_WINDMILL); + return; + } else if (giEntry.itemId == ITEM_SONG_MINUET) { + SetCheckCollected(RC_SHEIK_IN_FOREST); + return; + } else if (giEntry.itemId == ITEM_SONG_BOLERO) { + SetCheckCollected(RC_SHEIK_IN_CRATER); + return; + } else if (giEntry.itemId == ITEM_SONG_SERENADE) { + SetCheckCollected(RC_SHEIK_IN_ICE_CAVERN); + return; + } else if (giEntry.itemId == ITEM_SONG_NOCTURNE) { + SetCheckCollected(RC_SHEIK_IN_KAKARIKO); + return; + } else if (giEntry.itemId == ITEM_SONG_REQUIEM) { + SetCheckCollected(RC_SHEIK_AT_COLOSSUS); + return; + } else if (giEntry.itemId == ITEM_SONG_PRELUDE) { + SetCheckCollected(RC_SHEIK_AT_TEMPLE); + return; + }*/ } } @@ -696,7 +711,8 @@ void CheckTrackerSceneFlagSet(int16_t sceneNum, int16_t flagType, int32_t flag) if (flagType != FLAG_SCENE_TREASURE && flagType != FLAG_SCENE_COLLECTIBLE) { return; } - if (sceneNum == SCENE_GRAVEYARD && flag == 0x19 && flagType == FLAG_SCENE_COLLECTIBLE) { // Gravedigging tour special case + if (sceneNum == SCENE_GRAVEYARD && flag == 0x19 && + flagType == FLAG_SCENE_COLLECTIBLE) { // Gravedigging tour special case SetCheckCollected(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR); return; } @@ -704,7 +720,9 @@ void CheckTrackerSceneFlagSet(int16_t sceneNum, int16_t flagType, int32_t flag) if (!IsVisibleInCheckTracker(loc.GetRandomizerCheck())) { continue; } - SpoilerCollectionCheckType checkMatchType = flagType == FLAG_SCENE_TREASURE ? SpoilerCollectionCheckType::SPOILER_CHK_CHEST : SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE; + SpoilerCollectionCheckType checkMatchType = flagType == FLAG_SCENE_TREASURE + ? SpoilerCollectionCheckType::SPOILER_CHK_CHEST + : SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE; Rando::SpoilerCollectionCheck scCheck = loc.GetCollectionCheck(); if (scCheck.scene == sceneNum && scCheck.flag == flag && scCheck.type == checkMatchType) { SetCheckCollected(loc.GetRandomizerCheck()); @@ -725,8 +743,8 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { break; case FLAG_EVENT_CHECK_INF: if ((flag == EVENTCHKINF_CARPENTERS_FREE(0) || flag == EVENTCHKINF_CARPENTERS_FREE(1) || - flag == EVENTCHKINF_CARPENTERS_FREE(2) || flag == EVENTCHKINF_CARPENTERS_FREE(3)) - && GET_EVENTCHKINF_CARPENTERS_FREE_ALL()) { + flag == EVENTCHKINF_CARPENTERS_FREE(2) || flag == EVENTCHKINF_CARPENTERS_FREE(3)) && + GET_EVENTCHKINF_CARPENTERS_FREE_ALL()) { SetCheckCollected(RC_GF_GERUDO_MEMBERSHIP_CARD); return; } @@ -784,16 +802,18 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { for (auto& loc : Rando::StaticData::GetLocationTable()) { if ((!IS_RANDO && ((loc.GetQuest() == RCQUEST_MQ && !IS_MASTER_QUEST) || (loc.GetQuest() == RCQUEST_VANILLA && IS_MASTER_QUEST))) || - (IS_RANDO && !(OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene()) == nullptr) && - ((OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsMQ() && - loc.GetQuest() == RCQUEST_VANILLA) || - OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsVanilla() && - loc.GetQuest() == RCQUEST_MQ))) { + (IS_RANDO && + !(OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene()) == nullptr) && + ((OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsMQ() && + loc.GetQuest() == RCQUEST_VANILLA) || + OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(loc.GetScene())->IsVanilla() && + loc.GetQuest() == RCQUEST_MQ))) { continue; } Rando::SpoilerCollectionCheck scCheck = loc.GetCollectionCheck(); SpoilerCollectionCheckType scCheckType = scCheck.type; - if (checkMatchType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF && scCheckType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF) { + if (checkMatchType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF && + scCheckType == SpoilerCollectionCheckType::SPOILER_CHK_RANDOMIZER_INF) { if (flag == OTRGlobals::Instance->gRandomizer->GetRandomizerInfFromCheck(loc.GetRandomizerCheck())) { SetCheckCollected(loc.GetRandomizerCheck()); return; @@ -826,15 +846,15 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { } SaveManager::Instance->SaveArray("checkStatus", checkCount.size(), [&](size_t i) { RandomizerCheck check = checkCount.at(i); - RandomizerCheckStatus savedStatus = OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetCheckStatus(); + RandomizerCheckStatus savedStatus = + OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetCheckStatus(); bool isSkipped = OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->GetIsSkipped(); if (savedStatus == RCSHOW_COLLECTED) { if (fullSave) { OTRGlobals::Instance->gRandoContext->GetItemLocation(check)->SetCheckStatus(RCSHOW_SAVED); savedStatus = RCSHOW_SAVED; updateOrdering = true; - } - else { + } else { savedStatus = RCSHOW_SCUMMED; } } @@ -843,7 +863,7 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave) { SaveManager::Instance->SaveData("randomizerCheck", check); SaveManager::Instance->SaveData("status", savedStatus); SaveManager::Instance->SaveData("skipped", isSkipped); - }); + }); } }); SaveManager::Instance->SaveData("areasSpoiled", areasSpoiled); @@ -871,8 +891,8 @@ void LoadFile() { SaveManager::Instance->LoadData("skipped", skipped, false); OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetCheckStatus(status); OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(skipped); - }); }); + }); SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled, (uint32_t)0); UpdateAllOrdering(); UpdateAllAreas(); @@ -900,51 +920,57 @@ void SetAreaSpoiled(RandomizerCheckArea rcArea) { } void CheckTrackerWindow::DrawElement() { - Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor.Value"), Color_Bg_Default); - Color_Area_Incomplete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); - Color_Area_Incomplete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); - Color_Area_Complete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); - Color_Area_Complete_Extra = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); - Color_Unchecked_Main = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.MainColor.Value"), Color_Main_Default); - Color_Unchecked_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.ExtraColor.Value"), Color_Unchecked_Extra_Default); - Color_Skipped_Main = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.MainColor.Value"), Color_Main_Default); - Color_Skipped_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.ExtraColor.Value"), Color_Skipped_Extra_Default); - Color_Seen_Main = CVarGetColor(CVAR_TRACKER_CHECK("Seen.MainColor.Value"), Color_Main_Default); - Color_Seen_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Seen.ExtraColor.Value"), Color_Seen_Extra_Default); - Color_Hinted_Main = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.MainColor.Value"), Color_Main_Default); - Color_Hinted_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.ExtraColor.Value"), Color_Hinted_Extra_Default); - Color_Collected_Main = CVarGetColor(CVAR_TRACKER_CHECK("Collected.MainColor.Value"), Color_Main_Default); - Color_Collected_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Collected.ExtraColor.Value"), Color_Collected_Extra_Default); - Color_Scummed_Main = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.MainColor.Value"), Color_Main_Default); - Color_Scummed_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.ExtraColor.Value"), Color_Scummed_Extra_Default); - Color_Saved_Main = CVarGetColor(CVAR_TRACKER_CHECK("Saved.MainColor.Value"), Color_Main_Default); - Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor.Value"), Color_Saved_Extra_Default); - hideUnchecked = CVarGetInteger(CVAR_TRACKER_CHECK("Unchecked.Hide"), 0); - hideScummed = CVarGetInteger(CVAR_TRACKER_CHECK("Scummed.Hide"), 0); - hideSeen = CVarGetInteger(CVAR_TRACKER_CHECK("Seen.Hide"), 0); - hideSkipped = CVarGetInteger(CVAR_TRACKER_CHECK("Skipped.Hide"), 0); - hideSaved = CVarGetInteger(CVAR_TRACKER_CHECK("Saved.Hide"), 0); - hideCollected = CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0); - showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); - mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); - showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); - enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); - onlyShowAvailable = CVarGetInteger(CVAR_TRACKER_CHECK("OnlyShowAvailable"), 0); + Color_Background = CVarGetColor(CVAR_TRACKER_CHECK("BgColor.Value"), Color_Bg_Default); + Color_Area_Incomplete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); + Color_Area_Incomplete_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); + Color_Area_Complete_Main = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); + Color_Area_Complete_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); + Color_Unchecked_Main = CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.MainColor.Value"), Color_Main_Default); + Color_Unchecked_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("Unchecked.ExtraColor.Value"), Color_Unchecked_Extra_Default); + Color_Skipped_Main = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.MainColor.Value"), Color_Main_Default); + Color_Skipped_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Skipped.ExtraColor.Value"), Color_Skipped_Extra_Default); + Color_Seen_Main = CVarGetColor(CVAR_TRACKER_CHECK("Seen.MainColor.Value"), Color_Main_Default); + Color_Seen_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Seen.ExtraColor.Value"), Color_Seen_Extra_Default); + Color_Hinted_Main = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.MainColor.Value"), Color_Main_Default); + Color_Hinted_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Hinted.ExtraColor.Value"), Color_Hinted_Extra_Default); + Color_Collected_Main = CVarGetColor(CVAR_TRACKER_CHECK("Collected.MainColor.Value"), Color_Main_Default); + Color_Collected_Extra = + CVarGetColor(CVAR_TRACKER_CHECK("Collected.ExtraColor.Value"), Color_Collected_Extra_Default); + Color_Scummed_Main = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.MainColor.Value"), Color_Main_Default); + Color_Scummed_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Scummed.ExtraColor.Value"), Color_Scummed_Extra_Default); + Color_Saved_Main = CVarGetColor(CVAR_TRACKER_CHECK("Saved.MainColor.Value"), Color_Main_Default); + Color_Saved_Extra = CVarGetColor(CVAR_TRACKER_CHECK("Saved.ExtraColor.Value"), Color_Saved_Extra_Default); + hideUnchecked = CVarGetInteger(CVAR_TRACKER_CHECK("Unchecked.Hide"), 0); + hideScummed = CVarGetInteger(CVAR_TRACKER_CHECK("Scummed.Hide"), 0); + hideSeen = CVarGetInteger(CVAR_TRACKER_CHECK("Seen.Hide"), 0); + hideSkipped = CVarGetInteger(CVAR_TRACKER_CHECK("Skipped.Hide"), 0); + hideSaved = CVarGetInteger(CVAR_TRACKER_CHECK("Saved.Hide"), 0); + hideCollected = CVarGetInteger(CVAR_TRACKER_CHECK("Collected.Hide"), 0); + showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); + mystery = CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0); + showLogicTooltip = CVarGetInteger(CVAR_TRACKER_CHECK("ShowLogic"), 0); + enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); + onlyShowAvailable = CVarGetInteger(CVAR_TRACKER_CHECK("OnlyShowAvailable"), 0); hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); alwaysShowGS = CVarGetInteger(CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), 0); if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { - if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { + if (CVarGetInteger(CVAR_TRACKER_CHECK("ShowOnlyPaused"), 0) && + (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { return; } if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { int comboButton1Mask = buttons[CVarGetInteger(CVAR_TRACKER_CHECK("ComboButton1"), TRACKER_COMBO_BUTTON_L)]; int comboButton2Mask = buttons[CVarGetInteger(CVAR_TRACKER_CHECK("ComboButton2"), TRACKER_COMBO_BUTTON_R)]; - OSContPad* trackerButtonsPressed = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); + OSContPad* trackerButtonsPressed = + std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); bool comboButtonsHeld = trackerButtonsPressed != nullptr && - trackerButtonsPressed[0].button & comboButton1Mask && - trackerButtonsPressed[0].button & comboButton2Mask; + trackerButtonsPressed[0].button & comboButton1Mask && + trackerButtonsPressed[0].button & comboButton2Mask; if (!comboButtonsHeld) { return; } @@ -955,7 +981,7 @@ void CheckTrackerWindow::DrawElement() { BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar); if (!GameInteractor::IsSaveLoaded() || !initialized) { - ImGui::Text("Waiting for file load..."); //TODO Language + ImGui::Text("Waiting for file load..."); // TODO Language EndFloatWindows(); return; } @@ -965,7 +991,7 @@ void CheckTrackerWindow::DrawElement() { sceneId = (SceneID)gPlayState->sceneNum; } - //Quick Options + // Quick Options #ifdef __WIIU__ float headerHeight = 40.0f; #else @@ -981,16 +1007,19 @@ void CheckTrackerWindow::DrawElement() { ImGui::TableNextRow(0, headerHeight); ImGui::TableNextColumn(); if (UIWidgets::CVarCheckbox( - "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), UIWidgets::CheckboxOptions({{.tooltip = "When active, items will show hidden checks by default when updated to this state." }}) - .Color(THEME_COLOR))) { + "Show Hidden Items", CVAR_TRACKER_CHECK("ShowHidden"), + UIWidgets::CheckboxOptions( + { { .tooltip = "When active, items will show hidden checks by default when updated to this state." } }) + .Color(THEME_COLOR))) { doAreaScroll = true; showHidden = CVarGetInteger(CVAR_TRACKER_CHECK("ShowHidden"), 0); RecalculateAllAreaTotals(); } if (enableAvailableChecks) { if (UIWidgets::CVarCheckbox( - "Only Show Available Checks", CVAR_TRACKER_CHECK("OnlyShowAvailable"), UIWidgets::CheckboxOptions({{ .tooltip = "When active, unavailable checks will be hidden." }}) - .Color(THEME_COLOR))) { + "Only Show Available Checks", CVAR_TRACKER_CHECK("OnlyShowAvailable"), + UIWidgets::CheckboxOptions({ { .tooltip = "When active, unavailable checks will be hidden." } }) + .Color(THEME_COLOR))) { doAreaScroll = true; RecalculateAllAreaTotals(); } @@ -1002,12 +1031,15 @@ void CheckTrackerWindow::DrawElement() { doAreaScroll = true; } ImGui::SameLine(); - if (UIWidgets::Button("Collapse All", UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Collapse All", + UIWidgets::ButtonOptions().Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { optExpandAll = false; optCollapseAll = true; } ImGui::SameLine(); - if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({{ .tooltip = "Clear the search field" }}).Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({ { .tooltip = "Clear the search field" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { checkSearch.Clear(); UpdateFilters(); doAreaScroll = true; @@ -1030,7 +1062,7 @@ void CheckTrackerWindow::DrawElement() { UIWidgets::PaddedSeparator(); - //Checks Section Lead-in + // Checks Section Lead-in ImGui::TableNextRow(); ImGui::TableNextColumn(); size = ImGui::GetContentRegionAvail(); @@ -1042,7 +1074,7 @@ void CheckTrackerWindow::DrawElement() { ImGui::TableNextRow(); ImGui::TableNextColumn(); - //Prep for loop + // Prep for loop RainbowTick(); bool doDraw = false; bool thisAreaFullyChecked = false; @@ -1053,22 +1085,26 @@ void CheckTrackerWindow::DrawElement() { bool doingCollapseOrExpand = optExpandAll || optCollapseAll; bool isThisAreaSpoiled; RandomizerCheckArea lastArea = RCAREA_INVALID; - Color_RGBA8 areaCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); - Color_RGBA8 areaIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); - Color_RGBA8 extraCompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); - Color_RGBA8 extraIncompleteColor = CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); + Color_RGBA8 areaCompleteColor = + CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.MainColor.Value"), Color_Main_Default); + Color_RGBA8 areaIncompleteColor = + CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.MainColor.Value"), Color_Main_Default); + Color_RGBA8 extraCompleteColor = + CVarGetColor(CVAR_TRACKER_CHECK("AreaComplete.ExtraColor.Value"), Color_Area_Complete_Extra_Default); + Color_RGBA8 extraIncompleteColor = + CVarGetColor(CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor.Value"), Color_Area_Incomplete_Extra_Default); Color_RGBA8 mainColor; Color_RGBA8 extraColor; std::string stemp; bool shouldHideFilteredAreas = CVarGetInteger(CVAR_TRACKER_CHECK("HideFilteredAreas"), 1); - + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); for (auto& [rcArea, checks] : checksByArea) { RandomizerCheckArea thisArea = currentArea; thisAreaFullyChecked = (areaChecksGotten[rcArea] == areaCheckTotals[rcArea]); - //Last Area needs to be cleaned up + // Last Area needs to be cleaned up if (lastArea != RCAREA_INVALID && doDraw) { UIWidgets::PaddedSeparator(); } @@ -1079,11 +1115,10 @@ void CheckTrackerWindow::DrawElement() { } if ((shouldHideFilteredAreas && filterAreasHidden[rcArea]) || (!showHidden && ((hideComplete && thisAreaFullyChecked) || (hideIncomplete && !thisAreaFullyChecked))) || - (enableAvailableChecks && onlyShowAvailable && areaChecksAvailable[rcArea] == 0) - ) { + (enableAvailableChecks && onlyShowAvailable && areaChecksAvailable[rcArea] == 0)) { doDraw = false; } else { - //Get the colour for the area + // Get the colour for the area if (thisAreaFullyChecked) { mainColor = areaCompleteColor; extraColor = extraCompleteColor; @@ -1092,7 +1127,7 @@ void CheckTrackerWindow::DrawElement() { extraColor = extraIncompleteColor; } - //Draw the area + // Draw the area collapseLogic = !thisAreaFullyChecked; if (doingCollapseOrExpand) { if (optExpandAll) { @@ -1126,11 +1161,14 @@ void CheckTrackerWindow::DrawElement() { areaTotalsSS << static_cast(areaChecksAvailable[rcArea]) << " / "; areaTotalsTooltipSS << "Available / "; } - areaTotalsSS << static_cast(areaChecksGotten[rcArea]) << " / " << static_cast(areaCheckTotals[rcArea]) << ")"; + areaTotalsSS << static_cast(areaChecksGotten[rcArea]) << " / " + << static_cast(areaCheckTotals[rcArea]) << ")"; areaTotalsTooltipSS << "Checked / Total"; if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) { - if (OTRGlobals::Instance->gRandoContext->GetDungeons()->GetDungeonFromScene(DungeonSceneLookupByArea(rcArea))->IsMQ()) { + if (OTRGlobals::Instance->gRandoContext->GetDungeons() + ->GetDungeonFromScene(DungeonSceneLookupByArea(rcArea)) + ->IsMQ()) { areaTotalsSS << " - MQ"; } else { areaTotalsSS << " - Vanilla"; @@ -1145,7 +1183,7 @@ void CheckTrackerWindow::DrawElement() { ImGui::PopStyleColor(); - //Keep areas loaded between transitions + // Keep areas loaded between transitions if (thisArea == rcArea && doAreaScroll) { ImGui::SetScrollHereY(0.0f); doAreaScroll = false; @@ -1163,8 +1201,8 @@ void CheckTrackerWindow::DrawElement() { } ImGui::PopStyleVar(); - ImGui::EndTable(); //Checks Lead-out - ImGui::EndTable(); //Quick Options Lead-out + ImGui::EndTable(); // Checks Lead-out + ImGui::EndTable(); // Quick Options Lead-out EndFloatWindows(); if (doingCollapseOrExpand) { optCollapseAll = false; @@ -1175,7 +1213,7 @@ void CheckTrackerWindow::DrawElement() { bool UpdateFilters() { for (auto& [rcArea, checks] : checksByArea) { filterAreasHidden[rcArea] = !checkSearch.PassFilter(RandomizerCheckObjects::GetRCAreaName(rcArea).c_str()); - for (auto check : checks) { + for (auto check : checks) { if (ShouldShowCheck(check)) { filterAreasHidden[rcArea] = false; filterChecksHidden[check] = false; @@ -1191,21 +1229,22 @@ bool UpdateFilters() { bool ShouldShowCheck(RandomizerCheck check) { auto itemLoc = Rando::Context::GetInstance()->GetItemLocation(check); std::string search = (Rando::StaticData::GetLocation(check)->GetShortName() + " " + - Rando::StaticData::GetLocation(check)->GetName() + " " + - RandomizerCheckObjects::GetRCAreaName(Rando::StaticData::GetLocation(check)->GetArea())); - if (itemLoc->HasObtained() || itemLoc->GetCheckStatus() == RCSHOW_SCUMMED || - (!mystery && (itemLoc->GetCheckStatus() == RCSHOW_IDENTIFIED || itemLoc->GetCheckStatus() == RCSHOW_SEEN) && itemLoc->GetPlacedRandomizerGet() != RG_ICE_TRAP)) { + Rando::StaticData::GetLocation(check)->GetName() + " " + + RandomizerCheckObjects::GetRCAreaName(Rando::StaticData::GetLocation(check)->GetArea())); + if (itemLoc->HasObtained() || itemLoc->GetCheckStatus() == RCSHOW_SCUMMED || + (!mystery && (itemLoc->GetCheckStatus() == RCSHOW_IDENTIFIED || itemLoc->GetCheckStatus() == RCSHOW_SEEN) && + itemLoc->GetPlacedRandomizerGet() != RG_ICE_TRAP)) { search += " " + itemLoc->GetPlacedItemName().GetForLanguage(gSaveContext.language); } else if (itemLoc->GetCheckStatus() == RCSHOW_IDENTIFIED && !mystery) { - search += OTRGlobals::Instance->gRandoContext->overrides[check].GetTrickName().GetForLanguage(gSaveContext.language); + search += + OTRGlobals::Instance->gRandoContext->overrides[check].GetTrickName().GetForLanguage(gSaveContext.language); } else if (itemLoc->GetCheckStatus() == RCSHOW_SEEN && !mystery) { - search += Rando::StaticData::RetrieveItem(OTRGlobals::Instance->gRandoContext->overrides[check].LooksLike()).GetName().GetForLanguage(gSaveContext.language); + search += Rando::StaticData::RetrieveItem(OTRGlobals::Instance->gRandoContext->overrides[check].LooksLike()) + .GetName() + .GetForLanguage(gSaveContext.language); } - return ( - IsVisibleInCheckTracker(check) && - (checkSearch.Filters.Size == 0 || - checkSearch.PassFilter(search.c_str())) - ); + return (IsVisibleInCheckTracker(check) && + (checkSearch.Filters.Size == 0 || checkSearch.PassFilter(search.c_str()))); } // Windowing stuff @@ -1213,8 +1252,7 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag ImGuiWindowFlags windowFlags = flags; if (windowFlags == 0) { - windowFlags |= - ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; + windowFlags |= ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; } if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { @@ -1240,80 +1278,80 @@ void EndFloatWindows() { } void LoadSettings() { - //If in randomzer, then get the setting and check if in general we should be showing the settings - //If in vanilla, _try_ to show items that at least are needed for 100% + // If in randomzer, then get the setting and check if in general we should be showing the settings + // If in vanilla, _try_ to show items that at least are needed for 100% - showShops = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) != RO_SHOPSANITY_OFF - : false; - showBeans = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_BEANS_ONLY || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL - : true; - showScrubs = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_ALL - : false; - showMajorScrubs = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF - : false; - showMerchants = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL - : true; - showBeehives = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEEHIVES) == RO_GENERIC_YES - : false; - showCows = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_COWS) == RO_GENERIC_YES - : false; - showAdultTrade = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) == RO_GENERIC_YES - : true; - showKokiriSword = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_KOKIRI_SWORD) == RO_GENERIC_YES - : true; - showMasterSword = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) == RO_GENERIC_YES - : true; - showHyruleLoach = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH - : false; - showWeirdEgg = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WEIRD_EGG) == RO_GENERIC_YES - : true; - showGerudoCard = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) == RO_GENERIC_YES - : true; - showFrogSongRupees = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FROG_SONG_RUPEES) == RO_GENERIC_YES - : false; - showFairies = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) == RO_GENERIC_YES - : false; - showStartingMapsCompasses = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MAPANDCOMPASS) != RO_DUNGEON_ITEM_LOC_VANILLA - : false; - showKeysanity = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) != RO_DUNGEON_ITEM_LOC_VANILLA - : false; - showBossKeysanity = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) != RO_DUNGEON_ITEM_LOC_VANILLA - : false; - showGerudoFortressKeys = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GERUDO_KEYS) != RO_GERUDO_KEYS_VANILLA - : false; - showGanonBossKey = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != RO_GANON_BOSS_KEY_VANILLA - : false; - showOcarinas = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_OCARINA) == RO_GENERIC_YES - : false; - show100SkullReward = IS_RANDO ? - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_100_GS_REWARD) == RO_GENERIC_YES - : false; - showLinksPocket = IS_RANDO ? // don't show Link's Pocket if not randomizer, or if rando and pocket is disabled - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING - :false; + showShops = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) != RO_SHOPSANITY_OFF : false; + showBeans = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_BEANS_ONLY || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_ALL + : true; + showScrubs = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_ALL : false; + showMajorScrubs = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SCRUBS) != RO_SCRUBS_OFF : false; + showMerchants = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == + RO_SHUFFLE_MERCHANTS_ALL + : true; + showBeehives = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEEHIVES) == RO_GENERIC_YES + : false; + showCows = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_COWS) == RO_GENERIC_YES : false; + showAdultTrade = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) == RO_GENERIC_YES + : true; + showKokiriSword = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_KOKIRI_SWORD) == RO_GENERIC_YES + : true; + showMasterSword = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) == RO_GENERIC_YES + : true; + showHyruleLoach = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY) == RO_FISHSANITY_HYRULE_LOACH + : false; + showWeirdEgg = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_WEIRD_EGG) == RO_GENERIC_YES + : true; + showGerudoCard = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) == RO_GENERIC_YES + : true; + showFrogSongRupees = + IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FROG_SONG_RUPEES) == RO_GENERIC_YES + : false; + showFairies = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) == RO_GENERIC_YES + : false; + showStartingMapsCompasses = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue( + RSK_SHUFFLE_MAPANDCOMPASS) != RO_DUNGEON_ITEM_LOC_VANILLA + : false; + showKeysanity = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_KEYSANITY) != RO_DUNGEON_ITEM_LOC_VANILLA + : false; + showBossKeysanity = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BOSS_KEYSANITY) != + RO_DUNGEON_ITEM_LOC_VANILLA + : false; + showGerudoFortressKeys = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GERUDO_KEYS) != RO_GERUDO_KEYS_VANILLA + : false; + showGanonBossKey = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY) != + RO_GANON_BOSS_KEY_VANILLA + : false; + showOcarinas = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_OCARINA) == RO_GENERIC_YES + : false; + show100SkullReward = + IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_100_GS_REWARD) == RO_GENERIC_YES + : false; + showLinksPocket = + IS_RANDO ? // don't show Link's Pocket if not randomizer, or if rando and pocket is disabled + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING + : false; if (IS_RANDO) { switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS)) { @@ -1452,79 +1490,71 @@ bool IsCheckShuffled(RandomizerCheck rc) { auto identity = OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1); } if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) != RO_LOGIC_VANILLA) { - return - (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations - (loc->GetRCType() != RCTYPE_GOSSIP_STONE) && //TODO: Don't show hints until tracker supports them - (loc->GetRCType() != RCTYPE_STATIC_HINT) && //TODO: Don't show hints until tracker supports them - (loc->GetRCType() != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them - (rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it - (rc != RC_LINKS_POCKET || showLinksPocket) && - OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) && - (loc->GetRCType() != RCTYPE_SHOP || - (showShops && OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1).enGirlAShopItem == 50)) && - (rc != RC_TRIFORCE_COMPLETED) && - (rc != RC_GANON) && - (loc->GetRCType() != RCTYPE_SCRUB || - showScrubs || + return (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations + (loc->GetRCType() != RCTYPE_GOSSIP_STONE) && // TODO: Don't show hints until tracker supports them + (loc->GetRCType() != RCTYPE_STATIC_HINT) && // TODO: Don't show hints until tracker supports them + (loc->GetRCType() != + RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them + (rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it + (rc != RC_LINKS_POCKET || showLinksPocket) && + OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) && + (loc->GetRCType() != RCTYPE_SHOP || + (showShops && + OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1) + .enGirlAShopItem == 50)) && + (rc != RC_TRIFORCE_COMPLETED) && (rc != RC_GANON) && + (loc->GetRCType() != RCTYPE_SCRUB || showScrubs || (showMajorScrubs && (rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized - rc == RC_HF_DEKU_SCRUB_GROTTO || - rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT)) - ) && - (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && - (loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) && - (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && - (loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS || + rc == RC_HF_DEKU_SCRUB_GROTTO || rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT))) && + (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && + (loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) && + (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && + (loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS || (showOverworldTokens && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || - (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) - ) && - (loc->GetRCType() != RCTYPE_POT || + (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_POT || (showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && - (loc->GetRCType() != RCTYPE_GRASS || + (loc->GetRCType() != RCTYPE_GRASS || (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && - (loc->GetRCType() != RCTYPE_CRATE || + (loc->GetRCType() != RCTYPE_CRATE || (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && - (loc->GetRCType() != RCTYPE_NLCRATE || + (loc->GetRCType() != RCTYPE_NLCRATE || (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == - RO_LOGIC_NO_LOGIC) || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == RO_LOGIC_NO_LOGIC) || (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && - (loc->GetRCType() != RCTYPE_SMALL_CRATE || + (loc->GetRCType() != RCTYPE_SMALL_CRATE || (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && - (loc->GetRCType() != RCTYPE_COW || showCows) && - (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && - (loc->GetRCType() != RCTYPE_FREESTANDING || + (loc->GetRCType() != RCTYPE_COW || showCows) && + (loc->GetRCType() != RCTYPE_FISH || + OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && + (loc->GetRCType() != RCTYPE_FREESTANDING || (showOverworldFreestanding && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || - (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) - ) && - (loc->GetRCType() != RCTYPE_ADULT_TRADE || - showAdultTrade || + (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade || rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off ) && - (rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && - (rc != RC_TOT_MASTER_SWORD || showMasterSword) && - (rc != RC_LH_HYRULE_LOACH || showHyruleLoach) && - (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && - (rc != RC_HC_MALON_EGG || showWeirdEgg) && - (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && - ((loc->GetRCType() != RCTYPE_MAP && loc->GetRCType() != RCTYPE_COMPASS) || showStartingMapsCompasses) && - (loc->GetRCType() != RCTYPE_FAIRY || showFairies) && - (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && - (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && - (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && - (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && - (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_GF_GERUDO_MEMBERSHIP_CARD || + (rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && (rc != RC_TOT_MASTER_SWORD || showMasterSword) && + (rc != RC_LH_HYRULE_LOACH || showHyruleLoach) && (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && + (rc != RC_HC_MALON_EGG || showWeirdEgg) && + (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && + ((loc->GetRCType() != RCTYPE_MAP && loc->GetRCType() != RCTYPE_COMPASS) || showStartingMapsCompasses) && + (loc->GetRCType() != RCTYPE_FAIRY || showFairies) && + (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && + (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && + (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && + (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && + (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_GF_GERUDO_MEMBERSHIP_CARD || (showGerudoCard && rc == RC_GF_GERUDO_MEMBERSHIP_CARD) || (fortressNormal && showGerudoFortressKeys && loc->GetRCType() == RCTYPE_GF_KEY) || - (fortressFast && showGerudoFortressKeys && rc == RC_GF_NORTH_F1_CARPENTER) - ); - } - else if (loc->IsVanillaCompletion()) { - return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) && rc != RC_LINKS_POCKET; + (fortressFast && showGerudoFortressKeys && rc == RC_GF_NORTH_F1_CARPENTER)); + } else if (loc->IsVanillaCompletion()) { + return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) && + rc != RC_LINKS_POCKET; } return false; } @@ -1532,17 +1562,18 @@ bool IsCheckShuffled(RandomizerCheck rc) { bool IsVisibleInCheckTracker(RandomizerCheck rc) { auto loc = Rando::StaticData::GetLocation(rc); if (IS_RANDO) { - return IsCheckShuffled(rc) || (alwaysShowGS && - loc->GetRCType() == RCTYPE_SKULL_TOKEN && - OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) - ) || (loc->GetRCType() == RCTYPE_SHOP && showShops && !hideShopUnshuffledChecks); + return IsCheckShuffled(rc) || + (alwaysShowGS && loc->GetRCType() == RCTYPE_SKULL_TOKEN && + OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc)) || + (loc->GetRCType() == RCTYPE_SHOP && showShops && !hideShopUnshuffledChecks); } else { - return loc->IsVanillaCompletion() && (!loc->IsDungeon() || (loc->IsDungeon() && loc->GetQuest() == gSaveContext.ship.quest.id)); + return loc->IsVanillaCompletion() && + (!loc->IsDungeon() || (loc->IsDungeon() && loc->GetQuest() == gSaveContext.ship.quest.id)); } } void UpdateInventoryChecks() { - //For all the areas with maps, if you have one, spoil the area + // For all the areas with maps, if you have one, spoil the area for (auto [scene, area] : DungeonRCAreasBySceneID) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, scene)) { SetAreaSpoiled(area); @@ -1575,7 +1606,7 @@ void UpdateAllOrdering() { void UpdateOrdering(RandomizerCheckArea rcArea) { // Sort a single area - if(checksByArea.contains(rcArea)) { + if (checksByArea.contains(rcArea)) { std::sort(checksByArea.find(rcArea)->second.begin(), checksByArea.find(rcArea)->second.end(), CompareChecks); } RecalculateAllAreaTotals(); @@ -1689,8 +1720,8 @@ void DrawLocation(RandomizerCheck rc) { } mainColor = !IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID()) && !IS_RANDO - ? Color_Scummed_Extra - : Color_Scummed_Main; + ? Color_Scummed_Extra + : Color_Scummed_Main; extraColor = Color_Scummed_Extra; } else if (status == RCSHOW_UNCHECKED) { if (!showHidden && hideUnchecked) { @@ -1703,22 +1734,24 @@ void DrawLocation(RandomizerCheck rc) { extraColor = Color_Unchecked_Extra; } - //Main Text + // Main Text if (checkNameOverrides.contains(loc->GetRandomizerCheck())) { txt = checkNameOverrides[loc->GetRandomizerCheck()]; } else { txt = loc->GetShortName(); } - + if (lastLocationChecked == loc->GetRandomizerCheck()) { txt = "* " + txt; } // Draw button - for Skipped/Seen/Scummed/Unchecked only - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {4.0f, 3.0f}); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { 4.0f, 3.0f }); float sz = ImGui::GetFrameHeight(); - if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || status == RCSHOW_SCUMMED || skipped) { - if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES, ImVec2(sz, sz), UIWidgets::ButtonOptions().Color(THEME_COLOR))) { + if (status == RCSHOW_UNCHECKED || status == RCSHOW_SEEN || status == RCSHOW_IDENTIFIED || + status == RCSHOW_SCUMMED || skipped) { + if (UIWidgets::StateButton(std::to_string(rc).c_str(), skipped ? ICON_FA_PLUS : ICON_FA_TIMES, ImVec2(sz, sz), + UIWidgets::ButtonOptions().Color(THEME_COLOR))) { if (skipped) { OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->SetIsSkipped(false); areaChecksGotten[loc->GetArea()]--; @@ -1747,7 +1780,7 @@ void DrawLocation(RandomizerCheck rc) { ImGui::SameLine(); - //Draw + // Draw ImVec4 styleColor(mainColor.r / 255.0f, mainColor.g / 255.0f, mainColor.b / 255.0f, mainColor.a / 255.0f); if (enableAvailableChecks) { if (itemLoc->HasObtained()) { @@ -1764,7 +1797,7 @@ void DrawLocation(RandomizerCheck rc) { ImGui::Text("%s", txt.c_str()); ImGui::PopStyleColor(); - //Draw the extra info + // Draw the extra info txt = ""; if (status != RCSHOW_UNCHECKED) { @@ -1776,7 +1809,8 @@ void DrawLocation(RandomizerCheck rc) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { - if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || gSaveContext.language == LANGUAGE_JPN) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || + gSaveContext.language == LANGUAGE_JPN) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; @@ -1789,14 +1823,19 @@ void DrawLocation(RandomizerCheck rc) { if (IS_RANDO) { if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP && !mystery && !itemLoc->IsAddedToPool()) { if (status == RCSHOW_IDENTIFIED) { - txt = OTRGlobals::Instance->gRandoContext->overrides[rc].GetTrickName().GetForLanguage(gSaveContext.language); + txt = OTRGlobals::Instance->gRandoContext->overrides[rc].GetTrickName().GetForLanguage( + gSaveContext.language); } else { - txt = Rando::StaticData::RetrieveItem(OTRGlobals::Instance->gRandoContext->overrides[rc].LooksLike()).GetName().GetForLanguage(gSaveContext.language); + txt = Rando::StaticData::RetrieveItem( + OTRGlobals::Instance->gRandoContext->overrides[rc].LooksLike()) + .GetName() + .GetForLanguage(gSaveContext.language); } } else if (!mystery && !itemLoc->IsAddedToPool()) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } - if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery && !itemLoc->IsAddedToPool()) { + if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery && + !itemLoc->IsAddedToPool()) { auto price = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetPrice(); if (price) { txt += fmt::format(" - {}", price); @@ -1804,27 +1843,29 @@ void DrawLocation(RandomizerCheck rc) { } } else { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { - if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || gSaveContext.language == LANGUAGE_JPN) { + if (gSaveContext.language == LANGUAGE_ENG || gSaveContext.language == LANGUAGE_GER || + gSaveContext.language == LANGUAGE_JPN) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().english; } else if (gSaveContext.language == LANGUAGE_FRA) { txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().french; } } } - break; + break; } } if (txt == "" && skipped) { txt = "Skipped"; // TODO language } - + if (txt != "") { - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(extraColor.r / 255.0f, extraColor.g / 255.0f, extraColor.b / 255.0f, extraColor.a / 255.0f)); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(extraColor.r / 255.0f, extraColor.g / 255.0f, extraColor.b / 255.0f, + extraColor.a / 255.0f)); ImGui::SameLine(); ImGui::Text(" (%s)", txt.c_str()); ImGui::PopStyleColor(); } - + if (showLogicTooltip) { for (auto& locationInRegion : areaTable[itemLoc->GetParentRegionKey()].locations) { if (locationInRegion.GetLocation() == rc) { @@ -1859,7 +1900,7 @@ void RainbowTick() { } Color_RGBA8 newColor; - newColor.r = sin(freqHue + 0) * 127 + 128; + newColor.r = sin(freqHue + 0) * 127 + 128; newColor.g = sin(freqHue + (2 * M_PI / 3)) * 127 + 128; newColor.b = sin(freqHue + (4 * M_PI / 3)) * 127 + 128; newColor.a = 255; @@ -1872,8 +1913,9 @@ void RainbowTick() { } void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, const char* cvarExtraName, - Color_RGBA8& main_color, Color_RGBA8& extra_color, Color_RGBA8& main_default_color, - Color_RGBA8& extra_default_color, const char* cvarHideName, const char* tooltip, UIWidgets::Colors theme) { + Color_RGBA8& main_color, Color_RGBA8& extra_color, Color_RGBA8& main_default_color, + Color_RGBA8& extra_default_color, const char* cvarHideName, const char* tooltip, + UIWidgets::Colors theme) { Color_RGBA8 cvarMainColor = CVarGetColor(cvarMainName, main_default_color); Color_RGBA8 cvarExtraColor = CVarGetColor(cvarExtraName, extra_default_color); main_color = cvarMainColor; @@ -1885,20 +1927,27 @@ void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, std::string label = cvarHideName; label += "##Hidden"; ImGui::PushID(label.c_str()); - UIWidgets::CVarCheckbox("Hidden", cvarHideName, - UIWidgets::CheckboxOptions({{ .tooltip = "When active, checks will hide by default when updated to this state. Can " - "be overriden with the \"Show Hidden Items\" option." }}).Color(theme)); + UIWidgets::CVarCheckbox( + "Hidden", cvarHideName, + UIWidgets::CheckboxOptions( + { { .tooltip = "When active, checks will hide by default when updated to this state. Can " + "be overriden with the \"Show Hidden Items\" option." } }) + .Color(theme)); ImGui::PopID(); } std::string mainLabel = "Name##" + std::string(cvarMainName); if (UIWidgets::CVarColorPicker(mainLabel.c_str(), cvarMainName, main_default_color, false, - UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRainbowCheck, theme)) { + UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | + UIWidgets::ColorPickerRainbowCheck, + theme)) { main_color = CVarGetColor(cvarMainName, main_default_color); } std::string extraLabel = "Details##" + std::string(cvarExtraName); if (UIWidgets::CVarColorPicker(extraLabel.c_str(), cvarExtraName, extra_default_color, false, - UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRainbowCheck, theme)) { + UIWidgets::ColorPickerRandomButton | UIWidgets::ColorPickerResetButton | + UIWidgets::ColorPickerRainbowCheck, + theme)) { extra_color = CVarGetColor(cvarExtraName, extra_default_color); } } @@ -1955,10 +2004,10 @@ void RecalculateAvailableChecks() { } StopPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); - SPDLOG_INFO("Recalculate Available Checks Time: {}ms", GetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS).count()); + SPDLOG_INFO("Recalculate Available Checks Time: {}ms", + GetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS).count()); } - void CheckTrackerWindow::Draw() { if (!IsVisible()) { return; @@ -1968,14 +2017,18 @@ void CheckTrackerWindow::Draw() { SyncVisibilityConsoleVariable(); } -static std::unordered_map windowType = {{ TRACKER_WINDOW_FLOATING, "Floating" }, { TRACKER_WINDOW_WINDOW, "Window" }}; -static std::unordered_map displayType = {{ 0, "Always" }, { 1, "Combo Button Hold" }}; +static std::unordered_map windowType = { { TRACKER_WINDOW_FLOATING, "Floating" }, + { TRACKER_WINDOW_WINDOW, "Window" } }; +static std::unordered_map displayType = { { 0, "Always" }, { 1, "Combo Button Hold" } }; static std::unordered_map buttonStrings = { - { TRACKER_COMBO_BUTTON_A, "A Button" }, { TRACKER_COMBO_BUTTON_B, "B Button" }, { TRACKER_COMBO_BUTTON_C_UP, "C-Up" }, - { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, - { TRACKER_COMBO_BUTTON_L, "L Button" }, { TRACKER_COMBO_BUTTON_Z, "Z Button" }, { TRACKER_COMBO_BUTTON_R, "R Button" }, - { TRACKER_COMBO_BUTTON_START, "Start" }, { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, - { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }}; + { TRACKER_COMBO_BUTTON_A, "A Button" }, { TRACKER_COMBO_BUTTON_B, "B Button" }, + { TRACKER_COMBO_BUTTON_C_UP, "C-Up" }, { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, + { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, + { TRACKER_COMBO_BUTTON_L, "L Button" }, { TRACKER_COMBO_BUTTON_Z, "Z Button" }, + { TRACKER_COMBO_BUTTON_R, "R Button" }, { TRACKER_COMBO_BUTTON_START, "Start" }, + { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, + { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" } +}; void CheckTrackerSettingsWindow::DrawElement() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); @@ -1987,64 +2040,130 @@ void CheckTrackerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); UIWidgets::CVarColorPicker("BG Color", CVAR_TRACKER_CHECK("BgColor"), Color_Bg_Default, true, - UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRandomButton, THEME_COLOR); + UIWidgets::ColorPickerResetButton | UIWidgets::ColorPickerRandomButton, THEME_COLOR); ImGui::PopItemWidth(); UIWidgets::CVarCombobox("Window Type", CVAR_TRACKER_CHECK("WindowType"), windowType, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) - .Color(THEME_COLOR).DefaultIndex(TRACKER_WINDOW_WINDOW)); - + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(TRACKER_WINDOW_WINDOW)); + if (CVarGetInteger(CVAR_TRACKER_CHECK("WindowType"), TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { - UIWidgets::CVarCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); - UIWidgets::CVarCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused"), UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Enable Dragging", CVAR_TRACKER_CHECK("Draggable"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); + UIWidgets::CVarCheckbox("Only enable while paused", CVAR_TRACKER_CHECK("ShowOnlyPaused"), + UIWidgets::CheckboxOptions().Color(THEME_COLOR)); UIWidgets::CVarCombobox("Display Mode", CVAR_TRACKER_CHECK("DisplayType"), displayType, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) - .Color(THEME_COLOR).DefaultIndex(0)); - if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(0)); + if (CVarGetInteger(CVAR_TRACKER_CHECK("DisplayType"), TRACKER_DISPLAY_ALWAYS) == + TRACKER_DISPLAY_COMBO_BUTTON) { UIWidgets::CVarCombobox("Combo Button 1", CVAR_TRACKER_CHECK("ComboButton1"), buttonStrings, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) - .Color(THEME_COLOR).DefaultIndex(TRACKER_COMBO_BUTTON_L)); + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(TRACKER_COMBO_BUTTON_L)); UIWidgets::CVarCombobox("Combo Button 2", CVAR_TRACKER_CHECK("ComboButton2"), buttonStrings, - UIWidgets::ComboboxOptions().LabelPosition(UIWidgets::LabelPositions::Far).ComponentAlignment(UIWidgets::ComponentAlignments::Right) - .Color(THEME_COLOR).DefaultIndex(TRACKER_COMBO_BUTTON_L)); + UIWidgets::ComboboxOptions() + .LabelPosition(UIWidgets::LabelPositions::Far) + .ComponentAlignment(UIWidgets::ComponentAlignments::Right) + .Color(THEME_COLOR) + .DefaultIndex(TRACKER_COMBO_BUTTON_L)); } } - UIWidgets::CVarCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers"), UIWidgets::CheckboxOptions() - .Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked.").Color(THEME_COLOR)); - if (UIWidgets::CVarCheckbox("Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), - UIWidgets::CheckboxOptions().Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles.").Color(THEME_COLOR))) { + UIWidgets::CVarCheckbox("Vanilla/MQ Dungeon Spoilers", CVAR_TRACKER_CHECK("MQSpoilers"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, Vanilla/MQ dungeons will show on the tracker immediately. " + "Otherwise, Vanilla/MQ dungeon locations must be unlocked.") + .Color(THEME_COLOR)); + if (UIWidgets::CVarCheckbox( + "Hide unshuffled shop item checks", CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles.") + .Color(THEME_COLOR))) { hideShopUnshuffledChecks = CVarGetInteger(CVAR_TRACKER_CHECK("HideUnshuffledShopChecks"), 0); UpdateFilters(); } - if (UIWidgets::CVarCheckbox("Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), - UIWidgets::CheckboxOptions().Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings.").Color(THEME_COLOR))) { + if (UIWidgets::CVarCheckbox( + "Always show gold skulltulas", CVAR_TRACKER_CHECK("AlwaysShowGSLocs"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will show GS locations in the tracker regardless of tokensanity settings.") + .Color(THEME_COLOR))) { alwaysShowGS = !alwaysShowGS; UpdateFilters(); } UIWidgets::CVarCheckbox("Show Logic", CVAR_TRACKER_CHECK("ShowLogic"), - UIWidgets::CheckboxOptions().Tooltip("If enabled, will show a check's logic when hovering over it.").Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will show a check's logic when hovering over it.") + .Color(THEME_COLOR)); if (UIWidgets::CVarCheckbox("Enable Available Checks", CVAR_TRACKER_CHECK("EnableAvailableChecks"), - UIWidgets::CheckboxOptions().Tooltip("If enabled, will show the checks that are available to be collected with your current progress.").Color(THEME_COLOR))) { + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will show the checks that are available to be collected " + "with your current progress.") + .Color(THEME_COLOR))) { enableAvailableChecks = CVarGetInteger(CVAR_TRACKER_CHECK("EnableAvailableChecks"), 0); RecalculateAvailableChecks(); } // Filtering settings UIWidgets::PaddedSeparator(); - UIWidgets::CVarCheckbox("Filter Empty Areas", CVAR_TRACKER_CHECK("HideFilteredAreas"), - UIWidgets::CheckboxOptions().Tooltip("If enabled, will hide area headers that have no locations matching filter").Color(THEME_COLOR).DefaultValue(true)); + UIWidgets::CVarCheckbox( + "Filter Empty Areas", CVAR_TRACKER_CHECK("HideFilteredAreas"), + UIWidgets::CheckboxOptions() + .Tooltip("If enabled, will hide area headers that have no locations matching filter") + .Color(THEME_COLOR) + .DefaultValue(true)); ImGui::TableNextColumn(); - CheckTracker::ImGuiDrawTwoColorPickerSection("Area Incomplete", CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), Color_Area_Incomplete_Main, Color_Area_Incomplete_Extra, Color_Main_Default, Color_Area_Incomplete_Extra_Default, CVAR_TRACKER_CHECK("AreaIncomplete.Hide"), "", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Area Complete", CVAR_TRACKER_CHECK("AreaComplete.MainColor"), CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), Color_Area_Complete_Main, Color_Area_Complete_Extra, Color_Main_Default, Color_Area_Complete_Extra_Default, CVAR_TRACKER_CHECK("AreaComplete.Hide"), "", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Unchecked", CVAR_TRACKER_CHECK("Unchecked.MainColor"), CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), Color_Unchecked_Main, Color_Unchecked_Extra, Color_Main_Default, Color_Unchecked_Extra_Default, CVAR_TRACKER_CHECK("Unchecked.Hide"), "Checks you have not interacted with at all.", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Skipped", CVAR_TRACKER_CHECK("Skipped.MainColor"), CVAR_TRACKER_CHECK("Skipped.ExtraColor"), Color_Skipped_Main, Color_Skipped_Extra, Color_Main_Default, Color_Skipped_Extra_Default, CVAR_TRACKER_CHECK("Skipped.Hide"), "", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Seen", CVAR_TRACKER_CHECK("Seen.MainColor"), CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Main, Color_Seen_Extra, Color_Main_Default, Color_Seen_Extra_Default, CVAR_TRACKER_CHECK("Seen.Hide"), "Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy mode.", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Scummed", CVAR_TRACKER_CHECK("Scummed.MainColor"), CVAR_TRACKER_CHECK("Scummed.ExtraColor"), Color_Scummed_Main, Color_Scummed_Extra, Color_Main_Default, Color_Scummed_Extra_Default, CVAR_TRACKER_CHECK("Scummed.Hide"), "Checks you collect, but then reload before saving so you no longer have them.", THEME_COLOR); - //CheckTracker::ImGuiDrawTwoColorPickerSection("Hinted (WIP)", CVAR_TRACKER_CHECK("Hinted.MainColor"), CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Main, Color_Hinted_Extra, Color_Main_Default, Color_Hinted_Extra_Default, CVAR_TRACKER_CHECK("Hinted.Hide"), "", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Collected", CVAR_TRACKER_CHECK("Collected.MainColor"), CVAR_TRACKER_CHECK("Collected.ExtraColor"), Color_Collected_Main, Color_Collected_Extra, Color_Main_Default, Color_Collected_Extra_Default, CVAR_TRACKER_CHECK("Collected.Hide"), "Checks you have collected without saving or reloading yet.", THEME_COLOR); - CheckTracker::ImGuiDrawTwoColorPickerSection("Saved", CVAR_TRACKER_CHECK("Saved.MainColor"), CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Main, Color_Saved_Extra, Color_Main_Default, Color_Saved_Extra_Default, CVAR_TRACKER_CHECK("Saved.Hide"), "Checks that you saved the game while having collected.", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Area Incomplete", CVAR_TRACKER_CHECK("AreaIncomplete.MainColor"), + CVAR_TRACKER_CHECK("AreaIncomplete.ExtraColor"), + Color_Area_Incomplete_Main, Color_Area_Incomplete_Extra, + Color_Main_Default, Color_Area_Incomplete_Extra_Default, + CVAR_TRACKER_CHECK("AreaIncomplete.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection("Area Complete", CVAR_TRACKER_CHECK("AreaComplete.MainColor"), + CVAR_TRACKER_CHECK("AreaComplete.ExtraColor"), + Color_Area_Complete_Main, Color_Area_Complete_Extra, + Color_Main_Default, Color_Area_Complete_Extra_Default, + CVAR_TRACKER_CHECK("AreaComplete.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Unchecked", CVAR_TRACKER_CHECK("Unchecked.MainColor"), CVAR_TRACKER_CHECK("Unchecked.ExtraColor"), + Color_Unchecked_Main, Color_Unchecked_Extra, Color_Main_Default, Color_Unchecked_Extra_Default, + CVAR_TRACKER_CHECK("Unchecked.Hide"), "Checks you have not interacted with at all.", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Skipped", CVAR_TRACKER_CHECK("Skipped.MainColor"), CVAR_TRACKER_CHECK("Skipped.ExtraColor"), + Color_Skipped_Main, Color_Skipped_Extra, Color_Main_Default, Color_Skipped_Extra_Default, + CVAR_TRACKER_CHECK("Skipped.Hide"), "", THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Seen", CVAR_TRACKER_CHECK("Seen.MainColor"), CVAR_TRACKER_CHECK("Seen.ExtraColor"), Color_Seen_Main, + Color_Seen_Extra, Color_Main_Default, Color_Seen_Extra_Default, CVAR_TRACKER_CHECK("Seen.Hide"), + "Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy " + "mode.", + THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Scummed", CVAR_TRACKER_CHECK("Scummed.MainColor"), CVAR_TRACKER_CHECK("Scummed.ExtraColor"), + Color_Scummed_Main, Color_Scummed_Extra, Color_Main_Default, Color_Scummed_Extra_Default, + CVAR_TRACKER_CHECK("Scummed.Hide"), + "Checks you collect, but then reload before saving so you no longer have them.", THEME_COLOR); + // CheckTracker::ImGuiDrawTwoColorPickerSection("Hinted (WIP)", CVAR_TRACKER_CHECK("Hinted.MainColor"), + // CVAR_TRACKER_CHECK("Hinted.ExtraColor"), Color_Hinted_Main, Color_Hinted_Extra, + // Color_Main_Default, Color_Hinted_Extra_Default, CVAR_TRACKER_CHECK("Hinted.Hide"), "", + // THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Collected", CVAR_TRACKER_CHECK("Collected.MainColor"), CVAR_TRACKER_CHECK("Collected.ExtraColor"), + Color_Collected_Main, Color_Collected_Extra, Color_Main_Default, Color_Collected_Extra_Default, + CVAR_TRACKER_CHECK("Collected.Hide"), "Checks you have collected without saving or reloading yet.", + THEME_COLOR); + CheckTracker::ImGuiDrawTwoColorPickerSection( + "Saved", CVAR_TRACKER_CHECK("Saved.MainColor"), CVAR_TRACKER_CHECK("Saved.ExtraColor"), Color_Saved_Main, + Color_Saved_Extra, Color_Main_Default, Color_Saved_Extra_Default, CVAR_TRACKER_CHECK("Saved.Hide"), + "Checks that you saved the game while having collected.", THEME_COLOR); ImGui::PopStyleVar(1); } @@ -2056,9 +2175,7 @@ void CheckTrackerWindow::InitElement() { sectionId = SaveManager::Instance->AddSaveFunction("trackerData", 1, SaveFile, true, SECTION_PARENT_NONE); SaveManager::Instance->AddLoadFunction("trackerData", 1, LoadFile); GameInteractor::Instance->RegisterGameHook(CheckTrackerLoadGame); - GameInteractor::Instance->RegisterGameHook([](uint32_t fileNum) { - Teardown(); - }); + GameInteractor::Instance->RegisterGameHook([](uint32_t fileNum) { Teardown(); }); GameInteractor::Instance->RegisterGameHook(CheckTrackerItemReceive); GameInteractor::Instance->RegisterGameHook(CheckTrackerTransition); GameInteractor::Instance->RegisterGameHook(CheckTrackerShopSlotChange); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index 962da88e3..d6fd503b3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -11,19 +11,19 @@ namespace CheckTracker { class CheckTrackerSettingsWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; - ~CheckTrackerSettingsWindow() {}; + ~CheckTrackerSettingsWindow(){}; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; class CheckTrackerWindow : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void Draw() override; - ~CheckTrackerWindow() {}; + ~CheckTrackerWindow(){}; protected: void InitElement() override; @@ -31,18 +31,18 @@ class CheckTrackerWindow : public Ship::GuiWindow { void UpdateElement() override; }; -//Converts an index into a Little Endian bitmask, as follows: -//00: 0000000100000000 -//01: 0000001000000000 +// Converts an index into a Little Endian bitmask, as follows: +// 00: 0000000100000000 +// 01: 0000001000000000 //... -//06: 0100000000000000 -//07: 1000000000000000 -//08: 0000000000000001 -//09: 0000000000000010 +// 06: 0100000000000000 +// 07: 1000000000000000 +// 08: 0000000000000001 +// 09: 0000000000000010 //... -//14: 0000000001000000 -//15: 0000000010000000 -//repeat... +// 14: 0000000001000000 +// 15: 0000000010000000 +// repeat... #define INDEX_TO_16BIT_LITTLE_ENDIAN_BITMASK(idx) (0x8000 >> (7 - (idx % 8) + ((idx % 16) / 8) * 8)) void Teardown(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 9d15c7cc1..3c7b433af 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -1,7 +1,8 @@ /* * Much of the code here was borrowed from https://github.com/gamestabled/OoT3D_Randomizer/blob/main/code/src/entrance.c - * It's been adapted for SoH to use our gPlayState vs their gGlobalContext with slightly different named properties, and our enums for some scenes/entrances. - * + * It's been adapted for SoH to use our gPlayState vs their gGlobalContext with slightly different named properties, and + * our enums for some scenes/entrances. + * * Unlike 3DS rando, we need to be able to support the user loading up vanilla and rando saves, so the logic around * modifying the entrance table requires that we save the original table and reset whenever loading a vanilla save. * A modified dynamicExitList is manually included since we can't read it from addressing like 3ds rando. @@ -18,8 +19,8 @@ extern PlayState* gPlayState; -//Overwrite the dynamic exit for the OGC Fairy Fountain to be 0x3E8 instead -//of 0x340 (0x340 will stay as the exit for the HC Fairy Fountain -> Castle Grounds) +// Overwrite the dynamic exit for the OGC Fairy Fountain to be 0x3E8 instead +// of 0x340 (0x340 will stay as the exit for the HC Fairy Fountain -> Castle Grounds) s16 dynamicExitList[] = { ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, @@ -45,12 +46,12 @@ s16 dynamicExitList[] = { // Owl Flights : 0x492064 and 0x492080 -static s16 entranceOverrideTable[ENTRANCE_TABLE_SIZE] = {0}; +static s16 entranceOverrideTable[ENTRANCE_TABLE_SIZE] = { 0 }; // Boss scenes (normalize boss scene range to 0 on lookup) mapped to save/death warp entrance -static s16 bossSceneSaveDeathWarps[SHUFFLEABLE_BOSS_COUNT] = {0}; -static ActorEntry modifiedLinkActorEntry = {0}; +static s16 bossSceneSaveDeathWarps[SHUFFLEABLE_BOSS_COUNT] = { 0 }; +static ActorEntry modifiedLinkActorEntry = { 0 }; -EntranceInfo originalEntranceTable[ENTRANCE_TABLE_SIZE] = {0}; +EntranceInfo originalEntranceTable[ENTRANCE_TABLE_SIZE] = { 0 }; typedef struct { s16 entryway; @@ -88,16 +89,16 @@ u8 Entrance_EntranceIsNull(EntranceOverride* entranceOverride) { } static void Entrance_SeparateOGCFairyFountainExit(void) { - //Overwrite unused entrance 0x03E8 (ENTR_POTION_SHOP_KAKARIKO_1) with values from 0x0340 (ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT) to use it as the - //exit from OGC Great Fairy Fountain -> Castle Grounds + // Overwrite unused entrance 0x03E8 (ENTR_POTION_SHOP_KAKARIKO_1) with values from 0x0340 + // (ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT) to use it as the exit from OGC Great Fairy Fountain -> Castle Grounds for (size_t i = 0; i < 4; ++i) { gEntranceTable[ENTR_POTION_SHOP_KAKARIKO_1 + i] = gEntranceTable[ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT + i]; } } static void Entrance_SeparateAdultSpawnAndPrelude() { - // Overwrite unused entrance 0x0282 (ENTR_HYRULE_FIELD_10) with values from 0x05F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD) to use it as the - // Adult Spawn index and separate it from Prelude of Light + // Overwrite unused entrance 0x0282 (ENTR_HYRULE_FIELD_10) with values from 0x05F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD) to + // use it as the Adult Spawn index and separate it from Prelude of Light for (size_t i = 0; i < 4; ++i) { gEntranceTable[ENTR_HYRULE_FIELD_10 + i] = gEntranceTable[ENTR_TEMPLE_OF_TIME_WARP_PAD + i]; } @@ -108,10 +109,12 @@ static void Entrance_ReplaceChildTempleWarps() { if (Randomizer_GetSettingValue(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF) { // Forest Temple - gEntranceTable[ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP] = gEntranceTable[ENTR_SACRED_FOREST_MEADOW_WARP_PAD]; + gEntranceTable[ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP] = + gEntranceTable[ENTR_SACRED_FOREST_MEADOW_WARP_PAD]; gEntranceTable[ENTR_SACRED_FOREST_MEADOW_3_1] = gEntranceTable[ENTR_SACRED_FOREST_MEADOW_2_1]; // Fire Temple - gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP] = gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD]; + gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP] = + gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD]; gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_5_1] = gEntranceTable[ENTR_DEATH_MOUNTAIN_CRATER_4_1]; // Water Temple gEntranceTable[ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP] = gEntranceTable[ENTR_LAKE_HYLIA_WARP_PAD]; @@ -149,7 +152,8 @@ void Entrance_Init(void) { if (Randomizer_GetSettingValue(RSK_SKIP_CHILD_STEALTH)) { gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].scene = SCENE_CASTLE_COURTYARD_ZELDA; gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].spawn = 0; - gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].field = ENTRANCE_INFO_FIELD(false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE); + gEntranceTable[ENTR_CASTLE_COURTYARD_GUARDS_DAY_0].field = + ENTRANCE_INFO_FIELD(false, false, TRANS_TYPE_FADE_WHITE, TRANS_TYPE_FADE_WHITE); } // Delete the title card and add a fade in for Hyrule Field from Ocarina of Time cutscene @@ -221,10 +225,10 @@ void Entrance_Init(void) { // Overwrite the indices which we want to shuffle, leaving the rest as they are entranceOverrideTable[originalIndex] = overrideIndex; - //Override both land and water entrances for Hyrule Field -> ZR Front and vice versa - if (originalIndex == ENTR_ZORAS_RIVER_WEST_EXIT) { //Hyrule Field -> ZR Front land entrance + // Override both land and water entrances for Hyrule Field -> ZR Front and vice versa + if (originalIndex == ENTR_ZORAS_RIVER_WEST_EXIT) { // Hyrule Field -> ZR Front land entrance entranceOverrideTable[ENTR_ZORAS_RIVER_3] = overrideIndex; - } else if (originalIndex == ENTR_HYRULE_FIELD_RIVER_EXIT) { //ZR Front -> Hyrule Field land entrance + } else if (originalIndex == ENTR_HYRULE_FIELD_RIVER_EXIT) { // ZR Front -> Hyrule Field land entrance entranceOverrideTable[ENTR_HYRULE_FIELD_14] = overrideIndex; } } @@ -276,7 +280,9 @@ s16 Entrance_PeekNextIndexOverride(int16_t nextEntranceIndex) { s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) { // Exiting through the crawl space from Hyrule Castle courtyard is the same exit as leaving Ganon's castle // Don't override the entrance if we came from the Castle courtyard (day and night scenes) - if (gPlayState != NULL && (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) && + if (gPlayState != NULL && + (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || + gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) && nextEntranceIndex == ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT) { return nextEntranceIndex; } @@ -323,37 +329,38 @@ void Entrance_SetGameOverEntrance(void) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF && scene >= SCENE_DEKU_TREE_BOSS && scene <= SCENE_SHADOW_TEMPLE_BOSS) { // Normalize boss scene range to 0 on lookup and handle for grotto entrances - gSaveContext.entranceIndex = Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); + gSaveContext.entranceIndex = + Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); return; } - //Set the current entrance depending on which entrance the player last came through + // Set the current entrance depending on which entrance the player last came through switch (gSaveContext.entranceIndex) { - case ENTR_DEKU_TREE_BOSS_ENTRANCE : //Deku Tree Boss Room + case ENTR_DEKU_TREE_BOSS_ENTRANCE: // Deku Tree Boss Room gSaveContext.entranceIndex = ENTR_DEKU_TREE_ENTRANCE; return; - case ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE : //Dodongos Cavern Boss Room + case ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE: // Dodongos Cavern Boss Room gSaveContext.entranceIndex = ENTR_DODONGOS_CAVERN_ENTRANCE; return; - case ENTR_JABU_JABU_BOSS_ENTRANCE : //Jabu Jabus Belly Boss Room + case ENTR_JABU_JABU_BOSS_ENTRANCE: // Jabu Jabus Belly Boss Room gSaveContext.entranceIndex = ENTR_JABU_JABU_ENTRANCE; return; - case ENTR_FOREST_TEMPLE_BOSS_ENTRANCE : //Forest Temple Boss Room + case ENTR_FOREST_TEMPLE_BOSS_ENTRANCE: // Forest Temple Boss Room gSaveContext.entranceIndex = ENTR_FOREST_TEMPLE_ENTRANCE; return; - case ENTR_FIRE_TEMPLE_BOSS_ENTRANCE : //Fire Temple Boss Room + case ENTR_FIRE_TEMPLE_BOSS_ENTRANCE: // Fire Temple Boss Room gSaveContext.entranceIndex = ENTR_FIRE_TEMPLE_ENTRANCE; return; - case ENTR_WATER_TEMPLE_BOSS_ENTRANCE : //Water Temple Boss Room + case ENTR_WATER_TEMPLE_BOSS_ENTRANCE: // Water Temple Boss Room gSaveContext.entranceIndex = ENTR_WATER_TEMPLE_ENTRANCE; return; - case ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE : //Spirit Temple Boss Room + case ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE: // Spirit Temple Boss Room gSaveContext.entranceIndex = ENTR_SPIRIT_TEMPLE_ENTRANCE; return; - case ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE : //Shadow Temple Boss Room + case ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE: // Shadow Temple Boss Room gSaveContext.entranceIndex = ENTR_SHADOW_TEMPLE_ENTRANCE; return; - case ENTR_GANONDORF_BOSS_0 : //Ganondorf Boss Room + case ENTR_GANONDORF_BOSS_0: // Ganondorf Boss Room gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb return; } @@ -368,7 +375,8 @@ void Entrance_SetSavewarpEntrance(void) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF && scene >= SCENE_DEKU_TREE_BOSS && scene <= SCENE_SHADOW_TEMPLE_BOSS) { // Normalize boss scene range to 0 on lookup and handle for grotto entrances - gSaveContext.entranceIndex = Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); + gSaveContext.entranceIndex = + Grotto_OverrideSpecialEntrance(bossSceneSaveDeathWarps[scene - SCENE_DEKU_TREE_BOSS]); return; } @@ -378,15 +386,15 @@ void Entrance_SetSavewarpEntrance(void) { gSaveContext.entranceIndex = ENTR_DODONGOS_CAVERN_ENTRANCE; } else if (scene == SCENE_JABU_JABU || scene == SCENE_JABU_JABU_BOSS) { gSaveContext.entranceIndex = ENTR_JABU_JABU_ENTRANCE; - } else if (scene == SCENE_FOREST_TEMPLE || scene == SCENE_FOREST_TEMPLE_BOSS) { //Forest Temple Boss Room + } else if (scene == SCENE_FOREST_TEMPLE || scene == SCENE_FOREST_TEMPLE_BOSS) { // Forest Temple Boss Room gSaveContext.entranceIndex = ENTR_FOREST_TEMPLE_ENTRANCE; - } else if (scene == SCENE_FIRE_TEMPLE || scene == SCENE_FIRE_TEMPLE_BOSS) { //Fire Temple Boss Room + } else if (scene == SCENE_FIRE_TEMPLE || scene == SCENE_FIRE_TEMPLE_BOSS) { // Fire Temple Boss Room gSaveContext.entranceIndex = ENTR_FIRE_TEMPLE_ENTRANCE; - } else if (scene == SCENE_WATER_TEMPLE || scene == SCENE_WATER_TEMPLE_BOSS) { //Water Temple Boss Room + } else if (scene == SCENE_WATER_TEMPLE || scene == SCENE_WATER_TEMPLE_BOSS) { // Water Temple Boss Room gSaveContext.entranceIndex = ENTR_WATER_TEMPLE_ENTRANCE; - } else if (scene == SCENE_SPIRIT_TEMPLE || scene == SCENE_SPIRIT_TEMPLE_BOSS) { //Spirit Temple Boss Room + } else if (scene == SCENE_SPIRIT_TEMPLE || scene == SCENE_SPIRIT_TEMPLE_BOSS) { // Spirit Temple Boss Room gSaveContext.entranceIndex = ENTR_SPIRIT_TEMPLE_ENTRANCE; - } else if (scene == SCENE_SHADOW_TEMPLE || scene == SCENE_SHADOW_TEMPLE_BOSS) { //Shadow Temple Boss Room + } else if (scene == SCENE_SHADOW_TEMPLE || scene == SCENE_SHADOW_TEMPLE_BOSS) { // Shadow Temple Boss Room gSaveContext.entranceIndex = ENTR_SHADOW_TEMPLE_ENTRANCE; } else if (scene == SCENE_BOTTOM_OF_THE_WELL) { // BOTW gSaveContext.entranceIndex = ENTR_BOTTOM_OF_THE_WELL_ENTRANCE; @@ -396,24 +404,29 @@ void Entrance_SetSavewarpEntrance(void) { gSaveContext.entranceIndex = ENTR_ICE_CAVERN_ENTRANCE; } else if (scene == SCENE_INSIDE_GANONS_CASTLE) { gSaveContext.entranceIndex = ENTR_INSIDE_GANONS_CASTLE_ENTRANCE; - } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || scene == SCENE_GANON_BOSS || scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { - gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb - } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout + } else if (scene == SCENE_GANONS_TOWER || scene == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || + scene == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || scene == SCENE_GANON_BOSS || + scene == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { + gSaveContext.entranceIndex = ENTR_GANONS_TOWER_0; // Inside Ganon's Castle -> Ganon's Tower Climb + } else if (scene == SCENE_THIEVES_HIDEOUT) { // Theives hideout gSaveContext.entranceIndex = ENTR_THIEVES_HIDEOUT_0; // Gerudo Fortress -> Thieve's Hideout spawn 0 } else if (scene == SCENE_LINKS_HOUSE && Randomizer_GetSettingValue(RSK_SHUFFLE_INTERIOR_ENTRANCES) != RO_INTERIOR_ENTRANCE_SHUFFLE_ALL) { // Save warping in Link's house keeps the player there if Link's house not shuffled, // otherwise fallback to regular spawns gSaveContext.entranceIndex = ENTR_LINKS_HOUSE_CHILD_SPAWN; - } else if (CVarGetInteger(CVAR_ENHANCEMENT("RememberSaveLocation"), 0) && scene != SCENE_FAIRYS_FOUNTAIN && scene != SCENE_GROTTOS && - gSaveContext.entranceIndex != ENTR_LOAD_OPENING) { + } else if (CVarGetInteger(CVAR_ENHANCEMENT("RememberSaveLocation"), 0) && scene != SCENE_FAIRYS_FOUNTAIN && + scene != SCENE_GROTTOS && gSaveContext.entranceIndex != ENTR_LOAD_OPENING) { // Use the saved entrance value with remember save location, except when in grottos/fairy fountains or if // the entrance index is -1 (new save) return; } else if (LINK_IS_CHILD) { gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_LINKS_HOUSE_CHILD_SPAWN); // Child Overworld Spawn } else { - gSaveContext.entranceIndex = Entrance_OverrideNextIndex(ENTR_HYRULE_FIELD_10); // Adult Overworld Spawn (Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD), but 0x282 (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which also uses 0x5F4) + gSaveContext.entranceIndex = Entrance_OverrideNextIndex( + ENTR_HYRULE_FIELD_10); // Adult Overworld Spawn (Normally 0x5F4 (ENTR_TEMPLE_OF_TIME_WARP_PAD), but 0x282 + // (ENTR_HYRULE_FIELD_10) has been repurposed to differentiate from Prelude which + // also uses 0x5F4) } } @@ -471,14 +484,14 @@ void Entrance_OverrideBlueWarp(void) { } switch (gSaveContext.entranceIndex) { - case ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP: // Gohma blue warp - case ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP: // KD blue warp - case ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP: // Barinade blue warp + case ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP: // Gohma blue warp + case ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP: // KD blue warp + case ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP: // Barinade blue warp case ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP: // Phantom Ganon blue warp - case ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP: // Volvagia blue warp - case ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP: // Morpha blue warp - case ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP: // Bongo-Bongo blue warp - case ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP: // Twinrova blue warp + case ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP: // Volvagia blue warp + case ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP: // Morpha blue warp + case ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP: // Bongo-Bongo blue warp + case ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP: // Twinrova blue warp gSaveContext.entranceIndex = Entrance_OverrideNextIndex(gSaveContext.entranceIndex); return; } @@ -488,16 +501,18 @@ void Entrance_EnableFW(void) { Player* player = GET_PLAYER(gPlayState); // Leave restriction in Tower Collapse Interior, Castle Collapse, Treasure Box Shop, Tower Collapse Exterior, // Grottos area, Fishing Pond, Ganon Battle and for states that disable buttons. - if (!false /* farores wind anywhere */ || - gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || + if (!false /* farores wind anywhere */ || gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR || + gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE || (gPlayState->sceneNum == SCENE_TREASURE_BOX_SHOP && !false /* shuffled chest mini game */) || gPlayState->sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR || gPlayState->sceneNum == SCENE_GROTTOS || gPlayState->sceneNum == SCENE_FISHING_POND || gPlayState->sceneNum == SCENE_GANON_BOSS || - gSaveContext.eventInf[0] & 0x1 || // Ingo's Minigame state - player->stateFlags1 & (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LADDER | PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_WATER) || // Swimming, riding horse, Down A, hanging from a ledge - player->stateFlags2 & PLAYER_STATE2_CRAWLING // Blank A + gSaveContext.eventInf[0] & 0x1 || // Ingo's Minigame state + player->stateFlags1 & + (PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LADDER | PLAYER_STATE1_ON_HORSE | + PLAYER_STATE1_IN_WATER) || // Swimming, riding horse, Down A, hanging from a ledge + player->stateFlags2 & PLAYER_STATE2_CRAWLING // Blank A // Shielding, spinning and getting skull tokens still disable buttons automatically - ) { + ) { return; } @@ -512,8 +527,8 @@ void Entrance_EnableFW(void) { void Entrance_HandleEponaState(void) { s32 entrance = gPlayState->nextEntranceIndex; Player* player = GET_PLAYER(gPlayState); - //If Link is riding Epona but he's about to go through an entrance where she can't spawn, - //unset the Epona flag to avoid Master glitch, and restore temp B. + // If Link is riding Epona but he's about to go through an entrance where she can't spawn, + // unset the Epona flag to avoid Master glitch, and restore temp B. if (Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES) && (player->stateFlags1 & PLAYER_STATE1_ON_HORSE)) { // Allow Master glitch to be performed on the Thieves Hideout entrance if (entrance == Entrance_GetOverride(ENTR_THIEVES_HIDEOUT_4)) { // Gerudo Fortress -> Theives Hideout @@ -521,27 +536,27 @@ void Entrance_HandleEponaState(void) { } static const s16 validEponaEntrances[] = { - ENTR_LAKE_HYLIA_NORTH_EXIT, // Hyrule Field -> Lake Hylia - ENTR_HYRULE_FIELD_FENCE_EXIT, // Lake Hylia -> Hyrule Field - ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, // LH Fishing Hole -> LH Fishing Island - ENTR_LAKE_HYLIA_OUTSIDE_LAB, // LH Lab -> Lake Hylia - ENTR_GERUDO_VALLEY_EAST_EXIT, // Hyrule Field -> Gerudo Valley - ENTR_HYRULE_FIELD_ROCKY_PATH, // Gerudo Valley -> Hyrule Field - ENTR_LON_LON_RANCH_ENTRANCE, // Hyrule Field -> Lon Lon Ranch - ENTR_HYRULE_FIELD_CENTER_EXIT, // Lon Lon Ranch -> Hyrule Field - ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, // Market Entrance -> Hyrule Field - ENTR_HYRULE_FIELD_RIVER_EXIT, // ZR Front -> Hyrule Field - ENTR_HYRULE_FIELD_WOODED_EXIT, // LW Bridge -> Hyrule Field - ENTR_GERUDOS_FORTRESS_EAST_EXIT, // GV Fortress Side -> Gerudo Fortress - ENTR_GERUDO_VALLEY_WEST_EXIT, // Gerudo Fortress -> GV Fortress Side - ENTR_GERUDO_VALLEY_OUTSIDE_TENT, // GV Carpenter Tent -> GV Fortress Side - ENTR_LON_LON_RANCH_OUTSIDE_STABLES, // LLR Stables -> Lon Lon Ranch - ENTR_LON_LON_RANCH_OUTSIDE_TOWER, // LLR Tower -> Lon Lon Ranch - ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, // LLR Talons House -> Lon Lon Ranch - ENTR_HYRULE_FIELD_11, // LLR Southern Fence Jump - ENTR_HYRULE_FIELD_12, // LLR Western Fence Jump - ENTR_HYRULE_FIELD_13, // LLR Eastern Fence Jump - ENTR_HYRULE_FIELD_15, // LLR Front Gate Jump + ENTR_LAKE_HYLIA_NORTH_EXIT, // Hyrule Field -> Lake Hylia + ENTR_HYRULE_FIELD_FENCE_EXIT, // Lake Hylia -> Hyrule Field + ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, // LH Fishing Hole -> LH Fishing Island + ENTR_LAKE_HYLIA_OUTSIDE_LAB, // LH Lab -> Lake Hylia + ENTR_GERUDO_VALLEY_EAST_EXIT, // Hyrule Field -> Gerudo Valley + ENTR_HYRULE_FIELD_ROCKY_PATH, // Gerudo Valley -> Hyrule Field + ENTR_LON_LON_RANCH_ENTRANCE, // Hyrule Field -> Lon Lon Ranch + ENTR_HYRULE_FIELD_CENTER_EXIT, // Lon Lon Ranch -> Hyrule Field + ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, // Market Entrance -> Hyrule Field + ENTR_HYRULE_FIELD_RIVER_EXIT, // ZR Front -> Hyrule Field + ENTR_HYRULE_FIELD_WOODED_EXIT, // LW Bridge -> Hyrule Field + ENTR_GERUDOS_FORTRESS_EAST_EXIT, // GV Fortress Side -> Gerudo Fortress + ENTR_GERUDO_VALLEY_WEST_EXIT, // Gerudo Fortress -> GV Fortress Side + ENTR_GERUDO_VALLEY_OUTSIDE_TENT, // GV Carpenter Tent -> GV Fortress Side + ENTR_LON_LON_RANCH_OUTSIDE_STABLES, // LLR Stables -> Lon Lon Ranch + ENTR_LON_LON_RANCH_OUTSIDE_TOWER, // LLR Tower -> Lon Lon Ranch + ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, // LLR Talons House -> Lon Lon Ranch + ENTR_HYRULE_FIELD_11, // LLR Southern Fence Jump + ENTR_HYRULE_FIELD_12, // LLR Western Fence Jump + ENTR_HYRULE_FIELD_13, // LLR Eastern Fence Jump + ENTR_HYRULE_FIELD_15, // LLR Front Gate Jump // The following indices currently aren't randomized, but we'll list // them in case they ever are. They're all Theives Hideout -> Gerudo Fortress ENTR_GERUDOS_FORTRESS_1, @@ -584,9 +599,9 @@ void Entrance_OverrideWeatherState() { return; } // Lon Lon Ranch (No Epona) - if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)){ // if you don't have Epona + if (!Flags_GetEventChkInf(EVENTCHKINF_EPONA_OBTAINED)) { // if you don't have Epona switch (gSaveContext.entranceIndex) { - case ENTR_LON_LON_RANCH_ENTRANCE: // Lon Lon Ranch from HF + case ENTR_LON_LON_RANCH_ENTRANCE: // Lon Lon Ranch from HF case ENTR_HYRULE_FIELD_CENTER_EXIT: // Hyrule Field from LLR gWeatherMode = 2; return; @@ -595,14 +610,14 @@ void Entrance_OverrideWeatherState() { // Water Temple if (!Flags_GetEventChkInf(EVENTCHKINF_USED_WATER_TEMPLE_BLUE_WARP)) { // have not beaten Water Temple switch (gSaveContext.entranceIndex) { - case ENTR_ZORAS_RIVER_WATERFALL_EXIT: // Zora River from behind waterfall + case ENTR_ZORAS_RIVER_WATERFALL_EXIT: // Zora River from behind waterfall case ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT: // Zora River from LW water shortcut - case ENTR_LOST_WOODS_UNDERWATER_SHORTCUT: // Lost Woods water shortcut from ZR + case ENTR_LOST_WOODS_UNDERWATER_SHORTCUT: // Lost Woods water shortcut from ZR gWeatherMode = 3; return; } switch (gPlayState->sceneNum) { - case SCENE_ZORAS_DOMAIN: // Zora's Domain + case SCENE_ZORAS_DOMAIN: // Zora's Domain case SCENE_ZORAS_FOUNTAIN: // Zora's Fountain gWeatherMode = 3; return; @@ -610,15 +625,15 @@ void Entrance_OverrideWeatherState() { } // Kakariko Thunderstorm if (((gSaveContext.inventory.questItems & 0x7) == 0x7) && // Have forest, fire, and water medallion - !(gSaveContext.sceneFlags[24].clear & 0x02)) { // have not beaten Bongo Bongo + !(gSaveContext.sceneFlags[24].clear & 0x02)) { // have not beaten Bongo Bongo switch (gPlayState->sceneNum) { case SCENE_KAKARIKO_VILLAGE: // Kakariko - case SCENE_GRAVEYARD: // Graveyard + case SCENE_GRAVEYARD: // Graveyard gPlayState->envCtx.gloomySkyMode = 2; switch (gSaveContext.entranceIndex) { case ENTR_KAKARIKO_VILLAGE_FRONT_GATE: // Kakariko from HF case ENTR_KAKARIKO_VILLAGE_GUARD_GATE: // Kakariko from Death Mountain Trail - case ENTR_GRAVEYARD_OUTSIDE_TEMPLE: // Graveyard from Shadow Temple + case ENTR_GRAVEYARD_OUTSIDE_TEMPLE: // Graveyard from Shadow Temple break; default: gWeatherMode = 5; @@ -627,21 +642,21 @@ void Entrance_OverrideWeatherState() { } } // Death Mountain Cloudy - if (!Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) { // have not beaten Fire Temple + if (!Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP)) { // have not beaten Fire Temple if (gPlayState->nextEntranceIndex == ENTR_LOST_WOODS_TUNNEL_SHORTCUT) { // Lost Woods Goron City Shortcut gWeatherMode = 2; return; } switch (gPlayState->sceneNum) { - case SCENE_KAKARIKO_VILLAGE: // Kakariko - case SCENE_GRAVEYARD: // Graveyard - case SCENE_DEATH_MOUNTAIN_TRAIL: // Death Mountain Trail + case SCENE_KAKARIKO_VILLAGE: // Kakariko + case SCENE_GRAVEYARD: // Graveyard + case SCENE_DEATH_MOUNTAIN_TRAIL: // Death Mountain Trail case SCENE_DEATH_MOUNTAIN_CRATER: // Death Mountain Crater if (!gPlayState->envCtx.gloomySkyMode) { gPlayState->envCtx.gloomySkyMode = 1; } switch (gSaveContext.entranceIndex) { - case ENTR_KAKARIKO_VILLAGE_FRONT_GATE: // Kakariko from HF + case ENTR_KAKARIKO_VILLAGE_FRONT_GATE: // Kakariko from HF case ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT: // Kakariko from Graveyard break; default: @@ -653,16 +668,17 @@ void Entrance_OverrideWeatherState() { } // Rectify the "Getting Caught By Gerudo" entrance index if necessary, based on the age and current scene -// In ER, Adult should be placed at the fortress entrance when getting caught in the fortress without a hookshot, instead of being thrown in the valley -// Child should always be thrown in the stream when caught in the valley, and placed at the fortress entrance from valley when caught in the fortress +// In ER, Adult should be placed at the fortress entrance when getting caught in the fortress without a hookshot, +// instead of being thrown in the valley Child should always be thrown in the stream when caught in the valley, and +// placed at the fortress entrance from valley when caught in the fortress void Entrance_OverrideGeurdoGuardCapture(void) { if (LINK_IS_CHILD) { gPlayState->nextEntranceIndex = ENTR_GERUDO_VALLEY_1; // Geurdo Valley thrown out } if ((LINK_IS_CHILD || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) && - gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Geurdo Valley thrown out - if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Geurdo Valley + gPlayState->nextEntranceIndex == ENTR_GERUDO_VALLEY_1) { // Geurdo Valley thrown out + if (gPlayState->sceneNum != SCENE_GERUDO_VALLEY) { // Geurdo Valley gPlayState->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_EAST_EXIT; // Gerudo Fortress } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.h b/soh/soh/Enhancements/randomizer/randomizer_entrance.h index d2c8c79cb..ca840f396 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.h @@ -3,8 +3,8 @@ #include -//Entrance Table Data: https://wiki.cloudmodding.com/oot/Entrance_Table_(Data) -//Accessed June 2021, published content date at the time was 14 March 2020, at 21:47 +// Entrance Table Data: https://wiki.cloudmodding.com/oot/Entrance_Table_(Data) +// Accessed June 2021, published content date at the time was 14 March 2020, at 21:47 #define ENTRANCE_TABLE_SIZE ENTR_MAX @@ -13,12 +13,12 @@ #define SHUFFLEABLE_BOSS_COUNT 8 #define SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT 66 // Max entrance rando index is 0x0820, (2080 / 32 == 65) + 1 -#define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 // Max scene ID is 0x6E, (110 / 32 == 3) + 1 +#define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 // Max scene ID is 0x6E, (110 / 32 == 3) + 1 -#define ENTRANCE_INFO_FIELD(continueBgm, displayTitleCard, endTransType, startTransType) \ - (((continueBgm) ? ENTRANCE_INFO_CONTINUE_BGM_FLAG : 0) | \ - ((displayTitleCard) ? ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG : 0) | \ - (((endTransType) << ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_END_TRANS_TYPE_MASK) | \ +#define ENTRANCE_INFO_FIELD(continueBgm, displayTitleCard, endTransType, startTransType) \ + (((continueBgm) ? ENTRANCE_INFO_CONTINUE_BGM_FLAG : 0) | \ + ((displayTitleCard) ? ENTRANCE_INFO_DISPLAY_TITLE_CARD_FLAG : 0) | \ + (((endTransType) << ENTRANCE_INFO_END_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_END_TRANS_TYPE_MASK) | \ (((startTransType) << ENTRANCE_INFO_START_TRANS_TYPE_SHIFT) & ENTRANCE_INFO_START_TRANS_TYPE_MASK)) typedef struct { diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp index 0876f48ff..9170e8c67 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.cpp @@ -27,13 +27,13 @@ extern PlayState* gPlayState; #define COLOR_GREEN IM_COL32(0, 158, 115, 255) #define COLOR_GRAY IM_COL32(155, 155, 155, 255) -EntranceOverride srcListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceOverride destListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceOverride srcListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceOverride destListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = {0}; -EntranceTrackingData gEntranceTrackingData = {0}; +EntranceOverride srcListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceOverride destListSortedByArea[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceOverride srcListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceOverride destListSortedByType[ENTRANCE_OVERRIDES_MAX_COUNT] = { 0 }; +EntranceTrackingData gEntranceTrackingData = { 0 }; -static const EntranceOverride emptyOverride = {0}; +static const EntranceOverride emptyOverride = { 0 }; static s16 lastEntranceIndex = -1; static s16 currentGrottoId = -1; @@ -64,15 +64,11 @@ static std::string spoilerEntranceGroupNames[] = { }; static std::string groupTypeNames[] = { - "One Way", - "Overworld", - "Interior", - "Grotto", - "Dungeon", + "One Way", "Overworld", "Interior", "Grotto", "Dungeon", }; -// Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and meta search tags -// ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer +// Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and +// meta search tags ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer const EntranceData entranceData[] = { // clang-format off //index, reverse, scenes (and spawns), source name, destination name, source group, destination group, type, metaTag, oneExit @@ -428,9 +424,11 @@ bool IsEntranceDiscovered(s16 index) { if (!isDiscovered) { // If the pair included one of the hyrule field <-> zora's river entrances, // the randomizer will have also overriden the water-based entrances, so check those too - if ((index == ENTR_ZORAS_RIVER_WEST_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_3)) || (index == ENTR_ZORAS_RIVER_3 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_WEST_EXIT))) { + if ((index == ENTR_ZORAS_RIVER_WEST_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_3)) || + (index == ENTR_ZORAS_RIVER_3 && Entrance_GetIsEntranceDiscovered(ENTR_ZORAS_RIVER_WEST_EXIT))) { isDiscovered = true; - } else if ((index == ENTR_HYRULE_FIELD_RIVER_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_14)) || (index == ENTR_HYRULE_FIELD_14 && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_RIVER_EXIT))) { + } else if ((index == ENTR_HYRULE_FIELD_RIVER_EXIT && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_14)) || + (index == ENTR_HYRULE_FIELD_14 && Entrance_GetIsEntranceDiscovered(ENTR_HYRULE_FIELD_RIVER_EXIT))) { isDiscovered = true; } } @@ -447,16 +445,18 @@ 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 +// 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:"); + 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); + SPDLOG_ERROR("{}({}) -> {}({})", entrance->source, entrance->index, reverse->destination, + reverse->reverseIndex); } } } @@ -590,12 +590,12 @@ void ClearEntranceTrackingData() { currentGrottoId = -1; lastEntranceIndex = -1; lastSceneOrEntranceDetected = -1; - gEntranceTrackingData = {0}; + gEntranceTrackingData = { 0 }; } void InitEntranceTrackingData() { auto entranceCtx = Rando::Context::GetInstance()->GetEntranceShuffler(); - gEntranceTrackingData = {0}; + gEntranceTrackingData = { 0 }; // Check if entrance randomization is disabled if (!OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ENTRANCES)) { @@ -668,7 +668,8 @@ void EntranceTrackerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); - if (ImGui::BeginTable("entranceTrackerSubSettings", 2, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingStretchProp)) { + if (ImGui::BeginTable("entranceTrackerSubSettings", 2, + ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingStretchProp)) { ImGui::TableSetupColumn("column 1", ImGuiTableColumnFlags_WidthStretch, 150.0f); ImGui::TableSetupColumn("column 2", ImGuiTableColumnFlags_WidthStretch, 150.0f); @@ -676,26 +677,41 @@ void EntranceTrackerSettingsWindow::DrawElement() { ImGui::Text("Sort By"); UIWidgets::CVarRadioButton("To", CVAR_TRACKER_ENTRANCE("SortBy"), 0, - UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR).Tooltip("Sort entrances by the original source entrance")); - UIWidgets::CVarRadioButton("From", CVAR_TRACKER_ENTRANCE("SortBy"), 1, - UIWidgets::RadioButtonsOptions() - .Color(THEME_COLOR).Tooltip("Sort entrances by the overrided destination")); + UIWidgets::RadioButtonsOptions() + .Color(THEME_COLOR) + .Tooltip("Sort entrances by the original source entrance")); + UIWidgets::CVarRadioButton( + "From", CVAR_TRACKER_ENTRANCE("SortBy"), 1, + UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Sort entrances by the overrided destination")); ImGui::Text("List Items"); - UIWidgets::CVarCheckbox("Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), - UIWidgets::CheckboxOptions().Tooltip("Automatically scroll to the first available entrance in the current scene").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox( + "Auto scroll", CVAR_TRACKER_ENTRANCE("AutoScroll"), + UIWidgets::CheckboxOptions() + .Tooltip("Automatically scroll to the first available entrance in the current scene") + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Highlight previous", CVAR_TRACKER_ENTRANCE("HighlightPrevious"), - UIWidgets::CheckboxOptions().Tooltip("Highlight the previous entrance that Link came from").Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("Highlight the previous entrance that Link came from") + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Highlight available", CVAR_TRACKER_ENTRANCE("HighlightAvailable"), - UIWidgets::CheckboxOptions().Tooltip("Highlight available entrances in the current scene").Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("Highlight available entrances in the current scene") + .Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Hide undiscovered", CVAR_TRACKER_ENTRANCE("CollapseUndiscovered"), - UIWidgets::CheckboxOptions().Tooltip("Collapse undiscovered entrances towards the bottom of each group").Color(THEME_COLOR)); - bool disableHideReverseEntrances = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_ON; - static const char* disableHideReverseEntrancesText = "This option is disabled because \"Decouple Entrances\" is enabled."; + UIWidgets::CheckboxOptions() + .Tooltip("Collapse undiscovered entrances towards the bottom of each group") + .Color(THEME_COLOR)); + bool disableHideReverseEntrances = + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_ON; + static const char* disableHideReverseEntrancesText = + "This option is disabled because \"Decouple Entrances\" is enabled."; UIWidgets::CVarCheckbox("Hide reverse", CVAR_TRACKER_ENTRANCE("HideReverseEntrances"), - UIWidgets::CheckboxOptions({ {.disabled = disableHideReverseEntrances, .disabledTooltip = disableHideReverseEntrancesText }}) - .Tooltip("Hide reverse entrance transitions when Decouple Entrances is off").DefaultValue(true).Color(THEME_COLOR)); + UIWidgets::CheckboxOptions({ { .disabled = disableHideReverseEntrances, + .disabledTooltip = disableHideReverseEntrancesText } }) + .Tooltip("Hide reverse entrance transitions when Decouple Entrances is off") + .DefaultValue(true) + .Color(THEME_COLOR)); ImGui::TableNextColumn(); @@ -708,10 +724,13 @@ void EntranceTrackerSettingsWindow::DrawElement() { UIWidgets::RadioButtonsOptions().Color(THEME_COLOR).Tooltip("Group entrances by their entrance type")); ImGui::Text("Spoiler Reveal"); - UIWidgets::CVarCheckbox("Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"), - UIWidgets::CheckboxOptions().Tooltip("Reveal the sourcefor undiscovered entrances").Color(THEME_COLOR)); + UIWidgets::CVarCheckbox( + "Show Source", CVAR_TRACKER_ENTRANCE("ShowFrom"), + UIWidgets::CheckboxOptions().Tooltip("Reveal the sourcefor undiscovered entrances").Color(THEME_COLOR)); UIWidgets::CVarCheckbox("Show Destination", CVAR_TRACKER_ENTRANCE("ShowTo"), - UIWidgets::CheckboxOptions().Tooltip("Reveal the destination for undiscovered entrances").Color(THEME_COLOR)); + UIWidgets::CheckboxOptions() + .Tooltip("Reveal the destination for undiscovered entrances") + .Color(THEME_COLOR)); ImGui::EndTable(); } @@ -745,18 +764,21 @@ void EntranceTrackerWindow::DrawElement() { static ImGuiTextFilter locationSearch; uint8_t nextTreeState = 0; - if (UIWidgets::Button("Collapse All", UIWidgets::ButtonOptions({{ .tooltip = "Collapse all entrance groups" }}) - .Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Collapse All", UIWidgets::ButtonOptions({ { .tooltip = "Collapse all entrance groups" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { nextTreeState = 1; } ImGui::SameLine(); - if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions({{ .tooltip = "Expand all entrance groups" }}) - .Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Expand All", UIWidgets::ButtonOptions({ { .tooltip = "Expand all entrance groups" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { nextTreeState = 2; } ImGui::SameLine(); - if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({{ .tooltip = "Clear the search field" }}) - .Color(THEME_COLOR).Size(UIWidgets::Sizes::Inline))) { + if (UIWidgets::Button("Clear", UIWidgets::ButtonOptions({ { .tooltip = "Clear the search field" } }) + .Color(THEME_COLOR) + .Size(UIWidgets::Sizes::Inline))) { locationSearch.Clear(); } @@ -774,7 +796,7 @@ void EntranceTrackerWindow::DrawElement() { size_t groupCount = groupToggle ? ENTRANCE_TYPE_COUNT : SPOILER_ENTRANCE_GROUP_COUNT; auto groupNames = groupToggle ? groupTypeNames : spoilerEntranceGroupNames; - EntranceOverride *entranceList; + EntranceOverride* entranceList; switch (groupType) { case ENTRANCE_SOURCE_AREA: @@ -819,14 +841,17 @@ void EntranceTrackerWindow::DrawElement() { const EntranceData* original = GetEntranceData(entrance.index); const EntranceData* override = GetEntranceData(entrance.override); - // If entrance is a dungeon, grotto, or interior entrance, the transition into that area has oneExit set, which means we can filter the return transitions as redundant - // if entrances are not decoupled, as this is redundant information. Also checks a setting, enabled by default, for hiding them. - // If all of these conditions are met, we skip adding this entrance to any lists. - // However, if entrances are decoupled, then all transitions need to be displayed, so we proceed with the filtering - if ((original->type == ENTRANCE_TYPE_DUNGEON || original->type == ENTRANCE_TYPE_GROTTO || original->type == ENTRANCE_TYPE_INTERIOR) && - (original->oneExit != 1 && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_OFF) && + // If entrance is a dungeon, grotto, or interior entrance, the transition into that area has oneExit set, + // which means we can filter the return transitions as redundant if entrances are not decoupled, as this is + // redundant information. Also checks a setting, enabled by default, for hiding them. If all of these + // conditions are met, we skip adding this entrance to any lists. However, if entrances are decoupled, then + // all transitions need to be displayed, so we proceed with the filtering + if ((original->type == ENTRANCE_TYPE_DUNGEON || original->type == ENTRANCE_TYPE_GROTTO || + original->type == ENTRANCE_TYPE_INTERIOR) && + (original->oneExit != 1 && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_OFF) && hideReverse == 1) { - continue; + continue; } // RANDOTODO: Only show blue warps if bluewarp shuffle is on @@ -844,18 +869,21 @@ void EntranceTrackerWindow::DrawElement() { const char* rplcSrcAreaName = spoilerEntranceGroupNames[override->srcGroup].c_str(); const char* rplcTypeName = groupTypeNames[override->type].c_str(); - const char* origSrcName = showOriginal ? original->source.c_str() : ""; + const char* origSrcName = showOriginal ? original->source.c_str() : ""; const char* rplcDstName = showOverride ? override->destination.c_str() : ""; // Filter for entrances by group name, type, source/destination names, and meta tags if ((!locationSearch.IsActive() && (showOriginal || showOverride || !collapsUndiscovered)) || - ((showOriginal && (locationSearch.PassFilter(origSrcName) || locationSearch.PassFilter(origSrcAreaName) || - locationSearch.PassFilter(origTypeName) || locationSearch.PassFilter(original->metaTag.c_str()))) || - (showOverride && (locationSearch.PassFilter(rplcDstName) || locationSearch.PassFilter(rplcSrcAreaName) || - locationSearch.PassFilter(rplcTypeName) || locationSearch.PassFilter(override->metaTag.c_str()))))) { + ((showOriginal && + (locationSearch.PassFilter(origSrcName) || locationSearch.PassFilter(origSrcAreaName) || + locationSearch.PassFilter(origTypeName) || locationSearch.PassFilter(original->metaTag.c_str()))) || + (showOverride && + (locationSearch.PassFilter(rplcDstName) || locationSearch.PassFilter(rplcSrcAreaName) || + locationSearch.PassFilter(rplcTypeName) || locationSearch.PassFilter(override->metaTag.c_str()))))) { // Detect if a scroll should happen and remember the scene for that scroll - if (!doAreaScroll && (lastSceneOrEntranceDetected != LinkIsInArea(original) && LinkIsInArea(original) != -1)) { + if (!doAreaScroll && + (lastSceneOrEntranceDetected != LinkIsInArea(original) && LinkIsInArea(original) != -1)) { lastSceneOrEntranceDetected = LinkIsInArea(original); doAreaScroll = true; } @@ -889,16 +917,18 @@ void EntranceTrackerWindow::DrawElement() { const char* unknown = "???"; - const char* origSrcName = showOriginal ? original->source.c_str() : unknown; + const char* origSrcName = showOriginal ? original->source.c_str() : unknown; const char* rplcDstName = showOverride ? override->destination.c_str() : unknown; uint32_t color = isDiscovered ? IM_COL32_WHITE : COLOR_GRAY; // Handle highlighting and auto scroll if ((original->index == lastEntranceIndex || - (override->reverseIndex == lastEntranceIndex && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == RO_GENERIC_OFF)) && - highlightPrevious) { - color = COLOR_ORANGE; + (override->reverseIndex == lastEntranceIndex && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_DECOUPLED_ENTRANCES) == + RO_GENERIC_OFF)) && + highlightPrevious) { + color = COLOR_ORANGE; } else if (LinkIsInArea(original) != -1) { if (highlightAvailable) { color = COLOR_GREEN; @@ -940,10 +970,8 @@ void EntranceTrackerWindow::DrawElement() { void EntranceTrackerWindow::InitElement() { // Setup hooks for loading and clearing the entrance tracker data - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - InitEntranceTrackingData(); - }); - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { - ClearEntranceTrackingData(); - }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { InitEntranceTrackingData(); }); + GameInteractor::Instance->RegisterGameHook( + [](int32_t fileNum) { ClearEntranceTrackingData(); }); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h index 0e1271e57..ff9462881 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance_tracker.h @@ -76,8 +76,12 @@ typedef struct { extern EntranceTrackingData gEntranceTrackingData; -#define SINGLE_SCENE_INFO(scene) {{ scene, -1 }} -#define SCENE_NO_SPAWN(scene) { scene, -1 } +#define SINGLE_SCENE_INFO(scene) \ + { \ + { scene, -1 } \ + } +#define SCENE_NO_SPAWN(scene) \ + { scene, -1 } void SetCurrentGrottoIDForTracker(int16_t entranceIndex); void SetLastEntranceOverrideForTracker(int16_t entranceIndex); @@ -92,9 +96,9 @@ class EntranceTrackerSettingsWindow : public Ship::GuiWindow { using GuiWindow::GuiWindow; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; class EntranceTrackerWindow : public Ship::GuiWindow { @@ -104,5 +108,5 @@ class EntranceTrackerWindow : public Ship::GuiWindow { void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index eef1c3171..042efadf4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -90,8 +90,8 @@ static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = { // clang-format on }; -static s16 grottoExitList[NUM_GROTTOS] = {0}; -static s16 grottoLoadList[NUM_GROTTOS] = {0}; +static s16 grottoExitList[NUM_GROTTOS] = { 0 }; +static s16 grottoLoadList[NUM_GROTTOS] = { 0 }; static s8 grottoId = 0xFF; static s8 lastEntranceType = NOT_GROTTO; static u8 overridingNextEntrance = false; @@ -143,7 +143,9 @@ static void Grotto_SetupReturnInfo(GrottoReturnInfo grotto, RespawnMode respawnM // This method doesn't change player respawn data, so only use this if you are querying an entrance index. s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { // Don't change anything unless grotto shuffle has been enabled - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return nextEntranceIndex; } @@ -157,7 +159,8 @@ s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { s8 tempGrottoId = nextEntranceIndex & 0x00FF; // Grotto Returns - if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { + if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && + nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { GrottoReturnInfo grotto = grottoReturnTable[tempGrottoId]; // When the nextEntranceIndex is determined by a dynamic exit, @@ -167,11 +170,11 @@ s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { nextEntranceIndex = grotto.entranceIndex; } else if (gPlayState == NULL) { // Handle spawn position when loading from a save file nextEntranceIndex = grotto.entranceIndex; - // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it + // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it } else { nextEntranceIndex = ENTR_RETURN_GROTTO; } - // Grotto Loads + // Grotto Loads } else if (nextEntranceIndex >= ENTRANCE_GROTTO_LOAD_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START) { GrottoLoadInfo grotto = grottoLoadTable[tempGrottoId]; nextEntranceIndex = grotto.entranceIndex; @@ -185,7 +188,9 @@ s16 Grotto_GetEntranceValueHandlingGrottoRando(s16 nextEntranceIndex) { s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { // Don't change anything unless grotto shuffle has been enabled - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return nextEntranceIndex; } @@ -201,7 +206,8 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { grottoId = nextEntranceIndex & 0x00FF; // Grotto Returns - if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { + if (nextEntranceIndex >= ENTRANCE_GROTTO_EXIT_START && + nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START + NUM_GROTTOS) { GrottoReturnInfo grotto = grottoReturnTable[grottoId]; Grotto_SetupReturnInfo(grotto, RESPAWN_MODE_RETURN); @@ -219,13 +225,13 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { gSaveContext.respawnFlag = 2; nextEntranceIndex = grotto.entranceIndex; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; - // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it + // Otherwise return 0x7FFF (ENTR_RETURN_GROTTO) and let the game handle it } else { nextEntranceIndex = ENTR_RETURN_GROTTO; } lastEntranceType = GROTTO_RETURN; - // Grotto Loads + // Grotto Loads } else if (nextEntranceIndex >= ENTRANCE_GROTTO_LOAD_START && nextEntranceIndex < ENTRANCE_GROTTO_EXIT_START) { // Set the respawn data to load the correct grotto @@ -236,7 +242,7 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { EntranceTracker_SetCurrentGrottoID(grottoId); lastEntranceType = NOT_GROTTO; - // Otherwise just unset the current grotto ID + // Otherwise just unset the current grotto ID } else { grottoId = 0xFF; lastEntranceType = NOT_GROTTO; @@ -251,7 +257,9 @@ s16 Grotto_OverrideSpecialEntrance(s16 nextEntranceIndex) { void Grotto_OverrideActorEntrance(Actor* thisx) { // Vanilla Behavior if there's no possibility of ending up in a grotto randomly - if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (!Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) && + !Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return; } @@ -277,7 +285,9 @@ void Grotto_OverrideActorEntrance(Actor* thisx) { // Set necessary flags for when warp songs/overworld spawns are shuffled to grotto return points void Grotto_ForceGrottoReturnOnSpecialEntrance(void) { - if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { + if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { gSaveContext.respawnFlag = 2; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x04FF; gSaveContext.respawn[RESPAWN_MODE_RETURN].pos = grottoReturnTable[grottoId].pos; @@ -290,11 +300,13 @@ void Grotto_ForceGrottoReturnOnSpecialEntrance(void) { // Set the respawn flag for when we want to return from a grotto entrance // Used for Sun's Song and Game Over, which usually don't restore saved position data void Grotto_ForceGrottoReturn(void) { - if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { + if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { gSaveContext.respawnFlag = 2; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x0DFF; gSaveContext.respawn[RESPAWN_MODE_RETURN].pos = grottoReturnTable[grottoId].pos; - //Save the current temp flags in the grotto return point, so they'll properly keep their values. + // Save the current temp flags in the grotto return point, so they'll properly keep their values. gSaveContext.respawn[RESPAWN_MODE_RETURN].tempSwchFlags = gPlayState->actorCtx.flags.tempSwch; gSaveContext.respawn[RESPAWN_MODE_RETURN].tempCollectFlags = gPlayState->actorCtx.flags.tempCollect; } @@ -302,7 +314,9 @@ void Grotto_ForceGrottoReturn(void) { // Used for the DMT special voids, which usually don't restore saved position data void Grotto_ForceRegularVoidOut(void) { - if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { + if (lastEntranceType == GROTTO_RETURN && (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS))) { gSaveContext.respawn[RESPAWN_MODE_DOWN] = gSaveContext.respawn[RESPAWN_MODE_RETURN]; gSaveContext.respawn[RESPAWN_MODE_DOWN].playerParams = 0x0DFF; gSaveContext.respawn[RESPAWN_MODE_DOWN].pos = grottoReturnTable[grottoId].pos; @@ -313,8 +327,9 @@ void Grotto_ForceRegularVoidOut(void) { // If returning to a FW point saved at a grotto exit, copy the FW data to the Grotto Return Point // so that Sun's Song and Game Over will behave correctly void Grotto_SetupReturnInfoOnFWReturn(void) { - if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS) && - gSaveContext.fw.playerParams == 0x04FF) { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS) && gSaveContext.fw.playerParams == 0x04FF) { gSaveContext.respawn[RESPAWN_MODE_RETURN] = gSaveContext.respawn[RESPAWN_MODE_TOP]; gSaveContext.respawn[RESPAWN_MODE_RETURN].playerParams = 0x0DFF; lastEntranceType = GROTTO_RETURN; @@ -345,7 +360,9 @@ s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene) { } s8 Grotto_CurrentGrotto() { - if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || + Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || + Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { return grottoId; } else { s16 entrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 70aa11c06..048fcc86c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -144,7 +144,6 @@ typedef enum { RAND_INF_GREG_FOUND, - RAND_INF_TOT_MASTER_SWORD, RAND_INF_CHILD_FISHING, @@ -999,7 +998,7 @@ typedef enum { RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, - + RAND_INF_CAUGHT_LOACH, RAND_INF_CAN_SWIM, @@ -1603,7 +1602,6 @@ typedef enum { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, - // Overworld Grass RAND_INF_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_2, @@ -1954,7 +1952,8 @@ typedef enum { RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7, RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8, // End Grass - // 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) + // 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, } RandomizerInf; diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 0c24aa181..8d9d2559a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -43,45 +43,65 @@ bool shouldUpdateVectors = true; std::vector mainWindowItems = {}; std::vector inventoryItems = { - ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_SLINGSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMBCHU, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_ICE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_FARORES_WIND, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_BOOMERANG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_LENS, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BEAN, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_HAMMER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_LIGHT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NAYRUS_LOVE, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 1, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 2, DrawBottle), - ITEM_TRACKER_ITEM(ITEM_BOTTLE, 3, DrawBottle), ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_SLINGSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOMBCHU, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_ARROW_ICE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_FARORES_WIND, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOOMERANG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_LENS, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BEAN, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HAMMER, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_ARROW_LIGHT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NAYRUS_LOVE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 1, DrawBottle), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 2, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 3, DrawBottle), + ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem), }; std::vector equipmentItems = { - ITEM_TRACKER_ITEM(ITEM_SWORD_KOKIRI, 1 << 0, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_MASTER, 1 << 1, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_BGS, 1 << 2, DrawEquip), - ITEM_TRACKER_ITEM(ITEM_TUNIC_KOKIRI, 1 << 8, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_GORON, 1 << 9, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_ZORA, 1 << 10, DrawEquip), - ITEM_TRACKER_ITEM(ITEM_SHIELD_DEKU, 1 << 4, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_HYLIAN, 1 << 5, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_MIRROR, 1 << 6, DrawEquip), - ITEM_TRACKER_ITEM(ITEM_BOOTS_KOKIRI, 1 << 12, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_IRON, 1 << 13, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_HOVER, 1 << 14, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SWORD_KOKIRI, 1 << 0, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_MASTER, 1 << 1, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SWORD_BGS, 1 << 2, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_KOKIRI, 1 << 8, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_TUNIC_GORON, 1 << 9, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_ZORA, 1 << 10, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SHIELD_DEKU, 1 << 4, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_HYLIAN, 1 << 5, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SHIELD_MIRROR, 1 << 6, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_KOKIRI, 1 << 12, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_BOOTS_IRON, 1 << 13, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_HOVER, 1 << 14, DrawEquip), }; std::vector miscItems = { - ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), - ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_HEART_PIECE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), + ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HEART_PIECE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), }; std::vector dungeonRewardStones = { - ITEM_TRACKER_ITEM(QUEST_KOKIRI_EMERALD, 1 << 18, DrawQuest), ITEM_TRACKER_ITEM(QUEST_GORON_RUBY, 1 << 19, DrawQuest), ITEM_TRACKER_ITEM(QUEST_ZORA_SAPPHIRE, 1 << 20, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_KOKIRI_EMERALD, 1 << 18, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_GORON_RUBY, 1 << 19, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_ZORA_SAPPHIRE, 1 << 20, DrawQuest), }; std::vector dungeonRewardMedallions = { - ITEM_TRACKER_ITEM(QUEST_MEDALLION_FOREST, 1 << 0, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_FIRE, 1 << 1, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_WATER, 1 << 2, DrawQuest), - ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_FOREST, 1 << 0, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_FIRE, 1 << 1, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_WATER, 1 << 2, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), }; std::vector dungeonRewards = {}; std::vector songItems = { - ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), - ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), - ITEM_TRACKER_ITEM(QUEST_SONG_MINUET, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_BOLERO, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SERENADE, 0, DrawSong), - ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_MINUET, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_BOLERO, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_SERENADE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), }; std::vector gregItems = { @@ -93,59 +113,53 @@ std::vector triforcePieces = { }; std::vector bossSoulItems = { - 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 ), + 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 = { - //Hack for right now, just gonna draw ocarina buttons as ocarinas. - //Will replace with other macro once we have a custom texture - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + // Hack for right now, just gonna draw ocarina buttons as ocarinas. + // Will replace with other macro once we have a custom texture + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_UP_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_DOWN_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_LEFT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_OCARINA_C_RIGHT_BUTTON, ITEM_OCARINA_TIME, ITEM_OCARINA_TIME, 0, DrawItem), }; std::vector overworldKeyItems = { // Hack for right now, just gonna overworld keys as dungeon keys. // Will replace with other macro once we have a custom texture - ITEM_TRACKER_ITEM_CUSTOM(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_WINDMILL_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_STABLES_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), - ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_WINDMILL_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_STABLES_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), + ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), }; -std::vector fishingPoleItems = { - ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) -}; +std::vector fishingPoleItems = { ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) }; std::vector itemTrackerDungeonsWithMapsHorizontal = { { SCENE_DEKU_TREE, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, @@ -173,7 +187,6 @@ std::vector itemTrackerDungeonsHorizontal = { { SCENE_GERUDO_TRAINING_GROUND, { ITEM_KEY_SMALL } }, }; - std::vector itemTrackerDungeonsWithMapsCompact = { { SCENE_FOREST_TEMPLE, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_FIRE_TEMPLE, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, @@ -202,39 +215,22 @@ std::vector itemTrackerDungeonsCompact = { }; std::map itemTrackerDungeonShortNames = { - { SCENE_FOREST_TEMPLE, "FRST" }, - { SCENE_FIRE_TEMPLE, "FIRE" }, - { SCENE_WATER_TEMPLE, "WATR" }, - { SCENE_SPIRIT_TEMPLE, "SPRT" }, - { SCENE_SHADOW_TEMPLE, "SHDW" }, - { SCENE_BOTTOM_OF_THE_WELL, "BOTW" }, - { SCENE_DEKU_TREE, "DEKU" }, - { SCENE_DODONGOS_CAVERN, "DCVN" }, - { SCENE_JABU_JABU, "JABU" }, - { SCENE_ICE_CAVERN, "ICE" }, - { SCENE_INSIDE_GANONS_CASTLE, "GANON" }, - { SCENE_GERUDO_TRAINING_GROUND, "GTG" }, + { SCENE_FOREST_TEMPLE, "FRST" }, { SCENE_FIRE_TEMPLE, "FIRE" }, { SCENE_WATER_TEMPLE, "WATR" }, + { SCENE_SPIRIT_TEMPLE, "SPRT" }, { SCENE_SHADOW_TEMPLE, "SHDW" }, { SCENE_BOTTOM_OF_THE_WELL, "BOTW" }, + { SCENE_DEKU_TREE, "DEKU" }, { SCENE_DODONGOS_CAVERN, "DCVN" }, { SCENE_JABU_JABU, "JABU" }, + { SCENE_ICE_CAVERN, "ICE" }, { SCENE_INSIDE_GANONS_CASTLE, "GANON" }, { SCENE_GERUDO_TRAINING_GROUND, "GTG" }, { SCENE_THIEVES_HIDEOUT, "HIDE" }, }; std::map itemTrackerBossShortNames = { - { RG_GOHMA_SOUL, "GOHMA" }, - { RG_KING_DODONGO_SOUL, "KD" }, - { RG_BARINADE_SOUL, "BARI" }, - { RG_PHANTOM_GANON_SOUL, "PG"}, - { RG_VOLVAGIA_SOUL, "VOLV"}, - { RG_MORPHA_SOUL, "MORPH"}, - { RG_BONGO_BONGO_SOUL, "BONGO"}, - { RG_TWINROVA_SOUL, "TWIN"}, - { RG_GANON_SOUL, "GANON"}, + { RG_GOHMA_SOUL, "GOHMA" }, { RG_KING_DODONGO_SOUL, "KD" }, { RG_BARINADE_SOUL, "BARI" }, + { RG_PHANTOM_GANON_SOUL, "PG" }, { RG_VOLVAGIA_SOUL, "VOLV" }, { RG_MORPHA_SOUL, "MORPH" }, + { RG_BONGO_BONGO_SOUL, "BONGO" }, { RG_TWINROVA_SOUL, "TWIN" }, { RG_GANON_SOUL, "GANON" }, }; std::map itemTrackerOcarinaButtonShortNames = { - { RG_OCARINA_A_BUTTON, "A" }, - { RG_OCARINA_C_UP_BUTTON, "C-U" }, - { RG_OCARINA_C_DOWN_BUTTON, "C-D" }, - { RG_OCARINA_C_LEFT_BUTTON, "C-L"}, - { RG_OCARINA_C_RIGHT_BUTTON, "C-R"}, + { RG_OCARINA_A_BUTTON, "A" }, { RG_OCARINA_C_UP_BUTTON, "C-U" }, { RG_OCARINA_C_DOWN_BUTTON, "C-D" }, + { RG_OCARINA_C_LEFT_BUTTON, "C-L" }, { RG_OCARINA_C_RIGHT_BUTTON, "C-R" }, }; std::map itemTrackerOverworldKeyShortNames = { @@ -267,88 +263,76 @@ std::map itemTrackerOverworldKeyShortNames = { std::vector dungeonItems = {}; std::unordered_map actualItemTrackerItemMap = { - { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, - { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, - { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, - { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, - { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, - { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, - { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, - { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, - { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, - { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, - { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, - { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, - { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, + { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, + { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, + { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, + { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, + { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, + { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, + { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, + { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, + { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, + { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, + { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, + { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, + { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, - { ITEM_HOOKSHOT, ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem) }, - { ITEM_LONGSHOT, ITEM_TRACKER_ITEM(ITEM_LONGSHOT, 0, DrawItem) }, + { ITEM_HOOKSHOT, ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem) }, + { ITEM_LONGSHOT, ITEM_TRACKER_ITEM(ITEM_LONGSHOT, 0, DrawItem) }, - { ITEM_OCARINA_FAIRY, ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem) }, - { ITEM_OCARINA_TIME, ITEM_TRACKER_ITEM(ITEM_OCARINA_TIME, 0, DrawItem) }, + { ITEM_OCARINA_FAIRY, ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem) }, + { ITEM_OCARINA_TIME, ITEM_TRACKER_ITEM(ITEM_OCARINA_TIME, 0, DrawItem) }, - { ITEM_MAGIC_SMALL, ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem) }, - { ITEM_MAGIC_LARGE, ITEM_TRACKER_ITEM(ITEM_MAGIC_LARGE, 0, DrawItem) }, + { ITEM_MAGIC_SMALL, ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem) }, + { ITEM_MAGIC_LARGE, ITEM_TRACKER_ITEM(ITEM_MAGIC_LARGE, 0, DrawItem) }, - { ITEM_WALLET_ADULT, ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem) }, - { ITEM_WALLET_GIANT, ITEM_TRACKER_ITEM(ITEM_WALLET_GIANT, 0, DrawItem) }, + { ITEM_WALLET_ADULT, ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem) }, + { ITEM_WALLET_GIANT, ITEM_TRACKER_ITEM(ITEM_WALLET_GIANT, 0, DrawItem) }, - { ITEM_BRACELET, ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem) }, + { ITEM_BRACELET, ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem) }, { ITEM_GAUNTLETS_SILVER, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_SILVER, 0, DrawItem) }, - { ITEM_GAUNTLETS_GOLD, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_GOLD, 0, DrawItem) }, + { ITEM_GAUNTLETS_GOLD, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_GOLD, 0, DrawItem) }, - { ITEM_SCALE_SILVER, ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem) }, - { ITEM_SCALE_GOLDEN, ITEM_TRACKER_ITEM(ITEM_SCALE_GOLDEN, 0, DrawItem) }, + { ITEM_SCALE_SILVER, ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem) }, + { ITEM_SCALE_GOLDEN, ITEM_TRACKER_ITEM(ITEM_SCALE_GOLDEN, 0, DrawItem) }, - { ITEM_WEIRD_EGG, ITEM_TRACKER_ITEM(ITEM_WEIRD_EGG, 0, DrawItem) }, - { ITEM_CHICKEN, ITEM_TRACKER_ITEM(ITEM_CHICKEN, 0, DrawItem) }, - { ITEM_LETTER_ZELDA, ITEM_TRACKER_ITEM(ITEM_LETTER_ZELDA, 0, DrawItem) }, - { ITEM_MASK_KEATON, ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem) }, - { ITEM_MASK_SKULL, ITEM_TRACKER_ITEM(ITEM_MASK_SKULL, 0, DrawItem) }, - { ITEM_MASK_SPOOKY, ITEM_TRACKER_ITEM(ITEM_MASK_SPOOKY, 0, DrawItem) }, - { ITEM_MASK_BUNNY, ITEM_TRACKER_ITEM(ITEM_MASK_BUNNY, 0, DrawItem) }, - { ITEM_MASK_GORON, ITEM_TRACKER_ITEM(ITEM_MASK_GORON, 0, DrawItem) }, - { ITEM_MASK_ZORA, ITEM_TRACKER_ITEM(ITEM_MASK_ZORA, 0, DrawItem) }, - { ITEM_MASK_GERUDO, ITEM_TRACKER_ITEM(ITEM_MASK_GERUDO, 0, DrawItem) }, - { ITEM_MASK_TRUTH, ITEM_TRACKER_ITEM(ITEM_MASK_TRUTH, 0, DrawItem) }, - { ITEM_SOLD_OUT, ITEM_TRACKER_ITEM(ITEM_SOLD_OUT, 0, DrawItem) }, + { ITEM_WEIRD_EGG, ITEM_TRACKER_ITEM(ITEM_WEIRD_EGG, 0, DrawItem) }, + { ITEM_CHICKEN, ITEM_TRACKER_ITEM(ITEM_CHICKEN, 0, DrawItem) }, + { ITEM_LETTER_ZELDA, ITEM_TRACKER_ITEM(ITEM_LETTER_ZELDA, 0, DrawItem) }, + { ITEM_MASK_KEATON, ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem) }, + { ITEM_MASK_SKULL, ITEM_TRACKER_ITEM(ITEM_MASK_SKULL, 0, DrawItem) }, + { ITEM_MASK_SPOOKY, ITEM_TRACKER_ITEM(ITEM_MASK_SPOOKY, 0, DrawItem) }, + { ITEM_MASK_BUNNY, ITEM_TRACKER_ITEM(ITEM_MASK_BUNNY, 0, DrawItem) }, + { ITEM_MASK_GORON, ITEM_TRACKER_ITEM(ITEM_MASK_GORON, 0, DrawItem) }, + { ITEM_MASK_ZORA, ITEM_TRACKER_ITEM(ITEM_MASK_ZORA, 0, DrawItem) }, + { ITEM_MASK_GERUDO, ITEM_TRACKER_ITEM(ITEM_MASK_GERUDO, 0, DrawItem) }, + { ITEM_MASK_TRUTH, ITEM_TRACKER_ITEM(ITEM_MASK_TRUTH, 0, DrawItem) }, + { ITEM_SOLD_OUT, ITEM_TRACKER_ITEM(ITEM_SOLD_OUT, 0, DrawItem) }, - { ITEM_POCKET_EGG, ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem) }, - { ITEM_POCKET_CUCCO, ITEM_TRACKER_ITEM(ITEM_POCKET_CUCCO, 0, DrawItem) }, - { ITEM_COJIRO, ITEM_TRACKER_ITEM(ITEM_COJIRO, 0, DrawItem) }, - { ITEM_ODD_MUSHROOM, ITEM_TRACKER_ITEM(ITEM_ODD_MUSHROOM, 0, DrawItem) }, - { ITEM_ODD_POTION, ITEM_TRACKER_ITEM(ITEM_ODD_POTION, 0, DrawItem) }, - { ITEM_SAW, ITEM_TRACKER_ITEM(ITEM_SAW, 0, DrawItem) }, - { ITEM_SWORD_BROKEN, ITEM_TRACKER_ITEM(ITEM_SWORD_BROKEN, 0, DrawItem) }, - { ITEM_PRESCRIPTION, ITEM_TRACKER_ITEM(ITEM_PRESCRIPTION, 0, DrawItem) }, - { ITEM_FROG, ITEM_TRACKER_ITEM(ITEM_FROG, 0, DrawItem) }, - { ITEM_EYEDROPS, ITEM_TRACKER_ITEM(ITEM_EYEDROPS, 0, DrawItem) }, - { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, + { ITEM_POCKET_EGG, ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem) }, + { ITEM_POCKET_CUCCO, ITEM_TRACKER_ITEM(ITEM_POCKET_CUCCO, 0, DrawItem) }, + { ITEM_COJIRO, ITEM_TRACKER_ITEM(ITEM_COJIRO, 0, DrawItem) }, + { ITEM_ODD_MUSHROOM, ITEM_TRACKER_ITEM(ITEM_ODD_MUSHROOM, 0, DrawItem) }, + { ITEM_ODD_POTION, ITEM_TRACKER_ITEM(ITEM_ODD_POTION, 0, DrawItem) }, + { ITEM_SAW, ITEM_TRACKER_ITEM(ITEM_SAW, 0, DrawItem) }, + { ITEM_SWORD_BROKEN, ITEM_TRACKER_ITEM(ITEM_SWORD_BROKEN, 0, DrawItem) }, + { ITEM_PRESCRIPTION, ITEM_TRACKER_ITEM(ITEM_PRESCRIPTION, 0, DrawItem) }, + { ITEM_FROG, ITEM_TRACKER_ITEM(ITEM_FROG, 0, DrawItem) }, + { ITEM_EYEDROPS, ITEM_TRACKER_ITEM(ITEM_EYEDROPS, 0, DrawItem) }, + { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, }; std::vector buttonMap = { - BTN_A, - BTN_B, - BTN_CUP, - BTN_CDOWN, - BTN_CLEFT, - BTN_CRIGHT, - BTN_L, - BTN_Z, - BTN_R, - BTN_START, - BTN_DUP, - BTN_DDOWN, - BTN_DLEFT, - BTN_DRIGHT, + BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L, + BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT, }; typedef enum { - ITEM_TRACKER_NUMBER_NONE, - ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, - ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, - ITEM_TRACKER_NUMBER_CAPACITY, - ITEM_TRACKER_NUMBER_AMMO, + ITEM_TRACKER_NUMBER_NONE, + ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, + ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, + ITEM_TRACKER_NUMBER_CAPACITY, + ITEM_TRACKER_NUMBER_AMMO, } ItemTrackerNumberOption; typedef enum { @@ -381,9 +365,9 @@ typedef enum { } ItemTrackerMinimalDisplayType; struct ItemTrackerNumbers { - int currentCapacity; - int maxCapacity; - int currentAmmo; + int currentCapacity; + int maxCapacity; + int currentAmmo; }; static ImVector itemTrackerNotes; @@ -448,8 +432,10 @@ ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { break; case ITEM_WALLET_ADULT: case ITEM_WALLET_GIANT: - result.currentCapacity = IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) ? 0 : CUR_CAPACITY(UPG_WALLET); - result.maxCapacity = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INCLUDE_TYCOON_WALLET) ? 999 : 500; + result.currentCapacity = + IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) ? 0 : CUR_CAPACITY(UPG_WALLET); + result.maxCapacity = + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INCLUDE_TYCOON_WALLET) ? 999 : 500; result.currentAmmo = gSaveContext.rupees; break; case ITEM_BOMBCHU: @@ -529,7 +515,8 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { int textSize = CVarGetInteger(CVAR_TRACKER_ITEM("TextSize"), 13); ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item); ImVec2 p = ImGui::GetCursorScreenPos(); - int32_t trackerNumberDisplayMode = CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY); + int32_t trackerNumberDisplayMode = + CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY); int32_t trackerKeyNumberDisplayMode = CVarGetInteger(CVAR_TRACKER_ITEM("KeyCounts"), KEYS_COLLECTED_MAX); float textScalingFactor = static_cast(iconSize) / 36.0f; uint32_t actualItemId = INV_CONTENT(item.id); @@ -539,8 +526,11 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { if ((actualItemId == ITEM_HOOKSHOT || actualItemId == ITEM_LONGSHOT) && hasItem) { // Calculate the scaled position for the text - ImVec2 textPos = ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(item.id == ITEM_HOOKSHOT ? "H" : "L").x * - textScalingFactor / 2) + 8 * textScalingFactor, p.y - 22 * textScalingFactor); + ImVec2 textPos = + ImVec2(p.x + (iconSize / 2) - + (ImGui::CalcTextSize(item.id == ITEM_HOOKSHOT ? "H" : "L").x * textScalingFactor / 2) + + 8 * textScalingFactor, + p.y - 22 * textScalingFactor); ImGui::SetCursorScreenPos(textPos); ImGui::SetWindowFontScale(textScalingFactor); @@ -558,16 +548,19 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImU32 currentColor = IM_COL_WHITE; ImU32 maxColor = IM_COL_GREEN; // "Collected / Max", "Current / Collected / Max", "Current / Max" - if (trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX || trackerKeyNumberDisplayMode == KEYS_CURRENT_MAX) { - currentString+= std::to_string(currentAndMax.currentAmmo); - currentString+= "/"; + if (trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX || + trackerKeyNumberDisplayMode == KEYS_CURRENT_MAX) { + currentString += std::to_string(currentAndMax.currentAmmo); + currentString += "/"; } - if (trackerKeyNumberDisplayMode == KEYS_COLLECTED_MAX || trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX) { - currentString+= std::to_string(currentAndMax.currentCapacity); - currentString+= "/"; + if (trackerKeyNumberDisplayMode == KEYS_COLLECTED_MAX || + trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX) { + currentString += std::to_string(currentAndMax.currentCapacity); + currentString += "/"; } - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2), p.y - 14)); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2), p.y - 14)); ImGui::PushStyleColor(ImGuiCol_Text, currentColor); ImGui::Text("%s", currentString.c_str()); ImGui::PopStyleColor(); @@ -575,26 +568,25 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { ImGui::PushStyleColor(ImGuiCol_Text, maxColor); ImGui::Text("%s", maxString.c_str()); ImGui::PopStyleColor(); - } else if (currentAndMax.currentCapacity > 0 && trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_NONE && IsValidSaveFile()) { + } else if (currentAndMax.currentCapacity > 0 && trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_NONE && + IsValidSaveFile()) { std::string currentString = ""; std::string maxString = ""; ImU32 currentColor = IM_COL_WHITE; ImU32 maxColor = item.id == QUEST_SKULL_TOKEN ? IM_COL_RED : IM_COL_GREEN; bool shouldAlignToLeft = CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountAlignLeft"), 0) && - trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_CAPACITY && - trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_AMMO; + trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_CAPACITY && + trackerNumberDisplayMode != ITEM_TRACKER_NUMBER_AMMO; bool shouldDisplayAmmo = trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_AMMO || - trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY || - // These items have a static capacity, so display ammo instead - item.id == ITEM_BOMBCHU || - item.id == ITEM_BEAN || - item.id == QUEST_SKULL_TOKEN || - item.id == ITEM_HEART_CONTAINER || - item.id == ITEM_HEART_PIECE; + trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY || + // These items have a static capacity, so display ammo instead + item.id == ITEM_BOMBCHU || item.id == ITEM_BEAN || item.id == QUEST_SKULL_TOKEN || + item.id == ITEM_HEART_CONTAINER || item.id == ITEM_HEART_PIECE; - bool shouldDisplayMax = !(trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY); + bool shouldDisplayMax = !(trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || + trackerNumberDisplayMode == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY); if (shouldDisplayAmmo) { currentString = std::to_string(currentAndMax.currentAmmo); @@ -622,7 +614,9 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { } } - float x = shouldAlignToLeft ? p.x : p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2); + float x = shouldAlignToLeft + ? p.x + : p.x + (iconSize / 2) - (ImGui::CalcTextSize((currentString + maxString).c_str()).x / 2); ImGui::SetCursorScreenPos(ImVec2(x, p.y - 14)); ImGui::PushStyleColor(ImGuiCol_Text, currentColor); @@ -637,11 +631,16 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { std::string currentString = ""; std::string requiredString = ""; 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.ship.quest.data.randomizer.triforcePiecesCollected >= piecesRequired ? IM_COL_GREEN : IM_COL_WHITE; + 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.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); + int32_t trackerTriforcePieceNumberDisplayMode = + CVarGetInteger(CVAR_TRACKER_ITEM("TriforcePieceCounts"), TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX); currentString += std::to_string(gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); currentString += "/"; @@ -672,7 +671,8 @@ void DrawItemCount(ItemTrackerItem item, bool hideMax) { void DrawEquip(ItemTrackerItem item) { bool hasEquip = HasEquipment(item); int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); Tooltip(SohUtils::GetItemName(item.id).c_str()); @@ -682,7 +682,8 @@ void DrawQuest(ItemTrackerItem item) { bool hasQuestItem = HasQuestItem(item); int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); if (item.id == QUEST_SKULL_TOKEN) { @@ -729,7 +730,9 @@ void DrawItem(ItemTrackerItem item) { case ITEM_BRACELET: case ITEM_GAUNTLETS_SILVER: case ITEM_GAUNTLETS_GOLD: - actualItemId = CUR_UPG_VALUE(UPG_STRENGTH) == 3 ? ITEM_GAUNTLETS_GOLD : CUR_UPG_VALUE(UPG_STRENGTH) == 2 ? ITEM_GAUNTLETS_SILVER : ITEM_BRACELET; + actualItemId = CUR_UPG_VALUE(UPG_STRENGTH) == 3 ? ITEM_GAUNTLETS_GOLD + : CUR_UPG_VALUE(UPG_STRENGTH) == 2 ? ITEM_GAUNTLETS_SILVER + : ITEM_BRACELET; hasItem = CUR_UPG_VALUE(UPG_STRENGTH) > 0; break; case ITEM_SCALE_SILVER: @@ -788,8 +791,10 @@ void DrawItem(ItemTrackerItem item) { break; case RG_GANON_SOUL: actualItemId = item.id; - hasItem = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS) == RO_BOSS_SOULS_ON_PLUS_GANON ? - Flags_GetRandomizerInf(RAND_INF_GANON_SOUL) : true; + hasItem = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS) == + RO_BOSS_SOULS_ON_PLUS_GANON + ? Flags_GetRandomizerInf(RAND_INF_GANON_SOUL) + : true; itemName = "Ganon's Soul"; break; @@ -946,21 +951,25 @@ void DrawItem(ItemTrackerItem item) { break; } - if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { + if (GameInteractor::IsSaveLoaded() && + (hasItem && item.id != actualItemId && + actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { item = actualItemTrackerItemMap[actualItemId]; } - + ImGui::BeginGroup(); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - + DrawItemCount(item, false); if (item.id >= RG_GOHMA_SOUL && item.id <= RG_GANON_SOUL) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string bossName = itemTrackerBossShortNames[item.id]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(bossName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(bossName.c_str()).x / 2), p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); ImGui::Text("%s", bossName.c_str()); ImGui::PopStyleColor(); @@ -969,7 +978,8 @@ void DrawItem(ItemTrackerItem item) { if (item.id >= RG_OCARINA_A_BUTTON && item.id <= RG_OCARINA_C_RIGHT_BUTTON) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string ocarinaButtonName = itemTrackerOcarinaButtonShortNames[item.id]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(ocarinaButtonName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(ocarinaButtonName.c_str()).x / 2), + p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); ImGui::Text("%s", ocarinaButtonName.c_str()); ImGui::PopStyleColor(); @@ -978,7 +988,8 @@ void DrawItem(ItemTrackerItem item) { if (item.id >= RG_GUARD_HOUSE_KEY && item.id <= RG_FISHING_HOLE_KEY) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string overworldKeyName = itemTrackerOverworldKeyShortNames[item.id]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(overworldKeyName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(overworldKeyName.c_str()).x / 2), + p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); ImGui::Text("%s", overworldKeyName.c_str()); ImGui::PopStyleColor(); @@ -994,15 +1005,19 @@ void DrawItem(ItemTrackerItem item) { } void DrawBottle(ItemTrackerItem item) { - uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? (gSaveContext.inventory.items[SLOT(item.id) + item.data]) : false; + uint32_t actualItemId = + GameInteractor::IsSaveLoaded() ? (gSaveContext.inventory.items[SLOT(item.id) + item.data]) : false; bool hasItem = actualItemId != ITEM_NONE; - if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { + if (GameInteractor::IsSaveLoaded() && + (hasItem && item.id != actualItemId && + actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { item = actualItemTrackerItemMap[actualItemId]; } int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); Tooltip(SohUtils::GetItemName(item.id).c_str()); @@ -1014,40 +1029,45 @@ void DrawDungeonItem(ItemTrackerItem item) { uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); bool hasItem = GameInteractor::IsSaveLoaded() ? (bitMask & gSaveContext.inventory.dungeonItems[item.data]) : false; - bool hasSmallKey = GameInteractor::IsSaveLoaded() ? ((gSaveContext.inventory.dungeonKeys[item.data]) >= 0) : false; + bool hasSmallKey = GameInteractor::IsSaveLoaded() ? ((gSaveContext.inventory.dungeonKeys[item.data]) >= 0) : false; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - } - else { - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + } else { + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } - if (CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data))) && GameInteractor::IsSaveLoaded()) { + if (CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data))) && + GameInteractor::IsSaveLoaded()) { dungeonColor = (ResourceMgr_IsSceneMasterQuest(item.data) ? IM_COL_PURPLE : IM_COL_LIGHT_YELLOW); } if (itemId == ITEM_KEY_SMALL) { - DrawItemCount(item, !CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data)))); + DrawItemCount(item, !CheckTracker::IsAreaSpoiled( + RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data)))); ImVec2 p = ImGui::GetCursorScreenPos(); - // offset puts the text at the correct level. for some reason, if the save is loaded, the margin is 3 pixels higher only for small keys, so we use 16 then. Otherwise, 13 is where everything else is + // offset puts the text at the correct level. for some reason, if the save is loaded, the margin is 3 pixels + // higher only for small keys, so we use 16 then. Otherwise, 13 is where everything else is int offset = GameInteractor::IsSaveLoaded() ? 16 : 13; std::string dungeonName = itemTrackerDungeonShortNames[item.data]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + offset))); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + offset))); ImGui::PushStyleColor(ImGuiCol_Text, dungeonColor); ImGui::Text("%s", dungeonName.c_str()); ImGui::PopStyleColor(); } - if (itemId == ITEM_DUNGEON_MAP && - (item.data == SCENE_DEKU_TREE || item.data == SCENE_DODONGOS_CAVERN || item.data == SCENE_JABU_JABU || item.data == SCENE_ICE_CAVERN) - ) { + if (itemId == ITEM_DUNGEON_MAP && (item.data == SCENE_DEKU_TREE || item.data == SCENE_DODONGOS_CAVERN || + item.data == SCENE_JABU_JABU || item.data == SCENE_ICE_CAVERN)) { ImVec2 p = ImGui::GetCursorScreenPos(); std::string dungeonName = itemTrackerDungeonShortNames[item.data]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::SetCursorScreenPos( + ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 13))); ImGui::PushStyleColor(ImGuiCol_Text, dungeonColor); ImGui::Text("%s", dungeonName.c_str()); ImGui::PopStyleColor(); @@ -1062,7 +1082,8 @@ void DrawSong(ItemTrackerItem item) { ImVec2 p = ImGui::GetCursorScreenPos(); bool hasSong = HasSong(item); ImGui::SetCursorScreenPos(ImVec2(p.x + 6, p.y)); - ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), + ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName( + hasSong && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); Tooltip(SohUtils::GetQuestItemName(item.id).c_str()); } @@ -1083,22 +1104,24 @@ void DrawNotes(bool resizeable = false) { } return 0; } - static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, const ImVec2& size = ImVec2(0, 0), - ImGuiInputTextFlags flags = 0) { + static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, + const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) { IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), - size, flags | ImGuiInputTextFlags_CallbackResize, - ItemTrackerNotes::TrackerNotesResizeCallback, - (void*)itemTrackerNotes); + return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), size, + flags | ImGuiInputTextFlags_CallbackResize, + ItemTrackerNotes::TrackerNotesResizeCallback, (void*)itemTrackerNotes); } }; - ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200); + ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) + : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200); if (GameInteractor::IsSaveLoaded()) { - if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput)) { + if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, + ImGuiInputTextFlags_AllowTabInput)) { notesNeedSave = true; notesIdleFrames = 0; } - if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && IsValidSaveFile()) { + if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && + IsValidSaveFile()) { notesNeedSave = false; SaveManager::Instance->SaveSection(gSaveContext.fileNum, itemTrackerSectionId, true); } @@ -1125,18 +1148,21 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { ImGuiWindowFlags windowFlags = flags; if (windowFlags == 0) { - windowFlags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; + windowFlags |= + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; } if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) { ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); - windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; if (!CVarGetInteger(CVAR_TRACKER_ITEM("Draggable"), 0)) { windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; } } - ImGui::PushStyleColor(ImGuiCol_WindowBg, VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), {0, 0, 0, 0}))); + ImGui::PushStyleColor(ImGuiCol_WindowBg, + VecFromRGBA8(CVarGetColor(CVAR_TRACKER_ITEM("BgColor.Value"), { 0, 0, 0, 0 }))); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); @@ -1155,12 +1181,14 @@ void EndFloatingWindows() { void DrawItemsInRows(std::vector items, int columns = 6) { int iconSize = CVarGetInteger(CVAR_TRACKER_ITEM("IconSize"), 36); int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); - int topPadding = (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW) ? 20 : 0; + int topPadding = + (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW) ? 20 : 0; for (int i = 0; i < items.size(); i++) { int row = i / columns; int column = i % columns; - ImGui::SetCursorPos(ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8 + topPadding)); + ImGui::SetCursorPos( + ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8 + topPadding)); items[i].drawFunc(items[i]); } } @@ -1187,7 +1215,7 @@ void DrawItemsInACircle(std::vector items) { /** * GetDungeonItemsVector - * Loops over dungeons and creates vectors of items in the correct order + * Loops over dungeons and creates vectors of items in the correct order * to then call DrawItemsInRows */ std::vector GetDungeonItemsVector(std::vector dungeons, int columns = 6) { @@ -1197,7 +1225,8 @@ std::vector GetDungeonItemsVector(std::vector rowCount) rowCount = dungeons[i].items.size(); + if (dungeons[i].items.size() > rowCount) + rowCount = dungeons[i].items.size(); } for (int i = 0; i < rowCount; i++) { @@ -1210,7 +1239,8 @@ std::vector GetDungeonItemsVector(std::vector GetDungeonItemsVector(std::vector columns) { - std::vector nextDungeonItems = GetDungeonItemsVector(std::vector(dungeons.begin() + columns, dungeons.end()), columns); + std::vector nextDungeonItems = + GetDungeonItemsVector(std::vector(dungeons.begin() + columns, dungeons.end()), columns); dungeonItems.insert(dungeonItems.end(), nextDungeonItems.begin(), nextDungeonItems.end()); } @@ -1238,7 +1269,7 @@ std::vector GetDungeonItemsVector(std::vectorSaveData("personalNotes", std::string(std::begin(itemTrackerNotes), std::end(itemTrackerNotes)).c_str()); + SaveManager::Instance->SaveData("personalNotes", + std::string(std::begin(itemTrackerNotes), std::end(itemTrackerNotes)).c_str()); } void ItemTrackerLoadFile() { @@ -1428,51 +1489,73 @@ void ItemTrackerWindow::DrawElement() { int iconSpacing = CVarGetInteger(CVAR_TRACKER_ITEM("IconSpacing"), 12); int comboButton1Mask = buttonMap[CVarGetInteger(CVAR_TRACKER_ITEM("ComboButton1"), TRACKER_COMBO_BUTTON_L)]; int comboButton2Mask = buttonMap[CVarGetInteger(CVAR_TRACKER_ITEM("ComboButton2"), TRACKER_COMBO_BUTTON_R)]; - OSContPad* buttonsPressed = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); - bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; - bool isPaused = CVarGetInteger(CVAR_TRACKER_ITEM("ShowOnlyPaused"), 0) == 0 || gPlayState != nullptr && gPlayState->pauseCtx.state > 0; + OSContPad* buttonsPressed = + std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetControlDeck())->GetPads(); + bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && + buttonsPressed[0].button & comboButton2Mask; + bool isPaused = CVarGetInteger(CVAR_TRACKER_ITEM("ShowOnlyPaused"), 0) == 0 || + gPlayState != nullptr && gPlayState->pauseCtx.state > 0; - if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || isPaused && (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS ? CVarGetInteger(CVAR_WINDOW("ItemTracker"), 0) : comboButtonsHeld)) { - if ( - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || - (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) - ) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || + isPaused && + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS + ? CVarGetInteger(CVAR_WINDOW("ItemTracker"), 0) + : comboButtonsHeld)) { + if ((CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) || + (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW)) { BeginFloatingWindows("Item Tracker##main window"); DrawItemsInRows(mainWindowItems, 6); - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW && CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_MAIN_WINDOW && + CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == + TRACKER_DISPLAY_ALWAYS) { DrawNotes(); } EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Inventory"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Inventory Items Tracker"); DrawItemsInRows(inventoryItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Equipment"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Equipment Items Tracker"); DrawItemsInRows(equipmentItems, 3); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Misc"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Misc Items Tracker"); DrawItemsInRows(miscItems, 4); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Dungeon Rewards Tracker"); if (CVarGetInteger(CVAR_TRACKER_ITEM("DungeonRewardsLayout"), 0)) { ImGui::BeginGroup(); @@ -1487,13 +1570,15 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Songs"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Songs Tracker"); DrawItemsInRows(songItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Dungeon Items Tracker"); if (CVarGetInteger(CVAR_TRACKER_ITEM("DungeonItems.Layout"), 1)) { if (CVarGetInteger(CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), 1)) { @@ -1507,44 +1592,52 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Greg"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Greg Tracker"); DrawItemsInRows(gregItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Triforce Piece Tracker"); DrawItemsInRows(triforcePieces); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.BossSouls"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.BossSouls"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Boss Soul Tracker"); DrawItemsInRows(bossSoulItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Ocarina Button Tracker"); DrawItemsInRows(ocarinaButtonItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { BeginFloatingWindows("Overworld Key Tracker"); DrawItemsInRows(overworldKeyItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.FishingPole"), SECTION_DISPLAY_EXTENDED_HIDDEN) == + SECTION_DISPLAY_EXTENDED_SEPARATE) { BeginFloatingWindows("Fishing Pole Tracker"); DrawItemsInRows(fishingPoleItems); EndFloatingWindows(); } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE && CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { - ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver); + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Notes"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE && + CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { + ImGui::SetNextWindowSize(ImVec2(400, 300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); DrawNotes(true); EndFloatingWindows(); @@ -1561,22 +1654,52 @@ void ItemTrackerWindow::DrawElement() { } static std::unordered_map itemTrackerCapacityTrackOptions = { - { ITEM_TRACKER_NUMBER_NONE, "No Numbers" }, { ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, "Current Capacity" }, { ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, "Current Ammo" }, - { ITEM_TRACKER_NUMBER_CAPACITY, "Current Capacity / Max Capacity" }, { ITEM_TRACKER_NUMBER_AMMO, "Current Ammo / Current Capacity" },}; + { ITEM_TRACKER_NUMBER_NONE, "No Numbers" }, + { ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY, "Current Capacity" }, + { ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY, "Current Ammo" }, + { ITEM_TRACKER_NUMBER_CAPACITY, "Current Capacity / Max Capacity" }, + { ITEM_TRACKER_NUMBER_AMMO, "Current Ammo / Current Capacity" }, +}; static std::unordered_map itemTrackerKeyTrackOptions = { - { KEYS_COLLECTED_MAX, "Collected / Max" }, { KEYS_CURRENT_COLLECTED_MAX, "Current / Collected / Max" }, { KEYS_CURRENT_MAX, "Current / Max" },}; + { KEYS_COLLECTED_MAX, "Collected / Max" }, + { KEYS_CURRENT_COLLECTED_MAX, "Current / Collected / Max" }, + { KEYS_CURRENT_MAX, "Current / Max" }, +}; static std::unordered_map itemTrackerTriforcePieceTrackOptions = { - { TRIFORCE_PIECE_COLLECTED_REQUIRED, "Collected / Required" }, { TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, "Collected / Required / Max" },}; -static std::unordered_map windowTypes = {{ TRACKER_WINDOW_FLOATING, "Floating" }, { TRACKER_WINDOW_WINDOW, "Window" },}; -static std::unordered_map displayModes = {{ TRACKER_DISPLAY_ALWAYS, "Always" }, { TRACKER_DISPLAY_COMBO_BUTTON, "Combo Button Hold" },}; -static std::unordered_map buttons = {{ TRACKER_COMBO_BUTTON_A, "A" }, { TRACKER_COMBO_BUTTON_B, "B"}, { TRACKER_COMBO_BUTTON_C_UP, "C-Up"}, - { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, { TRACKER_COMBO_BUTTON_L, "L" }, - { TRACKER_COMBO_BUTTON_Z, "Z" }, { TRACKER_COMBO_BUTTON_R, "R" }, { TRACKER_COMBO_BUTTON_START, "Start" }, { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, - { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" },}; -static std::unordered_map displayTypes = {{ SECTION_DISPLAY_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_SEPARATE, "Separate" },}; -static std::unordered_map extendedDisplayTypes = {{ SECTION_DISPLAY_EXTENDED_HIDDEN, "Hidden" }, - { SECTION_DISPLAY_EXTENDED_MAIN_WINDOW, "Main Window" }, { SECTION_DISPLAY_EXTENDED_MISC_WINDOW, "Misc Window" }, { SECTION_DISPLAY_EXTENDED_SEPARATE, "Separate" },}; -static std::unordered_map minimalDisplayTypes = {{ SECTION_DISPLAY_MINIMAL_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MINIMAL_SEPARATE, "Separate" }}; + { TRIFORCE_PIECE_COLLECTED_REQUIRED, "Collected / Required" }, + { TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX, "Collected / Required / Max" }, +}; +static std::unordered_map windowTypes = { + { TRACKER_WINDOW_FLOATING, "Floating" }, + { TRACKER_WINDOW_WINDOW, "Window" }, +}; +static std::unordered_map displayModes = { + { TRACKER_DISPLAY_ALWAYS, "Always" }, + { TRACKER_DISPLAY_COMBO_BUTTON, "Combo Button Hold" }, +}; +static std::unordered_map buttons = { + { TRACKER_COMBO_BUTTON_A, "A" }, { TRACKER_COMBO_BUTTON_B, "B" }, + { TRACKER_COMBO_BUTTON_C_UP, "C-Up" }, { TRACKER_COMBO_BUTTON_C_DOWN, "C-Down" }, + { TRACKER_COMBO_BUTTON_C_LEFT, "C-Left" }, { TRACKER_COMBO_BUTTON_C_RIGHT, "C-Right" }, + { TRACKER_COMBO_BUTTON_L, "L" }, { TRACKER_COMBO_BUTTON_Z, "Z" }, + { TRACKER_COMBO_BUTTON_R, "R" }, { TRACKER_COMBO_BUTTON_START, "Start" }, + { TRACKER_COMBO_BUTTON_D_UP, "D-Up" }, { TRACKER_COMBO_BUTTON_D_DOWN, "D-Down" }, + { TRACKER_COMBO_BUTTON_D_LEFT, "D-Left" }, { TRACKER_COMBO_BUTTON_D_RIGHT, "D-Right" }, +}; +static std::unordered_map displayTypes = { + { SECTION_DISPLAY_HIDDEN, "Hidden" }, + { SECTION_DISPLAY_MAIN_WINDOW, "Main Window" }, + { SECTION_DISPLAY_SEPARATE, "Separate" }, +}; +static std::unordered_map extendedDisplayTypes = { + { SECTION_DISPLAY_EXTENDED_HIDDEN, "Hidden" }, + { SECTION_DISPLAY_EXTENDED_MAIN_WINDOW, "Main Window" }, + { SECTION_DISPLAY_EXTENDED_MISC_WINDOW, "Misc Window" }, + { SECTION_DISPLAY_EXTENDED_SEPARATE, "Separate" }, +}; +static std::unordered_map minimalDisplayTypes = { + { SECTION_DISPLAY_MINIMAL_HIDDEN, "Hidden" }, { SECTION_DISPLAY_MINIMAL_SEPARATE, "Separate" } +}; void ItemTrackerSettingsWindow::DrawElement() { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); @@ -1588,12 +1711,15 @@ void ItemTrackerSettingsWindow::DrawElement() { ImGui::TableNextColumn(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); CVarColorPicker("Background Color##gItemTrackerBgColor", CVAR_TRACKER_ITEM("BgColor"), { 0, 0, 0, 0 }, true, - ColorPickerRandomButton | ColorPickerResetButton, THEME_COLOR); + ColorPickerRandomButton | ColorPickerResetButton, THEME_COLOR); ImGui::PopItemWidth(); - if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, ComboboxOptions() - .DefaultIndex(TRACKER_WINDOW_FLOATING).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, + ComboboxOptions() + .DefaultIndex(TRACKER_WINDOW_FLOATING) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } @@ -1601,152 +1727,229 @@ void ItemTrackerSettingsWindow::DrawElement() { if (CVarCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"), CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"), CheckboxOptions().Color(THEME_COLOR))) { + if (CVarCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"), + CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, ComboboxOptions() - .DefaultIndex(TRACKER_DISPLAY_ALWAYS).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes, + ComboboxOptions() + .DefaultIndex(TRACKER_DISPLAY_ALWAYS) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) { - if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, ComboboxOptions() - .DefaultIndex(TRACKER_COMBO_BUTTON_L).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == + TRACKER_DISPLAY_COMBO_BUTTON) { + if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, + ComboboxOptions() + .DefaultIndex(TRACKER_COMBO_BUTTON_L) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, ComboboxOptions() - .DefaultIndex(TRACKER_COMBO_BUTTON_R).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, + ComboboxOptions() + .DefaultIndex(TRACKER_COMBO_BUTTON_R) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } } } ImGui::Separator(); - CVarSliderInt("Icon size : %dpx", CVAR_TRACKER_ITEM("IconSize"), IntSliderOptions().Min(25).Max(128).DefaultValue(36).Color(THEME_COLOR)); - CVarSliderInt("Icon margins : %dpx", CVAR_TRACKER_ITEM("IconSpacing"), IntSliderOptions().Min(-5).Max(50).DefaultValue(12).Color(THEME_COLOR)); - CVarSliderInt("Text size : %dpx", CVAR_TRACKER_ITEM("TextSize"), IntSliderOptions().Min(1).Max(30).DefaultValue(13).Color(THEME_COLOR)); - + CVarSliderInt("Icon size : %dpx", CVAR_TRACKER_ITEM("IconSize"), + IntSliderOptions().Min(25).Max(128).DefaultValue(36).Color(THEME_COLOR)); + CVarSliderInt("Icon margins : %dpx", CVAR_TRACKER_ITEM("IconSpacing"), + IntSliderOptions().Min(-5).Max(50).DefaultValue(12).Color(THEME_COLOR)); + CVarSliderInt("Text size : %dpx", CVAR_TRACKER_ITEM("TextSize"), + IntSliderOptions().Min(1).Max(30).DefaultValue(13).Color(THEME_COLOR)); + ImGui::NewLine(); - CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, ComboboxOptions() - .DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY).ComponentAlignment(ComponentAlignments::Left) - .LabelPosition(LabelPositions::Above).Color(THEME_COLOR) - .Tooltip("Customize what the numbers under each item are tracking." - "\n\nNote: items without capacity upgrades will track ammo even in capacity mode")); - if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { - if (CVarCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"), CheckboxOptions().Color(THEME_COLOR))) { + CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, + ComboboxOptions() + .DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above) + .Color(THEME_COLOR) + .Tooltip("Customize what the numbers under each item are tracking." + "\n\nNote: items without capacity upgrades will track ammo even in capacity mode")); + if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == + ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || + CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == + ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { + if (CVarCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"), + CheckboxOptions().Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, ComboboxOptions() - .DefaultIndex(KEYS_COLLECTED_MAX).ComponentAlignment(ComponentAlignments::Left) - .LabelPosition(LabelPositions::Above).Color(THEME_COLOR) - .Tooltip("Customize what numbers are shown for key tracking.")); + CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, + ComboboxOptions() + .DefaultIndex(KEYS_COLLECTED_MAX) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above) + .Color(THEME_COLOR) + .Tooltip("Customize what numbers are shown for key tracking.")); - CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"), itemTrackerTriforcePieceTrackOptions, ComboboxOptions() - .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX).ComponentAlignment(ComponentAlignments::Left) - .LabelPosition(LabelPositions::Above).Color(THEME_COLOR) - .Tooltip("Customize what numbers are shown for triforce piece tracking.")); + CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"), + itemTrackerTriforcePieceTrackOptions, + ComboboxOptions() + .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX) + .ComponentAlignment(ComponentAlignments::Left) + .LabelPosition(LabelPositions::Above) + .Color(THEME_COLOR) + .Tooltip("Customize what numbers are shown for triforce piece tracking.")); ImGui::TableNextColumn(); - if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) == + SECTION_DISPLAY_SEPARATE) { if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"))) { shouldUpdateVectors = true; } } - if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) != SECTION_DISPLAY_HIDDEN) { - if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { - if (CVarCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) != + SECTION_DISPLAY_HIDDEN) { + if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) == + SECTION_DISPLAY_SEPARATE) { + if (CVarCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), + CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (CVarCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { + if (CVarCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), + CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Overworld Keys", CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Overworld Keys", CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } - if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { - if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, ComboboxOptions() - .DefaultIndex(SECTION_DISPLAY_HIDDEN).ComponentAlignment(ComponentAlignments::Right) - .LabelPosition(LabelPositions::Far).Color(THEME_COLOR))) { + if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes, + ComboboxOptions() + .DefaultIndex(SECTION_DISPLAY_HIDDEN) + .ComponentAlignment(ComponentAlignments::Right) + .LabelPosition(LabelPositions::Far) + .Color(THEME_COLOR))) { shouldUpdateVectors = true; } } - CVarCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier"), CheckboxOptions() - .Tooltip("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot.").Color(THEME_COLOR)); + CVarCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier"), + CheckboxOptions() + .Tooltip("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot.") + .Color(THEME_COLOR)); ImGui::PopStyleVar(1); ImGui::EndTable(); diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index 5405b1ea2..55f7b8974 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -19,15 +19,11 @@ bool HasSong(ItemTrackerItem); bool HasQuestItem(ItemTrackerItem); bool HasEquipment(ItemTrackerItem); -#define ITEM_TRACKER_ITEM(id, data, drawFunc) \ - { \ - id, #id, #id "_Faded", data, drawFunc \ - } +#define ITEM_TRACKER_ITEM(id, data, drawFunc) \ + { id, #id, #id "_Faded", data, drawFunc } -#define ITEM_TRACKER_ITEM_CUSTOM(id, name, nameFaded, data, drawFunc)\ - { \ - id, #name, #nameFaded "_Faded", data, drawFunc \ - } +#define ITEM_TRACKER_ITEM_CUSTOM(id, name, nameFaded, data, drawFunc) \ + { id, #name, #nameFaded "_Faded", data, drawFunc } typedef struct ItemTrackerDungeon { uint32_t id; @@ -39,9 +35,9 @@ class ItemTrackerSettingsWindow : public Ship::GuiWindow { using GuiWindow::GuiWindow; protected: - void InitElement() override {}; + void InitElement() override{}; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; class ItemTrackerWindow : public Ship::GuiWindow { @@ -49,8 +45,8 @@ class ItemTrackerWindow : public Ship::GuiWindow { using GuiWindow::GuiWindow; void Draw() override; -protected: + protected: void InitElement() override; void DrawElement() override; - void UpdateElement() override {}; + void UpdateElement() override{}; }; \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 049b87f65..4753bb4b4 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -106,7 +106,6 @@ void GiveLinksPocketItem() { } } - void SetStartingItems() { if (Randomizer_GetSettingValue(RSK_STARTING_KOKIRI_SWORD)) Item_Give(NULL, ITEM_SWORD_KOKIRI); @@ -174,22 +173,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.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_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.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 + 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 @@ -203,11 +202,11 @@ void SetStartingItems() { } if (Randomizer_GetSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_STARTWITH) { - gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest - gSaveContext.inventory.dungeonItems[SCENE_FIRE_TEMPLE] |= 1; // Fire - gSaveContext.inventory.dungeonItems[SCENE_WATER_TEMPLE] |= 1; // Water + gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest + gSaveContext.inventory.dungeonItems[SCENE_FIRE_TEMPLE] |= 1; // Fire + gSaveContext.inventory.dungeonItems[SCENE_WATER_TEMPLE] |= 1; // Water gSaveContext.inventory.dungeonItems[SCENE_SPIRIT_TEMPLE] |= 1; // Spirit - gSaveContext.inventory.dungeonItems[SCENE_SHADOW_TEMPLE] |= 1; // Shadow + gSaveContext.inventory.dungeonItems[SCENE_SHADOW_TEMPLE] |= 1; // Shadow } if (Randomizer_GetSettingValue(RSK_GANONS_BOSS_KEY) == RO_GANON_BOSS_KEY_STARTWITH) { @@ -288,13 +287,9 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.entranceIndex = -1; } - for (auto trialFlag : { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, - EVENTCHKINF_COMPLETED_FOREST_TRIAL, - EVENTCHKINF_COMPLETED_FIRE_TRIAL, - EVENTCHKINF_COMPLETED_WATER_TRIAL, - EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, - EVENTCHKINF_COMPLETED_SHADOW_TRIAL } - ) { + for (auto trialFlag : { EVENTCHKINF_COMPLETED_LIGHT_TRIAL, EVENTCHKINF_COMPLETED_FOREST_TRIAL, + EVENTCHKINF_COMPLETED_FIRE_TRIAL, EVENTCHKINF_COMPLETED_WATER_TRIAL, + EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, EVENTCHKINF_COMPLETED_SHADOW_TRIAL }) { if (!OTRGlobals::Instance->gRandomizer->IsTrialRequired(trialFlag)) { Flags_SetEventChkInf(trialFlag); } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 8ade6a95a..c40f99168 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -13,7 +13,8 @@ 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 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); for (int i = min; i <= max; i += step) { @@ -24,7 +25,7 @@ std::vector NumOpts(const int min, const int max, const int step = std::vector MultiVecOpts(const std::vector>& optionsVector) { uint32_t totalSize = 0; - for (const auto& vector: optionsVector) { + for (const auto& vector : optionsVector) { totalSize += vector.size(); } std::vector options; @@ -37,11 +38,11 @@ std::vector MultiVecOpts(const std::vector return options; } -void Settings::HandleShopsanityPriceUI(){ +void Settings::HandleShopsanityPriceUI() { bool isTycoon = CVarGetInteger(CVAR_RANDOMIZER_SETTING("IncludeTycoonWallet"), RO_GENERIC_OFF); mOptions[RSK_SHOPSANITY].RemoveFlag(IMFLAG_SEPARATOR_BOTTOM); mOptions[RSK_SHOPSANITY_PRICES].Unhide(); - switch (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_VANILLA)){ + switch (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), RO_PRICE_VANILLA)) { case RO_PRICE_FIXED: mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].Unhide(); mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].Hide(); @@ -51,7 +52,8 @@ void Settings::HandleShopsanityPriceUI(){ mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Hide(); - if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 501 : mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 1000) { + if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 501 + : mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].GetOptionCount() == 1000) { mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE].ChangeOptions(isTycoon ? NumOpts(0, 999) : NumOpts(0, 500)); } mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE].Hide(); @@ -65,9 +67,12 @@ void Settings::HandleShopsanityPriceUI(){ mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT].Hide(); mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Hide(); - if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 101 : mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 200) { - mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) : NumOpts(0, 500, 5)); - mOptions[RSK_SHOPSANITY_PRICES_RANGE_2].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) : NumOpts(0, 500, 5)); + if (isTycoon ? mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 101 + : mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].GetOptionCount() == 200) { + mOptions[RSK_SHOPSANITY_PRICES_RANGE_1].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) + : NumOpts(0, 500, 5)); + mOptions[RSK_SHOPSANITY_PRICES_RANGE_2].ChangeOptions(isTycoon ? NumOpts(0, 995, 5) + : NumOpts(0, 500, 5)); } mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE].Unhide(); break; @@ -79,7 +84,7 @@ void Settings::HandleShopsanityPriceUI(){ mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT].Unhide(); mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT].Unhide(); mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT].Unhide(); - if (isTycoon){ + if (isTycoon) { mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Unhide(); } else { mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT].Hide(); @@ -335,211 +340,796 @@ void Settings::CreateOptions() { mExcludeLocationsOptionsAreas.reserve(RCAREA_INVALID); // the following are glitches and are currently disabled - // 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."); + // 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."); - 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 - // 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) - // 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 Bomb Flower 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 - // 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. - 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 conjunction 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 - 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 Fire 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) - 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 - // 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 Fire."); - 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 hookshooting 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."); + 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 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) 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 Bomb Flower 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 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. + 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 conjunction 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 + 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 Fire 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) + 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 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 Fire."); + 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 hookshooting 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], - &mOptions[RSK_ALL_LOCATIONS_REACHABLE], - &mOptions[RSK_SKULLS_SUNS_SONG], - }); + &mOptions[RSK_LOGIC_RULES], + &mOptions[RSK_ALL_LOCATIONS_REACHABLE], + &mOptions[RSK_SKULLS_SUNS_SONG], + }); // TODO: Exclude Locations Menus mTricksByArea.clear(); std::vector tricksOption; @@ -554,563 +1144,586 @@ void Settings::CreateOptions() { } mOptionGroups[RSG_TRICKS] = OptionGroup::SubGroup("Logical Tricks", tricksOption); // TODO: Glitches - mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", { - &mOptions[RSK_FOREST], - &mOptions[RSK_KAK_GATE], - &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], - &mOptions[RSK_GERUDO_FORTRESS], - &mOptions[RSK_RAINBOW_BRIDGE], - &mOptions[RSK_BRIDGE_OPTIONS], - &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], - &mOptions[RSK_GANONS_TRIALS], - &mOptions[RSK_TRIAL_COUNT], - &mOptions[RSK_MQ_DUNGEON_RANDOM], - &mOptions[RSK_MQ_DUNGEON_COUNT], - &mOptions[RSK_MQ_DUNGEON_SET], - &mOptions[RSK_MQ_DEKU_TREE], - &mOptions[RSK_MQ_DODONGOS_CAVERN], - &mOptions[RSK_MQ_JABU_JABU], - &mOptions[RSK_MQ_FOREST_TEMPLE], - &mOptions[RSK_MQ_FIRE_TEMPLE], - &mOptions[RSK_MQ_WATER_TEMPLE], - &mOptions[RSK_MQ_SPIRIT_TEMPLE], - &mOptions[RSK_MQ_SHADOW_TEMPLE], - &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], - &mOptions[RSK_MQ_ICE_CAVERN], - &mOptions[RSK_MQ_GTG], - &mOptions[RSK_MQ_GANONS_CASTLE], - &mOptions[RSK_TRIFORCE_HUNT], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI] = OptionGroup::SubGroup("Shuffle Entrances", { - &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], - &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], - &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], - &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], - &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], - &mOptions[RSK_SHUFFLE_OWL_DROPS], - &mOptions[RSK_SHUFFLE_WARP_SONGS], - &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], - &mOptions[RSK_DECOUPLED_ENTRANCES], - &mOptions[RSK_MIXED_ENTRANCE_POOLS], - &mOptions[RSK_MIX_DUNGEON_ENTRANCES], - &mOptions[RSK_MIX_BOSS_ENTRANCES], - &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], - &mOptions[RSK_MIX_INTERIOR_ENTRANCES], - &mOptions[RSK_MIX_GROTTO_ENTRANCES] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_WORLD_IMGUI_TABLE] = OptionGroup::SubGroup("World", { - &mOptionGroups[RSG_AREA_ACCESS_IMGUI], - &mOptionGroups[RSG_WORLD_IMGUI], - &mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI], - }, WidgetContainerType::TABLE); - mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Items", { - &mOptions[RSK_SHUFFLE_SONGS], - &mOptions[RSK_SHUFFLE_TOKENS], - &mOptions[RSK_SKULLS_SUNS_SONG], - &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], - &mOptions[RSK_SHUFFLE_MASTER_SWORD], - &mOptions[RSK_SHUFFLE_CHILD_WALLET], - &mOptions[RSK_INCLUDE_TYCOON_WALLET], - &mOptions[RSK_SHUFFLE_OCARINA], - &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], - &mOptions[RSK_SHUFFLE_SWIM], - &mOptions[RSK_SHUFFLE_WEIRD_EGG], - &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], - &mOptions[RSK_SHUFFLE_FISHING_POLE], - &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], - &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], - &mOptions[RSK_SHUFFLE_FREESTANDING], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = OptionGroup::SubGroup("Shuffle NPCs & Merchants", { - &mOptions[RSK_SHOPSANITY], - &mOptions[RSK_SHOPSANITY_COUNT], - &mOptions[RSK_SHOPSANITY_PRICES], - &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], - &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], - &mOptions[RSK_FISHSANITY], - &mOptions[RSK_FISHSANITY_POND_COUNT], - &mOptions[RSK_FISHSANITY_AGE_SPLIT], - &mOptions[RSK_SHUFFLE_SCRUBS], - &mOptions[RSK_SCRUBS_PRICES], - &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], - &mOptions[RSK_SCRUBS_PRICES_RANGE_1], - &mOptions[RSK_SCRUBS_PRICES_RANGE_2], - &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_BEEHIVES], - &mOptions[RSK_SHUFFLE_COWS], - &mOptions[RSK_SHUFFLE_POTS], - &mOptions[RSK_SHUFFLE_CRATES], - &mOptions[RSK_SHUFFLE_MERCHANTS], - &mOptions[RSK_MERCHANT_PRICES], - &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], - &mOptions[RSK_MERCHANT_PRICES_RANGE_1], - &mOptions[RSK_MERCHANT_PRICES_RANGE_2], - &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], - &mOptions[RSK_SHUFFLE_ADULT_TRADE], - &mOptions[RSK_SHUFFLE_100_GS_REWARD], - &mOptions[RSK_SHUFFLE_BOSS_SOULS], - &mOptions[RSK_SHUFFLE_FAIRIES], - &mOptions[RSK_SHUFFLE_GRASS], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", { - &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], - &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], - &mOptions[RSK_KEYSANITY], - &mOptions[RSK_GERUDO_KEYS], - &mOptions[RSK_BOSS_KEYSANITY], - &mOptions[RSK_GANONS_BOSS_KEY], - &mOptions[RSK_LACS_STONE_COUNT], - &mOptions[RSK_LACS_MEDALLION_COUNT], - &mOptions[RSK_LACS_DUNGEON_COUNT], - &mOptions[RSK_LACS_REWARD_COUNT], - &mOptions[RSK_LACS_TOKEN_COUNT], - &mOptions[RSK_LACS_OPTIONS], - &mOptions[RSK_KEYRINGS], - &mOptions[RSK_KEYRINGS_RANDOM_COUNT], - &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], - &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], - &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], - &mOptions[RSK_KEYRINGS_WATER_TEMPLE], - &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], - &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], - &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], - &mOptions[RSK_KEYRINGS_GTG], - &mOptions[RSK_KEYRINGS_GANONS_CASTLE], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_ITEMS_IMGUI_TABLE] = OptionGroup::SubGroup("Items", { - &mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI], - &mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI], - &mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI], - }, WidgetContainerType::TABLE); - mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup("Timesavers", { - &mOptions[RSK_CUCCO_COUNT], - &mOptions[RSK_BIG_POE_COUNT], - &mOptions[RSK_SKIP_CHILD_ZELDA], - &mOptions[RSK_SKIP_EPONA_RACE], - &mOptions[RSK_COMPLETE_MASK_QUEST], - &mOptions[RSK_SKIP_SCARECROWS_SONG] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("", { - &mOptions[RSK_ITEM_POOL], - &mOptions[RSK_ICE_TRAPS], - &mOptions[RSK_GOSSIP_STONE_HINTS], - &mOptions[RSK_HINT_CLARITY], - &mOptions[RSK_HINT_DISTRIBUTION], - }, WidgetContainerType::SECTION); - mOptionGroups[RSG_EXTRA_HINTS_IMGUI] = OptionGroup::SubGroup("Extra Hints", { - &mOptions[RSK_TOT_ALTAR_HINT], - &mOptions[RSK_GANONDORF_HINT], - &mOptions[RSK_SHEIK_LA_HINT], - &mOptions[RSK_DAMPES_DIARY_HINT], - &mOptions[RSK_GREG_HINT], - &mOptions[RSK_LOACH_HINT], - &mOptions[RSK_SARIA_HINT], - &mOptions[RSK_FROGS_HINT], - &mOptions[RSK_OOT_HINT], - &mOptions[RSK_BIGGORON_HINT], - &mOptions[RSK_BIG_POES_HINT], - &mOptions[RSK_CHICKENS_HINT], - &mOptions[RSK_MALON_HINT], - &mOptions[RSK_HBA_HINT], - &mOptions[RSK_FISHING_POLE_HINT], - &mOptions[RSK_WARP_SONG_HINTS], - &mOptions[RSK_SCRUB_TEXT_HINT], - &mOptions[RSK_MERCHANT_TEXT_HINT], - &mOptions[RSK_KAK_10_SKULLS_HINT], - &mOptions[RSK_KAK_20_SKULLS_HINT], - &mOptions[RSK_KAK_30_SKULLS_HINT], - &mOptions[RSK_KAK_40_SKULLS_HINT], - &mOptions[RSK_KAK_50_SKULLS_HINT], - &mOptions[RSK_KAK_100_SKULLS_HINT], - &mOptions[RSK_MASK_SHOP_HINT] - }, WidgetContainerType::SECTION, "This setting adds some hints at locations other than Gossip Stones."); - mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN] = OptionGroup::SubGroup("Item Pool & Hints", std::initializer_list{ - &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI], - &mOptionGroups[RSG_EXTRA_HINTS_IMGUI], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] = OptionGroup::SubGroup("Additional Features", { - &mOptions[RSK_FULL_WALLETS], - &mOptions[RSK_BOMBCHU_BAG], - &mOptions[RSK_ENABLE_BOMBCHU_DROPS], - &mOptions[RSK_BLUE_FIRE_ARROWS], - &mOptions[RSK_SUNLIGHT_ARROWS], - &mOptions[RSK_INFINITE_UPGRADES], - &mOptions[RSK_SKELETON_KEY], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_GAMEPLAY_IMGUI_TABLE] = OptionGroup::SubGroup("Gameplay", { - &mOptionGroups[RSG_TIMESAVERS_IMGUI], - &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN], - &mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] - }, WidgetContainerType::TABLE); - mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI] = OptionGroup::SubGroup("Starting Equipment", { - &mOptions[RSK_LINKS_POCKET], - &mOptions[RSK_STARTING_KOKIRI_SWORD], - &mOptions[RSK_STARTING_MASTER_SWORD], - &mOptions[RSK_STARTING_DEKU_SHIELD] - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_STARTING_ITEMS_IMGUI] = OptionGroup::SubGroup("Starting Items", { - &mOptions[RSK_STARTING_OCARINA], - &mOptions[RSK_STARTING_STICKS], - &mOptions[RSK_STARTING_NUTS], - &mOptions[RSK_STARTING_SKULLTULA_TOKEN], - &mOptions[RSK_STARTING_HEARTS], - }, WidgetContainerType::COLUMN); - mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI] = OptionGroup::SubGroup("Normal Songs", { - &mOptions[RSK_STARTING_ZELDAS_LULLABY], - &mOptions[RSK_STARTING_EPONAS_SONG], - &mOptions[RSK_STARTING_SARIAS_SONG], - &mOptions[RSK_STARTING_SUNS_SONG], - &mOptions[RSK_STARTING_SONG_OF_TIME], - &mOptions[RSK_STARTING_SONG_OF_STORMS], - }, WidgetContainerType::SECTION); - mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI] = OptionGroup::SubGroup("Warp Songs", { - &mOptions[RSK_STARTING_MINUET_OF_FOREST], - &mOptions[RSK_STARTING_BOLERO_OF_FIRE], - &mOptions[RSK_STARTING_SERENADE_OF_WATER], - &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], - &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], - &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT] - }, WidgetContainerType::SECTION); - mOptionGroups[RSG_STARTING_SONGS_IMGUI] = OptionGroup::SubGroup("Starting Songs", std::initializer_list({ - &mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI], - &mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI], - }), WidgetContainerType::COLUMN); - mOptionGroups[RSG_STARTING_INVENTORY_IMGUI_TABLE] = OptionGroup::SubGroup("Starting Inventory", { - &mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI], - &mOptionGroups[RSG_STARTING_ITEMS_IMGUI], - &mOptionGroups[RSG_STARTING_SONGS_IMGUI] - }, WidgetContainerType::TABLE); + mOptionGroups[RSG_AREA_ACCESS_IMGUI] = OptionGroup::SubGroup("Area Access", + { + &mOptions[RSK_FOREST], + &mOptions[RSK_KAK_GATE], + &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], + &mOptions[RSK_GERUDO_FORTRESS], + &mOptions[RSK_RAINBOW_BRIDGE], + &mOptions[RSK_BRIDGE_OPTIONS], + &mOptions[RSK_RAINBOW_BRIDGE_STONE_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], + &mOptions[RSK_GANONS_TRIALS], + &mOptions[RSK_TRIAL_COUNT], + &mOptions[RSK_MQ_DUNGEON_RANDOM], + &mOptions[RSK_MQ_DUNGEON_COUNT], + &mOptions[RSK_MQ_DUNGEON_SET], + &mOptions[RSK_MQ_DEKU_TREE], + &mOptions[RSK_MQ_DODONGOS_CAVERN], + &mOptions[RSK_MQ_JABU_JABU], + &mOptions[RSK_MQ_FOREST_TEMPLE], + &mOptions[RSK_MQ_FIRE_TEMPLE], + &mOptions[RSK_MQ_WATER_TEMPLE], + &mOptions[RSK_MQ_SPIRIT_TEMPLE], + &mOptions[RSK_MQ_SHADOW_TEMPLE], + &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], + &mOptions[RSK_MQ_ICE_CAVERN], + &mOptions[RSK_MQ_GTG], + &mOptions[RSK_MQ_GANONS_CASTLE], + &mOptions[RSK_TRIFORCE_HUNT], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI] = OptionGroup::SubGroup( + "Shuffle Entrances", + { &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], + &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], + &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], &mOptions[RSK_SHUFFLE_OWL_DROPS], &mOptions[RSK_SHUFFLE_WARP_SONGS], + &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], &mOptions[RSK_DECOUPLED_ENTRANCES], + &mOptions[RSK_MIXED_ENTRANCE_POOLS], &mOptions[RSK_MIX_DUNGEON_ENTRANCES], &mOptions[RSK_MIX_BOSS_ENTRANCES], + &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], &mOptions[RSK_MIX_INTERIOR_ENTRANCES], + &mOptions[RSK_MIX_GROTTO_ENTRANCES] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_WORLD_IMGUI_TABLE] = OptionGroup::SubGroup("World", + { + &mOptionGroups[RSG_AREA_ACCESS_IMGUI], + &mOptionGroups[RSG_WORLD_IMGUI], + &mOptionGroups[RSG_SHUFFLE_ENTRANCES_IMGUI], + }, + WidgetContainerType::TABLE); + mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Items", + { + &mOptions[RSK_SHUFFLE_SONGS], + &mOptions[RSK_SHUFFLE_TOKENS], + &mOptions[RSK_SKULLS_SUNS_SONG], + &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], + &mOptions[RSK_SHUFFLE_MASTER_SWORD], + &mOptions[RSK_SHUFFLE_CHILD_WALLET], + &mOptions[RSK_INCLUDE_TYCOON_WALLET], + &mOptions[RSK_SHUFFLE_OCARINA], + &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], + &mOptions[RSK_SHUFFLE_SWIM], + &mOptions[RSK_SHUFFLE_WEIRD_EGG], + &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], + &mOptions[RSK_SHUFFLE_FISHING_POLE], + &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], + &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = + OptionGroup::SubGroup("Shuffle NPCs & Merchants", + { + &mOptions[RSK_SHOPSANITY], + &mOptions[RSK_SHOPSANITY_COUNT], + &mOptions[RSK_SHOPSANITY_PRICES], + &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], + &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], + &mOptions[RSK_FISHSANITY], + &mOptions[RSK_FISHSANITY_POND_COUNT], + &mOptions[RSK_FISHSANITY_AGE_SPLIT], + &mOptions[RSK_SHUFFLE_SCRUBS], + &mOptions[RSK_SCRUBS_PRICES], + &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], + &mOptions[RSK_SCRUBS_PRICES_RANGE_1], + &mOptions[RSK_SCRUBS_PRICES_RANGE_2], + &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_BEEHIVES], + &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_MERCHANTS], + &mOptions[RSK_MERCHANT_PRICES], + &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], + &mOptions[RSK_MERCHANT_PRICES_RANGE_1], + &mOptions[RSK_MERCHANT_PRICES_RANGE_2], + &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], + &mOptions[RSK_SHUFFLE_ADULT_TRADE], + &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_BOSS_SOULS], + &mOptions[RSK_SHUFFLE_FAIRIES], + &mOptions[RSK_SHUFFLE_GRASS], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = + OptionGroup::SubGroup("Shuffle Dungeon Items", + { + &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], + &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], + &mOptions[RSK_KEYSANITY], + &mOptions[RSK_GERUDO_KEYS], + &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_GANONS_BOSS_KEY], + &mOptions[RSK_LACS_STONE_COUNT], + &mOptions[RSK_LACS_MEDALLION_COUNT], + &mOptions[RSK_LACS_DUNGEON_COUNT], + &mOptions[RSK_LACS_REWARD_COUNT], + &mOptions[RSK_LACS_TOKEN_COUNT], + &mOptions[RSK_LACS_OPTIONS], + &mOptions[RSK_KEYRINGS], + &mOptions[RSK_KEYRINGS_RANDOM_COUNT], + &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], + &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], + &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], + &mOptions[RSK_KEYRINGS_WATER_TEMPLE], + &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], + &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], + &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], + &mOptions[RSK_KEYRINGS_GTG], + &mOptions[RSK_KEYRINGS_GANONS_CASTLE], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_ITEMS_IMGUI_TABLE] = OptionGroup::SubGroup("Items", + { + &mOptionGroups[RSG_SHUFFLE_ITEMS_IMGUI], + &mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI], + &mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI], + }, + WidgetContainerType::TABLE); + mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup( + "Timesavers", + { &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_SKIP_CHILD_ZELDA], + &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_COMPLETE_MASK_QUEST], &mOptions[RSK_SKIP_SCARECROWS_SONG] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("", + { + &mOptions[RSK_ITEM_POOL], + &mOptions[RSK_ICE_TRAPS], + &mOptions[RSK_GOSSIP_STONE_HINTS], + &mOptions[RSK_HINT_CLARITY], + &mOptions[RSK_HINT_DISTRIBUTION], + }, + WidgetContainerType::SECTION); + mOptionGroups[RSG_EXTRA_HINTS_IMGUI] = OptionGroup::SubGroup( + "Extra Hints", + { &mOptions[RSK_TOT_ALTAR_HINT], &mOptions[RSK_GANONDORF_HINT], &mOptions[RSK_SHEIK_LA_HINT], + &mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_GREG_HINT], &mOptions[RSK_LOACH_HINT], + &mOptions[RSK_SARIA_HINT], &mOptions[RSK_FROGS_HINT], &mOptions[RSK_OOT_HINT], + &mOptions[RSK_BIGGORON_HINT], &mOptions[RSK_BIG_POES_HINT], &mOptions[RSK_CHICKENS_HINT], + &mOptions[RSK_MALON_HINT], &mOptions[RSK_HBA_HINT], &mOptions[RSK_FISHING_POLE_HINT], + &mOptions[RSK_WARP_SONG_HINTS], &mOptions[RSK_SCRUB_TEXT_HINT], &mOptions[RSK_MERCHANT_TEXT_HINT], + &mOptions[RSK_KAK_10_SKULLS_HINT], &mOptions[RSK_KAK_20_SKULLS_HINT], &mOptions[RSK_KAK_30_SKULLS_HINT], + &mOptions[RSK_KAK_40_SKULLS_HINT], &mOptions[RSK_KAK_50_SKULLS_HINT], &mOptions[RSK_KAK_100_SKULLS_HINT], + &mOptions[RSK_MASK_SHOP_HINT] }, + WidgetContainerType::SECTION, "This setting adds some hints at locations other than Gossip Stones."); + mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN] = + OptionGroup::SubGroup("Item Pool & Hints", + std::initializer_list{ + &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI], + &mOptionGroups[RSG_EXTRA_HINTS_IMGUI], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] = OptionGroup::SubGroup("Additional Features", + { + &mOptions[RSK_FULL_WALLETS], + &mOptions[RSK_BOMBCHU_BAG], + &mOptions[RSK_ENABLE_BOMBCHU_DROPS], + &mOptions[RSK_BLUE_FIRE_ARROWS], + &mOptions[RSK_SUNLIGHT_ARROWS], + &mOptions[RSK_INFINITE_UPGRADES], + &mOptions[RSK_SKELETON_KEY], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_GAMEPLAY_IMGUI_TABLE] = + OptionGroup::SubGroup("Gameplay", + { &mOptionGroups[RSG_TIMESAVERS_IMGUI], &mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI_COLUMN], + &mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] }, + WidgetContainerType::TABLE); + mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI] = + OptionGroup::SubGroup("Starting Equipment", + { &mOptions[RSK_LINKS_POCKET], &mOptions[RSK_STARTING_KOKIRI_SWORD], + &mOptions[RSK_STARTING_MASTER_SWORD], &mOptions[RSK_STARTING_DEKU_SHIELD] }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_STARTING_ITEMS_IMGUI] = OptionGroup::SubGroup("Starting Items", + { + &mOptions[RSK_STARTING_OCARINA], + &mOptions[RSK_STARTING_STICKS], + &mOptions[RSK_STARTING_NUTS], + &mOptions[RSK_STARTING_SKULLTULA_TOKEN], + &mOptions[RSK_STARTING_HEARTS], + }, + WidgetContainerType::COLUMN); + mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI] = OptionGroup::SubGroup("Normal Songs", + { + &mOptions[RSK_STARTING_ZELDAS_LULLABY], + &mOptions[RSK_STARTING_EPONAS_SONG], + &mOptions[RSK_STARTING_SARIAS_SONG], + &mOptions[RSK_STARTING_SUNS_SONG], + &mOptions[RSK_STARTING_SONG_OF_TIME], + &mOptions[RSK_STARTING_SONG_OF_STORMS], + }, + WidgetContainerType::SECTION); + mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI] = + OptionGroup::SubGroup("Warp Songs", + { &mOptions[RSK_STARTING_MINUET_OF_FOREST], &mOptions[RSK_STARTING_BOLERO_OF_FIRE], + &mOptions[RSK_STARTING_SERENADE_OF_WATER], &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], + &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT] }, + WidgetContainerType::SECTION); + mOptionGroups[RSG_STARTING_SONGS_IMGUI] = OptionGroup::SubGroup("Starting Songs", + std::initializer_list({ + &mOptionGroups[RSG_STARTING_NORMAL_SONGS_IMGUI], + &mOptionGroups[RSG_STARTING_WARP_SONGS_IMGUI], + }), + WidgetContainerType::COLUMN); + mOptionGroups[RSG_STARTING_INVENTORY_IMGUI_TABLE] = + OptionGroup::SubGroup("Starting Inventory", + { &mOptionGroups[RSG_STARTING_EQUIPMENT_IMGUI], &mOptionGroups[RSG_STARTING_ITEMS_IMGUI], + &mOptionGroups[RSG_STARTING_SONGS_IMGUI] }, + WidgetContainerType::TABLE); mOptionGroups[RSG_OPEN] = OptionGroup("Open Settings", { - &mOptions[RSK_FOREST], - &mOptions[RSK_KAK_GATE], - &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], - &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], - &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], - &mOptions[RSK_BRIDGE_OPTIONS], - &mOptions[RSK_GANONS_TRIALS], - &mOptions[RSK_TRIAL_COUNT], - }); + &mOptions[RSK_FOREST], + &mOptions[RSK_KAK_GATE], + &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], + &mOptions[RSK_RAINBOW_BRIDGE_MEDALLION_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_REWARD_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_DUNGEON_COUNT], + &mOptions[RSK_RAINBOW_BRIDGE_TOKEN_COUNT], + &mOptions[RSK_BRIDGE_OPTIONS], + &mOptions[RSK_GANONS_TRIALS], + &mOptions[RSK_TRIAL_COUNT], + }); mOptionGroups[RSG_WORLD] = OptionGroup("World Settings", { - &mOptions[RSK_STARTING_AGE], - &mOptions[RSK_SHUFFLE_ENTRANCES], - &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], - &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], - &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], - &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], - &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], - &mOptions[RSK_SHUFFLE_OWL_DROPS], - &mOptions[RSK_SHUFFLE_WARP_SONGS], - &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], - &mOptions[RSK_MIXED_ENTRANCE_POOLS], - &mOptions[RSK_MIX_DUNGEON_ENTRANCES], - &mOptions[RSK_MIX_BOSS_ENTRANCES], - &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], - &mOptions[RSK_MIX_INTERIOR_ENTRANCES], - &mOptions[RSK_MIX_GROTTO_ENTRANCES], - &mOptions[RSK_DECOUPLED_ENTRANCES], - &mOptions[RSK_BOMBCHU_BAG], - &mOptions[RSK_ENABLE_BOMBCHU_DROPS], - &mOptions[RSK_TRIFORCE_HUNT], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], - &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], - &mOptions[RSK_MQ_DUNGEON_RANDOM], - &mOptions[RSK_MQ_DUNGEON_COUNT], - &mOptions[RSK_MQ_DUNGEON_SET], - }); - mOptionGroups[RSG_SHUFFLE_DUNGEON_QUESTS] = OptionGroup::SubGroup("Shuffle Dungeon Quest", { - &mOptions[RSK_MQ_DEKU_TREE], - &mOptions[RSK_MQ_DODONGOS_CAVERN], - &mOptions[RSK_MQ_JABU_JABU], - &mOptions[RSK_MQ_FOREST_TEMPLE], - &mOptions[RSK_MQ_FIRE_TEMPLE], - &mOptions[RSK_MQ_WATER_TEMPLE], - &mOptions[RSK_MQ_SPIRIT_TEMPLE], - &mOptions[RSK_MQ_SHADOW_TEMPLE], - &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], - &mOptions[RSK_MQ_ICE_CAVERN], - &mOptions[RSK_MQ_GTG], - &mOptions[RSK_MQ_GANONS_CASTLE] - }); - mOptionGroups[RSG_SHUFFLE] = OptionGroup("Shuffle Settings", { - &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], - &mOptions[RSK_LINKS_POCKET], - &mOptions[RSK_SHUFFLE_SONGS], - &mOptions[RSK_SHOPSANITY], - &mOptions[RSK_SHOPSANITY_COUNT], - &mOptions[RSK_SHOPSANITY_PRICES], - &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], - &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], - &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], - &mOptions[RSK_FISHSANITY], - &mOptions[RSK_FISHSANITY_POND_COUNT], - &mOptions[RSK_FISHSANITY_AGE_SPLIT], - &mOptions[RSK_SHUFFLE_FISHING_POLE], - &mOptions[RSK_SHUFFLE_TOKENS], - &mOptions[RSK_SHUFFLE_SCRUBS], - &mOptions[RSK_SCRUBS_PRICES], - &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], - &mOptions[RSK_SCRUBS_PRICES_RANGE_1], - &mOptions[RSK_SCRUBS_PRICES_RANGE_2], - &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_BEEHIVES], - &mOptions[RSK_SHUFFLE_COWS], - &mOptions[RSK_SHUFFLE_POTS], - &mOptions[RSK_SHUFFLE_CRATES], - &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], - &mOptions[RSK_SHUFFLE_OCARINA], - &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], - &mOptions[RSK_SHUFFLE_SWIM], - &mOptions[RSK_SHUFFLE_WEIRD_EGG], - &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], - &mOptions[RSK_SHUFFLE_MERCHANTS], - &mOptions[RSK_MERCHANT_PRICES], - &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], - &mOptions[RSK_MERCHANT_PRICES_RANGE_1], - &mOptions[RSK_MERCHANT_PRICES_RANGE_2], - &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], - &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], - &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], - &mOptions[RSK_SHUFFLE_ADULT_TRADE], - &mOptions[RSK_SHUFFLE_CHEST_MINIGAME], - &mOptions[RSK_SHUFFLE_100_GS_REWARD], - &mOptions[RSK_SHUFFLE_BOSS_SOULS], - &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], - &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], - &mOptions[RSK_SHUFFLE_FREESTANDING], - &mOptions[RSK_SHUFFLE_FAIRIES], - }); - mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = OptionGroup("Shuffle Dungeon Items", { - &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], - &mOptions[RSK_KEYSANITY], - &mOptions[RSK_GERUDO_KEYS], - &mOptions[RSK_BOSS_KEYSANITY], - &mOptions[RSK_GANONS_BOSS_KEY], - &mOptions[RSK_LACS_STONE_COUNT], - &mOptions[RSK_LACS_MEDALLION_COUNT], - &mOptions[RSK_LACS_DUNGEON_COUNT], - &mOptions[RSK_LACS_REWARD_COUNT], - &mOptions[RSK_LACS_TOKEN_COUNT], - &mOptions[RSK_LACS_OPTIONS], - &mOptions[RSK_KEYRINGS], - &mOptions[RSK_KEYRINGS_RANDOM_COUNT], - &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], - &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], - &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], - &mOptions[RSK_KEYRINGS_WATER_TEMPLE], - &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], - &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], - &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], - &mOptions[RSK_KEYRINGS_GTG], - &mOptions[RSK_KEYRINGS_GANONS_CASTLE], - }); - mOptionGroups[RSG_STARTING_ITEMS] = OptionGroup::SubGroup("Items", { - &mOptions[RSK_STARTING_OCARINA], - &mOptions[RSK_STARTING_KOKIRI_SWORD], - &mOptions[RSK_STARTING_DEKU_SHIELD] - }); - mOptionGroups[RSG_STARTING_SONGS] = OptionGroup::SubGroup("Ocarina Songs", { - &mOptions[RSK_STARTING_ZELDAS_LULLABY], - &mOptions[RSK_STARTING_EPONAS_SONG], - &mOptions[RSK_STARTING_SARIAS_SONG], - &mOptions[RSK_STARTING_SUNS_SONG], - &mOptions[RSK_STARTING_SONG_OF_TIME], - &mOptions[RSK_STARTING_SONG_OF_STORMS], - &mOptions[RSK_STARTING_SONG_OF_TIME], - &mOptions[RSK_STARTING_MINUET_OF_FOREST], - &mOptions[RSK_STARTING_BOLERO_OF_FIRE], - &mOptions[RSK_STARTING_SERENADE_OF_WATER], - &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], - &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], - &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT], - }); + &mOptions[RSK_STARTING_AGE], + &mOptions[RSK_SHUFFLE_ENTRANCES], + &mOptions[RSK_SHUFFLE_DUNGEON_ENTRANCES], + &mOptions[RSK_SHUFFLE_BOSS_ENTRANCES], + &mOptions[RSK_SHUFFLE_OVERWORLD_ENTRANCES], + &mOptions[RSK_SHUFFLE_INTERIOR_ENTRANCES], + &mOptions[RSK_SHUFFLE_GROTTO_ENTRANCES], + &mOptions[RSK_SHUFFLE_OWL_DROPS], + &mOptions[RSK_SHUFFLE_WARP_SONGS], + &mOptions[RSK_SHUFFLE_OVERWORLD_SPAWNS], + &mOptions[RSK_MIXED_ENTRANCE_POOLS], + &mOptions[RSK_MIX_DUNGEON_ENTRANCES], + &mOptions[RSK_MIX_BOSS_ENTRANCES], + &mOptions[RSK_MIX_OVERWORLD_ENTRANCES], + &mOptions[RSK_MIX_INTERIOR_ENTRANCES], + &mOptions[RSK_MIX_GROTTO_ENTRANCES], + &mOptions[RSK_DECOUPLED_ENTRANCES], + &mOptions[RSK_BOMBCHU_BAG], + &mOptions[RSK_ENABLE_BOMBCHU_DROPS], + &mOptions[RSK_TRIFORCE_HUNT], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_TOTAL], + &mOptions[RSK_TRIFORCE_HUNT_PIECES_REQUIRED], + &mOptions[RSK_MQ_DUNGEON_RANDOM], + &mOptions[RSK_MQ_DUNGEON_COUNT], + &mOptions[RSK_MQ_DUNGEON_SET], + }); + mOptionGroups[RSG_SHUFFLE_DUNGEON_QUESTS] = OptionGroup::SubGroup( + "Shuffle Dungeon Quest", + { &mOptions[RSK_MQ_DEKU_TREE], &mOptions[RSK_MQ_DODONGOS_CAVERN], &mOptions[RSK_MQ_JABU_JABU], + &mOptions[RSK_MQ_FOREST_TEMPLE], &mOptions[RSK_MQ_FIRE_TEMPLE], &mOptions[RSK_MQ_WATER_TEMPLE], + &mOptions[RSK_MQ_SPIRIT_TEMPLE], &mOptions[RSK_MQ_SHADOW_TEMPLE], &mOptions[RSK_MQ_BOTTOM_OF_THE_WELL], + &mOptions[RSK_MQ_ICE_CAVERN], &mOptions[RSK_MQ_GTG], &mOptions[RSK_MQ_GANONS_CASTLE] }); + mOptionGroups[RSG_SHUFFLE] = + OptionGroup("Shuffle Settings", { + &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], + &mOptions[RSK_LINKS_POCKET], + &mOptions[RSK_SHUFFLE_SONGS], + &mOptions[RSK_SHOPSANITY], + &mOptions[RSK_SHOPSANITY_COUNT], + &mOptions[RSK_SHOPSANITY_PRICES], + &mOptions[RSK_SHOPSANITY_PRICES_FIXED_PRICE], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_1], + &mOptions[RSK_SHOPSANITY_PRICES_RANGE_2], + &mOptions[RSK_SHOPSANITY_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SHOPSANITY_PRICES_AFFORDABLE], + &mOptions[RSK_FISHSANITY], + &mOptions[RSK_FISHSANITY_POND_COUNT], + &mOptions[RSK_FISHSANITY_AGE_SPLIT], + &mOptions[RSK_SHUFFLE_FISHING_POLE], + &mOptions[RSK_SHUFFLE_TOKENS], + &mOptions[RSK_SHUFFLE_SCRUBS], + &mOptions[RSK_SCRUBS_PRICES], + &mOptions[RSK_SCRUBS_PRICES_FIXED_PRICE], + &mOptions[RSK_SCRUBS_PRICES_RANGE_1], + &mOptions[RSK_SCRUBS_PRICES_RANGE_2], + &mOptions[RSK_SCRUBS_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_SCRUBS_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_BEEHIVES], + &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], + &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], + &mOptions[RSK_SHUFFLE_OCARINA], + &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], + &mOptions[RSK_SHUFFLE_SWIM], + &mOptions[RSK_SHUFFLE_WEIRD_EGG], + &mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD], + &mOptions[RSK_SHUFFLE_MERCHANTS], + &mOptions[RSK_MERCHANT_PRICES], + &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], + &mOptions[RSK_MERCHANT_PRICES_RANGE_1], + &mOptions[RSK_MERCHANT_PRICES_RANGE_2], + &mOptions[RSK_MERCHANT_PRICES_NO_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_CHILD_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_ADULT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_GIANT_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_TYCOON_WALLET_WEIGHT], + &mOptions[RSK_MERCHANT_PRICES_AFFORDABLE], + &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], + &mOptions[RSK_SHUFFLE_ADULT_TRADE], + &mOptions[RSK_SHUFFLE_CHEST_MINIGAME], + &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_BOSS_SOULS], + &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], + &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_FAIRIES], + }); + mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = + OptionGroup("Shuffle Dungeon Items", { + &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], + &mOptions[RSK_KEYSANITY], + &mOptions[RSK_GERUDO_KEYS], + &mOptions[RSK_BOSS_KEYSANITY], + &mOptions[RSK_GANONS_BOSS_KEY], + &mOptions[RSK_LACS_STONE_COUNT], + &mOptions[RSK_LACS_MEDALLION_COUNT], + &mOptions[RSK_LACS_DUNGEON_COUNT], + &mOptions[RSK_LACS_REWARD_COUNT], + &mOptions[RSK_LACS_TOKEN_COUNT], + &mOptions[RSK_LACS_OPTIONS], + &mOptions[RSK_KEYRINGS], + &mOptions[RSK_KEYRINGS_RANDOM_COUNT], + &mOptions[RSK_KEYRINGS_GERUDO_FORTRESS], + &mOptions[RSK_KEYRINGS_FOREST_TEMPLE], + &mOptions[RSK_KEYRINGS_FIRE_TEMPLE], + &mOptions[RSK_KEYRINGS_WATER_TEMPLE], + &mOptions[RSK_KEYRINGS_SPIRIT_TEMPLE], + &mOptions[RSK_KEYRINGS_SHADOW_TEMPLE], + &mOptions[RSK_KEYRINGS_BOTTOM_OF_THE_WELL], + &mOptions[RSK_KEYRINGS_GTG], + &mOptions[RSK_KEYRINGS_GANONS_CASTLE], + }); + mOptionGroups[RSG_STARTING_ITEMS] = + OptionGroup::SubGroup("Items", { &mOptions[RSK_STARTING_OCARINA], &mOptions[RSK_STARTING_KOKIRI_SWORD], + &mOptions[RSK_STARTING_DEKU_SHIELD] }); + mOptionGroups[RSG_STARTING_SONGS] = + OptionGroup::SubGroup("Ocarina Songs", { + &mOptions[RSK_STARTING_ZELDAS_LULLABY], + &mOptions[RSK_STARTING_EPONAS_SONG], + &mOptions[RSK_STARTING_SARIAS_SONG], + &mOptions[RSK_STARTING_SUNS_SONG], + &mOptions[RSK_STARTING_SONG_OF_TIME], + &mOptions[RSK_STARTING_SONG_OF_STORMS], + &mOptions[RSK_STARTING_SONG_OF_TIME], + &mOptions[RSK_STARTING_MINUET_OF_FOREST], + &mOptions[RSK_STARTING_BOLERO_OF_FIRE], + &mOptions[RSK_STARTING_SERENADE_OF_WATER], + &mOptions[RSK_STARTING_REQUIEM_OF_SPIRIT], + &mOptions[RSK_STARTING_NOCTURNE_OF_SHADOW], + &mOptions[RSK_STARTING_PRELUDE_OF_LIGHT], + }); mOptionGroups[RSG_STARTING_OTHER] = OptionGroup::SubGroup("Other", { - &mOptions[RSK_STARTING_STICKS], - &mOptions[RSK_STARTING_NUTS], - &mOptions[RSK_FULL_WALLETS], - &mOptions[RSK_STARTING_SKULLTULA_TOKEN], - &mOptions[RSK_STARTING_HEARTS], - }); - mOptionGroups[RSG_STARTING_INVENTORY] = OptionGroup("Starting Inventory", { - &mOptionGroups[RSG_STARTING_ITEMS], - &mOptionGroups[RSG_STARTING_SONGS], - &mOptionGroups[RSG_STARTING_OTHER], - }, OptionGroupType::DEFAULT); + &mOptions[RSK_STARTING_STICKS], + &mOptions[RSK_STARTING_NUTS], + &mOptions[RSK_FULL_WALLETS], + &mOptions[RSK_STARTING_SKULLTULA_TOKEN], + &mOptions[RSK_STARTING_HEARTS], + }); + mOptionGroups[RSG_STARTING_INVENTORY] = OptionGroup("Starting Inventory", + { + &mOptionGroups[RSG_STARTING_ITEMS], + &mOptionGroups[RSG_STARTING_SONGS], + &mOptionGroups[RSG_STARTING_OTHER], + }, + OptionGroupType::DEFAULT); mOptionGroups[RSG_TIMESAVERS] = OptionGroup("Timesaver Settings", { - &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], - }); - mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", { - &mOptions[RSK_GOSSIP_STONE_HINTS], - &mOptions[RSK_HINT_CLARITY], - &mOptions[RSK_HINT_DISTRIBUTION], - &mOptions[RSK_TOT_ALTAR_HINT], - &mOptions[RSK_GANONDORF_HINT], - &mOptions[RSK_SHEIK_LA_HINT], - &mOptions[RSK_DAMPES_DIARY_HINT], - &mOptions[RSK_GREG_HINT], - &mOptions[RSK_LOACH_HINT], - &mOptions[RSK_SARIA_HINT], - &mOptions[RSK_FROGS_HINT], - &mOptions[RSK_OOT_HINT], - &mOptions[RSK_WARP_SONG_HINTS], - &mOptions[RSK_BIGGORON_HINT], - &mOptions[RSK_BIG_POES_HINT], - &mOptions[RSK_CHICKENS_HINT], - &mOptions[RSK_MALON_HINT], - &mOptions[RSK_HBA_HINT], - &mOptions[RSK_KAK_10_SKULLS_HINT], - &mOptions[RSK_KAK_20_SKULLS_HINT], - &mOptions[RSK_KAK_30_SKULLS_HINT], - &mOptions[RSK_KAK_40_SKULLS_HINT], - &mOptions[RSK_KAK_50_SKULLS_HINT], - &mOptions[RSK_KAK_100_SKULLS_HINT], - &mOptions[RSK_MASK_SHOP_HINT], - &mOptions[RSK_SCRUB_TEXT_HINT], - &mOptions[RSK_MERCHANT_TEXT_HINT], - &mOptions[RSK_FISHING_POLE_HINT], - // TODO: Compasses show Reward/WOTH, Maps show Dungeon Mode, Starting Time - &mOptions[RSK_DAMAGE_MULTIPLIER], - &mOptions[RSK_BLUE_FIRE_ARROWS], - &mOptions[RSK_SUNLIGHT_ARROWS], - &mOptions[RSK_INFINITE_UPGRADES], - &mOptions[RSK_SKELETON_KEY], - }); - mOptionGroups[RSG_ITEM_POOL] = OptionGroup("Item Pool Settings", std::initializer_list({ - &mOptions[RSK_ITEM_POOL], - &mOptions[RSK_ICE_TRAPS] - })); + &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], + }); + mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", + { + &mOptions[RSK_GOSSIP_STONE_HINTS], + &mOptions[RSK_HINT_CLARITY], + &mOptions[RSK_HINT_DISTRIBUTION], + &mOptions[RSK_TOT_ALTAR_HINT], + &mOptions[RSK_GANONDORF_HINT], + &mOptions[RSK_SHEIK_LA_HINT], + &mOptions[RSK_DAMPES_DIARY_HINT], + &mOptions[RSK_GREG_HINT], + &mOptions[RSK_LOACH_HINT], + &mOptions[RSK_SARIA_HINT], + &mOptions[RSK_FROGS_HINT], + &mOptions[RSK_OOT_HINT], + &mOptions[RSK_WARP_SONG_HINTS], + &mOptions[RSK_BIGGORON_HINT], + &mOptions[RSK_BIG_POES_HINT], + &mOptions[RSK_CHICKENS_HINT], + &mOptions[RSK_MALON_HINT], + &mOptions[RSK_HBA_HINT], + &mOptions[RSK_KAK_10_SKULLS_HINT], + &mOptions[RSK_KAK_20_SKULLS_HINT], + &mOptions[RSK_KAK_30_SKULLS_HINT], + &mOptions[RSK_KAK_40_SKULLS_HINT], + &mOptions[RSK_KAK_50_SKULLS_HINT], + &mOptions[RSK_KAK_100_SKULLS_HINT], + &mOptions[RSK_MASK_SHOP_HINT], + &mOptions[RSK_SCRUB_TEXT_HINT], + &mOptions[RSK_MERCHANT_TEXT_HINT], + &mOptions[RSK_FISHING_POLE_HINT], + // TODO: Compasses show Reward/WOTH, Maps show Dungeon Mode, Starting Time + &mOptions[RSK_DAMAGE_MULTIPLIER], + &mOptions[RSK_BLUE_FIRE_ARROWS], + &mOptions[RSK_SUNLIGHT_ARROWS], + &mOptions[RSK_INFINITE_UPGRADES], + &mOptions[RSK_SKELETON_KEY], + }); + mOptionGroups[RSG_ITEM_POOL] = OptionGroup( + "Item Pool Settings", std::initializer_list({ &mOptions[RSK_ITEM_POOL], &mOptions[RSK_ICE_TRAPS] })); // TODO: Progressive Goron Sword, Remove Double Defense - mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST] = OptionGroup::SubGroup("Kokiri Forest", mExcludeLocationsOptionsAreas[RCAREA_KOKIRI_FOREST]); - mOptionGroups[RSG_EXCLUDES_LOST_WOODS] = OptionGroup::SubGroup("Lost Woods", mExcludeLocationsOptionsAreas[RCAREA_LOST_WOODS]); - mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW] = OptionGroup::SubGroup("Sacred Forest Meadow", mExcludeLocationsOptionsAreas[RCAREA_SACRED_FOREST_MEADOW]); - mOptionGroups[RSG_EXCLUDES_DEKU_TREE] = OptionGroup::SubGroup("Deku Tree", mExcludeLocationsOptionsAreas[RCAREA_DEKU_TREE]); - mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE] = OptionGroup::SubGroup("Forest Temple", mExcludeLocationsOptionsAreas[RCAREA_FOREST_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE] = OptionGroup::SubGroup("Kakariko Village", mExcludeLocationsOptionsAreas[RCAREA_KAKARIKO_VILLAGE]); - mOptionGroups[RSG_EXCLUDES_GRAVEYARD] = OptionGroup::SubGroup("Graveyard", mExcludeLocationsOptionsAreas[RCAREA_GRAVEYARD]); - mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL] = OptionGroup::SubGroup("Bottom of the Well", mExcludeLocationsOptionsAreas[RCAREA_BOTTOM_OF_THE_WELL]); - mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE] = OptionGroup::SubGroup("Shadow Temple", mExcludeLocationsOptionsAreas[RCAREA_SHADOW_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL] = OptionGroup::SubGroup("Death Mountain Trail", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_TRAIL]); - mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER] = OptionGroup::SubGroup("Death Mountain Crater", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_CRATER]); - mOptionGroups[RSG_EXCLUDES_GORON_CITY] = OptionGroup::SubGroup("Goron City", mExcludeLocationsOptionsAreas[RCAREA_GORON_CITY]); - mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN] = OptionGroup::SubGroup("Dodongo's Cavern", mExcludeLocationsOptionsAreas[RCAREA_DODONGOS_CAVERN]); - mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE] = OptionGroup::SubGroup("Fire Temple", mExcludeLocationsOptionsAreas[RCAREA_FIRE_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER] = OptionGroup::SubGroup("Zora's River", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_RIVER]); - mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN] = OptionGroup::SubGroup("Zora's Domain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_DOMAIN]); - mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN] = OptionGroup::SubGroup("Zora's Fountain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_FOUNTAIN]); - mOptionGroups[RSG_EXCLUDES_JABU_JABU] = OptionGroup::SubGroup("Jabu Jabu's Belly", mExcludeLocationsOptionsAreas[RCAREA_JABU_JABUS_BELLY]); - mOptionGroups[RSG_EXCLUDES_ICE_CAVERN] = OptionGroup::SubGroup("Ice Cavern", mExcludeLocationsOptionsAreas[RCAREA_ICE_CAVERN]); - mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD] = OptionGroup::SubGroup("Hyrule Field", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_FIELD]); - mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH] = OptionGroup::SubGroup("Lon Lon Ranch", mExcludeLocationsOptionsAreas[RCAREA_LON_LON_RANCH]); - mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA] = OptionGroup::SubGroup("Lake Hylia", mExcludeLocationsOptionsAreas[RCAREA_LAKE_HYLIA]); - mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE] = OptionGroup::SubGroup("Water Temple", mExcludeLocationsOptionsAreas[RCAREA_WATER_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY] = OptionGroup::SubGroup("Gerudo Valley", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_VALLEY]); - mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS] = OptionGroup::SubGroup("Gerudo Fortress", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_FORTRESS]); - mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND] = OptionGroup::SubGroup("Haunted Wasteland", mExcludeLocationsOptionsAreas[RCAREA_WASTELAND]); - mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS] = OptionGroup::SubGroup("Desert Colossus", mExcludeLocationsOptionsAreas[RCAREA_DESERT_COLOSSUS]); - mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND] = OptionGroup::SubGroup("Gerudo Training Ground", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_TRAINING_GROUND]); - mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE] = OptionGroup::SubGroup("Spirit Temple", mExcludeLocationsOptionsAreas[RCAREA_SPIRIT_TEMPLE]); - mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE] = OptionGroup::SubGroup("Hyrule Castle", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_CASTLE]); + mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST] = + OptionGroup::SubGroup("Kokiri Forest", mExcludeLocationsOptionsAreas[RCAREA_KOKIRI_FOREST]); + mOptionGroups[RSG_EXCLUDES_LOST_WOODS] = + OptionGroup::SubGroup("Lost Woods", mExcludeLocationsOptionsAreas[RCAREA_LOST_WOODS]); + mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW] = + OptionGroup::SubGroup("Sacred Forest Meadow", mExcludeLocationsOptionsAreas[RCAREA_SACRED_FOREST_MEADOW]); + mOptionGroups[RSG_EXCLUDES_DEKU_TREE] = + OptionGroup::SubGroup("Deku Tree", mExcludeLocationsOptionsAreas[RCAREA_DEKU_TREE]); + mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE] = + OptionGroup::SubGroup("Forest Temple", mExcludeLocationsOptionsAreas[RCAREA_FOREST_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE] = + OptionGroup::SubGroup("Kakariko Village", mExcludeLocationsOptionsAreas[RCAREA_KAKARIKO_VILLAGE]); + mOptionGroups[RSG_EXCLUDES_GRAVEYARD] = + OptionGroup::SubGroup("Graveyard", mExcludeLocationsOptionsAreas[RCAREA_GRAVEYARD]); + mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL] = + OptionGroup::SubGroup("Bottom of the Well", mExcludeLocationsOptionsAreas[RCAREA_BOTTOM_OF_THE_WELL]); + mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE] = + OptionGroup::SubGroup("Shadow Temple", mExcludeLocationsOptionsAreas[RCAREA_SHADOW_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL] = + OptionGroup::SubGroup("Death Mountain Trail", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_TRAIL]); + mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER] = + OptionGroup::SubGroup("Death Mountain Crater", mExcludeLocationsOptionsAreas[RCAREA_DEATH_MOUNTAIN_CRATER]); + mOptionGroups[RSG_EXCLUDES_GORON_CITY] = + OptionGroup::SubGroup("Goron City", mExcludeLocationsOptionsAreas[RCAREA_GORON_CITY]); + mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN] = + OptionGroup::SubGroup("Dodongo's Cavern", mExcludeLocationsOptionsAreas[RCAREA_DODONGOS_CAVERN]); + mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE] = + OptionGroup::SubGroup("Fire Temple", mExcludeLocationsOptionsAreas[RCAREA_FIRE_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER] = + OptionGroup::SubGroup("Zora's River", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_RIVER]); + mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN] = + OptionGroup::SubGroup("Zora's Domain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_DOMAIN]); + mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN] = + OptionGroup::SubGroup("Zora's Fountain", mExcludeLocationsOptionsAreas[RCAREA_ZORAS_FOUNTAIN]); + mOptionGroups[RSG_EXCLUDES_JABU_JABU] = + OptionGroup::SubGroup("Jabu Jabu's Belly", mExcludeLocationsOptionsAreas[RCAREA_JABU_JABUS_BELLY]); + mOptionGroups[RSG_EXCLUDES_ICE_CAVERN] = + OptionGroup::SubGroup("Ice Cavern", mExcludeLocationsOptionsAreas[RCAREA_ICE_CAVERN]); + mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD] = + OptionGroup::SubGroup("Hyrule Field", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_FIELD]); + mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH] = + OptionGroup::SubGroup("Lon Lon Ranch", mExcludeLocationsOptionsAreas[RCAREA_LON_LON_RANCH]); + mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA] = + OptionGroup::SubGroup("Lake Hylia", mExcludeLocationsOptionsAreas[RCAREA_LAKE_HYLIA]); + mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE] = + OptionGroup::SubGroup("Water Temple", mExcludeLocationsOptionsAreas[RCAREA_WATER_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY] = + OptionGroup::SubGroup("Gerudo Valley", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_VALLEY]); + mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS] = + OptionGroup::SubGroup("Gerudo Fortress", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_FORTRESS]); + mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND] = + OptionGroup::SubGroup("Haunted Wasteland", mExcludeLocationsOptionsAreas[RCAREA_WASTELAND]); + mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS] = + OptionGroup::SubGroup("Desert Colossus", mExcludeLocationsOptionsAreas[RCAREA_DESERT_COLOSSUS]); + mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND] = + OptionGroup::SubGroup("Gerudo Training Ground", mExcludeLocationsOptionsAreas[RCAREA_GERUDO_TRAINING_GROUND]); + mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE] = + OptionGroup::SubGroup("Spirit Temple", mExcludeLocationsOptionsAreas[RCAREA_SPIRIT_TEMPLE]); + mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE] = + OptionGroup::SubGroup("Hyrule Castle", mExcludeLocationsOptionsAreas[RCAREA_HYRULE_CASTLE]); mOptionGroups[RSG_EXCLUDES_MARKET] = OptionGroup::SubGroup("Market", mExcludeLocationsOptionsAreas[RCAREA_MARKET]); - mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE] = OptionGroup::SubGroup("Ganon's Castle", mExcludeLocationsOptionsAreas[RCAREA_GANONS_CASTLE]); - mOptionGroups[RSG_EXCLUDES] = OptionGroup::SubGroup("Exclude Locations", { - &mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST], - &mOptionGroups[RSG_EXCLUDES_LOST_WOODS], - &mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW], - &mOptionGroups[RSG_EXCLUDES_DEKU_TREE], - &mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE], - &mOptionGroups[RSG_EXCLUDES_GRAVEYARD], - &mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL], - &mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL], - &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER], - &mOptionGroups[RSG_EXCLUDES_GORON_CITY], - &mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN], - &mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER], - &mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN], - &mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN], - &mOptionGroups[RSG_EXCLUDES_JABU_JABU], - &mOptionGroups[RSG_EXCLUDES_ICE_CAVERN], - &mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD], - &mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH], - &mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA], - &mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY], - &mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS], - &mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND], - &mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS], - &mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND], - &mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE], - &mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE], - &mOptionGroups[RSG_EXCLUDES_MARKET], - &mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE], - }); - mOptionGroups[RSG_DETAILED_LOGIC] = OptionGroup("Detailed Logic Settings", { - &mOptionGroups[RSG_LOGIC], - &mOptionGroups[RSG_TRICKS], - &mOptionGroups[RSG_EXCLUDES] - }); + mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE] = + OptionGroup::SubGroup("Ganon's Castle", mExcludeLocationsOptionsAreas[RCAREA_GANONS_CASTLE]); + mOptionGroups[RSG_EXCLUDES] = + OptionGroup::SubGroup("Exclude Locations", { + &mOptionGroups[RSG_EXCLUDES_KOKIRI_FOREST], + &mOptionGroups[RSG_EXCLUDES_LOST_WOODS], + &mOptionGroups[RSG_EXCLUDES_SACRED_FOREST_MEADOW], + &mOptionGroups[RSG_EXCLUDES_DEKU_TREE], + &mOptionGroups[RSG_EXCLUDES_FOREST_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_KAKARIKO_VILLAGE], + &mOptionGroups[RSG_EXCLUDES_GRAVEYARD], + &mOptionGroups[RSG_EXCLUDES_BOTTOM_OF_THE_WELL], + &mOptionGroups[RSG_EXCLUDES_SHADOW_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_TRAIL], + &mOptionGroups[RSG_EXCLUDES_DEATH_MOUNTAIN_CRATER], + &mOptionGroups[RSG_EXCLUDES_GORON_CITY], + &mOptionGroups[RSG_EXCLUDES_DODONGOS_CAVERN], + &mOptionGroups[RSG_EXCLUDES_FIRE_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_ZORAS_RIVER], + &mOptionGroups[RSG_EXCLUDES_ZORAS_DOMAIN], + &mOptionGroups[RSG_EXCLUDES_ZORAS_FOUNTAIN], + &mOptionGroups[RSG_EXCLUDES_JABU_JABU], + &mOptionGroups[RSG_EXCLUDES_ICE_CAVERN], + &mOptionGroups[RSG_EXCLUDES_HYRULE_FIELD], + &mOptionGroups[RSG_EXCLUDES_LON_LON_RANCH], + &mOptionGroups[RSG_EXCLUDES_LAKE_HYLIA], + &mOptionGroups[RSG_EXCLUDES_WATER_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_GERUDO_VALLEY], + &mOptionGroups[RSG_EXCLUDES_GERUDO_FORTRESS], + &mOptionGroups[RSG_EXCLUDES_HAUNTED_WASTELAND], + &mOptionGroups[RSG_EXCLUDES_DESERT_COLOSSUS], + &mOptionGroups[RSG_EXCLUDES_GERUDO_TRAINING_GROUND], + &mOptionGroups[RSG_EXCLUDES_SPIRIT_TEMPLE], + &mOptionGroups[RSG_EXCLUDES_HYRULE_CASTLE], + &mOptionGroups[RSG_EXCLUDES_MARKET], + &mOptionGroups[RSG_EXCLUDES_GANONS_CASTLE], + }); + mOptionGroups[RSG_DETAILED_LOGIC] = + OptionGroup("Detailed Logic Settings", + { &mOptionGroups[RSG_LOGIC], &mOptionGroups[RSG_TRICKS], &mOptionGroups[RSG_EXCLUDES] }); } -std::unordered_map Settings::PopulateOptionNameToEnum(){ +std::unordered_map Settings::PopulateOptionNameToEnum() { std::unordered_map output = {}; for (size_t count = 0; count < RSK_MAX; count++) { output[mOptions[count].GetName()] = static_cast(count); @@ -1127,8 +1740,8 @@ TrickOption& Settings::GetTrickOption(const RandomizerTrick key) { } void Context::ResetTrickOptions() { - for (int count = 0; count < RT_MAX; count++){ - mTrickOptions[count].Set(0); //RANDOTODO this can probably be done better + for (int count = 0; count < RT_MAX; count++) { + mTrickOptions[count].Set(0); // RANDOTODO this can probably be done better }; } @@ -1136,11 +1749,11 @@ const std::array& Settings::GetAllOptions() const { return mOptions; } -std::vector